Thanks Mariano for the ideas. I will put them into practice. Then All I have to do is to extends magritte classes to customize them.
Hi Asbath,
Some answers below. But a general comment is that the typical case to customize magritte is by subclassing and then somehow use your own subclasses instead of magritte ones.��
On Fri, Mar 17, 2017 at 3:54 AM, Asbath Sama biyalou <asamabiyalou@yahoo.com> wrote:
Hello.
I am using Magritte to generate reports for a pharo class. I want to
customize generated components in order to have a better design.
My class is Match
Object subclass: #Match
�� �� instanceVariableNames: 'date_match hour_match status actions stadium
comments teams goals1 goals2 competition'
�� �� classVariableNames: ''
�� �� category: MyProject-Entity'
Descriptions for some variables.
Stadium is also a Class.
Match>>descriptionStadium
<magritteDescription>
^ MASingleOptionDescription new
�� �� label: 'Stadium';
�� �� priority: 305;
�� �� accessor: #stadium;
�� �� options: Team allStadiumsName;
�� �� componentClass: TBSMagritteSelectListComponent;
�� �� beRequired;
�� �� yourself
Match>>descriptionTeams
<magritteDescription>
^ MAMultipleOptionDescription new
�� �� label: 'Teams';
�� �� priority: 805;
�� �� accessor: #teams;
�� �� options: Team allTeamsName;
�� �� componentClass: MAMultiselectListComponent;
�� �� yourself
The generated component in the form is not very pretty. I want to have
multiple checkbox.
In my case, I have customized ALL the components I use for Magritte. That is, I have my own Fa version (Fa is my package prefix). So I have ��FaMAMultiselectListComponent ��subclass of MAMultiselectListComponent. I have FaTBSMagritteSelectListComponent, subclass of TBSMagritteSelectListComponent , etc... so basically, you subclass and override the parent methods you want. Most common methods you need to override are��renderEditorOn: html or��renderViewerOn: html ��etc...but that depends on WHAT you want to change and in WHICH component. Note they are all subclasses of��MADescriptionComponent.
You can also set your own properties in the magritte so that you can read them at your component level. For example, above I could say:
Match>>descriptionTeams
<magritteDescription>
^ MAMultipleOptionDescription new
�� �� label: 'Teams';
�� �� priority: 805;
�� �� accessor: #teams;
�� �� options: Team allTeamsName;
�� �� propertyAt: 'showInMultipleCheckboxs' put: true;�� �� componentClass: FaMAMultiselectListComponent;
�� �� yourself
Then in the rendering code of your subclass FaMAMultiselectListComponent you can do:
(self magritteDescription propertyAt: 'showInMultipleCheckboxs') ifTrue: [��self renderAsMultiCheckboxsOn: html...] ifFalse: [...]
Of course, you can even define the accessors for #showInMultipleCheckboxs as extension methods in ��MADescription
To avoid having to define FaMAMultiselectListComponent for each MAMultipleOptionDescription .. well, there are many ways. But I guess that is for a later topic. Ask me if you want this.
Match>>descriptionStatus
<magritteDescription>
^ MASingleOptionDescription new
�� �� label: 'Status';
�� �� priority: 505;
�� �� accessor: #status;
�� �� options: #('Pas en cours' 'En Cours' 'Mi-temps' 'Termin��');
�� �� componentClass: TBSMagritteSelectListComponent;
�� �� yourself
For the report I use the class SEMatchReport
TBSMagritteReport subclass: #SEMatchReport
�� �� instanceVariableNames: 'report'
�� �� classVariableNames: ''
�� �� category: 'MyProject-Components'
SEMatchReport class>>from
�� �� | report matchs commandColumn |
�� �� matchs := Match selectAll.
�� �� report:= self rows: matchs description: (self
�� �� �� �� filteredDescriptionsFrom: matchs anyOne).
�� �� commandColumn := MACommandColumn new.
�� �� (SEMatchReport new session isSimpleAdmin)
�� �� ifTrue: [
�� �� �� �� report addColumn: (commandColumn
�� �� �� �� �� �� addCommandOn: report selector: #editMatch: text: 'Modifier';
yourself;
�� �� �� �� �� �� addCommandOn: report selector: #addAction: text: 'Ajouter
une action'; yourself ) ]
�� �� ifFalse: [
�� �� �� �� report addColumn: (commandColumn
�� �� �� �� �� �� addCommandOn: report selector: #editMatch: text: 'Modifier';
yourself;
�� �� �� �� �� �� addCommandOn: report selector: #deleteMatch: text:
'Supprimer'; yourself;
�� �� �� �� �� �� addCommandOn: report selector: #addAction: text: 'Ajouter
une action'; yourself ) ].
�� �� ^ report
I want to put some bootstrapp icons near commandColumn actions. like
pencil or delete on 'Supprimer'.
To do this, again, subclass MACommandColumn, override��renderCellContent:on: ��and use your particular subclass.��
��
SEMatchReport class>>filteredDescriptionsFrom: aMatch
�� �� ^ aMatch magritteDescription select: [ :each | #(date_match
hour_match stadium goals1 goals2 teams)
�� �� �� �� includes: each accessor selector ]
I notice that on the generated report on column stadium we have
aStadium. We don't have the value (the name). I don't know how to
mention it in the filtered descriptions.
That's weird. I don't know.��
Change the color of lines in the report, etc. All that things.
In this case I don't use the magritte row/even css classes.
In my case, I have a subclass of��MAReport (I guess you can subclass from the Bootstrap one) and changed the table rendering to use:
tablebeHover;beBordered;beCondensed;beStriped;
etc... so I let colors to Bootstrap / CSS.Cheers,
��Sorry for the bad english.
Thanks.
Asbath
--