From 26563ab5129858286b26ee8fe1fd200ba1d20d29 Mon Sep 17 00:00:00 2001 From: Martin Bergljung Date: Tue, 28 Jun 2016 10:47:30 +0100 Subject: [PATCH] Updates to README and additional documentation --- Introduction.md | 30 ++++ Prerequisites.md | 132 ++++++++++++++++++ README.md | 95 +++++-------- ...lfresco-app-dev-framework-architecture.png | Bin 0 -> 33550 bytes 4 files changed, 197 insertions(+), 60 deletions(-) create mode 100644 Introduction.md create mode 100644 Prerequisites.md create mode 100644 assets/alfresco-app-dev-framework-architecture.png diff --git a/Introduction.md b/Introduction.md new file mode 100644 index 0000000000..d1f74b233c --- /dev/null +++ b/Introduction.md @@ -0,0 +1,30 @@ +# Introduction to the Alfresco Application Development Framework + +The Alfresco application development framework is based on the [Angular 2 JavaScript library](https://angular.io/). +The framework is provided by Alfresco to make it easy to build custom web applications that +should manage and view content in the [Alfresco Platform Repository](http://docs.alfresco.com/5.1/concepts/content-repo-about.html) in a custom way. + +As you probably know, there is a general user interface called [Alfresco Share](http://docs.alfresco.com/5.1/concepts/gs-intro.html) available out-of-the-box. +This framework is to be used when the requirements for the content web client deviates from what is available in the standard general Alfresco Share webapp. + +The framework consists of a number of components that can be combined together to form a customized content management application. +Here is a list of some of the available web components: + +- [Core library](ng2-components/ng2-alfresco-core/README.md) +- [DataTable](ng2-components/ng2-alfresco-datatable/README.md) +- [DocumentList](ng2-components/ng2-alfresco-documentlist/README.md) +- [Viewer](ng2-components/ng2-alfresco-viewer/README.md) +- [Login](ng2-components/ng2-alfresco-login/README.md) +- [Upload](ng2-components/ng2-alfresco-upload/README.md) + +You can browse all the components at this [page](http://devproducts.alfresco.me/). + +An architecture overview looks like this: + +

+ alfresco +

+ +Here we can also see that there is an Alfresco JavaScript framework in use that wraps the Alfresco REST API. To make things easier for the client developer. + + diff --git a/Prerequisites.md b/Prerequisites.md new file mode 100644 index 0000000000..a7bc2b5768 --- /dev/null +++ b/Prerequisites.md @@ -0,0 +1,132 @@ +# Prerequisites for building and running apps with the Alfresco Application Development Framework + +The [Angular 2](https://angular.io/) based application development framework requires the following: + +- An Alfresco Platform Repository to talk to, which has [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) enabled. +- [Node.js](https://nodejs.org/en/) JavaScript runtime. +- [npm](https://www.npmjs.com/) package manager for JavaScript. +- Access to the [Alfresco private npm repository](http://devproducts.alfresco.me) that contains the web components (note, you need VPN access to view) + +## Installing Alfresco + +Alfresco comes with installers that will install all the servers, webapps, and tools needed to run Alfresco. + +- Download Alfresco Community from this [page](https://www.alfresco.com/products/community/download). +- Install Alfresco following these [instructions](http://docs.alfresco.com/5.1/concepts/installs-eval-intro.html). + +This will install the following Alfresco web applications: + +- Alfresco Platform with the Content Repository, which we need so we can access content from our custom web client +- Alfresco Solr, which we need so we can search for content from our custom web client +- Alfresco Share, not technically needed, but can be useful for creating users and groups, and to access and upload content to the repository while we are developing the custom web client + +### Enable CORS in Alfresco + +The web client that we are building with the application development framework will be loaded from a different web server than the Alfresco Platform is running on. +So we need to tell the Alfresco server that any request that comes in from this custom web client should be allowed access +to the Content Repository. This is done by enabling CORS. + +To enable CORS in the Alfresco Platform do the following: + +Modify *tomcat/webapps/alfresco/WEB-INF/web.xml* and uncomment the following section and update +`cors.allowOrigin` to `http://localhost:3000`: + +``` + CORS + com.thetransactioncompany.cors.CORSFilter + + cors.allowGenericHttpRequests + true + + + cors.allowOrigin + http://localhost:3000 + + + cors.allowSubdomains + true + + + cors.supportedMethods + GET, HEAD, POST, PUT, DELETE, OPTIONS + + + cors.supportedHeaders + origin, authorization, x-file-size, x-file-name, content-type, accept, x-file-type + + + cors.supportsCredentials + true + + + cors.maxAge + 3600 + + +``` +When specifying the `cors.allowOrigin` URL make sure to use the URL that will be used by the web client. + +Then uncomment filter mappings: + +``` + CORS + /api/* + /service/* + /s/* + /cmisbrowser/* + +``` +## Installing Node.js + +If you don't have Node.js installed then access this [page](https://nodejs.org/en/download/) and use the appropriate installer for your OS. + +## Installing npm + +The npm package manager is included with Node.js, however it is not usually the latest version as npm is updated more frequently than node.js. + +Update npm as follows: + +`$ npm install npm -g` + +## Configure Alfresco Private npm repository + +All the distribution packages for the application development framework components are stored in Alfresco's private npm repository, +which is visible only from the internal Alfresco LAN (or through VPN). We need to tell npm about this repository. + +Set up Alfresco's private npm repository as follows: + +`$ npm set registry http://devproducts.alfresco.me:4873` + +### Add a user to the private npm registry (OPTIONAL) + +Note. This step is not needed if you are just going to use (i.e. read) the components. + +You can add yourself as a user to the private npm repository so you can publish to it. +The user needs to have been registered with the repository beforehand. + +Example: + +``` +$ npm adduser --registry http://devproducts.alfresco.me:4873 +Username: +Password: +Email: (this IS public) +``` + +#### How to publish on it: + +Add the repository to your *package.json* file: + +```json + "publishConfig": { + "registry": "http://devproducts.alfresco.me:4873/" + } +``` +*ATTENTION*: If you don't add these lines, then the package is published to the public npm repository. + +Then run the command below each time you want to publish a new version of a component: + +```sh +npm version patch +npm publish +``` diff --git a/README.md b/README.md index 52cc5c2fe2..7d9483be37 100644 --- a/README.md +++ b/README.md @@ -17,80 +17,56 @@ angular2

+## Introduction + +See the following [page](Introduction.md) for an introduction to the Alfresco Application Development Framework. + ## Prerequisites -- Alfresco repository with CORS enabled. A Docker-compose file is provided by the [demo-shell](demo-shell-ng2/README.md) app. +Before you start using this development framework, make sure you have installed all required software and done all the +necessary configuration, see this [page](Prerequisites.md). -## Private Npm repository configuration +## Downloading the source code for the framework -All the distribution packages of our components are stored in our private repository visible only from the internal Alfresco lan: +The source code comes in two parts, one for the JavaScript API that wraps the Alfresco REST API, and one part with the +actual application development framework, including the Angular 2 based web components: -http://devproducts.alfresco.me:4873 - -##### How to configure it: - -```sh -npm set registry http://devproducts.alfresco.me:4873 -npm adduser --registry http://devproducts.alfresco.me:4873 +``` +$ git clone https://github.com/Alfresco/alfresco-js-api.git +$ git clone https://github.com/Alfresco/app-dev-framework.git ``` -##### How to publish on it: +## Running a demo project -- Add the repository to your package.json. -ATTENTION: If you don't add the following lines, the package is published on the public Npm repository. +The Alfresco application development framework comes with a demo project that you can run to get a +feel for what's available. -```json - "publishConfig": { - "registry": "http://devproducts.alfresco.me:4873/" - } -``` -- Then run the command below each time you want to publish a new version: +Start by navigating into the app development framework source folder: -```sh -npm version patch -npm publish -``` +`$ cd app-dev-framework` -### Running demo project +Start the demo and Install all the dependencies (*Note. do it this way only the first time, and be aware, it will take some time*) -*Steps below show the quickest way to get demo shell up and running.* +`app-dev-framework$ ./start.sh -install` -##### Using setup script (recommended) +Start the demo (*the standard way of starting the demo after first initialization*): -```sh -git clone https://github.com/Alfresco/dev-platform-js-api.git -git clone https://github.com/Alfresco/app-dev-framework.git -cd app-dev-framework -``` +`app-dev-framework$ ./start.sh` -* Start the demo and Install all the dependencies (do it the first time) +Start the demo, install all the dependencies, and remove the previous version of the npm packages (*Note. do this only after big changes*): -```sh -./start.sh -install -``` +`app-dev-framework$ ./start.sh -cleanInstall` -* Start the demo and Install all the dependencies and remove the previous version of the npm package(do it after big changes) +Start the demo and update the dependencies: -```sh -./start.sh -cleanInstall -``` - -* Start the demo and update the dependencies - -```sh -./start.sh -update -``` - -* Start the demo - -```sh -./start.sh -``` +`app-dev-framework$ ./start.sh -update` For development environment configuration please refer to [project docs](demo-shell-ng2/README.md). ## Components +The following is a list of some of the components that you can use when building your custom Alfresco web client: + - [Core library](ng2-components/ng2-alfresco-core/README.md) - [DataTable](ng2-components/ng2-alfresco-datatable/README.md) - [DocumentList](ng2-components/ng2-alfresco-documentlist/README.md) @@ -98,29 +74,28 @@ For development environment configuration please refer to [project docs](demo-sh - [Login](ng2-components/ng2-alfresco-login/README.md) - [Upload](ng2-components/ng2-alfresco-upload/README.md) -You can browse all the components at the following address: - -http://devproducts.alfresco.me/ +You can browse all the components at the following [page](http://devproducts.alfresco.me/). ## Yeoman generators -To speed up the development of your Alfresco Angular 2 application or Alfresco Angular 2 component use one of our Yeoman generators. These -generators will create for you a full working project with all the right libraries and tools. +To speed up the development of your Alfresco Angular 2 application, or Alfresco Angular 2 component, use one of the Yeoman generators. + +These generators will create a full working project with all the right libraries and tools.

yeoman logo

-### How to build a new Alfresco Angular 2 component +### Generate an Alfresco web component starter project -To generate your Alfresco Angular 2 component you can use our Yeoman generator +To generate your Alfresco Angular 2 component you can use the following Yeoman generator: - [Yeoman Generator Angular 2 Alfresco component](https://github.com/Alfresco/generator-ng2-alfresco-component) -### How to build a new Alfresco Angular 2 application +### Generate an Alfresco web application starter project -To generate your Alfresco Angular 2 application you can use our Yeoman generator +To generate your Alfresco Angular 2 application you can use the following Yeoman generator: - [Yeoman Generator Angular 2 Alfresco application](https://github.com/Alfresco/generator-ng2-alfresco-app) diff --git a/assets/alfresco-app-dev-framework-architecture.png b/assets/alfresco-app-dev-framework-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..614475f8e5465c3d6ff5255a3fccd30a4fb9f19c GIT binary patch literal 33550 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