Well done, Kevin!

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Thu, Aug 25, 2016 at 8:40 PM, Kevin Meyer <[email protected]> wrote:

> 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 <[email protected]> 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 <[email protected]>
> >>> 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
> >>>>>>>> <[email protected]> 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