Files
FreshRSS/app/views/search/index.phtml
Alexandre Alapetite cf631b6f87 Implement filter on last modified date by server (#8131)
* Implement filter on last modified date by server
Especially relevant for API, to get the modified changes: the API will now return the articles that are new or which content has been modified since `ot`:

fix https://github.com/FreshRSS/FreshRSS/issues/7304
fix https://github.com/FreshRSS/FreshRSS/issues/2566
https://github.com/jocmp/capyreader/discussions/533#discussioncomment-11341808

New corresponding search operator `mdate:` and new UI:

<img width="650" height="627" alt="image" src="https://github.com/user-attachments/assets/8ba02937-abc7-44bf-b718-cf269cc37caf" />

* Migration from existing id column

* Fix auto-update

* Index after update for performance

* Minor comment

* Minor whitespace

* Fix regex

* Minor .gitignore

* Changelog and warning

* Update app/i18n/pl/gen.php

Co-authored-by: Inverle <inverle@proton.me>

* make fix-all

* Optimise SQL auto-update
For speed and resilience

* Minor SQLite change of sequence

* Changelog

* Speed optimisation: No DEFAULT 0

* Better migration

* Revert small bug

* Prepare filtering on multiple dates for API

* make fix-all

* Update tests

* Remaining manual merge

* Update versions

* Remove warnings no longer relevant in changelog

* Implement in API, and COALESCE

* No lastModified when adding new article

* Rework logic

* Sort IS NOT NULL

* Remove forgotten lastModified

---------

Co-authored-by: Inverle <inverle@proton.me>
2026-03-01 21:43:03 +01:00

269 lines
9.9 KiB
PHTML

<?php
declare(strict_types=1);
/** @var FreshRSS_View $this */
$this->partial('aside_subscription');
?>
<main class="post">
<h1><?= _t('gen.menu.advanced_search') ?></h1>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.advanced_search_help') ?></p>
<p><?= _t('gen.search.full_documentation') ?></p>
<form method="post" action="<?= _url('search', 'submit') ?>">
<input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
<fieldset>
<legend><?= _t('gen.search.text') ?></legend>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.text_help') ?></p>
<div class="form-group">
<label class="group-name" for="free_text"><?= _t('gen.search.free_text') ?></label>
<div class="group-controls">
<textarea id="free_text" name="free_text" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.free_text_help') ?></p>
</div>
</div>
<div class="form-group">
<label class="group-name" for="title"><?= _t('gen.search.title') ?></label>
<div class="group-controls">
<textarea id="title" name="title" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
</div>
</div>
<div class="form-group">
<label class="group-name" for="content"><?= _t('gen.search.content') ?></label>
<div class="group-controls">
<textarea id="content" name="content" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
</div>
</div>
<div class="form-group">
<label class="group-name" for="url"><?= _t('gen.search.url') ?></label>
<div class="group-controls">
<textarea id="url" name="url" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
</div>
</div>
<div class="form-group">
<label class="group-name" for="authors"><?= _t('gen.search.authors') ?></label>
<div class="group-controls">
<textarea id="authors" name="authors" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
</div>
</div>
<div class="form-group">
<label class="group-name" for="tags"><?= _t('gen.search.tags') ?></label>
<div class="group-controls">
<textarea id="tags" name="tags" rows="2" placeholder="<?= _t('gen.search.text_placeholder') ?>"></textarea>
</div>
</div>
</fieldset>
<fieldset>
<legend><?= _t('gen.search.date_past') ?></legend>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_received') ?></label>
<div class="group-controls">
<div>
<label for="date_number"><?= _t('gen.search.date_past') ?>
<input id="date_number" name="date_number" type="number" min="0" placeholder="0" />
<select id="date_unit" name="date_unit">
<option value="H"><?= _t('gen.period.hours') ?></option>
<option value="D"><?= _t('gen.period.days') ?></option>
<option value="W"><?= _t('gen.period.weeks') ?></option>
<option value="M"><?= _t('gen.period.months') ?></option>
<option value="Y"><?= _t('gen.period.years') ?></option>
</select>
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_published') ?></label>
<div class="group-controls">
<div>
<label for="pubdate_number"><?= _t('gen.search.date_past') ?>
<input id="pubdate_number" name="pubdate_number" type="number" min="0" placeholder="0" />
<select id="pubdate_unit" name="pubdate_unit">
<option value="H"><?= _t('gen.period.hours') ?></option>
<option value="D"><?= _t('gen.period.days') ?></option>
<option value="W"><?= _t('gen.period.weeks') ?></option>
<option value="M"><?= _t('gen.period.months') ?></option>
<option value="Y"><?= _t('gen.period.years') ?></option>
</select>
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_modified') ?></label>
<div class="group-controls">
<div>
<label for="mdate_number"><?= _t('gen.search.date_past') ?>
<input id="mdate_number" name="mdate_number" type="number" min="0" placeholder="0" />
<select id="mdate_unit" name="mdate_unit">
<option value="H"><?= _t('gen.period.hours') ?></option>
<option value="D"><?= _t('gen.period.days') ?></option>
<option value="W"><?= _t('gen.period.weeks') ?></option>
<option value="M"><?= _t('gen.period.months') ?></option>
<option value="Y"><?= _t('gen.period.years') ?></option>
</select>
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_user') ?></label>
<div class="group-controls">
<div>
<label for="userdate_number"><?= _t('gen.search.date_past') ?>
<input id="userdate_number" name="userdate_number" type="number" min="0" placeholder="0" />
<select id="userdate_unit" name="userdate_unit">
<option value="H"><?= _t('gen.period.hours') ?></option>
<option value="D"><?= _t('gen.period.days') ?></option>
<option value="W"><?= _t('gen.period.weeks') ?></option>
<option value="M"><?= _t('gen.period.months') ?></option>
<option value="Y"><?= _t('gen.period.years') ?></option>
</select>
</label>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend><?= _t('gen.search.date_range') ?></legend>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_received') ?></label>
<div class="group-controls">
<div>
<label for="date_from"><?= _t('gen.search.date_from') ?>
<input id="date_from" name="date_from" type="date" />
</label>
<label for="date_to"><?= _t('gen.search.date_to') ?>
<input id="date_to" name="date_to" type="date" />
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_published') ?></label>
<div class="group-controls">
<div>
<label for="pubdate_from"><?= _t('gen.search.date_from') ?>
<input id="pubdate_from" name="pubdate_from" type="date" />
</label>
<label for="pubdate_to"><?= _t('gen.search.date_to') ?>
<input id="pubdate_to" name="pubdate_to" type="date" />
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_modified') ?></label>
<div class="group-controls">
<div>
<label for="mdate_from"><?= _t('gen.search.date_from') ?>
<input id="mdate_from" name="mdate_from" type="date" />
</label>
<label for="mdate_to"><?= _t('gen.search.date_to') ?>
<input id="mdate_to" name="mdate_to" type="date" />
</label>
</div>
</div>
</div>
<div class="form-group">
<label class="group-name"><?= _t('gen.search.date_user') ?></label>
<div class="group-controls">
<div>
<label for="userdate_from"><?= _t('gen.search.date_from') ?>
<input id="userdate_from" name="userdate_from" type="date" />
</label>
<label for="userdate_to"><?= _t('gen.search.date_to') ?>
<input id="userdate_to" name="userdate_to" type="date" />
</label>
</div>
</div>
</div>
</fieldset>
<fieldset>
<legend><?= _t('gen.search.sources') ?></legend>
<div class="form-group">
<label class="group-name" for="feed_ids"><?= _t('gen.search.feeds') ?></label>
<div class="group-controls">
<select name="feed_ids[]" id="feed_ids" size="<?= min(8, count($this->feeds) + 1) ?>" multiple="multiple">
<option value=""></option>
<?php foreach ($this->feeds as $feed): ?>
<option value="<?= $feed->id() ?>"><?= $feed->name() ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="form-group">
<label class="group-name" for="category_ids"><?= _t('gen.search.categories') ?></label>
<div class="group-controls">
<select name="category_ids[]" id="category_ids" size="<?= min(8, count($this->categories) + 1) ?>" multiple="multiple">
<option value=""></option>
<?php foreach ($this->categories as $category): ?>
<option value="<?= $category->id() ?>"><?= $category->name() ?></option>
<?php endforeach; ?>
</select>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
</div>
</div>
</fieldset>
<fieldset>
<legend><?= _t('gen.search.labels') ?></legend>
<div class="form-group">
<label class="group-name" for="label_ids"><?= _t('gen.search.labels') ?></label>
<div class="group-controls">
<select name="label_ids[]" id="label_ids" size="<?= min(8, count($this->labels) + 1) ?>" multiple="multiple">
<option value=""></option>
<?php foreach ($this->labels as $label): ?>
<option value="<?= $label->id() ?>"><?= $label->name() ?></option>
<?php endforeach; ?>
</select>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
</div>
</div>
</fieldset>
<fieldset>
<legend><?= _t('gen.search.user_queries') ?></legend>
<div class="form-group">
<label class="group-name" for="user_query_ids"><?= _t('gen.search.user_queries') ?></label>
<div class="group-controls">
<select name="user_query_ids[]" id="user_query_ids" size="<?= min(8, count($this->queries) + 1) ?>" multiple="multiple">
<option value=""></option>
<?php foreach ($this->queries as $key => $query): ?>
<option value="<?= $key ?>"><?= $query->getName() ?></option>
<?php endforeach; ?>
</select>
<p class="help"><?= _i('help') ?> <?= _t('gen.search.multiple_help') ?></p>
</div>
</div>
</fieldset>
<div class="form-group form-actions">
<div class="group-controls">
<button type="submit" class="btn btn-important"><?= _t('gen.action.submit') ?></button>
<button type="reset" class="btn"><?= _t('gen.action.cancel') ?></button>
</div>
</div>
</form>
</main>