On 11/03/2011 09:12 AM, Vincent Massol wrote:
> Hi Eddy,
> 
> On Nov 3, 2011, at 1:13 PM, Eduard Moraru wrote:
> 
>> Hi Vincent,
>>
>> On Thu, Nov 3, 2011 at 12:56 PM, Vincent Massol <[email protected]> wrote:
>>
>>> Hi devs,
>>>
>>> I'm implementing the LinkChecker UI and I want to be able to add a Tab in
>>> AllDocs. Right now I've coded it with a hardcoded #if but I really hate
>>> this.
>>>
>>> So here's my proposal:
>>>
>>> * Create the following modules:
>>> xwiki-platform-uiextension/
>>>   |_ xwiki-platform-uiextension-ui/
>>>   |_ xwiki-platform-uiextension-api/
>>>
>>> where:
>>> * xwiki-platform-uiextension-ui/: contains XWiki.UIExtensionClass page
>>> * xwiki-platform-uiextension-api/: contains a ScriptService to get
>>> UIExtension data + contains an EventListener that refreshes the UI
>>> Extension Cache when an UIExtensionClass object is modified (this is for
>>> performance reasons)
>>>
>>>
>> So how would this work exactly?
> 
> First le me say that I'm not planning this as something uber complex that may 
> satisfy all possible future needs. I'm taking a very pragmatic approach here 
> which IMO solves a lot of hardcoded issues we have today. We can 
> optimize/refine it later on. I prefer to that approach since the other 
> approach hasn't worked in the past 5 years… ;)

I want to echo this sentiment, not just in this case but in general, there is a 
fine balance between creating something that doesn't age well and not doing 
anything because there might be a better way, both are dangerous.

Caleb

> 
>> Each UI (skin, xwiki bundled application, user application, etc.) defines
>> these extension points that any other application can contribute to by
>> using the "type" field in an XWiki.UIExtensionClass instance?
> 
> Yes.
> 
>> This would,
>> of course, mean a great deal of rewriting, but once done, it would be a
>> good investment.
> 
> There's no need for any rewrite. 
> 
> Whatever works will continue to work. OTOH of course it'll be nice if some 
> existing custom extension mechanisms were retrofitted to use this new 
> UIExtensionClass. Now it doesn't mean we should never allow custom extension 
> mechanisms.
> 
> The idea is more than any part of the UI which needs to provide extension 
> points would use UIExtensionClass from now on if it fits its needs. For 
> example I can think of the Workspace Applications which needs a User profile 
> extension point for the tabs and which needs a Menu extension point for the 
> top level Menu.
> 
>>> To start with I'm proposing to have the following fields for
>>> UIExtensionClass:
>>> * type: String, represents the type of the extension (for example for the
>>> AllDocs needs, I'll use a "IndexTab" type (or "AllDocsTab" type)
>>> * id: String, the technical name of the extension, which can be used for
>>> example as suffix for HTML class or ids.
>>> * name: String, the name of the extension, which can be used for
>>> displaying. For example for the AllDocs needs, it would be used as the name
>>> of the Tab
>>> * content: Textarea: the content of the extension.  For example for the
>>> AllDocs needs, it would be used as the content to display when clicking on
>>> a tab
>>>
>>
>> Depending on the specifics of the extension point, the content gets treated
>> differently?
> 
> Yes, it's the user of the UIExtensionClass which decides what the content 
> contains.
> 
>> Also, I`m assuming this will generally be velocity/wiki syntax, right?
> 
> Generally I'd say wiki syntax yes.
> 
>> Another thing that might be useful (maybe in future iterations) would be
>> some kind of parameters that the extension could supply to its hook.
>> In your particular use case, a tab extension could say to the AllDocs page
>> that it wants its content to be loaded asynchronously, when the tab is
>> selected. Another case would be a menu extension that wants the menu item
>> to open in a new window when clicked or that wants to be placed before
>> entry X or after entry Y. Etc.
> 
> Yes, good idea, we'll probably need to use a List field for that allowing the 
> extension to provide "key1=value1,key2=value2,…"
> 
>>> I'd like to implement this ASAP and thus stop hardcoding UI Extensions
>>> from now on.
>>>
>>
>> The only downside I see is the performance penalty once everything starts
>> being extra extensible, but maybe using some smart caching (which you
>> already mentioned something about) we can limit the damage.
> 
> Yes that's the plan. As I mentioned the UIExtensionClass objects would be 
> cached in memory and the script service would return the cached values (it's 
> an "active" cache since it'll refresh automatically when a UIExtensionClass 
> object is modified).
> 
>> The extension
>> content still needs to be evaluated every time (unless maybe otherwise
>> stated by the extension itself), but at least the list of extensions can be
>> easily cached.
> 
> Yes. Caching the rendered value would be another field in the 
> UIExtensionClass for later.
> 
>>> Here's my +1
>>>
>>>
>> +1 if I understood it correctly.
> 
> Yes you did ;)
> 
> Thanks
> -Vincent
> 
>> Thanks,
>> Eduard
>>
>>
>>> Thanks
>>> -Vincent
>>>
>>> PS: If you find a better than "uiextension" I'm all ears. A name without
>>> "extension" would be great to not confuse it with our Extensions (and with
>>> xwiki-platform-extension).
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
> 

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to