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. > >>>>>>>> > >>>>>>>> > >> > >> > > >
