Skip to content

Commit 405e77e

Browse files
committed
b50 release with section title that can vary. Also removed the Feature Flag for this.
1 parent 8568b9f commit 405e77e

11 files changed

Lines changed: 34 additions & 32 deletions

‎jgclark.Dashboard/ARCHITECTURE-How_Stuff_Works.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,12 @@ There are three related backend functions that re-generate a subset of Sections
225225
226226
All three share the same tail behaviour: recalculate done-task counts (when `doneDatesAvailable`) and kick off a scheduled tag-mention-cache rebuild if one is pending.
227227
228-
## Reminders section (`REM`, `FFlag_Reminders`)
228+
## Reminders section (`REM`)
229229
230-
Gated by feature flag **`FFlag_Reminders`**. Backend: `dataGenerationReminders.js` (`getRemindersGeneratedData()`). Frontend: `ReminderItem.jsx` via `ItemRow`.
230+
Controlled by **`showRemindersSection`**. Backend: `dataGenerationReminders.js` (`getRemindersGeneratedData()`). Frontend: `ReminderItem.jsx` via `ItemRow`.
231231
232232
Live data comes from incomplete Apple Reminders on lists enabled in NotePlan (`Calendar.availableReminderLists({ enabledOnly: true })` then `Calendar.remindersByLists`). Items are split into:
233-
- timed today whose due time has been reached → Time Blocks (`TB`); future-timed today reminders stay out of TB until then. When Reminders is enabled, TB is titled **Current time block + tasks**.
233+
- timed today whose due time has been reached → Time Blocks (`TB`); future-timed today reminders stay out of TB until then. When Reminders is enabled, TB is titled **Timed Reminders** if only reminders are present, or **Timed Items** if NotePlan timeblocks are also present (or only timeblocks).
234234
- untimed today / yesterday / tomorrow → day sections (`DT` / `DY` / `DO`) as referenced items
235235
- undated + before yesterday → the dedicated **Reminders** (`REM`) section
236236
- dated **after tomorrow** → filtered out (not shown anywhere)

‎jgclark.Dashboard/CHANGELOG.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ For more details see the [plugin's documentation](https://github.com/NotePlan/pl
99
- TODO: fix isNoteFromAllowedFolder() for teamspace or possibly 2025-W21.md
1010
-->
1111
## [2.4.0.b50] 2026-07-14
12+
- TB section title is **Timed Reminders** when Reminders are on and the section has timed reminders but no NotePlan timeblocks; still **Timed Items** when both are present, and **Time Blocks** when Reminders are off.
13+
- Reminders section is no longer behind feature flag **FFlag_Reminders**; turn it on from the Filter menu / Settings like any other section.
1214
- Can now click reminder item to open it in the Apple Reminders app (requires NP 3.21.2+ / build 1524).
1315
- fix: Adding a Reminder with blank date/time fields uses Unix epoch as the API stand-in for "no date" (matched by the Reminders mapper), instead of assigning today/now.
1416
- fix: Show the add-Reminder heading button in demo mode (was missing because demo data had no list options for the dialog).

‎jgclark.Dashboard/README.md‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ This plugin provides a **dashboard window** for your NotePlan data that in one p
99
- all overdue tasks
1010
- all open items with an added priority
1111
- the next Project notes ready to review (if you have the "Projects and Reviews" plugin installed)
12-
- it shows today's Time Blocks you've set (retitled **Timed Items** when Reminders are on)
12+
- it shows today's Time Blocks you've set
1313
- and any items from Apple Reminders (when that section is enabled)
1414
- plus a 'Search' field to show all open items that match a search.
1515

@@ -142,26 +142,25 @@ The display will **automatically refresh** in the background if you set the "Aut
142142

143143
(From v2.4) The settings screen allow you to specify which (Team)Spaces and/or the Private notes you wish to include in the current Perspective.
144144

145-
### Time Block / Timed Items section
145+
### Time Block / Timed Items / Timed Reminders section
146146
[Time blocks in NotePlan](https://help.noteplan.co/article/121-time-blocking) are a helpful way to help you plan your days. NP shows them in its calendar sidebar. When the **Time Block** section is enabled, the Dashboard shows today's time blocks from your daily note at the top of the window. For example:
147147

148148
<img src="timeblock-section-2.1.0.png" width="740px" margin="8px" border="1px solid grey" alt="current timeblock section" /><!-- TODO: -->
149149

150150
It shows the time first, minus any 'Text must contain' string that you have set in NP's 'Todo' settings pane. Where a time block is defined on a heading or list item, then the calendar+clock icon is shown in place of the task/checklist icon.
151151

152-
When the [Reminders section](#reminders-section) is also enabled, this section is retitled **Timed Items**, and it additionally shows today's Apple Reminders that have a due time -- but only once that due time has been reached. Timed reminders for later today stay hidden until then (the Time Block section refreshes about once a minute while the Dashboard window is visible).
152+
When the [Reminders section](#reminders-section) is also enabled, this section additionally shows today's Apple Reminders that have a due time -- but only once that due time has been reached. Timed reminders for later today stay hidden until then (the Time Block section refreshes about once a minute while the Dashboard window is visible). The section title becomes **Timed Reminders** when it only has those reminders (no NotePlan timeblocks), or **Timed Items** when timeblocks are present as well (or only timeblocks while Reminders is on).
153153

154154
### Reminders section
155155
<img src="reminders-section-2.4.0.png" width="740px" margin="8px" border="1px solid grey" alt="reminders section" />
156156

157-
158157
(From v2.4b50) The **Reminders** section shows incomplete items from your **Apple Reminders** lists. It draws from the same reminder lists you have enabled in NotePlan's own settings (Preferences → Calendars → Reminders), and shows the list name, location, notes and if its flagged. It uses as an accent color, the color of the list set in Apple Reminders.
159158

160-
Open reminders are then split across the Dashboard rather than dumped into a single list:
159+
Open reminders are split across the Dashboard rather than shown in a single list:
161160

162161
| Reminder | Where it appears |
163162
| -------- | ---------------- |
164-
| Due today **with a time**, and that time has been reached | **Timed Items** (with any active time blocks) |
163+
| Due today **with a time**, and that time has been reached | **Timed Reminders** / **Timed Items** (with any active time blocks) |
165164
| Due today **with a time**, but still in the future | hidden until that time |
166165
| Due today **without** a time | **Today** |
167166
| Due yesterday | **Yesterday** |

‎jgclark.Dashboard/src/dashboardHelpers.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @flow
22
//-----------------------------------------------------------------------------
33
// Dashboard plugin helper functions
4-
// Last updated 2026-07-13 for v2.4.0.b49, @CursorAI
4+
// Last updated 2026-07-14 for v2.4.0.b50 by @jgclark
55
//-----------------------------------------------------------------------------
66

77
// import pluginJson from '../plugin.json'
@@ -741,7 +741,7 @@ export function getListOfEnabledSections(config: TDashboardSettings): Array<TSec
741741
// TODO(@dwertheimer): somehow make this automatically work for all new sections added in the future
742742
const sectionsToShow: Array<TSectionCode> = []
743743
if (config.showTimeBlockSection) sectionsToShow.push('TB')
744-
if (config.FFlag_Reminders && config.showRemindersSection) sectionsToShow.push('REM')
744+
if (config.showRemindersSection) sectionsToShow.push('REM')
745745
if (config.showTodaySection || config.showTodaySection === undefined) sectionsToShow.push('DT')
746746
if (config.showYesterdaySection) sectionsToShow.push('DY')
747747
if (config.showTomorrowSection) sectionsToShow.push('DO')

‎jgclark.Dashboard/src/dataGeneration.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ export async function getSomeSectionsData(
9494
if (sectionCodesToGet.includes('INFO')) sections.push(...(await getInfoSectionData(config, useDemoData)))
9595
9696
// Generate Reminders first when needed for day/TB injection and/or the REM section itself
97-
const wantRemSection = sectionCodesToGet.includes('REM') && config.FFlag_Reminders && config.showRemindersSection
97+
const wantRemSection = sectionCodesToGet.includes('REM') && config.showRemindersSection
9898
const wantRemForDaySections =
99-
config.FFlag_Reminders === true &&
99+
config.showRemindersSection === true &&
100100
(sectionCodesToGet.includes('DT') ||
101101
sectionCodesToGet.includes('DY') ||
102102
sectionCodesToGet.includes('DO') ||

‎jgclark.Dashboard/src/dataGenerationDays.js‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @flow
22
//-----------------------------------------------------------------------------
33
// Dashboard plugin main function to generate data for day-based notes
4-
// Last updated 2026-07-13 for v2.4.0.b49, @jgclark
4+
// Last updated 2026-07-14 for v2.4.0.b50 by @jgclark
55
//-----------------------------------------------------------------------------
66

77
import moment from 'moment/min/moment-with-locales'
@@ -309,7 +309,7 @@ export function getTimeBlockSectionData(
309309
let timeBlockItems: Array<TSectionItem> = []
310310
const mustContainString = NPSettings.timeblockMustContainString
311311
let itemCounter = 0
312-
const remindersFeatureEnabled = Boolean(config.FFlag_Reminders && config.showRemindersSection)
312+
const remindersSectionEnabled = Boolean(config.showRemindersSection)
313313

314314
// const combinedParas = sortedOrCombinedParas.concat(sortedRefParas)
315315

@@ -347,6 +347,10 @@ export function getTimeBlockSectionData(
347347
itemCounter += timeBlockItems.length
348348
}
349349

350+
// NotePlan timeblocks collected above; remember count before appending reminders
351+
const noteTimeBlockCount = timeBlockItems.length
352+
let dueNowReminderCount = 0
353+
350354
// Append today's timed reminders whose due time has been reached
351355
if (timedTodayReminderItems.length > 0) {
352356
const dueNowReminders = filterRemindersWhoseTimeHasBeenReached(timedTodayReminderItems)
@@ -355,14 +359,19 @@ export function getTimeBlockSectionData(
355359
logDebug('getTimeBlockSectionData', `- skipped ${String(skippedFutureCount)} timed reminder(s) whose time has not been reached yet`)
356360
}
357361
if (dueNowReminders.length > 0) {
362+
dueNowReminderCount = dueNowReminders.length
358363
const assigned = assignReminderItemsToSection(dueNowReminders, TBsectionCode, TBsectionCode, itemCounter)
359364
timeBlockItems = timeBlockItems.concat(assigned)
360365
itemCounter += assigned.length
361366
logDebug('getTimeBlockSectionData', `- added ${String(assigned.length)} timed reminder(s) into TB`)
362367
}
363368
}
364369

365-
const sectionName = (remindersFeatureEnabled) ? 'Timed Items' : 'Time Blocks'
370+
// Title: Time Blocks (reminders off); Timed Reminders (reminders only); Timed Items (mixed or timeblocks-with-reminders-on)
371+
let sectionName = 'Time Blocks'
372+
if (remindersSectionEnabled) {
373+
sectionName = noteTimeBlockCount === 0 && dueNowReminderCount > 0 ? 'Timed Reminders' : 'Timed Items'
374+
}
366375

367376
const section: TSection = {
368377
ID: TBsectionCode,

‎jgclark.Dashboard/src/dataGenerationReminders.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ export async function getRemindersGeneratedData(
311311
useDemoData: boolean = false,
312312
): Promise<TRemindersGeneratedData> {
313313
try {
314-
if (!config.FFlag_Reminders) {
314+
if (!config.showRemindersSection) {
315315
return emptyRemindersGeneratedData()
316316
}
317317

‎jgclark.Dashboard/src/react/components/Header/featureFlagItems.js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @flow
2-
// Last updated 2026-05-23 for v2.4.0.b44 by @CursorAI
2+
// Last updated 2026-07-14 for v2.4.0.b50 by @jgclark
33

44
import type { TSettingItem, TDashboardSettings } from '../../../types.js'
55

@@ -18,7 +18,6 @@ const featureFlagSettingDefs = [
1818
{ key: 'FFlag_UseTagCacheAPIComparison', label: 'Use Tag Cache API Comparison', description: 'When using Tag Cache, compare the results with the API. (Slows it down.)' },
1919
{ key: 'FFlag_ShowSectionTimings', label: 'Show Section Timings', description: 'Show timings for how long it took to generate sections' },
2020
{ key: 'FFlag_DynamicAddToAnywhere', label: 'Dynamic Add To Anywhere', description: 'Use new DynamicDialog-based add task dialog instead of QuickCapture plugin' },
21-
{ key: 'FFlag_Reminders', label: 'Show Reminders Section', description: 'Enable Apple Reminders section (v2.5.0 beta)' },
2221
]
2322

2423
export const createFeatureFlagItems = (dashboardSettings: TDashboardSettings): Array<TSettingItem> => {

‎jgclark.Dashboard/src/react/components/Header/filterDropdownItems.js‎

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// @flow
2-
// Last updated 2024-10-11 for v2.1.0.a13 by @jgclark
2+
// Last updated 2026-07-14 for v2.4.0.b50 by @jgclark
33

44
import { allSectionDetails } from '../../../constants.js'
55
import type { TDashboardSettings } from '../../../types.js'
6-
import type { TSettingItem } from '@helpers/react/DynamicDialog/DynamicDialog.jsx'
76
import { dashboardFilterDefs } from '../../../dashboardSettings.js'
87
import { getTagSectionDetails } from '../Section/sectionHelpers.js'
98
import { clo } from '@helpers/react/reactDev.js'
9+
import type { TSettingItem } from '@helpers/react/DynamicDialog/DynamicDialog.jsx'
1010

1111
/**
1212
* Create two arrays of TSettingItems to use in Dropdown menu, using details in constants allSectionDetails, dashboardFilters.
@@ -15,10 +15,7 @@ import { clo } from '@helpers/react/reactDev.js'
1515
* @returns {[Array<TSettingItem>, Array<TSettingItem>]}
1616
*/
1717
export const createFilterDropdownItems = (dashboardSettings: TDashboardSettings): [Array<TSettingItem>, Array<TSettingItem>] => {
18-
// REM only appears in Filters when FFlag_Reminders is on (avoids a dead toggle for non-devs)
19-
const sectionsWithoutTags = allSectionDetails.filter(
20-
(s) => s.sectionCode !== 'TAG' && (s.sectionCode !== 'REM' || dashboardSettings.FFlag_Reminders === true),
21-
)
18+
const sectionsWithoutTags = allSectionDetails.filter((s) => s.sectionCode !== 'TAG')
2219
const tagSections = getTagSectionDetails(dashboardSettings)
2320
const allSections = [...sectionsWithoutTags, ...tagSections]
2421
const sectionDropbownItems: Array<TSettingItem> = allSections

‎jgclark.Dashboard/src/refreshClickHandlers.js‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// clickHandlers.js
44
// Handler functions for refresh-related dashboard clicks that come over the bridge.
55
// The routing is in pluginToHTMLBridge.js/bridgeClickDashboardItem()
6-
// Last updated 2026-05-28 for v2.4.0.b45 by @CursorAI
6+
// Last updated 2026-07-14 for v2.4.0.b50 by @jgclark
77
//-----------------------------------------------------------------------------
88

99
import { SYNTHETIC_SECTION_CODES, WEBVIEW_WINDOW_ID } from './constants'
@@ -282,10 +282,7 @@ export async function refreshSomeSections(data: MessageDataObject, calledByTrigg
282282
return handlerResult(true)
283283
}
284284
}
285-
if (
286-
sectionCodesToRefresh.includes('REM') &&
287-
(pluginData.dashboardSettings?.FFlag_Reminders !== true || pluginData.dashboardSettings?.showRemindersSection === false)
288-
) {
285+
if (sectionCodesToRefresh.includes('REM') && pluginData.dashboardSettings?.showRemindersSection === false) {
289286
sectionCodesToRefresh = sectionCodesToRefresh.filter((sectionCode) => sectionCode !== 'REM')
290287
logDebug('refreshSomeSections', `Filtered REM from requested sections as Reminders is disabled -> ${String(sectionCodesToRefresh)}`)
291288
if (sectionCodesToRefresh.length === 0) {

0 commit comments

Comments
 (0)