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.

Reply via email to