Review of "TaskMan" version 1

Details Page Preview

A calendar-integrated daily task manager and reminder system for the GNOME panel. Visualises task load and completion with dynamic colour coding. Supports timed reminders with Snooze and Dismiss notifications.

Extension Homepage
https://github.com/utkarsh-brainstorm/TaskMan

No comments.

FAQ

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 5

Shexli found 5 issues that may need reviewer attention.

EGO-A-004 warning

extension files should not contain excessive ungated console logging

File contains 6 ungated console.log/warn/error calls (threshold: 5).

No excessive logging

  • extension.js:67
    console.error('[TaskMan] data.json corrupt — resetting', jsonErr)
  • extension.js:79
    console.error('[TaskMan] Failed to load data.json', e)
  • extension.js:124
    console.error('[TaskMan] Async save failed', e)
  • extension.js:129
    console.error('[TaskMan] Failed to start async save', e)
  • extension.js:228
    console.error('[TaskMan] Could not create notification source', e)
  • extension.js:295
    console.error('[TaskMan] Notification failed', e)

EGO-L-002 warning

objects created by extension should be destroyed in disable()

Objects assigned in `enable()` are missing matching `.destroy()` calls in `disable()` or its helper methods.

Destroy all objects

  • extension.js:487
    this._dateLabel = new St.Label({ text: '', style_class: 'taskman-date-label' })
  • extension.js:499
    this._entry = new St.Entry({ hint_text: 'New task — press Enter or choose ⏰…', style_class: 'taskman-entry', can_focus: true, x_expand: true })
  • extension.js:498
    this._entryBox = new St.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL, style_class: 'taskman-entry-box', x_expand: true })
  • extension.js:493
    this._listBox = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, x_expand: true })
  • extension.js:488
    this._pastBanner = new St.Label({ text: '🔒 Past day — read only', style_class: 'taskman-past-banner', visible: false })
  • extension.js:504
    this._remBtn = new St.Button({ label: '⏰', style_class: 'taskman-mode-btn', can_focus: true, reactive: true })
  • extension.js:492
    this._scroll = new St.ScrollView({ style_class: 'taskman-scroll', hscrollbar_policy: St.PolicyType.NEVER, vscrollbar_policy: St.PolicyType.AUTOMATIC, x_expand: true })
  • extension.js:502
    this._taskBtn = new St.Button({ label: '📝', style_class: 'taskman-mode-btn taskman-mode-btn-active', can_focus: true, reactive: true })
  • extension.js:526
    this._timeEntry = new St.Entry({ hint_text: 'HH:MM', style_class: 'taskman-time-entry', can_focus: true, x_expand: true })
  • extension.js:512
    this._timeRow = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, style_class: 'taskman-time-row', x_expand: true, visible: false })

EGO-L-005 warning

owned object references should be released in disable()

Owned references that are cleaned up in `disable()` should also be released with `null` or `undefined`.

Destroy all objects

  • extension.js:487
    this._dateLabel = new St.Label({ text: '', style_class: 'taskman-date-label' })
  • extension.js:499
    this._entry = new St.Entry({ hint_text: 'New task — press Enter or choose ⏰…', style_class: 'taskman-entry', can_focus: true, x_expand: true })
  • extension.js:498
    this._entryBox = new St.BoxLayout({ orientation: Clutter.Orientation.HORIZONTAL, style_class: 'taskman-entry-box', x_expand: true })
  • extension.js:493
    this._listBox = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, x_expand: true })
  • extension.js:488
    this._pastBanner = new St.Label({ text: '🔒 Past day — read only', style_class: 'taskman-past-banner', visible: false })
  • extension.js:504
    this._remBtn = new St.Button({ label: '⏰', style_class: 'taskman-mode-btn', can_focus: true, reactive: true })
  • extension.js:492
    this._scroll = new St.ScrollView({ style_class: 'taskman-scroll', hscrollbar_policy: St.PolicyType.NEVER, vscrollbar_policy: St.PolicyType.AUTOMATIC, x_expand: true })
  • extension.js:502
    this._taskBtn = new St.Button({ label: '📝', style_class: 'taskman-mode-btn taskman-mode-btn-active', can_focus: true, reactive: true })
  • extension.js:526
    this._timeEntry = new St.Entry({ hint_text: 'HH:MM', style_class: 'taskman-time-entry', can_focus: true, x_expand: true })
  • extension.js:512
    this._timeRow = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, style_class: 'taskman-time-row', x_expand: true, visible: false })
  • extension.js:485
    this.actor = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, style_class: 'taskman-tasklist-container' })

EGO-L-003 warning

signals connected by extension should be disconnected in disable()

Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.

Disconnect all signals

  • extension.js:500
    this._entry.clutter_text.connect('activate', () => this._handleEntryActivate())
  • extension.js:505
    this._remBtn.connect('clicked', () => this._setEntryMode('reminder'))
  • extension.js:503
    this._taskBtn.connect('clicked', () => this._setEntryMode('task'))
  • extension.js:527
    this._timeEntry.clutter_text.connect('activate', () => this._confirmReminder())
  • extension.js:760
                this.menu.connect('open-state-changed', (_menu, isOpen) => {
                    if (isOpen) {
                        // Track idle ID so we can cancel if menu closes before it fires.
                        this._openMenuIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
                      

EGO-L-004 warning

main loop sources should be removed in disable()

Main loop sources assigned in `enable()` are missing matching removals in `disable()` or its helper methods.

Remove main loop sources

  • extension.js:763
                        this._openMenuIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
                            this._openMenuIdleId = null;
                            this._taskList.showDate(this._calendar.selectedKey);
                            this._taskList.focusEntry();
                            

All Versions

Version Status
1 Unreviewed