Streams: exploring ideas for new features

Hi @Tiddlybob, can I ask why you feel the context menu option would be more usable on phones than the controls above the stream? Thank you.

@saqimtiaz When I first read your comment this morning, for some reason I thought that all of the controls on the parent header only showed up on hover, in which case a context menu would be more accessible for mobile. Now that I look back and see the persistent buttons, I think the first method would be a bit easier on mobile.

That being said… I agree that the first option might be visually discordant. What do you think about including an ellipsis that triggers the context menu for the parent header? That might help keep the UI uncluttered, while also providing a visual cue to the extended options.

Sorry to be late to this conversation; have been away from TW, mainly for want of exactly this: an agile outliner that integrates reasonably well with TiddlyWiki (absent that, my go-to notetaking app remains DynaList).

What it would take to make this work for me is two simple enhancements to existing functionalities -essentially:

  1. When i click the Fuse button that collapses a set of outline nodes into a single TiddlerName_fused tiddler, then all those separate node-tiddlers should be deleted -either automatically, or else by giving me a one-click option to do so.
  2. Given a view of all those cryptically-named node-tiddlers, i’d like to be able to shift-select any combination, or select all, and delete with a single click.

For all the sense this makes from my own UX experience, i guess from Developer perspective it’s more complicated, seeing as how it involves 2 plugins (Streams and Streams Fusion, AFAIK) for 1st point above, and maybe core UI element(s) for the 2nd… And may even run counter to the TW philosophy of “everything’s a tiddler,” which may imply having a tiddler for everything. I get that, in principle, but still…

Much as i appreciate the experience of agile-outlining in TW via Streams, then organising & saving the work to one or more well-named tiddlers as appropriate via Streams Fusion, all that joy evaporates when i contemplate the mess of tiddlers in my Recent list, whose names mean nothing to me, yet i must then click each one and pull down to delete each one individually.

Perhaps there’s a better workflow within the product as it stands that i am failing to see?
If so, perhaps it could be made more obviously accessible with some contextual help affordance.

Anyway: kudos to you both, @saqimtiaz & @fastfreddy , on this dynamite plugin combo; am happy to see that development continues -especially regarding that sub-plugins idea Saq presented above, which might be away to address my little wish-list above (?).

/walt

I like both! Not helpful to you in deciding, but an affirmation nonetheless.

1 Like

Hi Walt,

First off, no need to change what works for you if you are happy!

That sounds easily doable in Fusion. If Fuse creates a new tiddler, you can go back to the original tiddler and delete it, it will ask you if you also want to delete its children.

Is this instead of the above or in addition to? What is the use case?

The issue is that Streams started life as a technology demo and due to user demand became a plugin. What it really needs is a custom made edition around it, that is a customised TiddlyWiki.

Some users try to clean up the timeline by removing the child nodes by configuring their titles to start with $:/. This is suboptimal is it also excludes them from search. What makes sense is to customize search and the timeline to show the stream-root tiddler for each node that might otherwise be shown in the results. You don’t care or want to know which node tiddler changed, you want to see the name of the root tiddler that it belongs to. This is easy to do with the filters that come with stream, but requires customizing core tiddlers and therefore is not something that comes with the plugin.

1 Like

Hi Walt, not sure I follow this point:

  1. When i click the Fuse button that collapses a set of outline nodes into a single TiddlerName_fused tiddler, then all those separate node-tiddlers should be deleted -either automatically, or else by giving me a one-click option to do so.

Streams-fusion lets you fuse and overwrite, is that not what you need?

image

For this other point:

  1. Given a view of all those cryptically-named node-tiddlers, i’d like to be able to shift-select any combination, or select all, and delete with a single click.

I use <$macrocall $name="unusedtitle" baseName=<<parent>> separator="/" /> as template to name Streams node. It is then relatively easy to find (and delete) matching nodes using Tiddler Commander, which lets you filter and select, before deleting.

1 Like

Ah… that does indeed solve part of the problem: when i want to append the entire fused stream at bottom of current tiddler (not overwrite: because i never wanted to do that, and aksi because of the pop-up warning on selection of this option, i never really tried this function). Thanks @fastfreddy for the useful pointer!

Interesting! So: if i want to delete all Streams nodes at the end of a session (during which i should have fused all Streams content to some tiddler or other), what would be a search string that would reveal all those now-superfluous nodes in a Tiddler Commander list view, for easy select-all & delete?

Yes… That is certainly easier than trying to find and delete the parent + allChildren, given the non-intuitive naming algorithm, tho it still involves can involve too many clicks, depending how many top-level nodes+children you have to delete.

UseCase: Typically, i will start my day with a Journal tiddler, and then quickly bang-out an outline of Appointments i must keep, Projects i intend to work on, an “Inbox” of whatever random things may materialise & need to be integrated… Perhaps related to some Project or Appointment or some Reference node, which may take more thinking than i can afford at the moment. This can quickly (depending how caffeinated i may be :coffee: ) develop into quite a bushy tree, which warrants quite a lot of pruning and/or transplanting of scions from original rootstock (sorry for the run-on ag metaphor, but that’s what i do IRL :tractor: ).

SO, in answer to your Q @saqimtiaz: i think this item #2 on my list is in addition to item #1. Because i don’t like leaving my workspace in a mess from one day to the next, i need an easy way to simply disappear all those nodes that haven’t found their proper home in body text of some tiddler or other. This could perhaps be accomplished via some smart filtering in Tiddler Commander, per @fastfreddy suggestion… .Or perhaps in a more elegant fashion (not requiring use of some additional plugin) building on this feature you talk about developing…

Yes! If the search function could show me just stream-root tiddlers, screening out all those algorithmically-named child nodes (tho it would be great if it could show me a count of them beside the parent), that could really help.

Hm: a customised edition… Makes sense, now that think of it. Like Soren’s Zettelkasten, this hybrid amalgam of wiki+outlining functionalities is powerful & complex enough, it really warrants that sort of treatment. I’ve got a lot more to learn, before i could contribute any substantial help to such an effort, but- while struggling my way up the learning curve -i am happy to be engaged in this conversation!

The filter to find all of a Stream’s nodes is relatively easy: something like
[[prefix[basename]] should work. By basename, I use the root tiddler’s name.

For example, a root tiddler named demo, this will work:

It is relatively easy to modify a few tiddlers to improve search results handling of Streams. Here are my recipes:

  1. to improve general and advanced search compatibility with Streams (updated to avoid leveraging deprecated tiddlers from Deprecated — do not use (August 24th, 2021))
  • clone $:/core/ui/DefaultSearchResultList into $:/plugins/sq/streams-search/StreamSearchResults
  • change the new tiddlers’ caption to “Streams”
  • edit the fields first-search-filter and second-search-filter to insert get-stream-root[] after sort[]
  • edit $:/config/SearchResults/Default to $:/plugins/sq/streams-search/StreamSearchResults
  1. to improve recent view and tag view compatibility with Streams (and only show root tiddler names):
  • add a subfilter in $:/core/ui/SideBar/Recentand in $:/core/ui/MoreSideBar/Recent to <$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}} subfilter="get-stream-root[]"/>
  • modify $:/core/ui/TagTemplateto include the get-stream-root[] subfilter
<$macrocall $name="list-tagged-draggable" subfilter="get-stream-root[]" tag=<<currentTiddler>>/>
1 Like

Thanks @fastfreddy for the tip:

Works like a champ!

Dunno about the rest- i steer well clear of anything starting with ‘$:/core’ ,as a rule -but you guys have given me plenty to work with here, so i’m happy today :smiley:

/walt

Hi @saqimtiaz, I’ve been trying to hack together a poor-person’s version of the Stream search/filter feature showcased above, until the new features are ready/released.

It works wells of far, but my success is limited to first level text match. How do you handle the matching of text in subordinate nodes? You probably have already thought through that.

Am I right in suspecting you need to show the full hierarchy of subordinate notes that match the search string?

What about folded nodes?

Thanks in advance!

I should be able to get a beta release published for testing in about two weeks time.

Could you elaborate what the problem is? Search all nodes of the root tiddler for the text, for each matching node also display all ancestors but only highlight the nodes with results.

For all nodes that have matching text, force the display of all ancestors.

that will be fantastic! I have a few Streams with a lot of nodes, but I should wait it out; my solution wasn’t very clever (not using css classes for example; admittedly only about 20 minutes of thinking through options).

Certainly:
I’ll try a few screen shots:
1- regular view

2- first level text match (happy):

3- missed text match in second level (not desired behaviour; would have wanted the node with “remove” (shown in first screenshot) would return with ancestors;

fantastic, definitely what I need. I look forward to trying it out!

minor improvement to report (searches text @ any depth, and returns all ancestors; one shortcoming reported above resolved), but still not great to unfold folded nodes… I have an idea, but this is probably good enough until the proper release though…

(trick: [list[!!stream-list]!is[missing]] :intersection[all[current]get-stream-nodes[]search:text{$:/temp/stream-search}get-stream-root:includeall[]] in
$:/plugins/sq/streams/templates/stream-root-template

Is there a way to take a group of nodes (streams?) and indent them all at once? I haven’t found any way other than to right click, indent, repeat. Moving a group at once is useful if you apply organisation after creating nodes.

@Mark_S ; I use keyboard shortcuts for this.

I configured alt+right to indent, alt+left to unindent, alt+up to move up, alt+down to move down.

To indent a bunch of contiguous nodes, I edit the first one (double-click), then alt+right to indent, ctrl+down to select next, repeat for the next node, etc…

This is one of my odd sidenotes! :slight_smile: (feel free to ignore!)

1 - I do see the power of the way Streams works! It is great!

(P.S.: But you DO need to show HOW to plug it in, in the first post at least, via Streams — on TiddlyWiki 5.2.2, lest a newbie will never find it!
I’m not Yoda-ish enough yet to intuit it’s address! :slight_smile:)

2 - I think that you did a great visual design job in your own (minimalist) site at …

https://saqimtiaz.github.io/tw5-plugins-sandbox/


My point?
What is my point?

Merely that visual rendering of Streams matters. AND you grasp the issue already :slight_smile:.

Why?
Because Streams easily creates wikis with zillions of “bits” (Tiddlers) that can get visually messy!

CSS can simplify the final presentation better, maybe?

UPSHOT: Maybe a more minimalist final render in CSS would be welcomed? At least an option? One you likely know how to do?

Maybe a couple of “Stream Layouts” could solve that issue?

Dunno, just thoughts,
Best, TT

@Mark_S this is probably the fastest way to indent multiple nodes at once.

I briefly looked into a mechanism to select multiple nodes to allow invoking actions on them. Drag and select is challenging to implement with wikitext. So I may consider taking inspiration from Discourse and have a button that switches to a selection mode, where you can click on nodes to select them.

1 Like

It would be useful if there was a short-cut key to allow editing as a tiddler, since there are short-cut keys for all the other processes.

The use case, is that on a under-powered device, streams isn’t very performant ( 7meg TW file). You type a character. Wait. Type another character. But tiddlers themselves work fine. So the solution (other than getting a better device) would be to create an outline entry in streams, and then use a short-cut key to continue editing it as a regular tiddler. The current approach, where you have to click on the bullet, interrupts the work flow a bit.

Thanks!

1 Like

The new version in development makes this easier to assign a keyboard shortcut for.

However, you can quite easily add a shortcut for this even with the present released version of Streams, see Streams — on TiddlyWiki 5.2.2

Right, the issue here is that entire stream is being checked to see if anything needs refreshing on every keystroke. There are two ways we could address this:

  1. change the way Streams works so you do not edit a tiddler directly but edit a draft or temp tiddler. This would require an entire rewrite of the plugin so is probably unlikely.
  2. when we start editing a node, add the field throttle.refresh to the tiddler. This will delay the refresh process much as is the case when using the draft mechanism for editing. The concern is whether we can reliably remove the field when exiting editing. I may add this as a configuration option for users to try out.