Hi,

well, the incomplete documentation of Spec states clearly that you will be 
receiving two parameters:
onAcceptEdition: aBlock
"Set the block to execute when cell edition is accepted.
`aBlock` receives two arguments:
- the element of the table (See `SpAbstractListPresenter>>#items:`
- the string entered while editing"
acceptAction := aBlock

So, when you set beEditable to your column, you can do something like this:
items := { #one -> 'one'. #two -> 'two' }.
table := SpTablePresenter new
addColumn: (SpStringTableColumn title: 'Key' evaluated: #key);
addColumn: (SpStringTableColumn new
title: 'Value';
evaluated: #value;
beEditable;
onAcceptEdition: [ :item :newValue | item value: newValue ];
yourself);
items: items;
open.
and then you can edit whatever you want and update your item.

Now, since this is a mechanism that has not been used a lot yet in morphic 
backend, I just discovered and fixed a bug (not in editable tables, but that 
affects it: https://github.com/pharo-spec/Spec/issues/1263), so if you want to 
actually use the functionality, you will need to wait until is merged 
(tomorrow).
Esteban

On Mar 20 2022, at 10:26 am, Mark O'Donoghue <mark.odonoghue.2...@gmail.com> 
wrote:
> Howdy all
>
>
> I am making progress with quite a large application which relies heavily on 
> Spec2
> ( but Spec2 is such a big learning curve for me – especially given the 
> incomplete documentation… 😊)
>
> I am currently struggling with the following issue:
> I have a SpTablePresenter which shows a collection of domain objects 
> (subclassed from Model).
> The domain object are instances of ‘Asset’ which is a relatively simple class.
> The table works fine.
>
> Now, I need to be able to update some columns , but I don’t think I want to 
> build a separate form for doing classic CRUD operations.
> (There is no need for create or delete functionality – so an in-situ update 
> seems desirable…).
>
> I’ve made a start using SpStringTableColumn >> beEditable and 
> #onAcceptEdition:
>
> But I can’t see how to work out what row and column has changed, and how I 
> can update the corresponding Asset instance(s).
> It thought it would be handled using #whenModelChanged: but there are models 
> in many places (and at several levels in the Spec hierarchy)…
> I’ve tried following it all the way down to the adapters and morphs but I 
> can’t see how the freshly edited cell interacts with the model or 
> announcements.
>
> (BTW - It doesn’t look like the ‘selected item’ features are appropriate 
> since you can do edits in other rows regardless of what row is/isn’t 
> selected.)
>
> Is there a correct and/or elegant way to detect these cell changes in a 
> SpTablePresenter and apply them to my domain objects…?
>
> Cheers
> Mark
>
>
>
>
> From: Mark O'Donoghue <mark.odonoghue.2...@gmail.com>
> Sent: Sunday, 4 July 2021 5:26 PM
> To: pharo-users@lists.pharo.org
> Subject: Question about Spec2 and SpTablePresenter
>
>
>
>
>
> Howdy all
>
> I’ve got stuck trying to manage Tables – over 12 hours now and I’m out of 
> ideas!. ☹
>
> Any observations / suggestions are most welcome…
>
> I’ve been loading small external files of transactions using NeoCSV into 
> Spec2 tables.
> I am trying to use Fuel to persist the table contents so that my application 
> will re-load the working state from where I finished in the last session.
> (I’ve opted for Fuel as a simple alternative to having to do the whole object 
> relational mapping thing.)
>
> The idea is that transactions (and potentially some manual adjustments) will 
> be processed over time.
> (This is preferable to having to reload all files from the beginning evert 
> time I run the application…)
>
> The Spec2 tables have been working well until I tried to persist them.
> I can’t seem to fully re-load them to a previously saved state.
>
> For example - I can restore the essential contents of my table in most 
> circumstances using:
>
> restoreObjects
>
> “filePresenter1 is a SpTablePresenter”
>
> | objects savedEntry |
>
> objects := CpPersist restoreObjectsFromFileNamed: 
> 'E:\Me\zzzST-Test\demo.fuel'.
>
> recentFileList := objects at: 1.
> currFileFilter := objects at: 2.
> savedEntry := objects at: 3.
>
> self updateFilterButton: currFileFilter.
>
> filteredFileList := self filterFilesUsing: currFileFilter.
>
> filePresenter1 items: filteredFileList.
>
> savedEntry
> ifNotNil: [filePresenter1 selectItem: savedEntry ].
>
>
> However, if any of the table columns are re-sorted , the re-load operation 
> gets confused and I can’t get the saved a saved selected item to become 
> selected again.
>
> (It seems to be confusing the index numbers of the sorted and unsorted lists 
> – even when I match by contents rather than index.)
> (I also created an equality test to ensure equivalent entries are recognised 
> by the #= operation in the list of the underlying model ).
>
> This all works fine - unless I sort a column!
>
> Since this approach was going to be used on several screens I’d really like 
> to find a solution.
>
> Cheers
> Mark
> Perth, Western Australia

Reply via email to