diff --git a/demo-shell-ng2/app/components/files/files.component.html b/demo-shell-ng2/app/components/files/files.component.html index 119653aa46..e99f78a2c9 100644 --- a/demo-shell-ng2/app/components/files/files.component.html +++ b/demo-shell-ng2/app/components/files/files.component.html @@ -92,6 +92,10 @@ + + diff --git a/demo-shell-ng2/app/components/files/files.component.ts b/demo-shell-ng2/app/components/files/files.component.ts index d10605b54e..828f9f5181 100644 --- a/demo-shell-ng2/app/components/files/files.component.ts +++ b/demo-shell-ng2/app/components/files/files.component.ts @@ -25,8 +25,10 @@ import { MDL, AlfrescoContentService, CONTEXT_MENU_DIRECTIVES, - AlfrescoPipeTranslate + AlfrescoPipeTranslate/*, + PaginationComponent*/ } from 'ng2-alfresco-core'; +import { PaginationComponent } from 'ng2-alfresco-core'; import { ALFRESCO_ULPOAD_COMPONENTS } from 'ng2-alfresco-upload'; import { VIEWERCOMPONENT } from 'ng2-alfresco-viewer'; @@ -42,7 +44,8 @@ declare let __moduleName: string; MDL, ALFRESCO_ULPOAD_COMPONENTS, VIEWERCOMPONENT, - CONTEXT_MENU_DIRECTIVES + CONTEXT_MENU_DIRECTIVES, + PaginationComponent ], providers: [DOCUMENT_LIST_PROVIDERS], pipes: [AlfrescoPipeTranslate] diff --git a/ng2-components/ng2-alfresco-core/.gitignore b/ng2-components/ng2-alfresco-core/.gitignore index bf980cac93..13324e66b9 100644 --- a/ng2-components/ng2-alfresco-core/.gitignore +++ b/ng2-components/ng2-alfresco-core/.gitignore @@ -11,5 +11,5 @@ demo/**/*.js demo/**/*.js.map demo/**/*.d.ts index.js -index.map +index.js.map !systemjs.config.js diff --git a/ng2-components/ng2-alfresco-core/index.js.map b/ng2-components/ng2-alfresco-core/index.js.map deleted file mode 100644 index 1015c095d3..0000000000 --- a/ng2-components/ng2-alfresco-core/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;;;;;QAwBU,uBAAuB,EAUvB,sBAAsB,EAItB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAdvB,qCAAA,uBAAuB,GAAU;gBAC1C,qEAA6B;gBAC7B,uDAAsB;gBACtB,yDAAuB;gBACvB,6DAAyB;gBACzB,+DAA0B;gBAC1B,qDAAqB;gBACrB,yCAAkB;aACrB,CAAA,CAAC;YAEW,oCAAA,sBAAsB,GAAU;gBACzC,yCAAkB;aACrB,CAAA,CAAC;YAEW,qCAAA,uBAAuB,GAAU;gBAC1C,0DAA0B;gBAC1B,6CAAoB;aACvB,CAAA,CAAC"} \ No newline at end of file diff --git a/ng2-components/ng2-alfresco-core/index.ts b/ng2-components/ng2-alfresco-core/index.ts index 5c70878787..231df2fe5b 100644 --- a/ng2-components/ng2-alfresco-core/index.ts +++ b/ng2-components/ng2-alfresco-core/index.ts @@ -15,29 +15,20 @@ * limitations under the License. */ -import { AlfrescoSettingsService } from './src/services/AlfrescoSettingsService.service'; -import { AlfrescoTranslationLoader } from './src/services/AlfrescoTranslationLoader.service'; -import { AlfrescoTranslationService } from './src/services/AlfrescoTranslationService.service'; -import { AlfrescoPipeTranslate } from './src/services/AlfrescoPipeTranslate.service'; -import { AlfrescoAuthenticationService } from './src/services/AlfrescoAuthenticationService.service'; -import { AlfrescoContentService } from './src/services/AlfrescoContentService.service'; -import { ContextMenuService } from './src/services/context-menu.service'; -import { ContextMenuHolderComponent } from './src/components/context-menu-holder.component'; -import { ContextMenuDirective } from './src/components/context-menu.directive'; +import { + AlfrescoSettingsService, + AlfrescoTranslationLoader, + AlfrescoTranslationService, + AlfrescoPipeTranslate, + AlfrescoAuthenticationService, + AlfrescoContentService +} from './src/services/index'; -export * from './src/services/AlfrescoSettingsService.service'; -export * from './src/services/AlfrescoTranslationLoader.service'; -export * from './src/services/AlfrescoTranslationService.service'; -export * from './src/services/AlfrescoPipeTranslate.service'; -export * from './src/material/MaterialDesignLiteUpgradeElement'; -export * from './src/services/AlfrescoAuthenticationService.service'; -export * from './src/services/AlfrescoContentService.service'; +import { ContextMenuService } from './src/components/context-menu/context-menu.service'; -export * from './src/services/context-menu.service'; -export * from './src/components/context-menu-holder.component'; -export * from './src/components/context-menu.directive'; - -export * from './src/utils/object-utils'; +export * from './src/services/index'; +export * from './src/components/index'; +export * from './src/utils/index'; export const ALFRESCO_CORE_PROVIDERS: [any] = [ AlfrescoAuthenticationService, @@ -49,12 +40,3 @@ export const ALFRESCO_CORE_PROVIDERS: [any] = [ ContextMenuService ]; -export const CONTEXT_MENU_PROVIDERS: [any] = [ - ContextMenuService -]; - -export const CONTEXT_MENU_DIRECTIVES: [any] = [ - ContextMenuHolderComponent, - ContextMenuDirective -]; - diff --git a/ng2-components/ng2-alfresco-core/package.json b/ng2-components/ng2-alfresco-core/package.json index 873eebc038..349d0ee108 100644 --- a/ng2-components/ng2-alfresco-core/package.json +++ b/ng2-components/ng2-alfresco-core/package.json @@ -6,13 +6,15 @@ "scripts": { "clean": "rimraf dist node_modules typings", "typings": "typings install", - "build": "npm run tslint && typings install && rimraf dist && tsc && license-check", - "build:w": "npm run tslint && typings install && rimraf dist && npm run watch-task", + "build": "npm run tslint && typings install && rimraf dist && tsc && npm run copy-static && license-check", + "build:w": "npm run tslint && typings install && rimraf dist && tsc && npm run copy-static:w && npm run watch-task", "watch-task": "concurrently \"npm run tsc:w\" \"license-check\"", "tslint": "npm run tslint-src && npm run tslint-root", "tslint-src": "tslint -c tslint.json src/{,**/}**.ts", "tslint-root": "tslint -c tslint.json *.ts", "licensecheck": "license-check", + "copy-static": "cpx \"./src/**/*.{html,css}\" ./dist/src", + "copy-static:w": "cpx \"./src/**/*.{html,css}\" ./dist/src -w", "tsc": "tsc", "tsc:w": "tsc -w", "pretest": "npm run build", diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.spec.ts similarity index 97% rename from ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.spec.ts index 496fac21e7..5ac723cc3d 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.spec.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.spec.ts @@ -16,7 +16,7 @@ */ import { describe, it, beforeEach } from '@angular/core/testing'; -import { ContextMenuService } from './../services/context-menu.service'; +import { ContextMenuService } from './context-menu.service'; import { ContextMenuHolderComponent } from './context-menu-holder.component'; describe('ContextMenuHolderComponent', () => { diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.ts similarity index 97% rename from ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.ts index 40a3d9960f..9f406ed117 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu-holder.component.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu-holder.component.ts @@ -16,7 +16,7 @@ */ import { Component, HostListener } from '@angular/core'; -import { ContextMenuService } from './../services/context-menu.service'; +import { ContextMenuService } from './context-menu.service'; @Component({ selector:'context-menu-holder', diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.spec.ts similarity index 96% rename from ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.spec.ts index 7c1e56ccb9..b8b7b169f1 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.spec.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.spec.ts @@ -17,7 +17,7 @@ import { describe, it, beforeEach } from '@angular/core/testing'; import { ContextMenuDirective } from './context-menu.directive'; -import { ContextMenuService } from './../services/context-menu.service'; +import { ContextMenuService } from './context-menu.service'; describe('ContextMenuDirective', () => { diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.ts similarity index 94% rename from ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.ts index 05be1f4309..2859e76cd7 100644 --- a/ng2-components/ng2-alfresco-core/src/components/context-menu.directive.ts +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.directive.ts @@ -16,7 +16,7 @@ */ import { Directive, Input, HostListener } from '@angular/core'; -import { ContextMenuService } from './../services/context-menu.service'; +import { ContextMenuService } from './context-menu.service'; @Directive({ selector:'[context-menu]' diff --git a/ng2-components/ng2-alfresco-core/src/services/context-menu.service.spec.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.service.spec.ts similarity index 100% rename from ng2-components/ng2-alfresco-core/src/services/context-menu.service.spec.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.service.spec.ts diff --git a/ng2-components/ng2-alfresco-core/src/services/context-menu.service.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.service.ts similarity index 100% rename from ng2-components/ng2-alfresco-core/src/services/context-menu.service.ts rename to ng2-components/ng2-alfresco-core/src/components/context-menu/context-menu.service.ts diff --git a/ng2-components/ng2-alfresco-core/src/components/context-menu/index.ts b/ng2-components/ng2-alfresco-core/src/components/context-menu/index.ts new file mode 100644 index 0000000000..a6b21baf9d --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/context-menu/index.ts @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ContextMenuService } from './context-menu.service'; +import { ContextMenuHolderComponent } from './context-menu-holder.component'; +import { ContextMenuDirective } from './context-menu.directive'; + +export * from './context-menu.service'; +export * from './context-menu-holder.component'; +export * from './context-menu.directive'; + +export const CONTEXT_MENU_PROVIDERS: [any] = [ + ContextMenuService +]; + +export const CONTEXT_MENU_DIRECTIVES: [any] = [ + ContextMenuHolderComponent, + ContextMenuDirective +]; diff --git a/ng2-components/ng2-alfresco-core/src/components/index.ts b/ng2-components/ng2-alfresco-core/src/components/index.ts new file mode 100644 index 0000000000..7c6259e8a1 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/index.ts @@ -0,0 +1,20 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './context-menu/index'; +export * from './material/index'; +export * from './pagination/index'; diff --git a/ng2-components/ng2-alfresco-core/src/material/MaterialDesignLiteUpgradeElement.ts b/ng2-components/ng2-alfresco-core/src/components/material/MaterialDesignLiteUpgradeElement.ts similarity index 100% rename from ng2-components/ng2-alfresco-core/src/material/MaterialDesignLiteUpgradeElement.ts rename to ng2-components/ng2-alfresco-core/src/components/material/MaterialDesignLiteUpgradeElement.ts diff --git a/ng2-components/ng2-alfresco-core/src/components/material/index.ts b/ng2-components/ng2-alfresco-core/src/components/material/index.ts new file mode 100644 index 0000000000..63ce268538 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/material/index.ts @@ -0,0 +1,30 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MDL } from './MaterialDesignLiteUpgradeElement'; +import { AlfrescoMdlButtonDirective } from './mdl-button.directive'; +import { AlfrescoMdlMenuDirective } from './mdl-menu.directive'; + +export * from './MaterialDesignLiteUpgradeElement'; +export * from './mdl-button.directive'; +export * from './mdl-menu.directive'; + +export const MATERIAL_DESIGN_DIRECTIVES: [any] = [ + MDL, + AlfrescoMdlButtonDirective, + AlfrescoMdlMenuDirective +]; diff --git a/ng2-components/ng2-alfresco-core/src/components/material/mdl-button.directive.ts b/ng2-components/ng2-alfresco-core/src/components/material/mdl-button.directive.ts new file mode 100644 index 0000000000..96f82aad74 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/material/mdl-button.directive.ts @@ -0,0 +1,38 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Directive, ElementRef, AfterViewInit } from '@angular/core'; + +declare var componentHandler; + +@Directive({ + selector: '[alfresco-mdl-button]' +}) +export class AlfrescoMdlButtonDirective implements AfterViewInit { + + constructor(private element: ElementRef) {} + + ngAfterViewInit() { + if (componentHandler) { + let el = this.element.nativeElement; + el.classList.add('mdl-button'); + el.classList.add('mdl-js-button'); + el.classList.add('mdl-js-ripple-effect'); + componentHandler.upgradeElement(el, 'MaterialButton'); + } + } +} diff --git a/ng2-components/ng2-alfresco-core/src/components/material/mdl-menu.directive.ts b/ng2-components/ng2-alfresco-core/src/components/material/mdl-menu.directive.ts new file mode 100644 index 0000000000..370665234b --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/material/mdl-menu.directive.ts @@ -0,0 +1,38 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Directive, ElementRef, AfterViewInit } from '@angular/core'; + +declare var componentHandler; + +@Directive({ + selector: '[alfresco-mdl-menu]' +}) +export class AlfrescoMdlMenuDirective implements AfterViewInit { + + constructor(private element: ElementRef) {} + + ngAfterViewInit() { + if (componentHandler) { + let el = this.element.nativeElement; + el.classList.add('mdl-menu'); + el.classList.add('mdl-js-menu'); + el.classList.add('mdl-js-ripple-effect'); + componentHandler.upgradeElement(el, 'MaterialMenu'); + } + } +} diff --git a/ng2-components/ng2-alfresco-core/src/components/pagination/index.ts b/ng2-components/ng2-alfresco-core/src/components/pagination/index.ts new file mode 100644 index 0000000000..9e25a61495 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/pagination/index.ts @@ -0,0 +1,19 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './pagination-provider'; +export * from './pagination.component'; diff --git a/ng2-components/ng2-alfresco-core/src/components/pagination/pagination-provider.ts b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination-provider.ts new file mode 100644 index 0000000000..c4e58a66e9 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination-provider.ts @@ -0,0 +1,47 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface PaginationProvider { + + /** + * The number of objects in the collection. + */ + count: number; + + /** + * A boolean value which is true if there are more entities in the collection beyond those in this response. + * A true value means a request with a larger value for the skipCount or the maxItems parameter will return more entities. + */ + hasMoreItems: boolean; + + /** + * An integer describing the total number of entities in the collection. + * The API might not be able to determine this value, in which case this property will not be present. + */ + totalItems?: number; + + /** + * An integer describing how many entities exist in the collection before those included in this list. + */ + skipCount: number; + + /** + * The value of the maxItems parameter used to generate this list, + * or if there was no maxItems parameter the default value is 100. + */ + maxItems: number; +} diff --git a/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.css b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.css new file mode 100644 index 0000000000..221ad85823 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.css @@ -0,0 +1,64 @@ +.mdl-paging { + color: rgba(0, 0, 0, 0.54); + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 56px; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; +} + +.mdl-paging > * { + -webkit-flex: none; + -ms-flex: none; + flex: none; +} + +.mdl-list + .mdl-paging { + margin: 0; +} + +.mdl-paging__per-page { + position: relative; +} + +.mdl-paging__per-page-label { + margin-right: 40px; +} + +.mdl-paging__per-page-value { + position: absolute; + right: 36px; + top: 6px; +} + +.mdl-paging__per-page + .mdl-paging__count { + margin-left: 24px; +} + +.mdl-paging .mdl-menu { + min-width: 64px; +} + +.mdl-paging__prev:last-child { + margin-right: 44px; +} + +.mdl-paging__count + .mdl-paging__prev { + margin-left: 24px; +} + +.mdl-paging__prev + .mdl-paging__next { + margin-left: 12px; +} + +.mdl-paging__count + .mdl-paging__next { + margin-left: 68px; +} diff --git a/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.html b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.html new file mode 100644 index 0000000000..0a39c8858e --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.html @@ -0,0 +1,27 @@ +
+ + Rows per page: + {{pageSize}} + + + + {{summary}} + + +
diff --git a/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.ts b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.ts new file mode 100644 index 0000000000..01a5c2bb08 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/components/pagination/pagination.component.ts @@ -0,0 +1,86 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, Input } from '@angular/core'; + +import { MATERIAL_DESIGN_DIRECTIVES } from './../material/index'; +import { PaginationProvider } from './pagination-provider'; + +declare let __moduleName: string; + +@Component({ + moduleId: __moduleName, + selector: 'alfresco-pagination', + templateUrl: './pagination.component.html', + styleUrls: ['./pagination.component.css'], + directives: [MATERIAL_DESIGN_DIRECTIVES] +}) +export class PaginationComponent { + + DEFAULT_PAGE_SIZE: number = 20; + + @Input() + supportedPageSizes: number[] = [5, 10, 20, 50, 100]; + + @Input() + provider: PaginationProvider; + + get pageSize(): number { + if (this.provider) { + return this.provider.maxItems; + } + return this.DEFAULT_PAGE_SIZE; + } + + set pageSize(value: number) { + if (this.provider) { + this.provider.maxItems = value; + } + } + + setPageSize(value: number) { + this.pageSize = value; + } + + get summary(): string { + let from = this.provider.skipCount; + if (from === 0) { + from = 1; + } + let to = this.provider.skipCount + this.provider.count; + let of = this.provider.totalItems; + return `${from}-${to} of ${of}`; + } + + get nextPageAvail(): boolean { + return this.provider.hasMoreItems; + } + + get prevPageAvail(): boolean { + return this.provider.skipCount > 0; + } + + showNextPage() { + this.provider.skipCount += this.provider.maxItems; + } + + showPrevPage() { + this.provider.skipCount -= this.provider.maxItems; + } +} + + diff --git a/ng2-components/ng2-alfresco-core/src/services/index.ts b/ng2-components/ng2-alfresco-core/src/services/index.ts new file mode 100644 index 0000000000..bdde5bffd4 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/services/index.ts @@ -0,0 +1,23 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './AlfrescoSettingsService.service'; +export * from './AlfrescoTranslationLoader.service'; +export * from './AlfrescoTranslationService.service'; +export * from './AlfrescoPipeTranslate.service'; +export * from './AlfrescoAuthenticationService.service'; +export * from './AlfrescoContentService.service'; diff --git a/ng2-components/ng2-alfresco-core/src/utils/index.ts b/ng2-components/ng2-alfresco-core/src/utils/index.ts new file mode 100644 index 0000000000..f3ae4ef189 --- /dev/null +++ b/ng2-components/ng2-alfresco-core/src/utils/index.ts @@ -0,0 +1,18 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './object-utils'; diff --git a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.css b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.css index 415a6264c9..7f76443680 100644 --- a/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.css +++ b/ng2-components/ng2-alfresco-datatable/src/components/datatable.component.css @@ -1,13 +1,13 @@ :host .full-width { width: 100%; } :host .icon-cell { - font-size: 48px; + font-size: 24px; cursor: default; } :host .image-cell { - width: 48px; - height: 48px; + width: 24px; + height: 24px; cursor: default; } diff --git a/ng2-components/ng2-alfresco-documentlist/index.ts b/ng2-components/ng2-alfresco-documentlist/index.ts index 946923d327..7c2f142c61 100644 --- a/ng2-components/ng2-alfresco-documentlist/index.ts +++ b/ng2-components/ng2-alfresco-documentlist/index.ts @@ -21,7 +21,7 @@ import { ContentColumnList } from './src/components/content-column-list'; import { ContentAction } from './src/components/content-action'; import { ContentActionList } from './src/components/content-action-list'; import { EmptyFolderContent } from './src/components/empty-folder-content'; -import { DocumentListBreadcrumb } from './src/components/document-list-breadcrumb.component'; +import { DocumentListBreadcrumb } from './src/components/breadcrumb/breadcrumb.component'; import { FolderActionsService } from './src/services/folder-actions.service'; import { DocumentActionsService } from './src/services/document-actions.service'; @@ -34,7 +34,7 @@ export * from './src/components/content-column-list'; export * from './src/components/content-action'; export * from './src/components/content-action-list'; export * from './src/components/empty-folder-content'; -export * from './src/components/document-list-breadcrumb.component'; +export * from './src/components/breadcrumb/breadcrumb.component'; // services export * from './src/services/folder-actions.service'; diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.css b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.css similarity index 100% rename from ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.css rename to ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.css diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.html b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.html similarity index 100% rename from ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.html rename to ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.html diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.spec.ts similarity index 97% rename from ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.spec.ts rename to ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.spec.ts index 2a18f6bb8e..b48339a5c8 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.spec.ts @@ -25,8 +25,8 @@ import { import { DocumentListBreadcrumb, PathNode -} from './document-list-breadcrumb.component'; -import { DocumentList } from './document-list'; +} from './breadcrumb.component'; +import { DocumentList } from '../document-list'; describe('DocumentListBreadcrumb', () => { diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.ts b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.ts similarity index 94% rename from ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.ts rename to ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.ts index 40e1c13308..2cbce772ee 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list-breadcrumb.component.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/breadcrumb/breadcrumb.component.ts @@ -21,15 +21,15 @@ import { Output, EventEmitter } from '@angular/core'; -import { DocumentList } from './document-list'; +import { DocumentList } from '../document-list'; declare let __moduleName: string; @Component({ moduleId: __moduleName, selector: 'alfresco-document-list-breadcrumb', - templateUrl: './document-list-breadcrumb.component.html', - styleUrls: ['./document-list-breadcrumb.component.css'] + templateUrl: './breadcrumb.component.html', + styleUrls: ['./breadcrumb.component.css'] }) export class DocumentListBreadcrumb { diff --git a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.ts b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.ts index ec1559467c..9bfd884fae 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/components/document-list.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/components/document-list.ts @@ -27,7 +27,8 @@ import { OnChanges, TemplateRef, NgZone, - ViewChild + ViewChild, + HostListener } from '@angular/core'; import { Subject } from 'rxjs/Rx'; import { @@ -56,15 +57,13 @@ declare let __moduleName: string; styleUrls: ['./document-list.css'], templateUrl: './document-list.html', providers: [DocumentListService], - directives: [CONTEXT_MENU_DIRECTIVES, ALFRESCO_DATATABLE_DIRECTIVES], - host: { - '(contextmenu)': 'onShowContextMenu($event)' - } + directives: [CONTEXT_MENU_DIRECTIVES, ALFRESCO_DATATABLE_DIRECTIVES] }) export class DocumentList implements OnInit, AfterViewInit, AfterViewChecked, AfterContentInit, OnChanges { static SINGLE_CLICK_NAVIGATION: string = 'click'; static DOUBLE_CLICK_NAVIGATION: string = 'dblclick'; + static DEFAULT_PAGE_SIZE: number = 20; DEFAULT_ROOT_FOLDER: string = '/'; @@ -88,6 +87,9 @@ export class DocumentList implements OnInit, AfterViewInit, AfterViewChecked, Af @Input() contextMenuActions: boolean = false; + @Input() + pageSize: number = DocumentList.DEFAULT_PAGE_SIZE; + @Output() nodeClick: EventEmitter = new EventEmitter(); @@ -162,6 +164,7 @@ export class DocumentList implements OnInit, AfterViewInit, AfterViewChecked, Af ngOnInit() { this.data.thumbnails = this.thumbnails; + this.data.maxItems = this.pageSize; this.displayFolderContent(this.currentFolderPath); this.contextActionHandler.subscribe(val => this.contextActionCallback(val)); } @@ -219,6 +222,7 @@ export class DocumentList implements OnInit, AfterViewInit, AfterViewChecked, Af return []; } + @HostListener('contextmenu', ['$event']) onShowContextMenu(e?: Event) { if (e) { e.preventDefault(); @@ -373,5 +377,4 @@ export class DocumentList implements OnInit, AfterViewInit, AfterViewChecked, Af this.executeContentAction(node, action); } } - } diff --git a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts index 2478debb2d..42f9073d9f 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.spec.ts @@ -94,13 +94,13 @@ describe('ShareDataTableAdapter', () => { it('should fail when getting value for missing row', () => { let adapter = new ShareDataTableAdapter(null, null, null); let check = () => { return adapter.getValue(null, {}); }; - expect(check).toThrowError(ShareDataTableAdapter.ERR_ROW_NOT_FOUND); + expect(check).toThrowError(adapter.ERR_ROW_NOT_FOUND); }); it('should fail when getting value for missing column', () => { let adapter = new ShareDataTableAdapter(null, null, null); let check = () => { return adapter.getValue({}, null); }; - expect(check).toThrowError(ShareDataTableAdapter.ERR_COL_NOT_FOUND); + expect(check).toThrowError(adapter.ERR_COL_NOT_FOUND); }); it('should require path to load data', () => { @@ -123,7 +123,7 @@ describe('ShareDataTableAdapter', () => { let adapter = new ShareDataTableAdapter(documentListService, null, null); adapter.loadPath(path); - expect(documentListService.getFolder).toHaveBeenCalledWith(path); + expect(documentListService.getFolder).toHaveBeenCalledWith(path, jasmine.anything()); let rows = adapter.getRows(); expect(rows.length).toBe(1); @@ -283,7 +283,7 @@ describe('ShareDataTableAdapter', () => { }); it('should resolve file thumbnail', () => { - let imageUrl: 'http://'; + let imageUrl: string = 'http://'; spyOn(documentListService, 'getDocumentThumbnailUrl').and.returnValue(imageUrl); let adapter = new ShareDataTableAdapter(documentListService, basePath, null); diff --git a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts index 66b88d63c5..47eb0e4473 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/data/share-datatable-adapter.ts @@ -16,7 +16,7 @@ */ import { DatePipe } from '@angular/common'; -import { ObjectUtils } from 'ng2-alfresco-core'; +import { PaginationProvider, ObjectUtils } from 'ng2-alfresco-core'; import { DataTableAdapter, DataRow, DataColumn, DataSorting @@ -25,16 +25,26 @@ import { import { NodePaging, MinimalNodeEntity } from './../models/document-library.model'; import { DocumentListService } from './../services/document-list.service'; -export class ShareDataTableAdapter implements DataTableAdapter { +export class ShareDataTableAdapter implements DataTableAdapter, PaginationProvider { - static ERR_ROW_NOT_FOUND: string = 'Row not found'; - static ERR_COL_NOT_FOUND: string = 'Column not found'; + ERR_ROW_NOT_FOUND: string = 'Row not found'; + ERR_COL_NOT_FOUND: string = 'Column not found'; - static DEFAULT_DATE_FORMAT: string = 'medium'; + DEFAULT_DATE_FORMAT: string = 'medium'; + DEFAULT_PAGE_SIZE: number = 20; + MIN_PAGE_SIZE: number = 5; private sorting: DataSorting; private rows: DataRow[]; private columns: DataColumn[]; + private page: NodePaging; + private currentPath: string; + + private _count: number = 0; + private _hasMoreItems: boolean = false; + private _totalItems: number = 0; + private _skipCount: number = 0; + private _maxItems: number = this.DEFAULT_PAGE_SIZE; thumbnails: boolean = false; @@ -43,12 +53,48 @@ export class ShareDataTableAdapter implements DataTableAdapter { schema: DataColumn[]) { this.rows = []; this.columns = schema || []; + this.resetPagination(); + } + + get count(): number { + return this._count; + } + + get hasMoreItems(): boolean { + return this._hasMoreItems; + } + + get totalItems(): number { + return this._totalItems; + } + + get skipCount(): number { + return this._skipCount; + } + + set skipCount(value: number) { + if (value !== this._skipCount) { + this._skipCount = value > 0 ? value : 0; + this.loadPath(this.currentPath); + } + } + + get maxItems(): number { + return this._maxItems; + } + + set maxItems(value: number) { + if (value !== this._maxItems) { + this._maxItems = value > this.MIN_PAGE_SIZE ? value : this.MIN_PAGE_SIZE; + this.loadPath(this.currentPath); + } } getRows(): Array { return this.rows; } + // TODO: disable this api setRows(rows: Array) { this.rows = rows || []; this.sort(); @@ -64,16 +110,16 @@ export class ShareDataTableAdapter implements DataTableAdapter { getValue(row: DataRow, col: DataColumn): any { if (!row) { - throw new Error(ShareDataTableAdapter.ERR_ROW_NOT_FOUND); + throw new Error(this.ERR_ROW_NOT_FOUND); } if (!col) { - throw new Error(ShareDataTableAdapter.ERR_COL_NOT_FOUND); + throw new Error(this.ERR_COL_NOT_FOUND); } let value = row.getValue(col.key); if (col.type === 'date') { let datePipe = new DatePipe(); - let format = col.format || ShareDataTableAdapter.DEFAULT_DATE_FORMAT; + let format = col.format || this.DEFAULT_DATE_FORMAT; try { return datePipe.transform(value, format); } catch (err) { @@ -163,35 +209,59 @@ export class ShareDataTableAdapter implements DataTableAdapter { loadPath(path: string) { if (path && this.documentListService) { + this.currentPath = path; this.documentListService - .getFolder(path) - .subscribe(val => { - let page = val; - let rows = []; - - if (page && page.list) { - let data = page.list.entries; - if (data && data.length > 0) { - rows = data.map(item => new ShareDataRow(item)); - - // Sort by first sortable or just first column - if (this.columns && this.columns.length > 0) { - let sortable = this.columns.filter(c => c.sortable); - if (sortable.length > 0) { - this.sort(sortable[0].key, 'asc'); - } else { - this.sort(this.columns[0].key, 'asc'); - } - } - } - } - - this.rows = rows; - }, + .getFolder(path, { + maxItems: this._maxItems, + skipCount: this._skipCount + }) + .subscribe(val => this.loadPage(val), error => console.error(error)); } } + private loadPage(page: NodePaging) { + this.page = page; + this.resetPagination(); + + let rows = []; + + if (page && page.list) { + let data = page.list.entries; + if (data && data.length > 0) { + rows = data.map(item => new ShareDataRow(item)); + + // Sort by first sortable or just first column + if (this.columns && this.columns.length > 0) { + let sortable = this.columns.filter(c => c.sortable); + if (sortable.length > 0) { + this.sort(sortable[0].key, 'asc'); + } else { + this.sort(this.columns[0].key, 'asc'); + } + } + } + + let pagination = page.list.pagination; + if (pagination) { + this._count = pagination.count; + this._hasMoreItems = pagination.hasMoreItems; + this._maxItems = pagination.maxItems; + this._skipCount = pagination.skipCount; + this._totalItems = pagination.totalItems; + } + } + + this.rows = rows; + } + + private resetPagination() { + this._count = 0; + this._hasMoreItems = false; + this._totalItems = 0; + this._skipCount = 0; + this._maxItems = this.DEFAULT_PAGE_SIZE; + } } export class ShareDataRow implements DataRow { diff --git a/ng2-components/ng2-alfresco-documentlist/src/models/document-library.model.ts b/ng2-components/ng2-alfresco-documentlist/src/models/document-library.model.ts index 71cab49dcb..3db16122ae 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/models/document-library.model.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/models/document-library.model.ts @@ -22,13 +22,24 @@ export class NodePaging { } export class NodePagingList { + pagination: Pagination; entries: MinimalNodeEntity[]; } +// TODO: rename to NodeMinimalEntry export class MinimalNodeEntity { entry: MinimalNodeEntryEntity; } +export class Pagination { + count: number; + hasMoreItems: boolean; + totalItems: number; + skipCount: number; + maxItems: number; +} + +// TODO: rename to NodeMinimal export class MinimalNodeEntryEntity { id: string; parentId: string; diff --git a/ng2-components/ng2-alfresco-documentlist/src/services/document-list.service.ts b/ng2-components/ng2-alfresco-documentlist/src/services/document-list.service.ts index 81012e679a..dced40e264 100644 --- a/ng2-components/ng2-alfresco-documentlist/src/services/document-list.service.ts +++ b/ng2-components/ng2-alfresco-documentlist/src/services/document-list.service.ts @@ -70,13 +70,23 @@ export class DocumentListService { return this.authService.getAlfrescoApi(); } - private getNodesPromise(folder: string) { + private getNodesPromise(folder: string, opts?: any) { let nodeId = '-root-'; - let opts = { + let params: any = { relativePath: folder, include: ['path'] }; - return this.getAlfrescoApi().node.getNodeChildren(nodeId, opts); + + if (opts) { + if (opts.maxItems) { + params.maxItems = opts.maxItems; + } + if (opts.skipCount) { + params.skipCount = opts.skipCount; + } + } + + return this.getAlfrescoApi().node.getNodeChildren(nodeId, params); } deleteNode(nodeId: string) { @@ -86,10 +96,11 @@ export class DocumentListService { /** * Gets the folder node with the content. * @param folder Path to folder. + * @param opts Options. * @returns {Observable} Folder entity. */ - getFolder(folder: string) { - return Observable.fromPromise(this.getNodesPromise(folder)) + getFolder(folder: string, opts?: any) { + return Observable.fromPromise(this.getNodesPromise(folder, opts)) .map(res => res) // .do(data => console.log('Node data', data)) // eyeball results in the console .catch(this.handleError);