1
0
mirror of https://git.tt-rss.org/git/tt-rss.git synced 2025-12-13 10:55:56 +00:00

Merge branch 'master' of git.fakecake.org:fox/tt-rss

This commit is contained in:
Andrew Dolgov
2022-01-13 13:59:36 +03:00
31 changed files with 340 additions and 155 deletions

View File

@@ -16,7 +16,8 @@ const Filters = {
ACTION_SCORE: 6,
ACTION_LABEL: 7,
ACTION_PLUGIN: 9,
PARAM_ACTIONS: [4, 6, 7, 9],
ACTION_REMOVE_TAG: 10,
PARAM_ACTIONS: [4, 6, 7, 9, 10],
filter_info: {},
test: function() {
const test_dialog = new fox.SingleUseDialog({

View File

@@ -282,6 +282,10 @@ const Feeds = {
CommonDialogs.safeModeWarning();
}
dojo.connect(dijit.byId("main-catchup-dropdown"), 'onItemClick',
(item) => Feeds.catchupCurrent(item.option.value)
);
// bw_limit disables timeout() so we request initial counters separately
if (App.getInitParam("bw_limit")) {
this.requestCounters();

View File

@@ -626,6 +626,12 @@ const Headlines = {
const search_query = Feeds._search_query ? Feeds._search_query.query : "";
const target = dijit.byId('toolbar-headlines');
// TODO: is this needed? destroyDescendants() below might take care of it (?)
if (this._headlinesSelectClickHandle)
dojo.disconnect(this._headlinesSelectClickHandle);
target.destroyDescendants();
if (tb && typeof tb == 'object') {
target.attr('innerHTML',
`
@@ -646,27 +652,37 @@ const Headlines = {
</span>
<span class='right'>
<span id='selected_prompt'></span>
<div class='select-articles-dropdown' dojoType='fox.form.DropDownButton' title='"${__('Select articles')}'>
<span>${__("Select...")}</span>
<div dojoType='dijit.Menu' style='display: none;'>
<div dojoType='dijit.MenuItem' onclick='Headlines.select("all")'>${__('All')}</div>
<div dojoType='dijit.MenuItem' onclick='Headlines.select("unread")'>${__('Unread')}</div>
<div dojoType='dijit.MenuItem' onclick='Headlines.select("invert")'>${__('Invert')}</div>
<div dojoType='dijit.MenuItem' onclick='Headlines.select("none")'>${__('None')}</div>
<div dojoType='dijit.MenuSeparator'></div>
<div dojoType='dijit.MenuItem' onclick='Headlines.selectionToggleUnread()'>${__('Toggle unread')}</div>
<div dojoType='dijit.MenuItem' onclick='Headlines.selectionToggleMarked()'>${__('Toggle starred')}</div>
<div dojoType='dijit.MenuItem' onclick='Headlines.selectionTogglePublished()'>${__('Toggle published')}</div>
<div dojoType='dijit.MenuSeparator'></div>
<div dojoType='dijit.MenuItem' onclick='Headlines.catchupSelection()'>${__('Mark as read')}</div>
<div dojoType='dijit.MenuItem' onclick='Article.selectionSetScore()'>${__('Set score')}</div>
${tb.plugin_menu_items}
<select class='select-articles-dropdown'
id='headlines-select-articles-dropdown'
data-prevent-value-change="true"
data-dropdown-skip-first="true"
dojoType="fox.form.Select"
title="${__('Show articles')}">
<option value='' selected="selected">${__("Select...")}</option>
<option value='headlines_select_all'>${__('All')}</option>
<option value='headlines_select_unread'>${__('Unread')}</option>
<option value='headlines_select_invert'>${__('Invert')}</option>
<option value='headlines_select_none'>${__('None')}</option>
<option></option>
<option value='headlines_selectionToggleUnread'>${__('Toggle unread')}</option>
<option value='headlines_selectionToggleMarked'>${__('Toggle starred')}</option>
<option value='headlines_selectionTogglePublished'>${__('Toggle published')}</option>
<option></option>
<option value='headlines_catchupSelection'>${__('Mark as read')}</option>
<option value='article_selectionSetScore'>${__('Set score')}</option>
${tb.plugin_menu_items != '' ?
`
<option></option>
${tb.plugin_menu_items}
` : ''}
${headlines.id === 0 && !headlines.is_cat ?
`
<div dojoType='dijit.MenuSeparator'></div>
<div dojoType='dijit.MenuItem' class='text-error' onclick='Headlines.deleteSelection()'>${__('Delete permanently')}</div>
<option></option>
<option class='text-error' value='headlines_deleteSelection'>${__('Delete permanently')}</option>
` : ''}
</div>
</select>
${tb.plugin_buttons}
</span>
`);
@@ -675,6 +691,48 @@ const Headlines = {
}
dojo.parser.parse(target.domNode);
this._headlinesSelectClickHandle = dojo.connect(dijit.byId("headlines-select-articles-dropdown"), 'onItemClick',
(item) => {
const action = item.option.value;
switch (action) {
case 'headlines_select_all':
Headlines.select('all');
break;
case 'headlines_select_unread':
Headlines.select('unread');
break;
case 'headlines_select_invert':
Headlines.select('invert');
break;
case 'headlines_select_none':
Headlines.select('none');
break;
case 'headlines_selectionToggleUnread':
Headlines.selectionToggleUnread();
break;
case 'headlines_selectionToggleMarked':
Headlines.selectionToggleMarked();
break;
case 'headlines_selectionTogglePublished':
Headlines.selectionTogglePublished();
break;
case 'headlines_catchupSelection':
Headlines.catchupSelection();
break;
case 'article_selectionSetScore':
Article.selectionSetScore();
break;
case 'headlines_deleteSelection':
Headlines.deleteSelection();
break;
default:
if (!PluginHost.run_until(PluginHost.HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM2, true, action))
console.warn('unknown headlines action', action);
}
}
);
},
onLoaded: function (reply, offset, append) {
console.log("Headlines.onLoaded: offset=", offset, "append=", append);

View File

@@ -21,6 +21,7 @@ const PluginHost = {
HOOK_HEADLINE_MUTATIONS_SYNCED: 16,
HOOK_HEADLINES_RENDERED: 17,
HOOK_HEADLINES_SCROLL_HANDLER: 18,
HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM2: 19,
hooks: [],
register: function (name, callback) {
if (typeof(this.hooks[name]) == 'undefined')
@@ -36,6 +37,17 @@ const PluginHost = {
this.hooks[name][i](args);
}
},
run_until: function (name, check, ...args) {
//console.warn('PluginHost.run_until', name, check, args);
if (typeof(this.hooks[name]) != 'undefined')
for (let i = 0; i < this.hooks[name].length; i++) {
if (this.hooks[name][i](args) == check)
return true;
}
return false;
},
unregister: function (name, callback) {
for (let i = 0; i < this.hooks[name].length; i++)
if (this.hooks[name][i] == callback)

View File

@@ -1,8 +1,66 @@
/* global dijit, define */
define(["dojo/_base/declare", "dijit/form/Select"], function (declare) {
return declare("fox.form.Select", dijit.form.Select, {
/* eslint-disable prefer-rest-params */
/* global define */
// FIXME: there probably is a better, more dojo-like notation for custom data- properties
define(["dojo/_base/declare",
"dijit/form/Select",
"dojo/_base/lang", // lang.hitch
"dijit/MenuItem",
"dijit/MenuSeparator",
"dojo/aspect",
], function (declare, select, lang, MenuItem, MenuSeparator, aspect) {
return declare("fox.form.Select", select, {
focus: function() {
return; // Stop dijit.form.Select from keeping focus after closing the menu
},
startup: function() {
this.inherited(arguments);
if (this.attr('data-dropdown-skip-first') == 'true') {
aspect.before(this, "_loadChildren", () => {
this.options = this.options.splice(1);
});
}
},
// hook invoked when dropdown MenuItem is clicked
onItemClick: function(/*item, menu*/) {
//
},
_setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
if (this.attr('data-prevent-value-change') == 'true' && newValue != '')
return;
this.inherited(arguments);
},
// the only difference from dijit/form/Select is _onItemClicked() handler
_getMenuItemForOption: function(/*_FormSelectWidget.__SelectOption*/ option){
// summary:
// For the given option, return the menu item that should be
// used to display it. This can be overridden as needed
if (!option.value && !option.label){
// We are a separator (no label set for it)
return new MenuSeparator({ownerDocument: this.ownerDocument});
} else {
// Just a regular menu option
const click = lang.hitch(this, "_setValueAttr", option);
const item = new MenuItem({
option: option,
label: (this.labelType === 'text' ? (option.label || '').toString()
.replace(/&/g, '&amp;').replace(/</g, '&lt;') :
option.label) || this.emptyLabel,
onClick: () => {
this.onItemClick(item, this.dropDown);
click();
},
ownerDocument: this.ownerDocument,
dir: this.dir,
textDir: this.textDir,
disabled: option.disabled || false
});
item.focusNode.setAttribute("role", "option");
return item;
}
},
});
});