feature modules (#636)

* permission manager module

* permissions module

* common module

* layout and search modules

* trashcan module, lazy load

* fix context menu module

* lint fix

* recent files module

* favorites module (lazy)

* shared files module (lazy)

* shared link module (lazy)

* lazy loaading fixes
This commit is contained in:
Denys Vuika
2018-09-17 04:57:56 +01:00
committed by Cilibiu Bogdan
parent f44838ac42
commit eb97b18f95
32 changed files with 2113 additions and 1666 deletions

View File

@@ -18,23 +18,23 @@ already preconfigured to store external files.
You can create plugins that change, toggle or extend the following areas: You can create plugins that change, toggle or extend the following areas:
* Navigation sidebar links and groups - Navigation sidebar links and groups
* Context Menu - Context Menu
* Sidebar (aka Info Drawer) - Sidebar (aka Info Drawer)
* Toolbar entries - Toolbar entries
* buttons - buttons
* menu buttons - menu buttons
* separators - separators
* Viewer actions - Viewer actions
* "Open With" entries - "Open With" entries
* "More actions" toolbar entries - "More actions" toolbar entries
Extensions can also: Extensions can also:
* Overwrite or disable extension points of the main application or other plugins - Overwrite or disable extension points of the main application or other plugins
* Change rules, actions or any visual element - Change rules, actions or any visual element
* Register new application routes based on empty pages or layouts - Register new application routes based on empty pages or layouts
* Register new rule evaluators, components, guards, etc. - Register new rule evaluators, components, guards, etc.
## Format ## Format
@@ -64,7 +64,7 @@ Schema allows validating extension files, provides code completion and documenta
{ {
"$schema": "../../extension.schema.json", "$schema": "../../extension.schema.json",
"$name": "app", "$name": "app",
"$version": "1.0.0", "$version": "1.0.0"
} }
``` ```
@@ -79,10 +79,7 @@ the order of declaration defines also the order of loading.
"$schema": "../../extension.schema.json", "$schema": "../../extension.schema.json",
"$name": "app", "$name": "app",
"$version": "1.0.0", "$version": "1.0.0",
"$references": [ "$references": ["plugin1.json", "plugin2.json"]
"plugin1.json",
"plugin2.json"
]
} }
``` ```
@@ -371,7 +368,7 @@ To create a new route, populate the `routes` section with the corresponding entr
"id": "plugin1.routes.bin", "id": "plugin1.routes.bin",
"path": "ext/bin", "path": "ext/bin",
"layout": "app.layout.main", "layout": "app.layout.main",
"component": "app.components.trashcan" "component": "your.component.id"
} }
] ]
} }
@@ -380,7 +377,7 @@ To create a new route, populate the `routes` section with the corresponding entr
### Route properties ### Route properties
| Name | Description | | Name | Description |
| --- | --- | | ------------- | -------------------------------------------------------------------------------------- |
| **id** | Unique identifier. | | **id** | Unique identifier. |
| **path** | Runtime path of the route. | | **path** | Runtime path of the route. |
| **component** | The main [component](#components) to use for the route. | | **component** | The main [component](#components) to use for the route. |
@@ -409,9 +406,9 @@ You can define the full route schema like in the next example:
{ {
"id": "plugin1.routes.bin", "id": "plugin1.routes.bin",
"path": "ext/bin", "path": "ext/bin",
"component": "app.components.trashcan", "component": "your.component.id",
"layout": "app.layout.main", "layout": "app.layout.main",
"auth": [ "app.auth" ], "auth": ["app.auth"],
"data": { "data": {
"title": "Custom Trashcan" "title": "Custom Trashcan"
} }
@@ -430,7 +427,7 @@ Defaults to the `['app.auth']` value.
Below is the list of the authentication guards main application registers on startup. Below is the list of the authentication guards main application registers on startup.
| Key | Type | Description | | Key | Type | Description |
| --- | --- | --- | | -------- | ------------ | ------------------------------------------------------------------------- |
| app.auth | AuthGuardEcm | ADF guard, validates ACS authentication and redirects to Login if needed. | | app.auth | AuthGuardEcm | ADF guard, validates ACS authentication and redirects to Login if needed. |
You can refer those guards from within your custom extensions, You can refer those guards from within your custom extensions,
@@ -442,14 +439,13 @@ You can register any Angular component to participate in extensibility.
The components are used to create custom: The components are used to create custom:
* routes and pages - routes and pages
* toolbar buttons - toolbar buttons
* menu items - menu items
| Key | Type | Description | | Key | Type | Description |
| --- | --- | --- | | ---------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------- |
| app.layout.main | LayoutComponent | Main application layout with the menu bar, navigation sidebar and main content area to project your components. | | app.layout.main | LayoutComponent | Main application layout with the menu bar, navigation sidebar and main content area to project your components. |
| app.components.trashcan | TrashcanComponent | Trashcan component, used for demo purposes. |
| app.toolbar.toggleInfoDrawer | ToggleInfoDrawerComponent | The toolbar button component that toggles Info Drawer for the selection. | | app.toolbar.toggleInfoDrawer | ToggleInfoDrawerComponent | The toolbar button component that toggles Info Drawer for the selection. |
| app.toolbar.toggleFavorite | ToggleFavoriteComponent | The toolbar button component that toggles Favorite state for the selection. | | app.toolbar.toggleFavorite | ToggleFavoriteComponent | The toolbar button component that toggles Favorite state for the selection. |
@@ -464,10 +460,10 @@ besides registering a new one.
## Actions ## Actions
| Name | Description | | Name | Description |
| --- | --- | | --------- | ------------------------------------------------------------------------------ |
| **id** | Unique identifier. | | **id** | Unique identifier. |
| **type** | Action type, see [Application Actions](#application-actions) for more details. | | **type** | Action type, see [Application Actions](#application-actions) for more details. |
| *payload* | Action payload, a string containing value or expression. | | _payload_ | Action payload, a string containing value or expression. |
```json ```json
{ {
@@ -519,20 +515,18 @@ $([1, 2, 1 + 2]) // [1, 2, 3]
Application is using NgRx (Reactive libraries for Angular, inspired by Redux). Application is using NgRx (Reactive libraries for Angular, inspired by Redux).
To get more information on NxRx please refer to the following resources: To get more information on NxRx please refer to the following resources:
* [Comprehensive Introduction to @ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510) - [Comprehensive Introduction to @ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510)
Most of the application features are already exposed in the form of NgRx Actions and corresponding Effects. Most of the application features are already exposed in the form of NgRx Actions and corresponding Effects.
You can invoke any action via a single `Store` dispatcher, similar to the following: You can invoke any action via a single `Store` dispatcher, similar to the following:
```typescript ```typescript
export class MyComponent { export class MyComponent {
constructor(private store: Store<AppStore>) {} constructor(private store: Store<AppStore>) {}
onClick() { onClick() {
this.store.dispatch(new SearchByTermAction('*')); this.store.dispatch(new SearchByTermAction('*'));
} }
} }
``` ```
@@ -543,7 +537,6 @@ Another example demonstrates viewing a node from a custom application service AP
```typescript ```typescript
export class MyService { export class MyService {
constructor(private store: Store<AppStore>) {} constructor(private store: Store<AppStore>) {}
viewFile(node: MinimalNodeEntity) { viewFile(node: MinimalNodeEntity) {
@@ -592,7 +585,7 @@ and perform document list reload if needed.
Below is the list of public actions types you can use in the plugin definitions as a reference to the action: Below is the list of public actions types you can use in the plugin definitions as a reference to the action:
| Name | Payload | Description | | Name | Payload | Description |
| --- | --- | --- | | ---------------------- | ------------------- | ----------------------------------------------------------------------------------------------- |
| SET_CURRENT_FOLDER | Node | Notify components about currently opened folder. | | SET_CURRENT_FOLDER | Node | Notify components about currently opened folder. |
| SET_CURRENT_URL | string | Notify components about current browser URL. | | SET_CURRENT_URL | string | Notify components about current browser URL. |
| SET_USER_PROFILE | Person | Assign current user profile. | | SET_USER_PROFILE | Person | Assign current user profile. |
@@ -685,15 +678,15 @@ in case you do not need providing extra parameters, or chaining multiple rules t
You can create new rules by chaining other rules and evaluators. You can create new rules by chaining other rules and evaluators.
| Key | Description | | Key | Description |
| --- | --- | | ---------- | ----------------------------------------------------------------------------- |
| core.every | Evaluates to `true` if all chained rules evaluate to `true`. | | core.every | Evaluates to `true` if all chained rules evaluate to `true`. |
| core.some | Evaluates to `true` if at least one of the chained rules evaluates to `true`. | | core.some | Evaluates to `true` if at least one of the chained rules evaluates to `true`. |
| core.not | Evaluates to `true` if all chained rules evaluate to `false`. | | core.not | Evaluates to `true` if all chained rules evaluate to `false`. |
Below is an example of the composite rule definition that combines the following conditions: Below is an example of the composite rule definition that combines the following conditions:
* user has selected a single file - user has selected a single file
* user is not using **Trashcan** page - user is not using **Trashcan** page
```json ```json
{ {
@@ -747,7 +740,7 @@ You can now declare a toolbar button action that is based on the rule above.
"rules": { "rules": {
"visible": "app.toolbar.canViewFile" "visible": "app.toolbar.canViewFile"
} }
}, }
] ]
} }
} }
@@ -758,7 +751,7 @@ The button will be visible only when the linked rule evaluates to `true`.
### Application Evaluators ### Application Evaluators
| Key | Description | | Key | Description |
| --- | --- | | ------------------------------- | ------------------------------------------------------------ |
| app.selection.canDelete | User has permission to delete selected node(s). | | app.selection.canDelete | User has permission to delete selected node(s). |
| app.selection.canDownload | User can download selected node(s). | | app.selection.canDownload | User can download selected node(s). |
| app.selection.notEmpty | At least one node is selected. | | app.selection.notEmpty | At least one node is selected. |
@@ -787,7 +780,7 @@ You can also negate any rule by utilizing a `!` prefix:
</p> </p>
| Key | Description | | Key | Description |
| --- | --- | | --------------------------------- | ------------------------------------------------------- |
| app.navigation.folder.canCreate | User can create content in the currently opened folder. | | app.navigation.folder.canCreate | User can create content in the currently opened folder. |
| app.navigation.folder.canUpload | User can upload content to the currently opened folder. | | app.navigation.folder.canUpload | User can upload content to the currently opened folder. |
| app.navigation.isTrashcan | User is using **Trashcan** page. | | app.navigation.isTrashcan | User is using **Trashcan** page. |
@@ -812,9 +805,9 @@ on how to register your own entries to be re-used at runtime.
The rule in the example below evaluates to `true` if all the conditions are met: The rule in the example below evaluates to `true` if all the conditions are met:
* user has selected node(s) - user has selected node(s)
* user is not using **Trashcan** page - user is not using **Trashcan** page
* user is not using **Libraries** page - user is not using **Libraries** page
```json ```json
{ {
@@ -842,12 +835,12 @@ This section contains application-specific features that may vary depending on t
The ACA supports the following set of extension points: The ACA supports the following set of extension points:
* Create menu - Create menu
* Navigation Bar - Navigation Bar
* Toolbar - Toolbar
* Context Menu - Context Menu
* Viewer - Viewer
* Sidebar (aka Info Drawer) - Sidebar (aka Info Drawer)
All the customisations are stored in the `features` section of the configuration file: All the customisations are stored in the `features` section of the configuration file:
@@ -981,10 +974,10 @@ export interface NavBarLinkRef {
You extensions can perform the following actions at runtime: You extensions can perform the following actions at runtime:
* Register new groups with links - Register new groups with links
* Insert new links into existing groups - Insert new links into existing groups
* Update properties of the existing links - Update properties of the existing links
* Disable existing links or entire groups - Disable existing links or entire groups
```json ```json
{ {
@@ -1031,9 +1024,9 @@ You extensions can perform the following actions at runtime:
You can provide the following customisations for the Sidebar (aka Info Drawer) component: You can provide the following customisations for the Sidebar (aka Info Drawer) component:
* Add extra tabs with custom components - Add extra tabs with custom components
* Disable tabs from the main application or extensions - Disable tabs from the main application or extensions
* Replace content or properties of existing tabs - Replace content or properties of existing tabs
```json ```json
{ {
@@ -1062,8 +1055,8 @@ You can provide the following customisations for the Sidebar (aka Info Drawer) c
The example above renders two tabs: The example above renders two tabs:
* `Properties` tab that references `app.components.tabs.metadata` component - `Properties` tab that references `app.components.tabs.metadata` component
* `Comments` tab that references `app.components.tabs.comments` component - `Comments` tab that references `app.components.tabs.comments` component
All corresponding components must be registered for runtime use. All corresponding components must be registered for runtime use.
@@ -1075,7 +1068,7 @@ on how to register your own entries to be re-used at runtime.
#### Tab properties #### Tab properties
| Name | Description | | Name | Description |
| --- | --- | | ------------- | ----------------------------------------------------------- |
| **id** | Unique identifier. | | **id** | Unique identifier. |
| **component** | The main [component](#components) to use for the route. | | **component** | The main [component](#components) to use for the route. |
| **title** | Tab title or resource key. | | **title** | Tab title or resource key. |
@@ -1088,7 +1081,7 @@ on how to register your own entries to be re-used at runtime.
Every component you assign for the tab content receives the following additional properties at runtime: Every component you assign for the tab content receives the following additional properties at runtime:
| Name | Type | Description | | Name | Type | Description |
| --- | --- | --- | | ---- | ---------------------- | --------------------------- |
| node | MinimalNodeEntryEntity | Node entry to be displayed. | | node | MinimalNodeEntryEntity | Node entry to be displayed. |
### Toolbar ### Toolbar
@@ -1132,13 +1125,13 @@ The toolbar extension point is represented by an array of Content Action referen
The content actions are applied to the toolbars for the following Views: The content actions are applied to the toolbars for the following Views:
* Personal Files - Personal Files
* Libraries - Libraries
* Shared - Shared
* Recent Files - Recent Files
* Favorites - Favorites
* Trash - Trash
* Search Results - Search Results
### Context Menu ### Context Menu
@@ -1164,7 +1157,7 @@ You may want to define a list of content actions backed by Rules and wired with
"rules": { "rules": {
"visible": "app.toolbar.canDownload" "visible": "app.toolbar.canDownload"
} }
}, }
] ]
} }
} }
@@ -1194,9 +1187,9 @@ declared in the `rules` section:
Viewer component in ACA supports the following extension points: Viewer component in ACA supports the following extension points:
* Content Viewers - Content Viewers
* `More` toolbar actions - `More` toolbar actions
* `Open With` actions - `Open With` actions
```json ```json
{ {
@@ -1249,7 +1242,7 @@ and `DOCX` view with the `comments` tab.
Every custom component receives the following properties at runtime: Every custom component receives the following properties at runtime:
| Name | Type | Description | | Name | Type | Description |
| --- | --- | --- | | --------- | ---------------------- | --------------------------- |
| node | MinimalNodeEntryEntity | Node entry to be displayed. | | node | MinimalNodeEntryEntity | Node entry to be displayed. |
| url | string | File content URL. | | url | string | File content URL. |
| extension | string | File name extension. | | extension | string | File name extension. |
@@ -1304,7 +1297,7 @@ and invoke it from the custom `Open With` menu entry called `Snackbar`.
"id": "plugin1.actions.info", "id": "plugin1.actions.info",
"type": "SNACKBAR_INFO", "type": "SNACKBAR_INFO",
"payload": "I'm a nice little popup raised by extension." "payload": "I'm a nice little popup raised by extension."
}, }
], ],
"features": { "features": {
@@ -1451,10 +1444,10 @@ on how to register your own entries to be re-used at runtime.
In this tutorial, we are going to implement the following features: In this tutorial, we are going to implement the following features:
* update the **Trashcan** component to receive and log route parameters - update the **Trashcan** component to receive and log route parameters
* create a new route that points to the **Trashcan** component and uses main layout - create a new route that points to the **Trashcan** component and uses main layout
* create an action reference that allows redirecting to the new route - create an action reference that allows redirecting to the new route
* create a button in the **New** menu that invokes an action - create a button in the **New** menu that invokes an action
Update `src/app/components/trashcan/trashcan.component.ts` and append the following code to the `ngOnInit` body: Update `src/app/components/trashcan/trashcan.component.ts` and append the following code to the `ngOnInit` body:
@@ -1495,9 +1488,9 @@ Next, add a new route definition as in the example below:
{ {
"id": "custom.routes.trashcan", "id": "custom.routes.trashcan",
"path": "ext/trashcan/:nodeId", "path": "ext/trashcan/:nodeId",
"component": "app.components.trashcan", "component": "your.component.id",
"layout": "app.layout.main", "layout": "app.layout.main",
"auth": [ "app.auth" ] "auth": ["app.auth"]
} }
] ]
} }
@@ -1587,9 +1580,9 @@ ng generate library my-extension
You will get a new project in the `projects/my-extensions` folder. You will get a new project in the `projects/my-extensions` folder.
By default, the project contains at least the following content: By default, the project contains at least the following content:
* Example component `my-extension.component.ts` - Example component `my-extension.component.ts`
* Example service `my-extension.service.ts` - Example service `my-extension.service.ts`
* Angular Module example `my-extension.module.ts` - Angular Module example `my-extension.module.ts`
Next, build the project with the following command: Next, build the project with the following command:
@@ -1611,7 +1604,7 @@ Update `my-extension.module.ts` and put all the content you plan to use at runti
exports: [MyExtensionComponent], exports: [MyExtensionComponent],
entryComponents: [MyExtensionComponent] entryComponents: [MyExtensionComponent]
}) })
export class MyExtensionModule { } export class MyExtensionModule {}
``` ```
Let's now register `MyExtensionComponent` as an extension component. Let's now register `MyExtensionComponent` as an extension component.

View File

@@ -39,26 +39,13 @@ import { ContentModule } from '@alfresco/adf-content-services';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { APP_ROUTES } from './app.routes'; import { APP_ROUTES } from './app.routes';
import { GenericErrorComponent } from './components/generic-error/generic-error.component';
import { FilesComponent } from './components/files/files.component'; import { FilesComponent } from './components/files/files.component';
import { FavoritesComponent } from './components/favorites/favorites.component';
import { LibrariesComponent } from './components/libraries/libraries.component'; import { LibrariesComponent } from './components/libraries/libraries.component';
import { RecentFilesComponent } from './components/recent-files/recent-files.component';
import { SharedFilesComponent } from './components/shared-files/shared-files.component';
import { TrashcanComponent } from './components/trashcan/trashcan.component';
import { LayoutComponent } from './components/layout/layout.component';
import { SidenavViewsManagerDirective } from './components/layout/sidenav-views-manager.directive';
import { CurrentUserComponent } from './components/current-user/current-user.component';
import { SearchInputComponent } from './components/search/search-input/search-input.component';
import { SearchInputControlComponent } from './components/search/search-input-control/search-input-control.component';
import { LocationLinkComponent } from './components/location-link/location-link.component';
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
import { NodeVersionsDialogComponent } from './dialogs/node-versions/node-versions.dialog'; import { NodeVersionsDialogComponent } from './dialogs/node-versions/node-versions.dialog';
import { LibraryDialogComponent } from './dialogs/library/library.dialog'; import { LibraryDialogComponent } from './dialogs/library/library.dialog';
import { ContentManagementService } from './services/content-management.service'; import { ContentManagementService } from './services/content-management.service';
import { NodeActionsService } from './services/node-actions.service'; import { NodeActionsService } from './services/node-actions.service';
import { NodePermissionService } from './services/node-permission.service'; import { NodePermissionService } from './services/node-permission.service';
import { SearchResultsComponent } from './components/search/search-results/search-results.component';
import { ProfileResolver } from './services/profile.resolver'; import { ProfileResolver } from './services/profile.resolver';
import { ExperimentalGuard } from './services/experimental-guard.service'; import { ExperimentalGuard } from './services/experimental-guard.service';
@@ -67,9 +54,6 @@ import { MaterialModule } from './material.module';
import { ContentApiService } from './services/content-api.service'; import { ContentApiService } from './services/content-api.service';
import { AppExtensionsModule } from './extensions.module'; import { AppExtensionsModule } from './extensions.module';
import { CoreExtensionsModule } from './extensions/core.extensions.module'; import { CoreExtensionsModule } from './extensions/core.extensions.module';
import { SearchResultsRowComponent } from './components/search/search-results-row/search-results-row.component';
import { NodePermissionsDialogComponent } from './dialogs/node-permissions/node-permissions.dialog';
import { PermissionsManagerComponent } from './components/permission-manager/permissions-manager.component';
import { AppRouteReuseStrategy } from './app.routes.strategy'; import { AppRouteReuseStrategy } from './app.routes.strategy';
import { AppInfoDrawerModule } from './components/info-drawer/info.drawer.module'; import { AppInfoDrawerModule } from './components/info-drawer/info.drawer.module';
import { DirectivesModule } from './directives/directives.module'; import { DirectivesModule } from './directives/directives.module';
@@ -78,6 +62,13 @@ import { ExtensionsModule } from '@alfresco/adf-extensions';
import { AppToolbarModule } from './components/toolbar/toolbar.module'; import { AppToolbarModule } from './components/toolbar/toolbar.module';
import { AppCreateMenuModule } from './components/create-menu/create-menu.module'; import { AppCreateMenuModule } from './components/create-menu/create-menu.module';
import { AppSidenavModule } from './components/sidenav/sidenav.module'; import { AppSidenavModule } from './components/sidenav/sidenav.module';
import { AppPermissionsModule } from './components/permissions/permissions.module';
import { AppCommonModule } from './components/common/common.module';
import { AppLayoutModule } from './components/layout/layout.module';
import { AppCurrentUserModule } from './components/current-user/current-user.module';
import { AppSearchInputModule } from './components/search/search-input.module';
import { AppSearchResultsModule } from './components/search/search-results.module';
import { AppLoginModule } from './components/login/login.module';
@NgModule({ @NgModule({
imports: [ imports: [
@@ -96,36 +87,26 @@ import { AppSidenavModule } from './components/sidenav/sidenav.module';
CoreExtensionsModule.forRoot(), CoreExtensionsModule.forRoot(),
ExtensionsModule.forRoot(), ExtensionsModule.forRoot(),
AppExtensionsModule, AppExtensionsModule,
AppLoginModule,
AppCommonModule,
AppLayoutModule,
AppCurrentUserModule,
DirectivesModule, DirectivesModule,
ContextMenuModule.forRoot(), ContextMenuModule.forRoot(),
AppInfoDrawerModule, AppInfoDrawerModule,
AppToolbarModule, AppToolbarModule,
AppSidenavModule, AppSidenavModule,
AppCreateMenuModule AppCreateMenuModule,
AppPermissionsModule,
AppSearchInputModule,
AppSearchResultsModule
], ],
declarations: [ declarations: [
AppComponent, AppComponent,
GenericErrorComponent,
LayoutComponent,
SidenavViewsManagerDirective,
CurrentUserComponent,
SearchInputComponent,
SearchInputControlComponent,
FilesComponent, FilesComponent,
FavoritesComponent,
LibrariesComponent, LibrariesComponent,
RecentFilesComponent,
SharedFilesComponent,
TrashcanComponent,
LocationLinkComponent,
SearchResultsRowComponent,
NodeVersionsDialogComponent, NodeVersionsDialogComponent,
LibraryDialogComponent, LibraryDialogComponent
NodePermissionsDialogComponent,
PermissionsManagerComponent,
SearchResultsComponent,
SharedLinkViewComponent
], ],
providers: [ providers: [
{ provide: RouteReuseStrategy, useClass: AppRouteReuseStrategy }, { provide: RouteReuseStrategy, useClass: AppRouteReuseStrategy },
@@ -145,11 +126,7 @@ import { AppSidenavModule } from './components/sidenav/sidenav.module';
ExperimentalGuard, ExperimentalGuard,
ContentApiService ContentApiService
], ],
entryComponents: [ entryComponents: [LibraryDialogComponent, NodeVersionsDialogComponent],
LibraryDialogComponent,
NodeVersionsDialogComponent,
NodePermissionsDialogComponent
],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule {} export class AppModule {}

View File

@@ -25,26 +25,18 @@
import { Routes } from '@angular/router'; import { Routes } from '@angular/router';
import { AuthGuardEcm } from '@alfresco/adf-core'; import { AuthGuardEcm } from '@alfresco/adf-core';
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
import { LayoutComponent } from './components/layout/layout.component'; import { LayoutComponent } from './components/layout/layout.component';
import { FilesComponent } from './components/files/files.component'; import { FilesComponent } from './components/files/files.component';
import { FavoritesComponent } from './components/favorites/favorites.component';
import { LibrariesComponent } from './components/libraries/libraries.component'; import { LibrariesComponent } from './components/libraries/libraries.component';
import { RecentFilesComponent } from './components/recent-files/recent-files.component'; import { GenericErrorComponent } from './components/common/generic-error/generic-error.component';
import { SharedFilesComponent } from './components/shared-files/shared-files.component';
import { TrashcanComponent } from './components/trashcan/trashcan.component';
import { GenericErrorComponent } from './components/generic-error/generic-error.component';
import { SearchResultsComponent } from './components/search/search-results/search-results.component'; import { SearchResultsComponent } from './components/search/search-results/search-results.component';
import { ProfileResolver } from './services/profile.resolver'; import { ProfileResolver } from './services/profile.resolver';
import { LoginComponent } from './components/login/login.component';
export const APP_ROUTES: Routes = [ export const APP_ROUTES: Routes = [
{ {
path: 'login', path: 'login',
loadChildren: 'src/app/components/login/login.module#AppLoginModule', component: LoginComponent,
data: { data: {
title: 'APP.SIGN_IN' title: 'APP.SIGN_IN'
} }
@@ -52,17 +44,12 @@ export const APP_ROUTES: Routes = [
{ {
path: 'settings', path: 'settings',
loadChildren: loadChildren:
'src/app/components/settings/settings.module#AppSettingsModule', 'src/app/components/settings/settings.module#AppSettingsModule'
data: {
title: 'Settings'
}
}, },
{ {
path: 'preview/s/:id', path: 'preview/s/:id',
component: SharedLinkViewComponent, loadChildren:
data: { 'src/app/components/shared-link-view/shared-link-view.module#AppSharedLinkViewModule'
title: 'APP.PREVIEW.TITLE'
}
}, },
{ {
path: '', path: '',
@@ -76,16 +63,11 @@ export const APP_ROUTES: Routes = [
}, },
{ {
path: 'favorites', path: 'favorites',
data: {
sortingPreferenceKey: 'favorites'
},
children: [ children: [
{ {
path: '', path: '',
component: FavoritesComponent, loadChildren:
data: { 'src/app/components/favorites/favorites.module#AppFavoritesModule'
title: 'APP.BROWSE.FAVORITES.TITLE'
}
}, },
{ {
path: 'preview/:nodeId', path: 'preview/:nodeId',
@@ -101,15 +83,13 @@ export const APP_ROUTES: Routes = [
}, },
{ {
path: 'libraries', path: 'libraries',
data: {
sortingPreferenceKey: 'libraries'
},
children: [ children: [
{ {
path: '', path: '',
component: LibrariesComponent, component: LibrariesComponent,
data: { data: {
title: 'APP.BROWSE.LIBRARIES.TITLE' title: 'APP.BROWSE.LIBRARIES.TITLE',
sortingPreferenceKey: 'libraries'
} }
}, },
{ {
@@ -183,10 +163,8 @@ export const APP_ROUTES: Routes = [
children: [ children: [
{ {
path: '', path: '',
component: RecentFilesComponent, loadChildren:
data: { 'src/app/components/recent-files/recent-files.module#AppRecentFilesModule'
title: 'APP.BROWSE.RECENT.TITLE'
}
}, },
{ {
path: 'preview/:nodeId', path: 'preview/:nodeId',
@@ -202,16 +180,11 @@ export const APP_ROUTES: Routes = [
}, },
{ {
path: 'shared', path: 'shared',
data: {
sortingPreferenceKey: 'shared-files'
},
children: [ children: [
{ {
path: '', path: '',
component: SharedFilesComponent, loadChildren:
data: { 'src/app/components/shared-files/shared-files.module#AppSharedFilesModule'
title: 'APP.BROWSE.SHARED.TITLE'
}
}, },
{ {
path: 'preview/:nodeId', path: 'preview/:nodeId',
@@ -227,18 +200,12 @@ export const APP_ROUTES: Routes = [
}, },
{ {
path: 'trashcan', path: 'trashcan',
component: TrashcanComponent, loadChildren:
data: { 'src/app/components/trashcan/trashcan.module#AppTrashcanModule'
title: 'APP.BROWSE.TRASHCAN.TITLE',
sortingPreferenceKey: 'trashcan'
}
}, },
{ {
path: 'about', path: 'about',
loadChildren: 'src/app/components/about/about.module#AboutModule', loadChildren: 'src/app/components/about/about.module#AboutModule'
data: {
title: 'APP.BROWSE.ABOUT.TITLE'
}
}, },
{ {
path: 'search', path: 'search',

View File

@@ -32,7 +32,10 @@ import { CoreModule } from '@alfresco/adf-core';
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: AboutComponent component: AboutComponent,
data: {
title: 'APP.BROWSE.ABOUT.TITLE'
}
} }
]; ];

View File

@@ -0,0 +1,37 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GenericErrorComponent } from './generic-error/generic-error.component';
import { CoreModule } from '@alfresco/adf-core';
import { LocationLinkComponent } from './location-link/location-link.component';
@NgModule({
imports: [CommonModule, CoreModule.forChild()],
declarations: [GenericErrorComponent, LocationLinkComponent],
exports: [GenericErrorComponent, LocationLinkComponent]
})
export class AppCommonModule {}

View File

@@ -35,9 +35,9 @@ import { PathInfo, MinimalNodeEntity } from 'alfresco-js-api';
import { Observable, BehaviorSubject, of } from 'rxjs'; import { Observable, BehaviorSubject, of } from 'rxjs';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { AppStore } from '../../store/states/app.state'; import { AppStore } from '../../../store/states/app.state';
import { NavigateToParentFolder } from '../../store/actions'; import { NavigateToParentFolder } from '../../../store/actions';
import { ContentApiService } from '../../services/content-api.service'; import { ContentApiService } from '../../../services/content-api.service';
@Component({ @Component({
selector: 'aca-location-link', selector: 'aca-location-link',

View File

@@ -30,7 +30,6 @@ import {
MatIconModule, MatIconModule,
MatButtonModule MatButtonModule
} from '@angular/material'; } from '@angular/material';
import { BrowserModule } from '@angular/platform-browser';
import { CoreModule } from '@alfresco/adf-core'; import { CoreModule } from '@alfresco/adf-core';
import { CoreExtensionsModule } from '../../extensions/core.extensions.module'; import { CoreExtensionsModule } from '../../extensions/core.extensions.module';
@@ -47,7 +46,6 @@ import { OutsideEventDirective } from './context-menu-outside-event.directive';
MatListModule, MatListModule,
MatIconModule, MatIconModule,
MatButtonModule, MatButtonModule,
BrowserModule,
CoreExtensionsModule.forChild(), CoreExtensionsModule.forChild(),
CoreModule.forChild(), CoreModule.forChild(),
ExtensionsModule.forChild() ExtensionsModule.forChild()

View File

@@ -0,0 +1,37 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { CurrentUserComponent } from './current-user.component';
import { RouterModule } from '@angular/router';
@NgModule({
imports: [CommonModule, CoreModule.forChild(), RouterModule],
declarations: [CurrentUserComponent],
exports: [CurrentUserComponent]
})
export class AppCurrentUserModule {}

View File

@@ -0,0 +1,64 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { FavoritesComponent } from './favorites.component';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { RouterModule, Routes } from '@angular/router';
import { ContentModule } from '@alfresco/adf-content-services';
import { DirectivesModule } from '../../directives/directives.module';
import { AppCommonModule } from '../common/common.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { ContextMenuModule } from '../context-menu/context-menu.module';
import { AppInfoDrawerModule } from '../info-drawer/info.drawer.module';
const routes: Routes = [
{
path: '',
component: FavoritesComponent,
data: {
title: 'APP.BROWSE.FAVORITES.TITLE',
sortingPreferenceKey: 'favorites'
}
}
];
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
ContentModule.forChild(),
DirectivesModule,
AppCommonModule,
AppToolbarModule,
ContextMenuModule.forChild(),
AppInfoDrawerModule
],
declarations: [FavoritesComponent],
exports: [FavoritesComponent]
})
export class AppFavoritesModule {}

View File

@@ -0,0 +1,52 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { LayoutComponent } from './layout.component';
import { SidenavViewsManagerDirective } from './sidenav-views-manager.directive';
import { ContentModule } from '@alfresco/adf-content-services';
import { RouterModule } from '@angular/router';
import { AppSidenavModule } from '../sidenav/sidenav.module';
import { AppCommonModule } from '../common/common.module';
import { AppCurrentUserModule } from '../current-user/current-user.module';
import { AppSearchInputModule } from '../search/search-input.module';
@NgModule({
imports: [
CommonModule,
RouterModule,
CoreModule.forChild(),
ContentModule.forChild(),
AppCommonModule,
AppSidenavModule,
AppCurrentUserModule,
AppSearchInputModule
],
declarations: [LayoutComponent, SidenavViewsManagerDirective],
exports: [LayoutComponent]
})
export class AppLayoutModule {}

View File

@@ -27,17 +27,9 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core'; import { CoreModule } from '@alfresco/adf-core';
import { LoginComponent } from './login.component'; import { LoginComponent } from './login.component';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{
path: '',
component: LoginComponent
}
];
@NgModule({ @NgModule({
imports: [CommonModule, CoreModule.forChild(), RouterModule.forChild(routes)], imports: [CommonModule, CoreModule.forChild()],
declarations: [LoginComponent] declarations: [LoginComponent]
}) })
export class AppLoginModule {} export class AppLoginModule {}

View File

@@ -1,6 +1,6 @@
<header mat-dialog-title>{{'PERMISSIONS.DIALOG.TITLE' | translate}}</header> <header mat-dialog-title>{{'PERMISSIONS.DIALOG.TITLE' | translate}}</header>
<section mat-dialog-content> <section mat-dialog-content>
<aca-permissions-manager [nodeId]="nodeId"></aca-permissions-manager> <app-permission-manager [nodeId]="nodeId"></app-permission-manager>
</section> </section>
<footer mat-dialog-actions> <footer mat-dialog-actions>
<button mat-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>{{'PERMISSIONS.DIALOG.CLOSE' | translate}}</button> <button mat-button color="primary" [mat-dialog-close]="true" cdkFocusInitial>{{'PERMISSIONS.DIALOG.CLOSE' | translate}}</button>

View File

@@ -1,4 +1,4 @@
@mixin aca-permissions-manager-theme($theme) { @mixin app-permission-manager-theme($theme) {
$foreground: map-get($theme, foreground); $foreground: map-get($theme, foreground);
$accent: map-get($theme, accent); $accent: map-get($theme, accent);

View File

@@ -23,22 +23,22 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>. * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { import {
NodePermissionDialogService, NodePermissionDialogService,
PermissionListComponent PermissionListComponent
} from '@alfresco/adf-content-services'; } from '@alfresco/adf-content-services';
import { MinimalNodeEntryEntity } from 'alfresco-js-api'; import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { Store } from '@ngrx/store';
import { AppStore } from '../../store/states/app.state';
import { SnackbarErrorAction } from '../../store/actions/snackbar.actions';
import { NodePermissionsDialogComponent } from '../../dialogs/node-permissions/node-permissions.dialog';
import { MatDialog } from '@angular/material'; import { MatDialog } from '@angular/material';
import { ContentApiService } from '../../services/content-api.service'; import { Store } from '@ngrx/store';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { ContentApiService } from '../../../services/content-api.service';
import { SnackbarErrorAction } from '../../../store/actions/snackbar.actions';
import { AppStore } from '../../../store/states/app.state';
import { NodePermissionsDialogComponent } from '../permission-dialog/node-permissions.dialog';
@Component({ @Component({
selector: 'aca-permissions-manager', selector: 'app-permission-manager',
templateUrl: './permissions-manager.component.html' templateUrl: './permission-manager.component.html'
}) })
export class PermissionsManagerComponent implements OnInit { export class PermissionsManagerComponent implements OnInit {
@ViewChild('permissionList') @ViewChild('permissionList')

View File

@@ -0,0 +1,39 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { ContentModule } from '@alfresco/adf-content-services';
import { NodePermissionsDialogComponent } from './permission-dialog/node-permissions.dialog';
import { PermissionsManagerComponent } from './permission-manager/permission-manager.component';
@NgModule({
imports: [CommonModule, CoreModule.forChild(), ContentModule.forChild()],
declarations: [PermissionsManagerComponent, NodePermissionsDialogComponent],
exports: [PermissionsManagerComponent, NodePermissionsDialogComponent],
entryComponents: [NodePermissionsDialogComponent]
})
export class AppPermissionsModule {}

View File

@@ -0,0 +1,63 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { RouterModule, Routes } from '@angular/router';
import { ContentModule } from '@alfresco/adf-content-services';
import { DirectivesModule } from '../../directives/directives.module';
import { AppCommonModule } from '../common/common.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { ContextMenuModule } from '../context-menu/context-menu.module';
import { RecentFilesComponent } from './recent-files.component';
import { AppInfoDrawerModule } from '../info-drawer/info.drawer.module';
const routes: Routes = [
{
path: '',
component: RecentFilesComponent,
data: {
title: 'APP.BROWSE.RECENT.TITLE'
}
}
];
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
ContentModule.forChild(),
DirectivesModule,
AppCommonModule,
AppToolbarModule,
ContextMenuModule.forChild(),
AppInfoDrawerModule
],
declarations: [RecentFilesComponent],
exports: [RecentFilesComponent]
})
export class AppRecentFilesModule {}

View File

@@ -0,0 +1,38 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { SearchInputComponent } from './search-input/search-input.component';
import { SearchInputControlComponent } from './search-input-control/search-input-control.component';
import { ContentModule } from '@alfresco/adf-content-services';
@NgModule({
imports: [CommonModule, CoreModule.forChild(), ContentModule.forChild()],
declarations: [SearchInputComponent, SearchInputControlComponent],
exports: [SearchInputComponent, SearchInputControlComponent]
})
export class AppSearchInputModule {}

View File

@@ -0,0 +1,48 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { ContentModule } from '@alfresco/adf-content-services';
import { SearchResultsComponent } from './search-results/search-results.component';
import { SearchResultsRowComponent } from './search-results-row/search-results-row.component';
import { AppInfoDrawerModule } from '../info-drawer/info.drawer.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { AppCommonModule } from '../common/common.module';
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
ContentModule.forChild(),
AppCommonModule,
AppInfoDrawerModule,
AppToolbarModule
],
declarations: [SearchResultsComponent, SearchResultsRowComponent],
exports: [SearchResultsComponent, SearchResultsRowComponent]
})
export class AppSearchResultsModule {}

View File

@@ -32,7 +32,10 @@ import { CoreModule } from '@alfresco/adf-core';
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: SettingsComponent component: SettingsComponent,
data: {
title: 'Settings'
}
} }
]; ];

View File

@@ -0,0 +1,64 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { SharedFilesComponent } from './shared-files.component';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { RouterModule, Routes } from '@angular/router';
import { ContentModule } from '@alfresco/adf-content-services';
import { DirectivesModule } from '../../directives/directives.module';
import { AppCommonModule } from '../common/common.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { ContextMenuModule } from '../context-menu/context-menu.module';
import { AppInfoDrawerModule } from '../info-drawer/info.drawer.module';
const routes: Routes = [
{
path: '',
component: SharedFilesComponent,
data: {
title: 'APP.BROWSE.SHARED.TITLE',
sortingPreferenceKey: 'shared-files'
}
}
];
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
ContentModule.forChild(),
DirectivesModule,
AppCommonModule,
AppToolbarModule,
ContextMenuModule.forChild(),
AppInfoDrawerModule
],
declarations: [SharedFilesComponent],
exports: [SharedFilesComponent]
})
export class AppSharedFilesModule {}

View File

@@ -0,0 +1,59 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { SharedLinkViewComponent } from './shared-link-view.component';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { RouterModule, Routes } from '@angular/router';
import { DirectivesModule } from '../../directives/directives.module';
import { AppCommonModule } from '../common/common.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { AppInfoDrawerModule } from '../info-drawer/info.drawer.module';
const routes: Routes = [
{
path: '',
component: SharedLinkViewComponent,
data: {
title: 'APP.PREVIEW.TITLE'
}
}
];
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
DirectivesModule,
AppCommonModule,
AppToolbarModule,
AppInfoDrawerModule
],
declarations: [SharedLinkViewComponent],
exports: [SharedLinkViewComponent]
})
export class AppSharedLinkViewModule {}

View File

@@ -0,0 +1,62 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { TrashcanComponent } from './trashcan.component';
import { Routes, RouterModule } from '@angular/router';
import { ContentModule } from '@alfresco/adf-content-services';
import { AppCommonModule } from '../common/common.module';
import { AppToolbarModule } from '../toolbar/toolbar.module';
import { DirectivesModule } from '../../directives/directives.module';
import { ContextMenuModule } from '../context-menu/context-menu.module';
const routes: Routes = [
{
path: '',
component: TrashcanComponent,
data: {
title: 'APP.BROWSE.TRASHCAN.TITLE',
sortingPreferenceKey: 'trashcan'
}
}
];
@NgModule({
imports: [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
ContentModule.forChild(),
DirectivesModule,
AppCommonModule,
AppToolbarModule,
ContextMenuModule.forChild()
],
declarations: [TrashcanComponent],
exports: [TrashcanComponent]
})
export class AppTrashcanModule {}

View File

@@ -27,7 +27,6 @@ import { AuthGuardEcm, CoreModule } from '@alfresco/adf-core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
import { LayoutComponent } from '../components/layout/layout.component'; import { LayoutComponent } from '../components/layout/layout.component';
import { TrashcanComponent } from '../components/trashcan/trashcan.component';
import * as app from './evaluators/app.evaluators'; import * as app from './evaluators/app.evaluators';
import * as nav from './evaluators/navigation.evaluators'; import * as nav from './evaluators/navigation.evaluators';
import { AppExtensionService } from './extension.service'; import { AppExtensionService } from './extension.service';
@@ -70,7 +69,6 @@ export class CoreExtensionsModule {
constructor(extensions: ExtensionService) { constructor(extensions: ExtensionService) {
extensions.setComponents({ extensions.setComponents({
'app.layout.main': LayoutComponent, 'app.layout.main': LayoutComponent,
'app.components.trashcan': TrashcanComponent,
'app.components.tabs.metadata': MetadataTabComponent, 'app.components.tabs.metadata': MetadataTabComponent,
'app.components.tabs.comments': CommentsTabComponent, 'app.components.tabs.comments': CommentsTabComponent,
'app.components.tabs.versions': VersionsTabComponent, 'app.components.tabs.versions': VersionsTabComponent,

View File

@@ -58,9 +58,9 @@ import { ContentApiService } from './content-api.service';
import { sharedUrl } from '../store/selectors/app.selectors'; import { sharedUrl } from '../store/selectors/app.selectors';
import { NodeActionsService } from './node-actions.service'; import { NodeActionsService } from './node-actions.service';
import { TranslationService } from '@alfresco/adf-core'; import { TranslationService } from '@alfresco/adf-core';
import { NodePermissionsDialogComponent } from '../dialogs/node-permissions/node-permissions.dialog';
import { NodeVersionsDialogComponent } from '../dialogs/node-versions/node-versions.dialog'; import { NodeVersionsDialogComponent } from '../dialogs/node-versions/node-versions.dialog';
import { take, map, tap, mergeMap, catchError } from 'rxjs/operators'; import { take, map, tap, mergeMap, catchError } from 'rxjs/operators';
import { NodePermissionsDialogComponent } from '../components/permissions/permission-dialog/node-permissions.dialog';
interface RestoredNode { interface RestoredNode {
status: number; status: number;

View File

@@ -3,11 +3,11 @@
@import '../components/sidenav/sidenav.component.theme'; @import '../components/sidenav/sidenav.component.theme';
@import '../components/about/about.component.theme'; @import '../components/about/about.component.theme';
@import '../components/generic-error/generic-error.component.theme'; @import '../components/common/generic-error/generic-error.component.theme';
@import '../components/search/search-input/search-input.component.theme'; @import '../components/search/search-input/search-input.component.theme';
@import '../components/settings/settings.component.theme'; @import '../components/settings/settings.component.theme';
@import '../components/current-user/current-user.component.theme'; @import '../components/current-user/current-user.component.theme';
@import '../components/permission-manager/permissions-manager.component.theme'; @import '../components/permissions/permission-manager/permission-manager.component.theme';
@import '../components/context-menu/context-menu.component.theme'; @import '../components/context-menu/context-menu.component.theme';
@import '../dialogs/node-versions/node-versions.dialog.theme'; @import '../dialogs/node-versions/node-versions.dialog.theme';
@@ -87,7 +87,7 @@ $custom-theme: mat-light-theme($custom-theme-primary, $custom-theme-accent);
@include aca-layout-theme($theme); @include aca-layout-theme($theme);
@include aca-search-input-theme($theme); @include aca-search-input-theme($theme);
@include aca-generic-error-theme($theme); @include aca-generic-error-theme($theme);
@include aca-permissions-manager-theme($theme); @include app-permission-manager-theme($theme);
@include aca-node-versions-dialog-theme($theme); @include aca-node-versions-dialog-theme($theme);
@include aca-settings-theme($theme); @include aca-settings-theme($theme);
@include snackbar-theme($theme); @include snackbar-theme($theme);

View File

@@ -2,12 +2,7 @@
"$schema": "../../extension.schema.json", "$schema": "../../extension.schema.json",
"$name": "app", "$name": "app",
"$version": "1.0.0", "$version": "1.0.0",
"$references": [ "$references": ["plugin1.json", "dev.tools.json", "my-extension.json"],
"plugin1.json",
"plugin2.json",
"dev.tools.json",
"my-extension.json"
],
"rules": [ "rules": [
{ {

View File

@@ -1,42 +0,0 @@
{
"$schema": "../../../extension.schema.json",
"$version": "1.0.0",
"$name": "plugin2",
"$description": "demo plugin",
"routes": [
{
"id": "plugin2.routes.about",
"path": "ext/bin",
"component": "app.components.trashcan",
"data": {
"title": "Custom Trashcan"
}
}
],
"features": {
"navbar": [
{
"id": "plugin2.navbar.group1",
"disabled": true,
"items": [
{
"id": "plugin2.navbar.group1.link1",
"icon": "build",
"title": "Trashcan (native)",
"description": "Uses native application route",
"route": "trashcan"
},
{
"id": "plugin2.navbar.group1.link2",
"icon": "build",
"title": "Trashcan (custom)",
"description": "Uses custom defined route",
"route": "plugin2.routes.about"
}
]
}
]
}
}