SlideShare a Scribd company logo
1 of 22
How We Brought Advanced
HTML5 Viewing To ADF
Sean Graham
Snowbound Software
Learn. Connect. Collaborate.
What is Snowbound?
• Over 20 years of document and imaging expertise
• Two main products:
– RasterMaster – Java and .NET document rendering and processing SDK
– VirtualViewer – Java and .NET viewer
Learn. Connect. Collaborate.
What is Snowbound?
• Over 20 years of document and imaging expertise
• Two main products:
– RasterMaster – Java and .NET document rendering and processing SDK
– VirtualViewer – Java and .NET viewer
Learn. Connect. Collaborate.
What is VirtualViewer
• VirtualViewer is a pure-browser document and image platform
– No plugins required
– Scores of formats
– Annotation, manipulation, redaction, etc.
• VirtualViewer has been integrated with Alfresco for years
• What would it take to integrate with ADF and Content App?
Learn. Connect. Collaborate.
What is VirtualViewer
• VirtualViewer is a pure-browser document and image platform
– No plugins required
– Scores of formats
– Annotation, manipulation, redaction, etc.
• VirtualViewer has been integrated with Alfresco for years
• What would it take to integrate with ADF and Content App?
1
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
2
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
Learn. Connect. Collaborate.
Register with Extension Service
• Let the system know there is a
new member of the namespace
• Set a custom ID for later
reference
import { ExtensionsModule, ExtensionService } from
'@alfresco/adf-extensions';
@NgModule({
imports: [ ExtensionsModule.forChild() ]
declarations: [ VirtualViewerAlfrescoComponent, MyLayout
],
entryComponents: [ VirtualViewerAlfrescoComponent,
MyLayout ]
})
export class MyExtensionModule {
constructor(extensions: ExtensionService) {
extensions.setComponents({
'snowbound.virtualviewer':
VirtualViewerAlfrescoComponent,
});
}
}
Learn. Connect. Collaborate.
Register with Extension Service
• Let the system know there is a
new member of the namespace
• Set a custom ID for later
reference
import { ExtensionsModule, ExtensionService } from
'@alfresco/adf-extensions';
@NgModule({
imports: [ ExtensionsModule.forChild() ]
declarations: [ VirtualViewerAlfrescoComponent, MyLayout
],
entryComponents: [ VirtualViewerAlfrescoComponent,
MyLayout ]
})
export class MyExtensionModule {
constructor(extensions: ExtensionService) {
extensions.setComponents({
'snowbound.virtualviewer':
VirtualViewerAlfrescoComponent,
});
}
}
3
Learn. Connect. Collaborate.
Viewer Extension Configuration
• While you could certainly include
your configuration values in the
app.extensions.json file,
don’t.
• Refer to an extension-specific
json configuration instead.
{
"$schema": "../../extension.schema.json",
"$id": "app.core",
"$name": "app.core",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Core application extensions and features",
"$references": ["virtualviewer.json"],
Learn. Connect. Collaborate.
Viewer Extension Configuration (Continued)
• You’ll need to associate at least
one filetype with your
component.
• To the right, we associate PDF
files with VV, but our actual
virtualviewer.json includes
scores of formats.
{
"$schema": "../extension.schema.json",
"$version": "0.1.0",
"$name": "virtualviewer",
"$description": "plugin for VirtualViewer in the content
app",
"features": {
"viewer": {
"content": [
{
"id": "snowbound",
"fileExtension": "pdf",
"component": "snowbound.virtualviewer"
}
]
}
}
}
Learn. Connect. Collaborate.
Viewer Extension Configuration (Continued)
• You’ll need to associate at least
one filetype with your
component.
• To the right, we associate PDF
files with VV, but our actual
virtualviewer.json includes
scores of formats.
{
"$schema": "../extension.schema.json",
"$version": "0.1.0",
"$name": "virtualviewer",
"$description": "plugin for VirtualViewer in the content
app",
"features": {
"viewer": {
"content": [
{
"id": "snowbound",
"fileExtension": "pdf",
"component": "snowbound.virtualviewer"
}
]
}
}
}
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
4
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
Learn. Connect. Collaborate.
Questions
• Nathan and I will be at the Snowbound table during the 10:45a block on Thursday
• Alternatively, visit the table and coordinate a different time with JB
Learn. Connect. Collaborate.
Questions
• Nathan and I will be at the Snowbound table during the 10:45a block on Thursday
• Alternatively, visit the table and coordinate a different time with JB
How We Brought
Advanced HTML5 Viewing
To ADF
Sean Graham
Snowbound Software

More Related Content

What's hot

Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)Vincent Biret
 
Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)Vincent Biret
 
APIs, APIs Everywhere!
APIs, APIs Everywhere!APIs, APIs Everywhere!
APIs, APIs Everywhere!BIWUG
 
MS Insights Brazil 2015 containers and devops
MS Insights Brazil 2015   containers and devopsMS Insights Brazil 2015   containers and devops
MS Insights Brazil 2015 containers and devopsDamien Caro
 
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...NCCOMMS
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfNCCOMMS
 
Pros & Cons of Microservices Architecture
Pros & Cons of Microservices ArchitecturePros & Cons of Microservices Architecture
Pros & Cons of Microservices ArchitectureAshwini Kuntamukkala
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET MicroservicesVMware Tanzu
 
Your Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web ComponentsYour Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web ComponentsKen Tabor
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...BizTalk360
 
Microservices and Azure App Services
Microservices and Azure App ServicesMicroservices and Azure App Services
Microservices and Azure App ServicesDamir Dobric
 
Building Push Triggers for Logic Apps
Building Push Triggers for Logic AppsBuilding Push Triggers for Logic Apps
Building Push Triggers for Logic AppsBizTalk360
 
The hardest part of microservices: your data
The hardest part of microservices: your dataThe hardest part of microservices: your data
The hardest part of microservices: your dataChristian Posta
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to MicroservicesMahmoudZidan41
 
ECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web ApplicationsECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web ApplicationsEric Shupps
 
Agile Development From A Developers Perspective
Agile Development From A Developers PerspectiveAgile Development From A Developers Perspective
Agile Development From A Developers PerspectiveRichard Banks
 
2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and MinecraftSriram Hariharan
 
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...NCCOMMS
 
Windows Azure Active Directory
Windows Azure Active DirectoryWindows Azure Active Directory
Windows Azure Active DirectoryPavel Revenkov
 
Introduction to Azure Functions
Introduction to Azure FunctionsIntroduction to Azure Functions
Introduction to Azure FunctionsMarco Parenzan
 

What's hot (20)

Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)
 
Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)
 
APIs, APIs Everywhere!
APIs, APIs Everywhere!APIs, APIs Everywhere!
APIs, APIs Everywhere!
 
MS Insights Brazil 2015 containers and devops
MS Insights Brazil 2015   containers and devopsMS Insights Brazil 2015   containers and devops
MS Insights Brazil 2015 containers and devops
 
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
 
Pros & Cons of Microservices Architecture
Pros & Cons of Microservices ArchitecturePros & Cons of Microservices Architecture
Pros & Cons of Microservices Architecture
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
 
Your Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web ComponentsYour Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web Components
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
 
Microservices and Azure App Services
Microservices and Azure App ServicesMicroservices and Azure App Services
Microservices and Azure App Services
 
Building Push Triggers for Logic Apps
Building Push Triggers for Logic AppsBuilding Push Triggers for Logic Apps
Building Push Triggers for Logic Apps
 
The hardest part of microservices: your data
The hardest part of microservices: your dataThe hardest part of microservices: your data
The hardest part of microservices: your data
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
 
ECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web ApplicationsECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web Applications
 
Agile Development From A Developers Perspective
Agile Development From A Developers PerspectiveAgile Development From A Developers Perspective
Agile Development From A Developers Perspective
 
2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft
 
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
 
Windows Azure Active Directory
Windows Azure Active DirectoryWindows Azure Active Directory
Windows Azure Active Directory
 
Introduction to Azure Functions
Introduction to Azure FunctionsIntroduction to Azure Functions
Introduction to Azure Functions
 

Similar to How We Brought Advanced HTML5 Viewing to ADF

A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...DataLeader.io
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB
 
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling Sencha
 
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaEvolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaMongoDB
 
MongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless WorldMongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless WorldMongoDB
 
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)Obeo
 
Workshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsWorkshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsSami Ekblad
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWAREFIWARE
 
Integrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code SuiteIntegrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code SuiteAtlassian
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzkenetzke
 
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB StitchMongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB StitchMongoDB
 
Building a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesBuilding a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesDavid Giard
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applicationsAstrails
 
Engineering the New LinkedIn Profile
Engineering the New LinkedIn ProfileEngineering the New LinkedIn Profile
Engineering the New LinkedIn ProfileJosh Clemm
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Againjonknapp
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event HandlingWebStackAcademy
 
Miha Lesjak Mobilizing The Web with Web Runtime
Miha Lesjak Mobilizing The Web with Web RuntimeMiha Lesjak Mobilizing The Web with Web Runtime
Miha Lesjak Mobilizing The Web with Web RuntimeNokiaAppForum
 

Similar to How We Brought Advanced HTML5 Viewing to ADF (20)

A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDB
 
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
 
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaEvolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
 
MongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless WorldMongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless World
 
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
 
Workshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsWorkshop: Building Vaadin add-ons
Workshop: Building Vaadin add-ons
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
Integrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code SuiteIntegrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code Suite
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
 
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB StitchMongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
Building a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesBuilding a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web Services
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
 
Fire up your mobile app!
Fire up your mobile app!Fire up your mobile app!
Fire up your mobile app!
 
Engineering the New LinkedIn Profile
Engineering the New LinkedIn ProfileEngineering the New LinkedIn Profile
Engineering the New LinkedIn Profile
 
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter LehtoJavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
 
Miha Lesjak Mobilizing The Web with Web Runtime
Miha Lesjak Mobilizing The Web with Web RuntimeMiha Lesjak Mobilizing The Web with Web Runtime
Miha Lesjak Mobilizing The Web with Web Runtime
 

Recently uploaded

Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxupamatechverse
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSCAESB
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile servicerehmti665
 
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxthe ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxhumanexperienceaaa
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxpurnimasatapathy1234
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...ranjana rawat
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130Suhani Kapoor
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxpranjaldaimarysona
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSKurinjimalarL3
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingrakeshbaidya232001
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations120cr0395
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escortsranjana rawat
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Dr.Costas Sachpazis
 

Recently uploaded (20)

Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
 
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(PRIYA) Rajgurunagar Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptx
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentation
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile service
 
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptxthe ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
the ladakh protest in leh ladakh 2024 sonam wangchuk.pptx
 
Microscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptxMicroscopic Analysis of Ceramic Materials.pptx
Microscopic Analysis of Ceramic Materials.pptx
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(SHREYA) Chakan Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptx
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANVI) Koregaon Park Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICSAPPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
APPLICATIONS-AC/DC DRIVES-OPERATING CHARACTERISTICS
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writing
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptxExploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
 
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
Structural Analysis and Design of Foundations: A Comprehensive Handbook for S...
 

How We Brought Advanced HTML5 Viewing to ADF

  • 1. How We Brought Advanced HTML5 Viewing To ADF Sean Graham Snowbound Software
  • 2. Learn. Connect. Collaborate. What is Snowbound? • Over 20 years of document and imaging expertise • Two main products: – RasterMaster – Java and .NET document rendering and processing SDK – VirtualViewer – Java and .NET viewer
  • 3. Learn. Connect. Collaborate. What is Snowbound? • Over 20 years of document and imaging expertise • Two main products: – RasterMaster – Java and .NET document rendering and processing SDK – VirtualViewer – Java and .NET viewer
  • 4. Learn. Connect. Collaborate. What is VirtualViewer • VirtualViewer is a pure-browser document and image platform – No plugins required – Scores of formats – Annotation, manipulation, redaction, etc. • VirtualViewer has been integrated with Alfresco for years • What would it take to integrate with ADF and Content App?
  • 5. Learn. Connect. Collaborate. What is VirtualViewer • VirtualViewer is a pure-browser document and image platform – No plugins required – Scores of formats – Annotation, manipulation, redaction, etc. • VirtualViewer has been integrated with Alfresco for years • What would it take to integrate with ADF and Content App? 1
  • 6. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 7. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 8. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 9. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco 2
  • 10. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco
  • 11. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco
  • 12. Learn. Connect. Collaborate. Register with Extension Service • Let the system know there is a new member of the namespace • Set a custom ID for later reference import { ExtensionsModule, ExtensionService } from '@alfresco/adf-extensions'; @NgModule({ imports: [ ExtensionsModule.forChild() ] declarations: [ VirtualViewerAlfrescoComponent, MyLayout ], entryComponents: [ VirtualViewerAlfrescoComponent, MyLayout ] }) export class MyExtensionModule { constructor(extensions: ExtensionService) { extensions.setComponents({ 'snowbound.virtualviewer': VirtualViewerAlfrescoComponent, }); } }
  • 13. Learn. Connect. Collaborate. Register with Extension Service • Let the system know there is a new member of the namespace • Set a custom ID for later reference import { ExtensionsModule, ExtensionService } from '@alfresco/adf-extensions'; @NgModule({ imports: [ ExtensionsModule.forChild() ] declarations: [ VirtualViewerAlfrescoComponent, MyLayout ], entryComponents: [ VirtualViewerAlfrescoComponent, MyLayout ] }) export class MyExtensionModule { constructor(extensions: ExtensionService) { extensions.setComponents({ 'snowbound.virtualviewer': VirtualViewerAlfrescoComponent, }); } } 3
  • 14. Learn. Connect. Collaborate. Viewer Extension Configuration • While you could certainly include your configuration values in the app.extensions.json file, don’t. • Refer to an extension-specific json configuration instead. { "$schema": "../../extension.schema.json", "$id": "app.core", "$name": "app.core", "$version": "1.0.0", "$vendor": "Alfresco Software, Ltd.", "$license": "LGPL-3.0", "$runtime": "1.5.0", "$description": "Core application extensions and features", "$references": ["virtualviewer.json"],
  • 15. Learn. Connect. Collaborate. Viewer Extension Configuration (Continued) • You’ll need to associate at least one filetype with your component. • To the right, we associate PDF files with VV, but our actual virtualviewer.json includes scores of formats. { "$schema": "../extension.schema.json", "$version": "0.1.0", "$name": "virtualviewer", "$description": "plugin for VirtualViewer in the content app", "features": { "viewer": { "content": [ { "id": "snowbound", "fileExtension": "pdf", "component": "snowbound.virtualviewer" } ] } } }
  • 16. Learn. Connect. Collaborate. Viewer Extension Configuration (Continued) • You’ll need to associate at least one filetype with your component. • To the right, we associate PDF files with VV, but our actual virtualviewer.json includes scores of formats. { "$schema": "../extension.schema.json", "$version": "0.1.0", "$name": "virtualviewer", "$description": "plugin for VirtualViewer in the content app", "features": { "viewer": { "content": [ { "id": "snowbound", "fileExtension": "pdf", "component": "snowbound.virtualviewer" } ] } } }
  • 17. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height 4
  • 18. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height
  • 19. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height
  • 20. Learn. Connect. Collaborate. Questions • Nathan and I will be at the Snowbound table during the 10:45a block on Thursday • Alternatively, visit the table and coordinate a different time with JB
  • 21. Learn. Connect. Collaborate. Questions • Nathan and I will be at the Snowbound table during the 10:45a block on Thursday • Alternatively, visit the table and coordinate a different time with JB
  • 22. How We Brought Advanced HTML5 Viewing To ADF Sean Graham Snowbound Software