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