Hi Martin, Excellent suggestion! You would have solved the same problem there. I will look into that and post the results to my github account.
Thanks, Kevin On 22 August 2016 16:55:20 CEST, Martin Grigorov <[email protected]> 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. >> >>>>>> >> >> >> -- Sent from my phone with K-9 Mail. Please excuse my brevity.
