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="associatedActionLinksBelow"></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/501e890f90d535df43d73a90e14295fadc9f9b
> 64/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/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