Extreme UIs - final format

advertisement
Extreme User Interfaces for Alfresco
Kevin Dorr
Sr. Solutions Engineer
Americas Channel
An Alfresco User Interface
Gallery
Alfresco Share
Share Document Library
Share Forms
Share Activiti Console
Alfresco Records Management
Alfresco RM Dialog
RM Console
Share jQuery User Interface
Share jQuery Dialog
Surf User Interface
Architecting an Alfresco
User Interface
Some Alfresco UI Architectures
Alfresco UI Platforms
Share
• Modify existing pages
• Add new pages
Surf
• Build a New UI Leveraging Surf capabilities
Standalone
• Build a New UI with your Favorite Framework
Alfresco UI Platforms
Use Cases and Platforms
Share
• Existing Users
• Users that need Collaborative Features
Surf
• Reusable UI Components
• Web Sites
Standalone
• Highly Custom Look and Feel
• Developer Tool Familiarity
• Web Sites
Building a Development
Environment
Getting Started
“Manual” Development Environments
• The “Old” (3.0) Way
• The “New” (4.0) Way
• There is an example of both directory
structures in the sample source code
Eclipse / Maven
• A Sample Project is Available
Code Deployment
Overrides Still Work!
Example:
A New Page in Share
A Disclaimer
Alfresco 4 and Beyond the Infinite
Requirements for the Example
DITA “Map Generator” Page
• Find, Display and Select all DITA Maps
• Show the XML for the Map as a Tree
• Allow a User to Create New Items in the Tree
by Associating DITA Topics
Integrate with a Collaboration Site
• Publishers Often Need This
Look Cool – Custom Style
Architecture Choices:
Use Share as the Base Platform
• Leverage Surf Infrastructure
• Leverage Share Infrastructure
Create a New Share Page
• Admin can Add to Appropriate Sites
Use jQuery Tools for Layout and
Interaction
Getting Started with a New Page
Three Files are Required (Minimum)
• Page Definition File
• Template Instance Definition
• Freemarker Template
Add the Share Look and Feel
• Component Definitions
Add the jQuery Library References
Page Definition File
XML File that Defines the Page Id
and Template Instance
<?xml version='1.0' encoding='UTF-8'?>
<page>
<id>dita-builder</id>
<page-type>dita-builder</page-type>
<title>DITA Map Builder</title>
<title-id>page.dita-builder.title</title-id>
<description>DevCon DITA Map Builder Example</description>
<description-id>page.dita-builder.description</description-id>
<template-instance>dita-builder</template-instance>
<authentication>user</authentication>
</page>
Deploy to site-data/pages
• Add Corresponding Definitions in Messages
Template Instance Definition
XML File that Defines where the
Page Template is Stored
<?xml version='1.0' encoding='UTF-8'?>
<template-instance>
<template-type>org/alfresco/dita-builder</template-type>
</template-instance>
Deploy to site-data/templateinstances
Freemarker Template
Defining a Basic Share-Style Page
<@templateBody>
<div id="alf-hd">
<@region id="header" scope="global"/>
<@region id="title" scope="template"/>
<@region id="navigation" scope="template"/>
</div>
<div id="bd">
<div class="yui-t1" id="ditabldr-body">
<div id="yui-main">
<div class="yui-b" id="dita-fileselector">
<@region id="ditamapaction" scope="template" />
</div>
</div>
<div class="yui-b" id="dita-mapselector">
<@region id="ditamapselector" scope="template" />
</div>
</div>
</div>
</@>
<@templateFooter>
<div id="alf-ft">
<@region id="footer" scope="global"/>
</div>
</@>
Freemarker Template
Leveraging YUI Layout Templates
• See the Yahoo Developer Network for Details
<div id="bd">
<div class="yui-t1" id="ditabldr-body">
<div id="yui-main">
<div class="yui-b" id="dita-fileselector">
<@region id="ditamapaction" scope="template" />
</div>
</div>
Freemarker Template
Include Files and Headers
• Provide access to the Alfresco framework
• Provide access to jQuery framework
• Can Inject more into the Header Later
<#include "/org/alfresco/include/alfresco-template.ftl" />
<@templateHeader>
<meta charset="utf-8">
<link rel="stylesheet" href="${url.context}/res/ditabldr/css/jquery-ui-1.9.1.custom.min.css">
<script type="text/javascript" src="${url.context}/res/ditabldr/js/jquery-1.8.2.js"></script>
<script type="text/javascript" src="${url.context}/res/ditabldr/js/jquery-ui-1.9.1.custom.min.js"></script>
</@>
….
Deploy to location specified in template-instance
Client Side jQuery Libraries
CSS and Images
Javascript Libraries
Deploy to a Client Accessible
Location
•Webapps/ROOT for the old way
•In jar META-INF for the new way
jQuery UI ThemeRoller
Page Regions and Components
Page Component Definition
Maps Page Region to Webscript
<?xml version='1.0' encoding='UTF-8'?>
<component>
<scope>template</scope>
<region-id>ditamapselector</region-id>
<source-id>dita-builder</source-id>
<url>/components/dita-builder/dita-mapselector</url>
</component>
Deploy to site-data/components
Component Webscripts
Component Webscripts
Freemarker jQuery
• jQuery Handler -> Header Injection (.head.ftl)
• Calls jQueryUI method
<script>
$(function() {
$( "#accordion" ).accordion();
});
</script>
• HTML Reference -> Body (.ftl)
<div id="accordion">
<h3><a href="#">Map One</a></h3>
<div>
<p>This is dita map one.</p>
</div>
<h3><a href="#">Map Two</a></h3>
<div>
<p>This is dita map two.</p>
</div>
</div>
Adding the Page to a Site
Adding a Reference to the Page
<config evaluator="string-compare" condition="SitePages" replace="false">
<pages>
<page id="dita-builder">dita-builder</page>
</pages>
</config>
Add to share-config-custom.xml
So What Did We Get?
UI Construction Summary
Calling Webscripts with Alfresco Util
// Add New Map Dialog
$('#addnew_dialog').dialog({
autoOpen: false,
width: 800,
buttons: {
"Add": function() {
Alfresco.util.Ajax.request({
method:
"POST",
url:
"/alfresco/service/ditabldr/createmap",
contentRequestType: “JSON",
dataForm:
$(“#addnew_map_data”);
successCallback:
function( data ) {
updateMapList( data );
}
});
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
Calling Webscripts with jQuery
// Add New Map Dialog
$('#addnew_dialog').dialog({
autoOpen: false,
width: 800,
buttons: {
"Add": function() {
var form_data = $("#addnew_map_data").serializeObject();
var json_data = JSON.stringify( form_data );
$.ajax({
type:
"POST",
contentType: "application/json",
url:
"/alfresco/service/ditabldr/createmap",
data:
json_test,
dataType:
"json",
complete:
function( data ) {
updateMapList( data );
}
});
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
Resources
Learning About Surf (and Share)
Training
Blogs
Books
Summary
Summary
• Stepwise Process to Create a
Share Page
• Include
Party Libraries and
Inject JS Handlers
rd
3
• Leverage Alfresco Framework to
Post to Webscripts
Summary
• Use
Party Library AJAX Built ins
to Post to Webscripts for a
Standalone Page
rd
3
• Use RM implementation for
another UI example
• Possibilities are Limited Only by
Your Imagination
Questions?
Download