This commit is contained in:
dgtlmoon
2026-06-16 13:31:30 +02:00
parent e634365113
commit 93e331c772
26 changed files with 439 additions and 33 deletions
+1 -1
View File
@@ -138,7 +138,7 @@ def strip_private_keys(data):
Remove `__`-prefixed keys from a watch/tag dict at the API boundary.
These are transient in-memory fields (e.g. `__check_status` set by the worker to
surface "Fetching page..." in the UI) and are not part of the public OpenAPI
surface "Fetching...." in the UI) and are not part of the public OpenAPI
contract. They must never appear in GET responses (otherwise a client that
round-trips GET → PUT trips the unknown-field validator), and must be silently
discarded from incoming PUT/POST payloads.
@@ -63,7 +63,8 @@ html[data-darkmode="true"] .watch-tag-list.tag-{{ class_name }} {
</tr>
{% endif %}
{% for uuid, tag in available_tags %}
<tr id="{{ uuid }}" class="{{ loop.cycle('pure-table-odd', 'pure-table-even') }}">
{#-{{ loop.cycle('pure-table-odd', 'pure-table-even') }}-#}
<tr id="{{ uuid }}" class="">
<td class="watch-controls">
<a class="link-mute state-{{'on' if tag.notification_muted else 'off'}}" href="{{url_for('tags.mute', uuid=tag.uuid)}}"><img src="{{url_for('static_content', group='images', filename='bell-off.svg')}}" alt="{{ _('Mute notifications') }}" title="{{ _('Mute notifications') }}" class="icon icon-mute" ></a>
</td>
@@ -212,7 +212,8 @@ window.watchOverviewI18n = {
{%- set table_classes = [
'favicon-enabled' if 'favicons_enabled' not in ui_settings or ui_settings['favicons_enabled'] else 'favicon-not-enabled',
] -%}
<table class="pure-table pure-table-striped watch-table {{ table_classes | reject('equalto', '') | join(' ') }}">
<div class="watch-table-clip">
<table class="pure-table {#pure-table-striped#} watch-table {{ table_classes | reject('equalto', '') | join(' ') }}">
<thead>
<tr>
{%- set link_order = "desc" if sort_order == 'asc' else "asc" -%}
@@ -224,7 +225,7 @@ window.watchOverviewI18n = {
<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="width: 16px; height: 16px;"></i><span class='arrow {{link_order}}'></span></a>
</div>
</th>
<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)}}">{{ _('Web page') }} <span class='arrow {{link_order}}'></span></a></th>
<th id="th-webpage"><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)}}">{{ _('Web page') }} <span class='arrow {{link_order}}'></span></a></th>
{%- if any_has_restock_price_processor -%}
<th>{{ _('Restock & Price') }}</th>
{%- endif -%}
@@ -247,8 +248,8 @@ window.watchOverviewI18n = {
{%- set error_texts = watch.compile_error_texts(has_proxies=has_proxies) -%}
{%- 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 #}
{# loop.cycle('pure-table-odd', 'pure-table-even'),#}
{%- set row_classes = [
loop.cycle('pure-table-odd', 'pure-table-even'),
'processor-' ~ watch['processor'],
'has-error' if error_texts|length > 2 else '',
'paused' if watch.paused is defined and watch.paused != False else '',
@@ -404,6 +405,7 @@ window.watchOverviewI18n = {
{%- endfor -%}
</tbody>
</table>
</div>
{{ pagination.links }}
</div>
</form>
@@ -151,7 +151,7 @@ ul.action-sidebar-list {
/*height: 42px;*/
padding: $common-gap;
font-size: var(--body-main-text-size);
border-radius: 8px;
border-radius: var(--common-round-border);
color: var(--color-white);
text-decoration: none;
white-space: nowrap;
@@ -326,7 +326,7 @@ body.actionside-bar-on {
justify-content: flex-start;
gap: $common-gap;
padding: $common-gap $common-gap;
border-radius: 8px;
border-radius: var(--common-round-border);
color: var(--color-text);
&:hover {
@@ -1,5 +1,5 @@
.arrow {
border: solid #1b98f8;
border: solid var(--color-border-input);
border-width: 0 2px 2px 0;
display: inline-block;
padding: 3px;
@@ -37,7 +37,10 @@
--color-error-list: var(--color-light-red);
--color-table-background: var(--color-background);
--color-table-stripe: var(--color-grey-900);
--watchlist-row-selected: #e3f0ff; // light blue highlight for checkbox-selected rows
--watchlist-row-hover: #f2f2f2; // light grey highlight on row hover
--color-text-tab: var(--color-white);
--color-background-tab: rgba(255, 255, 255, 0.2);
--color-background-tab-hover: rgba(255, 255, 255, 0.5);
@@ -103,6 +106,7 @@
--color-watch-table-error: var(--color-dark-red);
--color-watch-table-row-text: var(--color-grey-100);
--color-table-line: #e7e9ee;
--highlight-trigger-text-bg-color: #1b98f8;
--highlight-ignored-text-bg-color: var(--color-grey-700);
@@ -114,12 +118,14 @@
--color-sidebar-shadow: 6px 0 28px rgba(0, 0, 0, 0.18);
--color-sidebar-item-hover-bg: rgba(0, 0, 0, 0.06);
--color-sidebar-item-active-bg: rgba(0, 0, 0, 0.10);
--common-round-border: 8px;
}
html[data-darkmode="true"] {
--color-link: #59bdfb;
--color-text: var(--color-white);
--color-table-line: #262c37;
--color-background-gradient-first: #3f90a5;
--color-background-gradient-second: #1e316c;
--color-background-gradient-third: #4d2c64;
@@ -130,7 +136,10 @@ html[data-darkmode="true"] {
--color-background-table-thead: var(--color-grey-200);
--color-table-background: var(--color-grey-300);
--color-table-stripe: var(--color-grey-325);
--watchlist-row-selected: #1e3a5f; // darker blue highlight for selected rows in dark mode
--watchlist-row-hover: #2a2a2a; // subtle grey highlight on row hover (dark mode)
--color-background: var(--color-grey-300);
--color-text-menu-heading: var(--color-grey-850);
--color-text-menu-link: var(--color-grey-800);
@@ -11,6 +11,26 @@ $title-col-stack-breakpoint: 1200px;
background-color: var(--watchlist-row-selected);
}
// Row hover: light grey background (replaces the now-disabled zebra striping)
// and reveals the per-row action buttons (hidden at rest — see td.buttons below).
.watch-table tbody tr:hover > td {
background-color: var(--watchlist-row-hover);
}
.watch-table tbody tr:hover td.buttons > *,
.watch-table tbody tr:focus-within td.buttons > *,
.watch-table tbody tr:has(input[name="uuids"]:checked) td.buttons > * {
opacity: 1;
}
// Rounds the table's corners. border-radius on the <table> itself doesn't work
// with border-collapse:collapse (and the row divider lines depend on collapse),
// so a clip wrapper rounds + overflow-clips the square corners of the thead /
// last-row cell backgrounds instead.
.watch-table-clip {
border-radius: var(--common-round-border);
overflow: hidden;
}
/* table related */
#stats_row {
display: flex;
@@ -51,13 +71,35 @@ body.has-queue {
text-align: center;
}
thead {
text-transform: uppercase;
a {
color: var(--color-text);
}
}
td,
th {
vertical-align: middle;
border: none;
}
@media only screen and (max-width: $title-col-stack-breakpoint) {
.last-checked, .last-changed {
text-align: center;
}
}
tr {
#th-webpage {
text-align: center;
}
tbody tr {
color: var(--color-watch-table-row-text);
border-bottom: 1px solid var(--color-table-line);
background-color: var(--color-table-background);
td {
background-color: var(--color-table-background);
}
&.unviewed {
font-weight: bold;
@@ -191,18 +233,31 @@ body.has-queue {
&.buttons {
font-size: 12px;
white-space: nowrap;
// Per-row actions are hidden at rest and revealed on row hover/focus (see
// the .watch-table tbody tr:hover rule above). Opacity (not display) keeps
// the column width stable so the table doesn't shift on hover.
> * {
opacity: 0;
transition: opacity 0.12s ease;
}
}
&.title-col {
word-break: break-all;
white-space: normal;
}
&.last-changed,&.last-checked {
text-align: center;
}
a.external::after {
content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAQElEQVR42qXKwQkAIAxDUUdxtO6/RBQkQZvSi8I/pL4BoGw/XPkh4XigPmsUgh0626AjRsgxHTkUThsG2T/sIlzdTsp52kSS1wAAAABJRU5ErkJggg==);
// Inline "external link" glyph (open-cornered square + outbound arrow) as a
// background image so its box can be sized off the doc text-size variable
// (a data-URI in `content:url()` can't be reliably resized). Neutral grey so
// it reads on light backgrounds; dark mode lightens it via the existing
// invert filter on .title-col a[target="_blank"]::after.
content: "";
display: inline-block;
width: var(--body-main-text-size);
height: var(--body-main-text-size);
vertical-align: -0.1em;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23777' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6'/%3E%3Cpolyline points='15 3 21 3 21 9'/%3E%3Cline x1='10' y1='14' x2='21' y2='3'/%3E%3C/svg%3E") no-repeat center / contain;
margin: 0 3px 0 5px;
}
&.watch-controls {
@@ -216,6 +271,9 @@ body.has-queue {
th {
@media (min-width: 1020px) {
white-space: nowrap;
}
&#h-lastchanged, &#h-lastchecked {
text-align: center;
}
@@ -386,4 +444,8 @@ body.has-queue {
}
}
}
.pure-button {
border-radius: var(--common-round-border);
}
@@ -141,9 +141,9 @@ body {
vertical-align: middle;
}
.pure-table-even {
/*.pure-table-even {
background: var(--color-background);
}
}*/
/* Some styles from https://css-tricks.com/ */
a {
@@ -735,13 +735,15 @@ footer {
}
}
.pure-table-striped {
tr:nth-child(2n-1) {
td {
background-color: var(--color-table-stripe);
}
}
}
// Temporarily disabled: zebra striping on odd rows. Row distinction now comes
// from the :hover highlight (see .watch-table tr:hover in parts/_watch_table.scss).
//.pure-table-striped {
// tr:nth-child(2n-1) {
// td {
// background-color: var(--color-table-stripe);
// }
// }
//}
.pure-form input[type=color],
.pure-form input[type=date],
@@ -1156,8 +1158,8 @@ ul#highlightSnippetActions {
border-color: rgba(255, 255, 255, 0.25);
border-image: initial;
background: rgba(255, 255, 255, 0.04);
border-radius: 10px;
padding: 1.25rem;
border-radius: var(--common-round-border);
padding: $common-gap*2;
}
header {
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -439,7 +439,7 @@ def test_api_strips_internal_fields(client, live_server, measure_memory_usage, d
# Force both a transient __-prefixed and a system-managed field onto the watch,
# simulating worker/processor-set state.
watch_obj = datastore.data['watching'][watch_uuid]
watch_obj['__check_status'] = 'Fetching page..'
watch_obj['__check_status'] = 'Fetching...'
watch_obj['last_check_status'] = 200
watch_obj['_llm_result'] = {'summary': 'cached llm output'}
watch_obj['last_filter_config_hash'] = 'abc123'
@@ -472,7 +472,7 @@ def test_api_strips_internal_fields(client, live_server, measure_memory_usage, d
f"PUT round-tripping GET response plus internal fields should succeed (got {res.status_code}: {res.data!r})"
# Internal fields must not have been overwritten by the PUT
assert watch_obj.get('__check_status') == 'Fetching page..', \
assert watch_obj.get('__check_status') == 'Fetching...', \
"PUT must not overwrite __-prefixed fields"
assert watch_obj.get('_llm_result') == {'summary': 'cached llm output'}, \
"PUT must not overwrite system-managed non-spec fields"
@@ -795,6 +795,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Tip"
@@ -3217,6 +3223,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Kontrola zabezpečení přístupového tokenu API povolena"
@@ -4451,6 +4469,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -811,6 +811,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Tipp"
@@ -3269,6 +3275,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Sicherheitsüberprüfung des API-Zugriffstokens aktiviert"
@@ -4507,6 +4525,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -793,6 +793,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr ""
@@ -3211,6 +3217,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr ""
@@ -4445,6 +4463,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -793,6 +793,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr ""
@@ -3211,6 +3217,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr ""
@@ -4445,6 +4463,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -829,6 +829,12 @@ msgstr "Número de elementos por página en la lista general de monitores, 0 par
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Consejo"
@@ -3284,6 +3290,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Comprobación de seguridad del token de acceso API habilitada"
@@ -4531,6 +4549,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -799,6 +799,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Astuce"
@@ -3224,6 +3230,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Contrôle de sécurité du jeton d'accès à l'API activé"
@@ -4460,6 +4478,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -795,6 +795,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr ""
@@ -3213,6 +3219,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Controllo sicurezza token API attivo"
@@ -4447,6 +4465,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -800,6 +800,12 @@ msgstr "ウォッチ一覧ページの1ページあたりの表示件数(0で
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "ヒント"
@@ -3230,6 +3236,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "APIアクセストークンのセキュリティチェックを有効化"
@@ -4488,6 +4506,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -795,6 +795,12 @@ msgstr "모니터링 목록 페이지당 항목 수입니다. 0이면 비활성
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "팁"
@@ -3221,6 +3227,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "API 액세스 토큰 보안 확인 활성화"
@@ -4465,6 +4483,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
+23 -1
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: changedetection.io 0.55.7\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-06-14 13:29+0200\n"
"POT-Creation-Date: 2026-06-16 13:31+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -792,6 +792,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr ""
@@ -3210,6 +3216,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr ""
@@ -4444,6 +4462,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -816,6 +816,12 @@ msgstr "Número de itens por página na lista de visão geral, 0 para desativar.
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Dica"
@@ -3261,6 +3267,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Verificação de segurança do token de acesso à API ativada"
@@ -4503,6 +4521,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -826,6 +826,12 @@ msgstr "İzleyici genel bakış listesinde sayfa başına öğe sayısı, devre
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "İpucu"
@@ -3264,6 +3270,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "API erişim belirteci güvenlik kontrolü etkin"
@@ -4506,6 +4524,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -806,6 +806,12 @@ msgstr "Кількість елементів на сторінці у спис
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "Порада"
@@ -3243,6 +3249,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "Перевірку безпеки токена доступу API увімкнено"
@@ -4483,6 +4501,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -798,6 +798,12 @@ msgstr "监控概览列表每页数量,0 为禁用。"
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "提示"
@@ -3217,6 +3223,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "已启用 API 访问令牌安全检查"
@@ -4453,6 +4471,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
@@ -797,6 +797,12 @@ msgstr ""
msgid "How \"Last Checked\" and \"Last Changed\" times are shown in the watch overview list."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid ""
"\"Collapsed icon rail\" keeps the left navigation slim and reveals labels on mouse-over; \"Always expanded\" keeps "
"labels visible."
msgstr ""
#: changedetectionio/blueprint/settings/templates/settings.html
msgid "Tip"
msgstr "提示"
@@ -3217,6 +3223,18 @@ msgstr ""
msgid "Short (1m ago)"
msgstr ""
#: changedetectionio/forms.py
msgid "Navigation sidebar"
msgstr ""
#: changedetectionio/forms.py
msgid "Collapsed icon rail (expands on hover)"
msgstr ""
#: changedetectionio/forms.py
msgid "Always expanded"
msgstr ""
#: changedetectionio/forms.py
msgid "API access token security check enabled"
msgstr "已啟用 API 存取權杖安全檢查"
@@ -4451,6 +4469,10 @@ msgstr ""
msgid "Page Watches"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Unread changes"
msgstr ""
#: changedetectionio/templates/sidebar-nav.html
msgid "Watch Groups"
msgstr ""
+3 -3
View File
@@ -14,7 +14,7 @@ import sys
import time
# Allow alphanumerics, space, and a small set of punctuation that appears in legitimate
# status strings ("Querying AI/LLM (intent)..", "Fetching page.."). Anything that could
# status strings ("Querying AI/LLM (intent)..", "Fetching..."). Anything that could
# be HTML-active (<, >, &, ", ', =, ;, {, }, `, \) is stripped.
_MINITEXT_STATUS_SAFE_RE = re.compile(r'[^A-Za-z0-9 ().,/:\-]')
_MINITEXT_STATUS_MAX_LEN = 80
@@ -30,7 +30,7 @@ DEFER_SLEEP_TIME_ALREADY_QUEUED = 0.3 if IN_PYTEST else 10.0
def set_watch_minitext_status(watch, status):
"""
Set a transient status line for a watch (e.g. "Fetching page..", "Querying AI/LLM..").
Set a transient status line for a watch (e.g. "Fetching...", "Querying AI/LLM..").
Writes to watch['__check_status'] so a client reloading the page can render the
last known status, and fires the realtime signal so already-connected clients
@@ -182,7 +182,7 @@ async def async_update_worker(worker_id, q, notification_q, app, datastore, exec
# Allow plugins to modify/wrap the update_handler
update_handler = apply_update_handler_alter(update_handler, watch, datastore)
set_watch_minitext_status(watch, "Fetching page..")
set_watch_minitext_status(watch, "Fetching...")
# All fetchers are now async, so call directly
await update_handler.call_browser()