]> git.immae.eu Git - github/wallabag/wallabag.git/blob - src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
Add new Ignore Origin rules tab, update ConfigController
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Resources / views / themes / material / Config / index.html.twig
1 {% extends "WallabagCoreBundle::layout.html.twig" %}
2
3 {% block title %}{{ 'config.page_title'|trans }}{% endblock %}
4
5 {% block content %}
6
7 <div class="row">
8 <div class="col s12">
9 <div class="card-panel settings">
10
11 <div class="row">
12 <div class="div_tabs col s12">
13 <ul class="tabs">
14 <li class="tab col s12 m6 l3"><a class="active" href="#set1">{{ 'config.tab_menu.settings'|trans }}</a></li>
15 <li class="tab col s12 m6 l3"><a href="#set2">{{ 'config.tab_menu.feed'|trans }}</a></li>
16 <li class="tab col s12 m6 l3"><a href="#set3">{{ 'config.tab_menu.user_info'|trans }}</a></li>
17 <li class="tab col s12 m6 l3"><a href="#set4">{{ 'config.tab_menu.password'|trans }}</a></li>
18 <li class="tab col s12 m6 l3"><a href="#set5">{{ 'config.tab_menu.rules'|trans }}</a></li>
19 <li class="tab col s12 m6 l3"><a href="#set6">{{ 'config.tab_menu.ignore_origin'|trans }}</a></li>
20 <li class="tab col s12 m6 l3"><a href="#set7">{{ 'config.tab_menu.reset'|trans }}</a></li>
21 </ul>
22 </div>
23
24 <div id="set1" class="col s12">
25 {{ form_start(form.config) }}
26 {{ form_errors(form.config) }}
27
28 <div class="row">
29 <div class="input-field col s11">
30 {{ form_errors(form.config.theme) }}
31 {{ form_widget(form.config.theme) }}
32 {{ form_label(form.config.theme) }}
33 </div>
34 <div class="input-field col s1">
35 <a href="#" class="tooltipped" data-position="left" data-delay="50" data-tooltip="{{ 'config.form_settings.help_theme'|trans }}">
36 <i class="material-icons">live_help</i>
37 </a>
38 </div>
39 </div>
40
41 <div class="row">
42 <div class="input-field col s11">
43 {{ form_errors(form.config.items_per_page) }}
44 {{ form_widget(form.config.items_per_page) }}
45 {{ form_label(form.config.items_per_page) }}
46 </div>
47 <div class="input-field col s1">
48 <a href="#" class="tooltipped" data-position="left" data-delay="50" data-tooltip="{{ 'config.form_settings.help_items_per_page'|trans }}">
49 <i class="material-icons">live_help</i>
50 </a>
51 </div>
52 </div>
53
54 <div class="row">
55 <div class="input-field col s11">
56 {{ form_errors(form.config.reading_speed) }}
57 {{ form_widget(form.config.reading_speed) }}
58 {{ form_label(form.config.reading_speed) }}
59 <p>
60 {{ 'config.form_settings.reading_speed.help_message'|trans }}
61 <a href="http://www.myreadspeed.com/calculate/">myreadspeed</a>
62 </p>
63 </div>
64 <div class="input-field col s1">
65 <a href="#" class="tooltipped" data-position="left" data-delay="50" data-tooltip="{{ 'config.form_settings.help_reading_speed'|trans }}">
66 <i class="material-icons">live_help</i>
67 </a>
68 </div>
69 </div>
70
71 <div class="row">
72 <div class="input-field col s12">
73 {{ form_errors(form.config.action_mark_as_read) }}
74 {{ form_widget(form.config.action_mark_as_read) }}
75 {{ form_label(form.config.action_mark_as_read) }}
76 </div>
77 </div>
78
79 <div class="row">
80 <div class="input-field col s11">
81 {{ form_errors(form.config.language) }}
82 {{ form_widget(form.config.language) }}
83 {{ form_label(form.config.language) }}
84 </div>
85 <div class="input-field col s1">
86 <a href="#" class="tooltipped" data-position="left" data-delay="50" data-tooltip="{{ 'config.form_settings.help_language'|trans }}">
87 <i class="material-icons">live_help</i>
88 </a>
89 </div>
90 </div>
91
92 <div class="row">
93 <div class="input-field col s11">
94 {{ form_errors(form.config.pocket_consumer_key) }}
95 {{ form_widget(form.config.pocket_consumer_key) }}
96 {{ form_label(form.config.pocket_consumer_key) }}
97 <p>
98 &raquo;
99 <a href="https://getpocket.com/developer/docs/authentication">https://getpocket.com/developer/docs/authentication</a>
100 </p>
101 </div>
102 <div class="input-field col s1">
103 <a href="#" class="tooltipped" data-position="left" data-delay="50" data-tooltip="{{ 'config.form_settings.help_pocket_consumer_key'|trans }}">
104 <i class="material-icons">live_help</i>
105 </a>
106 </div>
107 </div>
108
109 <div class="row">
110 <div class="input-field col s12">
111 <h5>{{ 'config.form_settings.android_configuration'|trans }}</h5>
112 <a href="wallabag://{{ app.user.username }}@{{ wallabag_url }}" class="waves-effect waves-light btn hide-on-large-only">{{ 'config.form_settings.android_instruction' | trans }}</a>
113 <img id="androidQrcode" class="hide-on-med-and-down" />
114 </div>
115 <script>
116 document.getElementById('androidQrcode').src = jrQrcode.getQrBase64('wallabag://{{ app.user.username }}@{{ wallabag_url }}');
117 </script>
118 </div>
119
120 {{ form_widget(form.config.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
121 {{ form_rest(form.config) }}
122 </form>
123 </div>
124
125 <div id="set2" class="col s12">
126 {{ form_start(form.feed) }}
127 {{ form_errors(form.feed) }}
128
129 <div class="row">
130 <div class="input-field col s12">
131 {{ 'config.form_feed.description'|trans }}
132 </div>
133 </div>
134
135 <div class="row">
136 <div class="col s12">
137 <h6 class="grey-text">{{ 'config.form_feed.token_label'|trans }}</h6>
138 <div>
139 {% if feed.token %}
140 {{ feed.token }}
141 {% else %}
142 <em>{{ 'config.form_feed.no_token'|trans }}</em>
143 {% endif %}
144
145 {% if feed.token %}
146 – <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_reset'|trans }}</a>
147 – <a href="{{ path('revoke_token') }}">{{ 'config.form_feed.token_revoke'|trans }}</a>
148 {% else %}
149 – <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_create'|trans }}</a>
150 {% endif %}
151 </div>
152 </div>
153 </div>
154 {% if feed.token %}
155 <div class="row">
156 <div class="col s12">
157 <h6 class="grey-text">{{ 'config.form_feed.feed_links'|trans }}</h6>
158 <ul>
159 <li><a href="{{ path('unread_feed', {'username': feed.username, 'token': feed.token}) }}">{{ 'config.form_feed.feed_link.unread'|trans }}</a></li>
160 <li><a href="{{ path('starred_feed', {'username': feed.username, 'token': feed.token}) }}">{{ 'config.form_feed.feed_link.starred'|trans }}</a></li>
161 <li><a href="{{ path('archive_feed', {'username': feed.username, 'token': feed.token}) }}">{{ 'config.form_feed.feed_link.archive'|trans }}</a></li>
162 <li><a href="{{ path('all_feed', {'username': feed.username, 'token': feed.token}) }}">{{ 'config.form_feed.feed_link.all'|trans }}</a></li>
163 </ul>
164 </div>
165 </div>
166 {% endif %}
167
168 <div class="row">
169 <div class="input-field col s12">
170 {{ form_label(form.feed.feed_limit) }}
171 {{ form_errors(form.feed.feed_limit) }}
172 {{ form_widget(form.feed.feed_limit) }}
173 </div>
174 </div>
175
176 {{ form_widget(form.feed.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
177 {{ form_rest(form.feed) }}
178 </form>
179 </div>
180
181 <div id="set3" class="col s12">
182 {{ form_start(form.user) }}
183 {{ form_errors(form.user) }}
184
185 <div class="row">
186 <div class="col s12">
187 <h6 class="grey-text">{{ 'config.form_user.login_label'|trans }}</h6>
188 <div>
189 {{ app.user.username }}
190 </div>
191 </div>
192 </div>
193
194 <div class="row">
195 <div class="input-field col s12">
196 {{ form_label(form.user.name) }}
197 {{ form_errors(form.user.name) }}
198 {{ form_widget(form.user.name) }}
199 </div>
200 </div>
201
202 <div class="row">
203 <div class="input-field col s12">
204 {{ form_label(form.user.email) }}
205 {{ form_errors(form.user.email) }}
206 {{ form_widget(form.user.email) }}
207 </div>
208 </div>
209
210 {{ form_widget(form.user.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
211
212 {% if twofactor_auth %}
213 <br/>
214 <br/>
215 <div class="row">
216 <h5>{{ 'config.otp.page_title'|trans }}</h5>
217
218 <p>{{ 'config.form_user.two_factor_description'|trans }}</p>
219
220 <table>
221 <thead>
222 <tr>
223 <th>{{ 'config.form_user.two_factor.table_method'|trans }}</th>
224 <th>{{ 'config.form_user.two_factor.table_state'|trans }}</th>
225 <th>{{ 'config.form_user.two_factor.table_action'|trans }}</th>
226 </tr>
227 </thead>
228
229 <tbody>
230 <tr>
231 <td>{{ 'config.form_user.two_factor.emailTwoFactor_label'|trans }}</td>
232 <td>{% if app.user.isEmailTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
233 <td><a href="{{ path('config_otp_email') }}" class="waves-effect waves-light btn{% if app.user.isEmailTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_email'|trans }}</a> {% if app.user.isEmailTwoFactor %}<a href="{{ path('disable_otp_email') }}" class="waves-effect waves-light btn red">Disable</a>{% endif %}</td>
234 </tr>
235 <tr>
236 <td>{{ 'config.form_user.two_factor.googleTwoFactor_label'|trans }}</td>
237 <td>{% if app.user.isGoogleTwoFactor %}<b>{{ 'config.form_user.two_factor.state_enabled'|trans }}</b>{% else %}{{ 'config.form_user.two_factor.state_disabled'|trans }}{% endif %}</td>
238 <td><a href="{{ path('config_otp_app') }}" class="waves-effect waves-light btn{% if app.user.isGoogleTwoFactor %} disabled{% endif %}">{{ 'config.form_user.two_factor.action_app'|trans }}</a> {% if app.user.isGoogleTwoFactor %}<a href="{{ path('disable_otp_app') }}" class="waves-effect waves-light btn red">Disable</a>{% endif %}</td>
239 </tr>
240 </tbody>
241 </table>
242 </div>
243 {% endif %}
244 {{ form_widget(form.user._token) }}
245 </form>
246 </div>
247
248 <div id="set4" class="col s12">
249 {{ form_start(form.pwd) }}
250 {{ form_errors(form.pwd) }}
251
252 <div class="row">
253 <div class="input-field col s12">
254 {{ 'config.form_password.description'|trans }}
255 </div>
256 </div>
257
258 <div class="row">
259 <div class="input-field col s12">
260 {{ form_label(form.pwd.old_password) }}
261 {{ form_errors(form.pwd.old_password) }}
262 {{ form_widget(form.pwd.old_password) }}
263 </div>
264 </div>
265
266 <div class="row">
267 <div class="input-field col s12">
268 {{ form_label(form.pwd.new_password.first) }}
269 {{ form_errors(form.pwd.new_password.first) }}
270 {{ form_widget(form.pwd.new_password.first) }}
271 </div>
272 </div>
273
274 <div class="row">
275 <div class="input-field col s12">
276 {{ form_label(form.pwd.new_password.second) }}
277 {{ form_errors(form.pwd.new_password.second) }}
278 {{ form_widget(form.pwd.new_password.second) }}
279 </div>
280 </div>
281
282 {{ form_widget(form.pwd.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
283 {{ form_rest(form.pwd) }}
284 </form>
285 </div>
286
287 <div id="set5" class="col s12">
288 {% if app.user.config.taggingRules is not empty %}
289 <div class="row">
290 <div class="input-field col s12">
291 <ul>
292 {% for tagging_rule in app.user.config.taggingRules %}
293 <li>
294 {{ 'config.form_rules.if_label'|trans }}
295 « {{ tagging_rule.rule }} »
296 {{ 'config.form_rules.then_tag_as_label'|trans }}
297 « {{ tagging_rule.tags|join(', ') }} »
298 <a href="{{ path('edit_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="mode_edit">
299 <i class="tool grey-text material-icons">mode_edit</i>
300 </a>
301 <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="delete">
302 <i class="tool grey-text material-icons">delete</i>
303 </a>
304 </li>
305 {% endfor %}
306 </ul>
307 </div>
308 </div>
309 {% endif %}
310
311 <ul class="row">
312 <li class="col l6 m6 s12">
313 <div class="card">
314 <div class="card-content">
315 <span class="card-title">{{ 'config.form_rules.card.new_tagging_rule'|trans }}</span>
316
317 {{ form_start(form.new_tagging_rule) }}
318 {{ form_errors(form.new_tagging_rule) }}
319
320 <div class="row">
321 <div class="input-field col s12">
322 {{ form_label(form.new_tagging_rule.rule) }}
323 {{ form_errors(form.new_tagging_rule.rule) }}
324 {{ form_widget(form.new_tagging_rule.rule) }}
325 </div>
326 </div>
327
328 <div class="row">
329 <div class="input-field col s12">
330 {{ form_label(form.new_tagging_rule.tags) }}
331 {{ form_errors(form.new_tagging_rule.tags) }}
332 {{ form_widget(form.new_tagging_rule.tags) }}
333 </div>
334 </div>
335
336 {{ form_widget(form.new_tagging_rule.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
337 {{ form_rest(form.new_tagging_rule) }}
338 </form>
339 </div>
340 </div>
341 </li>
342 <li class="col l6 m6 s12">
343 <div class="card z-depth-1">
344 <div class="card-content">
345 <span class="card-title">{{ 'config.form_rules.card.import_tagging_rules'|trans }}</span>
346 <p>{{ 'config.form_rules.card.import_tagging_rules_detail'|trans }}</p>
347 {{ form_start(form.import_tagging_rule) }}
348 {{ form_errors(form.import_tagging_rule) }}
349 <div class="row">
350 <div class="file-field input-field col s12">
351 {{ form_errors(form.import_tagging_rule.file) }}
352 <div class="btn">
353 <span>{{ form.import_tagging_rule.file.vars.label|trans }}</span>
354 {{ form_widget(form.import_tagging_rule.file) }}
355 </div>
356 <div class="file-path-wrapper">
357 <input class="file-path validate" type="text">
358 </div>
359 </div>
360 </div>
361
362 {{ form_widget(form.import_tagging_rule.import, { 'attr': {'class': 'btn waves-effect waves-light'} }) }}
363
364 {{ form_rest(form.import_tagging_rule) }}
365 </form>
366 </div>
367 </div>
368 </li>
369 {% if app.user.config.taggingRules is not empty %}
370 <li class="col l6 m6 s12">
371 <div class="card z-depth-1">
372 <div class="card-content">
373 <span class="card-title">{{ 'config.form_rules.card.export_tagging_rules'|trans }}</span>
374 <p>{{ 'config.form_rules.card.export_tagging_rules_detail'|trans }}</p>
375 <br/>
376 <p><a href="{{ path('export_tagging_rule') }}" class="waves-effect waves-light btn">{{ 'config.form_rules.export'|trans }}</a></p>
377 </div>
378 </div>
379 </li>
380 {% endif %}
381 </ul>
382
383 <div class="row">
384 <div class="input-field col s12">
385 <h4>{{ 'config.form_rules.faq.title'|trans }}</h4>
386
387 <h5>{{ 'config.form_rules.faq.tagging_rules_definition_title'|trans }}</h5>
388 <p class="help">{{ 'config.form_rules.faq.tagging_rules_definition_description'|trans|raw }}</p>
389
390 <h5>{{ 'config.form_rules.faq.how_to_use_them_title'|trans }}</h5>
391 <p class="help">{{ 'config.form_rules.faq.how_to_use_them_description'|trans|raw }}</p>
392
393 <h5>{{ 'config.form_rules.faq.variables_available_title'|trans }}</h5>
394 <p class="help">
395 {{ 'config.form_rules.faq.variables_available_description'|trans }}
396 </p>
397
398 <table class="bordered">
399 <thead>
400 <tr>
401 <th>{{ 'config.form_rules.faq.variable_description.label'|trans }}</th>
402 <th>{{ 'config.form_rules.faq.meaning'|trans }}</th>
403 <th>{{ 'config.form_rules.faq.operator_description.label'|trans }}</th>
404 <th>{{ 'config.form_rules.faq.meaning'|trans }}</th>
405 </tr>
406 </thead>
407
408 <tbody>
409 <tr>
410 <td>title</td>
411 <td>{{ 'config.form_rules.faq.variable_description.title'|trans }}</td>
412 <td>&lt;=</td>
413 <td>{{ 'config.form_rules.faq.operator_description.less_than'|trans }}</td>
414 </tr>
415 <tr>
416 <td>url</td>
417 <td>{{ 'config.form_rules.faq.variable_description.url'|trans }}</td>
418 <td>&lt;</td>
419 <td>{{ 'config.form_rules.faq.operator_description.strictly_less_than'|trans }}</td>
420 </tr>
421 <tr>
422 <td>isArchived</td>
423 <td>{{ 'config.form_rules.faq.variable_description.isArchived'|trans }}</td>
424 <td>&gt;=</td>
425 <td>{{ 'config.form_rules.faq.operator_description.greater_than'|trans }}</td>
426 </tr>
427 <tr>
428 <td>isStarred</td>
429 <td>{{ 'config.form_rules.faq.variable_description.isStarred'|trans }}</td>
430 <td>&gt;</td>
431 <td>{{ 'config.form_rules.faq.operator_description.strictly_greater_than'|trans }}</td>
432 </tr>
433 <tr>
434 <td>content</td>
435 <td>{{ 'config.form_rules.faq.variable_description.content'|trans }}</td>
436 <td>=</td>
437 <td>{{ 'config.form_rules.faq.operator_description.equal_to'|trans }}</td>
438 </tr>
439 <tr>
440 <td>language</td>
441 <td>{{ 'config.form_rules.faq.variable_description.language'|trans }}</td>
442 <td>!=</td>
443 <td>{{ 'config.form_rules.faq.operator_description.not_equal_to'|trans }}</td>
444 </tr>
445 <tr>
446 <td>mimetype</td>
447 <td>{{ 'config.form_rules.faq.variable_description.mimetype'|trans }}</td>
448 <td>OR</td>
449 <td>{{ 'config.form_rules.faq.operator_description.or'|trans }}</td>
450 </tr>
451 <tr>
452 <td>readingTime</td>
453 <td>{{ 'config.form_rules.faq.variable_description.readingTime'|trans }}</td>
454 <td>AND</td>
455 <td>{{ 'config.form_rules.faq.operator_description.and'|trans }}</td>
456 </tr>
457 <tr>
458 <td>domainName</td>
459 <td>{{ 'config.form_rules.faq.variable_description.domainName'|trans }}</td>
460 <td>matches<br />notmaches</td>
461 <td>{{ 'config.form_rules.faq.operator_description.matches'|trans|raw }}<br />{{ 'config.form_rules.faq.operator_description.notmatches'|trans|raw }}</td>
462 </tr>
463 </tbody>
464 </table>
465 </div>
466 </div>
467 </div>
468
469 <div id="set6" class="col s12">
470 {% if app.user.config.ignoreOriginRules is not empty %}
471 <div class="row">
472 <div class="input-field col s12">
473 <ul>
474 {% for ignore_origin_rule in app.user.config.ignoreOriginRules %}
475 <li>
476 {{ 'config.form_rules.if_label'|trans }}
477 « {{ ignore_origin_rule.rule }} »
478 <a href="{{ path('edit_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="mode_edit">
479 <i class="tool grey-text material-icons">mode_edit</i>
480 </a>
481 <a href="{{ path('delete_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="delete">
482 <i class="tool grey-text material-icons">delete</i>
483 </a>
484 </li>
485 {% endfor %}
486 </ul>
487 </div>
488 </div>
489 {% endif %}
490
491 {{ form_start(form.new_ignore_origin_user_rule) }}
492 {{ form_errors(form.new_ignore_origin_user_rule) }}
493
494 <div class="row">
495 <div class="input-field col s12">
496 {{ form_label(form.new_ignore_origin_user_rule.rule) }}
497 {{ form_errors(form.new_ignore_origin_user_rule.rule) }}
498 {{ form_widget(form.new_ignore_origin_user_rule.rule) }}
499 </div>
500 </div>
501
502 {{ form_widget(form.new_ignore_origin_user_rule.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
503 {{ form_rest(form.new_ignore_origin_user_rule) }}
504 </form>
505 </div>
506
507 <div id="set7" class="col s12">
508 <div class="row">
509 <h5>{{ 'config.reset.title'|trans }}</h5>
510 <p>{{ 'config.reset.description'|trans }}</p>
511 <a href="{{ path('config_reset', { type: 'annotations'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
512 {{ 'config.reset.annotations'|trans }}
513 </a>
514 <a href="{{ path('config_reset', { type: 'tags'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
515 {{ 'config.reset.tags'|trans }}
516 </a>
517 <a href="{{ path('config_reset', { type: 'archived'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
518 {{ 'config.reset.archived'|trans }}
519 </a>
520 <a href="{{ path('config_reset', { type: 'entries'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
521 {{ 'config.reset.entries'|trans }}
522 </a>
523 </div>
524
525 {% if enabled_users > 1 %}
526 <br /><hr /><br />
527
528 <div class="row">
529 <h5>{{ 'config.form_user.delete.title'|trans }}</h5>
530 <p>{{ 'config.form_user.delete.description'|trans }}</p>
531 <a href="{{ path('delete_account') }}" onclick="return confirm('{{ 'config.form_user.delete.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red delete-account">
532 {{ 'config.form_user.delete.button'|trans }}
533 </a>
534 </div>
535 {% endif %}
536 </div>
537 </div>
538
539 </div>
540 </div>
541 </div>
542 {% endblock %}