Compare commits

...

3 Commits

Author SHA1 Message Date
09d7b3386b New file 2023-03-29 08:29:30 +02:00
61964a83a4 Tentative popup menu 2023-03-29 08:29:21 +02:00
65771792d3 Improve columns display 2023-03-29 08:29:00 +02:00
3 changed files with 316 additions and 16 deletions

252
.eslintrc.yml Normal file
View File

@ -0,0 +1,252 @@
---
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
# SPDX-FileCopyrightText: 2018 Claudio André <claudioandre.br@gmail.com>
extends: 'eslint:recommended'
rules:
array-bracket-newline:
- error
- consistent
array-bracket-spacing:
- error
- never
array-callback-return: error
arrow-parens:
- error
- as-needed
arrow-spacing: error
block-scoped-var: error
block-spacing: error
brace-style: error
# Waiting for this to have matured a bit in eslint
# camelcase:
# - error
# - properties: never
# allow: [^vfunc_, ^on_, _instance_init]
comma-dangle:
- error
- arrays: always-multiline
objects: always-multiline
functions: never
comma-spacing:
- error
- before: false
after: true
comma-style:
- error
- last
computed-property-spacing: error
curly:
- error
- multi-or-nest
- consistent
dot-location:
- error
- property
eol-last: error
eqeqeq: error
func-call-spacing: error
func-name-matching: error
func-style:
- error
- declaration
- allowArrowFunctions: true
indent:
- error
- 4
- ignoredNodes:
# Allow not indenting the body of GObject.registerClass, since in the
# future it's intended to be a decorator
- 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child'
# Allow dedenting chained member expressions
MemberExpression: 'off'
key-spacing:
- error
- beforeColon: false
afterColon: true
keyword-spacing:
- error
- before: true
after: true
linebreak-style:
- error
- unix
lines-between-class-members:
- error
- always
- exceptAfterSingleLine: true
max-nested-callbacks: error
max-statements-per-line: error
new-parens: error
no-array-constructor: error
no-await-in-loop: error
no-caller: error
no-constant-condition:
- error
- checkLoops: false
no-div-regex: error
no-empty:
- error
- allowEmptyCatch: true
no-extra-bind: error
no-extra-parens:
- error
- all
- conditionalAssign: false
nestedBinaryExpressions: false
returnAssign: false
no-implicit-coercion:
- error
- allow:
- '!!'
no-invalid-this: error
no-iterator: error
no-label-var: error
no-lonely-if: error
no-loop-func: error
no-nested-ternary: error
no-new-object: error
no-new-wrappers: error
no-octal-escape: error
no-proto: error
no-prototype-builtins: 'off'
no-restricted-globals: [error, window]
no-restricted-properties:
- error
- object: imports
property: format
message: Use template strings
- object: pkg
property: initFormat
message: Use template strings
- object: Lang
property: copyProperties
message: Use Object.assign()
- object: Lang
property: bind
message: Use arrow notation or Function.prototype.bind()
- object: Lang
property: Class
message: Use ES6 classes
no-restricted-syntax:
- error
- selector: >-
MethodDefinition[key.name="_init"] >
FunctionExpression[params.length=1] >
BlockStatement[body.length=1]
CallExpression[arguments.length=1][callee.object.type="Super"][callee.property.name="_init"] >
Identifier:first-child
message: _init() that only calls super._init() is unnecessary
- selector: >-
MethodDefinition[key.name="_init"] >
FunctionExpression[params.length=0] >
BlockStatement[body.length=1]
CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"]
message: _init() that only calls super._init() is unnecessary
- selector: BinaryExpression[operator="instanceof"][right.name="Array"]
message: Use Array.isArray()
no-return-assign: error
no-return-await: error
no-self-compare: error
no-shadow: error
no-shadow-restricted-names: error
no-spaced-func: error
no-tabs: error
no-template-curly-in-string: error
no-throw-literal: error
no-trailing-spaces: error
no-undef-init: error
no-unneeded-ternary: error
no-unused-expressions: error
no-unused-vars:
- error
# Vars use a suffix _ instead of a prefix because of file-scope private vars
- varsIgnorePattern: (^unused|_$)
argsIgnorePattern: ^(unused|_)
no-useless-call: error
no-useless-computed-key: error
no-useless-concat: error
no-useless-constructor: error
no-useless-rename: error
no-useless-return: error
no-whitespace-before-property: error
no-with: error
nonblock-statement-body-position:
- error
- below
object-curly-newline:
- error
- consistent: true
multiline: true
object-curly-spacing: error
object-shorthand: error
operator-assignment: error
operator-linebreak: error
padded-blocks:
- error
- never
# These may be a bit controversial, we can try them out and enable them later
# prefer-const: error
# prefer-destructuring: error
prefer-numeric-literals: error
prefer-promise-reject-errors: error
prefer-rest-params: error
prefer-spread: error
prefer-template: error
quotes:
- error
- single
- avoidEscape: true
require-await: error
rest-spread-spacing: error
semi:
- error
- always
semi-spacing:
- error
- before: false
after: true
semi-style: error
space-before-blocks: error
space-before-function-paren:
- error
- named: never
# for `function ()` and `async () =>`, preserve space around keywords
anonymous: always
asyncArrow: always
space-in-parens: error
space-infix-ops:
- error
- int32Hint: false
space-unary-ops: error
spaced-comment: error
switch-colon-spacing: error
symbol-description: error
template-curly-spacing: error
template-tag-spacing: error
unicode-bom: error
wrap-iife:
- error
- inside
yield-star-spacing: error
yoda: error
globals:
ARGV: readonly
Debugger: readonly
GIRepositoryGType: readonly
globalThis: readonly
imports: readonly
Intl: readonly
log: readonly
logError: readonly
print: readonly
printerr: readonly
window: readonly
TextEncoder: readonly
TextDecoder: readonly
console: readonly
setTimeout: readonly
setInterval: readonly
clearTimeout: readonly
clearInterval: readonly
parserOptions:
ecmaVersion: 2021

View File

@ -169,15 +169,23 @@ class Indicator extends PanelMenu.Button {
this._prefsButton = this._createButton ( 'big', 'preferences-system-symbolic', _('Preferences'), this._onPreferencesActivate ); this._prefsButton = this._createButton ( 'big', 'preferences-system-symbolic', _('Preferences'), this._onPreferencesActivate );
this._buttonMenu.actor.add_child (this._prefsButton); this._buttonMenu.actor.add_child (this._prefsButton);
if ( this.serverLogic && this.serverLogic.canRecheck )
{
this._recheckButton = this._createButton ( 'big', 'mail-send-receive-symbolic', _('Recheck all'), this.recheckAll );
this._buttonMenu.actor.add_child (this._recheckButton );
}
this._reloadButton = this._createButton ( 'big', 'view-refresh-symbolic', _('Reload view'), this.updateStatus ); this._reloadButton = this._createButton ( 'big', 'view-refresh-symbolic', _('Reload view'), this.updateStatus );
this._buttonMenu.actor.add_child (this._reloadButton ); this._buttonMenu.actor.add_child (this._reloadButton );
if ( this.serverLogic && this.serverLogic.canRecheck )
{
let multiButtonBox = new St.BoxLayout( { style_class: 'monito-multibutton' } );
this._recheckButton = this._createButton ( 'big', 'mail-send-receive-symbolic', _('Recheck all'), this.recheckAll );
this._recheckSpecialButton = this._createPopupButton ( this.recheckSpecial );
multiButtonBox.add_child ( this._recheckButton );
multiButtonBox.add_child ( this._recheckSpecialButton );
this._buttonMenu.actor.add_child (multiButtonBox);
const sourceActor = new St.Widget();
this._menu = new PopupMenu.PopupMenu(sourceActor, 0.0, St.Side.TOP);
const menuItem1 = this._menu.addAction('Item 1', () => console.log('activated'));
}
let _intermediate = new PopupMenu.PopupBaseMenuItem ( { let _intermediate = new PopupMenu.PopupBaseMenuItem ( {
style_class: 'monito-services', style_class: 'monito-services',
reactive: false reactive: false
@ -222,6 +230,11 @@ class Indicator extends PanelMenu.Button {
this.serverLogic.recheckAll ( this._recheckButton ); this.serverLogic.recheckAll ( this._recheckButton );
} }
recheckSpecial ( )
{
this._menu.open();
}
changeShowAll ( ) changeShowAll ( )
{ {
this.showAll = ! this.showAll; this.showAll = ! this.showAll;
@ -694,6 +707,28 @@ class Indicator extends PanelMenu.Button {
return button; return button;
} }
_createPopupButton ( callback ) {
let size = 48;
let sizeName = 'big';
let button = new St.Button({
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER,
reactive: true,
can_focus: true,
track_hover: true,
style_class: 'button %s-button'.format(sizeName),
rotation_angle_x: 0.0,
width: 32,
height: size
});
button.child = PopupMenu.arrowIcon(St.Side.BOTTOM);
button.connect('clicked', Lang.bind(this, callback ) );
return button;
}
}); });
class Extension { class Extension {

View File

@ -53,7 +53,7 @@ const column_definitions = {
next_check: { label: _('Next check'), width: 200, expand: false, type: 'date' }, next_check: { label: _('Next check'), width: 200, expand: false, type: 'date' },
last_state_change: { label: _('Last state changed'), width: 200, expand: false, type: 'date' }, last_state_change: { label: _('Last state changed'), width: 200, expand: false, type: 'date' },
attempts: { label: _('Attempts'), width: 50, expand: false, }, attempts: { label: _('Attempts'), width: 50, expand: false, },
status_information: { label: _('Information'), width: 600, expand: false, }, status_information: { label: _('Test result'), width: 600, expand: false, },
output: { label: _('Output'), width: 600, expand: false, }, output: { label: _('Output'), width: 600, expand: false, },
actions: { label: 'Actions', width: 50, expand: false, special: 'actions' }, actions: { label: 'Actions', width: 50, expand: false, special: 'actions' },
}; };
@ -100,7 +100,7 @@ function init() {
this.settings = ExtensionUtils.getSettings(SETTINGS_SCHEMA); this.settings = ExtensionUtils.getSettings(SETTINGS_SCHEMA);
this.gtkVersion = Gtk.get_major_version(); this.gtkVersion = Gtk.get_major_version();
monitoLog ( 'GTK version is ' + this.gtkVersion ); // monitoLog ( 'GTK version is ' + this.gtkVersion );
} }
@ -377,7 +377,7 @@ function createColumnsPrefTab ( noteBook, type, isActive )
{ {
let grid = new Gtk.Grid ( { let grid = new Gtk.Grid ( {
halign: Gtk.Align.FILL, halign: Gtk.Align.FILL,
// margin: 18, margin: 18,
column_spacing: 12, column_spacing: 12,
row_spacing: 12, row_spacing: 12,
visible: true, visible: true,
@ -395,13 +395,10 @@ function createColumnsPrefTab ( noteBook, type, isActive )
let columnNumbers = new Gtk.TreeViewColumn ( { title: _("Column") } ); let columnNumbers = new Gtk.TreeViewColumn ( { title: _("Column") } );
this.ColumnNameRenderer = new Gtk.CellRendererCombo ( { editable: true, this.ColumnNameRenderer = new Gtk.CellRendererCombo ( { editable: true,
has_entry: false, has_entry: false,
text_column: 1 } ); text_column: 0 } );
this.ColumnNameRenderer.connect("edited", onComboChanged) this.ColumnNameRenderer.connect("edited", onComboChanged)
this.ColumnNameRenderer.col = 0; this.ColumnNameRenderer.col = 0;
if ( this.gtkVersion == 4 ) columnNumbers.pack_start(this.ColumnNameRenderer, true);
columnNumbers.pack_start(this.ColumnNameRenderer, true);
else
columnNumbers.append(this.ColumnNameRenderer, true);
columnNumbers.add_attribute(this.ColumnNameRenderer, 'text', 0); columnNumbers.add_attribute(this.ColumnNameRenderer, 'text', 0);
this.treeView.append_column(columnNumbers); this.treeView.append_column(columnNumbers);
this.ColumnNameRenderer.connect('edited', Lang.bind ( this, this.editColumn ) ); this.ColumnNameRenderer.connect('edited', Lang.bind ( this, this.editColumn ) );
@ -482,7 +479,7 @@ function activateAccountRow ( ) {
for ( var i in _columns ) for ( var i in _columns )
{ {
let _iter = this.store.append(); let _iter = this.store.append();
this.store.set_value(_iter, 0, _columns [ i ] ); this.store.set_value(_iter, 0, getEntryLabel ( _columns [ i ] ) );
this.store.set_value(_iter, 1, parseInt(_columnsSizes [ i ]) ); this.store.set_value(_iter, 1, parseInt(_columnsSizes [ i ]) );
} }
@ -642,6 +639,21 @@ function removeColumnRow ( widget ) {
} }
function getEntryName ( text )
{
for ( let [ _colName, _colDef ] of Object.entries(column_definitions) )
if ( _colDef.label == text )
return _colName;
return 'N/A';
}
function getEntryLabel ( text )
{
return column_definitions[text].label;
}
function editColumn ( widget, path, text ) function editColumn ( widget, path, text )
{ {
let _row = this.accountsChooser.get_selected_row(); let _row = this.accountsChooser.get_selected_row();
@ -656,7 +668,8 @@ function editColumn ( widget, path, text )
} }
else else
{ {
this.store.set_value(_iter[1], widget.col, text ); this.store.set_value ( _iter[1], widget.col, text );
text = getEntryName ( text );
prefKey = 'columns'; prefKey = 'columns';
} }