Hi all,

To wrap this up, I have followed Martin's hints from his Summernote
project and created an example for how I made a String property into
click-able URLs when viewed in a collection.

I'm sure just a little more Wicket foo would add a similar link to these
properties when viewed in isolation, but my focus was on Alexander's
original problem (as I understood it - Alexander, can you confirm?).

In any case, I have put the instructions and code into my github project:
https://github.com/kev-m/isis-wicket-url/

Enjoy!

Feel free to use, re-use, modify and especially improve (with pull requests).

Regards,
Kevin


On Mon, August 22, 2016 16:55, Martin Grigorov wrote:
> Hi Kevin,
>
>
> You can take some inspiration from https://github.com/
> isisaddons/isis-wicket-summernote/tree/master/cpt/
> src/main/java/org/isisaddons/wicket/summernote/cpt/applib. This component
> uses custom annotation @SummernoteEditor that could be applied on
> java.lang.String properties to show their edit mode in a rich editor
> (http://summernote.org/)
>
>
> Martin Grigorov
> Wicket Training and Consulting
> https://twitter.com/mtgrigorov
>
>
> On Sun, Aug 21, 2016 at 5:00 PM, Kevin Meyer <ke...@kmz.co.za> wrote:
>
>
>> Hi Alexander,
>>
>>
>> If I understand you correctly, I have a solution that could work.
>>
>>
>> When viewed as an item (by iteself), the URL is just a plain string
>> that can be edited.
>>
>> When viewed in a collection, the URLs are rendered as links (but for
>> some reason my Firefox does not actually respond when I click on the
>> URL, but
>> all the mark-up seems OK).
>>
>> See bottom for the Factory, which must be added to
>> META-INF/services/org.apache.isis.viewer.wicket.ui.ComponentFactory
>> e.g. mine is: isis.example.UrlPanelFactory
>>
>> Hi Martin,
>>
>>
>> With the following Java:
>> /**
>> * Panel for rendering strings as links.
>> */
>> public class UrlPanel extends ScalarPanelTextFieldParseableAbstract {
>> private static final long serialVersionUID = 1L; private static final
>> String ID_LINK = "externalSite";
>>
>>
>>
>> public UrlPanel(final String id, final ScalarModel scalarModel) {
>> super(id, ID_SCALAR_VALUE, scalarModel); }
>>
>>
>> @Override
>> protected IModel<String> getScalarPanelType() { return
>> Model.of("stringPanel");
>> }
>>
>>
>> @Override
>> protected Component addComponentForCompact() {
>> System.out.println("addComponentForCompact()");
>> Fragment compactFragment = getCompactFragment(CompactType.SPAN);
>> final String objectAsString = getModel().getObjectAsString(); final
>> ExternalLink link = new ExternalLink(ID_LINK,
>> objectAsString, objectAsString); compactFragment.add(link);
>> scalarTypeContainer.addOrReplace(compactFragment); return link; }
>> }
>>
>>
>>
>> I found that I had to overload most of the ScalarPanelAbstract.html and
>>  the ScalarPanelTextFieldAbstract.html to create:
>>
>>
>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
>> <html xmlns="http://www.w3.org/1999/xhtml";
>> xmlns:wicket="http://wicket.apache.org";
>> xml:lang="en"
>> lang="en"> <body>
>> <wicket:panel>
>> <div class="scalarNameAndValueComponentType"
>> wicket:id="scalarTypeContainer">
>> <div class="form-group" wicket:id="scalarIfRegular">
>> <label wicket:id="scalarName" class="scalarName
>> control-label">[Label text]</label> <span class="scalarValueWrapper">
>> <div class="scalarPlaceholder">
>> <span class="scalarValueInput">
>> <span class="editing">
>> <wicket:child/>
>>
>>
>> <wicket:container wicket:id="scalarValueContainer"/>
>> <a wicket:id="editProperty" href="#"
>> class="edit fa fa-pencil-square-o"/> </span>
>> </span>
>> <span wicket:id="associatedActionLinksRight"
>> class="associatedActionLinksRight">[drop down]</span> </div>
>> <span wicket:id="feedback"
>> class="help-block"></span> <span wicket:id="associatedActionLin
>> ksBelow"></span> </span>
>> <div class="clearfix"/>
>> </div>
>> <wicket:container wicket:id="scalarIfCompact">
>> </wicket:container>
>> </div>
>>
>>
>> <wicket:fragment wicket:id="text">
>> <input type="text" name="scalarValue" class="form-control
>> input-sm scalarValue" wicket:id="scalarValue" /> </wicket:fragment>
>>
>>
>> <wicket:fragment wicket:id="compactAsSpan">
>> <a wicket:id="externalSite"></a>
>> </wicket:fragment>
>> </wicket:panel>
>> </body>
>> </html>
>>
>>
>>
>> Finally, the factory. This is a horrible hack.
>> Basically, I check for any string property that starts with "url".
>> Ideally this should be an annotation or something, but I could not
>> figure out how to pick up annotations from the property in the
>> "aapliesTo" method
>> of the factory:
>>
>>
>> public class UrlPanelFactory extends ComponentFactoryScalarAbstract {
>>
>> private static final long serialVersionUID = 1L;
>>
>> public UrlPanelFactory() { super(String.class); }
>>
>>
>> @Override
>> public ApplicationAdvice appliesTo(IModel<?> model) { if (!(model
>> instanceof ScalarModel)) { return ApplicationAdvice.DOES_NOT_APPLY; }
>>
>>
>> ScalarModel scalarModel = (ScalarModel) model;
>> PropertyMemento memento = scalarModel.getPropertyMemento();
>> if (memento != null){ String identifier = memento.getIdentifier();
>> final ApplicationAdvice appliesIf =
>> appliesIf(identifier.startsWith("url")); return appliesIf; }
>> return ApplicationAdvice.DOES_NOT_APPLY; }
>>
>>
>>
>> @Override
>> public Component createComponent(final String id, final ScalarModel
>> scalarModel) { return new UrlPanel(id, scalarModel); }
>>
>>
>> protected SpecificationLoader getSpecificationLoader() { return
>> IsisContext.getSessionFactory().getSpecificationLoader();
>> }
>> }
>>
>>
>>
>>
>>
>> On Sat, August 20, 2016 13:08, Martin Grigorov wrote:
>>
>>> Hi Kevin,
>>>
>>>
>>>
>>>
>>> On Fri, Aug 19, 2016 at 11:14 PM, Kevin Meyer <ke...@kmz.co.za>
>>> wrote:
>>>
>>>
>>>
>>>> Hi Alexander,
>>>>
>>>>
>>>>
>>>> I thought the trick here was to register a new ScalarPanelAbstract
>>>> that would pick up the URL and render it as a click-able link.
>>>>
>>>> In my testing, I have been able to register my
>>>> "isis.example.UrlPanelFactory", which is just a String renderer
>>>> (copied
>>>> from ShortPanel).
>>>>
>>>> However, I have reached my limit. I can parse the text value,
>>>> detect that it is a URL, but now I can't figure out how to create
>>>> the matching Wicket
>>>> HTML and Java to populate a hyperlink!
>>>>
>>>>
>>>>
>>>> I was experimenting with the HTML:
>>>>
>>>>
>>>>
>>>> <wicket:panel>
>>>> <div class="shortPanel
>>>> scalarNameAndValueComponentType"> <label for="scalarValue"
>>>> wicket:id="scalarIfRegular">
>>>> <span wicket:id="scalarName"
>>>> class="scalarName">[Label text]</span> <span class="scalarValue">
>>>> <input type="text"
>>>> name="scalarValue" wicket:id="scalarValue" /> <span
>>>> wicket:id="feedback"></span>
>>>> </span>
>>>> </label>
>>>> <input type="text"
>>>> wicket:id="scalarIfCompact"></input>
>>>>
>>>>
>>>>
>>>
>>> This should not be <input>.
>>> "scalarIfCompact" is used for the "view" mode, "scalarIfRegular" for
>>> the "edit" mode.
>>> I.e. in edit mode you have to use <input> to change the url, in view
>>> mode you have to use <a> to be able to click it.
>>>
>>>
>>>> <!--
>>>> <span wicket:id="scalarUrl">
>>>> <a href='a'
>>>> wicket:id="scalarUrl"><input type="text"
>>>> wicket:id="scalarUrl"></input></a>
>>>>
>>>>
>>>>
>>>
>>> Remove <input> here too.
>>>
>>>
>>>
>>>
>>>> </span>
>>>> -->
>>>> </div>
>>>> </wicket:panel>
>>>>
>>>>
>>>>
>>>> But I don't know how to update the Java:
>>>> public class UrlPanel extends ScalarPanelAbstract { ... // How to
>>>> manipulate the Wicket component, once I have my URL-containing
>>>> string.
>>>>
>>>
>>> You need to extend #getLabelForCompact() and
>>> #getComponentForRegular() (
>>> https://github.com/apache/isis/blob/501e890f90d535df43d73a90
>>>
>> e14295fadc9f9b
>>> 64/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewe
>>>
>> r/wicket/ui/c
>>> omponents/scalars/ScalarPanelAbstract.java#L171-L177 ) For the link
>>> (<a wicket:id="scalarUrl">) you can use Wicket's
>>>
>> ExternalLink
>>
>>> component. For <span wicket:id="scalarUrl"> use WebMarkupContainer,
>>> if you really need it to be Wicket component. Otherwise just remove
>> wicket:id
>>
>>> from it.
>>>
>>> Try it and let me know if you face any problems!
>>>
>>>
>>>
>>>> ...
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>> Maybe someone with better Wicket foo can provide some advice...
>>>>
>>>>
>>>>
>>>> Cheers,
>>>> Kevin
>>>>
>>>>
>>>>
>>>>
>>>> On Fri, August 19, 2016 17:35, Alexander Zerbe wrote:
>>>>
>>>>
>>>>>
>>>>
>>>>>>>
>>>>>>>> On 12 Aug 2016, at 11:56, Alexander Zerbe
>>>>>>>> <ze...@prime-research.com> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Hi Everyone,
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> I have a (hopefully) simple problem.
>>>>>>>> A domain entity has a URL as property - I'm searching for a
>>>>>>>> way too make those URLs clickable when displayed in a
>>>>>>>> collection.
>>>>>>>>
>>>>>>>> For example:
>>>>>>>> I want to list a subset of those entitys and from there I
>>>>>>>> want the possibility to click the link and get redirected.
>>>>>>>>
>>>>>>>> Returning a URL from an action works (but only for http(s)
>>>>>>>> URLs,
>>>>>>>> not for file://), but thats not what I want.
>>>>>>>>
>>>>>>>> The only solution I see (so far), is too create a seperate
>>>>>>>> wicket page with mountPage().
>>>>>>>>
>>>>>>>> It would also be okay too just have the name of the object
>>>>>>>> and if I click it, I get redirected immediatly.
>>>>>>>>
>>>>>>>>
>>>>>>>> I'm up for any suggestions.
>>>>>>>>
>>>>>>>>
>>
>>


Reply via email to