SlideShare a Scribd company logo
How to extend (properly)
and "old" Alfresco Share
feature
Angel Borroy
@AngelBorroy angelborroy keensoft
Learn. Connect. Collaborate.
Once upon a time…
… a user created hundred of versions.
An engineer who was passing by, wondered how to help
111.0
CERTIFIED TECHNOLOGY
Learn. Connect. Collaborate.
He had an idea
“Add a simple button to remove versions from
Alfresco Share”
CERTIFIED TECHNOLOGY
Learn. Connect. Collaborate.
That engineer was a real hero, almost LEGENDARY!
20 years of experience
#4 in Community Leaderboard
7 Alfresco Hack-a-thons
5 Alfresco conferences
4 YouTube Tech Talk Live
2 YouTube Office hours
1 Community-driven Video
Learn. Connect. Collaborate.
Trust me: a 15 minutes task
• 1 XML Surf Extension for document-details component
• 1 FTL page to add the icon and the link
• 1 JS file to invoke REST API using Ajax helper
Hands on!
$ mvn archetype:generate -Dfilter=org.alfresco:
5: remote -> org.alfresco.maven.archetype:alfresco-share-jar-archetype
Learn. Connect. Collaborate.
Guide my sword
document-versions.get.html.ftl > > > document-versions.js
getDocumentVersionMarkup: function DocumentVersions_getDocumentVersionMarkup(doc) {
var html = '';
html += '<div class="version-panel-left">'
html += ' <span class="document-version">' + $html(doc.label) + '</span>';
html += '</div>';
html += '<div class="version-panel-right">';
html += ' <a href="' + downloadURL + '" target="_blank" class="download"
title="' + this.msg("label.download") + '">&nbsp;</a>';
...
* Extracted from the book “Creative ways to build an HTML”
Learn. Connect. Collaborate.
Crossing the red line
Overwriting getDocumentVersionMarkup method...
// Add new icon to remove a version passing "label" parameter to
// "onRemoveClick" function
html += ' <a href="#" target="_blank" name=".onRemoveClick" rel="' +
doc.label + '" class="' + this.id + ' remove" title="' +
this.msg("label.delete") + '">&nbsp;</a>';
JavaScript
CSS
i18n
Learn. Connect. Collaborate.
Routine tasks
CSS
/* Add icon for the new button */
.document-versions .actions a.remove{
background-image: url(images/document-delete-16.png);}
/* Add more space to include a new button */
.document-versions .actions {
width: 7em !important;}
i18n
label.delete=Delete
CSS
i18n
Learn. Connect. Collaborate.
Finding the right REST API method...
Learn. Connect. Collaborate.
… JavaScript API method …
Learn. Connect. Collaborate.
… Java method!
Learn. Connect. Collaborate.
Joyful Web Script!
[HTTP DELETE] http://alfresco/api/version/{noderef}/{label}
Hands on!
$ mvn archetype:generate -Dfilter=org.alfresco:
4: remote -> org.alfresco.maven.archetype:alfresco-platform-jar-archetype
Alfresco
Web Script
Learn. Connect. Collaborate.
Trust me (again): a 15 minutes task
Desc
<url>/api/node/version/{store_type}/{store_id}/{id}/{label}</url>
Response
{"success":"${success}"}
Spring bean
<bean id="webscript.es.keensoft.remove-version.post"
class="es.keensoft.webscript.RemoveVersion” parent="webscript">
<property name="serviceRegistry" ref="ServiceRegistry" />
</bean>
Java code
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache) {
// Reading parameters from URL
Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
Learn. Connect. Collaborate.
I told you: he was a legend
Learn. Connect. Collaborate.
A Spoonful of Sugar Helps the Medicine Go Down
Alfresco.util.Ajax.request(
{
method: Alfresco.util.Ajax.DELETE,
url: Alfresco.constants.PROXY_URI + 'api/node/version/' +
nodeRef.replace(":/", "") + '/' + label,
requestContentType: Alfresco.util.Ajax.JSON,
successCallback: {…},
failureCallback: {…}
});
http://alfresco/api/version/b4822b85-4b33-42ad-8dfa-d630a7a81716/1.0
org.alfresco.web.scripts.WebScriptException - Web Script format '0' is not registered.
Learn. Connect. Collaborate.
Into the wild - do not try at home
Moving from DELETE to POST
Desc, Response, Spring bean
*.delete.* > *.post.*
Java code
JSONObject json =
new JSONObject(new JSONTokener(req.getContent().getContent()));
versionLabel = json.getString("label");
Learn. Connect. Collaborate.
Stranger things
Alfresco.util.Ajax.request(
{
// Using POST instead of DELETE due to parameters including "."
// (e.g label = 1.0)
method: Alfresco.util.Ajax.POST,
url: Alfresco.constants.PROXY_URI + 'api/node/version/' +
nodeRef.replace(":/", ""),
dataObj: { label: label },
requestContentType: Alfresco.util.Ajax.JSON,
successCallback: { … },
failureCallback: { … }
});
Learn. Connect. Collaborate.
Trust me: a 1,5 hours task
• 1 XML Surf Extension for document-details component
• 1 FTL page to add CSS and JavaScript
• 1 JS file to add HTML source code and to invoke REST API using Ajax
helper
• 1 CSS file to stylish the button
• 1 image file for the icon
• 2 i18n property files for English & Spanish
• 1 XML Spring bean for Java-backed Web Script
• 1 XML description file for Web Script declaration
• 1 JSON file for Web Script response
• 1 Java file for Web Script logic
REPOSHARE
Learn. Connect. Collaborate.
One more thing…
… everyone should be able to mess up with that killer version action?
Learn. Connect. Collaborate.
With great powers comes great responsibility
<!-- Feature only available for members of group VERSION_REMOVERS -->
<evaluator type="group.module.evaluator">
<params>
<groups>GROUP_VERSION_REMOVERS</groups>
<groupRelation>AND</groupRelation>
</params>
</evaluator>
Learn. Connect. Collaborate.
How to extend and "old" Alfresco Share feature
• Personal skills
– Patience
– Perseverance
• Resources
– Source Code
– Alfresco Documentation
– Community
– IRC
– Order of the Bee
Source available at https://github.com/keensoft/alfresco-remove-version
Alfresco
Web Script
CERTIFIED TECHNOLOGY
¡Gracias!
@AngelBorroy angelborroy keensoft
How to extend (properly)
and "old" Alfresco Share
feature

More Related Content

What's hot

Integrating Alfresco with Portals
Integrating Alfresco with PortalsIntegrating Alfresco with Portals
Integrating Alfresco with PortalsPiergiorgio Lucidi
 
Really Simple Search - Alfresco
Really Simple Search - AlfrescoReally Simple Search - Alfresco
Really Simple Search - AlfrescoAlfresco Software
 
Peltas - get insights on your Alfresco data
Peltas - get insights on your Alfresco dataPeltas - get insights on your Alfresco data
Peltas - get insights on your Alfresco dataDaniel Gradecak
 
Alfresco DevCon 2019 Performance Tools of the Trade
Alfresco DevCon 2019   Performance Tools of the TradeAlfresco DevCon 2019   Performance Tools of the Trade
Alfresco DevCon 2019 Performance Tools of the TradeLuis Colorado
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST APIJ V
 
Modern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaModern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaGeorge Wilson
 
WWW09 - Triplify Light-Weight Linked Data Publication from Relational Databases
WWW09 - Triplify Light-Weight Linked Data Publication from Relational DatabasesWWW09 - Triplify Light-Weight Linked Data Publication from Relational Databases
WWW09 - Triplify Light-Weight Linked Data Publication from Relational DatabasesSören Auer
 
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUG
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUGIntro To CommandBox CLI,Package Manager, Server at the Japan CFUG
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUGOrtus Solutions, Corp
 
php[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Upphp[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground UpJoe Ferguson
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web FrameworksJoe Kutner
 
Zero to #Serverless in 60 seconds, anywhere
Zero to #Serverless in 60 seconds, anywhereZero to #Serverless in 60 seconds, anywhere
Zero to #Serverless in 60 seconds, anywhereAlex Ellis
 
Immutable infrastructure:觀念與實作 (建議)
Immutable infrastructure:觀念與實作 (建議)Immutable infrastructure:觀念與實作 (建議)
Immutable infrastructure:觀念與實作 (建議)William Yeh
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)Geekstone
 
How Shopify Scales Rails
How Shopify Scales RailsHow Shopify Scales Rails
How Shopify Scales Railsjduff
 
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataIn The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataStacy London
 
Managing an OSGi Framework with Apache Felix Web Console
Managing an OSGi Framework with  Apache Felix Web ConsoleManaging an OSGi Framework with  Apache Felix Web Console
Managing an OSGi Framework with Apache Felix Web ConsoleFelix Meschberger
 
SymfonyCon Cluj 2017 - Symfony at OpenSky
SymfonyCon Cluj 2017 - Symfony at OpenSkySymfonyCon Cluj 2017 - Symfony at OpenSky
SymfonyCon Cluj 2017 - Symfony at OpenSkyPablo Godel
 

What's hot (20)

Integrating Alfresco with Portals
Integrating Alfresco with PortalsIntegrating Alfresco with Portals
Integrating Alfresco with Portals
 
Really Simple Search - Alfresco
Really Simple Search - AlfrescoReally Simple Search - Alfresco
Really Simple Search - Alfresco
 
Peltas - get insights on your Alfresco data
Peltas - get insights on your Alfresco dataPeltas - get insights on your Alfresco data
Peltas - get insights on your Alfresco data
 
Alfresco Tech Talk Live 106
Alfresco Tech Talk Live 106Alfresco Tech Talk Live 106
Alfresco Tech Talk Live 106
 
Alfresco DevCon 2019 Performance Tools of the Trade
Alfresco DevCon 2019   Performance Tools of the TradeAlfresco DevCon 2019   Performance Tools of the Trade
Alfresco DevCon 2019 Performance Tools of the Trade
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST API
 
Modern websites in 2020 and Joomla
Modern websites in 2020 and JoomlaModern websites in 2020 and Joomla
Modern websites in 2020 and Joomla
 
WWW09 - Triplify Light-Weight Linked Data Publication from Relational Databases
WWW09 - Triplify Light-Weight Linked Data Publication from Relational DatabasesWWW09 - Triplify Light-Weight Linked Data Publication from Relational Databases
WWW09 - Triplify Light-Weight Linked Data Publication from Relational Databases
 
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUG
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUGIntro To CommandBox CLI,Package Manager, Server at the Japan CFUG
Intro To CommandBox CLI,Package Manager, Server at the Japan CFUG
 
php[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Upphp[world] 2015 Training - Laravel from the Ground Up
php[world] 2015 Training - Laravel from the Ground Up
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
Zero to #Serverless in 60 seconds, anywhere
Zero to #Serverless in 60 seconds, anywhereZero to #Serverless in 60 seconds, anywhere
Zero to #Serverless in 60 seconds, anywhere
 
Immutable infrastructure:觀念與實作 (建議)
Immutable infrastructure:觀念與實作 (建議)Immutable infrastructure:觀念與實作 (建議)
Immutable infrastructure:觀念與實作 (建議)
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
 
How Shopify Scales Rails
How Shopify Scales RailsHow Shopify Scales Rails
How Shopify Scales Rails
 
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember DataIn The Trenches With Tomster, Upgrading Ember.js & Ember Data
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
 
Command box
Command boxCommand box
Command box
 
Managing an OSGi Framework with Apache Felix Web Console
Managing an OSGi Framework with  Apache Felix Web ConsoleManaging an OSGi Framework with  Apache Felix Web Console
Managing an OSGi Framework with Apache Felix Web Console
 
SymfonyCon Cluj 2017 - Symfony at OpenSky
SymfonyCon Cluj 2017 - Symfony at OpenSkySymfonyCon Cluj 2017 - Symfony at OpenSky
SymfonyCon Cluj 2017 - Symfony at OpenSky
 
Tales from the OSGi trenches
Tales from the OSGi trenchesTales from the OSGi trenches
Tales from the OSGi trenches
 

Similar to How to extend (properly) and old Alfresco Share feature

AtlasCamp 2011: Confluence 4 and Beyond
AtlasCamp 2011: Confluence 4 and BeyondAtlasCamp 2011: Confluence 4 and Beyond
AtlasCamp 2011: Confluence 4 and BeyondSherif Mansour
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Arun Gupta
 
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine Development
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine DevelopmentEECI2009 - From Design to Dynamic - Rapid ExpressionEngine Development
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine DevelopmentFortySeven Media
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Arun Gupta
 
Alfresco javascript api - Alfresco Devcon 2018
Alfresco javascript api - Alfresco Devcon 2018Alfresco javascript api - Alfresco Devcon 2018
Alfresco javascript api - Alfresco Devcon 2018Mario Romano
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0Eugenio Romano
 
Intro to jQuery @ Startup Institute
Intro to jQuery @ Startup InstituteIntro to jQuery @ Startup Institute
Intro to jQuery @ Startup InstituteRafael Gonzaque
 
Make an language translator with voice extension
Make an language translator with voice extensionMake an language translator with voice extension
Make an language translator with voice extensionRebecca Peltz
 
Customizing the Document Library
Customizing the Document LibraryCustomizing the Document Library
Customizing the Document LibraryAlfresco Software
 
MozTW Jetpack Workshop: Taipei
MozTW Jetpack Workshop: TaipeiMozTW Jetpack Workshop: Taipei
MozTW Jetpack Workshop: Taipeilittlebtc
 
Alfresco monitoring with Nagios and ELK stack
Alfresco monitoring with Nagios and ELK stackAlfresco monitoring with Nagios and ELK stack
Alfresco monitoring with Nagios and ELK stackCesar Capillas
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)Doris Chen
 
Prairie DevCon 2015 - Crafting Evolvable API Responses
Prairie DevCon 2015 - Crafting Evolvable API ResponsesPrairie DevCon 2015 - Crafting Evolvable API Responses
Prairie DevCon 2015 - Crafting Evolvable API Responsesdarrelmiller71
 
Web Components With Rails
Web Components With RailsWeb Components With Rails
Web Components With RailsBoris Nadion
 
Zero to Serverless - OpenFaaS at the Open Source Summit
Zero to Serverless - OpenFaaS at the Open Source SummitZero to Serverless - OpenFaaS at the Open Source Summit
Zero to Serverless - OpenFaaS at the Open Source SummitAlex Ellis
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component libraryMax Katz
 
FOXX - a Javascript application framework on top of ArangoDB
FOXX - a Javascript application framework on top of ArangoDBFOXX - a Javascript application framework on top of ArangoDB
FOXX - a Javascript application framework on top of ArangoDBArangoDB Database
 
d.mix: Programming by a Sample
d.mix: Programming by a Sampled.mix: Programming by a Sample
d.mix: Programming by a SampleLeslie W
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for youSimon Willison
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Atlassian
 

Similar to How to extend (properly) and old Alfresco Share feature (20)

AtlasCamp 2011: Confluence 4 and Beyond
AtlasCamp 2011: Confluence 4 and BeyondAtlasCamp 2011: Confluence 4 and Beyond
AtlasCamp 2011: Confluence 4 and Beyond
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
 
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine Development
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine DevelopmentEECI2009 - From Design to Dynamic - Rapid ExpressionEngine Development
EECI2009 - From Design to Dynamic - Rapid ExpressionEngine Development
 
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
Spark IT 2011 - Simplified Web Development using Java Server Faces 2.0
 
Alfresco javascript api - Alfresco Devcon 2018
Alfresco javascript api - Alfresco Devcon 2018Alfresco javascript api - Alfresco Devcon 2018
Alfresco javascript api - Alfresco Devcon 2018
 
Let's play with adf 3.0
Let's play with adf 3.0Let's play with adf 3.0
Let's play with adf 3.0
 
Intro to jQuery @ Startup Institute
Intro to jQuery @ Startup InstituteIntro to jQuery @ Startup Institute
Intro to jQuery @ Startup Institute
 
Make an language translator with voice extension
Make an language translator with voice extensionMake an language translator with voice extension
Make an language translator with voice extension
 
Customizing the Document Library
Customizing the Document LibraryCustomizing the Document Library
Customizing the Document Library
 
MozTW Jetpack Workshop: Taipei
MozTW Jetpack Workshop: TaipeiMozTW Jetpack Workshop: Taipei
MozTW Jetpack Workshop: Taipei
 
Alfresco monitoring with Nagios and ELK stack
Alfresco monitoring with Nagios and ELK stackAlfresco monitoring with Nagios and ELK stack
Alfresco monitoring with Nagios and ELK stack
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
Prairie DevCon 2015 - Crafting Evolvable API Responses
Prairie DevCon 2015 - Crafting Evolvable API ResponsesPrairie DevCon 2015 - Crafting Evolvable API Responses
Prairie DevCon 2015 - Crafting Evolvable API Responses
 
Web Components With Rails
Web Components With RailsWeb Components With Rails
Web Components With Rails
 
Zero to Serverless - OpenFaaS at the Open Source Summit
Zero to Serverless - OpenFaaS at the Open Source SummitZero to Serverless - OpenFaaS at the Open Source Summit
Zero to Serverless - OpenFaaS at the Open Source Summit
 
RichFaces: rich:* component library
RichFaces: rich:* component libraryRichFaces: rich:* component library
RichFaces: rich:* component library
 
FOXX - a Javascript application framework on top of ArangoDB
FOXX - a Javascript application framework on top of ArangoDBFOXX - a Javascript application framework on top of ArangoDB
FOXX - a Javascript application framework on top of ArangoDB
 
d.mix: Programming by a Sample
d.mix: Programming by a Sampled.mix: Programming by a Sample
d.mix: Programming by a Sample
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012 Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
Plugins on OnDemand with Remote Apps - Atlassian Summit 2012
 

More from Angel Borroy López

Transitioning from Customized Solr to Out-of-the-Box OpenSearch
Transitioning from Customized Solr to Out-of-the-Box OpenSearchTransitioning from Customized Solr to Out-of-the-Box OpenSearch
Transitioning from Customized Solr to Out-of-the-Box OpenSearchAngel Borroy López
 
Alfresco integration with OpenSearch - OpenSearchCon 2024 Europe
Alfresco integration with OpenSearch - OpenSearchCon 2024 EuropeAlfresco integration with OpenSearch - OpenSearchCon 2024 Europe
Alfresco integration with OpenSearch - OpenSearchCon 2024 EuropeAngel Borroy López
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherAngel Borroy López
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Angel Borroy López
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1Angel Borroy López
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoAngel Borroy López
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Angel Borroy López
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseAngel Borroy López
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeAngel Borroy López
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAngel Borroy López
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoAngel Borroy López
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para DockerAngel Borroy López
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfAngel Borroy López
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsAngel Borroy López
 

More from Angel Borroy López (20)

Transitioning from Customized Solr to Out-of-the-Box OpenSearch
Transitioning from Customized Solr to Out-of-the-Box OpenSearchTransitioning from Customized Solr to Out-of-the-Box OpenSearch
Transitioning from Customized Solr to Out-of-the-Box OpenSearch
 
Alfresco integration with OpenSearch - OpenSearchCon 2024 Europe
Alfresco integration with OpenSearch - OpenSearchCon 2024 EuropeAlfresco integration with OpenSearch - OpenSearchCon 2024 Europe
Alfresco integration with OpenSearch - OpenSearchCon 2024 Europe
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Using Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms togetherUsing Generative AI and Content Service Platforms together
Using Generative AI and Content Service Platforms together
 
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
Enhancing Document-Centric Features with On-Premise Generative AI for Alfresc...
 
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
La Guía Definitiva para una Actualización Exitosa a Alfresco 23.1
 
Docker Init with Templates for Alfresco
Docker Init with Templates for AlfrescoDocker Init with Templates for Alfresco
Docker Init with Templates for Alfresco
 
Before & After Docker Init
Before & After Docker InitBefore & After Docker Init
Before & After Docker Init
 
Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0Alfresco Transform Services 4.0.0
Alfresco Transform Services 4.0.0
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
 
Using Podman with Alfresco
Using Podman with AlfrescoUsing Podman with Alfresco
Using Podman with Alfresco
 
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud NativeCSP: Evolución de servicios de código abierto en un mundo Cloud Native
CSP: Evolución de servicios de código abierto en un mundo Cloud Native
 
Alfresco Embedded Activiti Engine
Alfresco Embedded Activiti EngineAlfresco Embedded Activiti Engine
Alfresco Embedded Activiti Engine
 
Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0Alfresco Transform Core 3.0.0
Alfresco Transform Core 3.0.0
 
Collaborative Editing Tools for Alfresco
Collaborative Editing Tools for AlfrescoCollaborative Editing Tools for Alfresco
Collaborative Editing Tools for Alfresco
 
Desarrollando una Extensión para Docker
Desarrollando una Extensión para DockerDesarrollando una Extensión para Docker
Desarrollando una Extensión para Docker
 
DockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdfDockerCon 2022 Spanish Room-ONBOARDING.pdf
DockerCon 2022 Spanish Room-ONBOARDING.pdf
 
Deploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP PlatformsDeploying Containerised Open-Source CSP Platforms
Deploying Containerised Open-Source CSP Platforms
 
Introduction to AWS
Introduction to AWSIntroduction to AWS
Introduction to AWS
 
Alfresco Certificates
Alfresco Certificates Alfresco Certificates
Alfresco Certificates
 

Recently uploaded

Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfAMB-Review
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAlluxio, Inc.
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownloadvrstrong314
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobus
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAlluxio, Inc.
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowPeter Caitens
 
Studiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareStudiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareinfo611746
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Globus
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...Juraj Vysvader
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Shahin Sheidaei
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesGlobus
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Anthony Dahanne
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of ProgrammingMatt Welsh
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024Ortus Solutions, Corp
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesKrzysztofKkol1
 

Recently uploaded (20)

Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in Michelangelo
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
 
Studiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareStudiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting software
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web Services
 

How to extend (properly) and old Alfresco Share feature

  • 1. How to extend (properly) and "old" Alfresco Share feature Angel Borroy @AngelBorroy angelborroy keensoft
  • 2. Learn. Connect. Collaborate. Once upon a time… … a user created hundred of versions. An engineer who was passing by, wondered how to help 111.0 CERTIFIED TECHNOLOGY
  • 3. Learn. Connect. Collaborate. He had an idea “Add a simple button to remove versions from Alfresco Share” CERTIFIED TECHNOLOGY
  • 4. Learn. Connect. Collaborate. That engineer was a real hero, almost LEGENDARY! 20 years of experience #4 in Community Leaderboard 7 Alfresco Hack-a-thons 5 Alfresco conferences 4 YouTube Tech Talk Live 2 YouTube Office hours 1 Community-driven Video
  • 5. Learn. Connect. Collaborate. Trust me: a 15 minutes task • 1 XML Surf Extension for document-details component • 1 FTL page to add the icon and the link • 1 JS file to invoke REST API using Ajax helper Hands on! $ mvn archetype:generate -Dfilter=org.alfresco: 5: remote -> org.alfresco.maven.archetype:alfresco-share-jar-archetype
  • 6. Learn. Connect. Collaborate. Guide my sword document-versions.get.html.ftl > > > document-versions.js getDocumentVersionMarkup: function DocumentVersions_getDocumentVersionMarkup(doc) { var html = ''; html += '<div class="version-panel-left">' html += ' <span class="document-version">' + $html(doc.label) + '</span>'; html += '</div>'; html += '<div class="version-panel-right">'; html += ' <a href="' + downloadURL + '" target="_blank" class="download" title="' + this.msg("label.download") + '">&nbsp;</a>'; ... * Extracted from the book “Creative ways to build an HTML”
  • 7. Learn. Connect. Collaborate. Crossing the red line Overwriting getDocumentVersionMarkup method... // Add new icon to remove a version passing "label" parameter to // "onRemoveClick" function html += ' <a href="#" target="_blank" name=".onRemoveClick" rel="' + doc.label + '" class="' + this.id + ' remove" title="' + this.msg("label.delete") + '">&nbsp;</a>'; JavaScript CSS i18n
  • 8. Learn. Connect. Collaborate. Routine tasks CSS /* Add icon for the new button */ .document-versions .actions a.remove{ background-image: url(images/document-delete-16.png);} /* Add more space to include a new button */ .document-versions .actions { width: 7em !important;} i18n label.delete=Delete CSS i18n
  • 9. Learn. Connect. Collaborate. Finding the right REST API method...
  • 10. Learn. Connect. Collaborate. … JavaScript API method …
  • 12. Learn. Connect. Collaborate. Joyful Web Script! [HTTP DELETE] http://alfresco/api/version/{noderef}/{label} Hands on! $ mvn archetype:generate -Dfilter=org.alfresco: 4: remote -> org.alfresco.maven.archetype:alfresco-platform-jar-archetype Alfresco Web Script
  • 13. Learn. Connect. Collaborate. Trust me (again): a 15 minutes task Desc <url>/api/node/version/{store_type}/{store_id}/{id}/{label}</url> Response {"success":"${success}"} Spring bean <bean id="webscript.es.keensoft.remove-version.post" class="es.keensoft.webscript.RemoveVersion” parent="webscript"> <property name="serviceRegistry" ref="ServiceRegistry" /> </bean> Java code protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache) { // Reading parameters from URL Map<String, String> templateArgs = req.getServiceMatch().getTemplateVars();
  • 14. Learn. Connect. Collaborate. I told you: he was a legend
  • 15. Learn. Connect. Collaborate. A Spoonful of Sugar Helps the Medicine Go Down Alfresco.util.Ajax.request( { method: Alfresco.util.Ajax.DELETE, url: Alfresco.constants.PROXY_URI + 'api/node/version/' + nodeRef.replace(":/", "") + '/' + label, requestContentType: Alfresco.util.Ajax.JSON, successCallback: {…}, failureCallback: {…} }); http://alfresco/api/version/b4822b85-4b33-42ad-8dfa-d630a7a81716/1.0 org.alfresco.web.scripts.WebScriptException - Web Script format '0' is not registered.
  • 16. Learn. Connect. Collaborate. Into the wild - do not try at home Moving from DELETE to POST Desc, Response, Spring bean *.delete.* > *.post.* Java code JSONObject json = new JSONObject(new JSONTokener(req.getContent().getContent())); versionLabel = json.getString("label");
  • 17. Learn. Connect. Collaborate. Stranger things Alfresco.util.Ajax.request( { // Using POST instead of DELETE due to parameters including "." // (e.g label = 1.0) method: Alfresco.util.Ajax.POST, url: Alfresco.constants.PROXY_URI + 'api/node/version/' + nodeRef.replace(":/", ""), dataObj: { label: label }, requestContentType: Alfresco.util.Ajax.JSON, successCallback: { … }, failureCallback: { … } });
  • 18. Learn. Connect. Collaborate. Trust me: a 1,5 hours task • 1 XML Surf Extension for document-details component • 1 FTL page to add CSS and JavaScript • 1 JS file to add HTML source code and to invoke REST API using Ajax helper • 1 CSS file to stylish the button • 1 image file for the icon • 2 i18n property files for English & Spanish • 1 XML Spring bean for Java-backed Web Script • 1 XML description file for Web Script declaration • 1 JSON file for Web Script response • 1 Java file for Web Script logic REPOSHARE
  • 19. Learn. Connect. Collaborate. One more thing… … everyone should be able to mess up with that killer version action?
  • 20. Learn. Connect. Collaborate. With great powers comes great responsibility <!-- Feature only available for members of group VERSION_REMOVERS --> <evaluator type="group.module.evaluator"> <params> <groups>GROUP_VERSION_REMOVERS</groups> <groupRelation>AND</groupRelation> </params> </evaluator>
  • 21. Learn. Connect. Collaborate. How to extend and "old" Alfresco Share feature • Personal skills – Patience – Perseverance • Resources – Source Code – Alfresco Documentation – Community – IRC – Order of the Bee Source available at https://github.com/keensoft/alfresco-remove-version Alfresco Web Script CERTIFIED TECHNOLOGY
  • 22. ¡Gracias! @AngelBorroy angelborroy keensoft How to extend (properly) and "old" Alfresco Share feature

Editor's Notes

  1. Welcome to a genuine Alfresco Share session! My name is Angel Borroy and you'll find me easily
  2. Engineers are dangerous when observing users, as they try to solve problems that are not a problem itself for users
  3. How about creating a new button to remove a version in Alfresco Share? -he thought- It sounds a good idea!
  4. And as that engineer was almost a legend (certifications, experience, conferences...) the task seemed to be easy
  5. In about 15 minutes, a simple Surf extensions with some code to add the button and to invoke the repo can be done
  6. He started searching the FTL template to find that HTML code was produced by concatening Strings in JavaScript
  7. No problem, he thougt. I can overwrite just only a simple method to add my feature.
  8. It was so simple to add the styles and the messages, pure rutine for that hero!
  9. And now it's just a matter of finding the right REST API method... That doesn't exist!
  10. So he had to move to the repo part... how about a simple JavaScript baked Web Script? Ouch!
  11. In fact, he was an experienced Java developer, so using the Java API didn't feared him. He was encouraged to do it!
  12. He started with the Web Script without doubts, as is so simple and fast as to write some lines of code
  13. And he had the REST method running inf 15 minutes: Alfresco is so a lovely framework to work with!
  14. I told you earlier: he was a real legend. Practically perfect in every way!
  15. But when all was set and ready to play, he bumped against reality. Web Scrips URLs cannot end with a "pointed" word!
  16. At that point, I don't know why, he thought that the best move was to change from DELETE to POST to pass parameters easily
  17. And he included also a nice comment on the POST method that was DELETING a version... Stranger (developer) things, you know
  18. Once the feature was built, he looked at all the work done and he felt safe. Another success on his career!
  19. However, as engineers are never completely satisfied with their projects, he had a final doubt...
  20. ... that he solved with some of that Surf magic that makes our life easier.
  21. So, believe me, the most important things to extend and "old" Alfresco Share feature are patience and perserverance!
  22. Gracias