diff --git a/.travis.yml b/.travis.yml index ccdd4814c3..0cfefd25d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,9 @@ branches: only: - master - development + - /.*next-release.*/ + - /.*beta.*/ + - /.*greenkeeper.*/ # TRAVIS_PULL_REQUEST == false means is running on dev branch and is not a PR stages: @@ -39,11 +42,6 @@ before_install: - sh -e /etc/init.d/xvfb start - sleep 3 # give xvfb some time to start -branches: - only: - - master - - development - jobs: include: - stage: Warm Up Cache @@ -54,145 +52,149 @@ jobs: - ./scripts/update-version.sh -gnu -alpha || exit 1 - npm install - ./scripts/lint.sh || exit 1 - - npm run spellcheck || exit 1 - - npm run stylelint || exit 1 - - rm -rf tmp && (./scripts/smart-build.sh -b $TRAVIS_BRANCH || exit 1;); + - rm -rf tmp && mkdir tmp + - git merge-base origin/$TRAVIS_BRANCH HEAD > ./tmp/devhead.txt + - (./scripts/smart-build.sh -b $TRAVIS_BRANCH -gnu || exit 1;); - npm run build:dist || exit 1 - ./scripts/license-list-generator.sh - stage: Unit test - name: core + name: core and extensions script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "core$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test core --watch=false || exit 1; - fi - - stage: Unit test - name: extensions - script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + fi; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "extensions$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test extensions --watch=false || exit 1; - fi + fi; - stage: Unit test - name: process-services + name: process-services and insights script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test process-services --watch=false || exit 1; - fi - - stage: Unit test - name: insights - script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + fi; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "insights$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test insights --watch=false || exit 1; - fi + fi; - stage: Unit test name: content-services script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "content-services$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test content-services --watch=false || exit 1; - fi + fi; - stage: Unit test name: process-services-cloud script: - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services-cloud$" || $TRAVIS_PULL_REQUEST == "false" ]]; then ng test process-services-cloud --watch=false || exit 1; - fi + fi; - stage: Unit test name: demo-shell script: if ([ "$TRAVIS_BRANCH" = "master" ]); then - (./scripts/start.sh -t -ss || exit 1;); + (./scripts/start.sh -t -ss -si || exit 1;); else - (./scripts/start.sh -dev -t -ss -vjsapi alpha || exit 1;); - fi + (./scripts/start.sh -dev -t -ss -si || exit 1;); + fi; - stage: Update children projects dependency #Update generator-ng2-alfresco-app + name: Update Generator if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n generator-ng2-alfresco-app - stage: Update children projects dependency # Test Update alfresco-content-app + name: Update ACA if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-content-app - stage: Update children projects dependency # Test Update adf-app-manager-ui + name: Update adf-app-manager-ui if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n adf-app-manager-ui - - stage: Update children projects dependency # Test Update aalfresco-ng2-components + - stage: Update children projects dependency # Test Update alfresco-ng2-components + name: Update alfresco-ng2-components if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-ng2-components - stage: Update children projects dependency # Test Update alfresco-modeler-app + name: Update alfresco modeler app if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-modeler-app - stage: e2e Test # Test core name: core script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "core$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 --host_sso "$E2E_HOST_SSO" --host_bpm "$E2E_HOST_BPM" --host_identity "$E2E_HOST_IDENTITY" -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder core --skip-lint --use-dist || exit 1;); - fi + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder core --skip-lint -save --use-dist || exit 1;); + fi; - stage: e2e Test # Test process-services name: process-services script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder process-services --skip-lint --use-dist || exit 1;); - fi + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder process-services --skip-lint --use-dist || exit 1;); + fi; - stage: e2e Test # Test content-services name: content-services script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "content-services$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder content-services --skip-lint --use-dist || exit 1;); - fi + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder content-services --skip-lint --use-dist || exit 1;); + fi; - stage: e2e Test # Test search name: search script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "content-services$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder search --skip-lint --use-dist || exit 1;); - fi + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder search --skip-lint --use-dist || exit 1;); + fi; - stage: e2e Test # Test process-services-cloud name: process-services-cloud script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services-cloud$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 --host_sso "$E2E_HOST_SSO" --host_bpm "$E2E_HOST_BPM" --host_identity "$E2E_HOST_IDENTITY" -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder process-services-cloud --skip-lint --use-dist || exit 1;); - fi + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST_BPM" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder process-services-cloud --skip-lint --use-dist || exit 1;); + fi; - stage: e2e Test # Test insights name: insights script: AFFECTED_E2E="$(./scripts/affected-folder.sh -b $TRAVIS_BRANCH -f "e2e")"; - AFFECTED_LIBS="$(./scripts/affected-libs.sh -b $TRAVIS_BRANCH)"; + AFFECTED_LIBS="$(./scripts/affected-libs.sh -gnu -b $TRAVIS_BRANCH)"; if [[ $AFFECTED_LIBS =~ "process-services-cloud$" || $AFFECTED_E2E = "e2e" || $TRAVIS_PULL_REQUEST == "false" ]]; then - (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e $E2E_EMAIL -b --folder insights --skip-lint --use-dist || exit 1;); - fi - - stage: Create Docker PR - script: node ./scripts/move-dist-folder.js --base-href $TRAVIS_BUILD_NUMBER && (./scripts/pr-publish.sh -n $TRAVIS_BUILD_NUMBER -r $REPO_DOCKER -u $USERNAME_DOCKER -p $PASSWORD_DOCKER || exit 1) - - stage: Deploy Docker PR - script: node --no-deprecation ./scripts/pr-deploy.js -n $TRAVIS_BUILD_NUMBER -u $RANCHER_TOKEN -p $RANCHER_SECRET -s $REPO_RANCHER --image "docker:$REPO_DOCKER/adf/demo-shell:$TRAVIS_BUILD_NUMBER" --env $ENVIRONMENT_NAME -r $ENVIRONMENT_URL || exit 1 + (./scripts/test-e2e-lib.sh -host localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --folder insights --skip-lint --use-dist -b || exit 1;); + fi; + - stage: Create Docker and Deploy Docker PR + script: + - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; + then + node ./scripts/move-dist-folder.js --base-href $TRAVIS_BUILD_NUMBER && (./scripts/pr-publish.sh -n $TRAVIS_BUILD_NUMBER -r $REPO_DOCKER -u $USERNAME_DOCKER -p $PASSWORD_DOCKER || exit 1); + fi; + - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; + then + (node --no-deprecation ./scripts/pr-deploy.js -n $TRAVIS_BUILD_NUMBER -u $RANCHER_TOKEN -p $RANCHER_SECRET -s $REPO_RANCHER --image "docker:$REPO_DOCKER/adf/demo-shell:$TRAVIS_BUILD_NUMBER" --env $ENVIRONMENT_NAME -r $ENVIRONMENT_URL || exit 1); + fi; # Send coverage data to codecov after_success: bash <(curl -s https://codecov.io/bash) -X gcov - cache: directories: - node_modules diff --git a/Dockerfile b/Dockerfile index a17a108b12..e7571d849b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,41 @@ -FROM nginx:alpine +# 1. Generate licenses -COPY demo-shell/nginx.conf /etc/nginx/nginx.conf +FROM node:11.9-alpine AS builder +WORKDIR /usr/src/alfresco +COPY package.json package.json + +RUN mkdir -p ./licenses && \ + yarn licenses list > ./licenses/licenses.txt && \ + yarn licenses generate-disclaimer > ./licenses/disclaimer.txt + +# 2. Generate image + +FROM nginx:stable-alpine +LABEL version="3.0.0" + +ARG GROUPNAME=Alfresco +ARG GROUPID=1000 +ARG USERNAME=adf +ARG USERID=33011 + +ARG BUILD_NUMBER + +COPY ./docker/nginx.conf /etc/nginx/nginx.conf +COPY ./docker/entrypoint.sh / WORKDIR /usr/share/nginx/html COPY demo-shell/dist/ . +COPY --from=builder /usr/src/alfresco/licenses ./licenses + +RUN addgroup -g ${GROUPID} ${GROUPNAME} && \ + adduser -S -u ${USERID} -G ${GROUPNAME} -s "/bin/bash" ${USERNAME} && \ + chown -R ${USERNAME}:${GROUPNAME} ./${BUILD_NUMBER}/app.config.json && \ + chown -R ${USERNAME}:${GROUPNAME} /var/cache/nginx && \ + touch /var/run/nginx.pid && \ + chown -R ${USERNAME}:${GROUPNAME} /var/run/nginx.pid && \ + chmod +x /entrypoint.sh && \ + chown -R ${USERNAME}:${GROUPNAME} /entrypoint.sh + +EXPOSE 8080 +USER ${USERNAME} +ENTRYPOINT [ "/entrypoint.sh" ] diff --git a/INTRODUCTION.md b/INTRODUCTION.md index 8a2cb8bdbe..d29dd16cc6 100644 --- a/INTRODUCTION.md +++ b/INTRODUCTION.md @@ -1,39 +1,5 @@ -# Introduction to the Alfresco Application Development Framework - -The Alfresco Application Development Framework (ADF) is based on the [Angular framework](https://angular.io/). -ADF is provided by Alfresco to make it easy to build custom web applications to manage and view content in the [Alfresco Platform Repository](https://docs.alfresco.com/5.2/concepts/content-repo-about.html). - -As you probably know, there is a general user interface called [Alfresco Share](https://docs.alfresco.com/5.2/concepts/gs-intro.html) available out-of-the-box. -Share is usually used as a quick way of getting started with content management in Alfresco. It gives you access to pretty much all -the features provided by the ACS system and a lot of customers customize it for their specific domain. - -However, there are use cases that Share does not fit very well, such as: - -- Feature-based clients, exposing functionality to perform a specific task(s) -- Role-based clients, exposing functionality based on role -- Clients where the UI layout and style differs significantly from the Share layout and styling -- [Mashup clients](http://whatis.techtarget.com/definition/mash-up) - -This is where ADF comes into play. You can use it to create exactly the user interface -(i.e. web client) that you require. - -The framework consists of several libraries that can be used to form a customized content management application. The available libraries are: - -- [Core](lib/core/README.md) -- [Content Services](lib/content-services/README.md) -- [Process Services](lib/process-services/README.md) -- [Insights](lib/insights/README.md) - - -You can browse documentation for all the components at the -[ADF Component Catalog](https://alfresco.github.io/adf-component-catalog/). - -An overview of the architecture is shown below: - -

- alfresco -

- -Here we can also see that there is an Alfresco JavaScript framework in use that wraps the Alfresco REST API, to make things easier for the client developer. - +# Introduction +See the [introduction page](docs/user-guide/adf-introduction.md) in our +[documentation](docs/README.md) for an overview of ADF along with links +to useful starting points. diff --git a/angular.json b/angular.json index 61a58eb12f..ccbbd5959d 100644 --- a/angular.json +++ b/angular.json @@ -540,7 +540,7 @@ "build": { "builder": "@angular-devkit/build-ng-packagr:build", "options": { - "tsConfig": "lib/core/tsconfig.json", + "tsConfig": "lib/core/tsconfig.lib.json", "project": "lib/core/ng-package.json" }, "configurations": { @@ -553,7 +553,7 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "main": "lib/core/test.ts", - "tsConfig": "lib/core/tsconfig.json", + "tsConfig": "lib/core/tsconfig.spec.json", "karmaConfig": "lib/core/karma.conf.js", "codeCoverage": true, "sourceMap": true @@ -582,7 +582,7 @@ "build": { "builder": "@angular-devkit/build-ng-packagr:build", "options": { - "tsConfig": "lib/content-services/tsconfig.json", + "tsConfig": "lib/content-services/tsconfig.lib.json", "project": "lib/content-services/ng-package.json" }, "configurations": { @@ -595,7 +595,7 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "main": "lib/content-services/test.ts", - "tsConfig": "lib/content-services/tsconfig.json", + "tsConfig": "lib/content-services/tsconfig.spec.json", "karmaConfig": "lib/content-services/karma.conf.js", "codeCoverage": true, "sourceMap": true @@ -624,7 +624,7 @@ "build": { "builder": "@angular-devkit/build-ng-packagr:build", "options": { - "tsConfig": "lib/process-services/tsconfig.json", + "tsConfig": "lib/process-services/tsconfig.lib.json", "project": "lib/process-services/ng-package.json" }, "configurations": { @@ -637,7 +637,7 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "main": "lib/process-services/test.ts", - "tsConfig": "lib/process-services/tsconfig.json", + "tsConfig": "lib/process-services/tsconfig.spec.json", "karmaConfig": "lib/process-services/karma.conf.js", "codeCoverage": true, "sourceMap": true @@ -708,7 +708,7 @@ "build": { "builder": "@angular-devkit/build-ng-packagr:build", "options": { - "tsConfig": "lib/insights/tsconfig.json", + "tsConfig": "lib/extensions/tsconfig.lib.json", "project": "lib/insights/ng-package.json" }, "configurations": { @@ -721,7 +721,7 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "main": "lib/insights/test.ts", - "tsConfig": "lib/insights/tsconfig.json", + "tsConfig": "lib/extensions/tsconfig.spec.json", "karmaConfig": "lib/insights/karma.conf.js", "codeCoverage": true, "sourceMap": true @@ -777,6 +777,41 @@ } } } + }, + "testing": { + "root": "lib/testing", + "sourceRoot": "lib/testing/src", + "projectType": "library", + "prefix": "adf", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "lib/testing/tsconfig.lib.json", + "project": "lib/testing/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "lib/testing/src/test.ts", + "tsConfig": "lib/testing/tsconfig.spec.json", + "karmaConfig": "lib/testing/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "lib/testing/tsconfig.lib.json", + "lib/testing/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } } }, "defaultProject": "dist" diff --git a/cspell.json b/cspell.json index 3fb5c67a38..3812092713 100644 --- a/cspell.json +++ b/cspell.json @@ -123,7 +123,8 @@ "BASESHAREURL", "hardend", "filedata", - "uncheck" + "uncheck", + "subfolders" ], "dictionaries": [ "html", diff --git a/demo-shell/package.json b/demo-shell/package.json index b593782ea4..d1448010ad 100644 --- a/demo-shell/package.json +++ b/demo-shell/package.json @@ -1,7 +1,7 @@ { "name": "Alfresco-ADF-Angular-Demo", "description": "Demo shell for Alfresco Angular components", - "version": "3.0.0", + "version": "3.1.0", "author": "Alfresco Software, Ltd.", "repository": { "type": "git", diff --git a/demo-shell/resources/i18n/ar.json b/demo-shell/resources/i18n/ar.json new file mode 100644 index 0000000000..333cddd0a2 --- /dev/null +++ b/demo-shell/resources/i18n/ar.json @@ -0,0 +1,321 @@ +{ + "APP": { + "INFO_DRAWER": { + "TITLE": "التفاصيل", + "COMMENTS": "تعليقات", + "PROPERTIES": "الخصائص", + "VERSIONS": "الإصدارات" + }, + "HOME": { + "TITLE": "Alfresco المكونات الزاوّية لـ", + "DOCUMENTATION": "الوثائق" + }, + "LOGOUT": { + "TITLE": "صفحة الخروج", + "SUB_TITLE": "تم خروجك الآن", + "LOGIN": "دخول", + "HOME": "رئيسية" + }, + "ADF_VERSION_MANAGER": { + "ALLOW_DELETE": "السماح بالحذف", + "SHOW_COMMENTS": "إظهار التعليقات على الإصدارات", + "ALLOW_DOWNLOAD": "تمكين تنزيل الإصدار", + "READ_ONLY": "للقراءة فقط", + "COMMENTS": "إظهار التعليقات" + }, + "PERSONAL-FILES": "الملفات الشخصية", + "WARN-MULTIPLE-UPLOADS": "عرض تحذير للتحميلات المتعددة.", + "CUSTOM-PERMISSION-MESSAGE": "تمكين رسالة إذن مخصصة", + "MEDIUM-TIME-FORMAT": "تمكين تنسيق وقت متوسط لقائمة المستندات", + "SEARCH": { + "RADIO": { + "NONE": "بلا", + "ALL": "الكل", + "FOLDER": "مجلد", + "DOCUMENT": "مستند" + } + } + }, + "title": "مرحبًا", + "VERSION": { + "NO_PERMISSION": "ليس لديك إذن لإدارة إصدارات هذا المحتوى", + "NO_PERMISSION_EVENT": "ليس لديك إذن ${event.permission} ل${event.action} ${event.type}", + "CHOOSE_FILE": "تحديد ملف لرؤية إصداراته", + "DIALOG": { + "CLOSE": "إغلاق", + "TITLE": "إدارة الإصدارات" + } + }, + "METADATA": { + "DIALOG": { + "CLOSE": "إغلاق", + "TITLE": "بيانات تعريف" + } + }, + "APP_LAYOUT": { + "APP": "تطبيق", + "APP_NAME": "تطبيق ADF التوضيحي", + "HOME": "رئيسية", + "NODE-SELECTOR": "محدد العقدة", + "CONTENT_SERVICES": "Content Services", + "BREADCRUMB": "مسار التنقل", + "NOTIFICATIONS": "إعلامات", + "TASK_LIST": "قائمة المهام", + "PROCESS_LIST": "مهام عملية", + "PROCESS_CLOUD": "سحابة العملية", + "CARD_VIEW": "CardView", + "PROCESS_SERVICES": "Process Services", + "LOGIN": "دخول", + "CUSTOM_SOURCES": "مصادر مخصصة", + "DATATABLE": "جدول بيانات", + "DATATABLE_LAZY": "جدول بيانات (بطيء)", + "DOCUMENT_LIST": "قائمة المستندات", + "TEMPLATE": "قالب", + "FORM": "نموذج", + "FORM_LIST": "قائمة النماذج", + "FORM_LOADING": "تحميل النموذج", + "UPLOADER": "مُحمِّل", + "WEBSCRIPT": "برنامج الويب النصي", + "TAG": "علامة", + "TRASHCAN": "سلة المحذوفات", + "SOCIAL": "اجتماعي", + "SETTINGS": "إعدادات", + "CONFIG-EDITOR": "محرر التكوين", + "OVERLAY_VIEWER": "عارض مركّب", + "ABOUT": "حول", + "SEARCH": "بحث ممتد", + "EXTENDED_SEARCH_QUERY_BODY": "بحث ممتد بنص الاستعلام", + "WORD_TO_SEARCH": "بحث عن كلمة", + "SEARCH_CREATED_BY": "تم الإنشاء بواسطة", + "SEARCH_SERVICE_APPROACH": "حدد هذا لتعطيل خاصية الإدخال والتكوين باستخدام الخدمة", + "HEADER_DATA": "بيانات العنوان", + "TREE_VIEW": "طريقة عرض الشجرة", + "ICONS": "أيقونات", + "PEOPLE_GROUPS_CLOUD": "سحابة الأشخاص/المجموعة", + "PEOPLE_CLOUD": "مكون سحابة الأشخاص", + "GROUPS_CLOUD": "مكون سحابة المجموعة" + }, + "TRASHCAN": { + "ACTIONS": { + "DELETE_PERMANENT": "حذف بشكل دائم", + "RESTORE": "استعادة" + }, + "EMPTY_STATE": { + "TITLE": "المهملات فارغة", + "FIRST_TEXT": "تم نقل العناصر المحذوفة إلى المهملات.", + "SECOND_TEXT": "أفرغ المهملات لحذف العناصر بشكل دائم." + } + }, + "DOCUMENT_LIST": { + "MULTISELECT_CHECKBOXES": "تحديد متعدد (مع خانات اختيارات)", + "THUMBNAILS": "تمكين الصور المصغرة", + "ALLOW_DROP_FILES": "تمكين إسقاط ملفات في مجلد", + "MULTIPLE_FILE_UPLOAD": "تحميل ملفات متعددة", + "FOLDER_UPLOAD": "تحميل مجلد", + "CUSTOM_FILTER": "عامل تصفية امتدادات مخصص", + "MAX_SIZE": "عامل تصفية الحد الأقصى للحجم", + "ENABLE_VERSIONING": "تمكين تعيين الإصدار", + "DESCRIPTION_UPLOAD": "تمكين التحميل", + "ENABLE_INFINITE_SCROLL": "تمكين التمرير اللانهائي", + "MULTISELECT_DESCRIPTION": "استخدام Cmd (Mac) أو Ctrl (Windows) لتبديل تحديد العناصر المتعددة", + "RECENT": { + "EMPTY_STATE": { + "TITLE": "قائمة أحدث الملفات فارغة" + }, + "TITLE": "أحدث الملفات" + }, + "COLUMNS": { + "DISPLAY_NAME": "اسم العرض", + "IS_LOCKED": "قفل", + "TAG": "علامة", + "NODE_ID": "معرف العقدة", + "CREATED_BY": "تم الإنشاء بواسطة", + "CREATED_ON": "تم الإنشاء في", + "CREATED": "تم الإنشاء", + "SIZE": "الحجم", + "DELETED_ON": "تم الحذف", + "DELETED_BY": "تم الحذف بواسطة" + }, + "TOOLBAR": { + "CARDVIEW": "وضع عرض البطاقة", + "SHARE_EDIT": "إعدادات التحرير", + "NEW_FOLDER": "مجلد جديد", + "EDIT_FOLDER": "تحرير مجلد", + "DOWNLOAD": "تنزيل", + "DELETE": "حذف", + "FAVORITES": "إضافة إلى المفضلات", + "SHARE": "مشاركة", + "THEME": "تحديد نسق", + "SHOW_VERSION": "إظهار الإصدار", + "HIDE_VERSION": "إخفاء الإصدار", + "LISTVIEW": "وضع عرض القائمة", + "CREATE_LIBRARY": "إنشاء مكتبة" + }, + "ACTIONS": { + "VERSIONS": "إدارة الإصدارات", + "LOCK": "قفل", + "METADATA": "معلومات", + "DOWNLOAD": "تنزيل", + "PERMISSION": "إذن", + "FOLDER": { + "COPY": "نسخ", + "MOVE": "نقل", + "DELETE": "حذف" + }, + "DOCUMENT": { + "COPY": "نسخ", + "MOVE": "نقل", + "DELETE": "حذف", + "PROCESS_ACTION": "بدء العملية" + } + } + }, + "DATATABLE": { + "RESET_DEFAULT": "إعادة تعيين إلى افتراضي", + "ADD_ROW": "إضافة صف", + "REPLACE_ROWS": "استبدال صفوف", + "REPLACE_COLUMNS": "استبدال أعمدة", + "LOAD_NODE": "تحميل عقدة", + "MULTISELECT": "تحديد متعدد", + "MULTISELECT_DESCRIPTION": "استخدام Cmd (Mac) أو Ctrl (Windows) لتبديل تحديد العناصر المتعددة" + }, + "ANALYTICS_REPORT": { + "NO_REPORT_MESSAGE": "لم يتم تحديد تقرير. اختر تقريرًا من القائمة" + }, + "PS-TAB": { + "TASKS-TAB": "المهام", + "PROCESSES-TAB": "العملية", + "REPORTS-TAB": "تقارير", + "SETTINGS-TAB": "إعدادات", + "START-TASK": "بدء مهمة", + "START-PROCESS": "بدء العملية", + "PROCESS-AUDIT-LOG": "سجل تدقيق العملية", + "TASK-AUDIT-LOG": "سجل تدقيق المهمة", + "TASK-SHOW-HEADER": "إظهار تفاصيل العنوان" + }, + "PS_CLOUD_TAB": { + "APPS_TAB": "تطبيق", + "SETTINGS_TAB": "إعدادات" + }, + "FORM-LIST": { + "STORE": "متجر", + "RESTORE": "استعادة" + }, + "FORM-LOADING": { + "FORM_DATA": "بيانات النموذج", + "FORM_DATA_MESSAGE": "إدخال قيم لملء النموذج", + "TYPEAHEAD_PLACEHOLDER": "التنبؤ بالحروف", + "RADIO_PLACEHOLDER": "زر الراديو", + "SELECT_PLACEHOLDER": "القائمة المنسدلة" + }, + "LOGIN": { + "CONTENT_SERVICES": "Content Services", + "PROCESS_SERVICES": "Process Services", + "LOGIN_FOOTER": "تذييل الدخول", + "SHOW_REMEMBERME": "إظهار تذكرني", + "SHOW_SUCCESS_ROUTE": "إظهار طريق النجاح", + "CUSTOM_LOGO": "شعار مخصص" + }, + "SEARCH": { + "RESULTS": "نتائج البحث", + "NO_RESULT": "لم يتم العثور على نتائج", + "FACET_FIELDS": { + "TYPE": "1:النوع", + "SIZE": "2:الحجم", + "CREATOR": "3:المُنشئ", + "MODIFIER": "4:المُعدل", + "CREATED": "5:تم الإنشاء" + }, + "FACET_QUERIES": { + "MY_FACET_QUERIES": "استعلامات واجهتي", + "CREATED_THIS_YEAR": "1.تم الإنشاء هذا العام", + "MIMETYPE": "2.النوع: HTML", + "XTRASMALL": "3.الحجم: فائق الصغر", + "SMALL": "4.الحجم: صغير", + "MEDIUM": "5.الحجم: متوسط", + "LARGE": "6.الحجم: كبير", + "XTRALARGE": "7.الحجم: فائق الكبر", + "XXTRALARGE": "8.الحجم: كبير XX" + } + }, + "SOCIAL": { + "LIKE": "مكون الإعجاب", + "RATING": "مكون التقييم" + }, + "TAG": { + "LIST": "خدمات محتوى علامات القائمة", + "INSERT": "إدراج معرف العقدة", + "NODE_LIST": "قائمة العلامات حسب معرف العقدة" + }, + "DEMO_PERMISSION": { + "INHERIT_PERMISSION_BUTTON": "إذن التوريث", + "INHERITED_PERMISSIONS_BUTTON": "تم توريث الإذن" + }, + "TASK_LIST_DEMO": { + "ERROR_MESSAGE": { + "APP_ID_REQUIRED_ERROR": "إدراج معرف التطبيق", + "APP_ID_TYPE_ERROR": "يجب أن يكون معرف التطبيق رقمًا", + "NUMBER_TYPE_ERROR": "يجب أن تكون القيمة رقمًا", + "NUMBER_GREATER_THAN": "يجب أن تكون القيمة أكبر من {{ value }} أو تساويها" + }, + "TOOLTIP_MESSAGE": { + "START_INPUT": "صفحة البدء" + } + }, + "PROCESS_LIST_DEMO": { + "ERROR_MESSAGE": { + "APP_ID_REQUIRED_ERROR": "إدراج معرف التطبيق", + "APP_ID_TYPE_ERROR": "يجب أن يكون معرف التطبيق رقمًا", + "NUMBER_GREATER_THAN": "يجب أن تكون القيمة أكبر من {{ value }} أو تساويها" + } + }, + "GROUP-TITLE1-TRANSLATION-KEY": "الترجمة الأولى للعنوان المخصص", + "GROUP-TITLE2-TRANSLATION-KEY": "الترجمة الثانية للعنوان المخصص", + "ERROR_CONTENT": { + "507": { + "TITLE": "قرص ACS ممتلئ", + "DESCRIPTION": "يتجاوز المحتوى حد سعة التخزين المكون للشبكة أو النظام", + "SECONDARY_BUTTON": { + "TEXT": "" + }, + "RETURN_BUTTON": { + "TEXT": "عودة إلى الرئيسية" + } + } + }, + "PROCESS_LIST_CLOUD_DEMO": { + "TITLE": "العرض التوضيحي لسحابة قائمة العملية", + "CUSTOMIZE_FILTERS": "تخصيص عامل التصفية" + }, + "TASK_LIST_CLOUD_DEMO": { + "CUSTOMIZE_FILTERS": "تخصيص عامل التصفية" + }, + "PEOPLE_GROUPS_CLOUD": { + "SINGLE": "تحديد واحد", + "MULTI": "تحديد متعدد", + "PRESELECTED_VALUE": "تحديد مسبق: ", + "ROLE": "الأدوار: ", + "APP_NAME": "اسم التطبيق", + "APP_FILTER_MODE": "التصفية حسب اسم التطبيق", + "ROLE_FILTER_MODE": "التصفية حسب الدور", + "PRESELECT_VALIDATION": "التحديد المسبق للتحقق من الصحة" + }, + "ABOUT": { + "TITLE": "مكونات إضافية", + "TABLE_HEADERS": { + "ID": "المعرف", + "NAME": "الاسم", + "VERSION": "الإصدار", + "VENDOR": "المورد", + "LICENSE": "الترخيص", + "RUNTIME": "وقت التشغيل", + "DESCRIPTION": "الوصف" + } + }, + "SETTINGS_CLOUD": { + "MULTISELECTION": "تحديد متعدد", + "TESTING_MODE": "وضع الاختبار", + "SELECTION_MODE": "وضع التحديد", + "TASK_DETAILS_REDIRECTION": "عرض تفاصيل المهمة عند النقر فوق المهمة" + } +} diff --git a/demo-shell/resources/i18n/de.json b/demo-shell/resources/i18n/de.json index bd93230b2a..fadc40e103 100644 --- a/demo-shell/resources/i18n/de.json +++ b/demo-shell/resources/i18n/de.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Anwendung", "APP_NAME": "ADF-Demoanwendung", "HOME": "Startseite", "NODE-SELECTOR": "Node-Auswahl", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Benachrichtigungen", "TASK_LIST": "Aufgabenliste", "PROCESS_LIST": "Prozessliste", - "PROCESS_CLOUD": "Prozess-Cloud", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Anmelden", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Ihren Filter anpassen" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Einzeln", - "MULTI": "Mehrfach", - "PRESELECTED_VALUE": "Vorausgewählter Wert" + "SINGLE": "Einzelauswahl", + "MULTI": "Mehrfachauswahl", + "PRESELECTED_VALUE": "Vorauswahl: ", + "ROLE": "Rollen: ", + "APP_NAME": "Anwendungsname", + "APP_FILTER_MODE": "Nach Anwendungsname filtern", + "ROLE_FILTER_MODE": "Nach Rolle filtern", + "PRESELECT_VALIDATION": "Vorauswahl-Prüfung" }, "ABOUT": { "TITLE": "Plugins", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Mehrfachauswahl", "TESTING_MODE": "Testmodus", - "SELECTION_MODE": "Auswahlmodus" + "SELECTION_MODE": "Auswahlmodus", + "TASK_DETAILS_REDIRECTION": "Bei Klicken auf Aufgabe Aufgabendetails einblenden" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/en.json b/demo-shell/resources/i18n/en.json index 750c165e43..b9e088971b 100644 --- a/demo-shell/resources/i18n/en.json +++ b/demo-shell/resources/i18n/en.json @@ -53,9 +53,11 @@ } }, "APP_LAYOUT": { + "APP": "App", "APP_NAME": "ADF Demo Application", "HOME": "Home", "NODE-SELECTOR": "Node Selector", + "SITES": "Sites", "CONTENT_SERVICES": "Content Services", "BREADCRUMB": "Breadcrumb", "NOTIFICATIONS": "Notifications", @@ -293,7 +295,11 @@ "SINGLE": "Single Selection", "MULTI": "Multiple Selection", "PRESELECTED_VALUE": "Preselect: ", - "ROLE": "Roles: " + "ROLE": "Roles: ", + "APP_NAME": "Application Name", + "APP_FILTER_MODE": "Filter by application name", + "ROLE_FILTER_MODE": "Filter by role", + "PRESELECT_VALIDATION": "Preselect validation" }, "ABOUT": { "TITLE": "Plugins", @@ -308,8 +314,9 @@ } }, "SETTINGS_CLOUD": { - "MULTISELECTION": "Multiselection", - "TESTING_MODE": "Testing Mode", - "SELECTION_MODE": "Selection Mode" + "MULTISELECTION": "Multiselection", + "TESTING_MODE": "Testing Mode", + "SELECTION_MODE": "Selection Mode", + "TASK_DETAILS_REDIRECTION": "Display task details on task click" } } diff --git a/demo-shell/resources/i18n/es.json b/demo-shell/resources/i18n/es.json index 250c9ab8dc..7d9f47954c 100644 --- a/demo-shell/resources/i18n/es.json +++ b/demo-shell/resources/i18n/es.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Aplicación", "APP_NAME": "Aplicación ADF Demo", "HOME": "Inicio", "NODE-SELECTOR": "Selector de nodo", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Notificaciones", "TASK_LIST": "Lista de tareas", "PROCESS_LIST": "Lista de procesos", - "PROCESS_CLOUD": "Procesos en la nube", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Iniciar sesión", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Personalice su filtro" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Individual", - "MULTI": "Múltiple", - "PRESELECTED_VALUE": "Valor preseleccionado" + "SINGLE": "Selección individual", + "MULTI": "Selección múltiple", + "PRESELECTED_VALUE": "Preseleccionar: ", + "ROLE": "Funciones: ", + "APP_NAME": "Nombre de la aplicación", + "APP_FILTER_MODE": "Filtrar por nombre de la aplicación", + "ROLE_FILTER_MODE": "Filtrar por función", + "PRESELECT_VALIDATION": "Preseleccionar validación" }, "ABOUT": { "TITLE": "Complementos", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Selección múltiple", "TESTING_MODE": "Modo de prueba", - "SELECTION_MODE": "Modo de selección" + "SELECTION_MODE": "Modo de selección", + "TASK_DETAILS_REDIRECTION": "Mostrar detalles de la tarea haciendo clic en la tarea" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/fr.json b/demo-shell/resources/i18n/fr.json index 7853ed9f5f..65bcc99127 100644 --- a/demo-shell/resources/i18n/fr.json +++ b/demo-shell/resources/i18n/fr.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Application", "APP_NAME": "Application Démo ADF", "HOME": "Accueil", "NODE-SELECTOR": "Sélecteur de nœud", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Personnaliser votre filtre" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Simple", - "MULTI": "Multi", - "PRESELECTED_VALUE": "Valeur présélectionnée" + "SINGLE": "Sélection unique", + "MULTI": "Sélection multiple", + "PRESELECTED_VALUE": "Présélection : ", + "ROLE": "Rôles : ", + "APP_NAME": "Nom de l'application", + "APP_FILTER_MODE": "Filtrer par nom d'application", + "ROLE_FILTER_MODE": "Filtrer par rôle", + "PRESELECT_VALIDATION": "Validation présélectionnée" }, "ABOUT": { "TITLE": "Plugins", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Multisélection", "TESTING_MODE": "Mode de test", - "SELECTION_MODE": "Mode de sélection" + "SELECTION_MODE": "Mode de sélection", + "TASK_DETAILS_REDIRECTION": "Afficher les détails de la tâche en cliquant dessus" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/it.json b/demo-shell/resources/i18n/it.json index fc2214f39b..40e0f1447b 100644 --- a/demo-shell/resources/i18n/it.json +++ b/demo-shell/resources/i18n/it.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Applicazione", "APP_NAME": "Applicazione demo ADF", "HOME": "Home", "NODE-SELECTOR": "Selezione nodo", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Notifiche", "TASK_LIST": "Elenco attività", "PROCESS_LIST": "Elenco processi", - "PROCESS_CLOUD": "Cloud processo", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Login", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Personalizza il filtro" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Singolo", - "MULTI": "Multiplo", - "PRESELECTED_VALUE": "Valore preselezionato" + "SINGLE": "Selezione singola", + "MULTI": "Selezione multipla", + "PRESELECTED_VALUE": "Preselezione: ", + "ROLE": "Ruoli: ", + "APP_NAME": "Nome applicazione", + "APP_FILTER_MODE": "Filtra per nome applicazione", + "ROLE_FILTER_MODE": "Filtra per ruolo", + "PRESELECT_VALIDATION": "Convalida preselezione" }, "ABOUT": { "TITLE": "Plug-in", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Selezione multipla", "TESTING_MODE": "Modalità di test", - "SELECTION_MODE": "Modalità di selezione" + "SELECTION_MODE": "Modalità di selezione", + "TASK_DETAILS_REDIRECTION": "Mostra dettagli compito dopo clic su compito" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/ja.json b/demo-shell/resources/i18n/ja.json index 3c378497ae..c1f1b81005 100644 --- a/demo-shell/resources/i18n/ja.json +++ b/demo-shell/resources/i18n/ja.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "アプリ", "APP_NAME": "ADF デモアプリケーション", "HOME": "ホーム", "NODE-SELECTOR": "ノードセレクター", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "通知", "TASK_LIST": "タスクリスト", "PROCESS_LIST": "プロセスリスト", - "PROCESS_CLOUD": "Process Cloud", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "ログイン", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "フィルタのカスタマイズ" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "1 人", - "MULTI": "複数人", - "PRESELECTED_VALUE": "事前選択値" + "SINGLE": "1 つ選択", + "MULTI": "複数選択", + "PRESELECTED_VALUE": "事前選択: ", + "ROLE": "役割: ", + "APP_NAME": "アプリケーション名", + "APP_FILTER_MODE": "アプリケーション名でフィルタ", + "ROLE_FILTER_MODE": "役割でフィルタ", + "PRESELECT_VALIDATION": "事前選択の検証" }, "ABOUT": { "TITLE": "プラグイン", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "複数選択", "TESTING_MODE": "テストモード", - "SELECTION_MODE": "選択モード" + "SELECTION_MODE": "選択モード", + "TASK_DETAILS_REDIRECTION": "タスクのクリック時にタスクの詳細を表示" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/nb.json b/demo-shell/resources/i18n/nb.json index 20a1c11edc..084c50f555 100644 --- a/demo-shell/resources/i18n/nb.json +++ b/demo-shell/resources/i18n/nb.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "App", "APP_NAME": "ADF-demoprogam", "HOME": "Hjem", "NODE-SELECTOR": "Nodevelger", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Tilpass filteret ditt" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Enkel", - "MULTI": "Flere", - "PRESELECTED_VALUE": "Forhåndsvalgt verdi" + "SINGLE": "Ett valg", + "MULTI": "Flere valg", + "PRESELECTED_VALUE": "Forhåndsvelg: ", + "ROLE": "Roller: ", + "APP_NAME": "Programnavn", + "APP_FILTER_MODE": "Filtrer etter programnavn", + "ROLE_FILTER_MODE": "Filtrer etter rolle", + "PRESELECT_VALIDATION": "Forhåndsvelg validering" }, "ABOUT": { "TITLE": "Plugin-moduler", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Flervalg", "TESTING_MODE": "Testmodus", - "SELECTION_MODE": "Valgmodus" + "SELECTION_MODE": "Valgmodus", + "TASK_DETAILS_REDIRECTION": "Vis oppgavedetaljer ved oppgaveklikk" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/nl.json b/demo-shell/resources/i18n/nl.json index 4f0d1be49a..da6bd99efe 100644 --- a/demo-shell/resources/i18n/nl.json +++ b/demo-shell/resources/i18n/nl.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "App", "APP_NAME": "ADF-demotoepassing", "HOME": "Home", "NODE-SELECTOR": "Selectiefunctie voor node", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Meldingen", "TASK_LIST": "Lijst met taken", "PROCESS_LIST": "Lijst met processen", - "PROCESS_CLOUD": "Process Cloud", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Aanmelden", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Uw filter aanpassen" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Eén", - "MULTI": "Multi", - "PRESELECTED_VALUE": "Vooraf geselecteerde waarde" + "SINGLE": "Enkelvoudige selectie", + "MULTI": "Meervoudige selectie", + "PRESELECTED_VALUE": "Voorselecteren: ", + "ROLE": "Rollen: ", + "APP_NAME": "Toepassingsnaam", + "APP_FILTER_MODE": "Filteren op toepassingsnaam", + "ROLE_FILTER_MODE": "Filteren op rol", + "PRESELECT_VALIDATION": "Validatie voorselecteren" }, "ABOUT": { "TITLE": "Plug-ins", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Multiselectie", "TESTING_MODE": "Testmodus", - "SELECTION_MODE": "Selectiemodus" + "SELECTION_MODE": "Selectiemodus", + "TASK_DETAILS_REDIRECTION": "Taakdetails weergeven bij klikken op taak" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/pt-BR.json b/demo-shell/resources/i18n/pt-BR.json index 105ed7a26e..724508a55c 100644 --- a/demo-shell/resources/i18n/pt-BR.json +++ b/demo-shell/resources/i18n/pt-BR.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Aplicativo", "APP_NAME": "Aplicativo Demo ADF", "HOME": "Página Inicial", "NODE-SELECTOR": "Seletor de nó", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Notificações", "TASK_LIST": "Lista de tarefas", "PROCESS_LIST": "Lista de processos", - "PROCESS_CLOUD": "Process Cloud", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Login", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Personalizar seu filtro" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Único", - "MULTI": "Múltiplo", - "PRESELECTED_VALUE": "Valor pré-selecionado" + "SINGLE": "Seleção única", + "MULTI": "Seleção múltipla", + "PRESELECTED_VALUE": "Pré-seleção: ", + "ROLE": "Funções: ", + "APP_NAME": "Nome do aplicativo", + "APP_FILTER_MODE": "Filtrar por nome do aplicativo", + "ROLE_FILTER_MODE": "Filtrar por função", + "PRESELECT_VALIDATION": "Validação de pré-seleção" }, "ABOUT": { "TITLE": "Plugins", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Seleção Múltipla", "TESTING_MODE": "Modo de Teste", - "SELECTION_MODE": "Modo de Seleção" + "SELECTION_MODE": "Modo de Seleção", + "TASK_DETAILS_REDIRECTION": "Exibir detalhes da tarefa ao clicar na tarefa" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/ru.json b/demo-shell/resources/i18n/ru.json index a3969eb661..6a6314bfa3 100644 --- a/demo-shell/resources/i18n/ru.json +++ b/demo-shell/resources/i18n/ru.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "Приложение", "APP_NAME": "Демонстрационное приложение ADF", "HOME": "Домашняя", "NODE-SELECTOR": "Селектор узлов", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "Оповещения", "TASK_LIST": "Список задач", "PROCESS_LIST": "Список процессов", - "PROCESS_CLOUD": "Процесс в облаке", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "Войти", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "Настройка фильтра" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "Один", - "MULTI": "Несколько", - "PRESELECTED_VALUE": "Предустановленное значение" + "SINGLE": "Единичный выбор", + "MULTI": "Групповой выбор", + "PRESELECTED_VALUE": "Предварительный выбор: ", + "ROLE": "Роли: ", + "APP_NAME": "Имя приложения", + "APP_FILTER_MODE": "Фильтровать по имени приложения", + "ROLE_FILTER_MODE": "Фильтровать по роли", + "PRESELECT_VALIDATION": "Проверка предварительного выбора" }, "ABOUT": { "TITLE": "Подключаемые модули", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "Выбор нескольких", "TESTING_MODE": "Режим тестирования", - "SELECTION_MODE": "Режим выбора" + "SELECTION_MODE": "Режим выбора", + "TASK_DETAILS_REDIRECTION": "Отображать подробные сведения о задаче при нажатии на задачу" } } \ No newline at end of file diff --git a/demo-shell/resources/i18n/zh-CN.json b/demo-shell/resources/i18n/zh-CN.json index 7661b927fa..045424f321 100644 --- a/demo-shell/resources/i18n/zh-CN.json +++ b/demo-shell/resources/i18n/zh-CN.json @@ -53,6 +53,7 @@ } }, "APP_LAYOUT": { + "APP": "APP", "APP_NAME": "ADF 演示应用程序", "HOME": "主页", "NODE-SELECTOR": "节点选择器", @@ -61,7 +62,7 @@ "NOTIFICATIONS": "通知", "TASK_LIST": "任务列表", "PROCESS_LIST": "流程列表", - "PROCESS_CLOUD": "Process Cloud", + "PROCESS_CLOUD": "Activiti Cloud", "CARD_VIEW": "CardView", "PROCESS_SERVICES": "Process Services", "LOGIN": "登录", @@ -290,9 +291,14 @@ "CUSTOMIZE_FILTERS": "自定义您的筛选器" }, "PEOPLE_GROUPS_CLOUD": { - "SINGLE": "单个", - "MULTI": "多个", - "PRESELECTED_VALUE": "预选值" + "SINGLE": "单个选择", + "MULTI": "多重选择", + "PRESELECTED_VALUE": "预先选择: ", + "ROLE": "角色: ", + "APP_NAME": "应用程序名称", + "APP_FILTER_MODE": "按应用程序名称筛选", + "ROLE_FILTER_MODE": "按角色筛选", + "PRESELECT_VALIDATION": "预先选择验证" }, "ABOUT": { "TITLE": "插件", @@ -309,6 +315,7 @@ "SETTINGS_CLOUD": { "MULTISELECTION": "多重选择", "TESTING_MODE": "测试模式", - "SELECTION_MODE": "选择模式" + "SELECTION_MODE": "选择模式", + "TASK_DETAILS_REDIRECTION": "单击任务时显示任务详情" } } \ No newline at end of file diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 666c6448c8..239c7fb63b 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -70,6 +70,10 @@ { "key": "zh-CN", "label": "中文简体" + }, + { + "key": "ar", + "label": "عربى" } ], "search": { @@ -102,6 +106,7 @@ } ] }, + "resetButton": true, "filterQueries": [ { "query": "TYPE:'cm:folder' OR TYPE:'cm:content'" }, { "query": "NOT cm:creator:System" } @@ -122,7 +127,7 @@ "expanded": true, "mincount": 1, "queries": [ - { "query": "created:2018", "label": "SEARCH.FACET_QUERIES.CREATED_THIS_YEAR" }, + { "query": "created:2019", "label": "SEARCH.FACET_QUERIES.CREATED_THIS_YEAR" }, { "query": "content.mimetype:text/html", "label": "SEARCH.FACET_QUERIES.MIMETYPE", "group":"Type facet queries" }, { "query": "content.size:[0 TO 10240]", "label": "SEARCH.FACET_QUERIES.XTRASMALL", "group":"Size facet queries"}, { "query": "content.size:[10240 TO 102400]", "label": "SEARCH.FACET_QUERIES.SMALL", "group":"Size facet queries"}, @@ -132,6 +137,30 @@ { "query": "content.size:[134217728 TO MAX]", "label": "SEARCH.FACET_QUERIES.XXTRALARGE", "group":"Size facet queries" } ] }, + "facetIntervals":{ + "expanded": true, + "intervals":[ + { + "label":"The Created", + "field":"cm:created", + "sets":[ + { "label":"lastYear", "start":"2018", "end":"2019", "endInclusive":false }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlier", "start":"*", "end":"2018", "endInclusive":false } + ] + }, + { + "label":"TheModified", + "field":"cm:modified", + "sets":[ + { "label":"2017", "start":"2017", "end":"2018", "endInclusive":false }, + { "label":"2017-2018", "start":"2017", "end":"2018", "endInclusive":true }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlierThan2017", "start":"*", "end":"2017", "endInclusive":false } + ] + } + ] + }, "categories": [ { "id": "queryName", @@ -220,7 +249,23 @@ } } } - ] + ], + "highlight": { + "prefix": " ", + "postfix": " ", + "mergeContiguous": true, + "fields": [ + { + "field": "cm:title" + }, + { + "field": "description", + "prefix": "(", + "postfix": ")" + } + + ] + } }, "pagination": { "size": 20, @@ -542,14 +587,20 @@ } }, "adf-edit-task-filter": { - "properties": [ - "state", "assignment", "sort", "order" - ] + "filterProperties": [ "status", "assignee", "sort", "order" ], + "sortProperties": [ "id", "name", "createdDate", "priority", "processDefinitionId" ], + "actions": [ "save", "saveAs", "delete" ] + }, + "adf-edit-process-filter": { + "filterProperties": [ "status", "sort", "order", "processName" ], + "sortProperties": [ "id", "name", "status", "startDate" ], + "actions": ["save", "saveAs", "delete"] + }, "content-metadata": { "presets": { "default": { - "exif:exif": "*" + "exif:exif": "*" } } }, @@ -564,6 +615,7 @@ "key": "entry.id", "type": "text", "title": "ADF_CLOUD_TASK_LIST.PROPERTIES.ID", + "cssClass": "adf-expand-cell-4", "sortable": true }, { @@ -571,7 +623,7 @@ "type": "text", "title": "ADF_CLOUD_TASK_LIST.PROPERTIES.NAME", "sortable": true, - "cssClass": "full-width name-column ellipsis-cell" + "cssClass": "name-column adf-ellipsis-cell" }, { "key": "entry.status", @@ -632,5 +684,6 @@ } ] } - } + }, + "alfresco-deployed-apps": [] } diff --git a/demo-shell/src/app/app-extension.module.ts b/demo-shell/src/app/app-extension.module.ts new file mode 100644 index 0000000000..63a3017383 --- /dev/null +++ b/demo-shell/src/app/app-extension.module.ts @@ -0,0 +1,27 @@ +/*! + * @license + * Copyright 2019 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 { NgModule } from '@angular/core'; +import { AcaMonacoModule } from 'adf-monaco-extension'; + +@NgModule({ + imports: [ + AcaMonacoModule + ] +}) +export class AppExtensionsModule { +} diff --git a/demo-shell/src/app/app.component.html b/demo-shell/src/app/app.component.html index 01a1ec089a..d06c2af228 100644 --- a/demo-shell/src/app/app.component.html +++ b/demo-shell/src/app/app.component.html @@ -1,2 +1,4 @@ - - +
+ + +
diff --git a/demo-shell/src/app/app.component.scss b/demo-shell/src/app/app.component.scss index f15d10be2c..5e73563291 100644 --- a/demo-shell/src/app/app.component.scss +++ b/demo-shell/src/app/app.component.scss @@ -7,15 +7,20 @@ router-outlet[name='overlay'] + * { right: 0; } +.adf-demo-app-container { + height: 100%; + width: 100%; +} + @media (max-width: 425px) { adf-content-node-selector { .adf-content-node-selector-content-list { - .adf-data-table-cell { + .adf-datatable-cell { display: none; } - .adf-data-table-cell:first-child, - .adf-data-table-cell:nth-child(2) { + .adf-datatable-cell:first-child, + .adf-datatable-cell:nth-child(2) { display: table-cell; } } diff --git a/demo-shell/src/app/app.component.ts b/demo-shell/src/app/app.component.ts index 650c73d023..365e7095fa 100644 --- a/demo-shell/src/app/app.component.ts +++ b/demo-shell/src/app/app.component.ts @@ -16,7 +16,12 @@ */ import { Component, ViewEncapsulation, OnInit } from '@angular/core'; -import { AuthenticationService, AlfrescoApiService, PageTitleService } from '@alfresco/adf-core'; +import { + UserPreferencesService, + AuthenticationService, + AlfrescoApiService, + PageTitleService +} from '@alfresco/adf-core'; import { Router } from '@angular/router'; import { MatDialog } from '@angular/material'; @@ -28,14 +33,24 @@ import { MatDialog } from '@angular/material'; }) export class AppComponent implements OnInit { + textOrientation: string = 'ltr'; + constructor(private pageTitleService: PageTitleService, private alfrescoApiService: AlfrescoApiService, private authenticationService: AuthenticationService, + private userPreferencesService: UserPreferencesService, private router: Router, private dialogRef: MatDialog) { + + this.userPreferencesService.set('textOrientation', this.textOrientation); + } ngOnInit() { + this.userPreferencesService.select('textOrientation').subscribe((textOrientation) => { + this.textOrientation = textOrientation; + }); + this.pageTitleService.setTitle('title'); this.alfrescoApiService.getInstance().on('error', (error) => { diff --git a/demo-shell/src/app/app.module.ts b/demo-shell/src/app/app.module.ts index 16a29c4618..376d429c25 100644 --- a/demo-shell/src/app/app.module.ts +++ b/demo-shell/src/app/app.module.ts @@ -24,6 +24,7 @@ import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AppConfigService, TRANSLATION_PROVIDER, DebugAppConfigService, CoreModule } from '@alfresco/adf-core'; +import { ExtensionsModule } from '@alfresco/adf-extensions'; import { AppComponent } from './app.component'; import { MaterialModule } from './material.module'; import { LoginComponent } from './components/login/login.component'; @@ -63,9 +64,8 @@ import { ContentModule } from '@alfresco/adf-content-services'; import { InsightsModule } from '@alfresco/adf-insights'; import { ProcessModule } from '@alfresco/adf-process-services'; import { AuthBearerInterceptor } from './services'; -import { ProcessServicesCloudModule, GroupCloudModule } from '@alfresco/adf-process-services-cloud'; +import { ProcessServicesCloudModule, GroupCloudModule, TaskDirectiveModule } from '@alfresco/adf-process-services-cloud'; import { TreeViewSampleComponent } from './components/tree-view/tree-view-sample.component'; -import { AppExtensionsModule } from './extensions/extensions.module'; import { CloudLayoutComponent } from './components/app-layout/cloud/cloud-layout.component'; import { AppsCloudDemoComponent } from './components/app-layout/cloud/apps-cloud-demo.component'; import { ProcessesCloudDemoComponent } from './components/app-layout/cloud/processes-cloud-demo.component'; @@ -78,6 +78,9 @@ import { StartProcessCloudDemoComponent } from './components/app-layout/cloud/st import { TemplateDemoComponent } from './components/template-list/template-demo.component'; import { PeopleGroupCloudDemoComponent } from './components/app-layout/cloud/people-groups-cloud-demo.component'; import { CloudSettingsComponent } from './components/app-layout/cloud/cloud-settings.component'; +import { AppExtensionsModule } from './app-extension.module'; +import { ProcessDetailsCloudDemoComponent } from './components/app-layout/cloud/process-details-cloud-demo.component'; +import { NestedMenuPositionDirective } from './components/app-layout/cloud/directives/nested-menu-position.directive'; @NgModule({ imports: [ @@ -88,17 +91,20 @@ import { CloudSettingsComponent } from './components/app-layout/cloud/cloud-sett FormsModule, HttpClientModule, MaterialModule, + AppExtensionsModule, FlexLayoutModule, CoreModule.forRoot(), ContentModule.forRoot(), InsightsModule.forRoot(), ProcessModule.forRoot(), + ProcessServicesCloudModule, + ExtensionsModule.forRoot(), ThemePickerModule, ChartsModule, MonacoEditorModule.forRoot(), ProcessServicesCloudModule, - AppExtensionsModule.forRoot(), - GroupCloudModule + GroupCloudModule, + TaskDirectiveModule ], declarations: [ AppComponent, @@ -134,13 +140,15 @@ import { CloudSettingsComponent } from './components/app-layout/cloud/cloud-sett TasksCloudDemoComponent, ProcessesCloudDemoComponent, TaskDetailsCloudDemoComponent, + ProcessDetailsCloudDemoComponent, StartTaskCloudDemoComponent, StartProcessCloudDemoComponent, CloudBreadcrumbsComponent, CloudFiltersDemoComponent, TemplateDemoComponent, PeopleGroupCloudDemoComponent, - CloudSettingsComponent + CloudSettingsComponent, + NestedMenuPositionDirective ], providers: [ { diff --git a/demo-shell/src/app/app.routes.ts b/demo-shell/src/app/app.routes.ts index 8e78646b7f..1c5a7b2dc5 100644 --- a/demo-shell/src/app/app.routes.ts +++ b/demo-shell/src/app/app.routes.ts @@ -17,7 +17,7 @@ import { ModuleWithProviders } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard, AuthGuardEcm, ErrorContentComponent, AuthGuardBpm } from '@alfresco/adf-core'; +import { AuthGuard, AuthGuardEcm, ErrorContentComponent, AuthGuardBpm, AuthGuardSsoRoleService } from '@alfresco/adf-core'; import { AppLayoutComponent } from './components/app-layout/app-layout.component'; import { LoginComponent } from './components/login/login.component'; import { HomeComponent } from './components/home/home.component'; @@ -48,6 +48,7 @@ import { StartTaskCloudDemoComponent } from './components/app-layout/cloud/start import { StartProcessCloudDemoComponent } from './components/app-layout/cloud/start-process-cloud-demo.component'; import { TemplateDemoComponent } from './components/template-list/template-demo.component'; import { PeopleGroupCloudDemoComponent } from './components/app-layout/cloud/people-groups-cloud-demo.component'; +import { ProcessDetailsCloudDemoComponent } from './components/app-layout/cloud/process-details-cloud-demo.component'; export const appRoutes: Routes = [ { path: 'login', component: LoginComponent }, @@ -118,6 +119,16 @@ export const appRoutes: Routes = [ } ] }, + { + path: 'sites', + component: AppLayoutComponent, + children: [ + { + path: '', + loadChildren: 'app/components/sites/sites.module#SitesModule' + } + ] + }, { path: 'header-data', component: AppLayoutComponent, @@ -143,6 +154,8 @@ export const appRoutes: Routes = [ }, { path: 'cloud', + canActivate: [AuthGuardSsoRoleService], + data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403'}, children: [ { path: '', @@ -153,7 +166,7 @@ export const appRoutes: Routes = [ component: PeopleGroupCloudDemoComponent }, { - path: ':applicationName', + path: ':appName', children: [ { path: '', @@ -180,7 +193,12 @@ export const appRoutes: Routes = [ { path: 'task-details/:taskId', component: TaskDetailsCloudDemoComponent + }, + { + path: 'process-details/:processInstanceId', + component: ProcessDetailsCloudDemoComponent } + ] } ] @@ -359,6 +377,10 @@ export const appRoutes: Routes = [ path: 'error/:id', component: ErrorContentComponent }, + { + path: 'error/no-authorization', + component: ErrorContentComponent + }, { path: '**', redirectTo: 'error/404' diff --git a/demo-shell/src/app/components/about/about.component.html b/demo-shell/src/app/components/about/about.component.html index 0bd13a53e3..a0ef038ca4 100644 --- a/demo-shell/src/app/components/about/about.component.html +++ b/demo-shell/src/app/components/about/about.component.html @@ -1,51 +1 @@ -

{{ 'ABOUT.TITLE' | translate }}

-
- - - - {{ 'ABOUT.TABLE_HEADERS.ID' | translate }} - {{element.$id}} - - - - - {{ 'ABOUT.TABLE_HEADERS.NAME' | translate }} - {{element.$name}} - - - - - {{ 'ABOUT.TABLE_HEADERS.VERSION' | translate }} - {{element.$version}} - - - - - {{ 'ABOUT.TABLE_HEADERS.VENDOR' | translate }} - {{element.$vendor}} - - - - - {{ 'ABOUT.TABLE_HEADERS.LICENSE' | translate }} - {{element.$license}} - - - - - {{ 'ABOUT.TABLE_HEADERS.RUNTIME' | translate }} - {{element.$runtime}} - - - - - {{ 'ABOUT.TABLE_HEADERS.DESCRIPTION' | translate }} - {{element.$description}} - - - - - -
- diff --git a/demo-shell/src/app/components/about/about.component.ts b/demo-shell/src/app/components/about/about.component.ts index 68b61f2d6b..93d5093a99 100644 --- a/demo-shell/src/app/components/about/about.component.ts +++ b/demo-shell/src/app/components/about/about.component.ts @@ -16,9 +16,6 @@ */ import { Component } from '@angular/core'; -import { ExtensionRef } from '@alfresco/adf-extensions'; -import { AppExtensionService } from '../../extensions/extension.service'; -import { Observable } from 'rxjs'; @Component({ selector: 'app-about-page', @@ -26,10 +23,8 @@ import { Observable } from 'rxjs'; styleUrls: ['about.component.scss'] }) export class AboutComponent { - extensionColumns: string[] = ['$id', '$name', '$version', '$vendor', '$license', '$runtime', '$description']; - extensions$: Observable; - constructor(appExtensions: AppExtensionService) { - this.extensions$ = appExtensions.references$; + constructor() { + } } diff --git a/demo-shell/src/app/components/app-layout/app-layout.component.html b/demo-shell/src/app/components/app-layout/app-layout.component.html index ff2a161ef5..1cc1e35967 100644 --- a/demo-shell/src/app/components/app-layout/app-layout.component.html +++ b/demo-shell/src/app/components/app-layout/app-layout.component.html @@ -1,19 +1,12 @@ + [expandedSidenav]="expandedSidenav" (expanded)="setState($event)" [position]="position"> - +
@@ -21,10 +14,7 @@
-
+ + + + + + diff --git a/demo-shell/src/app/components/app-layout/app-layout.component.scss b/demo-shell/src/app/components/app-layout/app-layout.component.scss index d816564856..a8ff43c03e 100644 --- a/demo-shell/src/app/components/app-layout/app-layout.component.scss +++ b/demo-shell/src/app/components/app-layout/app-layout.component.scss @@ -55,6 +55,7 @@ .adf-sidenav-menu-label { font-size: 14px; white-space: nowrap; + min-width: 120px; } } diff --git a/demo-shell/src/app/components/app-layout/app-layout.component.ts b/demo-shell/src/app/components/app-layout/app-layout.component.ts index 0c2bb6692d..ebb65ba3fe 100644 --- a/demo-shell/src/app/components/app-layout/app-layout.component.ts +++ b/demo-shell/src/app/components/app-layout/app-layout.component.ts @@ -38,20 +38,27 @@ export class AppLayoutComponent implements OnInit { { href: '/card-view', icon: 'view_headline', title: 'APP_LAYOUT.CARD_VIEW' }, { href: '/header-data', icon: 'edit', title: 'APP_LAYOUT.HEADER_DATA' }, { href: '/node-selector', icon: 'attachment', title: 'APP_LAYOUT.NODE-SELECTOR' }, + { href: '/sites', icon: 'format_list_bulleted', title: 'APP_LAYOUT.SITES' }, { href: '/task-list', icon: 'assignment', title: 'APP_LAYOUT.TASK_LIST' }, - { href: '/process-list', icon: 'assignment', title: 'APP_LAYOUT.PROCESS_LIST' }, - { href: '/cloud', icon: 'cloud', title: 'APP_LAYOUT.PROCESS_CLOUD' }, - { href: '/cloud/people-group-cloud', icon: 'group', title: 'APP_LAYOUT.PEOPLE_GROUPS_CLOUD' }, - { href: '/activiti', icon: 'device_hub', title: 'APP_LAYOUT.PROCESS_SERVICES' }, + { href: '/cloud', icon: 'cloud', title: 'APP_LAYOUT.PROCESS_CLOUD', children: [ + { href: '/cloud/', icon: 'cloud', title: 'APP_LAYOUT.HOME' }, + { href: '/cloud/people-group-cloud', icon: 'group', title: 'APP_LAYOUT.PEOPLE_GROUPS_CLOUD' } + ]}, + { href: '/activiti', icon: 'device_hub', title: 'APP_LAYOUT.PROCESS_SERVICES', children: [ + { href: '/activiti', icon: 'vpn_key', title: 'APP_LAYOUT.APP' }, + { href: '/process-list', icon: 'assignment', title: 'APP_LAYOUT.PROCESS_LIST' }, + { href: '/form', icon: 'poll', title: 'APP_LAYOUT.FORM' }, + { href: '/form-list', icon: 'library_books', title: 'APP_LAYOUT.FORM_LIST' }, + { href: '/form-loading', icon: 'cached', title: 'APP_LAYOUT.FORM_LOADING' } + ]}, { href: '/login', icon: 'vpn_key', title: 'APP_LAYOUT.LOGIN' }, { href: '/trashcan', icon: 'delete', title: 'APP_LAYOUT.TRASHCAN' }, { href: '/dl-custom-sources', icon: 'extension', title: 'APP_LAYOUT.CUSTOM_SOURCES' }, - { href: '/datatable', icon: 'view_module', title: 'APP_LAYOUT.DATATABLE' }, - { href: '/datatable-lazy', icon: 'view_module', title: 'APP_LAYOUT.DATATABLE_LAZY' }, + { href: '/datatable', icon: 'view_module', title: 'APP_LAYOUT.DATATABLE', children: [ + { href: '/datatable', icon: 'view_module', title: 'APP_LAYOUT.DATATABLE' }, + { href: '/datatable-lazy', icon: 'view_module', title: 'APP_LAYOUT.DATATABLE_LAZY' } + ]}, { href: '/template-list', icon: 'list_alt', title: 'APP_LAYOUT.TEMPLATE' }, - { href: '/form', icon: 'poll', title: 'APP_LAYOUT.FORM' }, - { href: '/form-list', icon: 'library_books', title: 'APP_LAYOUT.FORM_LIST' }, - { href: '/form-loading', icon: 'cached', title: 'APP_LAYOUT.FORM_LOADING' }, { href: '/webscript', icon: 'extension', title: 'APP_LAYOUT.WEBSCRIPT' }, { href: '/tag', icon: 'local_offer', title: 'APP_LAYOUT.TAG' }, { href: '/social', icon: 'thumb_up', title: 'APP_LAYOUT.SOCIAL' }, diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.html b/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.html index a062b24a13..47ee00b867 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.html +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.html @@ -1,7 +1,7 @@
-
{{applicationName + ' >'}}
+
{{appName + ' >'}}
{{filterName | translate}}
diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.ts b/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.ts index b069a2c44c..d3edf12944 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-breadcrumb-component.ts @@ -25,7 +25,7 @@ import { ActivatedRoute } from '@angular/router'; }) export class CloudBreadcrumbsComponent implements OnInit { - applicationName: string; + appName: string; filterName: string; constructor(private route: ActivatedRoute) { } @@ -33,7 +33,7 @@ export class CloudBreadcrumbsComponent implements OnInit { ngOnInit() { this.route.parent.params.subscribe(( params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); this.route.queryParams.subscribe((params) => { if (params.filterName) { diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.html b/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.html index 71deae9ede..806e7a617a 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.html @@ -24,7 +24,7 @@ - + diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.ts b/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.ts index 35b16f6894..f3513c1629 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-layout.component.ts @@ -26,7 +26,7 @@ import { CloudLayoutService } from './services/cloud-layout.service'; }) export class CloudLayoutComponent implements OnInit { displayMenu = true; - applicationName: string; + appName: string; constructor( private router: Router, @@ -37,7 +37,7 @@ export class CloudLayoutComponent implements OnInit { ngOnInit() { let root: string = ''; this.route.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); if (this.route.snapshot && this.route.snapshot.firstChild) { @@ -56,10 +56,10 @@ export class CloudLayoutComponent implements OnInit { } onStartTask() { - this.router.navigate([`/cloud/${this.applicationName}/start-task/`]); + this.router.navigate([`/cloud/${this.appName}/start-task/`]); } onStartProcess() { - this.router.navigate([`/cloud/${this.applicationName}/start-process/`]); + this.router.navigate([`/cloud/${this.appName}/start-process/`]); } } diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.html b/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.html index 467b00715d..3621839066 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.html @@ -1,11 +1,14 @@
- + {{ 'SETTINGS_CLOUD.MULTISELECTION' | translate }} - - + + {{ 'SETTINGS_CLOUD.TESTING_MODE' | translate }} - - + + + {{ 'SETTINGS_CLOUD.TASK_DETAILS_REDIRECTION' | translate }} + + {{ 'SETTINGS_CLOUD.SELECTION_MODE' | translate }} @@ -15,4 +18,4 @@ -
\ No newline at end of file + diff --git a/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.ts b/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.ts index 6690bb354d..7d2932b258 100644 --- a/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/cloud-settings.component.ts @@ -28,6 +28,7 @@ export class CloudSettingsComponent implements OnInit { multiselect: boolean; selectionMode: string; testingMode: boolean; + taskDetailsRedirection: boolean; selectionModeOptions = [ { value: '', title: 'None' }, @@ -43,14 +44,11 @@ export class CloudSettingsComponent implements OnInit { } setCurrentSettings(settings) { - if (settings.multiselect !== undefined) { + if (settings) { this.multiselect = settings.multiselect; - } - if (settings.testingMode !== undefined) { this.testingMode = settings.testingMode; - } - if (settings.selectionMode !== undefined) { this.selectionMode = settings.selectionMode; + this.taskDetailsRedirection = settings.taskDetailsRedirection; } } @@ -64,6 +62,11 @@ export class CloudSettingsComponent implements OnInit { this.setSetting(); } + toggleTaskDetailsRedirection() { + this.taskDetailsRedirection = !this.taskDetailsRedirection; + this.setSetting(); + } + onSelectionModeChange() { this.setSetting(); } @@ -72,7 +75,8 @@ export class CloudSettingsComponent implements OnInit { this.cloudLayoutService.setCurrentSettings({ multiselect: this.multiselect, testingMode: this.testingMode, - selectionMode: this.selectionMode + selectionMode: this.selectionMode, + taskDetailsRedirection: this.taskDetailsRedirection }); } } diff --git a/demo-shell/src/app/components/app-layout/cloud/directives/nested-menu-position.directive.ts b/demo-shell/src/app/components/app-layout/cloud/directives/nested-menu-position.directive.ts new file mode 100644 index 0000000000..a823a6c2c4 --- /dev/null +++ b/demo-shell/src/app/components/app-layout/cloud/directives/nested-menu-position.directive.ts @@ -0,0 +1,43 @@ +/*! + * @license + * Copyright 2019 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, HostListener, Input } from '@angular/core'; + +@Directive({ + selector: '[appNestedMenuPosition]' +}) +export class NestedMenuPositionDirective { + + @Input() + menuMinimized: string; + + nestedMenuLeftPadding: string = '220px'; + + @HostListener('click', ['$event']) + onClick() { + + let overlayContainer = (document.querySelector('.cdk-overlay-connected-position-bounding-box') as HTMLElement); + (document.querySelector('.cdk-overlay-pane') as HTMLElement).style.width = '100%'; + + if (!this.menuMinimized) { + setTimeout(() => { + overlayContainer.style.left = this.nestedMenuLeftPadding; + }); + } + } + +} diff --git a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.html index c7bcf39771..87917d2c49 100644 --- a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.html @@ -6,23 +6,41 @@
- {{ + {{ 'PEOPLE_GROUPS_CLOUD.SINGLE' | translate }} - {{ + {{ 'PEOPLE_GROUPS_CLOUD.MULTI' | translate }}
- + + {{ + 'PEOPLE_GROUPS_CLOUD.APP_FILTER_MODE' | translate }} + {{ + 'PEOPLE_GROUPS_CLOUD.ROLE_FILTER_MODE' | translate }} + + {{ 'PEOPLE_GROUPS_CLOUD.ROLE' | translate }} ['ACTIVITI_ADMIN', "ACTIVITI_USER"] - + - + + {{ 'PEOPLE_GROUPS_CLOUD.APP_NAME' | translate }} + + + {{ 'PEOPLE_GROUPS_CLOUD.PRESELECTED_VALUE' | translate }}: {{ DEFAULT_PEOPLE_PLACEHOLDER }} - + + {{ + 'PEOPLE_GROUPS_CLOUD.PRESELECT_VALIDATION' | translate }}
- +
@@ -44,24 +62,34 @@
- {{ + {{ 'PEOPLE_GROUPS_CLOUD.SINGLE' | translate }} - {{ + {{ 'PEOPLE_GROUPS_CLOUD.MULTI' | translate }}
- + + {{ + 'PEOPLE_GROUPS_CLOUD.APP_FILTER_MODE' | translate }} + {{ + 'PEOPLE_GROUPS_CLOUD.ROLE_FILTER_MODE' | translate }} + + {{ 'PEOPLE_GROUPS_CLOUD.ROLE' | translate }} ['ACTIVITI_ADMIN', "ACTIVITI_USER"] - + - + + {{ 'PEOPLE_GROUPS_CLOUD.APP_NAME' | translate }} + + + Preselect: {{ DEFAULT_GROUP_PLACEHOLDER }} - +
- +
@@ -73,4 +101,4 @@
- \ No newline at end of file + diff --git a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.scss b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.scss index 539d1c9b00..3603ae7b91 100644 --- a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.scss +++ b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.scss @@ -18,9 +18,13 @@ margin-right: 15px; min-width: 330px; - &-full { + &-big { width:60%; } + + &-full { + width:100%; + } } } } diff --git a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.ts index 5de5f57564..60bf38f6d9 100644 --- a/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/people-groups-cloud-demo.component.ts @@ -17,7 +17,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; import { PeopleCloudComponent, GroupCloudComponent, GroupModel } from '@alfresco/adf-process-services-cloud'; -import { MatRadioChange } from '@angular/material'; +import { MatRadioChange, MatCheckboxChange } from '@angular/material'; @Component({ selector: 'app-people-groups-cloud', @@ -27,17 +27,23 @@ import { MatRadioChange } from '@angular/material'; }) export class PeopleGroupCloudDemoComponent { + DEFAULT_FILTER_MODE: string = 'appName'; DEFAULT_GROUP_PLACEHOLDER: string = `[{"id": "1", "name":"activitiUserGroup"}]`; - DEFAULT_PEOPLE_PLACEHOLDER: string = `[{"email": "example@alfresco.com", "firstName":"Administrator", "lastName": "ADF"}]`; + DEFAULT_PEOPLE_PLACEHOLDER: string = `[{"id": "1", email": "user@user.com", "firstName":"user", "lastName": "lastName", "username": "user"}]`; peopleMode: string = PeopleCloudComponent.MODE_SINGLE; preSelectUsers: string[] = []; peopleRoles: string[] = []; + peopleAppName: string; + peopleFilterMode: string = this.DEFAULT_FILTER_MODE; + peoplePreselectValidation: Boolean = false; groupMode: string = GroupCloudComponent.MODE_SINGLE; preSelectGroup: GroupModel[] = []; selectedGroupList: GroupModel[] = []; groupRoles: string[]; + groupAppName: string; + groupFilterMode: string = this.DEFAULT_FILTER_MODE; setPeoplePreselectValue(event: any) { this.preSelectUsers = this.getArrayFromString(event.target.value); @@ -55,6 +61,14 @@ export class PeopleGroupCloudDemoComponent { this.groupRoles = this.getArrayFromString(event.target.value); } + setPeopleAppName(event: any) { + this.peopleAppName = event.target.value; + } + + setGroupAppName(event: any) { + this.groupAppName = event.target.value; + } + onChangePeopleMode(event: MatRadioChange) { this.peopleMode = event.value; this.preSelectUsers = [...this.preSelectUsers]; @@ -65,6 +79,45 @@ export class PeopleGroupCloudDemoComponent { this.preSelectGroup = [...this.preSelectGroup]; } + onChangePeopleFilterMode(event: MatRadioChange) { + this.peopleFilterMode = event.value; + this.resetPeopleFilter(); + } + + onChangeGroupsFilterMode(event: MatRadioChange) { + this.groupFilterMode = event.value; + this.restGroupFilter(); + } + + isPeopleAppNameSelected() { + return this.peopleFilterMode === 'appName'; + } + + isGroupAppNameSelected() { + return this.groupFilterMode === 'appName'; + } + + resetPeopleFilter() { + if (this.isPeopleAppNameSelected()) { + this.peopleRoles = []; + } else { + this.peopleAppName = ''; + } + } + + restGroupFilter() { + if (this.isGroupAppNameSelected()) { + this.groupRoles = []; + } else { + this.groupAppName = ''; + } + } + + onChangePeopleValidation(event: MatCheckboxChange) { + this.peoplePreselectValidation = event.checked; + this.preSelectUsers = [...this.preSelectUsers]; + } + isStringArray(str: string) { try { const result = JSON.parse(str); diff --git a/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.html new file mode 100644 index 0000000000..4cd466d5f5 --- /dev/null +++ b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.html @@ -0,0 +1,25 @@ + + + +

Simple page to show the process instance: {{ processInstanceId }} of the app: {{ appName }}

+ +
+ + + + + + +
+ diff --git a/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.scss b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.scss new file mode 100644 index 0000000000..f5e062505b --- /dev/null +++ b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.scss @@ -0,0 +1,14 @@ + .adf { + &-process-cloud-container { + display: flex; + } + + &-cloud-layout-overflow { + width:67%; + } + + &-process-cloud-header { + margin-left: 10px; + width: 25%; + } + } diff --git a/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.ts new file mode 100644 index 0000000000..faa9f1daaa --- /dev/null +++ b/demo-shell/src/app/components/app-layout/cloud/process-details-cloud-demo.component.ts @@ -0,0 +1,49 @@ +/*! + * @license + * Copyright 2019 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 } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; + +@Component({ + templateUrl: './process-details-cloud-demo.component.html', + styleUrls: ['./process-details-cloud-demo.component.scss'] +}) +export class ProcessDetailsCloudDemoComponent { + + processInstanceId: string; + appName: string; + + constructor(private route: ActivatedRoute, private router: Router) { + this.route.params.subscribe((params) => { + this.processInstanceId = params.processInstanceId; + }); + + this.route.parent.params.subscribe((params) => { + this.appName = params.appName; + }); + } + + onGoBack() { + this.router.navigate([`/cloud/${this.appName}/`]); + } + + onRowClick(taskId: string) { + if (taskId) { + this.router.navigate([`/cloud/${this.appName}/task-details/${taskId}`]); + } + } +} diff --git a/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.html index 6f31a6a396..af3a0ec943 100644 --- a/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.html @@ -1,29 +1,35 @@
- + - diff --git a/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.ts index ef0ddf682e..99ec46a3c6 100644 --- a/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/processes-cloud-demo.component.ts @@ -33,8 +33,8 @@ import { CloudLayoutService } from './services/cloud-layout.service'; }) export class ProcessesCloudDemoComponent implements OnInit { - public static ACTION_SAVE_AS = 'SAVE_AS'; - static PROCESS_FILTER_PROPERTY_KEYS = 'adf-edit-process-filter.properties'; + public static ACTION_SAVE_AS = 'saveAs'; + static PROCESS_FILTER_PROPERTY_KEYS = 'adf-edit-process-filter'; @ViewChild('processCloud') processCloud: ProcessListCloudComponent; @@ -42,7 +42,7 @@ export class ProcessesCloudDemoComponent implements OnInit { @ViewChild('processFiltersCloud') processFiltersCloud: ProcessFiltersCloudComponent; - applicationName: string = ''; + appName: string = ''; isFilterLoaded: boolean; filterId: string = ''; @@ -52,7 +52,7 @@ export class ProcessesCloudDemoComponent implements OnInit { selectionMode: string; selectedRows: string[] = []; testingMode: boolean; - processFilterProperties: any[] = []; + processFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] }; editedFilter: ProcessFilterCloudModel; @@ -71,7 +71,7 @@ export class ProcessesCloudDemoComponent implements OnInit { ngOnInit() { this.isFilterLoaded = false; this.route.parent.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); this.route.queryParams.subscribe((params) => { @@ -85,13 +85,9 @@ export class ProcessesCloudDemoComponent implements OnInit { } setCurrentSettings(settings) { - if (settings.multiselect !== undefined) { + if (settings) { this.multiselect = settings.multiselect; - } - if (settings.testingMode !== undefined) { this.testingMode = settings.testingMode; - } - if (settings.selectionMode !== undefined) { this.selectionMode = settings.selectionMode; } } @@ -104,8 +100,8 @@ export class ProcessesCloudDemoComponent implements OnInit { this.selectedRows = []; } - onRowClick($event) { - this.selectedRow = $event; + onRowClick(processInstanceId) { + this.router.navigate([`/cloud/${this.appName}/process-details/${processInstanceId}`]); } onFilterChange(query: any) { @@ -116,7 +112,7 @@ export class ProcessesCloudDemoComponent implements OnInit { onProcessFilterAction(filterAction: any) { this.cloudLayoutService.setCurrentProcessFilterParam({ id: filterAction.filter.id }); if (filterAction.actionType === ProcessesCloudDemoComponent.ACTION_SAVE_AS) { - this.router.navigate([`/cloud/${this.applicationName}/processes/`], { queryParams: filterAction.filter }); + this.router.navigate([`/cloud/${this.appName}/processes/`], { queryParams: filterAction.filter }); } } diff --git a/demo-shell/src/app/components/app-layout/cloud/services/cloud-layout.service.ts b/demo-shell/src/app/components/app-layout/cloud/services/cloud-layout.service.ts index 05b45f2539..6d8bb5ebcf 100644 --- a/demo-shell/src/app/components/app-layout/cloud/services/cloud-layout.service.ts +++ b/demo-shell/src/app/components/app-layout/cloud/services/cloud-layout.service.ts @@ -26,6 +26,7 @@ export class CloudLayoutService { private settings = { multiselect: false, testingMode: false, + taskDetailsRedirection: true, selectionMode: 'single' }; diff --git a/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.html index 8b8c2e805c..981810289d 100644 --- a/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.html @@ -1,7 +1,7 @@ - diff --git a/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.ts index 9a7891fd9f..9fff604ef6 100644 --- a/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/start-process-cloud-demo.component.ts @@ -19,13 +19,14 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { NotificationService, AppConfigService } from '@alfresco/adf-core'; import { CloudLayoutService } from './services/cloud-layout.service'; + @Component({ templateUrl: './start-process-cloud-demo.component.html', styleUrls: ['./start-process-cloud-demo.component.scss'] }) export class StartProcessCloudDemoComponent implements OnInit { - applicationName; + appName; processName: string; constructor(private appConfig: AppConfigService, @@ -37,7 +38,7 @@ export class StartProcessCloudDemoComponent implements OnInit { ngOnInit() { this.route.parent.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); this.processName = this.appConfig.get('adf-start-process.name'); @@ -45,12 +46,12 @@ export class StartProcessCloudDemoComponent implements OnInit { onStartProcessSuccess() { this.cloudLayoutService.setCurrentProcessFilterParam({ key: 'running-processes' }); - this.router.navigate([`/cloud/${this.applicationName}/processes`]); + this.router.navigate([`/cloud/${this.appName}/processes`]); } onCancelStartProcess() { this.cloudLayoutService.setCurrentProcessFilterParam({ key: 'all-processes' }); - this.router.navigate([`/cloud/${this.applicationName}/processes`]); + this.router.navigate([`/cloud/${this.appName}/processes`]); } openSnackMessage(event: any) { diff --git a/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.html index f77a9e6619..adf11967eb 100644 --- a/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.html @@ -1,5 +1,5 @@ diff --git a/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.ts index 391460bc0f..516bd9bda2 100644 --- a/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/start-task-cloud-demo.component.ts @@ -25,7 +25,7 @@ import { CloudLayoutService } from './services/cloud-layout.service'; }) export class StartTaskCloudDemoComponent implements OnInit { - applicationName; + appName; constructor( private cloudLayoutService: CloudLayoutService, @@ -36,18 +36,18 @@ export class StartTaskCloudDemoComponent implements OnInit { ngOnInit() { this.route.parent.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); } onStartTaskSuccess() { this.cloudLayoutService.setCurrentTaskFilterParam({key: 'my-tasks'}); - this.router.navigate([`/cloud/${this.applicationName}/tasks`]); + this.router.navigate([`/cloud/${this.appName}/tasks`]); } onCancelStartTask() { this.cloudLayoutService.setCurrentTaskFilterParam({key: 'my-tasks'}); - this.router.navigate([`/cloud/${this.applicationName}/tasks`]); + this.router.navigate([`/cloud/${this.appName}/tasks`]); } openSnackMessage(event: any) { diff --git a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.html index 3ed80ff5f4..68056e9373 100644 --- a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.html @@ -1,12 +1,19 @@ +

Simple page to show the taskId: {{ taskId }} of the app: {{ appName }}

- +
+
+ + -

Simple page to show the taskId: {{ taskId }} of the app: {{ applicationName }}

+ - - + +
+ + + + +
\ No newline at end of file diff --git a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.scss b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.scss index e69de29bb2..e97ca949e4 100644 --- a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.scss +++ b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.scss @@ -0,0 +1,20 @@ + +.adf { + + &-task-detail-container { + display: flex; + } + + &-task-tiitle { + margin-left:15px; + } + + &-task-control { + width:70%; + } + + &-demop-card-container { + width:30%; + font-family: inherit; + } +} diff --git a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.ts index 6746612b47..25f72933b2 100644 --- a/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/task-details-cloud-demo.component.ts @@ -15,30 +15,74 @@ * limitations under the License. */ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; +import { TaskDetailsCloudModel, TaskCloudService } from '@alfresco/adf-process-services-cloud'; @Component({ templateUrl: './task-details-cloud-demo.component.html', styleUrls: ['./task-details-cloud-demo.component.scss'] }) -export class TaskDetailsCloudDemoComponent { +export class TaskDetailsCloudDemoComponent implements OnInit { + taskDetails: TaskDetailsCloudModel; taskId: string; - applicationName: string; + appName: string; readOnly = false; - constructor(private route: ActivatedRoute, private router: Router) { + constructor( + private route: ActivatedRoute, + private router: Router, + private taskCloudService: TaskCloudService + ) { this.route.params.subscribe((params) => { this.taskId = params.taskId; }); this.route.parent.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); } - onGoBack() { - this.router.navigate([`/cloud/${this.applicationName}/`]); + ngOnInit() { + this.loadTaskDetailsById(this.appName, this.taskId); + } + loadTaskDetailsById(appName: string, taskId: string) { + this.taskCloudService.getTaskById(appName, taskId).subscribe( + (taskDetails: TaskDetailsCloudModel ) => { + this.taskDetails = taskDetails; + }); + } + + isTaskValid(): boolean { + return this.appName !== undefined && this.taskId !== undefined; + } + + canCompleteTask(): boolean { + return this.taskDetails && this.taskCloudService.canCompleteTask(this.taskDetails); + } + + canClaimTask(): boolean { + return this.taskDetails && this.taskCloudService.canClaimTask(this.taskDetails); + } + + canUnClaimTask(): boolean { + return this.taskDetails && this.taskCloudService.canUnclaimTask(this.taskDetails); + } + + goBack() { + this.router.navigate([`/cloud/${this.appName}/`]); + } + + onCompletedTask() { + this.goBack(); + } + + onUnclaimTask() { + this.goBack(); + } + + onClaimTask() { + this.goBack(); } } diff --git a/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.html b/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.html index 61914fc8c8..a6d7709655 100644 --- a/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.html +++ b/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.html @@ -1,14 +1,18 @@
+ (rowsSelected)="onRowsSelected($event)" + #taskCloud> - +
Selected rows: diff --git a/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.ts index ea804d831f..4cc0058347 100644 --- a/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/tasks-cloud-demo.component.ts @@ -27,13 +27,13 @@ import { CloudLayoutService } from './services/cloud-layout.service'; }) export class TasksCloudDemoComponent implements OnInit { - public static ACTION_SAVE_AS = 'SAVE_AS'; - static TASK_FILTER_PROPERTY_KEYS = 'adf-edit-task-filter.properties'; + public static ACTION_SAVE_AS = 'saveAs'; + static TASK_FILTER_PROPERTY_KEYS = 'adf-edit-task-filter'; @ViewChild('taskCloud') taskCloud: TaskListCloudComponent; - applicationName: string = ''; + appName: string = ''; isFilterLoaded = false; @@ -41,13 +41,14 @@ export class TasksCloudDemoComponent implements OnInit { sortArray: TaskListCloudSortingModel[]; editedFilter: TaskFilterCloudModel; - taskFilterProperties: any[] = []; + taskFilterProperties: any = { filterProperties: [], sortProperties: [], actions: [] }; filterId; multiselect: boolean; selectedRows: string[] = []; testingMode: boolean; selectionMode: string; + taskDetailsRedirection: boolean; constructor( private cloudLayoutService: CloudLayoutService, @@ -65,7 +66,7 @@ export class TasksCloudDemoComponent implements OnInit { ngOnInit() { this.isFilterLoaded = false; this.route.parent.params.subscribe((params) => { - this.applicationName = params.applicationName; + this.appName = params.appName; }); this.route.queryParams.subscribe((params) => { @@ -79,14 +80,11 @@ export class TasksCloudDemoComponent implements OnInit { } setCurrentSettings(settings) { - if (settings.multiselect !== undefined) { + if (settings) { this.multiselect = settings.multiselect; - } - if (settings.testingMode !== undefined) { this.testingMode = settings.testingMode; - } - if (settings.selectionMode !== undefined) { this.selectionMode = settings.selectionMode; + this.taskDetailsRedirection = settings.taskDetailsRedirection; } } @@ -99,8 +97,8 @@ export class TasksCloudDemoComponent implements OnInit { } onRowClick(taskId) { - if (!this.multiselect && this.selectionMode !== 'multiple') { - this.router.navigate([`/cloud/${this.applicationName}/task-details/${taskId}`]); + if (!this.multiselect && this.selectionMode !== 'multiple' && this.taskDetailsRedirection) { + this.router.navigate([`/cloud/${this.appName}/task-details/${taskId}`]); } } @@ -117,7 +115,7 @@ export class TasksCloudDemoComponent implements OnInit { onTaskFilterAction(filterAction: any) { this.cloudLayoutService.setCurrentTaskFilterParam({ id: filterAction.filter.id }); if (filterAction.actionType === TasksCloudDemoComponent.ACTION_SAVE_AS) { - this.router.navigate([`/cloud/${this.applicationName}/tasks/`], { queryParams: filterAction.filter }); + this.router.navigate([`/cloud/${this.appName}/tasks/`], { queryParams: filterAction.filter }); } } } diff --git a/demo-shell/src/app/components/card-view/card-view.component.ts b/demo-shell/src/app/components/card-view/card-view.component.ts index 82e77966b4..b9dfc16e95 100644 --- a/demo-shell/src/app/components/card-view/card-view.component.ts +++ b/demo-shell/src/app/components/card-view/card-view.component.ts @@ -48,6 +48,10 @@ export class CardViewComponent implements OnInit { this.createCard(); } + respondToCardClick() { + this.logs.push(`clickable field`); + } + ngOnInit() { this.cardViewUpdateService.itemUpdated$.subscribe(this.onItemChange.bind(this)); } @@ -118,6 +122,17 @@ export class CardViewComponent implements OnInit { value: new Map([['999', 'My Value']]), key: 'map', default: 'default map value' + }), + new CardViewTextItemModel({ + label: 'This is clickable ', + value: 'click here', + key: 'click', + default: 'click here', + editable: this.isEditable, + clickable: true, + clickCallBack: () => { + this.respondToCardClick(); + } }) ]; } diff --git a/demo-shell/src/app/components/config-editor/config-editor.component.html b/demo-shell/src/app/components/config-editor/config-editor.component.html index 031edf0671..613d80404b 100644 --- a/demo-shell/src/app/components/config-editor/config-editor.component.html +++ b/demo-shell/src/app/components/config-editor/config-editor.component.html @@ -42,6 +42,13 @@ + + Application List Cloud + + + Task List Cloud - - Edit process filter - - + + Edit process filter + + Process List Cloud @@ -63,11 +70,32 @@ - - Edit task filter - + + Edit task filter + + + + + Infinite pagination + + + + + Supported Page Sizes + + + + + Page Orientation + diff --git a/demo-shell/src/app/components/config-editor/config-editor.component.ts b/demo-shell/src/app/components/config-editor/config-editor.component.ts index 0e3ca21bae..0c5de2da75 100644 --- a/demo-shell/src/app/components/config-editor/config-editor.component.ts +++ b/demo-shell/src/app/components/config-editor/config-editor.component.ts @@ -16,7 +16,7 @@ */ import { Component } from '@angular/core'; -import { AppConfigService, NotificationService } from '@alfresco/adf-core'; +import { AppConfigService, NotificationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core'; @Component({ selector: 'app-config-editor', @@ -29,6 +29,8 @@ export class ConfigEditorComponent { code: any; field = 'content-metadata'; invalidJson = false; + isUserPreference = false; + userPreferenceProperty: string; editorOptions = { theme: 'vs-dark', @@ -43,13 +45,19 @@ export class ConfigEditorComponent { this.indentCode(); } - constructor(private appConfig: AppConfigService, private notificationService: NotificationService) { + constructor(private appConfig: AppConfigService, + private userPreferencesService: UserPreferencesService, + private notificationService: NotificationService) { this.code = JSON.stringify(appConfig.config['content-metadata']); } onSave() { try { - this.appConfig.config[this.field] = JSON.parse(this.editor.getValue()); + if (this.isUserPreference) { + this.userPreferencesService.set(this.userPreferenceProperty, JSON.parse(this.editor.getValue())); + } else { + this.appConfig.config[this.field] = JSON.parse(this.editor.getValue()); + } } catch (error) { this.invalidJson = true; this.notificationService.openSnackMessage( @@ -71,65 +79,115 @@ export class ConfigEditorComponent { } fileConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['files']); this.field = 'files'; this.indentCode(); } + textOrientationClick() { + this.isUserPreference = true; + this.userPreferenceProperty = 'textOrientation'; + + this.userPreferencesService.select( this.userPreferenceProperty).subscribe((textOrientation: number) => { + this.code = JSON.stringify(textOrientation); + this.field = 'textOrientation'; + this.indentCode(); + }); + + this.indentCode(); + } + searchConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['search']); this.field = 'search'; this.indentCode(); } metadataConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['content-metadata']); this.field = 'content-metadata'; this.indentCode(); } taskHeaderConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-task-header']); this.field = 'adf-task-header'; this.indentCode(); } processInstanceHeaderConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-process-instance-header']); this.field = 'adf-process-instance-header'; this.indentCode(); } startProcessConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-start-process']); this.field = 'adf-start-process'; this.indentCode(); } taskListCloudConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-cloud-task-list']); this.field = 'adf-cloud-task-list'; this.indentCode(); } editProcessFilterConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-edit-process-filter']); this.field = 'adf-edit-process-filter'; this.indentCode(); } editTaskFilterConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-edit-task-filter']); this.field = 'adf-edit-task-filter'; this.indentCode(); } processListCloudConfClick() { + this.isUserPreference = false; this.code = JSON.stringify(this.appConfig.config['adf-cloud-process-list']); this.field = 'adf-cloud-process-list'; this.indentCode(); } + infinitePaginationConfClick() { + this.isUserPreference = true; + this.userPreferenceProperty = UserPreferenceValues.PaginationSize; + this.userPreferencesService.select(this.userPreferenceProperty).subscribe((pageSize: number) => { + this.code = JSON.stringify(pageSize); + this.field = 'adf-infinite-pagination'; + this.indentCode(); + }); + } + + supportedPageSizesClick() { + this.isUserPreference = true; + this.userPreferenceProperty = UserPreferenceValues.SupportedPageSizes; + this.userPreferencesService.select(this.userPreferenceProperty).subscribe((supportedPageSizes: number) => { + this.code = JSON.stringify(supportedPageSizes); + this.field = 'adf-supported-page-size'; + this.indentCode(); + }); + } + + applicationListCloudConfClick() { + this.isUserPreference = false; + this.code = JSON.stringify(this.appConfig.config['alfresco-deployed-apps']); + this.field = 'alfresco-deployed-apps'; + this.indentCode(); + } + indentCode() { setTimeout(() => { this.editor.getAction('editor.action.formatDocument').run(); diff --git a/demo-shell/src/app/components/datatable/datatable.component.html b/demo-shell/src/app/components/datatable/datatable.component.html index 5d95002843..32fca95c03 100644 --- a/demo-shell/src/app/components/datatable/datatable.component.html +++ b/demo-shell/src/app/components/datatable/datatable.component.html @@ -2,28 +2,37 @@ - - - - + + Sticky header + + +
+ + + + +
Selected items: {{ dataTable.selection?.length }} @@ -47,4 +56,4 @@ -
+
\ No newline at end of file diff --git a/demo-shell/src/app/components/datatable/datatable.component.ts b/demo-shell/src/app/components/datatable/datatable.component.ts index bfe9185149..2d500abed9 100644 --- a/demo-shell/src/app/components/datatable/datatable.component.ts +++ b/demo-shell/src/app/components/datatable/datatable.component.ts @@ -54,6 +54,7 @@ export class DataTableComponent { multiselect = false; data: FilteredDataAdapter; + stickyHeader = false; @Input() selectionMode = 'single'; @@ -74,12 +75,18 @@ export class DataTableComponent { this.reset(); } + /* spellchecker: disable */ reset() { this.data = new FilteredDataAdapter( [ { id: 1, - name: 'Name 1', + name: `Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + Excepteur sint occaecat cupidatat non proident, + sunt in culpa qui officia deserunt mollit anim id est laborum.`, createdOn: new Date(2016, 6, 2, 15, 8, 1), createdBy: this._createdBy, icon: 'material-icons://folder_open' @@ -100,23 +107,24 @@ export class DataTableComponent { }, { id: 4, - name: 'Image 1', + name: 'Image 8', createdOn: new Date(2016, 6, 2, 15, 8, 4), createdBy: this._createdBy, - icon: this._imageUrl + icon: 'material-icons://alarm' } ], [ { type: 'image', key: 'icon', title: '', srTitle: 'Thumbnail' }, - { type: 'text', key: 'id', title: 'Id', sortable: true , cssClass: 'adf-desktop-only'}, - { type: 'text', key: 'createdOn', title: 'Created On', sortable: true }, - { type: 'text', key: 'name', title: 'Name', cssClass: 'adf-full-width adf-name-column', sortable: true }, - { type: 'text', key: 'createdBy.name', title: 'Created By', sortable: true, cssClass: 'adf-desktop-only'} + { type: 'text', key: 'id', title: 'Id', sortable: true , cssClass: '' }, + { type: 'text', key: 'createdOn', title: 'Created On', sortable: true, cssClass: 'adf-ellipsis-cell adf-expand-cell-5' }, + { type: 'text', key: 'name', title: 'Name', cssClass: 'adf-ellipsis-cell', sortable: true }, + { type: 'text', key: 'createdBy.name', title: 'Created By', sortable: true, cssClass: ''} ] ); this.data.setSorting(new DataSorting('id', 'asc')); } + /* spellchecker: enable */ addRow() { const id = this.data.getRows().length + 1; @@ -199,4 +207,8 @@ export class DataTableComponent { onRowDblClick(event) { this.logService.log(event); } + + toggleStickyHeader() { + this.stickyHeader = !this.stickyHeader; + } } diff --git a/demo-shell/src/app/components/file-view/file-view.component.html b/demo-shell/src/app/components/file-view/file-view.component.html index 3488d76c8f..0fa9cb5a31 100644 --- a/demo-shell/src/app/components/file-view/file-view.component.html +++ b/demo-shell/src/app/components/file-view/file-view.component.html @@ -4,7 +4,7 @@ - + diff --git a/demo-shell/src/app/components/file-view/file-view.component.scss b/demo-shell/src/app/components/file-view/file-view.component.scss index a834b0602b..2be390eb61 100644 --- a/demo-shell/src/app/components/file-view/file-view.component.scss +++ b/demo-shell/src/app/components/file-view/file-view.component.scss @@ -1,3 +1,12 @@ .adf-viewer__sidebar { width: 380px !important; } + +/* stylelint-disable */ +.monaco-scrollable-element { + width: 600px; +} + +adf-preview-extension { + width: 600px; +} diff --git a/demo-shell/src/app/components/file-view/file-view.component.ts b/demo-shell/src/app/components/file-view/file-view.component.ts index 86ad27b4c2..2fcb5aa68c 100644 --- a/demo-shell/src/app/components/file-view/file-view.component.ts +++ b/demo-shell/src/app/components/file-view/file-view.component.ts @@ -17,7 +17,7 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { ContentService, PermissionsEnum, NodesApiService } from '@alfresco/adf-core'; +import { ContentService, AllowableOperationsEnum, PermissionsEnum, NodesApiService } from '@alfresco/adf-core'; import { MatSnackBar } from '@angular/material'; @Component({ @@ -52,7 +52,7 @@ export class FileViewComponent implements OnInit { showLeftSidebar = null; showRightSidebar = false; customToolbar = false; - isCommentDisabled = false; + isCommentEnabled = false; constructor(private router: Router, private route: ActivatedRoute, @@ -68,7 +68,8 @@ export class FileViewComponent implements OnInit { this.nodeApiService.getNode(id).subscribe( (node) => { if (node && node.isFile) { - this.isCommentDisabled = this.contentServices.hasPermissions(node, PermissionsEnum.CONSUMER); + this.isCommentEnabled = this.contentServices.hasPermissions(node, PermissionsEnum.NOT_CONSUMER) || + this.contentServices.hasAllowableOperations(node, AllowableOperationsEnum.UPDATE); this.nodeId = id; return; } diff --git a/demo-shell/src/app/components/files/files.component.html b/demo-shell/src/app/components/files/files.component.html index 4b47c3e023..06eec65dd6 100644 --- a/demo-shell/src/app/components/files/files.component.html +++ b/demo-shell/src/app/components/files/files.component.html @@ -1,10 +1,11 @@
- - + + - {{ 'DOCUMENT_LIST.RECENT.TITLE' | translate }}history + {{ 'DOCUMENT_LIST.RECENT.TITLE' | translate }} + history @@ -31,7 +32,8 @@
-
+
{{errorMessage}}
- + - view_comfy - list + view_comfy + + list +
- @@ -148,8 +155,12 @@ @@ -160,7 +171,7 @@ @@ -200,8 +211,10 @@ - + -

You don't have permissions

+

You don't have permissions

-
-
{{ 'SEARCH.NO_RESULT' | translate }}
-
+
+
{{ 'SEARCH.NO_RESULT' | translate }}
+
+ [formatTooltip]="getNodeNameTooltip"> @@ -254,7 +267,7 @@ key="name" title="{{'DOCUMENT_LIST.COLUMNS.DISPLAY_NAME' | translate}}" [formatTooltip]="getNodeNameTooltip" - class="adf-full-width adf-ellipsis-cell"> + class="adf-ellipsis-cell adf-expand-cell-5"> + key="id" + class="adf-desktop-only">
- +
- + {{'DOCUMENT_LIST.CUSTOM_FILTER' | translate}}
@@ -531,13 +557,14 @@
- + {{'DOCUMENT_LIST.ALLOW_DROP_FILES' | translate}}
- + {{'DOCUMENT_LIST.ENABLE_VERSIONING' | translate}}
@@ -585,6 +612,12 @@ +
+ + Sticky Header + +
Upload
@@ -655,4 +688,4 @@
- + diff --git a/demo-shell/src/app/components/files/files.component.scss b/demo-shell/src/app/components/files/files.component.scss index cf9e80eab0..1d7ab7a8a0 100644 --- a/demo-shell/src/app/components/files/files.component.scss +++ b/demo-shell/src/app/components/files/files.component.scss @@ -1,7 +1,7 @@ @mixin adf-file-component-theme($theme) { - $minimumDocumentListWidth: 900px; $foreground: map-get($theme, foreground); + .adf-container { margin: 10px !important; } @@ -38,9 +38,21 @@ adf-document-list ::ng-deep .adf-datatable-selected > svg { fill: #00bcd4 !important; + margin-top: -4px; + margin-left: -4px; + width: 32px; + height: 32px; } - .adf-data-table-card .adf-lock-button { + .adf-document-list-container { + min-height: 400px; + + .adf-datatable-list { + min-height: 400px; + } + } + + .adf-datatable-card .adf-lock-button { top: -10px; } @@ -59,10 +71,6 @@ .adf-toolbar-title { display: flex; width: 100%; - - .adf-breadcrumb { - width: 0; - } } } @@ -128,46 +136,115 @@ } } - @media (max-device-width: $minimumDocumentListWidth) { - adf-document-list .adf-data-table { - .adf-data-table-cell, - .adf-datatable-table-cell-header { - display: none; - } - - .adf-data-table-cell:first-child, - .adf-datatable-table-cell-header:first-child, - .adf-data-table-cell:nth-child(2), - .adf-datatable-table-cell-header:nth-child(2) { - display: table-cell; - } + @media all { + .adf-isLocked-column { + max-width: 30px !important; + margin-right: 5px; } - .adf-site-container-style { - width: 100%; - display: block; - - & ::ng-deep .adf-site-dropdown-list-element { - width: 100%; - } + .adf-folder-image-column { + max-width: 28px!important; } + } - adf-file-uploading-dialog ::ng-deep .adf-upload-dialog { - width: 80%; + @media (max-width: 768px) { + .adf-createdOn-column { + display: none !important; + } + } - & ::ng-deep adf-file-uploading-list ::ng-deep adf-file-uploading-list-row - .adf-file-uploading-row__group { - min-width: 0; + @media (max-width: 500px) { + .adf-datatable-list { + .adf { + + &-display-name-column { + max-width: 50% !important; + } + &-size-column { + display: none !important; + } + &-createdBy-column { + max-width: 45% !important; + } + &-nodeId-column { + display: none !important; + } } } } - @media (max-device-width: 1024px) { - adf-document-list .adf-data-table { + @media (max-width: 600px) { + .adf-datatable-list { + .adf { + &-display-name-column { + max-width: 35%; + } + &-size-column { + max-width: 8%; + } + &-createdBy-column { + max-width: 35%; + } + &-createdOn-column { + max-width: 15%; + } + &-nodeId-column { + max-width: 10%; + } + &-isLocked-column { + display: none!important; + } + &-standard-breadcrumb { + display: none !important; + } + } + } + } - .adf-data-table-cell:nth-child(5), - .adf-datatable-table-cell-header:nth-child(5) { - display: none; + @media (min-width: 601px) { + .adf-datatable-list { + .adf { + + &-display-name-column { + max-width: 30%; + } + &-size-column { + max-width: 10%; + } + &-createdBy-column { + max-width: 30%; + } + &-createdOn-column { + max-width: 15%; + } + &-nodeId-column { + max-width: 12%; + } + &-alternate-breadcrumb { + display: none !important; + } + } + } + } + + @media (min-width: 1400px) { + .adf-datatable-list { + .adf { + &-display-name-column { + max-width: 40%; + } + &-size-column { + max-width: 15%; + } + &-createdBy-column { + max-width: 20%; + } + &-createdOn-column { + max-width: 20%; + } + &-nodeId-column { + max-width: 20%; + } } } } diff --git a/demo-shell/src/app/components/files/files.component.ts b/demo-shell/src/app/components/files/files.component.ts index 02b5bc3100..b7ea355d10 100644 --- a/demo-shell/src/app/components/files/files.component.ts +++ b/demo-shell/src/app/components/files/files.component.ts @@ -28,7 +28,7 @@ import { AlfrescoApiService, AuthenticationService, AppConfigService, AppConfigValues, ContentService, TranslationService, FileUploadEvent, FolderCreatedEvent, LogService, NotificationService, UploadService, DataColumn, DataRow, UserPreferencesService, - PaginationComponent, FormValues, DisplayMode, InfinitePaginationComponent + PaginationComponent, FormValues, DisplayMode, InfinitePaginationComponent, HighlightDirective } from '@alfresco/adf-core'; import { @@ -46,6 +46,7 @@ import { MetadataDialogAdapterComponent } from './metadata-dialog-adapter.compon import { Subscription } from 'rxjs'; import { PreviewService } from '../../services/preview.service'; import { debounceTime } from 'rxjs/operators'; +import { SearchEntry } from '@alfresco/js-api'; const DEFAULT_FOLDER_TO_SHOW = '-my-'; @@ -150,6 +151,9 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { @Input() showNameColumn = true; + @Input() + searchTerm = ''; + @Output() documentListReady: EventEmitter = new EventEmitter(); @@ -180,8 +184,12 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { @ViewChild(InfinitePaginationComponent) infinitePaginationComponent: InfinitePaginationComponent; + @ViewChild(HighlightDirective) + highlighter: HighlightDirective; + permissionsStyle: PermissionStyleModel[] = []; infiniteScrolling: boolean; + stickyHeader: boolean; warnOnMultipleUploads = false; thumbnails = false; enableCustomPermissionMessage = false; @@ -581,4 +589,10 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { ); }); } + + searchResultsHighlight(search: SearchEntry): string { + if (search && search.highlight) { + return search.highlight.map((currentHighlight) => currentHighlight.snippets).join(', '); + } + } } diff --git a/demo-shell/src/app/components/form/form-list.component.ts b/demo-shell/src/app/components/form/form-list.component.ts index 494c3c5910..5bc660b9e8 100644 --- a/demo-shell/src/app/components/form/form-list.component.ts +++ b/demo-shell/src/app/components/form/form-list.component.ts @@ -16,8 +16,7 @@ */ import { Component, ViewChild } from '@angular/core'; -import { FormComponent, FormModel, FormService, LogService } from '@alfresco/adf-core'; -import { FormOutcomeEvent } from '../../../../../lib/core/form/components/widgets/core'; +import { FormComponent, FormModel, FormService, LogService, FormOutcomeEvent } from '@alfresco/adf-core'; @Component({ selector: 'app-form-list', diff --git a/demo-shell/src/app/components/home/home.component.spec.ts b/demo-shell/src/app/components/home/home.component.spec.ts index 0411936849..e0de377797 100644 --- a/demo-shell/src/app/components/home/home.component.spec.ts +++ b/demo-shell/src/app/components/home/home.component.spec.ts @@ -23,7 +23,7 @@ import { CoreModule } from '@alfresco/adf-core'; describe('HomeComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [CoreModule], + imports: [CoreModule.forRoot()], declarations: [HomeComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA] }); diff --git a/demo-shell/src/app/components/logout/logout.component.html b/demo-shell/src/app/components/logout/logout.component.html index e156a55850..1ed2d72e02 100644 --- a/demo-shell/src/app/components/logout/logout.component.html +++ b/demo-shell/src/app/components/logout/logout.component.html @@ -1,5 +1,5 @@
-
+

{{ 'APP.LOGOUT.TITLE' | translate}}

{{ 'APP.LOGOUT.SUB_TITLE' | translate}}

diff --git a/demo-shell/src/app/components/permissions/demo-permissions.component.ts b/demo-shell/src/app/components/permissions/demo-permissions.component.ts index 0d5d1b8d8c..c0bf66d7e2 100644 --- a/demo-shell/src/app/components/permissions/demo-permissions.component.ts +++ b/demo-shell/src/app/components/permissions/demo-permissions.component.ts @@ -63,17 +63,15 @@ export class DemoPermissionComponent implements OnInit { } openAddPermissionDialog(event: Event) { - this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe(() => { - this.displayPermissionComponent.reload(); - }, - (error) => { - this.showErrorMessage(error); - }); + this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe( + () => this.displayPermissionComponent.reload(), + (error) => this.showErrorMessage(error)); } showErrorMessage(error) { + const message = error.message ? error.message : error; this.notificationService.openSnackMessage( - error, + message, 4000 ); } diff --git a/demo-shell/src/app/components/process-service/process-service.component.scss b/demo-shell/src/app/components/process-service/process-service.component.scss index f23020db6f..b1cdf8233b 100644 --- a/demo-shell/src/app/components/process-service/process-service.component.scss +++ b/demo-shell/src/app/components/process-service/process-service.component.scss @@ -71,23 +71,23 @@ } .adf-list { - .adf-data-table { + .adf-datatable-list { border: none; } - .adf-data-table tr, - .adf-data-table td { + .adf-datatable tr, + .adf-datatable td { height: 36px; font-size: 14px; } - .adf-data-table td { + .adf-datatable td { padding-top: 0; padding-bottom: 0; border-bottom: none; } - .adf-data-table th { + .adf-datatable th { padding-top: 0; padding-bottom: 0; height: 40px; diff --git a/demo-shell/src/app/components/process-service/process-service.component.ts b/demo-shell/src/app/components/process-service/process-service.component.ts index 87994b19fe..1d94f49d57 100644 --- a/demo-shell/src/app/components/process-service/process-service.component.ts +++ b/demo-shell/src/app/components/process-service/process-service.component.ts @@ -419,7 +419,7 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit } relocateLocationToTask(): void { - this.location.go(`/activiti/apps/${this.appId || 0}/tasks/${this.taskFilter.id}`); + this.location.go(`/activiti/apps/${this.appId || 0}/tasks/${this.taskFilter ? this.taskFilter.id : 0}`); } relocateLocationToReport(): void { @@ -484,7 +484,7 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit name: event.value.name || 'No name', created: event.value.created }; - this.activitiFilter.selectFilter(null); + if (this.taskList) { this.taskList.setCustomDataSource([processTaskDataRow]); this.taskList.selectTask(taskId); diff --git a/demo-shell/src/app/components/process-service/task-attachments.component.ts b/demo-shell/src/app/components/process-service/task-attachments.component.ts index dc5abe30ab..f235452b58 100644 --- a/demo-shell/src/app/components/process-service/task-attachments.component.ts +++ b/demo-shell/src/app/components/process-service/task-attachments.component.ts @@ -22,10 +22,9 @@ import { TaskDetailsModel, TaskUploadService } from '@alfresco/adf-process-services'; -import { UploadService, AlfrescoApiService, AppConfigService } from '@alfresco/adf-core'; +import { UploadService, AlfrescoApiService, AppConfigService, FileUploadCompleteEvent } from '@alfresco/adf-core'; import { PreviewService } from '../../services/preview.service'; import { Subscription } from 'rxjs'; -import { FileUploadCompleteEvent } from '../../../../../lib/core/events/file.event'; export function taskUploadServiceFactory(api: AlfrescoApiService, config: AppConfigService) { return new TaskUploadService(api, config); diff --git a/demo-shell/src/app/components/search/search-result.component.html b/demo-shell/src/app/components/search/search-result.component.html index 4a97f107cd..5f32d0ce3f 100644 --- a/demo-shell/src/app/components/search/search-result.component.html +++ b/demo-shell/src/app/components/search/search-result.component.html @@ -1,5 +1,5 @@
- +
@@ -21,6 +21,7 @@ [nodeResult]="data" [disableDragArea]="true" [pagination]="pagination" + [searchTerm]="searchedWord" (changedPageSize)="onRefreshPagination($event)" (changedPageNumber)="onRefreshPagination($event)" (turnedNextPage)="onRefreshPagination($event)" diff --git a/demo-shell/src/app/components/sites/sites.component.html b/demo-shell/src/app/components/sites/sites.component.html new file mode 100644 index 0000000000..487d40b193 --- /dev/null +++ b/demo-shell/src/app/components/sites/sites.component.html @@ -0,0 +1,28 @@ +

Select Site

+ + + +Current Selected Site {{currentSelectedSite}} + + +

Hide My Files

+ + + + +

Select Default Site

+ +
+ + + + +
+ + +
+ + +
+ + diff --git a/demo-shell/src/assets/.gitkeep b/demo-shell/src/app/components/sites/sites.component.scss similarity index 100% rename from demo-shell/src/assets/.gitkeep rename to demo-shell/src/app/components/sites/sites.component.scss diff --git a/demo-shell/src/app/components/sites/sites.component.ts b/demo-shell/src/app/components/sites/sites.component.ts new file mode 100644 index 0000000000..5693a4670d --- /dev/null +++ b/demo-shell/src/app/components/sites/sites.component.ts @@ -0,0 +1,40 @@ +/*! + * @license + * Copyright 2019 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 } from '@angular/core'; + +@Component({ + selector: 'app-sites', + templateUrl: 'sites.component.html', + styleUrls: ['sites.component.scss'] +}) +export class SitesComponent { + + currentSelectedSite: string; + hideMyFiles: boolean = false; + showDefaultSite: boolean = false; + defaultSite: string; + + onSiteChange($event: any) { + this.currentSelectedSite = JSON.stringify($event.entry); + } + + applySite() { + this.showDefaultSite = true; + } + +} diff --git a/demo-shell/src/app/components/sites/sites.module.ts b/demo-shell/src/app/components/sites/sites.module.ts new file mode 100644 index 0000000000..77f305c58c --- /dev/null +++ b/demo-shell/src/app/components/sites/sites.module.ts @@ -0,0 +1,41 @@ +/*! + * @license + * Copyright 2019 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 { NgModule } from '@angular/core'; +import { SitesComponent } from './sites.component'; +import { Routes, RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { CoreModule } from '@alfresco/adf-core'; +import { ContentModule } from '@alfresco/adf-content-services'; + +const routes: Routes = [ + { + path: '', + component: SitesComponent + } +]; + +@NgModule({ + imports: [ + CommonModule, + RouterModule.forChild(routes), + CoreModule.forChild(), + ContentModule.forChild() + ], + declarations: [SitesComponent] +}) +export class SitesModule {} diff --git a/demo-shell/src/app/components/task-list-demo/task-list-demo.component.html b/demo-shell/src/app/components/task-list-demo/task-list-demo.component.html index 446b769672..dd27c62036 100644 --- a/demo-shell/src/app/components/task-list-demo/task-list-demo.component.html +++ b/demo-shell/src/app/components/task-list-demo/task-list-demo.component.html @@ -169,8 +169,16 @@ - - + + +
{{entry.row.obj.created | date:'MMM d, yyyy' }}
+
+
+ + +
{{entry.row.obj.dueDate | date:'MMM d, yyyy' }}
+
+
diff --git a/demo-shell/src/app/components/trashcan/trashcan.component.html b/demo-shell/src/app/components/trashcan/trashcan.component.html index eb601ff298..505778b790 100644 --- a/demo-shell/src/app/components/trashcan/trashcan.component.html +++ b/demo-shell/src/app/components/trashcan/trashcan.component.html @@ -42,8 +42,8 @@ -

{{ 'TRASHCAN.EMPTY_STATE.FIRST_TEXT' | translate }}

-

{{ 'TRASHCAN.EMPTY_STATE.SECOND_TEXT' | translate }}

+
{{ 'TRASHCAN.EMPTY_STATE.FIRST_TEXT' | translate }}
+
{{ 'TRASHCAN.EMPTY_STATE.SECOND_TEXT' | translate }}
@@ -57,7 +57,7 @@ @@ -80,7 +80,7 @@ diff --git a/demo-shell/src/app/extensions/extensions.module.ts b/demo-shell/src/app/extensions/extensions.module.ts deleted file mode 100644 index 24d68622c8..0000000000 --- a/demo-shell/src/app/extensions/extensions.module.ts +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * @license - * Copyright 2019 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 { NgModule, ModuleWithProviders, APP_INITIALIZER } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { CoreModule } from '@alfresco/adf-core'; -import { AppExtensionService } from './extension.service'; -import { ExtensionsModule } from '@alfresco/adf-extensions'; - -export function setupExtensions(service: AppExtensionService): Function { - return () => service.load(); -} - -@NgModule({ - imports: [CommonModule, CoreModule.forChild(), ExtensionsModule] -}) -export class AppExtensionsModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: AppExtensionsModule, - providers: [ - { - provide: APP_INITIALIZER, - useFactory: setupExtensions, - deps: [AppExtensionService], - multi: true - } - ] - }; - } - - static forChild(): ModuleWithProviders { - return { - ngModule: AppExtensionsModule - }; - } -} diff --git a/demo-shell/src/assets/app.extensions.json b/demo-shell/src/assets/app.extensions.json index ecda91eb59..a7e0183e9d 100644 --- a/demo-shell/src/assets/app.extensions.json +++ b/demo-shell/src/assets/app.extensions.json @@ -1,15 +1,9 @@ { - "$schema": "./extension.schema.json", - "$id": "app.1.0.0", - "$name": "app", - "$version": "1.0.0", - "$vendor": "Alfresco", - "$license": "Apache-2.0", - "$runtime": "2.7.0", - "$description": "base application extensions", + "$schema": "../../lib/extensions/config/schema/app-extension.schema.json", "$references": [ "plugin1.json", - "plugin2.json" + "plugin2.json", + "monaco-extension.json" ], "$dependencies": [] } diff --git a/demo-shell/src/assets/plugins/monaco-extension.json b/demo-shell/src/assets/plugins/monaco-extension.json new file mode 100644 index 0000000000..1b5cc0d874 --- /dev/null +++ b/demo-shell/src/assets/plugins/monaco-extension.json @@ -0,0 +1,17 @@ +{ + "$schema": "../../../lib/extensions/config/schema/plugin-extension.schema.json", + "$version": "1.0.0", + "$name": "monaco extension", + "$description": "monaco plugin", + "features": { + "viewer": { + "content": [ + { + "id": "dev.tools.viewer", + "fileExtension": "js", + "component": "monaco-extension.main.component" + } + ] + } + } +} diff --git a/demo-shell/src/assets/plugins/plugin1.json b/demo-shell/src/assets/plugins/plugin1.json index 72d2095dac..63991be786 100644 --- a/demo-shell/src/assets/plugins/plugin1.json +++ b/demo-shell/src/assets/plugins/plugin1.json @@ -1,16 +1,11 @@ { - "$schema": "../extension.schema.json", - "$id": "plugin1.1.0.0", + "$schema": "../../../lib/extensions/config/schema/plugin-extension.schema.json", "$name": "plugin1", "$version": "1.0.0", "$vendor": "Alfresco", "$license": "Apache-2.0", "$runtime": "2.7.0", "$description": "example plugin", - "$dependencies": [ - "@some/library1" - ], - "features": { "custom": { "key": "value" diff --git a/demo-shell/src/assets/plugins/plugin2.json b/demo-shell/src/assets/plugins/plugin2.json index 7afe124bb5..508f7c82ec 100644 --- a/demo-shell/src/assets/plugins/plugin2.json +++ b/demo-shell/src/assets/plugins/plugin2.json @@ -1,16 +1,11 @@ { - "$schema": "../extension.schema.json", - "$id": "plugin2.1.1.0", + "$schema": "../../../lib/extensions/config/schema/plugin-extension.schema.json", "$name": "plugin2", "$version": "1.1.0", "$vendor": "Alfresco", "$license": "Apache-2.0", "$runtime": "2.7.0", "$description": "another example plugin", - "$dependencies": [ - "@some/library2" - ], - "features": { "extra": { "key": "value" diff --git a/demo-shell/src/tsconfig.app.json b/demo-shell/src/tsconfig.app.json index 2cbf8b3b7f..7166e04043 100644 --- a/demo-shell/src/tsconfig.app.json +++ b/demo-shell/src/tsconfig.app.json @@ -4,27 +4,7 @@ "outDir": "../out-tsc/app", "module": "es2015", "baseUrl": ".", - "types": [], - "paths": { - "@alfresco/adf-extensions": [ - "../../lib/extensions" - ], - "@alfresco/adf-core": [ - "../../lib/core" - ], - "@alfresco/adf-process-services-cloud": [ - "../../lib/process-services-cloud" - ], - "@alfresco/adf-content-services": [ - "../../lib/content-services" - ], - "@alfresco/adf-process-services": [ - "../../lib/process-services" - ], - "@alfresco/adf-insights": [ - "../../lib/insights" - ] - } + "types": [] }, "exclude": [ "test.ts", diff --git a/demo-shell/src/tsconfig.dev.json b/demo-shell/src/tsconfig.dev.json index c136985665..908dbbceef 100644 --- a/demo-shell/src/tsconfig.dev.json +++ b/demo-shell/src/tsconfig.dev.json @@ -34,6 +34,9 @@ ], "@alfresco/adf-process-services-cloud": [ "../../lib/process-services-cloud" + ], + "@alfresco/adf-testing": [ + "../../lib/testing" ] } }, diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000000..1f7d7ee24a --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +if [ -n "${APP_CONFIG_AUTH_TYPE}" ];then + sed -e "s/\"authType\": \".*\"/\"authType\": \"${APP_CONFIG_AUTH_TYPE}\"/g" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_HOST}" ];then + replace="\/" + encoded=${APP_CONFIG_OAUTH2_HOST//\//$replace} + sed -e "s/\"host\": \".*\"/\"host\": \"${encoded}\"/g" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_CLIENTID}" ];then + sed -e "s/\"clientId\": \".*\"/\"clientId\": \"${APP_CONFIG_OAUTH2_CLIENTID}\"/g" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_IMPLICIT_FLOW}" ];then + sed "/implicitFlow/s/true/${APP_CONFIG_OAUTH2_IMPLICIT_FLOW}/" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_SILENT_LOGIN}" ];then + sed "/silentLogin/s/true/${APP_CONFIG_OAUTH2_SILENT_LOGIN}/" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI}" ];then + replace="\/" + encoded=${APP_CONFIG_OAUTH2_REDIRECT_SILENT_IFRAME_URI//\//$replace} + sed -e "s/\"redirectSilentIframeUri\": \".*\"/\"redirectSilentIframeUri\": \"${encoded}\"/g" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_REDIRECT_LOGIN}" ];then + replace="\/" + encoded=${APP_CONFIG_OAUTH2_REDIRECT_LOGIN//\//$replace} + sed -e "s/\"redirectUri\": \".*\"/\"redirectUri\": \"${encoded}\"/g" \ + -i ./app.config.json +fi + +if [ -n "${APP_CONFIG_OAUTH2_REDIRECT_LOGOUT}" ];then + replace="\/" + encoded=${APP_CONFIG_OAUTH2_REDIRECT_LOGOUT//\//$replace} + sed -e "s/\"redirectUriLogout\": \".*\"/\"redirectUriLogout\": \"${encoded}\"/g" \ + -i ./app.config.json +fi + +if [[ $ACSURL ]]; then + sed -i s%{protocol}//{hostname}{:port}%"$ACSURL"%g /usr/share/nginx/html/app.config.json +fi + +if [ -n "${APP_BASE_SHARE_URL}" ];then + sed -e "s/\"baseShareUrl\": \".*\"/\"baseShareUrl\": \"${APP_BASE_SHARE_URL}\"/g" \ + -i ./app.config.json +fi + +nginx -g "daemon off;" diff --git a/demo-shell/nginx.conf b/docker/nginx.conf similarity index 73% rename from demo-shell/nginx.conf rename to docker/nginx.conf index bfb31f8b7a..83ed517017 100644 --- a/demo-shell/nginx.conf +++ b/docker/nginx.conf @@ -6,7 +6,7 @@ events { http { server { - listen 80; + listen 8080; server_name localhost; root /usr/share/nginx/html; @@ -22,6 +22,12 @@ http { try_files $uri $uri/ /index.html; } + location ~ \.html$ { + add_header Cache-Control "private, no-cache, no-store, must-revalidate"; + add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT"; + add_header Pragma no-cache; + } + location ~ ^/[a-zA-Z0-9_-]+/ { try_files $uri $uri/ /index.html; } diff --git a/docs/README.md b/docs/README.md index 504d6aa73a..a772af2d7d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -36,6 +36,9 @@ A few other pages of information are also available: contains a preview of features we hope to release in future versions of ADF. - The [License info](license-info/license-info-v3.0.0.md) section lists the third-party libraries used by ADF along with links to their Open Source licenses. +- The [Breaking changes](breaking-changes/breaking-change-2.6.0-3.0.0.md) section lists + all breaking changes between major versions, such as removal of deprecated items. +- The [Upgrade guide](upgrade-guide/upgrade26-30.md) explains how to upgrade your project from an earlier version of ADF to the current version. ## Contents @@ -72,146 +75,151 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [About component](core/about.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows a general version and status overview of the installed ADF library. | [Source](../lib/core/about/about.component.ts) | -| [Buttons menu component](core/buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../lib/core/buttons-menu/buttons-menu.component.ts) | -| [Card view component](core/card-view.component.md) | Displays a configurable property list renderer. | [Source](../lib/core/card-view/components/card-view/card-view.component.ts) | -| [Comment list component](core/comment-list.component.md) | Shows a list of comments. | [Source](../lib/core/comments/comment-list.component.ts) | -| [Comments component](core/comments.component.md) | Displays comments from users involved in a specified task or content and allows an involved user to add a comment to a task or a content. | [Source](../lib/core/comments/comments.component.ts) | -| [Data column component](core/data-column.component.md) | Defines column properties for DataTable, Tasklist, Document List and other components. | [Source](../lib/core/data-column/data-column.component.ts) | -| [Datatable component](core/datatable.component.md) | Displays data as a table with customizable columns and presentation. | [Source](../lib/core/datatable/components/datatable/datatable.component.ts) | -| [Empty list component](core/empty-list.component.md) | Displays a message indicating that a list is empty. | [Source](../lib/core/datatable/components/datatable/empty-list.component.ts) | -| [Form field component](core/form-field.component.md) | Represents a UI field in a form. | [Source](../lib/core/form/components/form-field/form-field.component.ts) | -| [Form list component](core/form-list.component.md) | Shows forms as a list. | [Source](../lib/core/form/components/form-list.component.ts) | -| [Form component](core/form.component.md) | Shows a Form from APS | [Source](../lib/core/form/components/form.component.ts) | -| [Start form component](core/start-form.component.md) | Displays the Start Form for a process. | [Source](../lib/core/form/components/start-form.component.ts) | -| [Text mask component](core/text-mask.component.md) | Implements text field input masks. | [Source](../lib/core/form/components/widgets/text/text-mask.component.ts) | -| [Icon component](core/icon.component.md) | Provides a universal way of rendering registered and named icons. | [Source](../lib/core/icon/icon.component.ts) | -| [Info drawer layout component](core/info-drawer-layout.component.md) | Displays a sidebar-style information panel. | [Source](../lib/core/info-drawer/info-drawer-layout.component.ts) | -| [Info drawer component](core/info-drawer.component.md) | Displays a sidebar-style information panel with tabs. | [Source](../lib/core/info-drawer/info-drawer.component.ts) | -| [Language menu component](core/language-menu.component.md) | Displays all the languages that are present in "app.config.json" and the default (EN). | [Source](../lib/core/language-menu/language-menu.component.ts) | -| [Header component](core/header.component.md) | Reusable header for Alfresco applications. | [Source](../lib/core/layout/components/header/header.component.ts) | -| [Sidebar action menu component](core/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | -| [Sidenav layout component](core/sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | -| [Login dialog panel component](core/login-dialog-panel.component.md) | Shows and manages a login dialog. | [Source](../lib/core/login/components/login-dialog-panel.component.ts) | -| [Login dialog component](core/login-dialog.component.md) | Allows a user to perform a login via a dialog. | [Source](../lib/core/login/components/login-dialog.component.ts) | -| [Login component](core/login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../lib/core/login/components/login.component.ts) | -| [Infinite pagination component](core/infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../lib/core/pagination/infinite-pagination.component.ts) | -| [Pagination component](core/pagination.component.md) | Adds pagination to the component it is used with. | [Source](../lib/core/pagination/pagination.component.ts) | -| [Host settings component](core/host-settings.component.md) ![Internal](docassets/images/InternalIcon.png) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../lib/core/settings/host-settings.component.ts) | -| [Sorting picker component](core/sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../lib/core/sorting-picker/sorting-picker.component.ts) | -| [Empty content component](core/empty-content.component.md) | Provides a generic "Empty Content" placeholder for components. | [Source](../lib/core/templates/empty-content/empty-content.component.ts) | -| [Error content component](core/error-content.component.md) | Displays info about a specific error. | [Source](../lib/core/templates/error-content/error-content.component.ts) | -| [Toolbar divider component](core/toolbar-divider.component.md) | Divides groups of elements in a Toolbar with a visual separator. | [Source](../lib/core/toolbar/toolbar-divider.component.ts) | -| [Toolbar title component](core/toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../lib/core/toolbar/toolbar-title.component.ts) | -| [Toolbar component](core/toolbar.component.md) | Simple container for headers, titles, actions and breadcrumbs. | [Source](../lib/core/toolbar/toolbar.component.ts) | -| [User info component](core/user-info.component.md) | Shows user information. | [Source](../lib/core/userinfo/components/user-info.component.ts) | -| [Viewer component](core/viewer.component.md) | Displays content from an ACS repository. | [Source](../lib/core/viewer/components/viewer.component.ts) | +| [About Component](core/components/about.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows a general version and status overview of the installed ADF library. | [Source](../lib/core/about/about.component.ts) | +| [Buttons Menu Component](core/components/buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../lib/core/buttons-menu/buttons-menu.component.ts) | +| [Card View component](core/components/card-view.component.md) | Displays a configurable property list renderer. | [Source](../lib/core/card-view/components/card-view/card-view.component.ts) | +| [Comment list component](core/components/comment-list.component.md) | Shows a list of comments. | [Source](../lib/core/comments/comment-list.component.ts) | +| [Comments Component](core/components/comments.component.md) | Displays comments from users involved in a specified task or content and allows an involved user to add a comment to a task or a content. | [Source](../lib/core/comments/comments.component.ts) | +| [Data Column Component](core/components/data-column.component.md) | Defines column properties for DataTable, Tasklist, Document List and other components. | [Source](../lib/core/data-column/data-column.component.ts) | +| [DataTable component](core/components/datatable.component.md) | Displays data as a table with customizable columns and presentation. | [Source](../lib/core/datatable/components/datatable/datatable.component.ts) | +| [Empty Content Component](core/components/empty-content.component.md) | Provides a generic "Empty Content" placeholder for components. | [Source](../lib/core/templates/empty-content/empty-content.component.ts) | +| [Empty list component](core/components/empty-list.component.md) | Displays a message indicating that a list is empty. | [Source](../lib/core/datatable/components/datatable/empty-list.component.ts) | +| [Error Content Component](core/components/error-content.component.md) | Displays info about a specific error. | [Source](../lib/core/templates/error-content/error-content.component.ts) | +| [Form field component](core/components/form-field.component.md) | Represents a UI field in a form. | [Source](../lib/core/form/components/form-field/form-field.component.ts) | +| [Form List Component](core/components/form-list.component.md) | Shows forms as a list. | [Source](../lib/core/form/components/form-list.component.ts) | +| [Form component](core/components/form.component.md) | Shows a Form from APS | [Source](../lib/core/form/components/form.component.ts) | +| [Header component](core/components/header.component.md) | Reusable header for Alfresco applications. | [Source](../lib/core/layout/components/header/header.component.ts) | +| [Host settings component](core/components/host-settings.component.md) ![Internal](docassets/images/InternalIcon.png) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../lib/core/settings/host-settings.component.ts) | +| [Icon Component](core/components/icon.component.md) | Provides a universal way of rendering registered and named icons. | [Source](../lib/core/icon/icon.component.ts) | +| [Infinite Pagination component](core/components/infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../lib/core/pagination/infinite-pagination.component.ts) | +| [Info drawer layout component](core/components/info-drawer-layout.component.md) | Displays a sidebar-style information panel. | [Source](../lib/core/info-drawer/info-drawer-layout.component.ts) | +| [Info Drawer Tab component](core/components/info-drawer-tab.component.md) | Renders tabs in a Info drawer component. | [Source](../lib/core/info-drawer/info-drawer.component.ts) | +| [Info Drawer component](core/components/info-drawer.component.md) | Displays a sidebar-style information panel with tabs. | [Source](../lib/core/info-drawer/info-drawer.component.ts) | +| [Language Menu component](core/components/language-menu.component.md) | Displays all the languages that are present in "app.config.json" and the default (EN). | [Source](../lib/core/language-menu/language-menu.component.ts) | +| [Login Dialog Panel component](core/components/login-dialog-panel.component.md) | Shows and manages a login dialog. | [Source](../lib/core/login/components/login-dialog-panel.component.ts) | +| [Login Dialog component](core/components/login-dialog.component.md) | Allows a user to perform a login via a dialog. | [Source](../lib/core/login/components/login-dialog.component.ts) | +| [Login component](core/components/login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../lib/core/login/components/login.component.ts) | +| [Pagination Component](core/components/pagination.component.md) | Adds pagination to the component it is used with. | [Source](../lib/core/pagination/pagination.component.ts) | +| [Sidebar action menu component](core/components/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | +| [Sidenav Layout component](core/components/sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | +| [Sorting Picker Component](core/components/sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../lib/core/sorting-picker/sorting-picker.component.ts) | +| [Start Form component](core/components/start-form.component.md) | Displays the Start Form for a process. | [Source](../lib/core/form/components/start-form.component.ts) | +| [Text Mask directive](core/components/text-mask.component.md) | Implements text field input masks. | [Source](../lib/core/form/components/widgets/text/text-mask.component.ts) | +| [Toolbar Divider Component](core/components/toolbar-divider.component.md) | Divides groups of elements in a Toolbar with a visual separator. | [Source](../lib/core/toolbar/toolbar-divider.component.ts) | +| [Toolbar Title Component](core/components/toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../lib/core/toolbar/toolbar-title.component.ts) | +| [Toolbar Component](core/components/toolbar.component.md) | Simple container for headers, titles, actions and breadcrumbs. | [Source](../lib/core/toolbar/toolbar.component.ts) | +| [User Info component](core/components/user-info.component.md) | Shows user information. | [Source](../lib/core/userinfo/components/user-info.component.ts) | +| [Viewer component](core/components/viewer.component.md) | Displays content from an ACS repository. | [Source](../lib/core/viewer/components/viewer.component.ts) | -## Directives +### Directives | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Context menu directive](core/context-menu.directive.md) | Adds a context menu to a component. | [Source](../lib/core/context-menu/context-menu.directive.ts) | -| [Highlight directive](core/highlight.directive.md) | Adds highlighting to selected sections of an HTML element's content. | [Source](../lib/core/directives/highlight.directive.ts) | -| [Logout directive](core/logout.directive.md) | Logs the user out when the decorated element is clicked. | [Source](../lib/core/directives/logout.directive.ts) | -| [Node delete directive](core/node-delete.directive.md) | Deletes multiple files and folders. | [Source](../lib/core/directives/node-delete.directive.ts) | -| [Node download directive](core/node-download.directive.md) | Allows folders and/or files to be downloaded, with multiple nodes packed as a '.ZIP' archive. | [Source](../lib/core/directives/node-download.directive.ts) | -| [Node favorite directive](core/node-favorite.directive.md) | Selectively toggles nodes as favorites. | [Source](../lib/core/directives/node-favorite.directive.ts) | -| [Node permission directive](core/node-permission.directive.md) | Selectively disables an HTML element or Angular component. | [Source](../lib/core/directives/node-permission.directive.ts) | -| [Node restore directive](core/node-restore.directive.md) | Restores deleted nodes to their original location. | [Source](../lib/core/directives/node-restore.directive.ts) | -| [Upload directive](core/upload.directive.md) | Uploads content in response to file drag and drop. | [Source](../lib/core/directives/upload.directive.ts) | +| [Check Allowable Operation directive](core/directives/check-allowable-operation.directive.md) | Selectively disables an HTML element or Angular component. | [Source](../lib/core/directives/check-allowable-operation.directive.ts) | +| [Context Menu directive](core/directives/context-menu.directive.md) | Adds a context menu to a component. | [Source](../lib/core/context-menu/context-menu.directive.ts) | +| [Highlight directive](core/directives/highlight.directive.md) | Adds highlighting to selected sections of an HTML element's content. | [Source](../lib/core/directives/highlight.directive.ts) | +| [Logout directive](core/directives/logout.directive.md) | Logs the user out when the decorated element is clicked. | [Source](../lib/core/directives/logout.directive.ts) | +| [Node Delete directive](core/directives/node-delete.directive.md) | Deletes multiple files and folders. | [Source](../lib/core/directives/node-delete.directive.ts) | +| [Node Download directive](core/directives/node-download.directive.md) | Allows folders and/or files to be downloaded, with multiple nodes packed as a '.ZIP' archive. | [Source](../lib/core/directives/node-download.directive.ts) | +| [Node Favorite directive](core/directives/node-favorite.directive.md) | Selectively toggles nodes as favorites. | [Source](../lib/core/directives/node-favorite.directive.ts) | +| [Node Restore directive](core/directives/node-restore.directive.md) | Restores deleted nodes to their original location. | [Source](../lib/core/directives/node-restore.directive.ts) | +| [Upload Directive](core/directives/upload.directive.md) | Uploads content in response to file drag and drop. | [Source](../lib/core/directives/upload.directive.ts) | -## Models +### Interfaces | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Form field model](core/form-field.model.md) | Contains the value and metadata for a field of a Form component. | [Source](../lib/core/form/components/widgets/core/form-field.model.ts) | -| [Product version model](core/product-version.model.md) | Contains version and license information classes for Alfresco products. | [Source](../lib/core/models/product-version.model.ts) | -| [User process model](core/user-process.model.md) | Represents a Process Services user. | [Source](../lib/core/models/user-process.model.ts) | -| [Bpm user model](core/bpm-user.model.md) | Contains information about a Process Services user. | [Source](../lib/core/userinfo/models/bpm-user.model.ts) | -| [Ecm user model](core/ecm-user.model.md) | Contains information about a Content Services user. | [Source](../lib/core/userinfo/models/ecm-user.model.ts) | +| [Card View Item interface](core/interfaces/card-view-item.interface.md) | Defines the implementation of an item in a Card View component. | [Source](../lib/core/card-view/interfaces/card-view-item.interface.ts) | +| [DataTableAdapter interface](core/interfaces/datatable-adapter.interface.md) | Defines how table data is supplied to DataTable and Tasklist components. | [Source](../lib/core/datatable/data/datatable-adapter.ts) | +| [FormFieldValidator interface](core/interfaces/form-field-validator.interface.md) | Defines how the input fields of Form and Task Details components are validated. | [Source](../lib/core/form/components/widgets/core/form-field-validator.ts) | +| [Search Configuration interface](core/interfaces/search-configuration.interface.md) | Provides fine control of parameters to a search. | [Source](../lib/core/interface/search-configuration.interface.ts) | -## Pipes +### Models | Name | Description | Source link | | ---- | ----------- | ----------- | -| [File size pipe](core/file-size.pipe.md) | Converts a number of bytes to the equivalent in KB, MB, etc. | [Source](../lib/core/pipes/file-size.pipe.ts) | -| [Format space pipe](core/format-space.pipe.md) | Replaces all the white space in a string with a supplied character. | [Source](../lib/core/pipes/format-space.pipe.ts) | -| [Full name pipe](core/full-name.pipe.md) | Joins the first and last name properties from a UserProcessModel object into a single string. | [Source](../lib/core/pipes/full-name.pipe.ts) | -| [Mime type icon pipe](core/mime-type-icon.pipe.md) | Retrieves an icon to represent a MIME type. | [Source](../lib/core/pipes/mime-type-icon.pipe.ts) | -| [Node name tooltip pipe](core/node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../lib/core/pipes/node-name-tooltip.pipe.ts) | -| [Text highlight pipe](core/text-highlight.pipe.md) | Adds highlighting to words or sections of text that match a search string. | [Source](../lib/core/pipes/text-highlight.pipe.ts) | -| [Time ago pipe](core/time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../lib/core/pipes/time-ago.pipe.ts) | -| [User initial pipe](core/user-initial.pipe.md) | Takes the name fields of a UserProcessModel object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) | +| [Bpm User model](core/models/bpm-user.model.md) | Contains information about a Process Services user. | [Source](../lib/core/userinfo/models/bpm-user.model.ts) | +| [Ecm User model](core/models/ecm-user.model.md) | Contains information about a Content Services user. | [Source](../lib/core/userinfo/models/ecm-user.model.ts) | +| [Form Field model](core/models/form-field.model.md) | Contains the value and metadata for a field of a Form component. | [Source](../lib/core/form/components/widgets/core/form-field.model.ts) | +| [Product Version model](core/models/product-version.model.md) | Contains version and license information classes for Alfresco products. | [Source](../lib/core/models/product-version.model.ts) | +| [User Process model](core/models/user-process.model.md) | Represents a Process Services user. | [Source](../lib/core/models/user-process.model.ts) | -## Services +### Pipes | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Card item types service](core/card-item-types.service.md) | Maps type names to field component types for the Card View component. | [Source](../lib/core/card-view/services/card-item-types.service.ts) | -| [Card view update service](core/card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. | [Source](../lib/core/card-view/services/card-view-update.service.ts) | -| [Activiti alfresco service](core/activiti-alfresco.service.md) | Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). | [Source](../lib/core/form/services/activiti-alfresco.service.ts) | -| [Form rendering service](core/form-rendering.service.md) | Maps a form field type string onto the corresponding form widget component type. | [Source](../lib/core/form/services/form-rendering.service.ts) | -| [Form service](core/form.service.md) | Implements Process Services form methods | [Source](../lib/core/form/services/form.service.ts) | -| [Node service](core/node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../lib/core/form/services/node.service.ts) | -| [Process content service](core/process-content.service.md) | Manipulates content related to a Process Instance or Task Instance in APS. | [Source](../lib/core/form/services/process-content.service.ts) | -| [Alfresco api service](core/alfresco-api.service.md) | Provides access to an initialized **AlfrescoJSApi** instance. | [Source](../lib/core/services/alfresco-api.service.ts) | -| [Apps process service](core/apps-process.service.md) | Gets details of the Process Services apps that are deployed for the user. | [Source](../lib/core/services/apps-process.service.ts) | -| [Auth guard bpm service](core/auth-guard-bpm.service.md) | Adds authentication with Process Services to a route within the app. | [Source](../lib/core/services/auth-guard-bpm.service.ts) | -| [Auth guard ecm service](core/auth-guard-ecm.service.md) | Adds authentication with Content Services to a route within the app. | [Source](../lib/core/services/auth-guard-ecm.service.ts) | -| [Auth guard service](core/auth-guard.service.md) | Adds authentication to a route within the app. | [Source](../lib/core/services/auth-guard.service.ts) | -| [Authentication service](core/authentication.service.md) | Provides authentication to ACS and APS. | [Source](../lib/core/services/authentication.service.ts) | -| [Comment content service](core/comment-content.service.md) | Adds and retrieves comments for nodes in Content Services. | [Source](../lib/core/services/comment-content.service.ts) | -| [Comment process service](core/comment-process.service.md) | Adds and retrieves comments for task and process instances in Process Services. | [Source](../lib/core/services/comment-process.service.ts) | -| [Content service](core/content.service.md) | Accesses app-generated data objects via URLs and file downloads. | [Source](../lib/core/services/content.service.ts) | -| [Cookie service](core/cookie.service.md) | Stores key-value data items as browser cookies. | [Source](../lib/core/services/cookie.service.ts) | -| [Deleted nodes api service](core/deleted-nodes-api.service.md) | Gets a list of Content Services nodes currently in the trash. | [Source](../lib/core/services/deleted-nodes-api.service.ts) | -| [Discovery api service](core/discovery-api.service.md) | Gets version and license information for Process Services and Content Services. | [Source](../lib/core/services/discovery-api.service.ts) | -| [Download zip service](core/download-zip.service.md) | Creates and manages downloads. | [Source](../lib/core/services/download-zip.service.ts) | -| [Favorites api service](core/favorites-api.service.md) | Gets a list of items a user has marked as their favorites. | [Source](../lib/core/services/favorites-api.service.ts) | -| [Highlight transform service](core/highlight-transform.service.md) | Adds HTML to a string to highlight chosen sections. | [Source](../lib/core/services/highlight-transform.service.ts) | -| [Jwt helper service](core/jwt-helper.service.md) | Decodes a JSON Web Token (JWT) to a JavaScript object. | [Source](../lib/core/services/jwt-helper.service.ts) | -| [Log service](core/log.service.md) | Provides log functionality. | [Source](../lib/core/services/log.service.ts) | -| [Login dialog service](core/login-dialog.service.md) | Manages login dialogs. | [Source](../lib/core/services/login-dialog.service.ts) | -| [Nodes api service](core/nodes-api.service.md) | Accesses and manipulates ACS document nodes using their node IDs. | [Source](../lib/core/services/nodes-api.service.ts) | -| [Notification service](core/notification.service.md) | Shows a notification message with optional feedback. | [Source](../lib/core/services/notification.service.ts) | -| [Page title service](core/page-title.service.md) | Sets the page title. | [Source](../lib/core/services/page-title.service.ts) | -| [People content service](core/people-content.service.md) | Gets information about a Content Services user. | [Source](../lib/core/services/people-content.service.ts) | -| [People process service](core/people-process.service.md) | Gets information about Process Services users. | [Source](../lib/core/services/people-process.service.ts) | -| [Renditions service](core/renditions.service.md) | Manages prearranged conversions of content to different formats. | [Source](../lib/core/services/renditions.service.ts) | -| [Search configuration service](core/search-configuration.service.md) | Provides fine control of parameters to a search. | [Source](../lib/core/services/search-configuration.service.ts) | -| [Search service](core/search.service.md) | Accesses the Content Services Search API. | [Source](../lib/core/services/search.service.ts) | -| [Shared links api service](core/shared-links-api.service.md) | Finds shared links to Content Services items. | [Source](../lib/core/services/shared-links-api.service.ts) | -| [Sites service](core/sites.service.md) | Accesses and manipulates sites from a Content Services repository. | [Source](../lib/core/services/sites.service.ts) | -| [Storage service](core/storage.service.md) | Stores items in the form of key-value pairs. | [Source](../lib/core/services/storage.service.ts) | -| [Thumbnail service](core/thumbnail.service.md) | Retrieves an SVG thumbnail image to represent a document type. | [Source](../lib/core/services/thumbnail.service.ts) | -| [Translation service](core/translation.service.md) | Supports localisation. | [Source](../lib/core/services/translation.service.ts) | -| [Upload service](core/upload.service.md) | Provides access to various APIs related to file upload features. | [Source](../lib/core/services/upload.service.ts) | -| [User preferences service](core/user-preferences.service.md) | Stores preferences for the app and for individual components. | [Source](../lib/core/services/user-preferences.service.ts) | -| [Bpm user service](core/bpm-user.service.md) | Gets information about the current Process Services user. | [Source](../lib/core/userinfo/services/bpm-user.service.ts) | -| [Ecm user service](core/ecm-user.service.md) | Gets information about a Content Services user. | [Source](../lib/core/userinfo/services/ecm-user.service.ts) | -| [Identity user service](core/identity-user.service.md) | Gets OAuth2 personal details and roles for users. | [Source](../lib/core/userinfo/services/identity-user.service.ts) | +| [App Config Pipe](core/pipes/app-config.pipe.md) | Retrieves values from the application configuration file directly. | [Source](../lib/core/app-config/app-config.pipe.ts) | +| [File Size pipe](core/pipes/file-size.pipe.md) | Converts a number of bytes to the equivalent in KB, MB, etc. | [Source](../lib/core/pipes/file-size.pipe.ts) | +| [Format Space pipe](core/pipes/format-space.pipe.md) | Replaces all the white space in a string with a supplied character. | [Source](../lib/core/pipes/format-space.pipe.ts) | +| [Full name pipe](core/pipes/full-name.pipe.md) | Joins the first and last name properties from a UserProcessModel object into a single string. | [Source](../lib/core/pipes/full-name.pipe.ts) | +| [Mime Type Icon pipe](core/pipes/mime-type-icon.pipe.md) | Retrieves an icon to represent a MIME type. | [Source](../lib/core/pipes/mime-type-icon.pipe.ts) | +| [Node Name Tooltip pipe](core/pipes/node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../lib/core/pipes/node-name-tooltip.pipe.ts) | +| [Text Highlight pipe](core/pipes/text-highlight.pipe.md) | Adds highlighting to words or sections of text that match a search string. | [Source](../lib/core/pipes/text-highlight.pipe.ts) | +| [Time Ago pipe](core/pipes/time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../lib/core/pipes/time-ago.pipe.ts) | +| [User Initial pipe](core/pipes/user-initial.pipe.md) | Takes the name fields of a UserProcessModel object and extracts and formats the initials. | [Source](../lib/core/pipes/user-initial.pipe.ts) | -## Widgets +### Services | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Content widget](core/content.widget.md) | Shows the content preview. | [Source](../lib/core/form/components/widgets/content/content.widget.ts) | +| [APS Alfresco Content Service](core/services/activiti-alfresco.service.md) | Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). | [Source](../lib/core/form/services/activiti-alfresco.service.ts) | +| [Alfresco Api Service](core/services/alfresco-api.service.md) | Provides access to an initialized AlfrescoJSApi instance. | [Source](../lib/core/services/alfresco-api.service.ts) | +| [App Config service](core/services/app-config.service.md) | Supports app configuration settings, stored server side. | [Source](../lib/core/app-config/app-config.service.ts) | +| [Apps Process service](core/services/apps-process.service.md) | Gets details of the Process Services apps that are deployed for the user. | [Source](../lib/core/services/apps-process.service.ts) | +| [Auth Guard Bpm service](core/services/auth-guard-bpm.service.md) | Adds authentication with Process Services to a route within the app. | [Source](../lib/core/services/auth-guard-bpm.service.ts) | +| [Auth Guard Ecm service](core/services/auth-guard-ecm.service.md) | Adds authentication with Content Services to a route within the app. | [Source](../lib/core/services/auth-guard-ecm.service.ts) | +| [Auth Guard SSO Role service](core/services/auth-guard-sso-role.service.md) | Checks the user roles of a user. | [Source](../lib/core/services/auth-guard-sso-role.service.ts) | +| [Auth Guard service](core/services/auth-guard.service.md) | Adds authentication to a route within the app. | [Source](../lib/core/services/auth-guard.service.ts) | +| [Authentication Service](core/services/authentication.service.md) | Provides authentication to ACS and APS. | [Source](../lib/core/services/authentication.service.ts) | +| [Bpm User service](core/services/bpm-user.service.md) | Gets information about the current Process Services user. | [Source](../lib/core/userinfo/services/bpm-user.service.ts) | +| [Card Item Type service](core/services/card-item-types.service.md) | Maps type names to field component types for the Card View component. | [Source](../lib/core/card-view/services/card-item-types.service.ts) | +| [Card View Update service](core/services/card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. | [Source](../lib/core/card-view/services/card-view-update.service.ts) | +| [Comment Content service](core/services/comment-content.service.md) | Adds and retrieves comments for nodes in Content Services. | [Source](../lib/core/services/comment-content.service.ts) | +| [Comment Process service](core/services/comment-process.service.md) | Adds and retrieves comments for task and process instances in Process Services. | [Source](../lib/core/services/comment-process.service.ts) | +| [Content service](core/services/content.service.md) | Accesses app-generated data objects via URLs and file downloads. | [Source](../lib/core/services/content.service.ts) | +| [Cookie service](core/services/cookie.service.md) | Stores key-value data items as browser cookies. | [Source](../lib/core/services/cookie.service.ts) | +| [Deleted Nodes Api service](core/services/deleted-nodes-api.service.md) | Gets a list of Content Services nodes currently in the trash. | [Source](../lib/core/services/deleted-nodes-api.service.ts) | +| [Discovery Api service](core/services/discovery-api.service.md) | Gets version and license information for Process Services and Content Services. | [Source](../lib/core/services/discovery-api.service.ts) | +| [Download zip service](core/services/download-zip.service.md) | Creates and manages downloads. | [Source](../lib/core/services/download-zip.service.ts) | +| [Ecm User service](core/services/ecm-user.service.md) | Gets information about a Content Services user. | [Source](../lib/core/userinfo/services/ecm-user.service.ts) | +| [Favorites Api service](core/services/favorites-api.service.md) | Gets a list of items a user has marked as their favorites. | [Source](../lib/core/services/favorites-api.service.ts) | +| [Form Rendering service](core/services/form-rendering.service.md) | Maps a form field type string onto the corresponding form widget component type. | [Source](../lib/core/form/services/form-rendering.service.ts) | +| [Form service](core/services/form.service.md) | Implements Process Services form methods | [Source](../lib/core/form/services/form.service.ts) | +| [Highlight Transform service](core/services/highlight-transform.service.md) | Adds HTML to a string to highlight chosen sections. | [Source](../lib/core/services/highlight-transform.service.ts) | +| [Identity user service](core/services/identity-user.service.md) | Gets OAuth2 personal details and roles for users. | [Source](../lib/process-services-cloud/src/lib/services/identity-user.service.ts) | +| [JWT helper service](core/services/jwt-helper.service.md) | Decodes a JSON Web Token (JWT) to a JavaScript object. | [Source](../lib/core/services/jwt-helper.service.ts) | +| [Log Service](core/services/log.service.md) | Provides log functionality. | [Source](../lib/core/services/log.service.ts) | +| [Login Dialog service](core/services/login-dialog.service.md) | Manages login dialogs. | [Source](../lib/core/services/login-dialog.service.ts) | +| [Node Service](core/services/node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../lib/core/form/services/node.service.ts) | +| [Nodes Api service](core/services/nodes-api.service.md) | Accesses and manipulates ACS document nodes using their node IDs. | [Source](../lib/core/services/nodes-api.service.ts) | +| [Notification Service](core/services/notification.service.md) | Shows a notification message with optional feedback. | [Source](../lib/core/services/notification.service.ts) | +| [Page Title service](core/services/page-title.service.md) | Sets the page title. | [Source](../lib/core/services/page-title.service.ts) | +| [People Content service](core/services/people-content.service.md) | Gets information about a Content Services user. | [Source](../lib/core/services/people-content.service.ts) | +| [People Process service](core/services/people-process.service.md) | Gets information about Process Services users. | [Source](../lib/core/services/people-process.service.ts) | +| [Process Content Service](core/services/process-content.service.md) | Manipulates content related to a Process Instance or Task Instance in APS. | [Source](../lib/core/form/services/process-content.service.ts) | +| [Renditions service](core/services/renditions.service.md) | Manages prearranged conversions of content to different formats. | [Source](../lib/core/services/renditions.service.ts) | +| [Search Configuration service](core/services/search-configuration.service.md) | Provides fine control of parameters to a search. | [Source](../lib/core/services/search-configuration.service.ts) | +| [Search service](core/services/search.service.md) | Accesses the Content Services Search API. | [Source](../lib/core/services/search.service.ts) | +| [Shared Links Api service](core/services/shared-links-api.service.md) | Finds shared links to Content Services items. | [Source](../lib/core/services/shared-links-api.service.ts) | +| [Sites service](core/services/sites.service.md) | Accesses and manipulates sites from a Content Services repository. | [Source](../lib/core/services/sites.service.ts) | +| [Storage service](core/services/storage.service.md) | Stores items in the form of key-value pairs. | [Source](../lib/core/services/storage.service.ts) | +| [Thumbnail service](core/services/thumbnail.service.md) | Retrieves an SVG thumbnail image to represent a document type. | [Source](../lib/core/services/thumbnail.service.ts) | +| [Translation service](core/services/translation.service.md) | Supports localisation. | [Source](../lib/core/services/translation.service.ts) | +| [Upload Service](core/services/upload.service.md) | Provides access to various APIs related to file upload features. | [Source](../lib/core/services/upload.service.ts) | +| [User Preferences Service](core/services/user-preferences.service.md) | Stores preferences for the app and for individual components. | [Source](../lib/core/services/user-preferences.service.ts) | + +### Widgets + +| Name | Description | Source link | +| ---- | ----------- | ----------- | +| [APS Content Component](core/widgets/content.widget.md) | Shows the content preview. | [Source](../lib/core/form/components/widgets/content/content.widget.ts) | -## Other classes and interfaces - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Data Table Adapter interface](core/datatable-adapter.interface.md) | Defines how table data is supplied to DataTable and Tasklist components. | [Source](../lib/core/datatable/data/datatable-adapter.ts) | -| [Form Field Validator interface](core/form-field-validator.interface.md) | Defines how the input fields of [`Form`](../../lib/process-services/task-list/models/form.model.ts) and Task Details components are validated. | [Source](../lib/core/form/components/widgets/core/form-field-validator.ts) | -| [Search Configuration interface](core/search-configuration.interface.md) | Provides fine control of parameters to a search. | [Source](../lib/core/services/search-configuration.service.ts) | - [(Back to Contents)](#contents) ## Content Services API @@ -223,104 +231,103 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Breadcrumb component](content-services/breadcrumb.component.md) | Indicates the current position within a navigation hierarchy. | [Source](../lib/content-services/breadcrumb/breadcrumb.component.ts) | -| [Dropdown breadcrumb component](content-services/dropdown-breadcrumb.component.md) | Indicates the current position within a navigation hierarchy using a dropdown menu. | [Source](../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts) | -| [Content metadata component](content-services/content-metadata.component.md) | Displays and edits metadata related to a node. | [Source](../lib/content-services/content-metadata/components/content-metadata/content-metadata.component.ts) | -| [Content metadata card component](content-services/content-metadata-card.component.md) | Displays and edits metadata related to a node. | [Source](../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts) | -| [Content node selector panel component](content-services/content-node-selector-panel.component.md) | Opens a Content Node Selector in its own dialog window. | [Source](../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | -| [Content node selector component](content-services/content-node-selector.component.md) | Allows a user to select items from a Content Services repository. | [Source](../lib/content-services/content-node-selector/content-node-selector.component.ts) | -| [Content action component](content-services/content-action.component.md) | Adds options to a Document List actions menu for a particular content type. | [Source](../lib/content-services/document-list/components/content-action/content-action.component.ts) | -| [Document list component](content-services/document-list.component.md) | Displays the documents from a repository. | [Source](../lib/content-services/document-list/components/document-list.component.ts) | -| [Add permission dialog component](content-services/add-permission-dialog.component.md) | Displays a dialog to search for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts) | -| [Add permission panel component](content-services/add-permission-panel.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts) | -| [Add permission component](content-services/add-permission.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts) | -| [Permission list component](content-services/permission-list.component.md) | Shows node permissions as a table. | [Source](../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts) | -| [Search check list component](content-services/search-check-list.component.md) | Implements a checklist widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-check-list/search-check-list.component.ts) | -| [Search chip list component](content-services/search-chip-list.component.md) | Displays search criteria as a set of "chips". | [Source](../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts) | -| [Search control component](content-services/search-control.component.md) | Displays a input text that shows find-as-you-type suggestions. | [Source](../lib/content-services/search/components/search-control.component.ts) | -| [Search date range component](content-services/search-date-range.component.md) | Implements a date range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-date-range/search-date-range.component.ts) | -| [Search filter component](content-services/search-filter.component.md) | Represents a main container component for custom search and faceted search settings. | [Source](../lib/content-services/search/components/search-filter/search-filter.component.ts) | -| [Search number range component](content-services/search-number-range.component.md) | Implements a number range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-number-range/search-number-range.component.ts) | -| [Search radio component](content-services/search-radio.component.md) | Implements a radio button list widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-radio/search-radio.component.ts) | -| [Search slider component](content-services/search-slider.component.md) | Implements a numeric slider widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-slider/search-slider.component.ts) | -| [Search sorting picker component](content-services/search-sorting-picker.component.md) | Provides an ability to select one of the predefined sorting definitions for search results: | [Source](../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts) | -| [Search text component](content-services/search-text.component.md) | Implements a text input widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-text/search-text.component.ts) | -| [Search component](content-services/search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) | -| [Sites dropdown component](content-services/sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../lib/content-services/site-dropdown/sites-dropdown.component.ts) | -| [Like component](content-services/like.component.md) | Allows a user to add "likes" to an item. | [Source](../lib/content-services/social/like.component.ts) | -| [Rating component](content-services/rating.component.md) | Allows a user to add ratings to an item. | [Source](../lib/content-services/social/rating.component.ts) | -| [Tag actions component](content-services/tag-actions.component.md) | Shows available actions for tags. | [Source](../lib/content-services/tag/tag-actions.component.ts) | -| [Tag list component](content-services/tag-list.component.md) | Shows tags for an item. | [Source](../lib/content-services/tag/tag-list.component.ts) | -| [Tag node list component](content-services/tag-node-list.component.md) | Shows tags for a node. | [Source](../lib/content-services/tag/tag-node-list.component.ts) | -| [Tree view component](content-services/tree-view.component.md) | Shows the folder and subfolders of a node as a tree view. | [Source](../lib/content-services/tree-view/components/tree-view.component.ts) | -| [File uploading dialog component](content-services/file-uploading-dialog.component.md) | Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. | [Source](../lib/content-services/upload/components/file-uploading-dialog.component.ts) | -| [Upload button component](content-services/upload-button.component.md) | Activates a file upload. | [Source](../lib/content-services/upload/components/upload-button.component.ts) | -| [Upload drag area component](content-services/upload-drag-area.component.md) | Adds a drag and drop area to upload files to ACS. | [Source](../lib/content-services/upload/components/upload-drag-area.component.ts) | -| [Upload version button component](content-services/upload-version-button.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Activates a file version upload. | [Source](../lib/content-services/upload/components/upload-version-button.component.ts) | -| [Version list component](content-services/version-list.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays the version history of a node in a Version Manager component. | [Source](../lib/content-services/version-manager/version-list.component.ts) | -| [Version manager component](content-services/version-manager.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays the version history of a node with the ability to upload a new version. | [Source](../lib/content-services/version-manager/version-manager.component.ts) | -| [Webscript component](content-services/webscript.component.md) | Provides access to Webscript features. | [Source](../lib/content-services/webscript/webscript.component.ts) | +| [Add Permission Dialog Component](content-services/components/add-permission-dialog.component.md) | Displays a dialog to search for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts) | +| [Add Permission Panel Component](content-services/components/add-permission-panel.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts) | +| [Add Permission Component](content-services/components/add-permission.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts) | +| [Breadcrumb Component](content-services/components/breadcrumb.component.md) | Indicates the current position within a navigation hierarchy. | [Source](../lib/content-services/breadcrumb/breadcrumb.component.ts) | +| [Content Action component](content-services/components/content-action.component.md) | Adds options to a Document List actions menu for a particular content type. | [Source](../lib/content-services/document-list/components/content-action/content-action.component.ts) | +| [Content Metadata Card component](content-services/components/content-metadata-card.component.md) | Displays and edits metadata related to a node. | [Source](../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts) | +| [Content Node Selector Panel component](content-services/components/content-node-selector-panel.component.md) | Opens a Content Node Selector in its own dialog window. | [Source](../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | +| [Content Node Selector component](content-services/components/content-node-selector.component.md) | Allows a user to select items from a Content Services repository. | [Source](../lib/content-services/content-node-selector/content-node-selector.component.ts) | +| [Document List component](content-services/components/document-list.component.md) | Displays the documents from a repository. | [Source](../lib/content-services/document-list/components/document-list.component.ts) | +| [Dropdown Breadcrumb Component](content-services/components/dropdown-breadcrumb.component.md) | Indicates the current position within a navigation hierarchy using a dropdown menu. | [Source](../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts) | +| [File Uploading Dialog Component](content-services/components/file-uploading-dialog.component.md) | Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. | [Source](../lib/content-services/upload/components/file-uploading-dialog.component.ts) | +| [Like component](content-services/components/like.component.md) | Allows a user to add "likes" to an item. | [Source](../lib/content-services/social/like.component.ts) | +| [Permission List Component](content-services/components/permission-list.component.md) | Shows node permissions as a table. | [Source](../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts) | +| [Rating component](content-services/components/rating.component.md) | Allows a user to add ratings to an item. | [Source](../lib/content-services/social/rating.component.ts) | +| [Search check list component](content-services/components/search-check-list.component.md) | Implements a checklist widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-check-list/search-check-list.component.ts) | +| [Search Chip List Component](content-services/components/search-chip-list.component.md) | Displays search criteria as a set of "chips". | [Source](../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts) | +| [Search control component](content-services/components/search-control.component.md) | Displays a input text that shows find-as-you-type suggestions. | [Source](../lib/content-services/search/components/search-control.component.ts) | +| [Search date range component](content-services/components/search-date-range.component.md) | Implements a date range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-date-range/search-date-range.component.ts) | +| [Search Filter component](content-services/components/search-filter.component.md) | Represents a main container component for custom search and faceted search settings. | [Source](../lib/content-services/search/components/search-filter/search-filter.component.ts) | +| [Search number range component](content-services/components/search-number-range.component.md) | Implements a number range widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-number-range/search-number-range.component.ts) | +| [Search radio component](content-services/components/search-radio.component.md) | Implements a radio button list widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-radio/search-radio.component.ts) | +| [Search slider component](content-services/components/search-slider.component.md) | Implements a numeric slider widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-slider/search-slider.component.ts) | +| [Search Sorting Picker Component](content-services/components/search-sorting-picker.component.md) | Provides an ability to select one of the predefined sorting definitions for search results: | [Source](../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts) | +| [Search text component](content-services/components/search-text.component.md) | Implements a text input widget for the Search Filter component. | [Source](../lib/content-services/search/components/search-text/search-text.component.ts) | +| [Search component](content-services/components/search.component.md) | Searches items for supplied search terms. | [Source](../lib/content-services/search/components/search.component.ts) | +| [Sites Dropdown component](content-services/components/sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../lib/content-services/site-dropdown/sites-dropdown.component.ts) | +| [Tag Node Actions List component](content-services/components/tag-actions.component.md) | Shows available actions for tags. | [Source](../lib/content-services/tag/tag-actions.component.ts) | +| [Tag List component](content-services/components/tag-list.component.md) | Shows tags for an item. | [Source](../lib/content-services/tag/tag-list.component.ts) | +| [Tag Node List component](content-services/components/tag-node-list.component.md) | Shows tags for a node. | [Source](../lib/content-services/tag/tag-node-list.component.ts) | +| [Tree View component](content-services/components/tree-view.component.md) | Shows the folder and subfolders of a node as a tree view. | [Source](../lib/content-services/tree-view/components/tree-view.component.ts) | +| [Upload Button Component](content-services/components/upload-button.component.md) | Activates a file upload. | [Source](../lib/content-services/upload/components/upload-button.component.ts) | +| [Upload Drag Area Component](content-services/components/upload-drag-area.component.md) | Adds a drag and drop area to upload files to ACS. | [Source](../lib/content-services/upload/components/upload-drag-area.component.ts) | +| [Upload Version Button Component (Workaround)](content-services/components/upload-version-button.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Activates a file version upload. | [Source](../lib/content-services/upload/components/upload-version-button.component.ts) | +| [Version List component](content-services/components/version-list.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays the version history of a node in a Version Manager component. | [Source](../lib/content-services/version-manager/version-list.component.ts) | +| [Version Manager Component](content-services/components/version-manager.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays the version history of a node with the ability to upload a new version. | [Source](../lib/content-services/version-manager/version-manager.component.ts) | +| [Webscript component](content-services/components/webscript.component.md) | Provides access to Webscript features. | [Source](../lib/content-services/webscript/webscript.component.ts) | -## Dialogs +### Directives | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Confirm dialog](content-services/confirm.dialog.md) | Requests a yes/no choice from the user. | [Source](../lib/content-services/dialogs/confirm.dialog.ts) | -| [Library dialog](content-services/library.dialog.md) | Creates a new Content Services document library/site. | [Source](../lib/content-services/dialogs/library/library.dialog.ts) | +| [Node Public File Share Directive](content-services/directives/content-node-share.directive.md) | Creates and manages public shared links for files. | [Source](../lib/content-services/content-node-share/content-node-share.directive.ts) | +| [File Draggable directive](content-services/directives/file-draggable.directive.md) | Provides drag-and-drop features for an element such as a div. | [Source](../lib/content-services/upload/directives/file-draggable.directive.ts) | +| [Folder Create directive](content-services/directives/folder-create.directive.md) | Creates folders. | [Source](../lib/content-services/folder-directive/folder-create.directive.ts) | +| [Folder Edit directive](content-services/directives/folder-edit.directive.md) | Allows folders to be edited. | [Source](../lib/content-services/folder-directive/folder-edit.directive.ts) | +| [Inherit Permission directive](content-services/directives/inherited-button.directive.md) | Update the current node by adding/removing the inherited permissions. | [Source](../lib/content-services/permission-manager/components/inherited-button.directive.ts) | +| [Node Lock directive](content-services/directives/node-lock.directive.md) | Locks or unlocks a node. | [Source](../lib/content-services/directives/node-lock.directive.ts) | -## Directives +### Dialogs | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Content node share directive](content-services/content-node-share.directive.md) | Creates and manages public shared links for files. | [Source](../lib/content-services/content-node-share/content-node-share.directive.ts) | -| [Node lock directive](content-services/node-lock.directive.md) | Locks or unlocks a node. | [Source](../lib/content-services/directives/node-lock.directive.ts) | -| [Folder create directive](content-services/folder-create.directive.md) | Creates folders. | [Source](../lib/content-services/folder-directive/folder-create.directive.ts) | -| [Folder edit directive](content-services/folder-edit.directive.md) | Allows folders to be edited. | [Source](../lib/content-services/folder-directive/folder-edit.directive.ts) | -| [Inherited button directive](content-services/inherited-button.directive.md) | Update the current node by adding/removing the inherited permissions. | [Source](../lib/content-services/permission-manager/components/inherited-button.directive.ts) | -| [File draggable directive](content-services/file-draggable.directive.md) | Provides drag-and-drop features for an element such as a `div`. | [Source](../lib/content-services/upload/directives/file-draggable.directive.ts) | +| [Confirm dialog component](content-services/dialogs/confirm.dialog.md) | Requests a yes/no choice from the user. | [Source](../lib/content-services/dialogs/confirm.dialog.ts) | +| [Library dialog component](content-services/dialogs/library.dialog.md) | Creates a new Content Services document library/site. | [Source](../lib/content-services/dialogs/library/library.dialog.ts) | -## Models +### Interfaces | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Image resolver model](content-services/image-resolver.model.md) | Defines the Image Resolver function used by the Document List Component. | [Source](../lib/content-services/document-list/data/image-resolver.model.ts) | -| [Row filter model](content-services/row-filter.model.md) | Defines the Row Filter function used by the Document List Component. | [Source](../lib/content-services/document-list/data/row-filter.model.ts) | -| [Permissions style model](content-services/permissions-style.model.md) | Sets custom CSS styles for rows of a Document List according to the item's permissions. | [Source](../lib/content-services/document-list/models/permissions-style.model.ts) | +| [Search widget interface](content-services/interfaces/search-widget.interface.md) | Specifies required properties for Search filter component widgets. | [Source](../lib/content-services/search/search-widget.interface.ts) | -## Pipes +### Models | Name | Description | Source link | | ---- | ----------- | ----------- | -| [File upload error pipe](content-services/file-upload-error.pipe.md) | Converts an upload error code to an error message. | [Source](../lib/content-services/upload/pipes/file-upload-error.pipe.ts) | +| [Image Resolver Model](content-services/models/image-resolver.model.md) | Defines the Image Resolver function used by the Document List Component. | [Source](../lib/content-services/document-list/data/image-resolver.model.ts) | +| [Permission Style model](content-services/models/permissions-style.model.md) | Sets custom CSS styles for rows of a Document List according to the item's permissions. | [Source](../lib/content-services/document-list/models/permissions-style.model.ts) | +| [Row Filter Model](content-services/models/row-filter.model.md) | Defines the Row Filter function used by the Document List Component. | [Source](../lib/content-services/document-list/data/row-filter.model.ts) | -## Services +### Pipes | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Content node dialog service](content-services/content-node-dialog.service.md) | Displays and manages dialogs for selecting content to open, copy or upload. | [Source](../lib/content-services/content-node-selector/content-node-dialog.service.ts) | -| [Custom resources service](content-services/custom-resources.service.md) | Manages Document List information that is specific to a user. | [Source](../lib/content-services/document-list/services/custom-resources.service.ts) | -| [Document actions service](content-services/document-actions.service.md) | Implements the document menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/document-actions.service.ts) | -| [Document list service](content-services/document-list.service.md) | Implements node operations used by the Document List component. | [Source](../lib/content-services/document-list/services/document-list.service.ts) | -| [Folder actions service](content-services/folder-actions.service.md) | Implements the folder menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/folder-actions.service.ts) | -| [Node permission dialog service](content-services/node-permission-dialog.service.md) | Displays dialogs to let the user set node permissions. | [Source](../lib/content-services/permission-manager/services/node-permission-dialog.service.ts) | -| [Node permission service](content-services/node-permission.service.md) | Manages role permissions for content nodes. | [Source](../lib/content-services/permission-manager/services/node-permission.service.ts) | -| [Search filter service](content-services/search-filter.service.md) | Registers widgets for use with the Search Filter component. | [Source](../lib/content-services/search/components/search-filter/search-filter.service.ts) | -| [Search query builder service](content-services/search-query-builder.service.md) | Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. | [Source](../lib/content-services/search/search-query-builder.service.ts) | -| [Rating service](content-services/rating.service.md) | Manages ratings for items in Content Services. | [Source](../lib/content-services/social/services/rating.service.ts) | -| [Tag service](content-services/tag.service.md) | Manages tags in Content Services. | [Source](../lib/content-services/tag/services/tag.service.ts) | +| [File upload error pipe](content-services/pipes/file-upload-error.pipe.md) | Converts an upload error code to an error message. | [Source](../lib/content-services/upload/pipes/file-upload-error.pipe.ts) | + +### Services + +| Name | Description | Source link | +| ---- | ----------- | ----------- | +| [Content Node Dialog service](content-services/services/content-node-dialog.service.md) | Displays and manages dialogs for selecting content to open, copy or upload. | [Source](../lib/content-services/content-node-selector/content-node-dialog.service.ts) | +| [Custom Resources service](content-services/services/custom-resources.service.md) | Manages Document List information that is specific to a user. | [Source](../lib/content-services/document-list/services/custom-resources.service.ts) | +| [Document Actions service](content-services/services/document-actions.service.md) | Implements the document menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/document-actions.service.ts) | +| [Document List service](content-services/services/document-list.service.md) | Implements node operations used by the Document List component. | [Source](../lib/content-services/document-list/services/document-list.service.ts) | +| [Folder Actions service](content-services/services/folder-actions.service.md) | Implements the folder menu actions for the Document List component. | [Source](../lib/content-services/document-list/services/folder-actions.service.ts) | +| [Node permission dialog service](content-services/services/node-permission-dialog.service.md) | Displays dialogs to let the user set node permissions. | [Source](../lib/content-services/permission-manager/services/node-permission-dialog.service.ts) | +| [Node Permission service](content-services/services/node-permission.service.md) | Manages role permissions for content nodes. | [Source](../lib/content-services/permission-manager/services/node-permission.service.ts) | +| [Rating service](content-services/services/rating.service.md) | Manages ratings for items in Content Services. | [Source](../lib/content-services/social/services/rating.service.ts) | +| [Search filter service](content-services/services/search-filter.service.md) | Registers widgets for use with the Search Filter component. | [Source](../lib/content-services/search/components/search-filter/search-filter.service.ts) | +| [Search Query Builder service](content-services/services/search-query-builder.service.md) | Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. | [Source](../lib/content-services/search/search-query-builder.service.ts) | +| [Tag service](content-services/services/tag.service.md) | Manages tags in Content Services. | [Source](../lib/content-services/tag/services/tag.service.ts) | -## Other classes and interfaces - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Search Widget interface](content-services/search-widget.interface.md) | Specifies required properties for [Search filter component](../content-services/search-filter.component.md) widgets. | [Source](../lib/content-services/search/search-widget.interface.ts) | - [(Back to Contents)](#contents) ## Process Services API @@ -332,55 +339,56 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Apps list component](process-services/apps-list.component.md) | Shows all available apps. | [Source](../lib/process-services/app-list/apps-list.component.ts) | -| [Create process attachment component](process-services/create-process-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified process instance. | [Source](../lib/process-services/attachment/create-process-attachment.component.ts) | -| [Create task attachment component](process-services/create-task-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified task. | [Source](../lib/process-services/attachment/create-task-attachment.component.ts) | -| [Process attachment list component](process-services/process-attachment-list.component.md) | Displays documents attached to a specified process instance. | [Source](../lib/process-services/attachment/process-attachment-list.component.ts) | -| [Task attachment list component](process-services/task-attachment-list.component.md) | Displays documents attached to a specified task. | [Source](../lib/process-services/attachment/task-attachment-list.component.ts) | -| [People component](process-services/people.component.md) | Displays users involved with a specified task | [Source](../lib/process-services/people/components/people/people.component.ts) | -| [People list component](process-services/people-list.component.md) | Shows a list of users (people). | [Source](../lib/process-services/people/components/people-list/people-list.component.ts) | -| [People search component](process-services/people-search.component.md) | Searches users/people. | [Source](../lib/process-services/people/components/people-search/people-search.component.ts) | -| [Process comments component](process-services/process-comments.component.md) | Displays comments associated with a particular process instance and allows the user to add new comments. | [Source](../lib/process-services/process-comments/process-comments.component.ts) | -| [Process filters component](process-services/process-filters.component.md) | Collection of criteria used to filter process instances, which may be customized by users. | [Source](../lib/process-services/process-list/components/process-filters.component.ts) | -| [Process instance details component](process-services/process-instance-details.component.md) | Displays detailed information about a specified process instance | [Source](../lib/process-services/process-list/components/process-instance-details.component.ts) | -| [Process instance header component](process-services/process-instance-header.component.md) | Sub-component of the process details component, which renders some general information about the selected process. | [Source](../lib/process-services/process-list/components/process-instance-header.component.ts) | -| [Process instance tasks component](process-services/process-instance-tasks.component.md) | Lists both the active and completed tasks associated with a particular process instance | [Source](../lib/process-services/process-list/components/process-instance-tasks.component.ts) | -| [Process list component](process-services/process-list.component.md) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services/process-list/components/process-list.component.ts) | -| [Start process component](process-services/start-process.component.md) | Starts a process. | [Source](../lib/process-services/process-list/components/start-process.component.ts) | -| [Attach form component](process-services/attach-form.component.md) | This component can be used when there is no form attached to a task and you want to add one. | [Source](../lib/process-services/task-list/components/attach-form.component.ts) | -| [Checklist component](process-services/checklist.component.md) | Shows the checklist task functionality. | [Source](../lib/process-services/task-list/components/checklist.component.ts) | -| [Start task component](process-services/start-task.component.md) | Creates/Starts a new task for the specified app. | [Source](../lib/process-services/task-list/components/start-task.component.ts) | -| [Task details component](process-services/task-details.component.md) | Shows the details of the task ID passed in as input. | [Source](../lib/process-services/task-list/components/task-details.component.ts) | -| [Task filters component](process-services/task-filters.component.md) | Shows all available filters. | [Source](../lib/process-services/task-list/components/task-filters.component.ts) | -| [Task header component](process-services/task-header.component.md) | Shows all the information related to a task. | [Source](../lib/process-services/task-list/components/task-header.component.ts) | -| [Task list component](process-services/task-list.component.md) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services/task-list/components/task-list.component.ts) | -| [Task standalone component](process-services/task-standalone.component.md) | This component can be used when the task doesn't belong to any processes. | [Source](../lib/process-services/task-list/components/task-standalone.component.ts) | +| [Apps List Component](process-services/components/apps-list.component.md) | Shows all available apps. | [Source](../lib/process-services/app-list/apps-list.component.ts) | +| [Attach Form component](process-services/components/attach-form.component.md) | This component can be used when there is no form attached to a task and you want to add one. | [Source](../lib/process-services/task-list/components/attach-form.component.ts) | +| [Checklist Component](process-services/components/checklist.component.md) | Shows the checklist task functionality. | [Source](../lib/process-services/task-list/components/checklist.component.ts) | +| [Create Process Attachment component](process-services/components/create-process-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified process instance. | [Source](../lib/process-services/attachment/create-process-attachment.component.ts) | +| [Create Task Attachment Component](process-services/components/create-task-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified task. | [Source](../lib/process-services/attachment/create-task-attachment.component.ts) | +| [People list component](process-services/components/people-list.component.md) | Shows a list of users (people). | [Source](../lib/process-services/people/components/people-list/people-list.component.ts) | +| [People Search component](process-services/components/people-search.component.md) | Searches users/people. | [Source](../lib/process-services/people/components/people-search/people-search.component.ts) | +| [People Component](process-services/components/people.component.md) | Displays users involved with a specified task | [Source](../lib/process-services/people/components/people/people.component.ts) | +| [Process Attachment List component](process-services/components/process-attachment-list.component.md) | Displays documents attached to a specified process instance. | [Source](../lib/process-services/attachment/process-attachment-list.component.ts) | +| [Process Instance Comments component](process-services/components/process-comments.component.md) | Displays comments associated with a particular process instance and allows the user to add new comments. | [Source](../lib/process-services/process-comments/process-comments.component.ts) | +| [Process Filters Component](process-services/components/process-filters.component.md) | Collection of criteria used to filter process instances, which may be customized by users. | [Source](../lib/process-services/process-list/components/process-filters.component.ts) | +| [Process Details component](process-services/components/process-instance-details.component.md) | Displays detailed information about a specified process instance | [Source](../lib/process-services/process-list/components/process-instance-details.component.ts) | +| [Process Instance Details Header component](process-services/components/process-instance-header.component.md) | Sub-component of the process details component, which renders some general information about the selected process. | [Source](../lib/process-services/process-list/components/process-instance-header.component.ts) | +| [Process Instance Tasks component](process-services/components/process-instance-tasks.component.md) | Lists both the active and completed tasks associated with a particular process instance | [Source](../lib/process-services/process-list/components/process-instance-tasks.component.ts) | +| [Process Instance List](process-services/components/process-list.component.md) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services/process-list/components/process-list.component.ts) | +| [Select App Component](process-services/components/select-apps-dialog.component.md) | Shows all available apps and returns the selected app. | [Source](../lib/process-services/app-list/select-apps-dialog-component.ts) | +| [Start Process component](process-services/components/start-process.component.md) | Starts a process. | [Source](../lib/process-services/process-list/components/start-process.component.ts) | +| [Start Task Component](process-services/components/start-task.component.md) | Creates/Starts a new task for the specified app. | [Source](../lib/process-services/task-list/components/start-task.component.ts) | +| [Task Attachment List Component](process-services/components/task-attachment-list.component.md) | Displays documents attached to a specified task. | [Source](../lib/process-services/attachment/task-attachment-list.component.ts) | +| [Task Details component](process-services/components/task-details.component.md) | Shows the details of the task ID passed in as input. | [Source](../lib/process-services/task-list/components/task-details.component.ts) | +| [Task Filters component](process-services/components/task-filters.component.md) | Shows all available filters. | [Source](../lib/process-services/task-list/components/task-filters.component.ts) | +| [Task Header component](process-services/components/task-header.component.md) | Shows all the information related to a task. | [Source](../lib/process-services/task-list/components/task-header.component.ts) | +| [Task List component](process-services/components/task-list.component.md) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services/task-list/components/task-list.component.ts) | +| [Task Standalone component](process-services/components/task-standalone.component.md) | This component can be used when the task doesn't belong to any processes. | [Source](../lib/process-services/task-list/components/task-standalone.component.ts) | -## Directives +### Directives | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Process audit directive](process-services/process-audit.directive.md) | Fetches the Process Audit information in PDF or JSON format. | [Source](../lib/process-services/process-list/components/process-audit.directive.ts) | -| [Task audit directive](process-services/task-audit.directive.md) | Fetches the Task Audit information in PDF or JSON format. | [Source](../lib/process-services/task-list/components/task-audit.directive.ts) | +| [Process Audit Directive](process-services/directives/process-audit.directive.md) | Fetches the Process Audit information in PDF or JSON format. | [Source](../lib/process-services/process-list/components/process-audit.directive.ts) | +| [Task Audit Directive](process-services/directives/task-audit.directive.md) | Fetches the Task Audit information in PDF or JSON format. | [Source](../lib/process-services/task-list/components/task-audit.directive.ts) | -## Services +### Services | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Process filter service](process-services/process-filter.service.md) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services/process-list/services/process-filter.service.ts) | -| [Process service](process-services/process.service.md) | Manages Process Instances, Process Variables, and Process Audit Log. | [Source](../lib/process-services/process-list/services/process.service.ts) | -| [Task filter service](process-services/task-filter.service.md) | Manage Task Filters, which are pre-configured Task Instance queries. | [Source](../lib/process-services/task-list/services/task-filter.service.ts) | -| [Tasklist service](process-services/tasklist.service.md) | Manages Task Instances. | [Source](../lib/process-services/task-list/services/tasklist.service.ts) | +| [Process Filter Service](process-services/services/process-filter.service.md) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services/process-list/services/process-filter.service.ts) | +| [Process Service](process-services/services/process.service.md) | Manages process instances, process variables, and process audit Log. | [Source](../lib/process-services/process-list/services/process.service.ts) | +| [Task Filter Service](process-services/services/task-filter.service.md) | Manage Task Filters, which are pre-configured Task Instance queries. | [Source](../lib/process-services/task-list/services/task-filter.service.ts) | +| [Tasklist Service](process-services/services/tasklist.service.md) | Manages Task Instances. | [Source](../lib/process-services/task-list/services/tasklist.service.ts) | [(Back to Contents)](#contents) -# Process Services Cloud API +## Process Services Cloud API Contains components related to Process Services Cloud. See the library's @@ -389,42 +397,52 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [App list cloud component](process-services-cloud/app-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all deployed cloud application instances. | [Source](../lib/process-services-cloud/src/lib/app/components/app-list-cloud.component.ts) | -| [Group cloud component](process-services-cloud/group-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches Groups. | [Source](../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts) | -| [Edit process filter cloud component](process-services-cloud/edit-process-filter-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows Process Filter Details. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts) | -| [Process filters cloud component](process-services-cloud/process-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Lists all available process filters and allows to select a filter. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts) | -| [Process list cloud component](process-services-cloud/process-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts) | -| [Start process cloud component](process-services-cloud/start-process-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Starts a process. | [Source](../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts) | -| [People cloud component](process-services-cloud/people-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Allows one or more users to be selected (with auto-suggestion) based on the input parameters. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts) | -| [Start task cloud component](process-services-cloud/start-task-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Creates/starts a new task for the specified app. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts) | -| [Edit task filter cloud component](process-services-cloud/edit-task-filter-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Edits Task Filter Details. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts) | -| [Task filters cloud component](process-services-cloud/task-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all available filters. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts) | -| [Task header cloud component](process-services-cloud/task-header-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all the information related to a task. | [Source](../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts) | -| [Task list cloud component](process-services-cloud/task-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts) | +| [App List Cloud Component](process-services-cloud/components/app-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all deployed cloud application instances. | [Source](../lib/process-services-cloud/src/lib/app/components/app-list-cloud.component.ts) | +| [Edit Process Filter Cloud component](process-services-cloud/components/edit-process-filter-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows/edits process filter details. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts) | +| [Edit Task Filter Cloud component](process-services-cloud/components/edit-task-filter-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Edits task filter details. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts) | +| [Group Cloud component](process-services-cloud/components/group-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches Groups. | [Source](../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts) | +| [People Cloud Component](process-services-cloud/components/people-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Allows one or more users to be selected (with auto-suggestion) based on the input parameters. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts) | +| [Process Filters Cloud Component](process-services-cloud/components/process-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Lists all available process filters and allows to select a filter. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts) | +| [Process Header Cloud Component](process-services-cloud/components/process-header-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all the information related to a process instance. | [Source](../lib/process-services-cloud/src/lib/process/process-header/components/process-header-cloud.component.ts) | +| [Process Instance List Cloud component](process-services-cloud/components/process-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts) | +| [Start Process Cloud Component](process-services-cloud/components/start-process-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Starts a process. | [Source](../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts) | +| [Start Task Cloud Component](process-services-cloud/components/start-task-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Creates/starts a new task for the specified app. | [Source](../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts) | +| [Task Filters Cloud component](process-services-cloud/components/task-filters-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all available filters. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts) | +| [Task Header Cloud Component](process-services-cloud/components/task-header-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Shows all the information related to a task. | [Source](../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts) | +| [Task List Cloud component](process-services-cloud/components/task-list-cloud.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts) | -## Pipes +### Directives | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Group initial pipe](process-services-cloud/group-initial.pipe.md) | Extracts the initial character from a group name. | [Source](../lib/process-services-cloud/src/lib/group/pipe/group-initial.pipe.ts) | +| [Claim Task Directive](process-services-cloud/directives/claim-task.directive.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Claims a task | [Source](../lib/process-services-cloud/src/lib/task/directives/claim-task.directive.ts) | +| [Complete Task Directive](process-services-cloud/directives/complete-task.directive.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Completes a task. | [Source](../lib/process-services-cloud/src/lib/task/directives/complete-task.directive.ts) | +| [Unclaim Task Directive](process-services-cloud/directives/unclaim-task.directive.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Unclaims a task | [Source](../lib/process-services-cloud/src/lib/task/directives/unclaim-task.directive.ts) | -## Services +### Pipes | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Apps process cloud service](process-services-cloud/apps-process-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Gets details of deployed apps for the current user. | [Source](../lib/process-services-cloud/src/lib/app/services/apps-process-cloud.service.ts) | -| [Group cloud service](process-services-cloud/group-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches and gets information for groups. | [Source](../lib/process-services-cloud/src/lib/group/services/group-cloud.service.ts) | -| [Process filter cloud service](process-services-cloud/process-filter-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts) | -| [Process list cloud service](process-services-cloud/process-list-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches processes. | [Source](../lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts) | -| [Start process cloud service](process-services-cloud/start-process-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Gets process definitions and starts processes. | [Source](../lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts) | -| [Start task cloud service](process-services-cloud/start-task-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Starts standalone tasks. | [Source](../lib/process-services-cloud/src/lib/task/start-task/services/start-task-cloud.service.ts) | -| [Task filter cloud service](process-services-cloud/task-filter-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages task filters. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts) | -| [Task header cloud service](process-services-cloud/task-header-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages cloud tasks. | [Source](../lib/process-services-cloud/src/lib/task/task-header/services/task-header-cloud.service.ts) | -| [Task list cloud service](process-services-cloud/task-list-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches tasks. | [Source](../lib/process-services-cloud/src/lib/task/task-list/services/task-list-cloud.service.ts) | +| [Group initial pipe](process-services-cloud/pipes/group-initial.pipe.md) | Extracts the initial character from a group name. | [Source](../lib/process-services-cloud/src/lib/group/pipe/group-initial.pipe.ts) | + +### Services + +| Name | Description | Source link | +| ---- | ----------- | ----------- | +| [Apps Process Cloud Service](process-services-cloud/services/apps-process-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Gets details of deployed apps for the current user. | [Source](../lib/process-services-cloud/src/lib/app/services/apps-process-cloud.service.ts) | +| [Group Cloud Service](process-services-cloud/services/group-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches and gets information for groups. | [Source](../lib/process-services-cloud/src/lib/group/services/group-cloud.service.ts) | +| [Process Filter Cloud Service](process-services-cloud/services/process-filter-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts) | +| [Process Header Cloud Service](process-services-cloud/services/process-header-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages cloud process instances. | [Source](../lib/process-services-cloud/src/lib/process/process-header/services/process-header-cloud.service.ts) | +| [Process List Cloud Service](process-services-cloud/services/process-list-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches processes. | [Source](../lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts) | +| [Start Process Cloud Service](process-services-cloud/services/start-process-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Gets process definitions and starts processes. | [Source](../lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts) | +| [Start Task Cloud Service](process-services-cloud/services/start-task-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Starts standalone tasks. | [Source](../lib/process-services-cloud/src/lib/task/start-task/services/start-task-cloud.service.ts) | +| [Task Cloud Service](process-services-cloud/services/task-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages task cloud. | [Source](../lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts) | +| [Task Filter Cloud Service](process-services-cloud/services/task-filter-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages task filters. | [Source](../lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts) | +| [Task List Cloud Service](process-services-cloud/services/task-list-cloud.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Searches tasks. | [Source](../lib/process-services-cloud/src/lib/task/task-list/services/task-list-cloud.service.ts) | @@ -439,17 +457,18 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Dynamic component](extensions/dynamic.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays dynamically-loaded extension components. | [Source](../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) | +| [Dynamic Component](extensions/components/dynamic.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Displays dynamically-loaded extension components. | [Source](../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) | +| [Preview Extension Component](extensions/components/preview-extension.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Supports dynamically-loaded viewer preview extensions. | [Source](../lib/extensions/src/lib/components/viewer/preview-extension.component.ts) | -## Services +### Services | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Extension service](extensions/extension.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages and runs basic extension functionality. | [Source](../lib/extensions/src/lib/services/extension.service.ts) | +| [Extension Service](extensions/services/extension.service.md) ![Experimental](docassets/images/ExperimentalIcon.png) | Manages and runs basic extension functionality. | [Source](../lib/extensions/src/lib/services/extension.service.ts) | @@ -464,15 +483,15 @@ for more information about installing and using the source code. -## Components +### Components | Name | Description | Source link | | ---- | ----------- | ----------- | -| [Widget component](insights/widget.component.md) | Base class for standard and custom widget classes. | [Source](../lib/insights/analytics-process/components/widgets/widget.component.ts) | -| [Analytics generator component](insights/analytics-generator.component.md) | Generates and shows charts | [Source](../lib/insights/analytics-process/components/analytics-generator.component.ts) | -| [Analytics report list component](insights/analytics-report-list.component.md) | Shows a list of all available reports | [Source](../lib/insights/analytics-process/components/analytics-report-list.component.ts) | -| [Analytics component](insights/analytics.component.md) | Shows the charts related to the reportId passed as input | [Source](../lib/insights/analytics-process/components/analytics.component.ts) | -| [Diagram component](insights/diagram.component.md) | Displays process diagrams. | [Source](../lib/insights/diagram/components/diagram.component.ts) | +| [Analytics Generator Component](insights/components/analytics-generator.component.md) | Generates and shows charts | [Source](../lib/insights/analytics-process/components/analytics-generator.component.ts) | +| [APS Analytics List Component](insights/components/analytics-report-list.component.md) | Shows a list of all available reports | [Source](../lib/insights/analytics-process/components/analytics-report-list.component.ts) | +| [APS Analytics Component](insights/components/analytics.component.md) | Shows the charts related to the reportId passed as input | [Source](../lib/insights/analytics-process/components/analytics.component.ts) | +| [Diagram Component](insights/components/diagram.component.md) | Displays process diagrams. | [Source](../lib/insights/diagram/components/diagram.component.ts) | +| [Widget component](insights/components/widget.component.md) | Base class for standard and custom widget classes. | [Source](../lib/insights/analytics-process/components/widgets/widget.component.ts) | diff --git a/docs/abn-tree.yml b/docs/abn-tree.yml index 8b703cd4c3..f3fbf3d3a6 100644 --- a/docs/abn-tree.yml +++ b/docs/abn-tree.yml @@ -14,14 +14,51 @@ - working-with-nodes-js-api.md: 'Working with nodes using the JS-API' - content-metadata-component.md: 'Content metadata component' - user-guide: 'User guide' -- core: 'Core API' -- content-services: 'Content Services API' -- process-services: 'Process Services API' -- process-services-cloud: 'Process Services Cloud API' -- extensions: 'Extensions API' -- insights: 'Insights API' +- core: + title: 'Core API' + children: + - components: 'Components' + - directives: 'Directives' + - interfaces: 'Interfaces' + - models: 'Models' + - pipes: 'Pipes' + - services: 'Services' + - widgets: 'Widgets' +- content-services: + title: 'Content Services API' + children: + - components: 'Components' + - dialogs: 'Dialogs' + - directives: 'Directives' + - interfaces: 'Interfaces' + - models: 'Models' + - pipes: 'Pipes' + - services: 'Services' +- process-services: + title: 'Process Services API' + children: + - components: 'Components' + - directives: 'Directives' + - services: 'Services' +- process-services-cloud: + title: 'Process Services Cloud API' + children: + - components: 'Components' + - directives: 'Directives' + - pipes: 'Pipes' + - services: 'Services' +- extensions: + title: 'Extensions API' + children: + - components: 'Components' + - services: 'Services' +- insights: + title: 'Insights API' + children: + - components: 'Components' - roadmap.md: 'Roadmap' - versionIndex.md: 'Version index' - compatibility.md: 'Version compatibility' - release-notes: 'Release notes' +- upgrade-guide: 'Upgrade Guide' - license-info: 'License info' diff --git a/docs/breaking-changes/breaking-change-2.6.0-3.0.0.md b/docs/breaking-changes/breaking-change-2.6.0-3.0.0.md new file mode 100644 index 0000000000..73a158e17d --- /dev/null +++ b/docs/breaking-changes/breaking-change-2.6.0-3.0.0.md @@ -0,0 +1,149 @@ +--- +Title: Breaking changes, 2.6.0 -> 3.0.0 +--- + +# Breaking changes, 2.6.0 -> 3.0.0 + +This document lists all the deprecated ADF v2.x components that were removed for v3.0.0: + +- [PR ADF-3354](https://github.com/Alfresco/alfresco-ng2-components/pull/3980): + The `adf-accordion` component has been removed. + + ```html + + + ... + ``` + + Use the Angular Material [Expansion Panel](https://material.angular.io/components/expansion/api) + as an alternative. + +- [PR ADF-3746](https://github.com/Alfresco/alfresco-ng2-components/pull/3975): In order to + prevent our ADF style classes interfering with other projects, a new set of style lint rules has + been added. These rules enforce the use of the **adf-** prefix in all our classes. Please refer + to the PR to see the list of the all styles that were changed. If you have been rewriting any ADF + classes without the **adf-** prefix, you will now need to update them. For example, `.card-view` + is now `.adf-card-view`. + +- [PR ADF-1443](https://github.com/Alfresco/alfresco-ng2-components/pull/4028): [`DownloadZipDialogComponent`](../../lib/core/dialogs/download-zip.dialog.ts) + and [`NodeDownloadDirective`](../core/directives/node-download.directive.md) have been moved from the Content Services module to the Core module. + This modification has enabled us to remove some code duplication between the two modules. + +- [PR ADF-1873](https://github.com/Alfresco/alfresco-ng2-components/pull/4145): + - `adf-search-control`: The `QueryBody`, and + `customQueryBody` inputs of the [`SearchControlComponent`](../content-services/components/search-control.component.md) have been removed in favor of the + [custom search configuration interface](../core/interfaces/search-configuration.interface.md). + The inputs were deprecated in v2.1.0. + - ``: The `fileNodeId` input that supplies the [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) Id of the file to + load has been renamed as `nodeId`. + - ``: The `allowShare` input has been removed. Inject the + [Share Directive](../content-services/directives/content-node-share.directive.md) in a + [custom toolbar](../core/components/viewer.component.md#custom-toolbar) to recreate the behavior of the + Share button. + - ``: The `allowSidebar` input has now been split into `allowLeftSidebar` and `allowRightSidebar`. + - ``: The `showSidebar` input has now been split into `showLeftSidebar` and `showRightSidebar`. + - ``: The `sidebarTemplate` input has now been split into `sidebarLeftTemplate` and + `sidebarRightTemplate`. + - ``: The `sidebarPosition` input has been removed since it is not needed anymore + (you can now have two sidebars on the left and right at the same time). + - `analytics-report-list` is now `adf-analytics-report-list`. + - `analytics-report-parameters` is now `adf-analytics-report-parameters`. + - `CommentProcessModel` was moved into the Core library with the name [`CommentModel`](../../lib/core/models/comment.model.ts) in v2.3.0. Now you + can only import it from [`CoreModule`](../../lib/core/core.module.ts). + - [`CommentsModule`](../../lib/core/comments/comments.module.ts), [`CommentListComponent`](../core/components/comment-list.component.md), and [`CommentsComponent`](../core/components/comments.component.md) are no longer exported from + [`ProcessModule`](../../lib/process-services/process.module.ts) but now from [`CoreModule`](../../lib/core/core.module.ts). The old usage was deprecated in v2.3.0. + - ``: The `parentId` input has been renamed as `rootFolderId`. The old + name was deprecated in v2.4.0. + - The `createFolder` event of the [`UploadBase`](../../lib/content-services/upload/components/base-upload/upload-base.ts) class (emitted when a folder was + created) was deprecated in v2.4.0 and is no longer used by the framework + Use the `success` event instead. + - `` is now ``. The old usage was deprecated in v2.4.0. + - `adf-restore`, which was deprecated in v2.4.0, has been removed because it was not + working properly. A new feature to implement this functionality correctly has + been created. See [ADF-3901](https://issues.alfresco.com/jira/browse/ADF-3901) + for more information. + - ``: The `onError` event (emitted when any error occurs) was deprecated + in v2.4.0. It has now been renamed as `error`. + - `context-menu-holder` is now `adf-context-menu-holder`. + - The `file-draggable` event (emitted when one or more files are dragged and dropped + onto the draggable element) was deprecated in v2.4.0 and has now been removed. + Use `filesDropped` instead to get the same effect. + - The [`DocumentListService`](../content-services/services/document-list.service.md)`.hasPermission` method was redundant and has now been removed. + Use [`ContentService`](../core/services/content.service.md)`.hasAllowableOperations` instead. + - The `diagram-sequence-flow` tag has now been renamed as `adf-diagram-sequence-flow`. + The old name was deprecated in v2.3.0. + - The `diagram-alfresco-publish-task` tag has now been renamed as + `adf-diagram-publish-task`. The old name was deprecated in v2.3.0. + - ``: The `disableCsrf` input has been removed. Use the `disableCsrf` + property in `app.config.json` instead. + - ``: The `providers` input has been removed. Use the `providers` + property in `app.config.json` instead. + - ``: The `skipCount` input has been removed. You can define + the same value in pagination using the `pageSize` property. + - ``: The `enableInfiniteScrolling` input has been removed since + it is not used anymore. To choose the pagination strategy, add either the + [Infinite Pagination Component](../core/components/infinite-pagination.component.md) or the normal [Pagination Component](../core/components/pagination.component.md) and assign + your document list as the `target`. + - ``: The `folderNode` input has been removed. Use + the `currentFolderId` and `node` inputs instead. + - `SettingsService` has been removed. This was deprecated in v1.7.0. + - [`FormService`](../core/services/form.service.md): the `addFieldsToAForm` method has been removed. + - `` has been renamed to ``. +- [PR JS-API](https://github.com/Alfresco/alfresco-ng2-components/pull/4097): + + - The name package of the JS-API has been modified to use the namespace and all + **alfresco-js-api** imports need to be modified to **@alfresco/js-api**. + See the official + [JS-API documentation](https://github.com/Alfresco/alfresco-js-api) + for more details on how to use the new v3.0.0 + [Legacy Endpoint porting](https://github.com/Alfresco/alfresco-js-api#legacy-endpoint-porting-ver-2xx). + + - The JS-API `callApi` method signature has been modified. The `authNames` + parameter has now been removed because the type of authentication is configured + when the JS-API is constructed. + + v2.6.1 and before: + + ```ts + callApi( + path: string, + httpMethod: string, + pathParams?: any, + queryParams?: any, + headerParams?: any, + formParams?: any, + bodyParam?: any, + authNames?: string[], + contentTypes?: string[], + accepts?: string[], + returnType?: any, + contextRoot?: string, + responseType?: string + ): Promise; + ``` + + After v3.0.0: + + ```ts + callApi( + path: string, + httpMethod: string, + pathParams?: any, + queryParams?: any, + headerParams?: any, + formParams?: any, + bodyParam?: any, + contentTypes?: string[], + accepts?: string[], + returnType?: any, + contextRoot?: string, + responseType?: string + ): Promise; + ``` + +- [PR ADF-4062](https://github.com/Alfresco/alfresco-ng2-components/pull/4294) + - `adf-node-permission` has been renamed `adf-check-allowable-operation`. + - [`ContentService`](../core/services/content.service.md)`.hasPermission` was actually checking the `allowableOperation` value + and has been renamed as [`ContentService`](../core/services/content.service.md)`.hasAllowableOperations`. + - [`ContentService`](../core/services/content.service.md)`.hasPermissions` is a new method which actually _does_ check + the permissions. diff --git a/docs/compatibility.md b/docs/compatibility.md index 986f2dd647..fcae16f478 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -5,15 +5,23 @@ Title: Version compatibility # Version compatibility The table below shows the versions of Alfresco's backend services that -have been tested with latest versions of ADF. Note that *smoke testing* -means that the version should be safe to use (ie, it won't "catch fire") -but it is not guaranteed to be free of minor issues or missing features. +have been tested with latest versions of ADF. + +Our goal is to support ADF for *all* versions of Content Services +and Process Services. However, we only test against a subset of those +versions that believe to be representative. If a bug is reported for a +version that we don't test against then the bug will still be fixed in +the next release (ie, the fact that a version is not tested doesn't mean that it isn't supported). + +Note that [*smoke testing*](https://en.wikipedia.org/wiki/Smoke_testing_%28software%29) implies that the product will not "go up in smoke" when +used but the tests are quicker and not as thorough as with *full testing*. You can find further information about released versions of ADF in the [version index](versionIndex.md) and the [release notes](release-notes/README.md). -| ADF version | ACS versions | APS versions | +| ADF version | Content Services | Process Services | | -- | -- | -- | +| [3.1.0](versionIndex.md#v310) | **Full test:** v6.1.0 RC7
**Smoke test:** v5.2.4 | **Full test:** v2.0.0 (latest CI pipeline build), v1.9.0
**Smoke test:** v1.8.1 | | [3.0.0](versionIndex.md#v300) | **Full test:** v6.1.0 RC7
**Smoke test:** v5.2.4 | **Full test:** v2.0.0 (latest CI pipeline build), v1.9.0
**Smoke test:** v1.8.1 | | [2.6.0](versionIndex.md#v260) | **Full test:** v6.0.0, v5.2.4
**Smoke test:** v5.2.3 | **Full test:** v1.9.0
**Smoke test:** v1.8.1, v1.7.0, v1.6.4 | | [2.5.0](versionIndex.md#v250) | **Full test:** v5.2.3 | **Full test:** v1.6.4 | diff --git a/docs/content-services/README.md b/docs/content-services/README.md deleted file mode 100644 index 0ed4d7fbbb..0000000000 --- a/docs/content-services/README.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -Title: Content Services API -Github only: true ---- - -# Content Services API - -Contains components related to Content Services. -See the library's -[README file](../../lib/content-services/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Breadcrumb component](breadcrumb.component.md) | Indicates the current position within a navigation hierarchy. | [Source](../../lib/content-services/breadcrumb/breadcrumb.component.ts) | -| [Dropdown breadcrumb component](dropdown-breadcrumb.component.md) | Indicates the current position within a navigation hierarchy using a dropdown menu. | [Source](../../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts) | -| [Content metadata component](content-metadata.component.md) | Displays and edits metadata related to a node. | [Source](../../lib/content-services/content-metadata/components/content-metadata/content-metadata.component.ts) | -| [Content metadata card component](content-metadata-card.component.md) | Displays and edits metadata related to a node. | [Source](../../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts) | -| [Content node selector panel component](content-node-selector-panel.component.md) | Opens a Content Node Selector in its own dialog window. | [Source](../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | -| [Content node selector component](content-node-selector.component.md) | Allows a user to select items from a Content Services repository. | [Source](../../lib/content-services/content-node-selector/content-node-selector.component.ts) | -| [Content action component](content-action.component.md) | Adds options to a Document List actions menu for a particular content type. | [Source](../../lib/content-services/document-list/components/content-action/content-action.component.ts) | -| [Document list component](document-list.component.md) | Displays the documents from a repository. | [Source](../../lib/content-services/document-list/components/document-list.component.ts) | -| [Add permission dialog component](add-permission-dialog.component.md) | Displays a dialog to search for people or groups to add to the current node permissions. | [Source](../../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts) | -| [Add permission panel component](add-permission-panel.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts) | -| [Add permission component](add-permission.component.md) | Searches for people or groups to add to the current node permissions. | [Source](../../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts) | -| [Permission list component](permission-list.component.md) | Shows node permissions as a table. | [Source](../../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts) | -| [Search check list component](search-check-list.component.md) | Implements a checklist widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-check-list/search-check-list.component.ts) | -| [Search chip list component](search-chip-list.component.md) | Displays search criteria as a set of "chips". | [Source](../../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts) | -| [Search control component](search-control.component.md) | Displays a input text that shows find-as-you-type suggestions. | [Source](../../lib/content-services/search/components/search-control.component.ts) | -| [Search date range component](search-date-range.component.md) | Implements a date range widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-date-range/search-date-range.component.ts) | -| [Search filter component](search-filter.component.md) | Represents a main container component for custom search and faceted search settings. | [Source](../../lib/content-services/search/components/search-filter/search-filter.component.ts) | -| [Search number range component](search-number-range.component.md) | Implements a number range widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-number-range/search-number-range.component.ts) | -| [Search radio component](search-radio.component.md) | Implements a radio button list widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-radio/search-radio.component.ts) | -| [Search slider component](search-slider.component.md) | Implements a numeric slider widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-slider/search-slider.component.ts) | -| [Search sorting picker component](search-sorting-picker.component.md) | Provides an ability to select one of the predefined sorting definitions for search results: | [Source](../../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts) | -| [Search text component](search-text.component.md) | Implements a text input widget for the Search Filter component. | [Source](../../lib/content-services/search/components/search-text/search-text.component.ts) | -| [Search component](search.component.md) | Searches items for supplied search terms. | [Source](../../lib/content-services/search/components/search.component.ts) | -| [Sites dropdown component](sites-dropdown.component.md) | Displays a dropdown menu to show and interact with the sites of the current user. | [Source](../../lib/content-services/site-dropdown/sites-dropdown.component.ts) | -| [Like component](like.component.md) | Allows a user to add "likes" to an item. | [Source](../../lib/content-services/social/like.component.ts) | -| [Rating component](rating.component.md) | Allows a user to add ratings to an item. | [Source](../../lib/content-services/social/rating.component.ts) | -| [Tag actions component](tag-actions.component.md) | Shows available actions for tags. | [Source](../../lib/content-services/tag/tag-actions.component.ts) | -| [Tag list component](tag-list.component.md) | Shows tags for an item. | [Source](../../lib/content-services/tag/tag-list.component.ts) | -| [Tag node list component](tag-node-list.component.md) | Shows tags for a node. | [Source](../../lib/content-services/tag/tag-node-list.component.ts) | -| [Tree view component](tree-view.component.md) | Shows the folder and subfolders of a node as a tree view. | [Source](../../lib/content-services/tree-view/components/tree-view.component.ts) | -| [File uploading dialog component](file-uploading-dialog.component.md) | Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. | [Source](../../lib/content-services/upload/components/file-uploading-dialog.component.ts) | -| [Upload button component](upload-button.component.md) | Activates a file upload. | [Source](../../lib/content-services/upload/components/upload-button.component.ts) | -| [Upload drag area component](upload-drag-area.component.md) | Adds a drag and drop area to upload files to ACS. | [Source](../../lib/content-services/upload/components/upload-drag-area.component.ts) | -| [Upload version button component](upload-version-button.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Activates a file version upload. | [Source](../../lib/content-services/upload/components/upload-version-button.component.ts) | -| [Version list component](version-list.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Displays the version history of a node in a Version Manager component. | [Source](../../lib/content-services/version-manager/version-list.component.ts) | -| [Version manager component](version-manager.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Displays the version history of a node with the ability to upload a new version. | [Source](../../lib/content-services/version-manager/version-manager.component.ts) | -| [Webscript component](webscript.component.md) | Provides access to Webscript features. | [Source](../../lib/content-services/webscript/webscript.component.ts) | - -## Dialogs - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Confirm dialog](confirm.dialog.md) | Requests a yes/no choice from the user. | [Source](../../lib/content-services/dialogs/confirm.dialog.ts) | -| [Library dialog](library.dialog.md) | Creates a new Content Services document library/site. | [Source](../../lib/content-services/dialogs/library/library.dialog.ts) | - -## Directives - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Content node share directive](content-node-share.directive.md) | Creates and manages public shared links for files. | [Source](../../lib/content-services/content-node-share/content-node-share.directive.ts) | -| [Node lock directive](node-lock.directive.md) | Locks or unlocks a node. | [Source](../../lib/content-services/directives/node-lock.directive.ts) | -| [Folder create directive](folder-create.directive.md) | Creates folders. | [Source](../../lib/content-services/folder-directive/folder-create.directive.ts) | -| [Folder edit directive](folder-edit.directive.md) | Allows folders to be edited. | [Source](../../lib/content-services/folder-directive/folder-edit.directive.ts) | -| [Inherited button directive](inherited-button.directive.md) | Update the current node by adding/removing the inherited permissions. | [Source](../../lib/content-services/permission-manager/components/inherited-button.directive.ts) | -| [File draggable directive](file-draggable.directive.md) | Provides drag-and-drop features for an element such as a `div`. | [Source](../../lib/content-services/upload/directives/file-draggable.directive.ts) | - -## Models - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Image resolver model](image-resolver.model.md) | Defines the Image Resolver function used by the Document List Component. | [Source](../../lib/content-services/document-list/data/image-resolver.model.ts) | -| [Row filter model](row-filter.model.md) | Defines the Row Filter function used by the Document List Component. | [Source](../../lib/content-services/document-list/data/row-filter.model.ts) | -| [Permissions style model](permissions-style.model.md) | Sets custom CSS styles for rows of a Document List according to the item's permissions. | [Source](../../lib/content-services/document-list/models/permissions-style.model.ts) | - -## Pipes - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [File upload error pipe](file-upload-error.pipe.md) | Converts an upload error code to an error message. | [Source](../../lib/content-services/upload/pipes/file-upload-error.pipe.ts) | - -## Services - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Content node dialog service](content-node-dialog.service.md) | Displays and manages dialogs for selecting content to open, copy or upload. | [Source](../../lib/content-services/content-node-selector/content-node-dialog.service.ts) | -| [Custom resources service](custom-resources.service.md) | Manages Document List information that is specific to a user. | [Source](../../lib/content-services/document-list/services/custom-resources.service.ts) | -| [Document actions service](document-actions.service.md) | Implements the document menu actions for the Document List component. | [Source](../../lib/content-services/document-list/services/document-actions.service.ts) | -| [Document list service](document-list.service.md) | Implements node operations used by the Document List component. | [Source](../../lib/content-services/document-list/services/document-list.service.ts) | -| [Folder actions service](folder-actions.service.md) | Implements the folder menu actions for the Document List component. | [Source](../../lib/content-services/document-list/services/folder-actions.service.ts) | -| [Node permission dialog service](node-permission-dialog.service.md) | Displays dialogs to let the user set node permissions. | [Source](../../lib/content-services/permission-manager/services/node-permission-dialog.service.ts) | -| [Node permission service](node-permission.service.md) | Manages role permissions for content nodes. | [Source](../../lib/content-services/permission-manager/services/node-permission.service.ts) | -| [Search filter service](search-filter.service.md) | Registers widgets for use with the Search Filter component. | [Source](../../lib/content-services/search/components/search-filter/search-filter.service.ts) | -| [Search query builder service](search-query-builder.service.md) | Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. | [Source](../../lib/content-services/search/search-query-builder.service.ts) | -| [Rating service](rating.service.md) | Manages ratings for items in Content Services. | [Source](../../lib/content-services/social/services/rating.service.ts) | -| [Tag service](tag.service.md) | Manages tags in Content Services. | [Source](../../lib/content-services/tag/services/tag.service.ts) | - - - -## Other classes and interfaces - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Search Widget interface](search-widget.interface.md) | Specifies required properties for [Search filter component](../content-services/search-filter.component.md) widgets. | [Source](../../lib/content-services/search/search-widget.interface.ts) | diff --git a/docs/content-services/add-permission-dialog.component.md b/docs/content-services/components/add-permission-dialog.component.md similarity index 73% rename from docs/content-services/add-permission-dialog.component.md rename to docs/content-services/components/add-permission-dialog.component.md index fb1a8fe35c..0af47178c7 100644 --- a/docs/content-services/add-permission-dialog.component.md +++ b/docs/content-services/components/add-permission-dialog.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Add Permission Dialog Component](../../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts "Defined in add-permission-dialog.component.ts") +# [Add Permission Dialog Component](../../../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.ts "Defined in add-permission-dialog.component.ts") Displays a dialog to search for people or groups to add to the current node permissions. -![Add Permission Component](../docassets/images/add-permission-component.png) +![Add Permission Component](../../docassets/images/add-permission-component.png) ## Basic Usage @@ -29,10 +29,10 @@ import { NodePermissionDialogService } from '@alfresco/adf-content-services'; ## Details -This component extends the [Add permission panel component](../content-services/add-permission-panel.component.md) +This component extends the [Add permission panel component](add-permission-panel.component.md) to apply the chosen selection of permissions when they are accepted. You can open the dialog with the `openAddPermissionDialog` method from the -[Node Permission Dialog Service](../content-services/node-permission-dialog.service.md). +[Node Permission Dialog Service](../services/node-permission-dialog.service.md). This returns an [`Observable`](http://reactivex.io/documentation/observable.html) that you can subscribe to so you can get the details of the node after the update. Use the `updateNodePermissionByDialog` nethod from the service to update node permissions, as shown in @@ -54,5 +54,5 @@ import { NodePermissionDialogService } from '@alfresco/adf-content-services'; ## See also -- [Node permission dialog service](node-permission-dialog.service.md) +- [Node permission dialog service](../services/node-permission-dialog.service.md) - [Add permission panel component](add-permission-panel.component.md) diff --git a/docs/content-services/add-permission-panel.component.md b/docs/content-services/components/add-permission-panel.component.md similarity index 56% rename from docs/content-services/add-permission-panel.component.md rename to docs/content-services/components/add-permission-panel.component.md index f2cb44fc0e..caa8925abe 100644 --- a/docs/content-services/add-permission-panel.component.md +++ b/docs/content-services/components/add-permission-panel.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Add Permission Panel Component](../../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts "Defined in add-permission-panel.component.ts") +# [Add Permission Panel Component](../../../lib/content-services/permission-manager/components/add-permission/add-permission-panel.component.ts "Defined in add-permission-panel.component.ts") Searches for people or groups to add to the current node permissions. -![Add Permission Component](../docassets/images/add-permission-component.png) +![Add Permission Component](../../docassets/images/add-permission-component.png) ## Basic Usage @@ -35,11 +35,11 @@ This component uses a [Search component](search.component.md) to retrieve the groups and people that could be added to the permission list of the current node. The `select` event is emitted when a result is clicked from the list. -The [Add permission dialog component](../content-services/add-permission-dialog.component.md) -and [Add permission component](../content-services/add-permission.component.md) extend this behavior by applying the chosen +The [Add permission dialog component](add-permission-dialog.component.md) +and [Add permission component](add-permission.component.md) extend this behavior by applying the chosen permissions to the node once the selection has been made. ## See also -- [Add permission dialog component](../content-services/add-permission-dialog.component.md) -- [Add permission component](../content-services/add-permission.component.md) +- [Add permission dialog component](add-permission-dialog.component.md) +- [Add permission component](add-permission.component.md) diff --git a/docs/content-services/add-permission.component.md b/docs/content-services/components/add-permission.component.md similarity index 60% rename from docs/content-services/add-permission.component.md rename to docs/content-services/components/add-permission.component.md index 5fa988ceb2..cfc97ab1b2 100644 --- a/docs/content-services/add-permission.component.md +++ b/docs/content-services/components/add-permission.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Add Permission Component](../../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts "Defined in add-permission.component.ts") +# [Add Permission Component](../../../lib/content-services/permission-manager/components/add-permission/add-permission.component.ts "Defined in add-permission.component.ts") Searches for people or groups to add to the current node permissions. -![Add Permission Component](../docassets/images/add-permission-component.png) +![Add Permission Component](../../docassets/images/add-permission-component.png) ## Basic Usage @@ -38,11 +38,11 @@ Searches for people or groups to add to the current node permissions. ## Details -This component extends the [Add permission panel component](../content-services/add-permission-panel.component.md) +This component extends the [Add permission panel component](add-permission-panel.component.md) to apply the chosen selection of permissions when they are accepted. You can also -use the [Add permission dialog component](../content-services/add-permission-dialog.component.md) to perform the same action using a dialog. +use the [Add permission dialog component](add-permission-dialog.component.md) to perform the same action using a dialog. ## See also -- [Add permission panel component](../content-services/add-permission-panel.component.md) -- [Add permission dialog component](../content-services/add-permission-dialog.component.md) +- [Add permission panel component](add-permission-panel.component.md) +- [Add permission dialog component](add-permission-dialog.component.md) diff --git a/docs/content-services/breadcrumb.component.md b/docs/content-services/components/breadcrumb.component.md similarity index 83% rename from docs/content-services/breadcrumb.component.md rename to docs/content-services/components/breadcrumb.component.md index 66e99ad9b2..17b3f4c773 100644 --- a/docs/content-services/breadcrumb.component.md +++ b/docs/content-services/components/breadcrumb.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Breadcrumb Component](../../lib/content-services/breadcrumb/breadcrumb.component.ts "Defined in breadcrumb.component.ts") +# [Breadcrumb Component](../../../lib/content-services/breadcrumb/breadcrumb.component.ts "Defined in breadcrumb.component.ts") Indicates the current position within a navigation hierarchy. -![Breadcrumb](../docassets/images/breadcrumb.png) +![Breadcrumb](../../docassets/images/breadcrumb.png) ## Basic Usage @@ -29,7 +29,7 @@ Indicates the current position within a navigation hierarchy. | maxItems | `number` | | Maximum number of nodes to display before wrapping them with a dropdown element. | | root | `string` | null | (optional) Name of the root element of the breadcrumb. You can use this property to rename "Company Home" to "Personal Files" for example. You can use an i18n resource key for the property value. | | rootId | `string` | null | (optional) The id of the root element. You can use this property to set a custom element the breadcrumb should start with. | -| target | [`DocumentListComponent`](../content-services/document-list.component.md) | | (optional) [Document List component](../content-services/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. | +| target | [`DocumentListComponent`](../../content-services/components/document-list.component.md) | | (optional) [Document List component](../../content-services/components/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. | | transform | `Function` | | Transformation to be performed on the chosen/folder node before building the breadcrumb UI. Can be useful when custom formatting is needed for the breadcrumb. You can change the path elements from the node that are used to build the breadcrumb using this function. | ### Events @@ -43,7 +43,7 @@ Indicates the current position within a navigation hierarchy. The `maxItems` property sets the maximum number of "crumbs" in the breadcrumb trail. If the actual path contains more nodes than this then the earliest items in the path will be removed and kept in a menu as with the -[Dropdown breadcrumb component](../content-services/dropdown-breadcrumb.component.md). +[Dropdown breadcrumb component](dropdown-breadcrumb.component.md). ### Using the transform function @@ -53,7 +53,7 @@ the list by altering the node's `path.elements` property. Below is an example of how you might do this with the [Content Node Selector component](content-node-selector.component.md). In this case, you pass the -transform function via the `breadcrumbTransform` property of [`ContentNodeSelectorComponentData`](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) during +transform function via the `breadcrumbTransform` property of [`ContentNodeSelectorComponentData`](../../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) during initialization: ```ts @@ -92,7 +92,7 @@ A transform function to remove the "Sites" folder from the path would look somet Below, the breadcrumb is shown before and after the transform function is applied: -![Content Node Selector breadcrumbTransform before/after screenshot](../docassets/images/breadcrumbTransform.png) +![Content Node Selector breadcrumbTransform before/after screenshot](../../docassets/images/breadcrumbTransform.png) ## See also diff --git a/docs/content-services/content-action.component.md b/docs/content-services/components/content-action.component.md similarity index 89% rename from docs/content-services/content-action.component.md rename to docs/content-services/components/content-action.component.md index 00e3b3741d..ec5ca0e865 100644 --- a/docs/content-services/content-action.component.md +++ b/docs/content-services/components/content-action.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-17 --- -# [Content Action component](../../lib/content-services/document-list/components/content-action/content-action.component.ts "Defined in content-action.component.ts") +# [Content Action component](../../../lib/content-services/document-list/components/content-action/content-action.component.ts "Defined in content-action.component.ts") Adds options to a Document List actions menu for a particular content type. -![Document Actions](../docassets/images/document-actions.png) +![Document Actions](../../docassets/images/document-actions.png) ## Contents @@ -121,7 +121,7 @@ will trigger the same action.) You can also add your own handler by implementing `execute` event. Note that you can use _both_ a built-in handler and your own `execute` -function in the same action. The `execute` function is passed a [`NodeMinimalEntry`](../../lib/content-services/document-list/models/document-library.model.ts) as its +function in the same action. The `execute` function is passed a [`NodeMinimalEntry`](../../../lib/content-services/document-list/models/document-library.model.ts) as its parameter. For example, with `handler="delete"` you could use `execute` to show a message with the name, type, and other details of the item just deleted: @@ -155,7 +155,7 @@ type, and other details of the item just deleted: } ``` -![Custom delete message screenshot](../docassets/images/ContentActSnackMessage.png) +![Custom delete message screenshot](../../docassets/images/ContentActSnackMessage.png) ### Examples @@ -177,7 +177,7 @@ This action simply executes one of the built-in actions described above:
``` -![Download document action](../docassets/images/document-action-download.png) +![Download document action](../../docassets/images/document-action-download.png) #### Custom handler @@ -241,13 +241,13 @@ export class MyComponent { } ``` -![Delete disable action button](../docassets/images/content-action-disable-delete-button.png) +![Delete disable action button](../../docassets/images/content-action-disable-delete-button.png) #### Permission check You can also implement the `permissionEvent` to handle permission errors (to show the user a notification, for example). Subscribe to this event from your component -and use the [Notification service](../core/notification.service.md) to show a message. +and use the [Notification service](../../core/services/notification.service.md) to show a message. ```html @@ -276,7 +276,7 @@ export class MyComponent { } ``` -![Delete show notification message](../docassets/images/content-action-notification-message.png) +![Delete show notification message](../../docassets/images/content-action-notification-message.png) #### Copy and move @@ -284,7 +284,7 @@ These actions show the destination chooser dialog for copy and move actions. By the destination chooser lists all the folders of the subject item's parent. However, it won't allow the item being copied/moved to be the destination if it is itself a folder. -![Copy/move dialog](../docassets/images/document-action-copymovedialog.png) +![Copy/move dialog](../../docassets/images/document-action-copymovedialog.png) ```html @@ -432,10 +432,10 @@ funcName = (parameters): boolean => { ### Customizing built-in actions -The built-in actions are defined in the [Document Actions service](document-actions.service.md) and -[Folder Actions service](folder-actions.service.md) but you can register new actions with these services +The built-in actions are defined in the [Document Actions service](../services/document-actions.service.md) and +[Folder Actions service](../services/folder-actions.service.md) but you can register new actions with these services and override the default implementations. See the doc pages for -[Document Actions service](document-actions.service.md) and [Folder Actions service](folder-actions.service.md) +[Document Actions service](../services/document-actions.service.md) and [Folder Actions service](../services/folder-actions.service.md) for details and examples. ### Error, Permission and Success callbacks @@ -446,10 +446,10 @@ You can define error, permission and success callbacks in much the same way as f - The success callback's only parameter is the translatable success message string (which could be shown in a snackbar, for example) - The `permissionEvent` callback is the same as described above for the delete action -![Copy/move document action](../docassets/images/document-action-copymove.png) +![Copy/move document action](../../docassets/images/document-action-copymove.png) ## See also - [Document list component](document-list.component.md) -- [Document actions service](document-actions.service.md) -- [Folder actions service](folder-actions.service.md) +- [Document actions service](../services/document-actions.service.md) +- [Folder actions service](../services/folder-actions.service.md) diff --git a/docs/content-services/content-metadata-card.component.md b/docs/content-services/components/content-metadata-card.component.md similarity index 70% rename from docs/content-services/content-metadata-card.component.md rename to docs/content-services/components/content-metadata-card.component.md index 09bfb2cb93..830900e10b 100644 --- a/docs/content-services/content-metadata-card.component.md +++ b/docs/content-services/components/content-metadata-card.component.md @@ -2,14 +2,14 @@ Title: Content Metadata Card component Added: v2.1.0 Status: Active -Last reviewed: 2019-01-16 +Last reviewed: 2019-03-15 --- -# [Content Metadata Card component](../../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts "Defined in content-metadata-card.component.ts") +# [Content Metadata Card component](../../../lib/content-services/content-metadata/components/content-metadata-card/content-metadata-card.component.ts "Defined in content-metadata-card.component.ts") Displays and edits metadata related to a node. -![Content metadata screenshot](../docassets/images/ContentMetadata.png) +![Content metadata screenshot](../../docassets/images/ContentMetadata.png) ## Basic Usage @@ -38,7 +38,7 @@ Displays and edits metadata related to a node. ## Details The component shows metadata related to a given node. It uses the -[Card View component](../core/card-view.component.md) to render the properties of metadata aspects. +[Card View component](../../core/components/card-view.component.md) to render the properties of metadata aspects. The different aspects and their properties to be shown can be configured as application config presets (see below). By default the component only shows the basic properties of the node. The user can click on the pencil icon at the bottom of the component to edit the metadata @@ -47,8 +47,8 @@ properties. ### Application config presets You can define different presets for the metadata component or override the default presets in -the `app.config.json` file. The **default** preset is "\*" if not set, meaning the component -will display every aspect and property of a node without filtering. +the `app.config.json` file. If nothing else is set, the **default** preset is "\*", +which will use the "indifferent" config described below. You can define as many extra presets as you need for your components. @@ -68,6 +68,10 @@ The default configuration behaves like the following: ... ``` +This will display a default set of basic node properties: **name**, **title**, +**creator**, **created date**, **size**, **modifier**, **modified date**, +**mime type**, **author**, **description**. + #### Aspect oriented config With this type of configuration you can "whitelist" aspects and properties for a preset, but everything will be grouped by aspects and there is no further way to group properties. Use a @@ -126,8 +130,7 @@ A final example shows the same process applied to a custom preset called "kitten ### Layout oriented config You can also go beyond the aspect oriented configuration if you need to configure the groups and properties in a more detailed way. With this type of configuration any property of any aspect/type -can be "cherry picked" and grouped into an accordion drawer, along with a translatable title -defined in the preset configuration. +can be "cherry picked" and grouped into an accordion drawer, along with a translatable title defined in the preset configuration. #### Basic elements @@ -213,6 +216,80 @@ The result of this config would be two accordion groups with the following prope | kitten:favourite-food | | kitten:recommended-food | + +### Displaying all properties + +You can list all the properties by simply adding the `includeAll: boolean` to your config. This config will display all the aspects and properties available for that specific file. + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true + } + } +}, +``` + +Futhermore, you can also exclude specific aspects by adding the `exclude` property. It can be either a string if it's only one aspect or an array if you want to exclude multiple aspects at once: + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true, + "exclude": "exif:exif" + } + } +}, +``` + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true, + "exclude": ["exif:exif", "owner:parameters"] + } + } +}, +``` + +When using this configuration you can still whitelist aspects and properties as you desire. Let's see more complex examples for each of the config layouts: + +##### Aspect oriented config +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true, + "exclude": "exif:exif", + "exif:exif": [ "exif:pixelXDimension", "exif:pixelYDimension"] + } + } +}, +``` + +##### Layout oriented config +```json +"content-metadata": { + "presets": { + "robot-images": [ + { + "includeAll": true, + "exclude": ["cm:content", "exif:exif"] + }, + { + "title": "Robot Group", + "items": [ + { "aspect": "exif:exif", "properties": [ "exif:pixelXDimension", "exif:pixelYDimension"] } + ] + } + ] + } +}, +``` + ## What happens when there is a whitelisted aspect in the config but the given node doesn't relate to that aspect Nothing - since this aspect is not related to the node, it will simply be ignored and not diff --git a/docs/content-services/content-node-selector-panel.component.md b/docs/content-services/components/content-node-selector-panel.component.md similarity index 68% rename from docs/content-services/content-node-selector-panel.component.md rename to docs/content-services/components/content-node-selector-panel.component.md index 4f5480429e..f8fd6191bc 100644 --- a/docs/content-services/content-node-selector-panel.component.md +++ b/docs/content-services/components/content-node-selector-panel.component.md @@ -2,14 +2,14 @@ Title: Content Node Selector Panel component Added: v2.1.0 Status: Active -Last reviewed: 2019-01-16 +Last reviewed: 2019-03-20 --- -# [Content Node Selector Panel component](../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts "Defined in content-node-selector-panel.component.ts") +# [Content Node Selector Panel component](../../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts "Defined in content-node-selector-panel.component.ts") -Opens a [Content Node Selector](content-node-selecctor.component.md) in its own dialog window. +Opens a [Content Node Selector](content-node-selector.component.md) in its own dialog window. -![Content Node Selector screenshot](../docassets/images/ContentNodeSelector.png) +![Content Node Selector screenshot](../../docassets/images/ContentNodeSelector.png) ## Basic Usage @@ -34,12 +34,12 @@ Opens a [Content Node Selector](content-node-selecctor.component.md) in its own | currentFolderId | `string` | null | [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) ID of the folder currently listed. | | dropdownHideMyFiles | `boolean` | false | Hide the "My Files" option added to the site list by default. See the [Sites Dropdown component](sites-dropdown.component.md) for more information. | | dropdownSiteList | [`SitePaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SitePaging.md) | null | Custom site for site dropdown. This is the same as the `siteList`. property of the Sites Dropdown component (see its doc page for more information). | -| imageResolver | `ImageResolver` | null | Custom image resolver function. See the [Image Resolver Model](image-resolver.model.md) page for more information. | -| isSelectionValid | `ValidationFunction` | defaultValidation | Function used to decide if the selected node has permission to be selected. Default value is a function that always returns true. | +| imageResolver | [`ImageResolver`](../../../lib/content-services/document-list/data/image-resolver.model.ts) | null | Custom image resolver function. See the [Image Resolver Model](../models/image-resolver.model.md) page for more information. | +| isSelectionValid | [`ValidationFunction`](../../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | defaultValidation | Function used to decide if the selected node has permission to be selected. Default value is a function that always returns true. | | pageSize | `number` | | Number of items shown per page in the list. | -| where | `string` | | Custom _where_ filter function. See the [Document List component](../content-services/document-list.component.md) for more information. | +| where | `string` | | Custom _where_ filter function. See the [Document List component](../../content-services/components/document-list.component.md) for more information. | | excludeSiteContent | `string[]` | | Custom list of site content componentIds. Used to filter out the corresponding items from the displayed nodes | -| rowFilter | `RowFilter` | | Custom row filter function. See the [Row Filter Model](row-filter.model.md) page for more information. | +| rowFilter | [`RowFilter`](../../../lib/content-services/document-list/data/row-filter.model.ts) | | Custom row filter function. See the [Row Filter Model](../models/row-filter.model.md) page for more information. | ### Events @@ -53,7 +53,7 @@ This component opens a _content node selector_ in its own dialog window. This be standard file open/save dialogs used by applications to choose files. Full details are given in the [Content Node Selector component](content-node-selector.component.md) page (this is similar but does not manage the dialog window for you). Also, the -[Content Node Dialog service](content-node-dialog.service.md) has several methods that give you +[Content Node Dialog service](../services/content-node-dialog.service.md) has several methods that give you finer control over the behavior of the dialog. ### Using the breadcrumbTransform function @@ -66,4 +66,4 @@ example of how to use this function. ## See also - [Content Node Selector component](content-node-selector.component.md) -- [Content Node Dialog service](content-node-dialog.service.md) +- [Content Node Dialog service](../services/content-node-dialog.service.md) diff --git a/docs/content-services/content-node-selector.component.md b/docs/content-services/components/content-node-selector.component.md similarity index 74% rename from docs/content-services/content-node-selector.component.md rename to docs/content-services/components/content-node-selector.component.md index 16a34847d9..29bc1c0af5 100644 --- a/docs/content-services/content-node-selector.component.md +++ b/docs/content-services/components/content-node-selector.component.md @@ -5,15 +5,15 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Content Node Selector component](../../lib/content-services/content-node-selector/content-node-selector.component.ts "Defined in content-node-selector.component.ts") +# [Content Node Selector component](../../../lib/content-services/content-node-selector/content-node-selector.component.ts "Defined in content-node-selector.component.ts") Allows a user to select items from a Content Services repository. -![Content Node Selector screenshot](../docassets/images/ContentNodeSelector.png) +![Content Node Selector screenshot](../../docassets/images/ContentNodeSelector.png) ## Details -The [Content Node Selector component](../content-services/content-node-selector.component.md) works a lot like the standard File Open/Save +The [Content Node Selector component](content-node-selector.component.md) works a lot like the standard File Open/Save dialog used by desktop applications except that it chooses items from a Content Services repository rather than the filesystem. For example, the [Document List component](document-list.component.md) uses a selector to choose the targets @@ -25,7 +25,7 @@ more information). Unlike most components, the [Content Node Selector Component](content-node-selector.component.md) is typically shown in a dialog box rather than the main page and you are responsible for opening the dialog yourself. You can use the [Angular Material Dialog](https://material.angular.io/components/dialog/overview) for this, -as shown in the usage example. ADF provides the [`ContentNodeSelectorComponentData`](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) interface +as shown in the usage example. ADF provides the [`ContentNodeSelectorComponentData`](../../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) interface to work with the Dialog's [data option](https://material.angular.io/components/dialog/overview#sharing-data-with-the-dialog-component-): @@ -55,17 +55,17 @@ The properties are described in the table below: | currentFolderId | `string` | `null` | [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) ID of the folder currently listed. | | dropdownHideMyFiles | `boolean` | `false` | Hide the "My Files" option added to the site list by default. See the [Sites Dropdown component](sites-dropdown.component.md) for more information. | | dropdownSiteList | [`SitePaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SitePaging.md) | `null` | Custom site for site dropdown same as siteList. See the [Sites Dropdown component](sites-dropdown.component.md) for more information. | -| rowFilter | [`RowFilter`](../../lib/content-services/document-list/data/row-filter.model.ts) | `null` | Custom row filter function. See the [Row Filter Model](row-filter.model.md) page for more information. | -| where | `string` | `null` | Custom *where* filter function. See the [Document List component](document-list.component.md) for more information. | -| imageResolver | [`ImageResolver`](../../lib/content-services/document-list/data/image-resolver.model.ts) | `null` | Custom image resolver function. See the [Image Resolver Model](image-resolver.model.md) page for more information. | +| rowFilter | [`RowFilter`](../../../lib/content-services/document-list/data/row-filter.model.ts) | `null` | Custom row filter function. See the [Row Filter Model](../models/row-filter.model.md) page for more information. | +| where | `string` | `null` | Custom _where_ filter function. See the [Document List component](document-list.component.md) for more information. | +| imageResolver | [`ImageResolver`](../../../lib/content-services/document-list/data/image-resolver.model.ts) | `null` | Custom image resolver function. See the [Image Resolver Model](../models/image-resolver.model.md) page for more information. | | pageSize | `number` | | Number of items shown per page in the list. | -| isSelectionValid | [`ValidationFunction`](../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | `defaultValidation` | Function used to decide if the selected node has permission to be selected. Default value is a function that always returns true. | +| isSelectionValid | [`ValidationFunction`](../../../lib/content-services/content-node-selector/content-node-selector-panel.component.ts) | `defaultValidation` | Function used to decide if the selected node has permission to be selected. Default value is a function that always returns true. | | breadcrumbTransform | `(node: any) => any` | | Transformation to be performed on the chosen/folder node before building the breadcrumb UI. Can be useful when custom formatting is needed for the breadcrumb. You can change the path elements from the node that are used to build the breadcrumb using this function. | | select | [`Subject`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) | | Event emitted with the current node selection when the dialog closes | If you don't want to manage the dialog yourself then it is easier to use the [Content Node Selector Panel component](content-node-selector-panel.component.md), or the -methods of the [Content Node Dialog service](content-node-dialog.service.md), which create +methods of the [Content Node Dialog service](../services/content-node-dialog.service.md), which create the dialog for you. ### Usage example @@ -107,7 +107,7 @@ openSelectorDialog() { } ``` -All the results will be streamed to the select [subject](http://reactivex.io/rxjs/manual/overview.html#subject) present in the [`ContentNodeSelectorComponentData`](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) object passed to the dialog. +All the results will be streamed to the select [subject](http://reactivex.io/rxjs/manual/overview.html#subject) present in the [`ContentNodeSelectorComponentData`](../../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) object passed to the dialog. When the dialog action is selected by clicking, the `data.select` stream will be completed. ### RowFilter and ImageResolver @@ -118,12 +118,12 @@ items that the user can choose. As with the standard Document List, you can supp **row filter** function (to hide items that can't be chosen) and a custom **image resolver** function (to select an image to show in a particular list cell). For example, you could use a row filter to hide document nodes in a folder selector. See the -[Row Filter Model](row-filter.model.md) and [Image Resolver Model](image-resolver.model.md) +[Row Filter Model](../models/row-filter.model.md) and [Image Resolver Model](../models/image-resolver.model.md) pages for more information. ### Using the breadcrumbTransform function -The `breadcrumbTransform` property of [`ContentNodeSelectorComponentData`](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) lets you modify +The `breadcrumbTransform` property of [`ContentNodeSelectorComponentData`](../../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) lets you modify the [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) object that is used to generate the list of breadcrumbs. You can use this, for example, to remove path elements that are not relevant to the use case. See the [Breadcrumb component](breadcrumb.component.md) page for an @@ -133,4 +133,4 @@ example of how to use this function. - [Document list component](document-list.component.md) - [Content Node Selector Panel component](content-node-selector-panel.component.md) -- [Content Node Dialog service](content-node-dialog.service.md) +- [Content Node Dialog service](../services/content-node-dialog.service.md) diff --git a/docs/content-services/document-list.component.md b/docs/content-services/components/document-list.component.md similarity index 80% rename from docs/content-services/document-list.component.md rename to docs/content-services/components/document-list.component.md index 78c54e9269..f8847b463a 100644 --- a/docs/content-services/document-list.component.md +++ b/docs/content-services/components/document-list.component.md @@ -2,14 +2,14 @@ Title: Document List component Added: v2.0.0 Status: Active -Last reviewed: 2019-02-08 +Last reviewed: 2019-03-20 --- -# [Document List component](../../lib/content-services/document-list/components/document-list.component.ts "Defined in document-list.component.ts") +# [Document List component](../../../lib/content-services/document-list/components/document-list.component.ts "Defined in document-list.component.ts") Displays the documents from a repository. -![Custom columns](../docassets/images/custom-columns.png) +![Custom columns](../../docassets/images/custom-columns.png) ## Contents @@ -56,13 +56,13 @@ Displays the documents from a repository. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| allowDropFiles | `boolean` | false | Toggle file drop support for rows (see [Upload Directive](../core/upload.directive.md) for further details) | +| allowDropFiles | `boolean` | false | When true, this enables you to drop files directly into subfolders shown as items in the list. When false, the dropped file will be added to the current folder (ie, the one containing all the items shown in the list). See the [Upload directive](../../core/directives/upload.directive.md) for further details about how the file drop is handled. | | contentActions | `boolean` | false | Toggles content actions for each row | | contentActionsPosition | `string` | "right" | Position of the content actions dropdown menu. Can be set to "left" or "right". | | contextMenuActions | `boolean` | false | Toggles context menus for each row | | display | `string` | DisplayMode.List | Change the display mode of the table. Can be "list" or "gallery". | | emptyFolderImageUrl | `string` | | Custom image for empty folder. Default value: './assets/images/empty_doc_lib.svg' | -| imageResolver | `any \| null` | null | Custom function to choose image file paths to show. See the [Image Resolver Model](image-resolver.model.md) page for more information. | +| imageResolver | `any \| null` | null | Custom function to choose image file paths to show. See the [Image Resolver Model](../models/image-resolver.model.md) page for more information. | | includeFields | `string[]` | | Include additional information about the node in the server request. For example: association, isLink, isLocked and others. | | loading | `boolean` | false | Toggles the loading state and animated spinners for the component. Used in combination with `navigate=false` to perform custom navigation and loading state indication. | | locationFormat | `string` | "/" | The default route for all the location-based columns (if declared). | @@ -70,29 +70,30 @@ Displays the documents from a repository. | multiselect | `boolean` | false | Toggles multiselect mode | | navigate | `boolean` | true | Toggles navigation to folder content or file preview | | navigationMode | `string` | | User interaction for folder navigation or file preview. Valid values are "click" and "dblclick". Default value: "dblclick" | -| node | [`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts) | null | The Document list will show all the nodes contained in the [NodePaging](../../lib/content-services/document-list/models/document-library.model.ts) entity | -| permissionsStyle | [`PermissionStyleModel`](../../lib/content-services/document-list/models/permissions-style.model.ts)`[]` | \[] | Define a set of CSS styles to apply depending on the permission of the user on that node. See the [Permission Style model](../../lib/content-services/document-list/models/permissions-style.model.ts) page for further details and examples. | +| node | [`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) | null | The Document list will show all the nodes contained in the [NodePaging](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) entity | +| permissionsStyle | [`PermissionStyleModel`](../../../lib/content-services/document-list/models/permissions-style.model.ts)`[]` | \[] | Define a set of CSS styles to apply depending on the permission of the user on that node. See the [Permission Style model](../../../lib/content-services/document-list/models/permissions-style.model.ts) page for further details and examples. | | rowStyle | `string` | | The inline style to apply to every row. See the Angular NgStyle docs for more details and usage examples. | | rowStyleClass | `string` | | The CSS class to apply to every row | | selectionMode | `string` | "single" | Row selection mode. Can be null, `single` or `multiple`. For `multiple` mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | | showHeader | `boolean` | true | Toggles the header | | sorting | `string[]` | ['name', 'asc'] | Defines default sorting. The format is an array of 2 strings `[key, direction]` i.e. `['name', 'desc']` or `['name', 'asc']`. Set this value only if you want to override the default sorting detected by the component based on columns. | | sortingMode | `string` | "client" | Defines sorting mode. Can be either `client` (items in the list are sorted client-side) or `server` (the ordering supplied by the server is used without further client-side sorting). Note that the `server` option _does not_ request the server to sort the data before delivering it. | +| stickyHeader | `boolean` | false | Toggles the sticky header mode. | | thumbnails | `boolean` | false | Show document thumbnails rather than icons | | where | `string` | | Filters the [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) list using the _where_ condition of the REST API (for example, isFolder=true). See the REST API documentation for more information. | | currentFolderId | `string` | | The ID of the folder node to display or a reserved string alias for special sources | -| rowFilter | `RowFilter` | | Custom function to choose whether to show or hide rows. See the [Row Filter Model](row-filter.model.md) page for more information. | +| rowFilter | [`RowFilter`](../../../lib/content-services/document-list/data/row-filter.model.ts) | | Custom function to choose whether to show or hide rows. See the [Row Filter Model](../models/row-filter.model.md) page for more information. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the API fails to get the Document List data | -| folderChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the current display folder changes | -| nodeClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user clicks a list node | -| nodeDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user double-clicks a list node | -| preview | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user acts upon files with either single or double click (depends on `navigation-mode`). Useful for integration with the [Viewer component](../core/viewer.component.md). | -| ready | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` | Emitted when the Document List has loaded all items and is ready for use | +| folderChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the current display folder changes | +| nodeClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user clicks a list node | +| nodeDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user double-clicks a list node | +| preview | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/document-list/components/node.event.ts)`>` | Emitted when the user acts upon files with either single or double click (depends on `navigation-mode`). Useful for integration with the [Viewer component](../../core/components/viewer.component.md). | +| ready | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` | Emitted when the Document List has loaded all items and is ready for use | ## Details @@ -102,7 +103,7 @@ best. The Document list will automatically show special icons for : `Smart Folder`, `Link to a Folder` and `Folder with rules` as shown below : -![Document List Folders](../docassets/images/document-list-special-folder-icon.png) +![Document List Folders](../../docassets/images/document-list-special-folder-icon.png) ### DOM Events @@ -126,8 +127,8 @@ have at least the following properties as part of the `Event.detail` property va } ``` -See the [DataTable](../core/datatable.component.md) documentation for further details about -the other DOM events that the [Document List component](../content-services/document-list.component.md) bubbles up from the DataTable. +See the [DataTable](../../core/components/datatable.component.md) documentation for further details about +the other DOM events that the [Document List component](document-list.component.md) bubbles up from the DataTable. Below is a basic example of handling DOM events in the parent elements. @@ -161,7 +162,7 @@ You can use `ngIf` directives to provide conditional visibility support for the The Document List has an option to display items as "cards" instead of the standard view: -![card-view](../docassets/images/document-list-card-view.png) +![card-view](../../docassets/images/document-list-card-view.png) Set the `[display]` property to "gallery" to enable card view mode: @@ -174,7 +175,7 @@ Set the `[display]` property to "gallery" to enable card view mode: ### Pagination strategy -The Document List by default supports 2 types of pagination: [Pagination component](../core/pagination.component.md) and [Infinite pagination component](../core/infinite-pagination.component.md) +The Document List by default supports 2 types of pagination: [Pagination component](../../core/components/pagination.component.md) and [Infinite pagination component](../../core/components/infinite-pagination.component.md) #### Pagination component @@ -215,7 +216,7 @@ You can use one of the well-known reserved aliases: #### Document List aliases -The [Document List component](../content-services/document-list.component.md) also provides support for the following reserved aliases: +The [Document List component](document-list.component.md) also provides support for the following reserved aliases: - `-trashcan-`, - `-sharedlinks-` @@ -227,7 +228,7 @@ The [Document List component](../content-services/document-list.component.md) al Note that due to the nature of the data, these sources do not support navigation. You may want to handle single and double clicks yourself to perform navigation to other sources. -The [Document List component](../content-services/document-list.component.md) supports default presets for all the custom sources mentioned earlier. +The [Document List component](document-list.component.md) supports default presets for all the custom sources mentioned earlier. If you don't provide any custom column definition with the [Data Column](#custom-columns) component then a default preset will be automatically used at runtime. @@ -395,7 +396,7 @@ export class FilesComponent implements OnInit { The `console.log(node)` for the `getNodeInfo` callback is just for study and debug purposes. It is useful for examining other information that you can access if necessary: -![documentLibrary](../docassets/images/documentLibrary.png) +![documentLibrary](../../docassets/images/documentLibrary.png) **Important note**: for this particular scenario you must also trigger `changeDetector.detectChanges()` as in the example above. @@ -456,7 +457,7 @@ export class MyAppComponent implements AfterViewInit { The example above should produce the following browser console output: -![view-child](../docassets/images/viewchild.png) +![view-child](../../docassets/images/viewchild.png) Now you can access Document List properties or call methods directly: @@ -475,29 +476,11 @@ documentation for a full explanation of the component lifecycle. ### Underlying node object -The [Document List component](../content-services/document-list.component.md) assigns an instance of -[`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md) +The [Document List component](document-list.component.md) assigns an instance of +the [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) class (defined in the [Alfresco JS API](https://github.com/Alfresco/alfresco-js-api)) as the data context for each row. You can make use of the properties of this object when defining custom columns: -```js -export interface MinimalNode { - id: string; - parentId: string; - name: string; - nodeType: string; - isFolder: boolean; - isFile: boolean; - modifiedAt: Date; - modifiedByUser: UserInfo; - createdAt: Date; - createdByUser: UserInfo; - content: ContentInfo; - path: PathInfoEntity; - properties: NodeProperties; -} -``` - Binding to nested properties is also supported. You can define a column key as a property path similar to the following: ```text @@ -554,10 +537,10 @@ A custom set of columns might look like the following: ``` -![Custom columns](../docassets/images/custom-columns.png) +![Custom columns](../../docassets/images/custom-columns.png) You can also use the HTML-based schema declaration used by -[DataTable](../core/datatable.component.md), [Task List](../process-services/task-list.component.md) and other components: +[DataTable](../../core/components/datatable.component.md), [Task List](../../process-services/components/task-list.component.md) and other components: ```html @@ -571,7 +554,7 @@ You can also use the HTML-based schema declaration used by ``` -You can also add tooltips, styling, automatic column title translation and other features. See the [DataColumn component page](../core/data-column.component.md) for more information about specifying and customizing columns. +You can also add tooltips, styling, automatic column title translation and other features. See the [DataColumn component page](../../core/components/data-column.component.md) for more information about specifying and customizing columns. ### Column templates @@ -598,7 +581,7 @@ For example: ``` -All the components above also participate in [Extensibility](../user-guide/app-extensions.md) +All the components above also participate in [Extensibility](../../user-guide/app-extensions.md) and can be used to compose DocumentList layouts from within the plugins. ### Date Column @@ -666,8 +649,8 @@ you can also define your own actions. See the [Content Action component](content-action.component.md) for more information and examples. -You can also use the [Context Menu directive](../core/context-menu.directive.md) from the -[ADF Core](https://www.npmjs.com/package/ng2-alfresco-core) library to show the +You can also use the [Context Menu directive](../../core/directives/context-menu.directive.md) from the +ADF Core library to show the actions you have defined in a context menu: ```ts @@ -682,13 +665,13 @@ export class MyView { } ``` -![Folder context menu](../docassets/images/folder-context-menu.png) +![Folder context menu](../../docassets/images/folder-context-menu.png) This single extra line in the template enables context menu items for documents and folders. ### Navigation mode -By default, the [Document List component](../content-services/document-list.component.md) uses 'double-click' mode for navigation. +By default, the [Document List component](document-list.component.md) uses 'double-click' mode for navigation. That means that the user will see the contents of the folder when they double-click its name or icon (in a similar manner to Google Drive). However, there is also a single-click mode that may be sometimes be useful. @@ -711,15 +694,15 @@ functions: - `imageResolver` - Specifies a function to choose image file paths for icons and thumbnails. - `rowFilter` - Selects whether a row is shown or hidden according to its data content. -See the [Image Resolver Model](image-resolver.model.md) -and [Row Filter Model](row-filter.model.md) pages for details of how to +See the [Image Resolver Model](../models/image-resolver.model.md) +and [Row Filter Model](../models/row-filter.model.md) pages for details of how to implement these functions. ### Custom 'empty folder' template By default, the Document List provides the following content for the empty folder: -![Default empty folder](../docassets/images/empty-folder-template-default.png) +![Default empty folder](../../docassets/images/empty-folder-template-default.png) However, you can change this by defining your own custom HTML template: @@ -733,14 +716,14 @@ However, you can change this by defining your own custom HTML template: This will give the following output: -![Custom empty folder](../docassets/images/empty-folder-template-custom.png) +![Custom empty folder](../../docassets/images/empty-folder-template-custom.png) ### Custom 'permission denied' template By default, the Document List shows the following content when permission is denied: -![Default no permission](../docassets/images/no-permission-default.png) +![Default no permission](../../docassets/images/no-permission-default.png) You can change this by defining your own custom HTML template: @@ -754,13 +737,13 @@ You can change this by defining your own custom HTML template: This will give the following output: -![Custom no permission](../docassets/images/no-permission-custom.png) +![Custom no permission](../../docassets/images/no-permission-custom.png) ### Custom 'loading' template By default, the Document List shows the following content when the content is loading: -![Default loading](../docassets/images/default-loading.png) +![Default loading](../../docassets/images/default-loading.png) You can change this by defining your own custom HTML template: @@ -775,22 +758,22 @@ You can change this by defining your own custom HTML template: This will give the following output: -![Custom loading](../docassets/images/custom-loading.png) +![Custom loading](../../docassets/images/custom-loading.png) ## See also -- [Datatable component](../core/datatable.component.md) -- [Data column component](../core/data-column.component.md) -- [Pagination component](../core/pagination.component.md) -- [Infinite pagination component](../core/infinite-pagination.component.md) +- [Datatable component](../../core/components/datatable.component.md) +- [Data column component](../../core/components/data-column.component.md) +- [Pagination component](../../core/components/pagination.component.md) +- [Infinite pagination component](../../core/components/infinite-pagination.component.md) - [Sites dropdown component](sites-dropdown.component.md) -- [Metadata indicators](../user-guide/metadata-indicators.md) -- [Nodes api service](../core/nodes-api.service.md) +- [Metadata indicators](../../user-guide/metadata-indicators.md) +- [Nodes api service](../../core/services/nodes-api.service.md) - [Breadcrumb component](breadcrumb.component.md) - [Content action component](content-action.component.md) - [Content node selector component](content-node-selector.component.md) -- [Document list service](document-list.service.md) +- [Document list service](../services/document-list.service.md) - [Dropdown breadcrumb component](dropdown-breadcrumb.component.md) -- [Permissions style model](permissions-style.model.md) +- [Permissions style model](../models/permissions-style.model.md) - [Version manager component](version-manager.component.md) -- [Viewer component](../core/viewer.component.md) +- [Viewer component](../../core/components/viewer.component.md) diff --git a/docs/content-services/dropdown-breadcrumb.component.md b/docs/content-services/components/dropdown-breadcrumb.component.md similarity index 76% rename from docs/content-services/dropdown-breadcrumb.component.md rename to docs/content-services/components/dropdown-breadcrumb.component.md index cba91f1c6e..315069123f 100644 --- a/docs/content-services/dropdown-breadcrumb.component.md +++ b/docs/content-services/components/dropdown-breadcrumb.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Dropdown Breadcrumb Component](../../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts "Defined in dropdown-breadcrumb.component.ts") +# [Dropdown Breadcrumb Component](../../../lib/content-services/breadcrumb/dropdown-breadcrumb.component.ts "Defined in dropdown-breadcrumb.component.ts") Indicates the current position within a navigation hierarchy using a dropdown menu. -![Dropdown Breadcrumb screenshot](../docassets/images/DropdownBreadcrumb.png) +![Dropdown Breadcrumb screenshot](../../docassets/images/DropdownBreadcrumb.png) ## Basic Usage @@ -30,7 +30,7 @@ Indicates the current position within a navigation hierarchy using a dropdown me | maxItems | `number` | | Maximum number of nodes to display before wrapping them with a dropdown element. | | root | `string` | null | (optional) Name of the root element of the breadcrumb. You can use this property to rename "Company Home" to "Personal Files" for example. You can use an i18n resource key for the property value. | | rootId | `string` | null | (optional) The id of the root element. You can use this property to set a custom element the breadcrumb should start with. | -| target | [`DocumentListComponent`](../content-services/document-list.component.md) | | (optional) [Document List component](../content-services/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. | +| target | [`DocumentListComponent`](../../content-services/components/document-list.component.md) | | (optional) [Document List component](../../content-services/components/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. | | transform | `Function` | | Transformation to be performed on the chosen/folder node before building the breadcrumb UI. Can be useful when custom formatting is needed for the breadcrumb. You can change the path elements from the node that are used to build the breadcrumb using this function. | ### Events @@ -41,8 +41,8 @@ Indicates the current position within a navigation hierarchy using a dropdown me ## Details -Although this component inherits the `maxItems` property from the [Breadcrumb component,](../content-services/breadcrumb.component.md) the -"crumbs" are _always_ shown on a menu. By contrast, the [Breadcrumb component](../content-services/breadcrumb.component.md) only falls back +Although this component inherits the `maxItems` property from the [Breadcrumb component,](breadcrumb.component.md) the +"crumbs" are _always_ shown on a menu. By contrast, the [Breadcrumb component](breadcrumb.component.md) only falls back to a menu when its maximum number of nodes is exceeded. ## See also diff --git a/docs/content-services/file-uploading-dialog.component.md b/docs/content-services/components/file-uploading-dialog.component.md similarity index 80% rename from docs/content-services/file-uploading-dialog.component.md rename to docs/content-services/components/file-uploading-dialog.component.md index 8f7a6a9eb0..445052d988 100644 --- a/docs/content-services/file-uploading-dialog.component.md +++ b/docs/content-services/components/file-uploading-dialog.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [File Uploading Dialog Component](../../lib/content-services/upload/components/file-uploading-dialog.component.ts "Defined in file-uploading-dialog.component.ts") +# [File Uploading Dialog Component](../../../lib/content-services/upload/components/file-uploading-dialog.component.ts "Defined in file-uploading-dialog.component.ts") Shows a dialog listing all the files uploaded with the Upload Button or Drag Area components. @@ -39,4 +39,4 @@ This component should be used in combination with the - [Upload button component](upload-button.component.md) - [Upload drag area component](upload-drag-area.component.md) -- [File upload error pipe](../content-services/file-upload-error.pipe.md) +- [File upload error pipe](../pipes/file-upload-error.pipe.md) diff --git a/docs/content-services/like.component.md b/docs/content-services/components/like.component.md similarity index 75% rename from docs/content-services/like.component.md rename to docs/content-services/components/like.component.md index 36c38bebd3..05b1e8ca64 100644 --- a/docs/content-services/like.component.md +++ b/docs/content-services/components/like.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Like component](../../lib/content-services/social/like.component.ts "Defined in like.component.ts") +# [Like component](../../../lib/content-services/social/like.component.ts "Defined in like.component.ts") Allows a user to add "likes" to an item. -![Custom columns](../docassets/images/social1.png) +![Custom columns](../../docassets/images/social1.png) ## Basic Usage @@ -34,4 +34,4 @@ Allows a user to add "likes" to an item. ## See also - [Rating component](rating.component.md) -- [Rating service](rating.service.md) +- [Rating service](../services/rating.service.md) diff --git a/docs/content-services/permission-list.component.md b/docs/content-services/components/permission-list.component.md similarity index 64% rename from docs/content-services/permission-list.component.md rename to docs/content-services/components/permission-list.component.md index b780bba185..980997cea0 100644 --- a/docs/content-services/permission-list.component.md +++ b/docs/content-services/components/permission-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Permission List Component](../../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts "Defined in permission-list.component.ts") +# [Permission List Component](../../../lib/content-services/permission-manager/components/permission-list/permission-list.component.ts "Defined in permission-list.component.ts") Shows node permissions as a table. -![Permission List](../docassets/images/adf-permission-list.png) +![Permission List](../../docassets/images/adf-permission-list.png) ## Basic Usage @@ -18,7 +18,7 @@ Shows node permissions as a table. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) When the list is empty, the contents will simply say "No permissions" by default, but you can also supply your own content: @@ -44,11 +44,11 @@ but you can also supply your own content: | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| update | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the permission is updated. | +| update | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PermissionElement`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/PermissionElement.md)`>` | Emitted when the permission is updated. | ## Details -This component uses a [Datatable component](../core/datatable.component.md) to show the -permissions retrieved from the [Node service](../core/node.service.md). +This component uses a [Datatable component](../../core/components/datatable.component.md) to show the +permissions retrieved from the [Node service](../../core/services/node.service.md). For the locally set permissions a role dropdown will be shown to let the user select a new role. When the user selects a new value, the permission role is automatically updated and the `update` event is emitted. diff --git a/docs/content-services/rating.component.md b/docs/content-services/components/rating.component.md similarity index 75% rename from docs/content-services/rating.component.md rename to docs/content-services/components/rating.component.md index 0889bff32b..c5ef2d7292 100644 --- a/docs/content-services/rating.component.md +++ b/docs/content-services/components/rating.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Rating component](../../lib/content-services/social/rating.component.ts "Defined in rating.component.ts") +# [Rating component](../../../lib/content-services/social/rating.component.ts "Defined in rating.component.ts") Allows a user to add ratings to an item. -![Rating component screenshot](../docassets/images/social2.png) +![Rating component screenshot](../../docassets/images/social2.png) ## Basic Usage @@ -36,4 +36,4 @@ Allows a user to add ratings to an item. ## See also - [Like component](like.component.md) -- [Rating service](rating.service.md) +- [Rating service](../services/rating.service.md) diff --git a/docs/content-services/search-check-list.component.md b/docs/content-services/components/search-check-list.component.md similarity index 69% rename from docs/content-services/search-check-list.component.md rename to docs/content-services/components/search-check-list.component.md index 8209949bfd..4f23c2f6d4 100644 --- a/docs/content-services/search-check-list.component.md +++ b/docs/content-services/components/search-check-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-11 --- -# [Search check list component](../../lib/content-services/search/components/search-check-list/search-check-list.component.ts "Defined in search-check-list.component.ts") +# [Search check list component](../../../lib/content-services/search/components/search-check-list/search-check-list.component.ts "Defined in search-check-list.component.ts") -Implements a checklist widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a checklist widget for the [Search Filter component](search-filter.component.md). -![Check list widget screenshot](../docassets/images/search-check-list.png) +![Check list widget screenshot](../../docassets/images/search-check-list.png) ## Basic usage @@ -48,7 +48,7 @@ Implements a checklist widget for the [Search Filter component](../content-servi ## Details This widget displays a list of checkboxes, each of which toggles a particular query fragment -in the search. See the [Search filter component](../content-services/search-filter.component.md) for full details of how to use the widgets +in the search. See the [Search filter component](search-filter.component.md) for full details of how to use the widgets in a search query. In the settings, the `options` array, defines the checkboxes that toggle the supplied query @@ -70,9 +70,9 @@ items in the list. ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search slider component](../content-services/search-slider.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search filter component](search-filter.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search slider component](search-slider.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/components/search-chip-list.component.md b/docs/content-services/components/search-chip-list.component.md new file mode 100644 index 0000000000..dfcf5860f8 --- /dev/null +++ b/docs/content-services/components/search-chip-list.component.md @@ -0,0 +1,28 @@ +--- +Title: Search Chip List Component +Added: v2.3.0 +Status: Active +Last reviewed: 2018-09-14 +--- + +# [Search Chip List Component](../../../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts "Defined in search-chip-list.component.ts") + +Displays search criteria as a set of "chips". + +![Selected Facets](../../docassets/images/selected-facets.png) + +## Basic usage + +```html + + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| clearAll | `boolean` | false | Flag used to enable the display of a clear-all-filters button. | +| searchFilter | [`SearchFilterComponent`](../../content-services/components/search-filter.component.md) | | Search filter to supply the data for the chips. | diff --git a/docs/content-services/search-control.component.md b/docs/content-services/components/search-control.component.md similarity index 90% rename from docs/content-services/search-control.component.md rename to docs/content-services/components/search-control.component.md index b4995a1d15..ec14ddaf23 100644 --- a/docs/content-services/search-control.component.md +++ b/docs/content-services/components/search-control.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Search control component](../../lib/content-services/search/components/search-control.component.ts "Defined in search-control.component.ts") +# [Search control component](../../../lib/content-services/search/components/search-control.component.ts "Defined in search-control.component.ts") Displays a input text that shows find-as-you-type suggestions. -![adf-search-control](../docassets/images/search-control-component.png) +![adf-search-control](../../docassets/images/search-control-component.png) ## Basic usage @@ -21,7 +21,7 @@ Displays a input text that shows find-as-you-type suggestions. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can show your own custom template when no results are found for the search: diff --git a/docs/content-services/search-date-range.component.md b/docs/content-services/components/search-date-range.component.md similarity index 67% rename from docs/content-services/search-date-range.component.md rename to docs/content-services/components/search-date-range.component.md index 2ff10ac9de..6dd4f4f43d 100644 --- a/docs/content-services/search-date-range.component.md +++ b/docs/content-services/components/search-date-range.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-11 --- -# [Search date range component](../../lib/content-services/search/components/search-date-range/search-date-range.component.ts "Defined in search-date-range.component.ts") +# [Search date range component](../../../lib/content-services/search/components/search-date-range/search-date-range.component.ts "Defined in search-date-range.component.ts") -Implements a date range widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a date range widget for the [Search Filter component](search-filter.component.md). -![Date Range Widget](../docassets/images/search-date-range.png) +![Date Range Widget](../../docassets/images/search-date-range.png) ## Basic usage @@ -43,7 +43,7 @@ Implements a date range widget for the [Search Filter component](../content-serv ## Details This component lets the user select a range between two dates based on the particular `field`. -See the [Search filter component](../content-services/search-filter.component.md) for full details of how to use widgets +See the [Search filter component](search-filter.component.md) for full details of how to use widgets in a search query. ### Custom date format @@ -75,9 +75,9 @@ in the `dateFormat` setting: ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search slider component](../content-services/search-slider.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search filter component](search-filter.component.md) +- [Search check list component](search-check-list.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search slider component](search-slider.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/search-filter.component.md b/docs/content-services/components/search-filter.component.md similarity index 68% rename from docs/content-services/search-filter.component.md rename to docs/content-services/components/search-filter.component.md index 2fe05f716e..be4e7445a3 100644 --- a/docs/content-services/search-filter.component.md +++ b/docs/content-services/components/search-filter.component.md @@ -2,10 +2,10 @@ Title: Search Filter component Added: v2.3.0 Status: Active -Last reviewed: 2018-06-12 +Last reviewed: 2019-03-20 --- -# [Search Filter component](../../lib/content-services/search/components/search-filter/search-filter.component.ts "Defined in search-filter.component.ts") +# [Search Filter component](../../../lib/content-services/search/components/search-filter/search-filter.component.ts "Defined in search-filter.component.ts") Represents a main container component for custom search and faceted search settings. @@ -19,6 +19,8 @@ Represents a main container component for custom search and faceted search setti - [Categories and widgets](#categories-and-widgets) - [Facet Fields](#facet-fields) - [Facet Queries](#facet-queries) + - [Highlight](#highlight) + - [Facet Intervals](#facet-intervals) - [See also](#see-also) ## Basic usage @@ -30,7 +32,7 @@ Represents a main container component for custom search and faceted search setti ## Details The component UI uses dynamically created widgets to specify the search query and its -options. It then uses the [Search Query Builder service](search-query-builder.service.md) +options. It then uses the [Search Query Builder service](../services/search-query-builder.service.md) to build and execute the query. You may find it useful to check out the following resources for background information @@ -66,7 +68,7 @@ A typical configuration is shown below: "expanded": true, "fields": [ { "field": "content.mimetype", "mincount": 1, "label": "Type" }, - { "field": "content.size", "mincount": 1, "label": "Size" }, + { "field": "content.size", "mincount": 1, "label": "File Size" }, { "field": "creator", "mincount": 1, "label": "Creator" }, { "field": "modifier", "mincount": 1, "label": "Modifier" } ] @@ -133,6 +135,17 @@ You can choose to filter facet field results using 'contains' instead of 'starts } ``` +You can choose to display a reset button by setting the 'resetButton' value to true. +This 'clean up' button would make it easier for the final user to remove all bucket selections and all search filtering. + +```json +{ + "search": { + "resetButton": true + } +} +``` + You can also provide a set of queries that are always executed alongside the user-defined settings: @@ -177,8 +190,8 @@ The properties of the `options` objects are as follows: | Name | Type | Description | | ---- | ---- | ----------- | -| key | string | Unique key to identify the entry. This can also be used to map [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) instances. | -| label | string | Display text, which can also be an [i18n resource key](../user-guide/internationalization.md). | +| key | string | Unique key to identify the entry. This can also be used to map [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) instances. | +| label | string | Display text, which can also be an [i18n resource key](../../user-guide/internationalization.md). | | type | string | This specifies how to order the results. It can be based on a field, based on the position of the document in the index, or by score/relevance. | | field | string | The name of the field. | | ascending | boolean | The sorting order defined as `true` for ascending order and `false` for descending order | @@ -211,7 +224,7 @@ export interface SearchCategory { The interface above also describes entries in the `search.query.categories` section for the `app.config.json` file. -![Search Categories](../docassets/images/search-categories-01.png) +![Search Categories](../../docassets/images/search-categories-01.png) > **Note:** you must provide at least one category field in order to execute the query, > so that filters and selected facets are applied. @@ -229,9 +242,9 @@ a category: | [Slider](search-slider.component.md) | `slider` | Selects a single numeric value in a given range that a field may contain | | [Text](search-text.component.md) | `text` | Specifies a text value that a field may contain | -See the individual [search widget](../../lib/content-services/search/search-widget.interface.ts) pages for full details of their usage and settings. +See the individual [Search Widget](../interfaces/search-widget.interface.md) pages for full details of their usage and settings. -You can also implement your own custom search widgets. See the [`SearchWidget`](../../lib/content-services/search/search-widget.interface.ts) interface +You can also implement your own custom search widgets. See the [Search Widget Interface](../interfaces/search-widget.interface.md) interface page for full details of how to do this. #### Widget settings @@ -240,7 +253,7 @@ Each type of widget has its own settings. For example Number editors may parse minimum and maximum values, while Text editors can support value formats or length constraints. You can use `component.settings` to pass any information to a widget using the -[`SearchWidgetSettings`](../../lib/content-services/search/search-widget-settings.interface.ts) interface: +[`SearchWidgetSettings`](../../../lib/content-services/search/search-widget-settings.interface.ts) interface: ```ts export interface SearchWidgetSettings { @@ -254,13 +267,16 @@ export interface SearchWidgetSettings { ```json { "search": { - "facetFields": [ - { "field": "content.mimetype", "mincount": 1, "label": "Type" }, - { "field": "content.size", "mincount": 1, "label": "Size" }, - { "field": "creator", "mincount": 1, "label": "Creator" }, - { "field": "modifier", "mincount": 1, "label": "Modifier" }, - { "field": "created", "mincount": 1, "label": "Created" } - ] + "facetFields": { + "expanded": true, + "fields": [ + { "field": "content.mimetype", "mincount": 1, "label": "Type" }, + { "field": "content.size", "mincount": 1, "label": "File Size" }, + { "field": "creator", "mincount": 1, "label": "Creator" }, + { "field": "modifier", "mincount": 1, "label": "Modifier" }, + { "field": "created", "mincount": 1, "label": "Created" } + ] + } } } ``` @@ -268,10 +284,10 @@ export interface SearchWidgetSettings { Every field declared within the `facetFields` group is presented by a separate collapsible category at runtime. By default, users see only the top 5 entries. -If there are more than 5 entries, the "Show more" button is displayed to let the user move to +If there are more than 5 entries, a button to show more items is displayed to let the user move to the next block of results. -![Facet Fields](../docassets/images/search-facet-fields.png) +![Facet Fields](../../docassets/images/search-facet-fields.png) #### FacetField Properties @@ -318,6 +334,7 @@ exceeds the `pageSize` value. You can also provide a custom `label` (or i18n resource key) for the default resulting collapsible category. If you need to display more resulting collapsible categories, you can group different facet queries under custom labels by using the `group` property on those facet queries: + ```json { "search": { @@ -341,26 +358,137 @@ If you need to display more resulting collapsible categories, you can group diff } } } -``` +``` + This will result in the following display of the grouped facet queries: -![Grouped Facet Queries](../docassets/images/search-facet-queries-groups.png) +![Grouped Facet Queries](../../docassets/images/search-facet-queries-groups.png) The `pageSize` property allows you to define the number of results to display. Users will see `Show more` or `Show less` buttons as appropriate for the result set. The default page size of 5 will be used if you set the value to 0 or omit it entirely. -![Facet Queries](../docassets/images/search-facet-queries.png) +![Facet Queries](../../docassets/images/search-facet-queries.png) +### Facet Intervals + +These provide custom categories based on admin defined ranges inside `intervals`. +You can specify exactly what you want for each interval in the config file and you can +use overlapping ranges if necessary. + +#### FacetIntervals Properties + +| Name | Type | Description | +| ---- | ---- | ----------- | +| intervals | array | Specifies the fields to facet by interval. | +| expanded | boolean | Toggles expanded state of the facet intervals. | + +Note: the `sets` parameter from the Search API (which sets the intervals for all fields) +is not yet supported. + +```json +{ + "search": { + "facetIntervals":{ + "expanded": true, + "intervals":[ + { + "label":"TheCreated", + "field":"cm:created", + "sets":[ + { "label":"lastYear", "start":"2017", "end":"2018", "endInclusive":false }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlier", "start":"*", "end":"2017", "endInclusive":false } + ] + }, + { + "label":"TheModified", + "field":"cm:modified", + "sets":[ + { "label":"2016", "start":"2017", "end":"2018", "endInclusive":false }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlierThan2017", "start":"*", "end":"2017", "endInclusive":false } + ] + } + ] + } + } +} +``` + +You can specify a value for the `mincount` property inside each `intervals` item to set the minimum count required for a facet interval to be displayed. By default, only the intervals that have 1 or more response entries are displayed at runtime. +Check the [schema.json](https://github.com/Alfresco/alfresco-ng2-components/blob/master/lib/core/app-config/schema.json) file +for further details about the structure and properties of `intervals` that you can set inside the configuration file. + +Each defined `intervals` item is collected into its own collapsible category identified uniquely +by its `label`. The code snippet just above will result in the following display of facet intervals: + +![Facet Intervals](../../docassets/images/search-facet-intervals.png) + +### Highlight + +You can configure highlighting using the `search` entry in the `app.config.json` file. +An example query for search highlighting could look like this: + +```json +{ + "search": { + "highlight": { + "prefix": "¿", + "postfix": "?", + "mergeContiguous": true, + "fields": [ + { + "field": "cm:title" + }, + { + "field": "description", + "prefix": "(", + "postfix": ")" + } + + ] + } + } +} + +``` + +The example above changes the highlighting prefix and postfix from the default to '¿?' for all +fields except the "description" field, which uses '()' instead. The highlight information will +then be added in each node entry response. An example partial response is shown below: + +```json +"entry": { + "createdAt": "2016-10-12T15:24:31.202+0000", + "isFolder": true, + "search": { + "score": 1, + "highlight": [ + { + "field": "cm:title", + "snippets": [ + "Customized ¿Workflow? Process Definitions" + ] + }, + { + "field": "description", + "snippets": [ + "Customized (Workflow) Process Definitions" + ] + } + ] + }, + ``` ## See also -- [Search Query Builder service](search-query-builder.service.md) +- [Search Query Builder service](../services/search-query-builder.service.md) - [Search Chip List Component](search-chip-list.component.md) - [Search Sorting Picker Component](search-sorting-picker.component.md) -- [`SearchWidget`](../../lib/content-services/search/search-widget.interface.ts) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search slider component](../content-services/search-slider.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search Widget Interface](../interfaces/search-widget.interface.md) +- [Search check list component](search-check-list.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search slider component](search-slider.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/search-number-range.component.md b/docs/content-services/components/search-number-range.component.md similarity index 62% rename from docs/content-services/search-number-range.component.md rename to docs/content-services/components/search-number-range.component.md index 67855499d9..7353dfd39a 100644 --- a/docs/content-services/search-number-range.component.md +++ b/docs/content-services/components/search-number-range.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-11 --- -# [Search number range component](../../lib/content-services/search/components/search-number-range/search-number-range.component.ts "Defined in search-number-range.component.ts") +# [Search number range component](../../../lib/content-services/search/components/search-number-range/search-number-range.component.ts "Defined in search-number-range.component.ts") -Implements a number range widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a number range widget for the [Search Filter component](search-filter.component.md). -![Number Range Widget](../docassets/images/search-number-range.png) +![Number Range Widget](../../docassets/images/search-number-range.png) ## Basic usage @@ -44,7 +44,7 @@ Implements a number range widget for the [Search Filter component](../content-se ## Details This component lets the user specify a range between two predefined numbers based on the -particular `field`. See the [Search filter component](../content-services/search-filter.component.md) for full details of how to use widgets +particular `field`. See the [Search filter component](search-filter.component.md) for full details of how to use widgets in a search query. #### Range query format @@ -70,10 +70,10 @@ cm:content.size:[0 TO 100] ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search slider component](../content-services/search-slider.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search filter component](search-filter.component.md) +- [Search check list component](search-check-list.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search slider component](search-slider.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/search-radio.component.md b/docs/content-services/components/search-radio.component.md similarity index 62% rename from docs/content-services/search-radio.component.md rename to docs/content-services/components/search-radio.component.md index e6ba5f6f90..c15d675d0b 100644 --- a/docs/content-services/search-radio.component.md +++ b/docs/content-services/components/search-radio.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-08-10 --- -# [Search radio component](../../lib/content-services/search/components/search-radio/search-radio.component.ts "Defined in search-radio.component.ts") +# [Search radio component](../../../lib/content-services/search/components/search-radio/search-radio.component.ts "Defined in search-radio.component.ts") -Implements a radio button list widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a radio button list widget for the [Search Filter component](search-filter.component.md). -![Radio Widget screenshot](../docassets/images/search-radio.png) +![Radio Widget screenshot](../../docassets/images/search-radio.png) ## Basic usage @@ -50,8 +50,8 @@ Implements a radio button list widget for the [Search Filter component](../conte This component displays a list of radio buttons, each of which toggles a particular query fragment in the search. This behaviour is very similar to that of the -[Search check list component](../content-services/search-check-list.component.md) except only one item at a time can be selected. See the -[Search filter component](../content-services/search-filter.component.md) for full details of how to use the widgets in a search query. +[Search check list component](search-check-list.component.md) except only one item at a time can be selected. See the +[Search filter component](search-filter.component.md) for full details of how to use the widgets in a search query. The component can be set to split a long list of buttons into separate pages using the `pageSize` value as the number of buttons to show per page (default is 5). @@ -60,9 +60,9 @@ buttons as appropriate. ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search slider component](../content-services/search-slider.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search filter component](search-filter.component.md) +- [Search check list component](search-check-list.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search slider component](search-slider.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/search-slider.component.md b/docs/content-services/components/search-slider.component.md similarity index 70% rename from docs/content-services/search-slider.component.md rename to docs/content-services/components/search-slider.component.md index a46d056597..a30ba87c63 100644 --- a/docs/content-services/search-slider.component.md +++ b/docs/content-services/components/search-slider.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-11 --- -# [Search slider component](../../lib/content-services/search/components/search-slider/search-slider.component.ts "Defined in search-slider.component.ts") +# [Search slider component](../../../lib/content-services/search/components/search-slider/search-slider.component.ts "Defined in search-slider.component.ts") -Implements a numeric slider widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a numeric slider widget for the [Search Filter component](search-filter.component.md). -![Slider Widget](../docassets/images/search-slider.png) +![Slider Widget](../../docassets/images/search-slider.png) ## Basic usage @@ -50,7 +50,7 @@ Implements a numeric slider widget for the [Search Filter component](../content- ## Details This component lets the user select from a range between two predefined numbers based on the -particular `field`. See the [Search filter component](../content-services/search-filter.component.md) for full +particular `field`. See the [Search filter component](search-filter.component.md) for full details of how to use widgets in a search query. ### Resetting the slider value @@ -67,9 +67,9 @@ or zero and the corresponsing query fragment is removed from the query. ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search text component](../content-services/search-text.component.md) +- [Search filter component](search-filter.component.md) +- [Search check list component](search-check-list.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search text component](search-text.component.md) diff --git a/docs/content-services/search-sorting-picker.component.md b/docs/content-services/components/search-sorting-picker.component.md similarity index 59% rename from docs/content-services/search-sorting-picker.component.md rename to docs/content-services/components/search-sorting-picker.component.md index 345b4ab484..d86b36fa1c 100644 --- a/docs/content-services/search-sorting-picker.component.md +++ b/docs/content-services/components/search-sorting-picker.component.md @@ -4,7 +4,7 @@ Added: v2.3.0 Status: Active --- -# [Search Sorting Picker Component](../../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts "Defined in search-sorting-picker.component.ts") +# [Search Sorting Picker Component](../../../lib/content-services/search/components/search-sorting-picker/search-sorting-picker.component.ts "Defined in search-sorting-picker.component.ts") Provides an ability to select one of the predefined sorting definitions for search results: diff --git a/docs/content-services/search-text.component.md b/docs/content-services/components/search-text.component.md similarity index 58% rename from docs/content-services/search-text.component.md rename to docs/content-services/components/search-text.component.md index c21282d3a8..5048808472 100644 --- a/docs/content-services/search-text.component.md +++ b/docs/content-services/components/search-text.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-11 --- -# [Search text component](../../lib/content-services/search/components/search-text/search-text.component.ts "Defined in search-text.component.ts") +# [Search text component](../../../lib/content-services/search/components/search-text/search-text.component.ts "Defined in search-text.component.ts") -Implements a text input widget for the [Search Filter component](../content-services/search-filter.component.md). +Implements a text input widget for the [Search Filter component](search-filter.component.md). -![Text Widget](../docassets/images/search-text.png) +![Text Widget](../../docassets/images/search-text.png) ## Basic usage @@ -47,14 +47,14 @@ Implements a text input widget for the [Search Filter component](../content-serv ## Details This component lets the user add a text value to search for in the specified -`field`. See the [Search filter component](../content-services/search-filter.component.md) for full +`field`. See the [Search filter component](search-filter.component.md) for full details of how to use widgets in a search query. ## See also -- [Search filter component](../content-services/search-filter.component.md) -- [Search check list component](../content-services/search-check-list.component.md) -- [Search date range component](../content-services/search-date-range.component.md) -- [Search number range component](../content-services/search-number-range.component.md) -- [Search radio component](../content-services/search-radio.component.md) -- [Search slider component](../content-services/search-slider.component.md) +- [Search filter component](search-filter.component.md) +- [Search check list component](search-check-list.component.md) +- [Search date range component](search-date-range.component.md) +- [Search number range component](search-number-range.component.md) +- [Search radio component](search-radio.component.md) +- [Search slider component](search-slider.component.md) diff --git a/docs/content-services/search.component.md b/docs/content-services/components/search.component.md similarity index 81% rename from docs/content-services/search.component.md rename to docs/content-services/components/search.component.md index cc0917f9e7..b2656a0141 100644 --- a/docs/content-services/search.component.md +++ b/docs/content-services/components/search.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Search component](../../lib/content-services/search/components/search.component.ts "Defined in search.component.ts") +# [Search component](../../../lib/content-services/search/components/search.component.ts "Defined in search.component.ts") Searches items for supplied search terms. @@ -47,7 +47,7 @@ Searches items for supplied search terms. | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| resultLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` | Emitted when search results have fully loaded. | +| resultLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` | Emitted when search results have fully loaded. | ## Details @@ -73,7 +73,7 @@ You can add a custom template to show the search results when once they are load The results are provided via the [$implicit variable of angular2](https://angular.io/api/common/NgTemplateOutlet) and can be accessed via the sugar syntax 'let-yourChosenName'. The example above will give results like the following: -![adf-search-control](../docassets/images/search-component-simple-template.png) +![adf-search-control](../../docassets/images/search-component-simple-template.png) However, you can use a more complex template if necessary: @@ -121,11 +121,11 @@ However, you can use a more complex template if necessary: -![adf-search-control](../docassets/images/search-component-complex-template.png) +![adf-search-control](../../docassets/images/search-component-complex-template.png) ### Attach an input field to the search -You can also attach an input field to the [search component](../content-services/search.component.md) via the `searchAutocomplete` property. +You can also attach an input field to the [search component](search.component.md) via the `searchAutocomplete` property. Export the search panel instance into a local template variable and bind that variable to the input's `searchAutocomplete` property. The example below demonstrates this with an instance called "search": @@ -153,12 +153,12 @@ By doing this, you can get the results as the user types into the input text. You can get finer control over the parameters of a search by defining them in a custom [QueryBody](https://github.com/Alfresco/alfresco-js-api/blob/1.6.0/src/alfresco-search-rest-api/docs/QueryBody.md) object. The recommended way to do this is with a custom implementation of the -[Search Configuration interface](../core/search-configuration.interface.md). The ADF source provides a standard implementation of this -interface, [`SearchConfigurationService`](../core/search-configuration.service.md) that you can use as a base to adapt to your needs. See the -[Search Configuration interface](../core/search-configuration.interface.md) page for full details of how to +[Search Configuration interface](../../core/interfaces/search-configuration.interface.md). The ADF source provides a standard implementation of this +interface, [`SearchConfigurationService`](../../core/services/search-configuration.service.md) that you can use as a base to adapt to your needs. See the +[Search Configuration interface](../../core/interfaces/search-configuration.interface.md) page for full details of how to customize your search. ## See Also -- [Search configuration interface](../core/search-configuration.interface.md) -- [Search configuration service](../core/search-configuration.service.md) +- [Search configuration interface](../../core/interfaces/search-configuration.interface.md) +- [Search configuration service](../../core/services/search-configuration.service.md) diff --git a/docs/content-services/sites-dropdown.component.md b/docs/content-services/components/sites-dropdown.component.md similarity index 88% rename from docs/content-services/sites-dropdown.component.md rename to docs/content-services/components/sites-dropdown.component.md index c97fd0682c..e779b5a08f 100644 --- a/docs/content-services/sites-dropdown.component.md +++ b/docs/content-services/components/sites-dropdown.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Sites Dropdown component](../../lib/content-services/site-dropdown/sites-dropdown.component.ts "Defined in sites-dropdown.component.ts") +# [Sites Dropdown component](../../../lib/content-services/site-dropdown/sites-dropdown.component.ts "Defined in sites-dropdown.component.ts") Displays a dropdown menu to show and interact with the sites of the current user. -![Dropdown sites](../docassets/images/document-list-dropdown-list.png) +![Dropdown sites](../../docassets/images/document-list-dropdown-list.png) ## Basic Usage diff --git a/docs/content-services/tag-actions.component.md b/docs/content-services/components/tag-actions.component.md similarity index 82% rename from docs/content-services/tag-actions.component.md rename to docs/content-services/components/tag-actions.component.md index 6cc96d3ac8..a49364c06b 100644 --- a/docs/content-services/tag-actions.component.md +++ b/docs/content-services/components/tag-actions.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Tag Node Actions List component](../../lib/content-services/tag/tag-actions.component.ts "Defined in tag-actions.component.ts") +# [Tag Node Actions List component](../../../lib/content-services/tag/tag-actions.component.ts "Defined in tag-actions.component.ts") Shows available actions for tags. -![Custom columns](../docassets/images/tag3.png) +![Custom columns](../../docassets/images/tag3.png) ## Basic Usage diff --git a/docs/content-services/tag-list.component.md b/docs/content-services/components/tag-list.component.md similarity index 61% rename from docs/content-services/tag-list.component.md rename to docs/content-services/components/tag-list.component.md index 8fdd698818..74cee2593d 100644 --- a/docs/content-services/tag-list.component.md +++ b/docs/content-services/components/tag-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Tag List component](../../lib/content-services/tag/tag-list.component.ts "Defined in tag-list.component.ts") +# [Tag List component](../../../lib/content-services/tag/tag-list.component.ts "Defined in tag-list.component.ts") Shows tags for an item. -![Custom columns](../docassets/images/tag2.png) +![Custom columns](../../docassets/images/tag2.png) ## Class members @@ -21,4 +21,4 @@ Shows tags for an item. ## See Also -- [Tag service](tag.service.md) +- [Tag service](../services/tag.service.md) diff --git a/docs/content-services/tag-node-list.component.md b/docs/content-services/components/tag-node-list.component.md similarity index 77% rename from docs/content-services/tag-node-list.component.md rename to docs/content-services/components/tag-node-list.component.md index 6c52c06a14..9459ffd737 100644 --- a/docs/content-services/tag-node-list.component.md +++ b/docs/content-services/components/tag-node-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Tag Node List component](../../lib/content-services/tag/tag-node-list.component.ts "Defined in tag-node-list.component.ts") +# [Tag Node List component](../../../lib/content-services/tag/tag-node-list.component.ts "Defined in tag-node-list.component.ts") Shows tags for a node. -![Custom columns](../docassets/images/tag1.png) +![Custom columns](../../docassets/images/tag1.png) ## Basic Usage diff --git a/docs/content-services/tree-view.component.md b/docs/content-services/components/tree-view.component.md similarity index 82% rename from docs/content-services/tree-view.component.md rename to docs/content-services/components/tree-view.component.md index 246a4d5b0f..ed1ca79d87 100644 --- a/docs/content-services/tree-view.component.md +++ b/docs/content-services/components/tree-view.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Tree View component](../../lib/content-services/tree-view/components/tree-view.component.ts "Defined in tree-view.component.ts") +# [Tree View component](../../../lib/content-services/tree-view/components/tree-view.component.ts "Defined in tree-view.component.ts") Shows the folder and subfolders of a node as a tree view. -![TreeView component screenshot](../docassets/images/tree-view.png) +![TreeView component screenshot](../../docassets/images/tree-view.png) ## Basic Usage diff --git a/docs/content-services/upload-button.component.md b/docs/content-services/components/upload-button.component.md similarity index 81% rename from docs/content-services/upload-button.component.md rename to docs/content-services/components/upload-button.component.md index 2f6216245a..6924c28168 100644 --- a/docs/content-services/upload-button.component.md +++ b/docs/content-services/components/upload-button.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Upload Button Component](../../lib/content-services/upload/components/upload-button.component.ts "Defined in upload-button.component.ts") +# [Upload Button Component](../../../lib/content-services/upload/components/upload-button.component.ts "Defined in upload-button.component.ts") Activates a file upload. @@ -46,9 +46,9 @@ Activates a file upload. | Name | Type | Description | | ---- | ---- | ----------- | -| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | +| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| permissionEvent | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PermissionModel`](../../lib/content-services/document-list/models/permissions.model.ts)`>` | Emitted when create permission is missing. | +| permissionEvent | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PermissionModel`](../../../lib/content-services/document-list/models/permissions.model.ts)`>` | Emitted when create permission is missing. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the file is uploaded successfully. | ## Details @@ -58,7 +58,7 @@ Activates a file upload. You can show a notification error when the user doesn't have the right permission to perform the action. The component emits a `permissionEvent` when the user does not have delete permission. You can subscribe to this event from your component and use the -[Notification service](../core/notification.service.md) to show a message. +[Notification service](../../core/services/notification.service.md) to show a message. ```html ` to display as the drag/drop target: @@ -74,7 +74,7 @@ as the drag/drop target: | Name | Type | Description | | ---- | ---- | ----------- | -| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | +| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the file is uploaded successfully. | @@ -84,9 +84,9 @@ as the drag/drop target: You can intercept the upload process using the `beginUpload` event. -The event has a type of [`UploadFilesEvent`](../../lib/content-services/upload/components/upload-files.event.ts) and provides the following APIs: +The event has a type of [`UploadFilesEvent`](../../../lib/content-services/upload/components/upload-files.event.ts) and provides the following APIs: -- **files**: accesses the [`FileInfo`](../../lib/core/utils/file-utils.ts) objects that are prepared for the upload +- **files**: accesses the [`FileInfo`](../../../lib/core/utils/file-utils.ts) objects that are prepared for the upload - **pauseUpload**: pauses the upload and performs additional tasks, like showing the confirmation dialog - **resumeUpload**: resumes the upload process @@ -138,6 +138,6 @@ This could be either a selection of 2 or more files, or a folder with multiple e ## See also -- [File uploading dialog component](../content-services/file-uploading-dialog.component.md) -- [Upload button component](../content-services/upload-button.component.md) -- [File upload error pipe](../content-services/file-upload-error.pipe.md) +- [File uploading dialog component](file-uploading-dialog.component.md) +- [Upload button component](upload-button.component.md) +- [File upload error pipe](../pipes/file-upload-error.pipe.md) diff --git a/docs/content-services/upload-version-button.component.md b/docs/content-services/components/upload-version-button.component.md similarity index 82% rename from docs/content-services/upload-version-button.component.md rename to docs/content-services/components/upload-version-button.component.md index e589cd11d6..bb8df4dcf0 100644 --- a/docs/content-services/upload-version-button.component.md +++ b/docs/content-services/components/upload-version-button.component.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2018-03-23 --- -# [Upload Version Button Component (Workaround)](../../lib/content-services/upload/components/upload-version-button.component.ts "Defined in upload-version-button.component.ts") +# [Upload Version Button Component (Workaround)](../../../lib/content-services/upload/components/upload-version-button.component.ts "Defined in upload-version-button.component.ts") Activates a file version upload. @@ -49,9 +49,9 @@ to enrich the features and decrease the restrictions currently applied to node v | Name | Type | Description | | ---- | ---- | ----------- | -| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | +| beginUpload | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UploadFilesEvent`](../../../lib/content-services/upload/components/upload-files.event.ts)`>` | Emitted when the upload begins. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| permissionEvent | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PermissionModel`](../../lib/content-services/document-list/models/permissions.model.ts)`>` | Emitted when create permission is missing. | +| permissionEvent | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PermissionModel`](../../../lib/content-services/document-list/models/permissions.model.ts)`>` | Emitted when create permission is missing. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the file is uploaded successfully. | ## Details @@ -59,7 +59,7 @@ to enrich the features and decrease the restrictions currently applied to node v This component extends the [Upload Button component](upload-button.component.md). The properties and events are the same except for the `node` property that specifies the node to be versioned (this is a _required_ input parameter). However, some properties don't make -sense when applied to the [Upload Version Button component,](../content-services/upload-version-button.component.md) so they are simply ignored. +sense when applied to the [Upload Version Button component](upload-version-button.component.md) so they are simply ignored. ## See also diff --git a/docs/content-services/version-list.component.md b/docs/content-services/components/version-list.component.md similarity index 60% rename from docs/content-services/version-list.component.md rename to docs/content-services/components/version-list.component.md index 4334a8ee55..2266bea97c 100644 --- a/docs/content-services/version-list.component.md +++ b/docs/content-services/components/version-list.component.md @@ -5,9 +5,9 @@ Status: Experimental Last reviewed: 2019-01-16 --- -# [Version List component](../../lib/content-services/version-manager/version-list.component.ts "Defined in version-list.component.ts") +# [Version List component](../../../lib/content-services/version-manager/version-list.component.ts "Defined in version-list.component.ts") -Displays the version history of a node in a [Version Manager component](../content-services/version-manager.component.md). +Displays the version history of a node in a [Version Manager component](version-manager.component.md). ### Basic Usage @@ -22,7 +22,7 @@ Displays the version history of a node in a [Version Manager component](../conte | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | allowDownload | `boolean` | true | Enable/disable downloading a version of the current node. | -| node | `Node` | | The target node. | +| node | [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) | | The target node. | | showActions | `boolean` | true | Toggles showing/hiding of version actions | | showComments | `boolean` | true | Toggles showing/hiding of comments | @@ -30,12 +30,12 @@ Displays the version history of a node in a [Version Manager component](../conte | Name | Type | Description | | ---- | ---- | ----------- | -| deleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a version is deleted | -| restored | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a version is restored | +| deleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` | Emitted when a version is deleted | +| restored | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` | Emitted when a version is restored | ## Details -This component is used by the [Version Manager component](../content-services/version-manager.component.md) to +This component is used by the [Version Manager component](version-manager.component.md) to load and displays the version history of a node. If you want show readonly version list you set this component with showActions false: diff --git a/docs/content-services/version-manager.component.md b/docs/content-services/components/version-manager.component.md similarity index 89% rename from docs/content-services/version-manager.component.md rename to docs/content-services/components/version-manager.component.md index d4ea21f6d4..a59ac7758f 100644 --- a/docs/content-services/version-manager.component.md +++ b/docs/content-services/components/version-manager.component.md @@ -5,11 +5,11 @@ Status: Experimental Last reviewed: 2019-01-16 --- -# [Version Manager Component](../../lib/content-services/version-manager/version-manager.component.ts "Defined in version-manager.component.ts") +# [Version Manager Component](../../../lib/content-services/version-manager/version-manager.component.ts "Defined in version-manager.component.ts") Displays the version history of a node with the ability to upload a new version. -![Version Manager](../docassets/images/version-manager.png) +![Version Manager](../../docassets/images/version-manager.png) `This component is still in experimental phase. It has several limitations which will be resolved soon.` diff --git a/docs/content-services/webscript.component.md b/docs/content-services/components/webscript.component.md similarity index 85% rename from docs/content-services/webscript.component.md rename to docs/content-services/components/webscript.component.md index 76833474ed..6209a69b4e 100644 --- a/docs/content-services/webscript.component.md +++ b/docs/content-services/components/webscript.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Webscript component](../../lib/content-services/webscript/webscript.component.ts "Defined in webscript.component.ts") +# [Webscript component](../../../lib/content-services/webscript/webscript.component.ts "Defined in webscript.component.ts") Provides access to Webscript features. @@ -36,7 +36,7 @@ Provides access to Webscript features. Another example: -**[app.component](../../demo-shell/src/app/app.component.ts).html** +**app.component.html** ```html ``` -**[app.component](../../demo-shell/src/app/app.component.ts).ts** +**app.component.ts** ```ts export class AppComponent { @@ -81,7 +81,7 @@ export class AppComponent { ### Webscript View HTML example -This sample demonstrates how to implement a [Webscript component](../content-services/webscript.component.md) that renders the HTML contents that come from a webscript +This sample demonstrates how to implement a [Webscript component](webscript.component.md) that renders the HTML contents that come from a webscript This sample Web Scripts reside in your Alfresco Server. You can access the folder webscript here: `http://localhost:8080/alfresco/service/sample/folder/Company%20Home` @@ -96,11 +96,11 @@ This sample Web Scripts reside in your Alfresco Server. You can access the folde ``` -![Custom columns](../docassets/images/HTML.png) +![Custom columns](../../docassets/images/HTML.png) ### Webscript View DATATABLE example -This sample demonstrates how to implement a [Webscript component](../content-services/webscript.component.md) that renders the JSON contents that come from a webscript +This sample demonstrates how to implement a [Webscript component](webscript.component.md) that renders the JSON contents that come from a webscript `http://localhost:8080/alfresco/service/sample/folder/DATATABLE` @@ -115,7 +115,7 @@ This sample demonstrates how to implement a [Webscript component](../content-ser ``` If you want to show the result from a webscript inside a -[datatable component](../core/datatable.component.md) +[datatable component](../../core/components/datatable.component.md) you have to return the data structure below (subdivided into data and schema) from the GET method of the webscript: @@ -155,11 +155,11 @@ data: [ This will render the following table: -![Custom columns](../docassets/images/datatable.png) +![Custom columns](../../docassets/images/datatable.png) ### Webscript View JSON example -This sample demonstrates how to implement a [Webscript component](../content-services/webscript.component.md) that renders the JSON contents that come from a webscript. +This sample demonstrates how to implement a [Webscript component](webscript.component.md) that renders the JSON contents that come from a webscript. This sample webscript resides in your Alfresco Server. You can access the folder webscript here: `http://localhost:8080/alfresco/service/sample/folder/JSON%EXAMPLE` diff --git a/docs/content-services/content-metadata.component.md b/docs/content-services/content-metadata.component.md deleted file mode 100644 index c5134b652a..0000000000 --- a/docs/content-services/content-metadata.component.md +++ /dev/null @@ -1,220 +0,0 @@ ---- -Title: Content Metadata Card component -Added: v2.1.0 -Status: Active -Last reviewed: 2019-01-16 ---- - -# [Content Metadata Card component](../../lib/content-services/content-metadata/components/content-metadata/content-metadata.component.ts "Defined in content-metadata.component.ts") - -Displays and edits metadata related to a node. - -![Content metadata screenshot](../docassets/images/ContentMetadata.png) - -## Basic Usage - -```html - - -``` - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| displayDefaultProperties | `boolean` | true | Toggles whether the metadata properties should be shown | -| displayEmpty | `boolean` | false | Toggles whether to display empty values in the card view | -| editable | `boolean` | false | Toggles whether the edit button should be shown | -| expanded | `boolean` | false | Toggles between expanded (ie, full information) and collapsed (ie, reduced information) in the display | -| multi | `boolean` | false | The multi parameter of the underlying material expansion panel, set to true to allow multi accordion to be expanded at the same time | -| node | [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) | | (required) The node entity to fetch metadata about | -| preset | `string` | | Name of the metadata preset, which defines aspects and their properties | - -## Details - -The component shows metadata related to a given node. It uses the -[Card View component](../core/card-view.component.md) to render the properties of metadata aspects. -The different aspects and their properties to be shown can be configured as application config -presets (see below). By default the component only shows the basic properties of the node. -The user can click on the pencil icon at the bottom of the component to edit the metadata -properties. - -### Application config presets - -You can define different presets for the metadata component or override the default presets in -the `app.config.json` file. The **default** preset is "\*" if not set, meaning the component -will display every aspect and property of a node without filtering. - -You can define as many extra presets as you need for your components. - -The example configurations below show the options in detail. - -#### Indifferent config - -The default configuration behaves like the following: - -```json -... -"content-metadata": { - "presets": { - "default": "*" - } -} -... -``` - -#### Aspect oriented config - -With this type of configuration you can "whitelist" aspects and properties for a preset, but everything will be grouped by aspects and there is no further way to group properties. Use a -[layout oriented configuration](#layout-oriented-config) if you want to define your own -custom groups. - -The default configuration shows every aspect but you can restrict it to just a small selection -of aspects by "whitelisting" the ones you want in the `default` section. In the example below, -just the `exif:exif` and `custom:aspect` aspects are whitelisted: - -```json -... -"content-metadata": { - "presets": { - "default": { - "custom:aspect": "*", - "exif:exif": "*" - } - } -} -... -``` - -You can further restrict the whitelist to specific properties of one or more aspects by using -an array of property names in place of the "\*" filter: - -```json -... -"content-metadata": { - "presets": { - "default": { - "custom:aspect": "*", - "exif:exif": [ "exif:pixelXDimension", "exif:pixelYDimension"] - } - } -} -... -``` - -A final example shows the same process applied to a custom preset called "kitten-images": - -```json -... -"content-metadata": { - "presets": { - "default": "*", - "kitten-images": { - "custom:aspect": "*", - "exif:exif": [ "exif:pixelXDimension", "exif:pixelYDimension"] - } - } -} -... -``` - -### Layout oriented config - -You can also go beyond the aspect oriented configuration if you need to configure the groups and properties in a more detailed way. With this type of configuration any property of any aspect/type -can be "cherry picked" and grouped into an accordion drawer, along with a translatable title -defined in the preset configuration. - -#### Basic elements - -The following config will produce one accordion group named "TRANSLATABLE_TITLE_FOR_GROUP_1", -with all the properties from `custom:aspect` followed by the two properties (`exif:pixelXDimension` -and `exif:pixelYDimension`) from the `exif:exif` aspect and then one property (`custom:myPropertyName`) from `custom:type`: - -```json -... -"content-metadata": { - "presets": { - "kitten-images": [{ - "title": "TRANSLATABLE_TITLE_FOR_GROUP_1", - "items": [ - { "aspect": "custom:aspect", "properties": "*" }, - { "aspect": "exif:exif", "properties": [ "exif:pixelXDimension", "exif:pixelYDimension"] }, - { "type": "custom:type", "properties": [ "custom:myPropertyName" ] }, - ] - }] - } -} -... -``` - -#### More complex example - -A more complex config is shown in the example below: - -```json - "content-metadata": { - "presets": { - "kittens": [ - { - "title": "GROUP-TITLE1-TRANSLATION-KEY", - "items": [ - { - "aspect": "exif:exif", - "properties": "*" - }, - { - "aspect": "kitten:vet-records", - "properties": [ "kitten:custom1", "kitten:custom3" ] - }, - { - "aspect": "owner:parameters", - "properties": [ "owner:name" ] - }, - { - "type": "kitten:kitten", - "properties": [ "kitten:name", "kitten:color" ] - } - ] - }, - { - "title": "GROUP-TITLE2-TRANSLATION-KEY", - "items": [ - { - "aspect": "kitten:food", - "properties": [ "kitten:favourite-food", "kitten:recommended-food" ] - } - ] - } - ] - } -``` - -The result of this config would be two accordion groups with the following properties: - -| GROUP-TITLE1-TRANSLATION-KEY | -| ---------------------------- | -| exif:param1 | -| exif:param2 | -| ... | -| exif:paramN | -| kitten:custom1 | -| kitten:custom3 | -| owner:name | -| kitten:name | -| kitten:color | - -| GROUP-TITLE2-TRANSLATION-KEY | -| ---------------------------- | -| kitten:favourite-food | -| kitten:recommended-food | - -## What happens when there is a whitelisted aspect in the config but the given node doesn't relate to that aspect - -Nothing - since this aspect is not related to the node, it will simply be ignored and not -displayed. The aspects to be displayed are calculated as an intersection of the preset's aspects and the aspects related to the node. diff --git a/docs/content-services/custom-resources.service.md b/docs/content-services/custom-resources.service.md deleted file mode 100644 index ccba6196bb..0000000000 --- a/docs/content-services/custom-resources.service.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -Title: Custom Resources service -Added: v2.3.0 -Status: Active -Last reviewed: 2018-11-16 ---- - -# [Custom Resources service](../../lib/content-services/document-list/services/custom-resources.service.ts "Defined in custom-resources.service.ts") - -Manages Document List information that is specific to a user. - -## Class members - -### Methods - -- **getCorrespondingNodeIds**(nodeId: `string`, pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts) = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Gets the contents of one of the well-known aliases in the form of node ID strings. - - _nodeId:_ `string` - ID of the target folder node - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of node IDs -- **getRecentFiles**(personId: `string`, pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets files recently accessed by a user. - - _personId:_ `string` - ID of the user - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of nodes for the recently used files -- **hasCorrespondingNodeIds**(nodeId: `string`): `boolean`
- Does the well-known alias have a corresponding node ID? - - _nodeId:_ `string` - Node to check - - **Returns** `boolean` - True if the alias has a corresponding node ID, false otherwise -- **isCustomSource**(folderId: `string`): `boolean`
- Is the folder ID one of the well-known aliases? - - _folderId:_ `string` - Folder ID name to check - - **Returns** `boolean` - True if the ID is a well-known name, false otherwise -- **isSupportedSource**(folderId: `string`): `boolean`
- Is the folder ID a "-my", "-root-", or "-shared-" alias? - - _folderId:_ `string` - Folder ID name to check - - **Returns** `boolean` - True if the ID is one of the supported sources, false otherwise -- **loadFavorites**(pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets favorite files for the current user. - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - _includeFields:_ `string[]` - List of data field names to include in the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of favorite files -- **loadFolderByNodeId**(nodeId: `string`, pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts), includeFields: `string[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets a folder's contents. - - _nodeId:_ `string` - ID of the target folder node - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - _includeFields:_ `string[]` - List of data field names to include in the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of items contained in the folder -- **loadMemberSites**(pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets sites that the current user is a member of. - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of sites -- **loadSharedLinks**(pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets shared links for the current user. - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - _includeFields:_ `string[]` - List of data field names to include in the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of shared links -- **loadSites**(pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
- Gets all sites in the repository. - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of sites -- **loadTrashcan**(pagination: [`PaginationModel`](../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`DeletedNodesPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/DeletedNodesPaging.md)`>`
- Gets all items currently in the trash. - - _pagination:_ [`PaginationModel`](../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results - - _includeFields:_ `string[]` - List of data field names to include in the results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`DeletedNodesPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/DeletedNodesPaging.md)`>` - List of deleted items - -## Details - -The `includeFields` parameter used by some of the methods lets you specify which data fields -you want in the result objects. See the -[Alfresco JSAPI](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SharedlinksApi.md#findSharedLinks) -for further details of the returned data and the available fields. - -## See also - -- [Document List component](document-list.component.md) diff --git a/docs/content-services/confirm.dialog.md b/docs/content-services/dialogs/confirm.dialog.md similarity index 85% rename from docs/content-services/confirm.dialog.md rename to docs/content-services/dialogs/confirm.dialog.md index 603fc7a14f..2e593e792a 100644 --- a/docs/content-services/confirm.dialog.md +++ b/docs/content-services/dialogs/confirm.dialog.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-22 --- -# [Confirm dialog component](../../lib/content-services/dialogs/confirm.dialog.ts "Defined in confirm.dialog.ts") +# [Confirm dialog component](../../../lib/content-services/dialogs/confirm.dialog.ts "Defined in confirm.dialog.ts") Requests a yes/no choice from the user. -![Confirm dialog](../docassets/images/ConfirmDialog.png) +![Confirm dialog](../../docassets/images/ConfirmDialog.png) ## Basic Usage diff --git a/docs/content-services/library.dialog.md b/docs/content-services/dialogs/library.dialog.md similarity index 80% rename from docs/content-services/library.dialog.md rename to docs/content-services/dialogs/library.dialog.md index 25ff5e7a83..0d21247c72 100644 --- a/docs/content-services/library.dialog.md +++ b/docs/content-services/dialogs/library.dialog.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-12-07 --- -# [Library dialog component](../../lib/content-services/dialogs/library/library.dialog.ts "Defined in library.dialog.ts") +# [Library dialog component](../../../lib/content-services/dialogs/library/library.dialog.ts "Defined in library.dialog.ts") Creates a new Content Services document library/site. -![Dropdown sites](../docassets/images/CreateLibraryDialog.png) +![Dropdown sites](../../docassets/images/CreateLibraryDialog.png) ## Basic Usage @@ -39,4 +39,4 @@ section of the Content Services documentation for more information. ## See also -- [Sites dropdown component](sites-dropdown.component.md) +- [Sites dropdown component](../components/sites-dropdown.component.md) diff --git a/docs/content-services/content-node-share.directive.md b/docs/content-services/directives/content-node-share.directive.md similarity index 80% rename from docs/content-services/content-node-share.directive.md rename to docs/content-services/directives/content-node-share.directive.md index e8869f2671..6e8cbea15a 100644 --- a/docs/content-services/content-node-share.directive.md +++ b/docs/content-services/directives/content-node-share.directive.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-09-13 --- -# [Node Public File Share Directive](../../lib/content-services/content-node-share/content-node-share.directive.ts "Defined in content-node-share.directive.ts") +# [Node Public File Share Directive](../../../lib/content-services/content-node-share/content-node-share.directive.ts "Defined in content-node-share.directive.ts") Creates and manages public shared links for files. -![adf-share](../docassets/images/share-directive.png) +![adf-share](../../docassets/images/share-directive.png) ## Basic Usage @@ -53,13 +53,13 @@ For example, if you set the input parameter as follows: ... } -...then the directive will ask the [Content service](../core/content.service.md) to generate +...then the directive will ask the [Content service](../../core/services/content.service.md) to generate a `sharedId` for the file. This will create a URL like the following: http://localhost:8080/myrouteForShareFile/NEW_GENERATED_SHAREID To use this, you will need to implement some code that gets the `NEW_GENERATED_SHAREID` with the router -and passes it to a [Viewer component](../core/viewer.component.md): +and passes it to a [Viewer component](../../core/components/viewer.component.md): ```html `string` - - _row:_ [`DataRow`](../../lib/core/datatable/data/data-row.model.ts) - Data that defines the row - - _column:_ [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) - Data that defines the column +- `type` **ImageResolver** = (row: [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts), column: [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts)) => `string` + - _row:_ [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) - Data that defines the row + - _column:_ [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) - Data that defines the column - **Returns** File path for the image ## Details An image resolver function selects an image file path for an item in -a [Document List Component](../content-services/document-list.component.md) +a [Document List Component](../components/document-list.component.md) or another component that uses the Document List (such as the -[Content Node Selector Panel Component](content-node-selector-panel.component.md)). You can supply your own image resolver +[Content Node Selector Panel Component](../components/content-node-selector-panel.component.md)). You can supply your own image resolver to manage the way folder/file icons and thumbnails are resolved (ie, which image is shown for which item). **Note:** Image resolvers are executed only for columns of the `image` type. -A typical image resolver implementation receives [`DataRow`](../../lib/core/datatable/data/data-row.model.ts) and [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) objects as parameters: +A typical image resolver implementation receives [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) and [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) objects as parameters: ```ts myImageResolver(row: DataRow, col: DataColumn): string { @@ -88,5 +88,5 @@ export class View1 { ## See also -- [Document List Component](../content-services/document-list.component.md) -- [Content Node Selector Panel Component](content-node-selector-panel.component.md) +- [Document List Component](../components/document-list.component.md) +- [Content Node Selector Panel Component](../components/content-node-selector-panel.component.md) diff --git a/docs/content-services/permissions-style.model.md b/docs/content-services/models/permissions-style.model.md similarity index 68% rename from docs/content-services/permissions-style.model.md rename to docs/content-services/models/permissions-style.model.md index db5c8f5d41..101128a0cc 100644 --- a/docs/content-services/permissions-style.model.md +++ b/docs/content-services/models/permissions-style.model.md @@ -2,9 +2,10 @@ Title: Permission Style model Added: v2.0.0 Status: Active +Last reviewed: 2019-02-13 --- -# [Permission Style model](../../lib/content-services/document-list/models/permissions-style.model.ts "Defined in permissions-style.model.ts") +# [Permission Style model](../../../lib/content-services/document-list/models/permissions-style.model.ts "Defined in permissions-style.model.ts") Sets custom CSS styles for rows of a Document List according to the item's permissions. @@ -12,8 +13,8 @@ Sets custom CSS styles for rows of a Document List according to the item's permi ### Properties -| Property | Type | Description | -| -------- | ---- | ----------- | +| [`Property`](../../../lib/content-services/content-metadata/interfaces/property.interface.ts) | Type | Description | +| --------------------------------------------------------------------------------------------- | ---- | ----------- | | isFile | boolean | Does this style apply to files? | | isFolder | boolean | Does this style apply to folders? | | permission | Permissions | An enum value defining the permissions that this style applies to (see below) | @@ -21,14 +22,14 @@ Sets custom CSS styles for rows of a Document List according to the item's permi ## Details -You can customize the style of a [Document List](document-list.component.md) row based on the user's +You can customize the style of a [Document List](../components/document-list.component.md) row based on the user's permissions for that item. The list has a `permissionsStyle` property containing an array of -[Permission Style model](../../lib/content-services/document-list/models/permissions-style.model.ts) objects. These objects associate a particular CSS style with a permission level +[Permission Style model](permissions-style.model.md) objects. These objects associate a particular CSS style with a permission level and can be applied separately to files and folders by setting `isFile` and `isFolder` appropriately. ### Permissions enum -The [Permissions](https://github.com/Alfresco/alfresco-ng2-components/blob/development/lib/core/models/allowable-operations.enum.ts) +The [Allowable Operations](https://github.com/Alfresco/alfresco-ng2-components/blob/development/lib/core/models/allowable-operations.enum.ts) enum contains all the valid permissions for which you can apply custom styles: **DELETE**, **UPDATE**, **CREATE**, **UPDATEPERMISSIONS**, **NOT_DELETE**, **NOT_UPDATE**, **NOT_CREATE**, **NOT_UPDATEPERMISSIONS**. @@ -74,4 +75,4 @@ adf-document-list ::ng-deep adf-datatable tr.document-list__disable { ## See also -- [Document list component](document-list.component.md) +- [Document list component](../components/document-list.component.md) diff --git a/docs/content-services/row-filter.model.md b/docs/content-services/models/row-filter.model.md similarity index 56% rename from docs/content-services/row-filter.model.md rename to docs/content-services/models/row-filter.model.md index ebd8f68067..9107ff37d5 100644 --- a/docs/content-services/row-filter.model.md +++ b/docs/content-services/models/row-filter.model.md @@ -5,28 +5,28 @@ Status: Active Last reviewed: 2019-02-08 --- -# [Row Filter Model](../../lib/content-services/document-list/data/row-filter.model.ts "Defined in row-filter.model.ts") +# [Row Filter Model](../../../lib/content-services/document-list/data/row-filter.model.ts "Defined in row-filter.model.ts") -Defines the Row Filter function used by the [Document List Component](../content-services/document-list.component.md). +Defines the Row Filter function used by the [Document List Component](../components/document-list.component.md). ## Definitions -- `type` **RowFilter** = (value: [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts), index: `number`, array: [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts)`[]`) => any - - _value:_ [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts) - Data that defines the row +- `type` **RowFilter** = (value: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts), index: `number`, array: [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts)`[]`) => any + - _value:_ [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts) - Data that defines the row - _index:_ `number` - Index of the row within the list - - _array:_ [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts)`[]` - The full set of rows for the list + - _array:_ [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts)`[]` - The full set of rows for the list - **Returns** True if the row should be shown, false otherwise ## Details -A row filter function selectively hides or shows rows from a [Document List Component](../content-services/document-list.component.md) +A row filter function selectively hides or shows rows from a [Document List Component](../components/document-list.component.md) or another component that uses the Document List (such as the -[Content Node Selector Panel Component](content-node-selector-panel.component.md)). +[Content Node Selector Panel Component](../components/content-node-selector-panel.component.md)). You can supply your own row filter to customize the behavior of the list. The function returns `true` if the row should be displayed or `false` if it should be hidden. -A typical row filter implementation receives at least a [`ShareDataRow`](../../lib/content-services/document-list/data/share-data-row.model.ts) object as a parameter: +A typical row filter implementation receives at least a [`ShareDataRow`](../../../lib/content-services/document-list/data/share-data-row.model.ts) object as a parameter: ```ts myFilter(row: ShareDataRow): boolean { @@ -72,5 +72,5 @@ export class View1 { ## See also -- [Document List Component](../content-services/document-list.component.md) -- [Content Node Selector Panel Component](content-node-selector-panel.component.md) +- [Document List Component](../components/document-list.component.md) +- [Content Node Selector Panel Component](../components/content-node-selector-panel.component.md) diff --git a/docs/content-services/file-upload-error.pipe.md b/docs/content-services/pipes/file-upload-error.pipe.md similarity index 59% rename from docs/content-services/file-upload-error.pipe.md rename to docs/content-services/pipes/file-upload-error.pipe.md index 6cf0f218b3..e9172735fa 100644 --- a/docs/content-services/file-upload-error.pipe.md +++ b/docs/content-services/pipes/file-upload-error.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-17 --- -# [File upload error pipe](../../lib/content-services/upload/pipes/file-upload-error.pipe.ts "Defined in file-upload-error.pipe.ts") +# [File upload error pipe](../../../lib/content-services/upload/pipes/file-upload-error.pipe.ts "Defined in file-upload-error.pipe.ts") Converts an upload error code to an error message. @@ -29,6 +29,6 @@ automatically translated to the user's chosen language. ## See also -- [File uploading dialog component](../content-services/file-uploading-dialog.component.md) -- [Upload drag area component](../content-services/upload-drag-area.component.md) -- [Upload button component](../content-services/upload-button.component.md) +- [File uploading dialog component](../components/file-uploading-dialog.component.md) +- [Upload drag area component](../components/upload-drag-area.component.md) +- [Upload button component](../components/upload-button.component.md) diff --git a/docs/content-services/rating.service.md b/docs/content-services/rating.service.md deleted file mode 100644 index 041dbc247f..0000000000 --- a/docs/content-services/rating.service.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -Title: Rating service -Added: v2.0.0 -Status: Active -Last reviewed: 2018-05-04 ---- - -# [Rating service](../../lib/content-services/social/services/rating.service.ts "Defined in rating.service.ts") - -Manages ratings for items in Content Services. - -## Class members - -### Methods - -- **deleteRating**(nodeId: `string`, ratingType: `any`): `any`
- Removes the current user's rating for a node. - - _nodeId:_ `string` - Target node - - _ratingType:_ `any` - Type of rating to remove (can be "likes" or "fiveStar") - - **Returns** `any` - Null response indicating that the operation is complete -- **getRating**(nodeId: `string`, ratingType: `any`): `any`
- Gets the current user's rating for a node. - - _nodeId:_ `string` - Node to get the rating from - - _ratingType:_ `any` - Type of rating (can be "likes" or "fiveStar") - - **Returns** `any` - The rating value -- **postRating**(nodeId: `string`, ratingType: `any`, vote: `any`): `any`
- Adds the current user's rating for a node. - - _nodeId:_ `string` - Target node for the rating - - _ratingType:_ `any` - Type of rating (can be "likes" or "fiveStar") - - _vote:_ `any` - Rating value (boolean for "likes", numeric 0..5 for "fiveStar") - - **Returns** `any` - Details about the rating, including the new value - -## Details - -The `ratingType` string currently has two possible options, "likes" -and "fiveStar". When the "likes" scheme is used, the result of -`getRating` and the `vote` parameter of `postRating` are boolean -values. When "fiveStar" is used, the value is an integer representing -the number of stars out of five. - -See the [Ratings API](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/RatingsApi.md) -in the Alfresco JS API for more information about the returned data and the -REST API that this service is based on. - -## See also - -- [Like component](like.component.md) -- [Rating component](rating.component.md) diff --git a/docs/content-services/search-chip-list.component.md b/docs/content-services/search-chip-list.component.md deleted file mode 100644 index 170c29c523..0000000000 --- a/docs/content-services/search-chip-list.component.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -Title: Search Chip List Component -Added: v2.3.0 -Status: Active -Last reviewed: 2018-09-14 ---- - -# [Search Chip List Component](../../lib/content-services/search/components/search-chip-list/search-chip-list.component.ts "Defined in search-chip-list.component.ts") - -Displays search criteria as a set of "chips". - -![Selected Facets](../docassets/images/selected-facets.png) - -## Basic usage - -```html - - -``` - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| searchFilter | [`SearchFilterComponent`](../content-services/search-filter.component.md) | | Search filter to supply the data for the chips. | diff --git a/docs/content-services/search-filter.service.md b/docs/content-services/search-filter.service.md deleted file mode 100644 index eae64bd569..0000000000 --- a/docs/content-services/search-filter.service.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -Title: Search filter service -Added: v2.4.0 -Status: Active -Last reviewed: 2018-06-12 ---- - -# [Search filter service](../../lib/content-services/search/components/search-filter/search-filter.service.ts "Defined in search-filter.service.ts") - -Registers widgets for use with the [Search Filter component](../content-services/search-filter.component.md). - -## Details - -This component keeps track of all widgets registered for use with the -[Search Filter component](../content-services/search-filter.component.md). All the built-in widgets are registered by default -but you should register any new custom widgets you create explicitly: - -```ts -import { MyComponent } from './my-component.ts' - -@Component({...}) -export class MyAppOrComponent { - - constructor(searchFilterService: SearchFilterService) { - searchFilterService.widgets['my-widget'] = MyComponent; - } - -} -``` - -See the [Search Widget](../../lib/content-services/search/search-widget.interface.ts) interface page for details about creating your own -custom search widgets. - -## See also - -- [`SearchWidget`](../../lib/content-services/search/search-widget.interface.ts) -- [Search Filter component](../content-services/search-filter.component.md) diff --git a/docs/content-services/search-query-builder.service.md b/docs/content-services/search-query-builder.service.md deleted file mode 100644 index 52bd34ce8d..0000000000 --- a/docs/content-services/search-query-builder.service.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -Title: Search Query Builder service -Added: v2.3.0 -Status: Active -Last reviewed: 2018-06-12 ---- - -# [Search Query Builder service](../../lib/content-services/search/search-query-builder.service.ts "Defined in search-query-builder.service.ts") - -Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. - -## Class members - -### Methods - -- **addFilterQuery**(query: `string`)
- Adds a filter query to the current query. - - _query:_ `string` - Query string to add -- **addUserFacetBucket**(field: [`FacetField`](../../lib/content-services/search/facet-field.interface.ts), bucket: [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts))
- Adds a facet bucket to a field. - - _field:_ [`FacetField`](../../lib/content-services/search/facet-field.interface.ts) - The target field - - _bucket:_ [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts) - Bucket to add -- **buildQuery**(): `QueryBody`
- Builds the current query. - - **Returns** `QueryBody` - The finished query -- **execute**()
- Builds and executes the current query. -- **getFacetField**(label: `string`): [`FacetField`](../../lib/content-services/search/facet-field.interface.ts)
- Gets a facet field by label. - - _label:_ `string` - Label of the facet field - - **Returns** [`FacetField`](../../lib/content-services/search/facet-field.interface.ts) - Facet field data -- **getFacetQuery**(label: `string`): [`FacetQuery`](../../lib/content-services/search/facet-query.interface.ts)
- Gets a facet query by label. - - _label:_ `string` - Label of the query - - **Returns** [`FacetQuery`](../../lib/content-services/search/facet-query.interface.ts) - Facet query data -- **getPrimarySorting**(): [`SearchSortingDefinition`](../../lib/content-services/search/search-sorting-definition.interface.ts)
- Gets the primary sorting definition. - - **Returns** [`SearchSortingDefinition`](../../lib/content-services/search/search-sorting-definition.interface.ts) - The primary sorting definition -- **getQueryGroup**(query: `any`): `any`
- Gets the query group. - - _query:_ `any` - Target query - - **Returns** `any` - Query group -- **getSortingOptions**(): [`SearchSortingDefinition`](../../lib/content-services/search/search-sorting-definition.interface.ts)`[]`
- Gets all pre-configured sorting options that users can choose from. - - **Returns** [`SearchSortingDefinition`](../../lib/content-services/search/search-sorting-definition.interface.ts)`[]` - Pre-configured sorting options -- **getUserFacetBuckets**(field: `string`): [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts)`[]`
- Gets the buckets currently added to a field - - _field:_ `string` - The target fields - - **Returns** [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts)`[]` - Bucket array -- **removeFilterQuery**(query: `string`)
- Removes an existing filter query. - - _query:_ `string` - The query to remove -- **removeUserFacetBucket**(field: [`FacetField`](../../lib/content-services/search/facet-field.interface.ts), bucket: [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts))
- Removes an existing bucket from a field. - - _field:_ [`FacetField`](../../lib/content-services/search/facet-field.interface.ts) - The target field - - _bucket:_ [`FacetFieldBucket`](../../lib/content-services/search/facet-field-bucket.interface.ts) - Bucket to remove -- **resetToDefaults**()
- Resets the query to the defaults specified in the app config. -- **update**()
- Builds the current query and triggers the `updated` event. - -## Details - -See the [Search filter component](search-filter.component.md) page for full details about the format of queries, -facet fields, and sorting options. - -The Query Builder is UI agnostic and does not rely on Angular components. -You can reuse it with multiple component implementations. - -You can use custom widgets to populate and edit the following parts of the resulting query: - -- categories -- query fragments that form a query expression -- include fields -- scope settings -- filter queries -- facet fields -- range queries - -```ts -constructor(queryBuilder: SearchQueryBuilderService) { - - queryBuilder.updated.subscribe(query => { - this.queryBuilder.execute(); - }); - - queryBuilder.executed.subscribe(data => { - this.onDataLoaded(data); - }); - -} -``` - -> **Note:** Since ADF 3.0.0, the query contains the `"facetFormat": "V2"` parameter so that all the responses have the same structure even if coming from search queries containing facetFields, facetQueries, grouped facetQueries or facetIntervals. - -## See also - -- [Search filter component](search-filter.component.md) -- [Search Widget interface](search-widget.interface.md) diff --git a/docs/content-services/content-node-dialog.service.md b/docs/content-services/services/content-node-dialog.service.md similarity index 95% rename from docs/content-services/content-node-dialog.service.md rename to docs/content-services/services/content-node-dialog.service.md index adb9d1d1c1..73c763d14d 100644 --- a/docs/content-services/content-node-dialog.service.md +++ b/docs/content-services/services/content-node-dialog.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Content Node Dialog service](../../lib/content-services/content-node-selector/content-node-dialog.service.ts "Defined in content-node-dialog.service.ts") +# [Content Node Dialog service](../../../lib/content-services/content-node-selector/content-node-dialog.service.ts "Defined in content-node-dialog.service.ts") Displays and manages dialogs for selecting content to open, copy or upload. @@ -85,5 +85,5 @@ dialog operation, say) or be set to one of the well-known names "-my-" , "-share ## See Also -- [Content node selector panel component](content-node-selector-panel.component.md) -- [Content node selector component](content-node-selector.component.md) +- [Content node selector panel component](../components/content-node-selector-panel.component.md) +- [Content node selector component](../components/content-node-selector.component.md) diff --git a/docs/content-services/services/custom-resources.service.md b/docs/content-services/services/custom-resources.service.md new file mode 100644 index 0000000000..a969fd6898 --- /dev/null +++ b/docs/content-services/services/custom-resources.service.md @@ -0,0 +1,82 @@ +--- +Title: Custom Resources service +Added: v2.3.0 +Status: Active +Last reviewed: 2018-11-16 +--- + +# [Custom Resources service](../../../lib/content-services/document-list/services/custom-resources.service.ts "Defined in custom-resources.service.ts") + +Manages Document List information that is specific to a user. + +## Class members + +### Methods + +- **getCorrespondingNodeIds**(nodeId: `string`, pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts) = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ Gets the contents of one of the well-known aliases in the form of node ID strings. + - _nodeId:_ `string` - ID of the target folder node + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of node IDs +- **getIdFromEntry**(node: `any`, nodeId: `string`): `string`
+ Chooses the correct ID for a node entry. + - _node:_ `any` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) object + - _nodeId:_ `string` - ID of the node object + - **Returns** `string` - ID value +- **getRecentFiles**(personId: `string`, pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
+ Gets files recently accessed by a user. + - _personId:_ `string` - ID of the user + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of nodes for the recently used files +- **hasCorrespondingNodeIds**(nodeId: `string`): `boolean`
+ Does the well-known alias have a corresponding node ID? + - _nodeId:_ `string` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to check + - **Returns** `boolean` - True if the alias has a corresponding node ID, false otherwise +- **isCustomSource**(folderId: `string`): `boolean`
+ Is the folder ID one of the well-known aliases? + - _folderId:_ `string` - Folder ID name to check + - **Returns** `boolean` - True if the ID is a well-known name, false otherwise +- **isSupportedSource**(folderId: `string`): `boolean`
+ Is the folder ID a "-my", "-root-", or "-shared-" alias? + - _folderId:_ `string` - Folder ID name to check + - **Returns** `boolean` - True if the ID is one of the supported sources, false otherwise +- **loadFavorites**(pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
+ Gets favorite files for the current user. + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - _includeFields:_ `string[]` - List of data field names to include in the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of favorite files +- **loadFolderByNodeId**(nodeId: `string`, pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): `any`
+ Gets a folder's contents. + - _nodeId:_ `string` - ID of the target folder node + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - _includeFields:_ `string[]` - List of data field names to include in the results + - **Returns** `any` - List of items contained in the folder +- **loadMemberSites**(pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteMemberPaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SiteMemberPaging.md)`>`
+ Gets sites that the current user is a member of. + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteMemberPaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SiteMemberPaging.md)`>` - List of sites +- **loadSharedLinks**(pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkPaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkPaging.md)`>`
+ Gets shared links for the current user. + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - _includeFields:_ `string[]` - List of data field names to include in the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkPaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkPaging.md)`>` - List of shared links +- **loadSites**(pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
+ Gets all sites in the repository. + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of sites +- **loadTrashcan**(pagination: [`PaginationModel`](../../../lib/core/models/pagination.model.ts), includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`DeletedNodesPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/DeletedNodesPaging.md)`>`
+ Gets all items currently in the trash. + - _pagination:_ [`PaginationModel`](../../../lib/core/models/pagination.model.ts) - Specifies how to paginate the results + - _includeFields:_ `string[]` - List of data field names to include in the results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`DeletedNodesPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/DeletedNodesPaging.md)`>` - List of deleted items + +## Details + +The `includeFields` parameter used by some of the methods lets you specify which data fields +you want in the result objects. See the +[Alfresco JSAPI](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SharedlinksApi.md#findSharedLinks) +for further details of the returned data and the available fields. + +## See also + +- [Document List component](../components/document-list.component.md) diff --git a/docs/content-services/document-actions.service.md b/docs/content-services/services/document-actions.service.md similarity index 86% rename from docs/content-services/document-actions.service.md rename to docs/content-services/services/document-actions.service.md index 78dec2c4d4..7fb31d2ba2 100644 --- a/docs/content-services/document-actions.service.md +++ b/docs/content-services/services/document-actions.service.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Document Actions service](../../lib/content-services/document-list/services/document-actions.service.ts "Defined in document-actions.service.ts") +# [Document Actions service](../../../lib/content-services/document-list/services/document-actions.service.ts "Defined in document-actions.service.ts") -Implements the document menu actions for the [Document List component](../content-services/document-list.component.md). +Implements the document menu actions for the [Document List component](../components/document-list.component.md). ## Class members @@ -30,9 +30,9 @@ Implements the document menu actions for the [Document List component](../conten ## Details This service implements the built-in actions that can be applied to a document -shown in a [Document List component](document-list.component.md): **delete**, +shown in a [Document List component](../components/document-list.component.md): **delete**, **download**, **copy** and **move** (see the -[Content Action component](content-action.component.md) for further details and examples +[Content Action component](../components/content-action.component.md) for further details and examples of these menu items). However, you can also use the service to add extra actions or replace the built-in ones with your own implementation. @@ -99,5 +99,5 @@ with a custom application service. ## See also -- [Content action component](content-action.component.md) +- [Content action component](../components/content-action.component.md) - [Folder actions service](folder-actions.service.md) diff --git a/docs/content-services/document-list.service.md b/docs/content-services/services/document-list.service.md similarity index 91% rename from docs/content-services/document-list.service.md rename to docs/content-services/services/document-list.service.md index 51ef6891cf..9daf4d3ef4 100644 --- a/docs/content-services/document-list.service.md +++ b/docs/content-services/services/document-list.service.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Document List service](../../lib/content-services/document-list/services/document-list.service.ts "Defined in document-list.service.ts") +# [Document List service](../../../lib/content-services/document-list/services/document-list.service.ts "Defined in document-list.service.ts") -Implements node operations used by the [Document List component](../content-services/document-list.component.md). +Implements node operations used by the [Document List component](../components/document-list.component.md). ## Class members @@ -29,12 +29,12 @@ Implements node operations used by the [Document List component](../content-serv Get thumbnail URL for the given document node. - _node:_ [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md) - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to get URL for. - **Returns** `string` - Thumbnail URL string -- **getFolder**(folder: `string`, opts?: `any`, includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+- **getFolder**(folder: `string`, opts?: `any`, includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets the folder node with the specified relative name path below the root node. - _folder:_ `string` - Path to folder. - _opts:_ `any` - (Optional) Options. - _includeFields:_ `string[]` - Extra information to include (available options are "aspectNames", "isLink" and "association") - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - Details of the folder + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - Details of the folder - **getFolderNode**(nodeId: `string`, includeFields: `string[]` = `[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>`
Gets a folder node via its node ID. - _nodeId:_ `string` - ID of the folder node @@ -93,4 +93,4 @@ values via their string equivalents. ## See also -- [Document list component](document-list.component.md) +- [Document list component](../components/document-list.component.md) diff --git a/docs/content-services/folder-actions.service.md b/docs/content-services/services/folder-actions.service.md similarity index 77% rename from docs/content-services/folder-actions.service.md rename to docs/content-services/services/folder-actions.service.md index 086c125e8c..fc508d6817 100644 --- a/docs/content-services/folder-actions.service.md +++ b/docs/content-services/services/folder-actions.service.md @@ -5,17 +5,17 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Folder Actions service](../../lib/content-services/document-list/services/folder-actions.service.ts "Defined in folder-actions.service.ts") +# [Folder Actions service](../../../lib/content-services/document-list/services/folder-actions.service.ts "Defined in folder-actions.service.ts") -Implements the folder menu actions for the [Document List component](../content-services/document-list.component.md). +Implements the folder menu actions for the [Document List component](../components/document-list.component.md). ## Class members ### Methods -- **canExecuteAction**(obj: `any`): `boolean`
+- **canExecuteAction**(nodeEntry: [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)): `boolean`
Checks if an action is available for a particular item. - - _obj:_ `any` - Item to check + - _nodeEntry:_ [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md) - Item to check - **Returns** `boolean` - True if the action is available, false otherwise - **getHandler**(key: `string`): `ContentActionHandler`
Gets the handler function for an action. @@ -30,9 +30,9 @@ Implements the folder menu actions for the [Document List component](../content- ## Details This service implements the built-in actions that can be applied to a folder -shown in a [Document List component](document-list.component.md): **delete**, +shown in a [Document List component](../components/document-list.component.md): **delete**, **download**, **copy** and **move** (see the -[Content Action component](content-action.component.md) for further details and examples +[Content Action component](../components/content-action.component.md) for further details and examples of these menu items). However, you can also use the service to add extra actions or replace the built-in ones with your own implementation. @@ -100,4 +100,4 @@ with a custom application service. ## See also - [Document actions service](document-actions.service.md) -- [Content action component](content-action.component.md) +- [Content action component](../components/content-action.component.md) diff --git a/docs/content-services/node-permission-dialog.service.md b/docs/content-services/services/node-permission-dialog.service.md similarity index 82% rename from docs/content-services/node-permission-dialog.service.md rename to docs/content-services/services/node-permission-dialog.service.md index 199cc0e87e..990b1d3d7e 100644 --- a/docs/content-services/node-permission-dialog.service.md +++ b/docs/content-services/services/node-permission-dialog.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Node permission dialog service](../../lib/content-services/permission-manager/services/node-permission-dialog.service.ts "Defined in node-permission-dialog.service.ts") +# [Node permission dialog service](../../../lib/content-services/permission-manager/services/node-permission-dialog.service.ts "Defined in node-permission-dialog.service.ts") Displays dialogs to let the user set node permissions. @@ -28,10 +28,10 @@ Displays dialogs to let the user set node permissions. ## Details -This service sets up an [Add Permission Dialog component](../content-services/add-permission-dialog.component.md) to provide a user +This service sets up an [Add Permission Dialog component](../components/add-permission-dialog.component.md) to provide a user interface for updating permissions. ## See also - [Node Permission service](node-permission.service.md) -- [Add Permission Dialog component](add-permission-dialog.component.md) +- [Add Permission Dialog component](../components/add-permission-dialog.component.md) diff --git a/docs/content-services/node-permission.service.md b/docs/content-services/services/node-permission.service.md similarity index 78% rename from docs/content-services/node-permission.service.md rename to docs/content-services/services/node-permission.service.md index 844e60f09d..77765f83d0 100644 --- a/docs/content-services/node-permission.service.md +++ b/docs/content-services/services/node-permission.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Node Permission service](../../lib/content-services/permission-manager/services/node-permission.service.ts "Defined in node-permission.service.ts") +# [Node Permission service](../../../lib/content-services/permission-manager/services/node-permission.service.ts "Defined in node-permission.service.ts") Manages role permissions for content nodes. @@ -22,10 +22,10 @@ Manages role permissions for content nodes. Gets a list of roles for the current node. - _node:_ [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) - The target node - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Array of strings representing the roles -- **removePermission**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), permissionToRemove: `PermissionElement`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>`
+- **removePermission**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), permissionToRemove: [`PermissionElement`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/PermissionElement.md)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>`
Removes a permission setting from a node. - _node:_ [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) - ID of the target node - - _permissionToRemove:_ `PermissionElement` - Permission setting to remove + - _permissionToRemove:_ [`PermissionElement`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/PermissionElement.md) - Permission setting to remove - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` - Node with modified permissions - **updateLocallySetPermissions**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), nodes: [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`[]`, nodeRole: `string[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>`
Updates the locally set permissions for a node. @@ -38,10 +38,10 @@ Manages role permissions for content nodes. - _nodeId:_ `string` - ID of the target node - _permissionList:_ [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`[]` - New permission settings - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` - Node with updated permissions -- **updatePermissionRole**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), updatedPermissionRole: `PermissionElement`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>`
+- **updatePermissionRole**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), updatedPermissionRole: [`PermissionElement`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/PermissionElement.md)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>`
Updates the permission role for a node. - _node:_ [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) - Target node - - _updatedPermissionRole:_ `PermissionElement` - Permission role to update or add + - _updatedPermissionRole:_ [`PermissionElement`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/PermissionElement.md) - Permission role to update or add - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` - Node with updated permission ## Details @@ -56,4 +56,4 @@ based on. ## See also -- [Permission list component](permission-list.component.md) +- [Permission list component](../components/permission-list.component.md) diff --git a/docs/content-services/services/rating.service.md b/docs/content-services/services/rating.service.md new file mode 100644 index 0000000000..f8436159b7 --- /dev/null +++ b/docs/content-services/services/rating.service.md @@ -0,0 +1,48 @@ +--- +Title: Rating service +Added: v2.0.0 +Status: Active +Last reviewed: 2018-05-04 +--- + +# [Rating service](../../../lib/content-services/social/services/rating.service.ts "Defined in rating.service.ts") + +Manages ratings for items in Content Services. + +## Class members + +### Methods + +- **deleteRating**(nodeId: `string`, ratingType: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ Removes the current user's rating for a node. + - _nodeId:_ `string` - Target node + - _ratingType:_ `any` - Type of rating to remove (can be "likes" or "fiveStar") + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Null response indicating that the operation is complete +- **getRating**(nodeId: `string`, ratingType: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`RatingEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/RatingEntry.md)`|__type>`
+ Gets the current user's rating for a node. + - _nodeId:_ `string` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to get the rating from + - _ratingType:_ `any` - Type of rating (can be "likes" or "fiveStar") + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`RatingEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/RatingEntry.md)`|__type>` - The rating value +- **postRating**(nodeId: `string`, ratingType: `string`, vote: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`RatingEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/RatingEntry.md)`|__type>`
+ Adds the current user's rating for a node. + - _nodeId:_ `string` - Target node for the rating + - _ratingType:_ `string` - Type of rating (can be "likes" or "fiveStar") + - _vote:_ `any` - Rating value (boolean for "likes", numeric 0..5 for "fiveStar") + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`RatingEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/RatingEntry.md)`|__type>` - Details about the rating, including the new value + +## Details + +The `ratingType` string currently has two possible options, "likes" +and "fiveStar". When the "likes" scheme is used, the result of +`getRating` and the `vote` parameter of `postRating` are boolean +values. When "fiveStar" is used, the value is an integer representing +the number of stars out of five. + +See the [Ratings API](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/RatingsApi.md) +in the Alfresco JS API for more information about the returned data and the +REST API that this service is based on. + +## See also + +- [Like component](../components/like.component.md) +- [Rating component](../components/rating.component.md) diff --git a/docs/content-services/services/search-filter.service.md b/docs/content-services/services/search-filter.service.md new file mode 100644 index 0000000000..6d15f4b5b3 --- /dev/null +++ b/docs/content-services/services/search-filter.service.md @@ -0,0 +1,37 @@ +--- +Title: Search filter service +Added: v2.4.0 +Status: Active +Last reviewed: 2018-06-12 +--- + +# [Search filter service](../../../lib/content-services/search/components/search-filter/search-filter.service.ts "Defined in search-filter.service.ts") + +Registers widgets for use with the [Search Filter component](../components/search-filter.component.md). + +## Details + +This component keeps track of all widgets registered for use with the +[Search Filter component](../components/search-filter.component.md). All the built-in widgets are registered by default +but you should register any new custom widgets you create explicitly: + +```ts +import { MyComponent } from './my-component.ts' + +@Component({...}) +export class MyAppOrComponent { + + constructor(searchFilterService: SearchFilterService) { + searchFilterService.widgets['my-widget'] = MyComponent; + } + +} +``` + +See the [Search Widget Interface](../interfaces/search-widget.interface.md) interface page for details about creating your own +custom search widgets. + +## See also + +- [Search Widget Interface](../interfaces/search-widget.interface.md) +- [Search Filter component](../components/search-filter.component.md) diff --git a/docs/content-services/services/search-query-builder.service.md b/docs/content-services/services/search-query-builder.service.md new file mode 100644 index 0000000000..ac180cf915 --- /dev/null +++ b/docs/content-services/services/search-query-builder.service.md @@ -0,0 +1,103 @@ +--- +Title: Search Query Builder service +Added: v2.3.0 +Status: Active +Last reviewed: 2019-03-19 +--- + +# [Search Query Builder service](../../../lib/content-services/search/search-query-builder.service.ts "Defined in search-query-builder.service.ts") + +Stores information from all the custom search and faceted search widgets, compiles and runs the final search query. + +## Class members + +### Methods + +- **addFilterQuery**(query: `string`)
+ Adds a filter query to the current query. + - _query:_ `string` - Query string to add +- **addUserFacetBucket**(field: [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts), bucket: [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts))
+ Adds a facet bucket to a field. + - _field:_ [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts) - The target field + - _bucket:_ [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts) - Bucket to add +- **buildQuery**(): `QueryBody`
+ Builds the current query. + - **Returns** `QueryBody` - The finished query +- **execute**()
+ Builds and executes the current query. +- **getFacetField**(label: `string`): [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts)
+ Gets a facet field by label. + - _label:_ `string` - Label of the facet field + - **Returns** [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts) - Facet field data +- **getFacetQuery**(label: `string`): [`FacetQuery`](../../../lib/content-services/search/facet-query.interface.ts)
+ Gets a facet query by label. + - _label:_ `string` - Label of the query + - **Returns** [`FacetQuery`](../../../lib/content-services/search/facet-query.interface.ts) - Facet query data +- **getPrimarySorting**(): [`SearchSortingDefinition`](../../../lib/content-services/search/search-sorting-definition.interface.ts)
+ Gets the primary sorting definition. + - **Returns** [`SearchSortingDefinition`](../../../lib/content-services/search/search-sorting-definition.interface.ts) - The primary sorting definition +- **getQueryGroup**(query: `any`): `any`
+ Gets the query group. + - _query:_ `any` - Target query + - **Returns** `any` - Query group +- **getSortingOptions**(): [`SearchSortingDefinition`](../../../lib/content-services/search/search-sorting-definition.interface.ts)`[]`
+ Gets all pre-configured sorting options that users can choose from. + - **Returns** [`SearchSortingDefinition`](../../../lib/content-services/search/search-sorting-definition.interface.ts)`[]` - Pre-configured sorting options +- **getSupportedLabel**(configLabel: `string`): `string`
+ Encloses a label name with double quotes if it contains whitespace characters. + - _configLabel:_ `string` - Original label text + - **Returns** `string` - Label, possibly with quotes if it contains spaces +- **getUserFacetBuckets**(field: `string`): [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts)`[]`
+ Gets the buckets currently added to a field + - _field:_ `string` - The target fields + - **Returns** [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts)`[]` - Bucket array +- **removeFilterQuery**(query: `string`)
+ Removes an existing filter query. + - _query:_ `string` - The query to remove +- **removeUserFacetBucket**(field: [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts), bucket: [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts))
+ Removes an existing bucket from a field. + - _field:_ [`FacetField`](../../../lib/content-services/search/facet-field.interface.ts) - The target field + - _bucket:_ [`FacetFieldBucket`](../../../lib/content-services/search/facet-field-bucket.interface.ts) - Bucket to remove +- **resetToDefaults**()
+ Resets the query to the defaults specified in the app config. +- **update**()
+ Builds the current query and triggers the `updated` event. + +## Details + +See the [Search filter component](../components/search-filter.component.md) page for full details about the format of queries, +facet fields, and sorting options. + +The Query Builder is UI agnostic and does not rely on Angular components. +You can reuse it with multiple component implementations. + +You can use custom widgets to populate and edit the following parts of the resulting query: + +- categories +- query fragments that form a query expression +- include fields +- scope settings +- filter queries +- facet fields +- range queries + +```ts +constructor(queryBuilder: SearchQueryBuilderService) { + + queryBuilder.updated.subscribe(query => { + this.queryBuilder.execute(); + }); + + queryBuilder.executed.subscribe(data => { + this.onDataLoaded(data); + }); + +} +``` + +> **Note:** From ADF 3.0.0, the query contains the `"facetFormat": "V2"` parameter so that all the responses have the same structure whether they come from search queries containing facetFields, facetQueries, grouped facetQueries or facetIntervals. + +## See also + +- [Search filter component](../components/search-filter.component.md) +- [Search Widget interface](../interfaces/search-widget.interface.md) diff --git a/docs/content-services/tag.service.md b/docs/content-services/services/tag.service.md similarity index 55% rename from docs/content-services/tag.service.md rename to docs/content-services/services/tag.service.md index 85bbc0dcaf..042b86b0c0 100644 --- a/docs/content-services/tag.service.md +++ b/docs/content-services/services/tag.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Tag service](../../lib/content-services/tag/services/tag.service.ts "Defined in tag.service.ts") +# [Tag service](../../../lib/content-services/tag/services/tag.service.ts "Defined in tag.service.ts") Manages tags in Content Services. @@ -13,24 +13,24 @@ Manages tags in Content Services. ### Methods -- **addTag**(nodeId: `string`, tagName: `string`): `any`
+- **addTag**(nodeId: `string`, tagName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagEntry.md)`>`
Adds a tag to a node. - _nodeId:_ `string` - ID of the target node - _tagName:_ `string` - Name of the tag to add - - **Returns** `any` - [TagEntry](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagEntry.md) object (defined in JS-API) with details of the new tag + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagEntry.md)`>` - TagEntry object (defined in JS-API) with details of the new tag - **getAllTheTags**(opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagPaging.md)`>`
Gets a list of all the tags already defined in the repository. - _opts:_ `any` - (Optional) Options supported by JS-API - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagPaging.md)`>` - TagPaging object (defined in JS-API) containing the tags -- **getTagsByNodeId**(nodeId: `string`): `any`
+- **getTagsByNodeId**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagPaging.md)`>`
Gets a list of tags added to a node. - _nodeId:_ `string` - ID of the target node - - **Returns** `any` - [TagPaging](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagPaging.md) object (defined in JS-API) containing the tags -- **removeTag**(nodeId: `string`, tag: `string`): `any`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TagPaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagPaging.md)`>` - TagPaging object (defined in JS-API) containing the tags +- **removeTag**(nodeId: `string`, tag: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Removes a tag from a node. - _nodeId:_ `string` - ID of the target node - _tag:_ `string` - Name of the tag to remove - - **Returns** `any` - Null object when the operation completes + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Null object when the operation completes ## Details @@ -48,9 +48,9 @@ construct a list like this. See the [Tags API](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/TagsApi.md) in the Alfresco JS API for more information about the types returned by [Tag -service](../content-services/tag.service.md) methods and for the implementation of the REST API the service is +service](tag.service.md) methods and for the implementation of the REST API the service is based on. ## See also -- [Tag list component](tag-list.component.md) +- [Tag list component](../components/tag-list.component.md) diff --git a/docs/core/README.md b/docs/core/README.md deleted file mode 100644 index 5cd40bc383..0000000000 --- a/docs/core/README.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -Title: Core API -Github only: true ---- - -# Core API - -Contains a variety of components used throughout ADF. -See the library's -[README file](../../lib/core/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [About component](about.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Shows a general version and status overview of the installed ADF library. | [Source](../../lib/core/about/about.component.ts) | -| [Buttons menu component](buttons-menu.component.md) | Displays buttons on a responsive menu. | [Source](../../lib/core/buttons-menu/buttons-menu.component.ts) | -| [Card view component](card-view.component.md) | Displays a configurable property list renderer. | [Source](../../lib/core/card-view/components/card-view/card-view.component.ts) | -| [Comment list component](comment-list.component.md) | Shows a list of comments. | [Source](../../lib/core/comments/comment-list.component.ts) | -| [Comments component](comments.component.md) | Displays comments from users involved in a specified task or content and allows an involved user to add a comment to a task or a content. | [Source](../../lib/core/comments/comments.component.ts) | -| [Data column component](data-column.component.md) | Defines column properties for DataTable, Tasklist, Document List and other components. | [Source](../../lib/core/data-column/data-column.component.ts) | -| [Datatable component](datatable.component.md) | Displays data as a table with customizable columns and presentation. | [Source](../../lib/core/datatable/components/datatable/datatable.component.ts) | -| [Empty list component](empty-list.component.md) | Displays a message indicating that a list is empty. | [Source](../../lib/core/datatable/components/datatable/empty-list.component.ts) | -| [Form field component](form-field.component.md) | Represents a UI field in a form. | [Source](../../lib/core/form/components/form-field/form-field.component.ts) | -| [Form list component](form-list.component.md) | Shows forms as a list. | [Source](../../lib/core/form/components/form-list.component.ts) | -| [Form component](form.component.md) | Shows a Form from APS | [Source](../../lib/core/form/components/form.component.ts) | -| [Start form component](start-form.component.md) | Displays the Start Form for a process. | [Source](../../lib/core/form/components/start-form.component.ts) | -| [Text mask component](text-mask.component.md) | Implements text field input masks. | [Source](../../lib/core/form/components/widgets/text/text-mask.component.ts) | -| [Icon component](icon.component.md) | Provides a universal way of rendering registered and named icons. | [Source](../../lib/core/icon/icon.component.ts) | -| [Info drawer layout component](info-drawer-layout.component.md) | Displays a sidebar-style information panel. | [Source](../../lib/core/info-drawer/info-drawer-layout.component.ts) | -| [Info drawer component](info-drawer.component.md) | Displays a sidebar-style information panel with tabs. | [Source](../../lib/core/info-drawer/info-drawer.component.ts) | -| [Language menu component](language-menu.component.md) | Displays all the languages that are present in "app.config.json" and the default (EN). | [Source](../../lib/core/language-menu/language-menu.component.ts) | -| [Header component](header.component.md) | Reusable header for Alfresco applications. | [Source](../../lib/core/layout/components/header/header.component.ts) | -| [Sidebar action menu component](sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts) | -| [Sidenav layout component](sidenav-layout.component.md) | Displays the standard three-region ADF application layout. | [Source](../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts) | -| [Login dialog panel component](login-dialog-panel.component.md) | Shows and manages a login dialog. | [Source](../../lib/core/login/components/login-dialog-panel.component.ts) | -| [Login dialog component](login-dialog.component.md) | Allows a user to perform a login via a dialog. | [Source](../../lib/core/login/components/login-dialog.component.ts) | -| [Login component](login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../../lib/core/login/components/login.component.ts) | -| [Infinite pagination component](infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../../lib/core/pagination/infinite-pagination.component.ts) | -| [Pagination component](pagination.component.md) | Adds pagination to the component it is used with. | [Source](../../lib/core/pagination/pagination.component.ts) | -| [Host settings component](host-settings.component.md) ![Internal](../docassets/images/InternalIcon.png) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../../lib/core/settings/host-settings.component.ts) | -| [Sorting picker component](sorting-picker.component.md) | Selects from a set of predefined sorting definitions and directions. | [Source](../../lib/core/sorting-picker/sorting-picker.component.ts) | -| [Empty content component](empty-content.component.md) | Provides a generic "Empty Content" placeholder for components. | [Source](../../lib/core/templates/empty-content/empty-content.component.ts) | -| [Error content component](error-content.component.md) | Displays info about a specific error. | [Source](../../lib/core/templates/error-content/error-content.component.ts) | -| [Toolbar divider component](toolbar-divider.component.md) | Divides groups of elements in a Toolbar with a visual separator. | [Source](../../lib/core/toolbar/toolbar-divider.component.ts) | -| [Toolbar title component](toolbar-title.component.md) | Supplies custom HTML to be included in a Toolbar component title. | [Source](../../lib/core/toolbar/toolbar-title.component.ts) | -| [Toolbar component](toolbar.component.md) | Simple container for headers, titles, actions and breadcrumbs. | [Source](../../lib/core/toolbar/toolbar.component.ts) | -| [User info component](user-info.component.md) | Shows user information. | [Source](../../lib/core/userinfo/components/user-info.component.ts) | -| [Viewer component](viewer.component.md) | Displays content from an ACS repository. | [Source](../../lib/core/viewer/components/viewer.component.ts) | - -## Directives - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Context menu directive](context-menu.directive.md) | Adds a context menu to a component. | [Source](../../lib/core/context-menu/context-menu.directive.ts) | -| [Highlight directive](highlight.directive.md) | Adds highlighting to selected sections of an HTML element's content. | [Source](../../lib/core/directives/highlight.directive.ts) | -| [Logout directive](logout.directive.md) | Logs the user out when the decorated element is clicked. | [Source](../../lib/core/directives/logout.directive.ts) | -| [Node delete directive](node-delete.directive.md) | Deletes multiple files and folders. | [Source](../../lib/core/directives/node-delete.directive.ts) | -| [Node download directive](node-download.directive.md) | Allows folders and/or files to be downloaded, with multiple nodes packed as a '.ZIP' archive. | [Source](../../lib/core/directives/node-download.directive.ts) | -| [Node favorite directive](node-favorite.directive.md) | Selectively toggles nodes as favorites. | [Source](../../lib/core/directives/node-favorite.directive.ts) | -| [Node permission directive](node-permission.directive.md) | Selectively disables an HTML element or Angular component. | [Source](../../lib/core/directives/node-permission.directive.ts) | -| [Node restore directive](node-restore.directive.md) | Restores deleted nodes to their original location. | [Source](../../lib/core/directives/node-restore.directive.ts) | -| [Upload directive](upload.directive.md) | Uploads content in response to file drag and drop. | [Source](../../lib/core/directives/upload.directive.ts) | - -## Models - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Form field model](form-field.model.md) | Contains the value and metadata for a field of a Form component. | [Source](../../lib/core/form/components/widgets/core/form-field.model.ts) | -| [Product version model](product-version.model.md) | Contains version and license information classes for Alfresco products. | [Source](../../lib/core/models/product-version.model.ts) | -| [User process model](user-process.model.md) | Represents a Process Services user. | [Source](../../lib/core/models/user-process.model.ts) | -| [Bpm user model](bpm-user.model.md) | Contains information about a Process Services user. | [Source](../../lib/core/userinfo/models/bpm-user.model.ts) | -| [Ecm user model](ecm-user.model.md) | Contains information about a Content Services user. | [Source](../../lib/core/userinfo/models/ecm-user.model.ts) | - -## Pipes - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [File size pipe](file-size.pipe.md) | Converts a number of bytes to the equivalent in KB, MB, etc. | [Source](../../lib/core/pipes/file-size.pipe.ts) | -| [Format space pipe](format-space.pipe.md) | Replaces all the white space in a string with a supplied character. | [Source](../../lib/core/pipes/format-space.pipe.ts) | -| [Full name pipe](full-name.pipe.md) | Joins the first and last name properties from a UserProcessModel object into a single string. | [Source](../../lib/core/pipes/full-name.pipe.ts) | -| [Mime type icon pipe](mime-type-icon.pipe.md) | Retrieves an icon to represent a MIME type. | [Source](../../lib/core/pipes/mime-type-icon.pipe.ts) | -| [Node name tooltip pipe](node-name-tooltip.pipe.md) | Formats the tooltip for a Node. | [Source](../../lib/core/pipes/node-name-tooltip.pipe.ts) | -| [Text highlight pipe](text-highlight.pipe.md) | Adds highlighting to words or sections of text that match a search string. | [Source](../../lib/core/pipes/text-highlight.pipe.ts) | -| [Time ago pipe](time-ago.pipe.md) | Converts a recent past date into a number of days ago. | [Source](../../lib/core/pipes/time-ago.pipe.ts) | -| [User initial pipe](user-initial.pipe.md) | Takes the name fields of a UserProcessModel object and extracts and formats the initials. | [Source](../../lib/core/pipes/user-initial.pipe.ts) | - -## Services - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Card item types service](card-item-types.service.md) | Maps type names to field component types for the Card View component. | [Source](../../lib/core/card-view/services/card-item-types.service.ts) | -| [Card view update service](card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. | [Source](../../lib/core/card-view/services/card-view-update.service.ts) | -| [Activiti alfresco service](activiti-alfresco.service.md) | Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). | [Source](../../lib/core/form/services/activiti-alfresco.service.ts) | -| [Form rendering service](form-rendering.service.md) | Maps a form field type string onto the corresponding form widget component type. | [Source](../../lib/core/form/services/form-rendering.service.ts) | -| [Form service](form.service.md) | Implements Process Services form methods | [Source](../../lib/core/form/services/form.service.ts) | -| [Node service](node.service.md) | Gets Alfresco Repository node metadata and creates nodes with metadata. | [Source](../../lib/core/form/services/node.service.ts) | -| [Process content service](process-content.service.md) | Manipulates content related to a Process Instance or Task Instance in APS. | [Source](../../lib/core/form/services/process-content.service.ts) | -| [Alfresco api service](alfresco-api.service.md) | Provides access to an initialized **AlfrescoJSApi** instance. | [Source](../../lib/core/services/alfresco-api.service.ts) | -| [Apps process service](apps-process.service.md) | Gets details of the Process Services apps that are deployed for the user. | [Source](../../lib/core/services/apps-process.service.ts) | -| [Auth guard bpm service](auth-guard-bpm.service.md) | Adds authentication with Process Services to a route within the app. | [Source](../../lib/core/services/auth-guard-bpm.service.ts) | -| [Auth guard ecm service](auth-guard-ecm.service.md) | Adds authentication with Content Services to a route within the app. | [Source](../../lib/core/services/auth-guard-ecm.service.ts) | -| [Auth guard service](auth-guard.service.md) | Adds authentication to a route within the app. | [Source](../../lib/core/services/auth-guard.service.ts) | -| [Authentication service](authentication.service.md) | Provides authentication to ACS and APS. | [Source](../../lib/core/services/authentication.service.ts) | -| [Comment content service](comment-content.service.md) | Adds and retrieves comments for nodes in Content Services. | [Source](../../lib/core/services/comment-content.service.ts) | -| [Comment process service](comment-process.service.md) | Adds and retrieves comments for task and process instances in Process Services. | [Source](../../lib/core/services/comment-process.service.ts) | -| [Content service](content.service.md) | Accesses app-generated data objects via URLs and file downloads. | [Source](../../lib/core/services/content.service.ts) | -| [Cookie service](cookie.service.md) | Stores key-value data items as browser cookies. | [Source](../../lib/core/services/cookie.service.ts) | -| [Deleted nodes api service](deleted-nodes-api.service.md) | Gets a list of Content Services nodes currently in the trash. | [Source](../../lib/core/services/deleted-nodes-api.service.ts) | -| [Discovery api service](discovery-api.service.md) | Gets version and license information for Process Services and Content Services. | [Source](../../lib/core/services/discovery-api.service.ts) | -| [Download zip service](download-zip.service.md) | Creates and manages downloads. | [Source](../../lib/core/services/download-zip.service.ts) | -| [Favorites api service](favorites-api.service.md) | Gets a list of items a user has marked as their favorites. | [Source](../../lib/core/services/favorites-api.service.ts) | -| [Highlight transform service](highlight-transform.service.md) | Adds HTML to a string to highlight chosen sections. | [Source](../../lib/core/services/highlight-transform.service.ts) | -| [Jwt helper service](jwt-helper.service.md) | Decodes a JSON Web Token (JWT) to a JavaScript object. | [Source](../../lib/core/services/jwt-helper.service.ts) | -| [Log service](log.service.md) | Provides log functionality. | [Source](../../lib/core/services/log.service.ts) | -| [Login dialog service](login-dialog.service.md) | Manages login dialogs. | [Source](../../lib/core/services/login-dialog.service.ts) | -| [Nodes api service](nodes-api.service.md) | Accesses and manipulates ACS document nodes using their node IDs. | [Source](../../lib/core/services/nodes-api.service.ts) | -| [Notification service](notification.service.md) | Shows a notification message with optional feedback. | [Source](../../lib/core/services/notification.service.ts) | -| [Page title service](page-title.service.md) | Sets the page title. | [Source](../../lib/core/services/page-title.service.ts) | -| [People content service](people-content.service.md) | Gets information about a Content Services user. | [Source](../../lib/core/services/people-content.service.ts) | -| [People process service](people-process.service.md) | Gets information about Process Services users. | [Source](../../lib/core/services/people-process.service.ts) | -| [Renditions service](renditions.service.md) | Manages prearranged conversions of content to different formats. | [Source](../../lib/core/services/renditions.service.ts) | -| [Search configuration service](search-configuration.service.md) | Provides fine control of parameters to a search. | [Source](../../lib/core/services/search-configuration.service.ts) | -| [Search service](search.service.md) | Accesses the Content Services Search API. | [Source](../../lib/core/services/search.service.ts) | -| [Shared links api service](shared-links-api.service.md) | Finds shared links to Content Services items. | [Source](../../lib/core/services/shared-links-api.service.ts) | -| [Sites service](sites.service.md) | Accesses and manipulates sites from a Content Services repository. | [Source](../../lib/core/services/sites.service.ts) | -| [Storage service](storage.service.md) | Stores items in the form of key-value pairs. | [Source](../../lib/core/services/storage.service.ts) | -| [Thumbnail service](thumbnail.service.md) | Retrieves an SVG thumbnail image to represent a document type. | [Source](../../lib/core/services/thumbnail.service.ts) | -| [Translation service](translation.service.md) | Supports localisation. | [Source](../../lib/core/services/translation.service.ts) | -| [Upload service](upload.service.md) | Provides access to various APIs related to file upload features. | [Source](../../lib/core/services/upload.service.ts) | -| [User preferences service](user-preferences.service.md) | Stores preferences for the app and for individual components. | [Source](../../lib/core/services/user-preferences.service.ts) | -| [Bpm user service](bpm-user.service.md) | Gets information about the current Process Services user. | [Source](../../lib/core/userinfo/services/bpm-user.service.ts) | -| [Ecm user service](ecm-user.service.md) | Gets information about a Content Services user. | [Source](../../lib/core/userinfo/services/ecm-user.service.ts) | -| [Identity user service](identity-user.service.md) | Gets OAuth2 personal details and roles for users. | [Source](../../lib/core/userinfo/services/identity-user.service.ts) | - -## Widgets - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Content widget](content.widget.md) | Shows the content preview. | [Source](../../lib/core/form/components/widgets/content/content.widget.ts) | - - - -## Other classes and interfaces - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Data Table Adapter interface](datatable-adapter.interface.md) | Defines how table data is supplied to DataTable and Tasklist components. | [Source](../../lib/core/datatable/data/datatable-adapter.ts) | -| [Form Field Validator interface](form-field-validator.interface.md) | Defines how the input fields of [`Form`](../../lib/process-services/task-list/models/form.model.ts) and Task Details components are validated. | [Source](../../lib/core/form/components/widgets/core/form-field-validator.ts) | -| [Search Configuration interface](search-configuration.interface.md) | Provides fine control of parameters to a search. | [Source](../../lib/core/services/search-configuration.service.ts) | diff --git a/docs/core/about.component.md b/docs/core/about.component.md deleted file mode 100644 index b36a611777..0000000000 --- a/docs/core/about.component.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -Title: About Component -Added: v2.4.0 -Status: Experimental -Last reviewed: 2018-11-14 ---- - -# [About Component](../../lib/core/about/about.component.ts "Defined in about.component.ts") - -Shows a general version and status overview of the installed ADF library. - -## Basic Usage - -```html - -``` - -## Details - -Use this component to get a general overview of the version of ADF installed and the status of the [Content service](../core/content.service.md) and [Process service](../process-services/process.service.md). - -Note at the moment this component is mostly for internal use and it requires you to: - -- create a version file : `npm list --depth=0 --json=true --prod=true > versions.json` -- provide this version file in the `dist` folder diff --git a/docs/core/alfresco-api.service.md b/docs/core/alfresco-api.service.md deleted file mode 100644 index 056324dacf..0000000000 --- a/docs/core/alfresco-api.service.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -Title: Alfresco Api Service -Added: v2.0.0 -Status: Active -Last reviewed: 2019-01-17 ---- - -# [Alfresco Api Service](../../lib/core/services/alfresco-api.service.ts "Defined in alfresco-api.service.ts") - -Provides access to an initialized **AlfrescoJSApi** instance. - -## Basic Usage - -```ts -export class MyComponent implements OnInit { - - constructor(private apiService: AlfrescoApiService) { - } - - ngOnInit() { - let nodeId = 'some-node-id'; - let params = {}; - this.apiService.getInstance().nodes - .getNodeChildren(nodeId, params) - .then(result => console.log(result)); - } -} -``` - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| contentApi | `ContentApi` | | (Read only) Accesses the Content API | -| nodesApi | `NodesApi` | | (Read only) Accesses the Nodes API | -| renditionsApi | `RenditionsApi` | | (Read only) Accesses the Renditions API | -| sharedLinksApi | `SharedLinksApi` | | (Read only) Accesses the Shared Links API | -| sitesApi | `SitesApi` | | (Read only) Accesses the Sites API | -| favoritesApi | `FavoritesApi` | | (Read only) Accesses the Favorites API | -| peopleApi | `PeopleApi` | | (Read only) Accesses the People API | -| searchApi | `SearchApi` | | (Read only) Accesses the Search API | -| versionsApi | `VersionsApi` | | (Read only) Accesses the Versions API | -| classesApi | `ClassesApi` | | (Read only) Accesses the Classes API | -| groupsApi | `GroupsApi` | | (Read only) Accesses the Groups API | - -### Events - -| Name | Type | Description | -| ---- | ---- | ----------- | -| nodeUpdated | [`Subject`](http://reactivex.io/documentation/subject.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` | Emitted when a node updates. | - -## Details - -**Note for developers**: The TypeScript declaration files for the Alfresco JS API -are still under development and some Alfresco APIs may not be accessible -via your IDE's intellisense or TypeScript compiler. -To avoid these TypeScript type check errors, you can call any supported -Alfresco JS api by casting the instance to the `any` type as in the following example: - -```ts -let api: any = this.apiService.getInstance(); -api.nodes.addNode('-root-', body, {}); -``` diff --git a/docs/core/components/about.component.md b/docs/core/components/about.component.md new file mode 100644 index 0000000000..8af231c7a5 --- /dev/null +++ b/docs/core/components/about.component.md @@ -0,0 +1,47 @@ +--- +Title: About Component +Added: v2.4.0 +Status: Experimental +Last reviewed: 2019-03-19 +--- + +# [About Component](../../../lib/core/about/about.component.ts "Defined in about.component.ts") + +Shows a general version and status overview of the installed ADF library. + +## Basic Usage + +With default input values + +```html + +``` + +With custom input values: + +```html + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| githubUrlCommitAlpha | `string` | | Commit corresponding to the version of ADF to be used. | +| regexp | `string` | "^(@alfresco)" | Regular expression for filtering dependencies packages. | +| showExtensions | `boolean` | true | Toggles showing/hiding of extensions block. | + +## Details + +Use this component to get a general overview of the version of ADF installed and the status of the [Content service](../services/content.service.md) and [Process service](../../process-services/services/process.service.md). + +Note that at the moment this component is mostly for internal use and it requires you to: + +- create a version file : `npm list --depth=0 --json=true --prod=true > versions.json` +- provide this version file in the `dist` folder diff --git a/docs/core/buttons-menu.component.md b/docs/core/components/buttons-menu.component.md similarity index 74% rename from docs/core/buttons-menu.component.md rename to docs/core/components/buttons-menu.component.md index 1b7c61e951..bb771f202b 100644 --- a/docs/core/buttons-menu.component.md +++ b/docs/core/components/buttons-menu.component.md @@ -5,15 +5,15 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Buttons Menu Component](../../lib/core/buttons-menu/buttons-menu.component.ts "Defined in buttons-menu.component.ts") +# [Buttons Menu Component](../../../lib/core/buttons-menu/buttons-menu.component.ts "Defined in buttons-menu.component.ts") Displays buttons on a responsive menu. -![adf-buttons-menu-desktop](../docassets/images/adf-buttons-menu-desktop.png) +![adf-buttons-menu-desktop](../../docassets/images/adf-buttons-menu-desktop.png) ## Basic Usage -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Place the buttons for the menu inside this component's HTML tags. They must use the following structure: @@ -47,11 +47,11 @@ depending on the screen size: **Desktop View** -![adf-buttons-menu-desktop](../docassets/images/adf-buttons-menu-desktop.png) +![adf-buttons-menu-desktop](../../docassets/images/adf-buttons-menu-desktop.png) **Mobile View** -![adf-buttons-menu-mobile](../docassets/images/adf-buttons-menu-mobile.png) +![adf-buttons-menu-mobile](../../docassets/images/adf-buttons-menu-mobile.png) The component has a property called `isMenuEmpty` that you can access from code. If this is set to true then the component will not show an empty menu with no buttons defined. diff --git a/docs/core/card-view.component.md b/docs/core/components/card-view.component.md similarity index 76% rename from docs/core/card-view.component.md rename to docs/core/components/card-view.component.md index 04718bf92d..3d9c3ef529 100644 --- a/docs/core/card-view.component.md +++ b/docs/core/components/card-view.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-05-09 --- -# [Card View component](../../lib/core/card-view/components/card-view/card-view.component.ts "Defined in card-view.component.ts") +# [Card View component](../../../lib/core/card-view/components/card-view/card-view.component.ts "Defined in card-view.component.ts") Displays a configurable property list renderer. -![adf-custom-view](../docassets/images/adf-custom-view.png) +![adf-custom-view](../../docassets/images/adf-custom-view.png) ## Basic Usage @@ -32,14 +32,15 @@ Defining properties from Typescript: key: 'name', default: 'default bar' , multiline: false, - icon: 'icon'; + icon: 'icon', + clickCallBack : ()=>{ myClickImplementation()} }), new CardViewMapItemModel({ label: 'My map', value: new Map([['999', 'My Value']]), key: 'map', default: 'default map value' , - clickable: true + clickable: true, }), new CardViewDateItemModel({ label: 'Date of birth', @@ -98,11 +99,11 @@ Defining properties from Typescript: | ---- | ---- | ------------- | ----------- | | displayEmpty | `boolean` | true | Toggles whether or not to show empty items in non-editable mode. | | editable | `boolean` | | Toggles whether or not the items can be edited. | -| properties | [`CardViewItem`](../../lib/core/card-view/interfaces/card-view-item.interface.ts)`[]` | | (**required**) Items to show in the card view. | +| properties | [`CardViewItem`](../../../lib/core/card-view/interfaces/card-view-item.interface.ts)`[]` | | (**required**) Items to show in the card view. | ## Details -You define the property list, the [`CardViewComponent`](../core/card-view.component.md) does the rest. Each property represents a card view item (a row) in the [card view component](../core/card-view.component.md). The following item types are available by default: +You define the property list, the [`CardViewComponent`](../../core/components/card-view.component.md) does the rest. Each property represents a card view item (a row) in the [card view component](card-view.component.md). The following item types are available by default: - [**CardViewTextItemModel**](#card-text-item) - _for text items_ - [**CardViewMapItemModel**](#card-map-item) - _for map items_ @@ -114,7 +115,7 @@ You define the property list, the [`CardViewComponent`](../core/card-view.compon - [**CardViewKeyValuePairsItemModel**](#card-key-value-pairs-item) - _for key-value-pairs items_ - [**CardViewSelectItemModel**](#card-select-item) - _for select items_ -Each of these types implements the [Card View Item interface](card-view-item.interface.md): +Each of these types implements the [Card View Item interface](../interfaces/card-view-item.interface.md): ```ts export interface CardViewItem { @@ -130,7 +131,7 @@ export interface CardViewItem { ``` You can also define your own item types. See the -[Card View Item interface](card-view-item.interface.md) page for details of how to do +[Card View Item interface](../interfaces/card-view-item.interface.md) page for details of how to do this. ### Editing @@ -139,12 +140,12 @@ You can optionally set up the card view so that its properties can be edited. Yo the editing of properties at two levels: - **Global level** - _via the editable parameter of the card-view.component_ -- **[`Property`](../../lib/content-services/content-metadata/interfaces/property.interface.ts) level** - _in each property via the editable attribute_ +- **[`Property`](../../../lib/content-services/content-metadata/interfaces/property.interface.ts) level** - _in each property via the editable attribute_ If you set the global editable parameter to false, no properties can be edited regardless of their individual `editable` settings. -See the [Card View Update service](card-view-update.service.md) +See the [Card View Update service](../services/card-view-update.service.md) page for details of how to use the service to respond to clicks and edits in a card view. You can use this, for example, to save the edits within your application or to highlight a clicked item. @@ -153,12 +154,12 @@ clicked item. The `properties` array contains instances of models that represent the layout of the Card View. The ordering of the models in the array matches the ordering of items in the view. Each of the -models extends the abstract [`CardViewBaseItemModel`](../../lib/core/card-view/models/card-view-baseitem.model.ts) class to add functionality for +models extends the abstract [`CardViewBaseItemModel`](../../../lib/core/card-view/models/card-view-baseitem.model.ts) class to add functionality for specific data types, as described below. #### Card Text Item -[`CardViewTextItemModel`](../../lib/core/card-view/models/card-view-textitem.model.ts) is a property type for text properties. +[`CardViewTextItemModel`](../../../lib/core/card-view/models/card-view-textitem.model.ts) is a property type for text properties. ```ts const textItemProperty = new CardViewTextItemModel(options); @@ -173,9 +174,10 @@ const textItemProperty = new CardViewTextItemModel(options); | displayValue\* | string | | The value to display | | editable | boolean | false | Toggles whether the item is editable | | clickable | boolean | false | Toggles whether the property responds to clicks | +| clickableCallBack | function | null | Function to execute when click the element | | icon | string | | The material icon to show beside the item if it is clickable | | multiline | boolean | false | Single or multiline text | -| pipes | [`CardViewTextItemPipeProperty`](../../lib/core/card-view/interfaces/card-view-textitem-pipe-property.interface.ts)\[] | \[] | Pipes to be applied to the text before display | +| pipes | [`CardViewTextItemPipeProperty`](../../../lib/core/card-view/interfaces/card-view-textitem-pipe-property.interface.ts)\[] | \[] | Pipes to be applied to the text before display | ##### Using pipes with a Card Text Item @@ -199,7 +201,7 @@ new CardViewTextItemModel({ #### Card Map Item -[`CardViewMapItemModel`](../../lib/core/card-view/models/card-view-mapitem.model.ts) is a property type for map properties. +[`CardViewMapItemModel`](../../../lib/core/card-view/models/card-view-mapitem.model.ts) is a property type for map properties. ```ts const mapItemProperty = new CardViewMapItemModel(options); @@ -216,7 +218,7 @@ const mapItemProperty = new CardViewMapItemModel(options); #### Card Date Item -[`CardViewDateItemModel`](../../lib/core/card-view/models/card-view-dateitem.model.ts) is a property type for date properties. +[`CardViewDateItemModel`](../../../lib/core/card-view/models/card-view-dateitem.model.ts) is a property type for date properties. ```ts const dateItemProperty = new CardViewDateItemModel(options); @@ -234,7 +236,7 @@ const dateItemProperty = new CardViewDateItemModel(options); #### Card Datetime Item -[`CardViewDatetimeItemModel`](../../lib/core/card-view/models/card-view-datetimeitem.model.ts) is a property type for datetime properties. +[`CardViewDatetimeItemModel`](../../../lib/core/card-view/models/card-view-datetimeitem.model.ts) is a property type for datetime properties. ```ts const datetimeItemProperty = new CardViewDatetimeItemModel(options); @@ -252,7 +254,7 @@ const datetimeItemProperty = new CardViewDatetimeItemModel(options); #### Card Bool Item -[`CardViewBoolItemModel`](../../lib/core/card-view/models/card-view-boolitem.model.ts) is a property type for boolean properties. +[`CardViewBoolItemModel`](../../../lib/core/card-view/models/card-view-boolitem.model.ts) is a property type for boolean properties. ```ts const boolItemProperty = new CardViewBoolItemModel(options); @@ -269,7 +271,7 @@ const boolItemProperty = new CardViewBoolItemModel(options); #### Card Int Item -[`CardViewIntItemModel`](../../lib/core/card-view/models/card-view-intitem.model.ts) is a property type for integer properties. +[`CardViewIntItemModel`](../../../lib/core/card-view/models/card-view-intitem.model.ts) is a property type for integer properties. ```ts const intItemProperty = new CardViewIntItemModel(options); @@ -286,7 +288,7 @@ const intItemProperty = new CardViewIntItemModel(options); #### Card Float Item -[`CardViewFloatItemModel`](../../lib/core/card-view/models/card-view-floatitem.model.ts) is a property type for float properties. +[`CardViewFloatItemModel`](../../../lib/core/card-view/models/card-view-floatitem.model.ts) is a property type for float properties. ```ts const floatItemProperty = new CardViewFloatItemModel(options); @@ -303,7 +305,7 @@ const floatItemProperty = new CardViewFloatItemModel(options); #### Card Key Value Pairs Item -[`CardViewKeyValuePairsItemModel`](../../lib/core/card-view/models/card-view-keyvaluepairs.model.ts) is a property type for key-value properties. +[`CardViewKeyValuePairsItemModel`](../../../lib/core/card-view/models/card-view-keyvaluepairs.model.ts) is a property type for key-value properties. ```ts const keyValuePairsItemProperty = new CardViewKeyValuePairsItemModel(options); @@ -318,7 +320,7 @@ const keyValuePairsItemProperty = new CardViewKeyValuePairsItemModel(options); #### Card Select Item -[`CardViewSelectItemModel`](../../lib/core/card-view/models/card-view-selectitem.model.ts) is a property type for select properties. +[`CardViewSelectItemModel`](../../../lib/core/card-view/models/card-view-selectitem.model.ts) is a property type for select properties. ```ts const selectItemProperty = new CardViewSelectItemModel(options); @@ -330,9 +332,9 @@ const selectItemProperty = new CardViewSelectItemModel(options); | key\* | string | | Identifying key (important when editing the item) | | editable | boolean | false | Toggles whether the item is editable | | value | string | | The original data value for the item | -| options$\* | [`Observable`](http://reactivex.io/documentation/observable.html)<[`CardViewSelectItemOption`](../../lib/core/card-view/interfaces/card-view-selectitem-properties.interface.ts)\[]> | | The original data value for the item | +| options$\* | [`Observable`](http://reactivex.io/documentation/observable.html)<[`CardViewSelectItemOption`](../../../lib/core/card-view/interfaces/card-view-selectitem-properties.interface.ts)\[]> | | The original data value for the item | ## See also -- [Card View Update service](card-view-update.service.md) -- [Card View Item interface](card-view-item.interface.md) +- [Card View Update service](../services/card-view-update.service.md) +- [Card View Item interface](../interfaces/card-view-item.interface.md) diff --git a/docs/core/comment-list.component.md b/docs/core/components/comment-list.component.md similarity index 70% rename from docs/core/comment-list.component.md rename to docs/core/components/comment-list.component.md index f29b46c429..7f3c423d8c 100644 --- a/docs/core/comment-list.component.md +++ b/docs/core/components/comment-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Comment list component](../../lib/core/comments/comment-list.component.ts "Defined in comment-list.component.ts") +# [Comment list component](../../../lib/core/comments/comment-list.component.ts "Defined in comment-list.component.ts") Shows a list of comments. -![ADF Comment List](../docassets/images/adf-comment-list.png) +![ADF Comment List](../../docassets/images/adf-comment-list.png) ## Basic Usage @@ -50,7 +50,7 @@ export class SomeComponent implements OnInit { } ``` -In the component template use the [comment list component](../core/comment-list.component.md): +In the component template use the [comment list component](comment-list.component.md): ```html ` | Emitted when the user clicks on one of the comment rows. | +| clickRow | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>` | Emitted when the user clicks on one of the comment rows. | diff --git a/docs/core/comments.component.md b/docs/core/components/comments.component.md similarity index 85% rename from docs/core/comments.component.md rename to docs/core/components/comments.component.md index e1d847b520..36e82a36c7 100644 --- a/docs/core/comments.component.md +++ b/docs/core/components/comments.component.md @@ -4,11 +4,11 @@ Added: v2.0.0 Status: Active --- -# [Comments Component](../../lib/core/comments/comments.component.ts "Defined in comments.component.ts") +# [Comments Component](../../../lib/core/comments/comments.component.ts "Defined in comments.component.ts") Displays comments from users involved in a specified task or content and allows an involved user to add a comment to a task or a content. -![adf-comments](../docassets/images/adf-comments.png) +![adf-comments](../../docassets/images/adf-comments.png) ## Basic Usage Task diff --git a/docs/core/data-column.component.md b/docs/core/components/data-column.component.md similarity index 86% rename from docs/core/data-column.component.md rename to docs/core/components/data-column.component.md index ce64e5aaf2..3b305c3662 100644 --- a/docs/core/data-column.component.md +++ b/docs/core/components/data-column.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-12 --- -# [Data Column Component](../../lib/core/data-column/data-column.component.ts "Defined in data-column.component.ts") +# [Data Column Component](../../../lib/core/data-column/data-column.component.ts "Defined in data-column.component.ts") Defines column properties for DataTable, Tasklist, Document List and other components. @@ -68,7 +68,7 @@ You can use `ngIf` directives to provide conditional visibility support for the ### Automatic column header translation You can use i18n resource keys with the -[`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) `title` property. +[`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) `title` property. The component will automatically check the appropriate i18n resources and fetch the corresponding value. ```html @@ -121,9 +121,9 @@ Every cell in the DataTable component is bound to the dynamic data context conta | Name | Type | Description | | ---- | ---- | ----------- | -| data | [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) | Data adapter instance. | -| row | [`DataRow`](../../lib/core/datatable/data/data-row.model.ts) | Current data row instance. | -| col | [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) | Current data column instance. | +| data | [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) | Data adapter instance. | +| row | [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) | Current data row instance. | +| col | [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) | Current data column instance. | You can use all three properties to gain full access to underlying data from within your custom templates. In order to wire HTML templates with the data context you will need to define a variable that is bound to `$implicit` as shown below: @@ -136,7 +136,7 @@ In order to wire HTML templates with the data context you will need to define a The name format is `let-VARIABLE_NAME="$implicit"` where `VARIABLE_NAME` is the name of the variable you want to bind the template data context to. -You can also get a cell value from the underlying [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts): +You can also get a cell value from the underlying [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts): ```ts context.data.getValue(entry.row, entry.col); @@ -180,7 +180,7 @@ In the Example below we will prepend `Hi!` to each file and folder name in the l -In the Example below we will integrate the [adf-tag-node-list](../content-services/tag-node-list.component.md) component +In the Example below we will integrate the [adf-tag-node-list](../../content-services/components/tag-node-list.component.md) component within the document list. @@ -199,7 +199,7 @@ within the document list. -![Tag component in document List](../docassets/images/document-list-tag-template.png) +![Tag component in document List](../../docassets/images/document-list-tag-template.png) ### Styling Techniques @@ -231,14 +231,14 @@ Let's start by assigning an "image-table-cell" class to the thumbnail column: Now your application can define styles to change the content of the column based on conditions such as the selection state: ```css -adf-document-list ::ng-deep adf-datatable > table > tbody > tr.is-selected > td.adf-data-table-cell.adf-data-table-cell--image.adf-image-table-cell > div > div > mat-icon > svg { +adf-document-list ::ng-deep adf-datatable > table > tbody > tr.is-selected > td.adf-datatable-cell.adf-datatable-cell--image.adf-image-table-cell > div > div > mat-icon > svg { fill: #00bcd4; } ``` Once your application starts you should see the following icon for each selected row: -![view-child](../docassets/images/document-list-custom-icon.png) +![view-child](../../docassets/images/document-list-custom-icon.png) #### Hiding columns on small screens @@ -292,14 +292,14 @@ Now you can declare columns and assign the `desktop-only` class where needed: **Desktop View** -![Responsive Desktop](../docassets/images/responsive-desktop.png) +![Responsive Desktop](../../docassets/images/responsive-desktop.png) **Mobile View** -![Responsive Mobile](../docassets/images/responsive-mobile.png) +![Responsive Mobile](../../docassets/images/responsive-mobile.png) ## See also -- [Document list component](../content-services/document-list.component.md) +- [Document list component](../../content-services/components/document-list.component.md) - [Datatable component](datatable.component.md) -- [Task list component](../process-services/task-list.component.md) +- [Task list component](../../process-services/components/task-list.component.md) diff --git a/docs/core/datatable.component.md b/docs/core/components/datatable.component.md similarity index 74% rename from docs/core/datatable.component.md rename to docs/core/components/datatable.component.md index 42626d80ae..21f1d07294 100644 --- a/docs/core/datatable.component.md +++ b/docs/core/components/datatable.component.md @@ -2,14 +2,14 @@ Title: DataTable component Added: v2.0.0 Status: Active -Last reviewed: 2018-11-12 +Last reviewed: 2019-03-20 --- -# [DataTable component](../../lib/core/datatable/components/datatable/datatable.component.ts "Defined in datatable.component.ts") +# [DataTable component](../../../lib/core/datatable/components/datatable/datatable.component.ts "Defined in datatable.component.ts") Displays data as a table with customizable columns and presentation. -![DataTable demo](../docassets/images/datatable-demo.png) +![DataTable demo](../../docassets/images/datatable-demo.png) See it live: [DataTable Quickstart](https://embed.plnkr.co/80qr4YFBeHjLMdAV0F6l/) @@ -27,11 +27,12 @@ See it live: [DataTable Quickstart](https://embed.plnkr.co/80qr4YFBeHjLMdAV0F6l/ - [DataTable DOM Events](#datatable-dom-events) - [Card view](#card-view) - [Using events](#using-events) + - [Customizing the component's styles](#customizing-the-components-styles) - [See also](#see-also) ## Basic usage -**[app.component](../../demo-shell/src/app/app.component.ts).html** +**app.component.html** ```html ``` -**[app.component](../../demo-shell/src/app/app.component.ts).ts** +**app.component.ts** ```ts import { ObjectDataTableAdapter } from '@alfresco/adf-core'; @@ -78,7 +79,7 @@ export class DataTableDemo { ### Setting the rows and column schema -You can set rows and columns in the [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) as shown below: +You can set rows and columns in the [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts) as shown below: ```ts import { ObjectDataTableAdapter } from '@alfresco/adf-core'; @@ -155,7 +156,7 @@ export class DataTableDemo { ``` -You can also set rows to the [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) and set columns as an input as shown below : +You can also set rows in the [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts) and set columns as an input as shown below : ```ts import { ObjectDataTableAdapter } from '@alfresco/adf-core'; @@ -245,7 +246,7 @@ export class DataTableDemo { ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can add [Data column component](data-column.component.md) instances to define columns for the table as described in the usage examples and the [Customizing columns](#customizing-columns) section. @@ -310,10 +311,10 @@ together in the same datatable. | ---- | ---- | ------------- | ----------- | | actions | `boolean` | false | Toggles the data actions column. | | actionsPosition | `string` | "right" | Position of the actions dropdown menu. Can be "left" or "right". | -| allowDropFiles | `boolean` | false | Toggles file drop support for rows (see [Upload directive](upload.directive.md) for further details). | +| allowDropFiles | `boolean` | false | Toggles file drop support for rows (see [Upload directive](../directives/upload.directive.md) for further details). | | columns | `any[]` | \[] | The columns that the datatable will show. | | contextMenu | `boolean` | false | Toggles custom context menu for the component. | -| data | [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) | | Data source for the table | +| data | [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) | | Data source for the table | | display | `string` | DisplayMode.List | Selects the display mode of the table. Can be "list" or "gallery". | | fallbackThumbnail | `string` | | Fallback image for rows where the thumbnail is missing. | | loading | `boolean` | false | Flag that indicates if the datatable is in loading state and needs to show the loading template (see the docs to learn how to configure a loading template). | @@ -326,26 +327,27 @@ together in the same datatable. | selectionMode | `string` | "single" | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | | showHeader | `boolean` | true | Toggles the header. | | sorting | `any[]` | \[] | Define the sort order of the datatable. Possible values are : [`created`, `desc`], [`created`, `asc`], [`due`, `desc`], [`due`, `asc`] | +| stickyHeader | `boolean` | false | Toggles the sticky header mode. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| executeRowAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowActionEvent`](../../lib/core/datatable/components/datatable/data-row-action.event.ts)`>` | Emitted when the user executes a row action. | -| rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../lib/core/datatable/data/data-row-event.model.ts)`>` | Emitted when the user clicks a row. | -| rowDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../lib/core/datatable/data/data-row-event.model.ts)`>` | Emitted when the user double-clicks a row. | -| showRowActionsMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the actions menu is displayed for a row. | -| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | +| executeRowAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowActionEvent`](../../../lib/core/datatable/components/datatable/data-row-action.event.ts)`>` | Emitted when the user executes a row action. | +| rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/datatable/data/data-row-event.model.ts)`>` | Emitted when the user clicks a row. | +| rowDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/datatable/data/data-row-event.model.ts)`>` | Emitted when the user double-clicks a row. | +| showRowActionsMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the actions menu is displayed for a row. | +| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | ## Details ### Supplying data for the table The column layout and row data are supplied to the table using an object that implements the -[`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) interface. This interface hides the internal details of the class that provides +[`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) interface. This interface hides the internal details of the class that provides the data, which gives a lot of flexibility in how the data can be stored and accessed. The DataTable -library includes a standard adapter class called [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) that is useful in many -common cases. See the [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) for full details about the interface and the [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) class. +library includes a standard adapter class called [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts) that is useful in many +common cases. See the [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) for full details about the interface and the [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts) class. ### Customizing columns @@ -382,7 +384,7 @@ onRowClick(event) { } ``` -![](../docassets/images/datatable-dom-events.png) +![](../../docassets/images/datatable-dom-events.png) ### Card view @@ -395,7 +397,7 @@ Set the `display` property to "gallery" to enable Card View mode: + +``` + +Then, set the height of your datatable in its parent's container so that the datatable adapts to it (i.e. `height: 300px;` in the example below). You must also set the parent's +[`overflow-y`](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-y) attribute to `auto`. This will allow the list to scroll when +the total height of all rows exceeds the fixed height of the parent element. + +```html +
+ + +
+``` + +Once set up, the sticky header behaves as shown in the image below: + +![](../../docassets/images/datatable-sticky-header.png) + ## See also - [Data column component](data-column.component.md) - [Pagination component](pagination.component.md) -- [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) -- [Document list component](../content-services/document-list.component.md) +- [Data Table Adapter interface](../interfaces/datatable-adapter.interface.md) +- [Document list component](../../content-services/components/document-list.component.md) diff --git a/docs/core/empty-content.component.md b/docs/core/components/empty-content.component.md similarity index 84% rename from docs/core/empty-content.component.md rename to docs/core/components/empty-content.component.md index 9ff762d0dc..454a8c07ea 100644 --- a/docs/core/empty-content.component.md +++ b/docs/core/components/empty-content.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-02-01 --- -# [Empty Content Component](../../lib/core/templates/empty-content/empty-content.component.ts "Defined in empty-content.component.ts") +# [Empty Content Component](../../../lib/core/templates/empty-content/empty-content.component.ts "Defined in empty-content.component.ts") Provides a generic "Empty Content" placeholder for components. -![Favorites screen](../docassets/images/empty-content-favorites.png) +![Favorites screen](../../docassets/images/empty-content-favorites.png) ## Basic usage @@ -51,7 +51,7 @@ Provides a generic "Empty Content" placeholder for components. ``` -![Favorites screen](../docassets/images/empty-content-favorites.png) +![Favorites screen](../../docassets/images/empty-content-favorites.png) You can also use multiple lines instead of the subtitle section: @@ -68,7 +68,7 @@ You can also use multiple lines instead of the subtitle section: ``` -![Trashcan screen](../docassets/images/empty-content-trashcan.png) +![Trashcan screen](../../docassets/images/empty-content-trashcan.png) ## See also diff --git a/docs/core/empty-list.component.md b/docs/core/components/empty-list.component.md similarity index 82% rename from docs/core/empty-list.component.md rename to docs/core/components/empty-list.component.md index f427c0b525..0c4ef86dbf 100644 --- a/docs/core/empty-list.component.md +++ b/docs/core/components/empty-list.component.md @@ -4,11 +4,11 @@ Added: v2.0.0 Status: Active --- -# [Empty list component](../../lib/core/datatable/components/datatable/empty-list.component.ts "Defined in empty-list.component.ts") +# [Empty list component](../../../lib/core/datatable/components/datatable/empty-list.component.ts "Defined in empty-list.component.ts") Displays a message indicating that a list is empty. -![](../docassets/images/adf-empty-list.png) +![](../../docassets/images/adf-empty-list.png) ## Basic Usage @@ -25,7 +25,7 @@ Displays a message indicating that a list is empty. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can supply a custom header, body, and footer for an empty list using special sub-components: diff --git a/docs/core/error-content.component.md b/docs/core/components/error-content.component.md similarity index 84% rename from docs/core/error-content.component.md rename to docs/core/components/error-content.component.md index fd1816f654..08e89eb195 100644 --- a/docs/core/error-content.component.md +++ b/docs/core/components/error-content.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-09-13 --- -# [Error Content Component](../../lib/core/templates/error-content/error-content.component.ts "Defined in error-content.component.ts") +# [Error Content Component](../../../lib/core/templates/error-content/error-content.component.ts "Defined in error-content.component.ts") Displays info about a specific error. @@ -23,7 +23,7 @@ this.router.navigate(['/error', errorCode]); | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| errorCode | `string` | | Error code associated with this error. | +| errorCode | `string` | "UNKNOWN" | Error code associated with this error. | | returnButtonUrl | `string` | "/" | Target URL for the return button. | | secondaryButtonUrl | `string` | "report-issue" | Target URL for the secondary button. | diff --git a/docs/core/components/form-field.component.md b/docs/core/components/form-field.component.md new file mode 100644 index 0000000000..8c1b96959d --- /dev/null +++ b/docs/core/components/form-field.component.md @@ -0,0 +1,61 @@ +--- +Title: Form field component +Added: v2.0.0 +Status: Active +Last reviewed: 2018-11-20 +--- + +# [Form field component](../../../lib/core/form/components/form-field/form-field.component.ts "Defined in form-field.component.ts") + +Represents a UI field in a form. + +## Basic Usage + +All form field editors (aka widgets) on a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) are rendered by means of a [`FormFieldComponent`](../../core/components/form-field.component.md) +that takes an instance of a [`FormFieldModel`](../../core/models/form-field.model.md): + +```html + +``` + +This component depends on the [`FormRenderingService`](../../core/services/form-rendering.service.md) to map the [`FormFieldModel`](../../core/models/form-field.model.md) to a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Field UI component +based on the field type or the metadata information. + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| field | [`FormFieldModel`](../../core/models/form-field.model.md) | null | Contains all the necessary data needed to determine what UI Widget to use when rendering the field in the form. You would typically not create this data manually but instead create the form in APS and export it to get to all the [`FormFieldModel`](../../core/models/form-field.model.md) definitions. | + +## Details + +You would typically not use this component directly but instead use the `` component, which under the hood +uses `` components to render the form fields. + +### Field Type -> Form Field Component mappings + +Forms defined in APS have the following default mappings for the form fields: + +| _APS [Form](../../../lib/process-services/task-list/models/form.model.ts) Designer_ Widget | Field Type | Component Type | +| ------------------------------------------------------------------------------------------ | ---------- | -------------- | +| Text | text | [`TextWidgetComponent`](../../../lib/core/form/components/widgets/text/text.widget.ts) | +| Multi-line text | multi-line-text | [`MultilineTextWidgetComponentComponent`](../../../lib/core/form/components/widgets/multiline-text/multiline-text.widget.ts) | +| Number | integer | [`NumberWidgetComponent`](../../../lib/core/form/components/widgets/number/number.widget.ts) | +| Checkbox | boolean | [`CheckboxWidgetComponent`](../../../lib/core/form/components/widgets/checkbox/checkbox.widget.ts) | +| Date | date | [`DateWidgetComponent`](../../../lib/core/form/components/widgets/date/date.widget.ts) | +| Dropdown | dropdown | [`DropdownWidgetComponent`](../../../lib/core/form/components/widgets/dropdown/dropdown.widget.ts) | +| Typeahead | typeahead | [`TypeaheadWidgetComponent`](../../../lib/core/form/components/widgets/typeahead/typeahead.widget.ts) | +| Amount | amount | [`AmountWidgetComponent`](../../../lib/core/form/components/widgets/amount/amount.widget.ts) | +| Radio buttons | radio-buttons | [`RadioButtonsWidgetComponent`](../../../lib/core/form/components/widgets/radio-buttons/radio-buttons.widget.ts) | +| People | people | [`PeopleWidgetComponent`](../../../lib/core/form/components/widgets/people/people.widget.ts) | +| Group of people | functional-group | [`FunctionalGroupWidgetComponent`](../../../lib/core/form/components/widgets/functional-group/functional-group.widget.ts) | +| Dynamic table | dynamic-table | [`DynamicTableWidgetComponent`](../../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.ts) | +| Hyperlink | hyperlink | [`HyperlinkWidgetComponent`](../../../lib/core/form/components/widgets/hyperlink/hyperlink.widget.ts) | +| Header | group | [`ContainerWidgetComponent`](../../../lib/core/form/components/widgets/container/container.widget.ts) | +| Attach File | upload | AttachWidgetComponent or [`UploadWidgetComponent`](../../../lib/core/form/components/widgets/upload/upload.widget.ts) (based on metadata) | +| Display value | readonly | [`TextWidgetComponent`](../../../lib/core/form/components/widgets/text/text.widget.ts) | +| Display text | readonly-text | [`DisplayTextWidgetComponent`](../../../lib/core/form/components/widgets/display-text/display-text.widget.ts) | +| N/A | container | [`ContainerWidgetComponent`](../../../lib/core/form/components/widgets/container/container.widget.ts) (layout component) | +| N/A | N/A | [`UnknownWidgetComponent`](../../../lib/core/form/components/widgets/unknown/unknown.widget.ts) | diff --git a/docs/core/form-list.component.md b/docs/core/components/form-list.component.md similarity index 80% rename from docs/core/form-list.component.md rename to docs/core/components/form-list.component.md index a5b3999b63..837d00b3c9 100644 --- a/docs/core/form-list.component.md +++ b/docs/core/components/form-list.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Form List Component](../../lib/core/form/components/form-list.component.ts "Defined in form-list.component.ts") +# [Form List Component](../../../lib/core/form/components/form-list.component.ts "Defined in form-list.component.ts") Shows forms as a list. diff --git a/docs/core/form.component.md b/docs/core/components/form.component.md similarity index 76% rename from docs/core/form.component.md rename to docs/core/components/form.component.md index ed1263ab7f..dc5aa913d9 100644 --- a/docs/core/form.component.md +++ b/docs/core/components/form.component.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Form component](../../lib/core/form/components/form.component.ts "Defined in form.component.ts") +# [Form component](../../../lib/core/form/components/form.component.ts "Defined in form.component.ts") -Shows a [`Form`](../../lib/process-services/task-list/models/form.model.ts) from APS +Shows a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) from APS (See it live: [Form Quickstart](https://embed.plnkr.co/YSLXTqb3DtMhVJSqXKkE/)) @@ -34,7 +34,7 @@ Shows a [`Form`](../../lib/process-services/task-list/models/form.model.ts) from ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content in the body of `` will be shown when no form definition is found: @@ -54,11 +54,11 @@ Any content in the body of `` will be shown when no form definition is | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| data | [`FormValues`](../../lib/core/form/components/widgets/core/form-values.ts) | | Custom form values map to be used with the rendered form. | +| data | [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts) | | Custom form values map to be used with the rendered form. | | disableCompleteButton | `boolean` | false | If true then the `Complete` outcome button is shown but it will be disabled. | | disableStartProcessButton | `boolean` | false | If true then the `Start Process` outcome button is shown but it will be disabled. | -| fieldValidators | [`FormFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts)`[]` | \[] | Contains a list of form field validator instances. | -| form | [`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) | | Underlying [form model](../../lib/core/form/components/widgets/core/form.model.ts) instance. | +| fieldValidators | [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts)`[]` | \[] | Contains a list of form field validator instances. | +| form | [`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts) | | Underlying [form model](../../../lib/core/form/components/widgets/core/form.model.ts) instance. | | formId | `number` | | The id of the form definition to load and display with custom values. | | formName | `string` | | Name of the form definition to load and display with custom values. | | nameNode | `string` | | Name to assign to the new node where the metadata are stored. | @@ -79,17 +79,17 @@ Any content in the body of `` will be shown when no form definition is | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when any error occurs. | -| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | -| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | -| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when form content is clicked. | -| formDataRefreshed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when form values are refreshed due to a data property change. | -| formError | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormFieldModel`](../core/form-field.model.md)`[]>` | Emitted when the supplied form values have a validation error. | -| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | -| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | +| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | +| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | +| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when form content is clicked. | +| formDataRefreshed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when form values are refreshed due to a data property change. | +| formError | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormFieldModel`](../../core/models/form-field.model.md)`[]>` | Emitted when the supplied form values have a validation error. | +| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | +| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | ## Details -All `formXXX` events receive a [`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) instance as their argument: +All `formXXX` events receive a [`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts) instance as their argument: **MyView.component.html** @@ -178,7 +178,7 @@ The `nameNode` parameter is optional. ``` -Here, the node metadata is shown in an APS [Form,](../../lib/process-services/task-list/models/form.model.ts) +Here, the node metadata is shown in an APS [`Form`](../../../lib/process-services/task-list/models/form.model.ts) with the form fields themselves saved as metadata. The `nameNode` parameter is optional. ### Controlling outcome execution behaviour @@ -238,13 +238,13 @@ property. Each validator implements a check for a particular type of data (eg, a date validator might check that the date in the field falls between 1980 and 2017). ADF supplies a standard set of validators that handle most common cases but you can also implement your own custom validators to replace or extend the set. See the -[Form Field Validator](form-field-validator.interface.md) interface for full details and examples. +[Form Field Validator](../interfaces/form-field-validator.interface.md) interface for full details and examples. ### Common scenarios #### Rendering a form using form definition JSON -See the [demo-form](../docassets/demo-form.json) file for an example of form definition JSON. +See the [demo-form](../../docassets/demo-form.json) file for an example of form definition JSON. The component below (with the JSON assigned to the `formDefinitionJSON` property), shows how a form definition is rendered: @@ -279,7 +279,7 @@ could use this, say, to provide two alternative ways of entering the same inform up default values that can be edited. You can implement this in ADF using the `formFieldValueChanged` event of the -[Form service](form.service.md). For example, if you had a form with a dropdown widget (id: `type`) +[Form service](../services/form.service.md). For example, if you had a form with a dropdown widget (id: `type`) and a multiline text (id:`description`), you could synchronize their values as follows: ```ts @@ -301,11 +301,11 @@ to its `value` property. The result should look like the following: -![](../docassets/images/form-service-sample-01.png) +![](../../docassets/images/form-service-sample-01.png) #### Responding to all form events -Subscribe to the `formEvents` event of the [Form service](form.service.md) to get notification +Subscribe to the `formEvents` event of the [Form service](../services/form.service.md) to get notification of all form events: ```ts @@ -342,14 +342,14 @@ In the CSS, you can target any outcome ID and change the style as in this exampl } ``` -![](../docassets/images/form-style-sample.png) +![](../../docassets/images/form-style-sample.png) ### Alfresco Repositories APS configuration APS allows you to configure where to store files and folders in your on-site Alfresco repositories. If you have your repositories configured like this, you can use the attach file/folder -form widget to get a file from those repositories and attach it to the Form. +form widget to get a file from those repositories and attach it to the [`Form`](../../../lib/process-services/task-list/models/form.model.ts). **Note:** your repositories could be configured to be on different servers from the one where your front-end is deployed. Make sure you are using the right Proxy or configuration, @@ -357,14 +357,12 @@ otherwise you will get a cross-origin resource sharing (CORS) error. Also, don't forget to set the `providers` property to `ALL` in the `app.config.json` login configuration: -``` -"providers": "ALL", -``` + "providers": "ALL", ## See also -- [Form Field Validator interface](form-field-validator.interface.md) -- [Extensibility](../user-guide/extensibility.md) -- [Form rendering service](form-rendering.service.md) -- [Form field model](form-field.model.md) -- [Form service](form.service.md) +- [Form Field Validator interface](../interfaces/form-field-validator.interface.md) +- [Extensibility](../../user-guide/extensibility.md) +- [Form rendering service](../services/form-rendering.service.md) +- [Form field model](../models/form-field.model.md) +- [Form service](../services/form.service.md) diff --git a/docs/core/header.component.md b/docs/core/components/header.component.md similarity index 91% rename from docs/core/header.component.md rename to docs/core/components/header.component.md index 34f23330b8..1c63f5f0bd 100644 --- a/docs/core/header.component.md +++ b/docs/core/components/header.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Header component](../../lib/core/layout/components/header/header.component.ts "Defined in header.component.ts") +# [Header component](../../../lib/core/layout/components/header/header.component.ts "Defined in header.component.ts") Reusable header for Alfresco applications. @@ -21,7 +21,7 @@ Reusable header for Alfresco applications. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) The right-hand side of the header has free-form content that you supply in the body of the element: diff --git a/docs/core/host-settings.component.md b/docs/core/components/host-settings.component.md similarity index 86% rename from docs/core/host-settings.component.md rename to docs/core/components/host-settings.component.md index f6e2d74fa4..33618246b5 100644 --- a/docs/core/host-settings.component.md +++ b/docs/core/components/host-settings.component.md @@ -5,13 +5,13 @@ Status: Internal Last reviewed: 2019-01-16 --- -# [Host settings component](../../lib/core/settings/host-settings.component.ts "Defined in host-settings.component.ts") +# [Host settings component](../../../lib/core/settings/host-settings.component.ts "Defined in host-settings.component.ts") Validates the URLs for ACS and APS and saves them in the user's local storage **Note:** this is an internal component and is not meant to be used in production. -![Host settings](../docassets/images/host-settings-component.png) +![Host settings](../../docassets/images/host-settings-component.png) ## Basic Usage diff --git a/docs/core/icon.component.md b/docs/core/components/icon.component.md similarity index 90% rename from docs/core/icon.component.md rename to docs/core/components/icon.component.md index 69ee9e8ffe..7566c9aa74 100644 --- a/docs/core/icon.component.md +++ b/docs/core/components/icon.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-02-08 --- -# [Icon Component](../../lib/core/icon/icon.component.ts "Defined in icon.component.ts") +# [Icon Component](../../../lib/core/icon/icon.component.ts "Defined in icon.component.ts") Provides a universal way of rendering registered and named icons. @@ -71,7 +71,7 @@ In the HTML, you can now use the icon as shown below: ### Thumbnail Service -You can also reference the icons registered with the [Thumbnail Service](thumbnail.service.md) +You can also reference the icons registered with the [Thumbnail Service](../services/thumbnail.service.md) using the `adf:` namespace. ```html @@ -80,4 +80,4 @@ using the `adf:` namespace. ## See also -- [Thumbnail service](../core/thumbnail.service.md) +- [Thumbnail service](../services/thumbnail.service.md) diff --git a/docs/core/infinite-pagination.component.md b/docs/core/components/infinite-pagination.component.md similarity index 67% rename from docs/core/infinite-pagination.component.md rename to docs/core/components/infinite-pagination.component.md index 0490e5b969..790ed345fb 100644 --- a/docs/core/infinite-pagination.component.md +++ b/docs/core/components/infinite-pagination.component.md @@ -2,14 +2,14 @@ Title: Infinite Pagination component Added: v2.0.0 Status: Active -Last reviewed: 2019-02-08 +Last reviewed: 2019-03-20 --- -# [Infinite Pagination component](../../lib/core/pagination/infinite-pagination.component.ts "Defined in infinite-pagination.component.ts") +# [Infinite Pagination component](../../../lib/core/pagination/infinite-pagination.component.ts "Defined in infinite-pagination.component.ts") Adds "infinite" pagination to the component it is used with. -![Infinite Pagination screenshot](../docassets/images/InfPagination.png) +![Infinite Pagination screenshot](../../docassets/images/InfPagination.png) ## Basic Usage @@ -40,24 +40,24 @@ Adds "infinite" pagination to the component it is used with. | ---- | ---- | ------------- | ----------- | | isLoading | `boolean` | false | Is a new page loading? | | pageSize | `number` | | Number of items that are added with each "load more" event. | -| target | [`PaginatedComponent`](../../lib/core/pagination/paginated-component.interface.ts) | | Component that provides custom pagination support. | +| target | | | Component that provides custom pagination support. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| loadMore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`RequestPaginationModel`](../../lib/core/models/request-pagination.model.ts)`>` | Emitted when the "Load More" button is clicked. | +| loadMore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`RequestPaginationModel`](../../../lib/core/models/request-pagination.model.ts)`>` | Emitted when the "Load More" button is clicked. | ## Details -[`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) is the process of dividing a list into separate ranges or "pages" with a +[`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) is the process of dividing a list into separate ranges or "pages" with a certain number of items each. This allows a long list to be delivered in manageable pieces rather than all at once. "Infinite" pagination means that there is no upper limit on the number of items that can be displayed visually; a single page is shown initially but the user can extend the list one page at a time by clicking a "Load More" button. The `loadMore` event is emitted when the button is pressed. It is passed a -[`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) +[`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) parameter which contains the details of the current page (the start offset of the page within the list to be shown, whether there are more items left to show, etc). @@ -65,5 +65,5 @@ See the [Pagination component](pagination.component.md) for more information abo ## See also -- [Document list component](../content-services/document-list.component.md) +- [Document list component](../../content-services/components/document-list.component.md) - [Pagination component](pagination.component.md) diff --git a/docs/core/info-drawer-layout.component.md b/docs/core/components/info-drawer-layout.component.md similarity index 62% rename from docs/core/info-drawer-layout.component.md rename to docs/core/components/info-drawer-layout.component.md index fc72379864..6c8a72eb4c 100644 --- a/docs/core/info-drawer-layout.component.md +++ b/docs/core/components/info-drawer-layout.component.md @@ -5,15 +5,15 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Info drawer layout component](../../lib/core/info-drawer/info-drawer-layout.component.ts "Defined in info-drawer-layout.component.ts") +# [Info drawer layout component](../../../lib/core/info-drawer/info-drawer-layout.component.ts "Defined in info-drawer-layout.component.ts") Displays a sidebar-style information panel. -![Info drawer layout screenshot](../docassets/images/infodrawerlayout.png) +![Info drawer layout screenshot](../../docassets/images/infodrawerlayout.png) ## Basic usage -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) There are three regions where you can add your own content using `
` elements with the following names: @@ -42,8 +42,9 @@ with the following names: As the name suggests, this is basically just a layout with CSS styling. -See the [Info drawer layout component](../core/info-drawer-layout.component.md) for an alternative approach that uses tabs to structure the content of the info drawer. +See the [Info drawer tab component](info-drawer-tab.component.md) for an alternative approach that uses tabs to structure the content of the info drawer. ## See also - [Info drawer component](info-drawer.component.md) +- [Info drawer tab component](info-drawer-tab.component.md) diff --git a/docs/core/components/info-drawer-tab.component.md b/docs/core/components/info-drawer-tab.component.md new file mode 100644 index 0000000000..31707c6bb3 --- /dev/null +++ b/docs/core/components/info-drawer-tab.component.md @@ -0,0 +1,68 @@ +--- +Title: Info Drawer Tab component +Added: v2.4.0 +Status: Active +Last reviewed: 2018-06-08 +--- + +# [Info Drawer Tab component](../../../lib/core/info-drawer/info-drawer.component.ts "Defined in info-drawer.component.ts") + +Renders tabs in a [Info drawer component](info-drawer.component.md). + +![Info drawer screenshot](../../docassets/images/label-tab.png) + +## Basic usage + +Render a tab with label: + +```html + + + +
Tab1 content
+
+ + +
Tab2 content
+
+ +
+``` + +Render tab with icons instead of labels: + +```html + + + +
Tab1 content
+
+ + +
Tab2 content
+
+ +
+``` + +![Info drawer screenshot](../../docassets/images/icon-tab.png) + +You can also combine `icon` and `label` properties. + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| icon | `string` | null | Icon to render for the tab. | +| label | `string` | "" | The title of the tab. | + +## Details + +See the [Info drawer component](info-drawer.component.md) page for details of how to use this subcomponent. + +## See also + +- [Info drawer component](info-drawer.component.md) +- [Info drawer layout component](info-drawer-layout.component.md) diff --git a/docs/core/info-drawer.component.md b/docs/core/components/info-drawer.component.md similarity index 88% rename from docs/core/info-drawer.component.md rename to docs/core/components/info-drawer.component.md index f0dc390f26..49b2396d92 100644 --- a/docs/core/info-drawer.component.md +++ b/docs/core/components/info-drawer.component.md @@ -5,15 +5,15 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Info Drawer component](../../lib/core/info-drawer/info-drawer.component.ts "Defined in info-drawer.component.ts") +# [Info Drawer component](../../../lib/core/info-drawer/info-drawer.component.ts "Defined in info-drawer.component.ts") Displays a sidebar-style information panel with tabs. -![Info drawer screenshot](../docassets/images/activities-infodrawer.png) +![Info drawer screenshot](../../docassets/images/activities-infodrawer.png) ## Basic usage -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) There are three regions where you can add your own content using `
` elements with the following names (as with the [Info drawer layout component](info-drawer-layout.component.md)): diff --git a/docs/core/language-menu.component.md b/docs/core/components/language-menu.component.md similarity index 74% rename from docs/core/language-menu.component.md rename to docs/core/components/language-menu.component.md index 902d8b9f1f..1c1eab973d 100644 --- a/docs/core/language-menu.component.md +++ b/docs/core/components/language-menu.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-09 --- -# [Language Menu component](../../lib/core/language-menu/language-menu.component.ts "Defined in language-menu.component.ts") +# [Language Menu component](../../../lib/core/language-menu/language-menu.component.ts "Defined in language-menu.component.ts") Displays all the languages that are present in "app.config.json" and the default (EN). -![Language Menu screenshot](../docassets/images/languages-menu.png) +![Language Menu screenshot](../../docassets/images/languages-menu.png) ## Basic usage @@ -26,10 +26,10 @@ How to attach an ADF Language Menu as a main menu ## Details -Add a [Language Menu component](../core/language-menu.component.md) to let the +Add a [Language Menu component](language-menu.component.md) to let the user set the locale language for the app. For further information about the locale language, see the -[Internationalization](../user-guide/internationalization.md#how-the-display-language-is-selected) +[Internationalization](../../user-guide/internationalization.md#how-the-display-language-is-selected) page in the user guide. The component fetches the list of available languages from `app.config.json`: @@ -71,8 +71,8 @@ You can also attach the Language Menu as a nested menu: ``` -![Nested Language Menu screenshot](../docassets/images/languages-menu-nested.png) +![Nested Language Menu screenshot](../../docassets/images/languages-menu-nested.png) ## See Also -- [Internationalization](../user-guide/internationalization.md) +- [Internationalization](../../user-guide/internationalization.md) diff --git a/docs/core/login-dialog-panel.component.md b/docs/core/components/login-dialog-panel.component.md similarity index 53% rename from docs/core/login-dialog-panel.component.md rename to docs/core/components/login-dialog-panel.component.md index 3e87ab1fce..560f6250d9 100644 --- a/docs/core/login-dialog-panel.component.md +++ b/docs/core/components/login-dialog-panel.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-10-02 --- -# [Login Dialog Panel component](../../lib/core/login/components/login-dialog-panel.component.ts "Defined in login-dialog-panel.component.ts") +# [Login Dialog Panel component](../../../lib/core/login/components/login-dialog-panel.component.ts "Defined in login-dialog-panel.component.ts") Shows and manages a login dialog. @@ -15,13 +15,13 @@ Shows and manages a login dialog. | Name | Type | Description | | ---- | ---- | ----------- | -| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSuccessEvent`](../../lib/core/login/models/login-success.event.ts)`>` | Emitted when the login succeeds. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSuccessEvent`](../../../lib/core/login/models/login-success.event.ts)`>` | Emitted when the login succeeds. | ## Details -This component has similar features to the [Login Dialog component](../core/login-dialog.component.md) +This component has similar features to the [Login Dialog component](login-dialog.component.md) but it also creates and manages the dialog for you. ## See also -- [Login Dialog component](../core/login-dialog.component.md) +- [Login Dialog component](login-dialog.component.md) diff --git a/docs/core/login-dialog.component.md b/docs/core/components/login-dialog.component.md similarity index 78% rename from docs/core/login-dialog.component.md rename to docs/core/components/login-dialog.component.md index 9a668bb568..b46b3a71c6 100644 --- a/docs/core/login-dialog.component.md +++ b/docs/core/components/login-dialog.component.md @@ -5,20 +5,20 @@ Status: Active Last reviewed: 2018-10-02 --- -# [Login Dialog component](../../lib/core/login/components/login-dialog.component.ts "Defined in login-dialog.component.ts") +# [Login Dialog component](../../../lib/core/login/components/login-dialog.component.ts "Defined in login-dialog.component.ts") Allows a user to perform a login via a dialog. ## Details -The [Login Dialog component](../core/login-dialog.component.md) allows you to perform a login via a dialog. +The [Login Dialog component](login-dialog.component.md) allows you to perform a login via a dialog. ### Showing the dialog -Unlike most components, the [Login Dialog Component](../core/login-dialog.component.md) is typically shown in a dialog box +Unlike most components, the [Login Dialog Component](login-dialog.component.md) is typically shown in a dialog box rather than the main page and you are responsible for opening the dialog yourself. You can use the [Angular Material Dialog](https://material.angular.io/components/dialog/overview) for this, -as shown in the usage example. ADF provides the [`LoginDialogComponentData`](../../lib/core/login/components/login-dialog-component-data.interface.ts) interface +as shown in the usage example. ADF provides the [`LoginDialogComponentData`](../../../lib/core/login/components/login-dialog-component-data.interface.ts) interface to work with the Dialog's [data option](https://material.angular.io/components/dialog/overview#sharing-data-with-the-dialog-component-): @@ -40,7 +40,7 @@ The properties are described in the table below: If you don't want to manage the dialog yourself then it is easier to use the [Login Dialog Panel component](login-dialog-panel.component.md), or the -methods of the [Login Dialog service](login-dialog.service.md), which create +methods of the [Login Dialog service](../services/login-dialog.service.md), which create the dialog for you. ### Usage example @@ -81,7 +81,7 @@ openLoginDialog() { } ``` -All the results will be streamed to the logged [subject](http://reactivex.io/rxjs/manual/overview.html#subject) present in the [`LoginDialogComponentData`](../../lib/core/login/components/login-dialog-component-data.interface.ts) object passed to the dialog. +All the results will be streamed to the logged [subject](http://reactivex.io/rxjs/manual/overview.html#subject) present in the [`LoginDialogComponentData`](../../../lib/core/login/components/login-dialog-component-data.interface.ts) object passed to the dialog. When the dialog action is selected by clicking, the `data.logged` stream will be completed. ## See also diff --git a/docs/core/login.component.md b/docs/core/components/login.component.md similarity index 85% rename from docs/core/login.component.md rename to docs/core/components/login.component.md index a8c0870fc3..bdfb5f3847 100644 --- a/docs/core/login.component.md +++ b/docs/core/components/login.component.md @@ -2,14 +2,14 @@ Title: Login component Added: v2.0.0 Status: Active -Last reviewed: 2019-02-06 +Last reviewed: 2019-03-20 --- -# [Login component](../../lib/core/login/components/login.component.ts "Defined in login.component.ts") +# [Login component](../../../lib/core/login/components/login.component.ts "Defined in login.component.ts") Authenticates to Alfresco Content Services and Alfresco Process Services. -![Login component](../docassets/images/login-extra-content.png) +![Login component](../../docassets/images/login-extra-content.png) ## Contents @@ -36,9 +36,9 @@ Authenticates to Alfresco Content Services and Alfresco Process Services. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) -You can replace the content of the header and footer of the [Login component](../core/login.component.md) with your own custom content: +You can replace the content of the header and footer of the [Login component](login.component.md) with your own custom content: ```html @@ -49,11 +49,11 @@ You can replace the content of the header and footer of the [Login component](.. Header: -![Login with custom header](../docassets/images/custom-header.png) +![Login with custom header](../../docassets/images/custom-header.png) Footer: -![Login with custom footer](../docassets/images/custom-footer.png) +![Login with custom footer](../../docassets/images/custom-footer.png) Also, any content that you put inside the `` tags will be rendered as part of the Login dialog: @@ -69,7 +69,7 @@ of the Login dialog: This is useful if you need to extend the functionality of the dialog with custom input fields handled by your application or parent component: -![Login with custom content](../docassets/images/login-extra-content.png) +![Login with custom content](../../docassets/images/login-extra-content.png) ## Class members @@ -91,9 +91,9 @@ with custom input fields handled by your application or parent component: | Name | Type | Description | | ---- | ---- | ----------- | -| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginErrorEvent`](../../lib/core/login/models/login-error.event.ts)`>` | Emitted when the login fails. | -| executeSubmit | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSubmitEvent`](../../lib/core/login/models/login-submit.event.ts)`>` | Emitted when the login form is submitted. | -| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSuccessEvent`](../../lib/core/login/models/login-success.event.ts)`>` | Emitted when the login is successful. | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginErrorEvent`](../../../lib/core/login/models/login-error.event.ts)`>` | Emitted when the login fails. | +| executeSubmit | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSubmitEvent`](../../../lib/core/login/models/login-submit.event.ts)`>` | Emitted when the login form is submitted. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`LoginSuccessEvent`](../../../lib/core/login/models/login-success.event.ts)`>` | Emitted when the login is successful. | ## Details @@ -135,7 +135,7 @@ You can change the logo and background images using the `backgroundImageUrl` and ``` -![Login with custom logo and background](../docassets/images/custom-login.png) +![Login with custom logo and background](../../docassets/images/custom-login.png) You can also bind to your component properties and provide values dynamically if you need to: @@ -256,8 +256,7 @@ export class MyCustomLogin { // check if the username is in the blacklist if (values.controls['username'].value === 'invalidUsername') { - this.alfrescoLogin.addCustomFormError('username', 'the - username is in blacklist'); + this.alfrescoLogin.addCustomFormError('username', 'the username is in blacklist'); event.preventDefault(); } } @@ -273,7 +272,7 @@ will execute _after_ your custom code has completed. #### Implicit Flow If you used the host-setting component to enable SSO Oauth (or if you -enabled the setting in `app.config.json`) then the [login component](../core/login.component.md) will show only a button to login: +enabled the setting in `app.config.json`) then the [login component](login.component.md) will show only a button to login: ```JSON { @@ -292,7 +291,7 @@ enabled the setting in `app.config.json`) then the [login component](../core/log } ``` -![Login component](../docassets/images/sso-login.png) +![Login component](../../docassets/images/sso-login.png) Note that if the `silentLogin` property in the `oauth2` configuration is set to true then the login page will not be shown. Instead, the application will redirect @@ -300,11 +299,10 @@ automatically to the authorization server when the user is not logged-in #### Silent login -You can also enable automatic redirection to OAuth provider -by utilising the following properties: +You can also enable automatic redirection to the OAuth provider using the following properties: -- silentLogin -- redirectSilentIframeUri +- `silentLogin` +- `redirectSilentIframeUri` ```json { @@ -323,8 +321,8 @@ by utilising the following properties: }, ``` -Please note that if you deploy the application to a virtual folder, -for example `http://
/my-app`, then `redirectSilentIframeUri` +Note that if you deploy the application to a virtual folder +(for example `http://
/my-app`) then `redirectSilentIframeUri` must contain the full URI value: ```json @@ -350,4 +348,4 @@ Setting the `withCredentials` property to true in the `auth` section of ## See Also -- [Logout directive](logout.directive.md) +- [Logout directive](../directives/logout.directive.md) diff --git a/docs/core/pagination.component.md b/docs/core/components/pagination.component.md similarity index 57% rename from docs/core/pagination.component.md rename to docs/core/components/pagination.component.md index 1d07f8dbca..1b58c4727e 100644 --- a/docs/core/pagination.component.md +++ b/docs/core/components/pagination.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Pagination Component](../../lib/core/pagination/pagination.component.ts "Defined in pagination.component.ts") +# [Pagination Component](../../../lib/core/pagination/pagination.component.ts "Defined in pagination.component.ts") Adds pagination to the component it is used with. -![](../docassets/images/basic.png) +![](../../docassets/images/basic.png) ## Contents @@ -42,26 +42,26 @@ Adds pagination to the component it is used with. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| pagination | [`PaginationModel`](../../lib/core/models/pagination.model.ts) | | [Pagination](../../lib/content-services/document-list/models/document-library.model.ts) object. | +| pagination | [`PaginationModel`](../../../lib/core/models/pagination.model.ts) | | Pagination object. | | supportedPageSizes | `number[]` | | An array of page sizes. | -| target | [`PaginatedComponent`](../../lib/core/pagination/paginated-component.interface.ts) | | Component that provides custom pagination support. | +| target | [`PaginatedComponent`](../../../lib/core/pagination/paginated-component.interface.ts) | | Component that provides custom pagination support. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| change | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../lib/core/models/pagination.model.ts)`>` | Emitted when pagination changes in any way. | -| changePageNumber | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../lib/core/models/pagination.model.ts)`>` | Emitted when the page number changes. | -| changePageSize | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../lib/core/models/pagination.model.ts)`>` | Emitted when the page size changes. | -| nextPage | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../lib/core/models/pagination.model.ts)`>` | Emitted when the next page is requested. | -| prevPage | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../lib/core/models/pagination.model.ts)`>` | Emitted when the previous page is requested. | +| change | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../../lib/core/models/pagination.model.ts)`>` | Emitted when pagination changes in any way. | +| changePageNumber | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../../lib/core/models/pagination.model.ts)`>` | Emitted when the page number changes. | +| changePageSize | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../../lib/core/models/pagination.model.ts)`>` | Emitted when the page size changes. | +| nextPage | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../../lib/core/models/pagination.model.ts)`>` | Emitted when the next page is requested. | +| prevPage | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PaginationModel`](../../../lib/core/models/pagination.model.ts)`>` | Emitted when the previous page is requested. | ## Details -You can use the [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) component to add pagination features to other components. The Alfresco +You can use the [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) component to add pagination features to other components. The Alfresco APIs make use of pagination to reduce the amount of data transferred in a single call. The start offset and number of items in the page are passed during the call. The items of interest will be -returned along with a [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) object. You can use this object to set up the [pagination component](../core/pagination.component.md) +returned along with a [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) object. You can use this object to set up the [pagination component](pagination.component.md) and then subscribe to one of the page change events. This will return updated pagination data that you can pass to a subsequent API call. @@ -69,7 +69,7 @@ Each event corresponds to a particular action from the user. For the `change` ev PaginationQueryParams object is returned. This contains the query parameters supported by the REST API, `skipCount` and `maxItems`. -For all events other than `change`, a new [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) object is returned as in the following example. The +For all events other than `change`, a new [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) object is returned as in the following example. The new object contains updated properties that you can use to fetch the next page of information. ### Integrating with the Document List component @@ -84,7 +84,7 @@ new object contains updated properties that you can use to fetch the next page o ### Custom pagination The component also makes it easy to integrate your own implementation of pagination. -You can supply any component that implements the [`PaginatedComponent`](../../lib/core/pagination/paginated-component.interface.ts) interface as the value of the +You can supply any component that implements the [`PaginatedComponent`](../../../lib/core/pagination/paginated-component.interface.ts) interface as the value of the `target` property. ```js @@ -96,8 +96,8 @@ export interface PaginatedComponent { } ``` -Your component must provide a `pagination` subject to allow the [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) component to respond to changes. -Every time user interacts with the [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) component, it will call the `updatePagination` method +Your component must provide a `pagination` subject to allow the [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) component to respond to changes. +Every time user interacts with the [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) component, it will call the `updatePagination` method and pass the updated parameters. ## See also diff --git a/docs/core/sidebar-action-menu.component.md b/docs/core/components/sidebar-action-menu.component.md similarity index 74% rename from docs/core/sidebar-action-menu.component.md rename to docs/core/components/sidebar-action-menu.component.md index 83904b57c3..aac06d52a4 100644 --- a/docs/core/sidebar-action-menu.component.md +++ b/docs/core/components/sidebar-action-menu.component.md @@ -5,16 +5,16 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Sidebar action menu component](../../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts "Defined in sidebar-action-menu.component.ts") +# [Sidebar action menu component](../../../lib/core/layout/components/sidebar-action/sidebar-action-menu.component.ts "Defined in sidebar-action-menu.component.ts") Displays a sidebar-action menu information panel. -![Sidebar action menu button screenshot](../docassets/images/sidebar-action-menu-button.png) -![Sidebar action menu icon screenshot](../docassets/images/sidebar-action-menu-icon.png) +![Sidebar action menu button screenshot](../../docassets/images/sidebar-action-menu-button.png) +![Sidebar action menu icon screenshot](../../docassets/images/sidebar-action-menu-icon.png) ## Basic usage -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) There are three regions where you can add your own content in `
` elements with the following names: diff --git a/docs/core/sidenav-layout.component.md b/docs/core/components/sidenav-layout.component.md similarity index 93% rename from docs/core/sidenav-layout.component.md rename to docs/core/components/sidenav-layout.component.md index 04d199bb73..12c571a1e2 100644 --- a/docs/core/sidenav-layout.component.md +++ b/docs/core/components/sidenav-layout.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Sidenav Layout component](../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts "Defined in sidenav-layout.component.ts") +# [Sidenav Layout component](../../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.ts "Defined in sidenav-layout.component.ts") Displays the standard three-region ADF application layout. -![Sidenav on desktop](../docassets/images/sidenav-layout.png) +![Sidenav on desktop](../../docassets/images/sidenav-layout.png) ## Contents @@ -25,7 +25,7 @@ Displays the standard three-region ADF application layout. ## Basic Usage -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) The content for the header, navigation area, and main content are transcluded using three special sub-components (note the use of `` in the sub-components' body sections): @@ -104,11 +104,11 @@ in the usage example above. Desktop layout (screen width greater than the `stepOver` value): -![Sidenav on desktop](../docassets/images/sidenav-layout.png) +![Sidenav on desktop](../../docassets/images/sidenav-layout.png) Mobile layout (screen width less than the `stepOver` value): -![Sidenav on mobile](../docassets/images/sidenav-layout-mobile.png) +![Sidenav on mobile](../../docassets/images/sidenav-layout-mobile.png) ### Template context diff --git a/docs/core/sorting-picker.component.md b/docs/core/components/sorting-picker.component.md similarity index 76% rename from docs/core/sorting-picker.component.md rename to docs/core/components/sorting-picker.component.md index 21286e5a05..8c1a20d787 100644 --- a/docs/core/sorting-picker.component.md +++ b/docs/core/components/sorting-picker.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Sorting Picker Component](../../lib/core/sorting-picker/sorting-picker.component.ts "Defined in sorting-picker.component.ts") +# [Sorting Picker Component](../../../lib/core/sorting-picker/sorting-picker.component.ts "Defined in sorting-picker.component.ts") Selects from a set of predefined sorting definitions and directions. -![Sorting Picker](../docassets/images/sorting-picker.png) +![Sorting Picker](../../docassets/images/sorting-picker.png) ## Basic Usage @@ -36,7 +36,8 @@ Selects from a set of predefined sorting definitions and directions. | Name | Type | Description | | ---- | ---- | ----------- | -| change | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Raised each time sorting key or direction gets changed. | +| sortingChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Raised each time direction gets changed. | +| valueChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Raised each time sorting key gets changed. | ## Details diff --git a/docs/core/start-form.component.md b/docs/core/components/start-form.component.md similarity index 57% rename from docs/core/start-form.component.md rename to docs/core/components/start-form.component.md index 37dd9c9ab8..75c5488137 100644 --- a/docs/core/start-form.component.md +++ b/docs/core/components/start-form.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Start Form component](../../lib/core/form/components/start-form.component.ts "Defined in start-form.component.ts") +# [Start Form component](../../../lib/core/form/components/start-form.component.ts "Defined in start-form.component.ts") -Displays the Start [`Form`](../../lib/process-services/task-list/models/form.model.ts) for a process. +Displays the Start [`Form`](../../../lib/process-services/task-list/models/form.model.ts) for a process. -![Start Form screenshot](../docassets/images/ProcessStartForm.png) +![Start Form screenshot](../../docassets/images/ProcessStartForm.png) ## Basic Usage @@ -26,12 +26,12 @@ Displays the Start [`Form`](../../lib/process-services/task-list/models/form.mod | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| data | [`FormValues`](../../lib/core/form/components/widgets/core/form-values.ts) | | Custom form values map to be used with the rendered form. | +| data | [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts) | | Custom form values map to be used with the rendered form. | | disableCompleteButton | `boolean` | false | If true then the `Complete` outcome button is shown but it will be disabled. | | disableStartProcessButton | `boolean` | false | If true then the `Start Process` outcome button is shown but it will be disabled. | -| fieldValidators | [`FormFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts)`[]` | \[] | Contains a list of form field validator instances. | -| form | [`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) | | Underlying [form model](../../lib/core/form/components/widgets/core/form.model.ts) instance. | -| formId | `string` | | The id of the form definition to load and display with custom values. | +| fieldValidators | [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts)`[]` | \[] | Contains a list of form field validator instances. | +| form | [`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts) | | Underlying [form model](../../../lib/core/form/components/widgets/core/form.model.ts) instance. | +| formId | `number` | | The id of the form definition to load and display with custom values. | | formName | `string` | | Name of the form definition to load and display with custom values. | | nameNode | `string` | | Name to assign to the new node where the metadata are stored. | | nodeId | `string` | | Content Services node ID for the form metadata. | @@ -54,27 +54,27 @@ Displays the Start [`Form`](../../lib/process-services/task-list/models/form.mod | Name | Type | Description | | ---- | ---- | ----------- | -| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | -| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | -| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when a field of the form is clicked. | -| formDataRefreshed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when form values are refreshed due to a data property change. | -| formError | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormFieldModel`](../core/form-field.model.md)`[]>` | Emitted when the supplied form values have a validation error. | -| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | -| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when any error occurs. | +| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | +| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | +| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when a field of the form is clicked. | +| formDataRefreshed | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when form values are refreshed due to a data property change. | +| formError | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormFieldModel`](../../core/models/form-field.model.md)`[]>` | Emitted when the supplied form values have a validation error. | +| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | +| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | | outcomeClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the user clicks one of the outcome buttons that completes the form. | ## Details -The [Start Process component](../process-services/start-process.component.md) uses the Start [`Form`](../../lib/process-services/task-list/models/form.model.ts) component +The [Start Process component](../../process-services/components/start-process.component.md) uses the Start [`Form`](../../../lib/process-services/task-list/models/form.model.ts) component to display the [start form](http://docs.alfresco.com/process-services1.6/topics/none_start_event.html) for the process. The `outcomeClick` event is passed a string containing the ID of the outcome button that the user clicked. You can pass this value to the `startProcess` method (defined in the -[Process service](../process-services/process.service.md)) when activating the process, if necessary. +[Process service](../../process-services/services/process.service.md)) when activating the process, if necessary. ## See also -- [Process service](../process-services/process.service.md) +- [Process service](../../process-services/services/process.service.md) diff --git a/docs/core/text-mask.component.md b/docs/core/components/text-mask.component.md similarity index 94% rename from docs/core/text-mask.component.md rename to docs/core/components/text-mask.component.md index 712fdc3aa4..f9cf465d84 100644 --- a/docs/core/text-mask.component.md +++ b/docs/core/components/text-mask.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Text Mask directive](../../lib/core/form/components/widgets/text/text-mask.component.ts "Defined in text-mask.component.ts") +# [Text Mask directive](../../../lib/core/form/components/widgets/text/text-mask.component.ts "Defined in text-mask.component.ts") Implements text field input masks. diff --git a/docs/core/toolbar-divider.component.md b/docs/core/components/toolbar-divider.component.md similarity index 77% rename from docs/core/toolbar-divider.component.md rename to docs/core/components/toolbar-divider.component.md index 84507d6792..7e139f12c9 100644 --- a/docs/core/toolbar-divider.component.md +++ b/docs/core/components/toolbar-divider.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Toolbar Divider Component](../../lib/core/toolbar/toolbar-divider.component.ts "Defined in toolbar-divider.component.ts") +# [Toolbar Divider Component](../../../lib/core/toolbar/toolbar-divider.component.ts "Defined in toolbar-divider.component.ts") Divides groups of elements in a Toolbar with a visual separator. diff --git a/docs/core/toolbar-title.component.md b/docs/core/components/toolbar-title.component.md similarity index 65% rename from docs/core/toolbar-title.component.md rename to docs/core/components/toolbar-title.component.md index 06858372ac..c73f3129e6 100644 --- a/docs/core/toolbar-title.component.md +++ b/docs/core/components/toolbar-title.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Toolbar Title Component](../../lib/core/toolbar/toolbar-title.component.ts "Defined in toolbar-title.component.ts") +# [Toolbar Title Component](../../../lib/core/toolbar/toolbar-title.component.ts "Defined in toolbar-title.component.ts") -Supplies custom HTML to be included in a [Toolbar component](../core/toolbar.component.md) title. +Supplies custom HTML to be included in a [Toolbar component](toolbar.component.md) title. -![](../docassets/images/adf-toolbar-02.png) +![](../../docassets/images/adf-toolbar-02.png) ## Basic Usage diff --git a/docs/core/toolbar.component.md b/docs/core/components/toolbar.component.md similarity index 83% rename from docs/core/toolbar.component.md rename to docs/core/components/toolbar.component.md index d13ca499db..5324689a17 100644 --- a/docs/core/toolbar.component.md +++ b/docs/core/components/toolbar.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Toolbar Component](../../lib/core/toolbar/toolbar.component.ts "Defined in toolbar.component.ts") +# [Toolbar Component](../../../lib/core/toolbar/toolbar.component.ts "Defined in toolbar.component.ts") Simple container for headers, titles, actions and breadcrumbs. -![](../docassets/images/adf-toolbar-01.png) +![](../../docassets/images/adf-toolbar-01.png) ## Contents @@ -35,7 +35,7 @@ Simple container for headers, titles, actions and breadcrumbs. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can set the title content using an `` element (although you can also set a simple textual title with the `title` attribute). @@ -63,10 +63,10 @@ toolbar: ``` For example, the image below shows a toolbar with a -[Breadcrumb component](../content-services/breadcrumb.component.md) title, and then some buttons +[Breadcrumb component](../../content-services/components/breadcrumb.component.md) title, and then some buttons pushed to the right by a spacer: -![](../docassets/images/adf-toolbar-02.png) +![](../../docassets/images/adf-toolbar-02.png) ## Class members @@ -109,27 +109,27 @@ but you could also use your own custom menu components: ``` -![](../docassets/images/adf-toolbar-03.png) +![](../../docassets/images/adf-toolbar-03.png) With the menu set up like this, you would see the following menu items as defined earlier when you click the menu button: -![](../docassets/images/adf-toolbar-04.png) +![](../../docassets/images/adf-toolbar-04.png) ### Custom color Besides the default color you can use 'primary', 'accent', or 'warn' values: You might also want to change colors to follow your application's color -[theme](../user-guide/theming.md): +[theme](../../user-guide/theming.md): For example: -![](../docassets/images/adf-toolbar-05.png) +![](../../docassets/images/adf-toolbar-05.png) -![](../docassets/images/adf-toolbar-06.png) +![](../../docassets/images/adf-toolbar-06.png) -![](../docassets/images/adf-toolbar-07.png) +![](../../docassets/images/adf-toolbar-07.png) ## See also diff --git a/docs/core/user-info.component.md b/docs/core/components/user-info.component.md similarity index 91% rename from docs/core/user-info.component.md rename to docs/core/components/user-info.component.md index 8e3f509558..3e7668170e 100644 --- a/docs/core/user-info.component.md +++ b/docs/core/components/user-info.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [User Info component](../../lib/core/userinfo/components/user-info.component.ts "Defined in user-info.component.ts") +# [User Info component](../../../lib/core/userinfo/components/user-info.component.ts "Defined in user-info.component.ts") Shows user information. diff --git a/docs/core/viewer.component.md b/docs/core/components/viewer.component.md similarity index 88% rename from docs/core/viewer.component.md rename to docs/core/components/viewer.component.md index fec04343fa..867edd47a8 100644 --- a/docs/core/viewer.component.md +++ b/docs/core/components/viewer.component.md @@ -2,10 +2,10 @@ Title: Viewer component Added: v2.0.0 Status: Active -Last reviewed: 2019-01-16 +Last reviewed: 2019-03-25 --- -# [Viewer component](../../lib/core/viewer/components/viewer.component.ts "Defined in viewer.component.ts") +# [Viewer component](../../../lib/core/viewer/components/viewer.component.ts "Defined in viewer.component.ts") Displays content from an ACS repository. @@ -24,7 +24,7 @@ See it live: [Viewer Quickstart](https://embed.plnkr.co/iTuG1lFIXfsP95l6bDW6/) - [Custom file parameters](#custom-file-parameters) - [Supported file formats](#supported-file-formats) - [Content Renditions](#content-renditions) - - [Configuring PDF.js library](#configuring-pdfjs-library) + - [Configuring PDF.js library](#configuring-pdf-js-library) - [Extending the Viewer](#extending-the-viewer) - [Custom layout](#custom-layout) - [Printing](#printing) @@ -64,9 +64,9 @@ Note that if you have a URL which contains a shared link ID, you should extract ID portion and use it with the `sharedLinkId` property rather than using the whole URL with `urlFile`. -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) -The [Viewer component](../core/viewer.component.md) lets you transclude content for the toolbar (and toolbar buttons), +The [Viewer component](viewer.component.md) lets you transclude content for the toolbar (and toolbar buttons), the sidebar, thumbnails, and the "Open with" and "More actions" menus. See the [Custom layout](#custom-layout) section for full details of all available tranclusions. @@ -109,11 +109,11 @@ See the [Custom layout](#custom-layout) section for full details of all availabl | Name | Type | Description | | ---- | ---- | ----------- | | extensionChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the filename extension changes. | -| goBack | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`BaseEvent`](../../lib/core/events/base.event.ts)`>` | Emitted when user clicks the 'Back' button. | +| goBack | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`BaseEvent`](../../../lib/core/events/base.event.ts)`>` | Emitted when user clicks the 'Back' button. | | invalidSharedLink | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the shared link used is not valid. | | navigateBefore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Before' ("<") button. | | navigateNext | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Next' (">") button. | -| print | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`BaseEvent`](../../lib/core/events/base.event.ts)`>` | Emitted when user clicks the 'Print' button. | +| print | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`BaseEvent`](../../../lib/core/events/base.event.ts)`>` | Emitted when user clicks the 'Print' button. | | showViewerChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the viewer is shown or hidden. | ## Keyboard shortcuts @@ -130,7 +130,7 @@ See the [Custom layout](#custom-layout) section for full details of all availabl ### Integrating with the Document List component Below is the most simple integration of the Viewer and -[Document List](../content-services/document-list.component.md) components within your custom component: +[Document List](../../content-services/components/document-list.component.md) components within your custom component: ```html ``` -![Open with](../docassets/images/viewer-open-with.png) +![Open with](../../docassets/images/viewer-open-with.png) #### Custom "More actions" menu @@ -465,7 +465,7 @@ You can enable a custom "More actions" menu by providing at least one action ins ``` -![More actions](../docassets/images/viewer-more-actions.png) +![More actions](../../docassets/images/viewer-more-actions.png) ### Printing @@ -484,4 +484,4 @@ content. ## See also -- [Document List component](../content-services/document-list.component.md) +- [Document List component](../../content-services/components/document-list.component.md) diff --git a/docs/core/node-permission.directive.md b/docs/core/directives/check-allowable-operation.directive.md similarity index 70% rename from docs/core/node-permission.directive.md rename to docs/core/directives/check-allowable-operation.directive.md index 7bc898b462..34cf3155a5 100644 --- a/docs/core/node-permission.directive.md +++ b/docs/core/directives/check-allowable-operation.directive.md @@ -1,11 +1,11 @@ --- -Title: Node Permission directive +Title: Check Allowable Operation directive Added: v2.0.0 Status: Active -Last reviewed: 2018-11-20 +Last reviewed: 2019-02-13 --- -# [Node Permission directive](../../lib/core/directives/node-permission.directive.ts "Defined in node-permission.directive.ts") +# [Check Allowable Operation directive](../../../lib/core/directives/check-allowable-operation.directive.ts "Defined in check-allowable-operation.directive.ts") Selectively disables an HTML element or Angular component. @@ -17,7 +17,7 @@ Selectively disables an HTML element or Angular component. - [Details](#details) - [HTML element example](#html-element-example) - [Angular component example](#angular-component-example) - - [Implementing the NodePermissionSubject interface](#implementing-the-nodepermissionsubject-interface) + - [Implementing the NodeAllowableOperationSubject interface](#implementing-the-nodeallowableoperationsubject-interface) - [Defining your component as an EXTENDIBLE_COMPONENT parent component](#defining-your-component-as-an-extendible_component-parent-component) ## Basic Usage @@ -47,7 +47,7 @@ Selectively disables an HTML element or Angular component. ## Details -The [Node Permission directive](../core/node-permission.directive.md) lets you disable an HTML element or Angular component +The [Check Allowable Operation Directive](check-allowable-operation.directive.md) lets you disable an HTML element or Angular component by taking a collection of [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md) instances and checking their permissions. The decorated element will be disabled if: @@ -57,10 +57,9 @@ The decorated element will be disabled if: ### HTML element example -A typical use case is to bind a [Document List](../content-services/document-list.component.md) +A typical use case is to bind a [Document List](../../content-services/components/document-list.component.md) selection property to a toolbar button. In the following example, the "Delete" button should -be disabled if no selection is present or if user does not have permission to delete at least one -node in the selection: +be disabled if no selection is present or if user does not have permission to delete at least one node in the selection: ```html @@ -81,8 +80,8 @@ one or more documents that they have permission to delete. ### Angular component example -You can add the directive to any Angular component that implements the [`NodePermissionSubject`](../../lib/core/directives/node-permission.directive.ts) -interface (the [Upload Drag Area component](../content-services/upload-drag-area.component.md), +You can add the directive to any Angular component that implements the [`NodeAllowableOperationSubject`](../../../lib/core/directives/check-allowable-operation.directive.ts) +interface (the [Upload Drag Area component](../../content-services/components/upload-drag-area.component.md), for example). You can also use it in much the same way as you would with an HTML element: ```html @@ -96,21 +95,21 @@ for example). You can also use it in much the same way as you would with an HTML ``` To enable your own component to work with this directive, you need to implement the -[`NodePermissionSubject`](../../lib/core/directives/node-permission.directive.ts) interface and also define it as an -[`EXTENDIBLE_COMPONENT`](../../lib/core/interface/injection.tokens.ts) +[`NodeAllowableOperationSubject`](../../../lib/core/directives/check-allowable-operation.directive.ts) interface and also define it as an +[`EXTENDIBLE_COMPONENT`](../../../lib/core/interface/injection.tokens.ts) parent component, as described in the following sections. -### Implementing the NodePermissionSubject interface +### Implementing the NodeAllowableOperationSubject interface -The component must implement the [`NodePermissionSubject`](../../lib/core/directives/node-permission.directive.ts) interface which means it must have a +The component must implement the [`NodeAllowableOperationSubject`](../../../lib/core/directives/check-allowable-operation.directive.ts) interface which means it must have a boolean `disabled` property. This is the property that will be set by the directive: ```js import { NodePermissionSubject } from '@alfresco/adf-core'; @Component({...}) -export class UploadDragAreaComponent implements NodePermissionSubject { +export class UploadDragAreaComponent implements NodeAllowableOperationSubject { public disabled: boolean = false; } ``` @@ -122,7 +121,7 @@ up to the `@Host()` component. The host component is typically the component tha the dependency. However, when this component is projected into a parent component, the parent becomes the host. This means you must provide your component with forward referencing as the -[`EXTENDIBLE_COMPONENT`](../../lib/core/interface/injection.tokens.ts) +[`EXTENDIBLE_COMPONENT`](../../../lib/core/interface/injection.tokens.ts) and also provide your component as a `viewProvider`: ```js @@ -134,8 +133,7 @@ import { EXTENDIBLE_COMPONENT } from '@alfresco/adf-core'; { provide: EXTENDIBLE_COMPONENT, useExisting: forwardRef(() => UploadDragAreaComponent)} ] }) -export class UploadDragAreaComponent implements NodePermissionSubject { ... } +export class UploadDragAreaComponent implements NodeAllowableOperationSubject { ... } ``` -**Note:** the usage of **viewProviders** (instead of **providers**) is very important, especially -if you want to use this directive on a transcluded component. +**Note:** the usage of **viewProviders** (instead of **providers**) is very important, especially if you want to use this directive on a transcluded component. diff --git a/docs/core/context-menu.directive.md b/docs/core/directives/context-menu.directive.md similarity index 77% rename from docs/core/context-menu.directive.md rename to docs/core/directives/context-menu.directive.md index 2060580d76..008eefecfc 100644 --- a/docs/core/context-menu.directive.md +++ b/docs/core/directives/context-menu.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Context Menu directive](../../lib/core/context-menu/context-menu.directive.ts "Defined in context-menu.directive.ts") +# [Context Menu directive](../../../lib/core/context-menu/context-menu.directive.ts "Defined in context-menu.directive.ts") Adds a context menu to a component. @@ -54,5 +54,5 @@ export class MyComponent implements OnInit { ## Details -See the [Demo Shell](../../demo-shell/README.md) -or [Document List component](../content-services/document-list.component.md) implementation for more details and use cases. +See the [Demo Shell](../../../demo-shell/README.md) +or [Document List component](../../content-services/components/document-list.component.md) implementation for more details and use cases. diff --git a/docs/core/highlight.directive.md b/docs/core/directives/highlight.directive.md similarity index 88% rename from docs/core/highlight.directive.md rename to docs/core/directives/highlight.directive.md index 55fa3d27ca..b877284716 100644 --- a/docs/core/highlight.directive.md +++ b/docs/core/directives/highlight.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Highlight directive](../../lib/core/directives/highlight.directive.ts "Defined in highlight.directive.ts") +# [Highlight directive](../../../lib/core/directives/highlight.directive.ts "Defined in highlight.directive.ts") Adds highlighting to selected sections of an HTML element's content. @@ -70,5 +70,5 @@ property: ## See also -- [Text highlight pipe](text-highlight.pipe.md) -- [Highlight transform service](highlight-transform.service.md) +- [Text highlight pipe](../pipes/text-highlight.pipe.md) +- [Highlight transform service](../services/highlight-transform.service.md) diff --git a/docs/core/logout.directive.md b/docs/core/directives/logout.directive.md similarity index 71% rename from docs/core/logout.directive.md rename to docs/core/directives/logout.directive.md index 6fb2697c52..381fa408b3 100644 --- a/docs/core/logout.directive.md +++ b/docs/core/directives/logout.directive.md @@ -2,9 +2,10 @@ Title: Logout directive Added: v2.0.0 Status: Active +Last reviewed: 2019-03-20 --- -# [Logout directive](../../lib/core/directives/logout.directive.ts "Defined in logout.directive.ts") +# [Logout directive](../../../lib/core/directives/logout.directive.ts "Defined in logout.directive.ts") Logs the user out when the decorated element is clicked. @@ -25,4 +26,4 @@ Logs the user out when the decorated element is clicked. ## See also -- [Login component](login.component.md) +- [Login component](../components/login.component.md) diff --git a/docs/core/node-delete.directive.md b/docs/core/directives/node-delete.directive.md similarity index 91% rename from docs/core/node-delete.directive.md rename to docs/core/directives/node-delete.directive.md index b72a84e9cd..d8310c2666 100644 --- a/docs/core/node-delete.directive.md +++ b/docs/core/directives/node-delete.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Node Delete directive](../../lib/core/directives/node-delete.directive.ts "Defined in node-delete.directive.ts") +# [Node Delete directive](../../../lib/core/directives/node-delete.directive.ts "Defined in node-delete.directive.ts") Deletes multiple files and folders. diff --git a/docs/core/node-download.directive.md b/docs/core/directives/node-download.directive.md similarity index 59% rename from docs/core/node-download.directive.md rename to docs/core/directives/node-download.directive.md index 7c9a45d2d6..cc3569657b 100644 --- a/docs/core/node-download.directive.md +++ b/docs/core/directives/node-download.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Node Download directive](../../lib/content-services/directives/node-download.directive.ts "Defined in node-download.directive.ts") +# [Node Download directive](../../../lib/core/directives/node-download.directive.ts "Defined in node-download.directive.ts") Allows folders and/or files to be downloaded, with multiple nodes packed as a '.ZIP' archive. @@ -30,4 +30,4 @@ Allows folders and/or files to be downloaded, with multiple nodes packed as a '. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| nodes | [`MinimalNodeEntity`](../content-services/document-library.model.md)`[]` | | Nodes to download. | +| nodes | [`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)` \| `[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`[]` | | Nodes to download. | diff --git a/docs/core/node-favorite.directive.md b/docs/core/directives/node-favorite.directive.md similarity index 94% rename from docs/core/node-favorite.directive.md rename to docs/core/directives/node-favorite.directive.md index 10ad34d74b..456c265c88 100644 --- a/docs/core/node-favorite.directive.md +++ b/docs/core/directives/node-favorite.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Node Favorite directive](../../lib/core/directives/node-favorite.directive.ts "Defined in node-favorite.directive.ts") +# [Node Favorite directive](../../../lib/core/directives/node-favorite.directive.ts "Defined in node-favorite.directive.ts") Selectively toggles nodes as favorites. diff --git a/docs/core/node-restore.directive.md b/docs/core/directives/node-restore.directive.md similarity index 72% rename from docs/core/node-restore.directive.md rename to docs/core/directives/node-restore.directive.md index 8f5ed42b88..c7a037d598 100644 --- a/docs/core/node-restore.directive.md +++ b/docs/core/directives/node-restore.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Node Restore directive](../../lib/core/directives/node-restore.directive.ts "Defined in node-restore.directive.ts") +# [Node Restore directive](../../../lib/core/directives/node-restore.directive.ts "Defined in node-restore.directive.ts") Restores deleted nodes to their original location. @@ -50,17 +50,17 @@ Restores deleted nodes to their original location. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| selection | `DeletedNodeEntry[]` | | Array of deleted nodes to restore. | +| selection | [`DeletedNodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/DeletedNodeEntry.md)`[]` | | Array of deleted nodes to restore. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| restore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`RestoreMessageModel`](../../lib/core/directives/node-restore.directive.ts)`>` | Emitted when restoration is complete. | +| restore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`RestoreMessageModel`](../../../lib/core/directives/node-restore.directive.ts)`>` | Emitted when restoration is complete. | ## Details -The directive takes a selection of `DeletedNodeEntry` instances and restores them to +The directive takes a selection of [`DeletedNodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/DeletedNodeEntry.md) instances and restores them to their original locations. If the original location doesn't exist anymore then they remain in the trash list. diff --git a/docs/core/upload.directive.md b/docs/core/directives/upload.directive.md similarity index 94% rename from docs/core/upload.directive.md rename to docs/core/directives/upload.directive.md index 56aa268f0a..7b464b8a0b 100644 --- a/docs/core/upload.directive.md +++ b/docs/core/directives/upload.directive.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Upload Directive](../../lib/core/directives/upload.directive.ts "Defined in upload.directive.ts") +# [Upload Directive](../../../lib/core/directives/upload.directive.ts "Defined in upload.directive.ts") Uploads content in response to file drag and drop. @@ -63,7 +63,7 @@ value or expression: ### Modes -The [Upload directive](../core/upload.directive.md) supports two modes: +The [Upload directive](upload.directive.md) supports two modes: - **drop** mode, where the decorated element acts like a drop zone for files (enabled by default) - **click** mode, where the decorated element invokes a file dialog to select files or folders. @@ -100,7 +100,7 @@ In click mode you can provide extra attributes for the file dialog: #### Drop mode -Currently, the [upload directive](../core/upload.directive.md) supports only file drops (single or multiple). +Currently, the [upload directive](upload.directive.md) supports only file drops (single or multiple). Support for folders and `accept` filters will probably be implemented in a future version. diff --git a/docs/core/form-field.component.md b/docs/core/form-field.component.md deleted file mode 100644 index ae35e10667..0000000000 --- a/docs/core/form-field.component.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -Title: Form field component -Added: v2.0.0 -Status: Active -Last reviewed: 2018-11-20 ---- - -# [Form field component](../../lib/core/form/components/form-field/form-field.component.ts "Defined in form-field.component.ts") - -Represents a UI field in a form. - -## Basic Usage - -All form field editors (aka widgets) on a [`Form`](../../lib/process-services/task-list/models/form.model.ts) are rendered by means of a [`FormFieldComponent`](../core/form-field.component.md) -that takes an instance of a [`FormFieldModel`](../core/form-field.model.md): - -```html - -``` - -This component depends on the [`FormRenderingService`](../core/form-rendering.service.md) to map the [`FormFieldModel`](../core/form-field.model.md) to a [`Form`](../../lib/process-services/task-list/models/form.model.ts) Field UI component -based on the field type or the metadata information. - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| field | [`FormFieldModel`](../core/form-field.model.md) | null | Contains all the necessary data needed to determine what UI `Widget` to use when rendering the field in the form. You would typically not create this data manually but instead create the form in APS and export it to get to all the `FormFieldModel` definitions. | - -## Details - -You would typically not use this component directly but instead use the `` component, which under the hood -uses `` components to render the form fields. - -### Field Type -> Form Field Component mappings - -Forms defined in APS have the following default mappings for the form fields: - -| _APS Form Designer_ Widget | Field Type | Component Type | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -------------- | -| Text | text | [`TextWidgetComponent`](../../lib/core/form/components/widgets/text/text.widget.ts) | -| Multi-line text | multi-line-text | [`MultilineTextWidgetComponentComponent`](../../lib/core/form/components/widgets/multiline-text/multiline-text.widget.ts) | -| Number | integer | [`NumberWidgetComponent`](../../lib/core/form/components/widgets/number/number.widget.ts) | -| Checkbox | boolean | [`CheckboxWidgetComponent`](../../lib/core/form/components/widgets/checkbox/checkbox.widget.ts) | -| Date | date | [`DateWidgetComponent`](../../lib/core/form/components/widgets/date/date.widget.ts) | -| Dropdown | dropdown | [`DropdownWidgetComponent`](../../lib/core/form/components/widgets/dropdown/dropdown.widget.ts) | -| Typeahead | typeahead | [`TypeaheadWidgetComponent`](../../lib/core/form/components/widgets/typeahead/typeahead.widget.ts) | -| Amount | amount | [`AmountWidgetComponent`](../../lib/core/form/components/widgets/amount/amount.widget.ts) | -| Radio buttons | radio-buttons | [`RadioButtonsWidgetComponent`](../../lib/core/form/components/widgets/radio-buttons/radio-buttons.widget.ts) | -| People | people | [`PeopleWidgetComponent`](../../lib/core/form/components/widgets/people/people.widget.ts) | -| Group of people | functional-group | [`FunctionalGroupWidgetComponent`](../../lib/core/form/components/widgets/functional-group/functional-group.widget.ts) | -| Dynamic table | dynamic-table | [`DynamicTableWidgetComponent`](../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.ts) | -| Hyperlink | hyperlink | [`HyperlinkWidgetComponent`](../../lib/core/form/components/widgets/hyperlink/hyperlink.widget.ts) | -| Header | group | [`ContainerWidgetComponent`](../../lib/core/form/components/widgets/container/container.widget.ts) | -| Attach File | upload | AttachWidgetComponent or [`UploadWidgetComponent`](../../lib/core/form/components/widgets/upload/upload.widget.ts) (based on metadata) | -| Display value | readonly | [`TextWidgetComponent`](../../lib/core/form/components/widgets/text/text.widget.ts) | -| Display text | readonly-text | [`DisplayTextWidgetComponent`](../../lib/core/form/components/widgets/display-text/display-text.widget.ts) | -| N/A | container | [`ContainerWidgetComponent`](../../lib/core/form/components/widgets/container/container.widget.ts) (layout component) | -| N/A | N/A | [`UnknownWidgetComponent`](../../lib/core/form/components/widgets/unknown/unknown.widget.ts) | diff --git a/docs/core/identity-user.service.md b/docs/core/identity-user.service.md deleted file mode 100644 index a8b3b5d161..0000000000 --- a/docs/core/identity-user.service.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -Title: Identity user service -Added: v3.0.0 -Status: Active -Last reviewed: 2019-02-08 ---- - -# [Identity user service](../../lib/core/userinfo/services/identity-user.service.ts "Defined in identity-user.service.ts") - -Gets OAuth2 personal details and roles for users. - -## Class members - -### Methods - -- **checkUserHasAnyApplicationRole**(userId: `string`, applicationName: `string`, roleNames: `string[]`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Checks if a user has any application role. - - _userId:_ `string` - ID of the target user - - _applicationName:_ `string` - Name of the application - - _roleNames:_ `string[]` - List of role names to check for - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the user has one or more of the roles, false otherwise -- **checkUserHasAnyClientAppRole**(userId: `string`, clientId: `string`, roleNames: `string[]`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Checks whether a user has any of the client app roles. - - _userId:_ `string` - ID of the target user - - _clientId:_ `string` - ID of the client app - - _roleNames:_ `string[]` - List of role names to check for - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the user has one or more of the roles, false otherwise -- **checkUserHasApplicationAccess**(userId: `string`, applicationName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Checks if a user has access to an application. - - _userId:_ `string` - ID of the user - - _applicationName:_ `string` - Name of the application - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the user has access, false otherwise -- **checkUserHasClientApp**(userId: `string`, clientId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Checks whether user has access to a client app. - - _userId:_ `string` - ID of the target user - - _clientId:_ `string` - ID of the client app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the user has access, false otherwise -- **checkUserHasRole**(userId: `string`, roleNames: `string[]`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Checks if a user has one of the roles from a list. - - _userId:_ `string` - ID of the target user - - _roleNames:_ `string[]` - Array of roles to check for - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the user has one of the roles, false otherwise -- **findUsersByName**(search: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Find users based on search input. - - _search:_ `string` - Search query string - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of users -- **getClientIdByApplicationName**(applicationName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Gets the client ID for an application. - - _applicationName:_ `string` - Name of the application - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Client ID string -- **getClientRoles**(userId: `string`, clientId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Get client roles of a user for a particular client. - - _userId:_ `string` - ID of the target user - - _clientId:_ `string` - ID of the client app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of client roles -- **getCurrentUserInfo**(): [`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)
- Gets the name and other basic details of the current user. - - **Returns** [`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts) - The user's details -- **getUserRoles**(userId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`IdentityRoleModel`](../../lib/core/userinfo/models/identity-role.model.ts)`[]>`
- Gets a list of roles for a user. - - _userId:_ `string` - ID of the user - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`IdentityRoleModel`](../../lib/core/userinfo/models/identity-role.model.ts)`[]>` - Array of role info objects -- **getUsers**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>`
- Gets details for all users. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>` - Array of user info objects -- **getUsersByRolesWithCurrentUser**(roleNames: `string[]`): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>`
- Gets an array of users (including the current user) who have any of the roles in the supplied list. - - _roleNames:_ `string[]` - List of role names to look for - - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>` - Array of user info objects -- **getUsersByRolesWithoutCurrentUser**(roleNames: `string[]`): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>`
- Gets an array of users (not including the current user) who have any of the roles in the supplied list. - - _roleNames:_ `string[]` - List of role names to look for - - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]>` - Array of user info objects -- **getValueFromToken**(key: `string`)
- Gets a named value from the user access token. - - _key:_ `string` - Key name of the field to retrieve - -## Details - -[OAuth2](https://oauth.net/2/) defines an _access token_ (used when -authenticating a user) and a number of _authentication roles_ that the user -can participate in (see -[this page](https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2) -for an introduction to OAuth2 and a description of the roles). You can use the -[Identity user service](identity-user.service.md) to access this information for users, including the current user. - -## See also - -- [JWT helper service](../core/jwt-helper.service.md) diff --git a/docs/core/info-drawer-tab.component.md b/docs/core/info-drawer-tab.component.md deleted file mode 100644 index fbdb35db9c..0000000000 --- a/docs/core/info-drawer-tab.component.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -Title: Info Drawer Tab component -Added: v2.4.0 -Status: Active -Last reviewed: 2018-06-08 ---- - -# [Info Drawer Tab component](../../lib/core/info-drawer/info-drawer.component.ts "Defined in info-drawer.component.ts") - -Renders tabs in a [Info drawer component](../core/info-drawer.component.md). - -![Info drawer screenshot](../docassets/images/label-tab.png) - -## Basic usage - -Render a tab with label: - -```html - - - -
Tab1 content
-
- - -
Tab2 content
-
-
-``` - -Render tab with icon instead of labels: - -```html - - - -
Tab1 content
-
- - -
Tab2 content
-
- -
-``` - -![Info drawer screenshot](../docassets/images/icon-tab.png) - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| icon | `string` | null | Icon to render for the tab. | -| label | `string` | "" | The title of the tab. | - -## Details - -See the [Info drawer component](../core/info-drawer.component.md) page for details of how to use this subcomponent. - -## See also - -- [Info drawer component](info-drawer.component.md) -- [Info drawer layout component](info-drawer-layout.component.md) diff --git a/docs/core/card-view-item.interface.md b/docs/core/interfaces/card-view-item.interface.md similarity index 82% rename from docs/core/card-view-item.interface.md rename to docs/core/interfaces/card-view-item.interface.md index f564782eb2..595f59a053 100644 --- a/docs/core/card-view-item.interface.md +++ b/docs/core/interfaces/card-view-item.interface.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-05-08 --- -# [Card View Item interface](../../lib/core/card-view/interfaces/card-view-item.interface.ts "Defined in card-view-item.interface.ts") +# [Card View Item interface](../../../lib/core/card-view/interfaces/card-view-item.interface.ts "Defined in card-view-item.interface.ts") -Defines the implementation of an item in a [Card View component](../core/card-view.component.md). +Defines the implementation of an item in a [Card View component](../components/card-view.component.md). ## Definition @@ -42,7 +42,7 @@ export interface CardViewItem { ## Details Card item components are loaded dynamically by the -main [Card View component](card-view.component.md). This allows you to define your own +main [Card View component](../components/card-view.component.md). This allows you to define your own component for a custom item type. For example, follow the steps given below to add a **stardate** type to display Captain @@ -50,8 +50,8 @@ Picard's birthday (47457.1): 1. Define the model for the custom type. - Your model must extend the [`CardViewBaseItemModel`](../../lib/core/card-view/models/card-view-baseitem.model.ts) class and implement the [`CardViewItem`](../../lib/core/card-view/interfaces/card-view-item.interface.ts) - and [`DynamicComponentModel`](../../lib/core/services/dynamic-component-mapper.service.ts) interfaces. See the + Your model must extend the [`CardViewBaseItemModel`](../../../lib/core/card-view/models/card-view-baseitem.model.ts) class and implement the [`CardViewItem`](../../../lib/core/card-view/interfaces/card-view-item.interface.ts) + and [`DynamicComponentModel`](../../../lib/core/services/dynamic-component-mapper.service.ts) interfaces. See the [Card View Text Item model source](https://github.com/Alfresco/alfresco-ng2-components/blob/development/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) for an example of how to do this. @@ -142,11 +142,11 @@ Picard's birthday (47457.1): } ``` - The [Card Item Type service](card-item-types.service.md) maps each item type to the - corresponding component. See its [doc page](card-item-types.service.md) for further + The [Card Item Type service](../services/card-item-types.service.md) maps each item type to the + corresponding component. See its [doc page](../services/card-item-types.service.md) for further details. ## See also -- [Card View component](card-view.component.md) -- [Card Item Types service](card-item-types.service.md) +- [Card View component](../components/card-view.component.md) +- [Card Item Types service](../services/card-item-types.service.md) diff --git a/docs/core/datatable-adapter.interface.md b/docs/core/interfaces/datatable-adapter.interface.md similarity index 59% rename from docs/core/datatable-adapter.interface.md rename to docs/core/interfaces/datatable-adapter.interface.md index d69376da4c..661d9cb78a 100644 --- a/docs/core/datatable-adapter.interface.md +++ b/docs/core/interfaces/datatable-adapter.interface.md @@ -4,37 +4,36 @@ Added: v2.0.0 Status: Active --- -# [DataTableAdapter interface](../../lib/core/datatable/data/datatable-adapter.ts "Defined in datatable-adapter.ts") +# [DataTableAdapter interface](../../../lib/core/datatable/data/datatable-adapter.ts "Defined in datatable-adapter.ts") -Defines how table data is supplied to [DataTable](datatable.component.md) -and [Tasklist](../process-services/task-list.component.md) components. +Defines how table data is supplied to [DataTable](../components/datatable.component.md) and [Tasklist](../../process-services/components/task-list.component.md) components. ## Properties | Name | Type | Description | | ---- | ---- | ----------- | -| selectedRow | [`DataRow`](../../lib/core/datatable/data/data-row.model.ts) | The data for the currently selected row. | +| selectedRow | [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) | The data for the currently selected row. | ## Events | Name | Type | Description | | ---- | ---- | ----------- | -| rowsChanged | [`Subject>`](../../lib/core/datatable/data/data-row.model.ts) | Raised when data adapter gets new rows. | +| rowsChanged | [`Subject>`](../../../lib/core/datatable/data/data-row.model.ts) | Raised when data adapter gets new rows. | ## Methods -[`getRows(): Array;`](../../lib/core/datatable/data/data-row.model.ts)
-[`setRows(rows: Array): void;`](../../lib/core/datatable/data/data-row.model.ts)
+[`getRows(): Array;`](../../../lib/core/datatable/data/data-row.model.ts)
+[`setRows(rows: Array): void;`](../../../lib/core/datatable/data/data-row.model.ts)
Get/set the values for display in the table using an array of rows. -[`getColumns(): Array;`](../../lib/core/datatable/data/data-column.model.ts)
-[`setColumns(columns: Array): void;`](../../lib/core/datatable/data/data-column.model.ts)
+[`getColumns(): Array;`](../../../lib/core/datatable/data/data-column.model.ts)
+[`setColumns(columns: Array): void;`](../../../lib/core/datatable/data/data-column.model.ts)
Get/set an array of column specifications. -`getValue(row:`[`DataRow,`](../../lib/core/datatable/data/data-row.model.ts)`col: DataColumn): any;`
+`getValue(row:`[`DataRow,`](../../../lib/core/datatable/data/data-row.model.ts)`col: DataColumn): any;`
Get the data value from a specific table cell. -`getSorting():`[`DataSorting`](../../lib/core/datatable/data/data-sorting.model.ts)`;`
+`getSorting():`[`DataSorting`](../../../lib/core/datatable/data/data-sorting.model.ts)`;`
`setSorting(sorting: DataSorting): void;`
Get/set the sorting key and direction (ascending or descending). @@ -43,22 +42,22 @@ Sort the table with a specified key and direction (ascending or descending). ## Details -You can implement [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) in your own class to display your data with the [DataTable](datatable.component.md) -and [Tasklist](../process-services/task-list.component.md) components. -This interface (along with other interfaces for column and row data) hides the details of your class from the caller, so you can store your data internally however you like. The DataTable library implements the interface in the [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) class which is the standard adapter for the Datatable component. +You can implement [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) in your own class to display your data with the [DataTable](../components/datatable.component.md) +and [Tasklist](../../process-services/components/task-list.component.md) components. +This interface (along with other interfaces for column and row data) hides the details of your class from the caller, so you can store your data internally however you like. The DataTable library implements the interface in the [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts) class which is the standard adapter for the Datatable component. -The basic idea of [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) is that the caller can request your class to return an array of column +The basic idea of [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) is that the caller can request your class to return an array of column definition objects. Each of these objects specifies the unique key, name, type and other properties of a single column. The caller can also request the data values for the table as an array of row objects. The caller accesses the data from a row using a `getValue` method that returns the data from a specified column. This column is identified by the unique key that was set during the column definition. -The data-hiding works the other way around when the caller needs to set data in the [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) class - the internal +The data-hiding works the other way around when the caller needs to set data in the [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) class - the internal details of the caller's storage are hidden by the column and row interfaces. When the `setColumns` and `setRows` methods are called on the adapter, it can simply query the column/row objects it receives and then store the data in its own format. ### Columns and rows -Columns are defined by the [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) interface: +Columns are defined by the [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) interface: ```ts interface DataColumn { @@ -76,7 +75,7 @@ interface DataColumn { An array of these objects is passed to your object when the `setColumns` method is called. The `key` property is used to identify columns and so each column's key should be unique. The `type` string can have a value of 'text', 'image' or 'date'. -An array of [`DataRow`](../../lib/core/datatable/data/data-row.model.ts) objects is passed to your object when the `setRows` method is called: +An array of [`DataRow`](../../../lib/core/datatable/data/data-row.model.ts) objects is passed to your object when the `setRows` method is called: ```ts interface DataRow { @@ -92,8 +91,8 @@ Each row contains a set of values. An item in the set is retrieved by passing it ### ObjectDataTableAdapter -The DataTable library provides a implementation of [DataTableAdapter,](../../lib/core/datatable/data/datatable-adapter.ts) called -[`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts). This is a simple adapter that binds to object arrays and turns object fields into columns: +The DataTable library provides a implementation of [DataTableAdapter,](../../../lib/core/datatable/data/datatable-adapter.ts) called +[`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts). This is a simple adapter that binds to object arrays and turns object fields into columns: ```ts let data = new ObjectDataTableAdapter( @@ -120,7 +119,7 @@ let data = new ObjectDataTableAdapter( ); ``` -![DataTable demo](../docassets/images/datatable-demo.png) +![DataTable demo](../../docassets/images/datatable-demo.png) If you don't specify the column array then the constructor will infer the layout of the columns from the structure of the row objects. The field names ('id' and 'name' in the example below) will be used @@ -152,12 +151,7 @@ let schema = ObjectDataTableAdapter.generateSchema(data); */ ``` - - - - ## See also -- [Datatable component](datatable.component.md) -- [Task list component](../process-services/task-list.component.md) - +- [Datatable component](../components/datatable.component.md) +- [Task list component](../../process-services/components/task-list.component.md) diff --git a/docs/core/form-field-validator.interface.md b/docs/core/interfaces/form-field-validator.interface.md similarity index 56% rename from docs/core/form-field-validator.interface.md rename to docs/core/interfaces/form-field-validator.interface.md index 9728175831..5c56f29c36 100644 --- a/docs/core/form-field-validator.interface.md +++ b/docs/core/interfaces/form-field-validator.interface.md @@ -4,9 +4,9 @@ Added: v2.0.0 Status: Active --- -# [FormFieldValidator interface](../../lib/core/form/components/widgets/core/form-field-validator.ts "Defined in form-field-validator.ts") +# [FormFieldValidator interface](../../../lib/core/form/components/widgets/core/form-field-validator.ts "Defined in form-field-validator.ts") -Defines how the input fields of [`Form`](../../lib/process-services/task-list/models/form.model.ts) and Task Details components are validated. +Defines how the input fields of [`Form`](../../../lib/process-services/task-list/models/form.model.ts) and Task Details components are validated. ## Basic Usage @@ -54,26 +54,26 @@ Perform validation on `field`. You can supply a set of validator objects for a form using its `fieldValidators` property. ADF will determine if a validator should be used with a given field by calling its -`isSupported` method, passing the field's [`FormFieldModel`](../core/form-field.model.md) as a parameter. If the validator -does support the field then its `validate` method will be called on the [`FormFieldModel`](../core/form-field.model.md) +`isSupported` method, passing the field's [`FormFieldModel`](../../core/models/form-field.model.md) as a parameter. If the validator +does support the field then its `validate` method will be called on the [`FormFieldModel`](../../core/models/form-field.model.md) during the validation phase. Several validator classes are predefined for you to use: | Validator name | Checks that: | | -------------- | ------------ | -| [`RequiredFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field is not left blank | -| [`NumberFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field contains numeric data | -| [`MinLengthFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text has at least a minimum number of characters | -| [`MaxLengthFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text has no more than a maximum number of characters | -| [`MinValueFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Numeric field's value is greater than a lower limit | -| [`MaxValueFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Numeric field's vaue is less than an upper limit | -| [`RegExFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text matches a regular expression | -| [`DateFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field contains a date in the correct format | -| [`MinDateFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Date within a field occurs after a certain starting point | -| [`MaxDateFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) | Date within a field occurs before a certain end point | +| [`RequiredFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field is not left blank | +| [`NumberFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field contains numeric data | +| [`MinLengthFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text has at least a minimum number of characters | +| [`MaxLengthFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text has no more than a maximum number of characters | +| [`MinValueFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Numeric field's value is greater than a lower limit | +| [`MaxValueFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Numeric field's vaue is less than an upper limit | +| [`RegExFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field text matches a regular expression | +| [`DateFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Field contains a date in the correct format | +| [`MinDateFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Date within a field occurs after a certain starting point | +| [`MaxDateFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) | Date within a field occurs before a certain end point | -The `FORM_FIELD_VALIDATORS` array contains an instance of each of these classes. You can assign this to the `fieldValidators` property of an Activiti [`Form`](../../lib/process-services/task-list/models/form.model.ts) or Activiti [Task Details component](../process-services/task-details.component.md) to enable standard validation. +The `FORM_FIELD_VALIDATORS` array contains an instance of each of these classes. You can assign this to the `fieldValidators` property of a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) or [Task Details component](../../process-services/components/task-details.component.md) to enable standard validation. ### Custom validators @@ -81,9 +81,9 @@ You can implement your own custom validator classes if the standard set doesn't features you need. For example, you could check for consistency between separate fields on the form (currency values adding up to a given total, say). -The `type` property of [`FormFieldModel`](../core/form-field.model.md) is often used in the `isSupported` function, since +The `type` property of [`FormFieldModel`](../../core/models/form-field.model.md) is often used in the `isSupported` function, since validation methods typically apply only to specific types of data. -The [`FormFieldTypes`](../../lib/core/form/components/widgets/core/form-field-types.ts) +The [`FormFieldTypes`](../../../lib/core/form/components/widgets/core/form-field-types.ts) class defines convenient constants for the type strings. The validator in the example @@ -128,7 +128,7 @@ export class AppComponent { } ``` -You can now use the 'fieldValidators' property of the [`Form`](../../lib/process-services/task-list/models/form.model.ts) or Task Details components to assign your +You can now use the 'fieldValidators' property of the [`Form`](../../../lib/process-services/task-list/models/form.model.ts) or Task Details components to assign your custom validator set: ```html @@ -147,9 +147,9 @@ custom validator set: If you now run the application and try to enter "admin" in one of the text fields (either optional or required), you should see the following error: -![](../docassets/images/demo-validator.png) +![](../../docassets/images/demo-validator.png) ## See also -- [Form field model](form-field.model.md) -- [Form component](form.component.md) +- [Form field model](../models/form-field.model.md) +- [Form component](../components/form.component.md) diff --git a/docs/core/search-configuration.interface.md b/docs/core/interfaces/search-configuration.interface.md similarity index 79% rename from docs/core/search-configuration.interface.md rename to docs/core/interfaces/search-configuration.interface.md index 400963ad01..a2915898bf 100644 --- a/docs/core/search-configuration.interface.md +++ b/docs/core/interfaces/search-configuration.interface.md @@ -4,7 +4,7 @@ Added: v2.1.0 Status: Active --- -# [Search Configuration interface](../../lib/core/interface/search-configuration.interface.ts "Defined in search-configuration.interface.ts") +# [Search Configuration interface](../../../lib/core/interface/search-configuration.interface.ts "Defined in search-configuration.interface.ts") Provides fine control of parameters to a search. @@ -20,7 +20,7 @@ The interface defines a service that generates a custom object. This object can then be supplied to a search operation to refine the search parameters. A standard implementation, the -[Search Configuration service](search-configuration.service.md) is provided in the ADF Core library +[Search Configuration service](../services/search-configuration.service.md) is provided in the ADF Core library source. This works fine in most cases but if you need to, you can implement your own service, as described below. @@ -28,7 +28,7 @@ described below. 1. Implement the service class - Create your own service class to implement the [`SearchConfigurationInterface`](../core/search-configuration.interface.md). This defines the + Create your own service class to implement the [`SearchConfigurationInterface`](../../core/interfaces/search-configuration.interface.md). This defines the the `generateQueryBody` method that returns the QueryBody object. See the [QueryBody](https://github.com/Alfresco/alfresco-js-api/blob/1.6.0/src/alfresco-search-rest-api/docs/QueryBody.md) page in the Alfresco JS API for further details about the options this object provides. @@ -85,10 +85,10 @@ described below. }) ``` - You also need to add the [`SearchService`](../core/search.service.md) as a provider to avoid overriding the module instance. This component will have his own instance of the [`SearchService`](../core/search.service.md) that will use the class you have provided + You also need to add the [`SearchService`](../../core/services/search.service.md) as a provider to avoid overriding the module instance. This component will have his own instance of the [`SearchService`](../../core/services/search.service.md) that will use the class you have provided as its configuration. ## See also -- [Search component](../content-services/search.component.md) -- [Search configuration service](search-configuration.service.md) +- [Search component](../../content-services/components/search.component.md) +- [Search configuration service](../services/search-configuration.service.md) diff --git a/docs/core/mime-type-icon.pipe.md b/docs/core/mime-type-icon.pipe.md deleted file mode 100644 index c699852669..0000000000 --- a/docs/core/mime-type-icon.pipe.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -Title: Mime Type Icon pipe -Added: v2.0.0 -Status: Active ---- - -# [Mime Type Icon pipe](../../lib/core/pipes/mime-type-icon.pipe.ts "Defined in mime-type-icon.pipe.ts") - -Retrieves an icon to represent a MIME type. - -## Basic Usage - - - -```HTML -
- -
-``` - - - -## Details - -The pipe takes a MIME type as input and returns the URL of an SVG file that -symbolizes that type (see the [Thumbnail service](thumbnail.service.md) for the mapping between types and icons). The pipe will return a "miscellaneous" icon when no specific mapping is defined. - -## See also - -- [Thumbnail service](thumbnail.service.md) diff --git a/docs/core/bpm-user.model.md b/docs/core/models/bpm-user.model.md similarity index 74% rename from docs/core/bpm-user.model.md rename to docs/core/models/bpm-user.model.md index 304df944d2..d3a0c57839 100644 --- a/docs/core/bpm-user.model.md +++ b/docs/core/models/bpm-user.model.md @@ -4,14 +4,14 @@ Added: v2.0.0 Status: Active --- -# [Bpm User model](../../lib/core/userinfo/models/bpm-user.model.ts "Defined in bpm-user.model.ts") +# [Bpm User model](../../../lib/core/userinfo/models/bpm-user.model.ts "Defined in bpm-user.model.ts") Contains information about a Process Services user. ## Details Instances of this class are returned by the methods of the -[Bpm User service](bpm-user.service.md). It implements the +[Bpm User service](../services/bpm-user.service.md). It implements the [`UserRepresentation`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/activiti-rest-api/docs/UserRepresentation.md) interface, which is defined in the [Alfresco JS API](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-activiti-rest-api/docs/UserRepresentation.md). @@ -22,6 +22,6 @@ latest version of the class, see the ## See also -- [Bpm user service](bpm-user.service.md) +- [Bpm user service](../services/bpm-user.service.md) - [Ecm user model](ecm-user.model.md) -- [People process service](people-process.service.md) +- [People process service](../services/people-process.service.md) diff --git a/docs/core/ecm-user.model.md b/docs/core/models/ecm-user.model.md similarity index 69% rename from docs/core/ecm-user.model.md rename to docs/core/models/ecm-user.model.md index 9b676b144d..8d87dbe90a 100644 --- a/docs/core/ecm-user.model.md +++ b/docs/core/models/ecm-user.model.md @@ -4,14 +4,14 @@ Added: v2.0.0 Status: Active --- -# [Ecm User model](../../lib/core/userinfo/models/ecm-user.model.ts "Defined in ecm-user.model.ts") +# [Ecm User model](../../../lib/core/userinfo/models/ecm-user.model.ts "Defined in ecm-user.model.ts") Contains information about a Content Services user. ## Details Instances of this class are returned by the methods of the -[Ecm User service](ecm-user.service.md). It implements the `Person` +[Ecm User service](../services/ecm-user.service.md). It implements the `Person` interface, which is defined in the [Alfresco JS API](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/Person.md). @@ -22,6 +22,6 @@ latest version of the class, see the ## See also -- [Ecm user service](ecm-user.service.md) -- [People content service](people-content.service.md) +- [Ecm user service](../services/ecm-user.service.md) +- [People content service](../services/people-content.service.md) - [Bpm user model](bpm-user.model.md) diff --git a/docs/core/form-field.model.md b/docs/core/models/form-field.model.md similarity index 64% rename from docs/core/form-field.model.md rename to docs/core/models/form-field.model.md index f17efe9809..d116215d0c 100644 --- a/docs/core/form-field.model.md +++ b/docs/core/models/form-field.model.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-03-20 --- -# [Form Field model](../../lib/core/form/components/widgets/core/form-field.model.ts "Defined in form-field.model.ts") +# [Form Field model](../../../lib/core/form/components/widgets/core/form-field.model.ts "Defined in form-field.model.ts") -Contains the value and metadata for a field of a [`Form`](../../lib/process-services/task-list/models/form.model.ts) component. +Contains the value and metadata for a field of a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) component. ## Properties @@ -15,7 +15,7 @@ Contains the value and metadata for a field of a [`Form`](../../lib/process-serv | ---- | ---- | ------- | ----------- | | id | string | | Field ID | | name | string | | Field name | -| type | string | | Field type (see [Form Rendering service](form-rendering.service.md) for a list of available type strings) | +| type | string | | Field type (see [Form Rendering service](../services/form-rendering.service.md) for a list of available type strings) | | value | any | | Field value (implemented by get/set) | | readOnly | boolean | | Is this a read-only field? (Implemented by get/set) | | required | boolean | | Is the field required to have a value? (Implemented by get/set) | @@ -30,7 +30,7 @@ Contains the value and metadata for a field of a [`Form`](../../lib/process-serv | minValue | string | | Minimum allowed value (eg, for number or date) | | maxValue | string | | Minimum allowed value (eg, for number or date) | | regexPattern | string | | Regular expression that text data should match | -| options | [`FormFieldOption`](../../lib/core/form/components/widgets/core/form-field-option.ts)\[] | \[] | Option items for a dropdown menu | +| options | [`FormFieldOption`](../../../lib/core/form/components/widgets/core/form-field-option.ts)\[] | \[] | Option items for a dropdown menu | | restUrl | string | | URL for a REST call to populate a dropdown menu | | restResponsePath | string | | Path within REST response JSON to the array of dropdown data | | restIdProperty | string | | JSON property name to use for the `id` property of a dropdown item | @@ -38,42 +38,42 @@ Contains the value and metadata for a field of a [`Form`](../../lib/process-serv | hasEmptyValue | boolean | | Is the field's value empty? (eg, dropdown with no item selected) | | className | string | | CSS class name for the field | | optionType | string | | | -| params | [`FormFieldMetadata`](../../lib/core/form/components/widgets/core/form-field-metadata.ts) | {} | | +| params | [`FormFieldMetadata`](../../../lib/core/form/components/widgets/core/form-field-metadata.ts) | {} | | | hyperlinkUrl | string | | URL for Hyperlink widgets | | displayText | string | | Displayed text for Hyperlink widgets | | isVisible | boolean | true | Is the field shown on the form? | -| visibilityCondition | [`WidgetVisibilityModel`](../../lib/core/form/models/widget-visibility.model.ts) | null | Defines a expression that determines whether the field is visible or not, based on its logical relation to values in other fields | +| visibilityCondition | [`WidgetVisibilityModel`](../../../lib/core/form/models/widget-visibility.model.ts) | null | Defines a expression that determines whether the field is visible or not, based on its logical relation to values in other fields | | enableFractions | boolean | false | Are numeric values allowed to contain a decimal point? | | currency | string | null | Currency symbol for Amount widgets | | dateDisplayFormat | string | | Date/time display format template | | numberOfColumns | number | 1 | Number of columns defined by a container field | -| fields | [`FormFieldModel`](../core/form-field.model.md)\[] | \[] | Fields contained within a container field | -| columns | [`ContainerColumnModel`](../../lib/core/form/components/widgets/core/container-column.model.ts)\[] | \[] | Column definitions for a container field | -| emptyOption | [`FormFieldOption`](../../lib/core/form/components/widgets/core/form-field-option.ts) | | Dropdown menu item to use when no option is chosen | -| validationSummary | string | | Error/information message added during field validation (see [`FormFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) interface) | +| fields | [`FormFieldModel`](../../core/models/form-field.model.md)\[] | \[] | Fields contained within a container field | +| columns | [`ContainerColumnModel`](../../../lib/core/form/components/widgets/core/container-column.model.ts)\[] | \[] | Column definitions for a container field | +| emptyOption | [`FormFieldOption`](../../../lib/core/form/components/widgets/core/form-field-option.ts) | | Dropdown menu item to use when no option is chosen | +| validationSummary | string | | Error/information message added during field validation (see [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) interface) | ## Details -Every field of a form has an associated [`FormFieldModel`](../core/form-field.model.md) instance that contains the +Every field of a form has an associated [`FormFieldModel`](../../core/models/form-field.model.md) instance that contains the field's value and metadata. The standard widgets use this information to render fields and you can also make use of it in your own custom widgets and field validators. ### Custom widgets -You will need to use the properties of [`FormFieldModel`](../core/form-field.model.md) if you want to implement your own +You will need to use the properties of [`FormFieldModel`](../../core/models/form-field.model.md) if you want to implement your own custom widgets. Aside from the `value` property (which contains the data value entered into the field), there are also a few other fields that are used for specific types of data. For example, the `currency` property holds the currency symbol to be displayed next to the value -(such as the dollar sign $) and the `dateDisplayFormat` defines how the elements of a date/time will be arranged. See the [Form Extensibility and Customization](../user-guide/extensibility.md) for more information about creating custom widgets. +(such as the dollar sign $) and the `dateDisplayFormat` defines how the elements of a date/time will be arranged. See the [Form Extensibility and Customization](../../user-guide/extensibility.md) for more information about creating custom widgets. ### Validation -A [`Form`](../../lib/process-services/task-list/models/form.model.ts) or [Task Details](../process-services/task-details.component.md) component can +A [`Form`](../../../lib/process-services/task-list/models/form.model.ts) or [Task Details](../../process-services/components/task-details.component.md) component can be supplied with a set of validator objects. Each validator applies a particular kind of -check to a field. A number of [`FormFieldModel`](../core/form-field.model.md) properties are used by validators. For +check to a field. A number of [`FormFieldModel`](../../core/models/form-field.model.md) properties are used by validators. For example, `minValue` and `maxValue` are used to check that a numeric value falls within an allowed range and `regexPattern` defines a regular expression that a text field should match. Also, the `validationSummary` is used to send a message back from the validator -for the user to read. See the [`FormFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) page for more information about implementing validators. +for the user to read. See the [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) page for more information about implementing validators. ### REST properties @@ -96,7 +96,7 @@ contains full details about how the REST calls work, along with a worked example ## See also -- [Extensibility](../user-guide/extensibility.md) -- [`FormFieldValidator`](../../lib/core/form/components/widgets/core/form-field-validator.ts) -- [Form rendering service](form-rendering.service.md) -- [Form component](form.component.md) +- [Extensibility](../../user-guide/extensibility.md) +- [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts) +- [Form rendering service](../services/form-rendering.service.md) +- [Form component](../components/form.component.md) diff --git a/docs/core/product-version.model.md b/docs/core/models/product-version.model.md similarity index 85% rename from docs/core/product-version.model.md rename to docs/core/models/product-version.model.md index d2060c41b9..89c19bef12 100644 --- a/docs/core/product-version.model.md +++ b/docs/core/models/product-version.model.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Product Version model](../../lib/core/models/product-version.model.ts "Defined in product-version.model.ts") +# [Product Version model](../../../lib/core/models/product-version.model.ts "Defined in product-version.model.ts") Contains version and license information classes for Alfresco products. @@ -12,7 +12,7 @@ Contains version and license information classes for Alfresco products. The classes in this model contain details about the version and license status of Process Services and Content Services. You can access this -information from ADF using the [Discovery Api service](discovery-api.service.md). +information from ADF using the [Discovery Api service](../services/discovery-api.service.md). See also the [Alfresco JS API docs](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-discovery-rest-api) to learn more about the REST architecture that the service is based on. @@ -75,4 +75,4 @@ class VersionModuleModel { ## See also -- [Discovery api service](discovery-api.service.md) +- [Discovery api service](../services/discovery-api.service.md) diff --git a/docs/core/user-process.model.md b/docs/core/models/user-process.model.md similarity index 78% rename from docs/core/user-process.model.md rename to docs/core/models/user-process.model.md index 4b9d890c5c..fbe7e522bb 100644 --- a/docs/core/user-process.model.md +++ b/docs/core/models/user-process.model.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [User Process model](../../lib/core/models/user-process.model.ts "Defined in user-process.model.ts") +# [User Process model](../../../lib/core/models/user-process.model.ts "Defined in user-process.model.ts") Represents a Process Services user. @@ -21,4 +21,4 @@ latest version of the class, see the ## See also -- [People process service](people-process.service.md) +- [People process service](../services/people-process.service.md) diff --git a/docs/core/node.service.md b/docs/core/node.service.md deleted file mode 100644 index 95e7541e1a..0000000000 --- a/docs/core/node.service.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -Title: Node Service -Added: v2.0.0 -Status: Active -Last reviewed: 2018-11-20 ---- - -# [Node Service](../../lib/core/form/services/node.service.ts "Defined in node.service.ts") - -Gets Alfresco Repository node metadata and creates nodes with metadata. - -## Class members - -### Methods - -- **createNode**(name: `string`, nodeType: `string`, properties: `any`, path: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Create a new Node from form metadata - - _name:_ `string` - Node name - - _nodeType:_ `string` - Node type - - _properties:_ `any` - Node body properties - - _path:_ `string` - Path to the node - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - The created node -- **createNodeMetadata**(nodeType: `string`, nameSpace: `any`, data: `any`, path: `string`, name?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Create a new Node from form metadata. - - _nodeType:_ `string` - Node type - - _nameSpace:_ `any` - Namespace for properties - - _data:_ `any` - [Property](../../lib/content-services/content-metadata/interfaces/property.interface.ts) data to store in the node under namespace - - _path:_ `string` - Path to the node - - _name:_ `string` - (Optional) Node name - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - The created node -- **getNodeMetadata**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeMetadata`](../../lib/core/form/models/node-metadata.model.ts)`>`
- Get the metadata and the nodeType for a nodeId cleaned by the prefix. - - _nodeId:_ `string` - ID of the target node - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeMetadata`](../../lib/core/form/models/node-metadata.model.ts)`>` - Node metadata - -## Details - -Note that this service cannot be used to create nodes with content. - -The `path` parameter to `createNode` and `createNodeMetadata` specifies an intermediate -path of folders to create between the root and the target node. - -### Importing - -```ts -import { NodeService } from '@alfresco/adf-core'; - -export class SomePageComponent implements OnInit { - - constructor(private nodeService: NodeService) { - } -``` - -## See also - -- [Nodes api service](nodes-api.service.md) -- [Deleted nodes api service](deleted-nodes-api.service.md) diff --git a/docs/core/app-config.pipe.md b/docs/core/pipes/app-config.pipe.md similarity index 82% rename from docs/core/app-config.pipe.md rename to docs/core/pipes/app-config.pipe.md index 9da098ce06..4f879085b2 100644 --- a/docs/core/app-config.pipe.md +++ b/docs/core/pipes/app-config.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-05-24 --- -# [App Config Pipe](../../lib/core/app-config/app-config.pipe.ts "Defined in app-config.pipe.ts") +# [App Config Pipe](../../../lib/core/app-config/app-config.pipe.ts "Defined in app-config.pipe.ts") Retrieves values from the application configuration file directly. @@ -42,4 +42,4 @@ You can also chain values with other pipes such as the translation pipe: ## See also -- [App Config service](app-config.service.md) +- [App Config service](../services/app-config.service.md) diff --git a/docs/core/file-size.pipe.md b/docs/core/pipes/file-size.pipe.md similarity index 87% rename from docs/core/file-size.pipe.md rename to docs/core/pipes/file-size.pipe.md index ac941f98ee..f5a72bdfd0 100644 --- a/docs/core/file-size.pipe.md +++ b/docs/core/pipes/file-size.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [File Size pipe](../../lib/core/pipes/file-size.pipe.ts "Defined in file-size.pipe.ts") +# [File Size pipe](../../../lib/core/pipes/file-size.pipe.ts "Defined in file-size.pipe.ts") Converts a number of bytes to the equivalent in KB, MB, etc. diff --git a/docs/core/format-space.pipe.md b/docs/core/pipes/format-space.pipe.md similarity index 87% rename from docs/core/format-space.pipe.md rename to docs/core/pipes/format-space.pipe.md index c9c30b8433..78beb48038 100644 --- a/docs/core/format-space.pipe.md +++ b/docs/core/pipes/format-space.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-27 --- -# [Format Space pipe](../../lib/core/pipes/format-space.pipe.ts "Defined in format-space.pipe.ts") +# [Format Space pipe](../../../lib/core/pipes/format-space.pipe.ts "Defined in format-space.pipe.ts") Replaces all the white space in a string with a supplied character. diff --git a/docs/core/full-name.pipe.md b/docs/core/pipes/full-name.pipe.md similarity index 64% rename from docs/core/full-name.pipe.md rename to docs/core/pipes/full-name.pipe.md index 013d6be4ef..22f2b0f545 100644 --- a/docs/core/full-name.pipe.md +++ b/docs/core/pipes/full-name.pipe.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-11-12 --- -# [Full name pipe](../../lib/core/pipes/full-name.pipe.ts "Defined in full-name.pipe.ts") +# [Full name pipe](../../../lib/core/pipes/full-name.pipe.ts "Defined in full-name.pipe.ts") -Joins the first and last name properties from a [`UserProcessModel`](../core/user-process.model.md) object into a single string. +Joins the first and last name properties from a [`UserProcessModel`](../../core/models/user-process.model.md) object into a single string. ## Basic Usage @@ -23,7 +23,7 @@ Joins the first and last name properties from a [`UserProcessModel`](../core/use ## Details -The pipe offers a convenient way to extract the name from a [User process model](../core/user-process.model.md) object. +The pipe offers a convenient way to extract the name from a [User process model](../models/user-process.model.md) object. ## See also diff --git a/docs/core/pipes/mime-type-icon.pipe.md b/docs/core/pipes/mime-type-icon.pipe.md new file mode 100644 index 0000000000..293ef22ffb --- /dev/null +++ b/docs/core/pipes/mime-type-icon.pipe.md @@ -0,0 +1,30 @@ +--- +Title: Mime Type Icon pipe +Added: v2.0.0 +Status: Active +--- + +# [Mime Type Icon pipe](../../../lib/core/pipes/mime-type-icon.pipe.ts "Defined in mime-type-icon.pipe.ts") + +Retrieves an icon to represent a MIME type. + +## Basic Usage + + + +```HTML +
+ +
+``` + + + +## Details + +The pipe takes a MIME type as input and returns the URL of an SVG file that +symbolizes that type (see the [Thumbnail service](../services/thumbnail.service.md) for the mapping between types and icons). The pipe will return a "miscellaneous" icon when no specific mapping is defined. + +## See also + +- [Thumbnail service](../services/thumbnail.service.md) diff --git a/docs/core/node-name-tooltip.pipe.md b/docs/core/pipes/node-name-tooltip.pipe.md similarity index 76% rename from docs/core/node-name-tooltip.pipe.md rename to docs/core/pipes/node-name-tooltip.pipe.md index 0c58458b92..469e9d0cc7 100644 --- a/docs/core/node-name-tooltip.pipe.md +++ b/docs/core/pipes/node-name-tooltip.pipe.md @@ -4,9 +4,9 @@ Added: v2.0.0 Status: Active --- -# [Node Name Tooltip pipe](../../lib/core/pipes/node-name-tooltip.pipe.ts "Defined in node-name-tooltip.pipe.ts") +# [Node Name Tooltip pipe](../../../lib/core/pipes/node-name-tooltip.pipe.ts "Defined in node-name-tooltip.pipe.ts") -Formats the tooltip for a Node. +Formats the tooltip for a [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md). ## Basic Usage diff --git a/docs/core/text-highlight.pipe.md b/docs/core/pipes/text-highlight.pipe.md similarity index 63% rename from docs/core/text-highlight.pipe.md rename to docs/core/pipes/text-highlight.pipe.md index af32b7f007..b1d67d105f 100644 --- a/docs/core/text-highlight.pipe.md +++ b/docs/core/pipes/text-highlight.pipe.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Text Highlight pipe](../../lib/core/pipes/text-highlight.pipe.ts "Defined in text-highlight.pipe.ts") +# [Text Highlight pipe](../../../lib/core/pipes/text-highlight.pipe.ts "Defined in text-highlight.pipe.ts") Adds highlighting to words or sections of text that match a search string. @@ -24,10 +24,10 @@ Adds highlighting to words or sections of text that match a search string. The pipe's parameter is a string to search for in the text. Any occurrences of the string will be highlighted with added HTML (see the -[Highlight Transform service](highlight-transform.service.md) for more information about how +[Highlight Transform service](../services/highlight-transform.service.md) for more information about how this is implemented). The parameter can contain spaces, in which case each separate "word" in the string will be highlighted individually. ## See also -- [Highlight directive](highlight.directive.md) -- [Highlight transform service](highlight-transform.service.md) +- [Highlight directive](../directives/highlight.directive.md) +- [Highlight transform service](../services/highlight-transform.service.md) diff --git a/docs/core/time-ago.pipe.md b/docs/core/pipes/time-ago.pipe.md similarity index 84% rename from docs/core/time-ago.pipe.md rename to docs/core/pipes/time-ago.pipe.md index f619700d6d..a3d9874b8a 100644 --- a/docs/core/time-ago.pipe.md +++ b/docs/core/pipes/time-ago.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Time Ago pipe](../../lib/core/pipes/time-ago.pipe.ts "Defined in time-ago.pipe.ts") +# [Time Ago pipe](../../../lib/core/pipes/time-ago.pipe.ts "Defined in time-ago.pipe.ts") Converts a recent past date into a number of days ago. diff --git a/docs/core/user-initial.pipe.md b/docs/core/pipes/user-initial.pipe.md similarity index 71% rename from docs/core/user-initial.pipe.md rename to docs/core/pipes/user-initial.pipe.md index 444ed2029a..6f803e85eb 100644 --- a/docs/core/user-initial.pipe.md +++ b/docs/core/pipes/user-initial.pipe.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-11-12 --- -# [User Initial pipe](../../lib/core/pipes/user-initial.pipe.ts "Defined in user-initial.pipe.ts") +# [User Initial pipe](../../../lib/core/pipes/user-initial.pipe.ts "Defined in user-initial.pipe.ts") -Takes the name fields of a [`UserProcessModel`](../core/user-process.model.md) object and extracts and formats the initials. +Takes the name fields of a [`UserProcessModel`](../../core/models/user-process.model.md) object and extracts and formats the initials. ## Basic Usage @@ -33,4 +33,4 @@ Both parameters default to empty strings. ## See also -- [Full name pipe](../core/full-name.pipe.md) +- [Full name pipe](full-name.pipe.md) diff --git a/docs/core/activiti-alfresco.service.md b/docs/core/services/activiti-alfresco.service.md similarity index 97% rename from docs/core/activiti-alfresco.service.md rename to docs/core/services/activiti-alfresco.service.md index 20b71446ce..8f30dbd295 100644 --- a/docs/core/activiti-alfresco.service.md +++ b/docs/core/services/activiti-alfresco.service.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [APS Alfresco Content Service](../../lib/core/form/services/activiti-alfresco.service.ts "Defined in activiti-alfresco.service.ts") +# [APS Alfresco Content Service](../../../lib/core/form/services/activiti-alfresco.service.ts "Defined in activiti-alfresco.service.ts") Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). diff --git a/docs/core/services/alfresco-api.service.md b/docs/core/services/alfresco-api.service.md new file mode 100644 index 0000000000..7af1d52895 --- /dev/null +++ b/docs/core/services/alfresco-api.service.md @@ -0,0 +1,63 @@ +--- +Title: Alfresco Api Service +Added: v2.0.0 +Status: Active +Last reviewed: 2019-01-17 +--- + +# [Alfresco Api Service](../../../lib/core/services/alfresco-api.service.ts "Defined in alfresco-api.service.ts") + +Provides access to an initialized **AlfrescoJSApi** instance. + +## Basic Usage + +```ts +export class MyComponent implements OnInit { + + constructor(private apiService: AlfrescoApiService) { + } + + ngOnInit() { + let nodeId = 'some-node-id'; + let params = {}; + this.apiService.getInstance().nodes + .getNodeChildren(nodeId, params) + .then(result => console.log(result)); + } +} +``` + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| contentApi | [`ContentApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/content.api.ts) | | (Read only) Accesses the Content API | +| nodesApi | [`NodesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/nodes.api.ts) | | (Read only) Accesses the Nodes API | +| renditionsApi | [`RenditionsApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/renditions.api.ts) | | (Read only) Accesses the Renditions API | +| sharedLinksApi | [`SharedLinksApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/sharedlinks.api.ts) | | (Read only) Accesses the Shared Links API | +| sitesApi | [`SitesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/sites.api.ts) | | (Read only) Accesses the Sites API | +| favoritesApi | [`FavoritesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/favorites.api.ts) | | (Read only) Accesses the Favorites API | +| peopleApi | [`PeopleApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/people.api.ts) | | (Read only) Accesses the People API | +| searchApi | [`SearchApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api-legacy/legacy.ts) | | (Read only) Accesses the Search API | +| versionsApi | [`VersionsApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/versions.api.ts) | | (Read only) Accesses the Versions API | +| classesApi | [`ClassesApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/classes.api.ts) | | (Read only) Accesses the Classes API | +| groupsApi | [`GroupsApi`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/api/groups.api.ts) | | (Read only) Accesses the Groups API | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| nodeUpdated | [`Subject`](http://reactivex.io/documentation/subject.html)`<`[`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md)`>` | Emitted when a node updates. | + +## Details + +**Note for developers**: The TypeScript declaration files for the Alfresco JS API +are still under development and some Alfresco APIs may not be accessible +via your IDE's intellisense or TypeScript compiler. +To avoid these TypeScript type check errors, you can call any supported +Alfresco JS api by casting the instance to the `any` type as in the following example: + +```ts +let api: any = this.apiService.getInstance(); +api.nodes.addNode('-root-', body, {}); +``` diff --git a/docs/core/app-config.service.md b/docs/core/services/app-config.service.md similarity index 87% rename from docs/core/app-config.service.md rename to docs/core/services/app-config.service.md index 38f81119b8..968851b124 100644 --- a/docs/core/app-config.service.md +++ b/docs/core/services/app-config.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-09-13 --- -# [App Config service](../../lib/core/app-config/app-config.service.ts "Defined in app-config.service.ts") +# [App Config service](../../../lib/core/app-config/app-config.service.ts "Defined in app-config.service.ts") Supports app configuration settings, stored server side. @@ -37,7 +37,7 @@ Supports app configuration settings, stored server side. ## Details -The [`AppConfigService`](../core/app-config.service.md) service provides support for loading and accessing global application configuration settings that you store on the server side in the form of a JSON file. +The [`AppConfigService`](../../core/services/app-config.service.md) service provides support for loading and accessing global application configuration settings that you store on the server side in the form of a JSON file. You may need this service when deploying your ADF-based application to production servers. There can be more than one server running web apps with different settings, like different addresses for Alfresco Content/Process services. @@ -66,9 +66,9 @@ Example of the default settings file content: Note that the settings in the example above are the default ones supplied with the server. You can override the values in your custom `app.config.json` file if necessary. -Below is a simple example of using the [`AppConfigService`](../core/app-config.service.md) in practice. +Below is a simple example of using the [`AppConfigService`](../../core/services/app-config.service.md) in practice. -**[app.component](../../demo-shell/src/app/app.component.ts).ts** +**app.component.ts** ```ts import { AppConfigService } from '@alfresco/adf-core'; @@ -88,12 +88,12 @@ export class AppComponent { } ``` -Your custom components can also benefit from the [`AppConfigService`](../core/app-config.service.md). +Your custom components can also benefit from the [`AppConfigService`](../../core/services/app-config.service.md). You can create an unlimited number of settings and optionally organize them as a nested JSON hierarchy. ### Variable substitution in configuration strings -The [`AppConfigService`](../core/app-config.service.md) supports a limited set of variable substitutions to greatly simplify certain scenarios. +The [`AppConfigService`](../../core/services/app-config.service.md) supports a limited set of variable substitutions to greatly simplify certain scenarios. ```json { diff --git a/docs/core/apps-process.service.md b/docs/core/services/apps-process.service.md similarity index 96% rename from docs/core/apps-process.service.md rename to docs/core/services/apps-process.service.md index 721ec689ed..4575df2b26 100644 --- a/docs/core/apps-process.service.md +++ b/docs/core/services/apps-process.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-16 --- -# [Apps Process service](../../lib/core/services/apps-process.service.ts "Defined in apps-process.service.ts") +# [Apps Process service](../../../lib/core/services/apps-process.service.ts "Defined in apps-process.service.ts") Gets details of the Process Services apps that are deployed for the user. diff --git a/docs/core/auth-guard-bpm.service.md b/docs/core/services/auth-guard-bpm.service.md similarity index 91% rename from docs/core/auth-guard-bpm.service.md rename to docs/core/services/auth-guard-bpm.service.md index a54d7ce623..078b6fe372 100644 --- a/docs/core/auth-guard-bpm.service.md +++ b/docs/core/services/auth-guard-bpm.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Auth Guard Bpm service](../../lib/core/services/auth-guard-bpm.service.ts "Defined in auth-guard-bpm.service.ts") +# [Auth Guard Bpm service](../../../lib/core/services/auth-guard-bpm.service.ts "Defined in auth-guard-bpm.service.ts") Adds authentication with Process Services to a route within the app. diff --git a/docs/core/auth-guard-ecm.service.md b/docs/core/services/auth-guard-ecm.service.md similarity index 91% rename from docs/core/auth-guard-ecm.service.md rename to docs/core/services/auth-guard-ecm.service.md index 7a1f537156..98740809c4 100644 --- a/docs/core/auth-guard-ecm.service.md +++ b/docs/core/services/auth-guard-ecm.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Auth Guard Ecm service](../../lib/core/services/auth-guard-ecm.service.ts "Defined in auth-guard-ecm.service.ts") +# [Auth Guard Ecm service](../../../lib/core/services/auth-guard-ecm.service.ts "Defined in auth-guard-ecm.service.ts") Adds authentication with Content Services to a route within the app. diff --git a/docs/core/services/auth-guard-sso-role.service.md b/docs/core/services/auth-guard-sso-role.service.md new file mode 100644 index 0000000000..f40051e974 --- /dev/null +++ b/docs/core/services/auth-guard-sso-role.service.md @@ -0,0 +1,57 @@ +--- +Title: Auth Guard SSO Role service +Added: v3.1.0 +Status: Active +Last reviewed: 2019-03-19 +--- + +# [Auth Guard SSO role service](../../../lib/core/services/auth-guard-sso-role.service.ts "Defined in auth-guard-sso-role.service.ts") + +Checks the user roles of a user. + +## Details + +The [Auth Guard SSO role service](../../core/services/auth-guard-sso-role.service.md) implements an Angular +[route guard](https://angular.io/guide/router#milestone-5-route-guards) +to check the user has the right role permission. This is typically used with the +`canActivate` guard check in the route definition. The roles that user needs to have in order to access the route has to be specified in the roles array as in the example below: + +```ts +const appRoutes: Routes = [ + ... + { + path: 'examplepath', + component: ExampleComponent, + canActivate: [ AuthGuardSsoRoleService ], + data: { roles: ['USER_ROLE1', 'USER_ROLE2']} + }, + ... +] +``` + +If the user now clicks on a link or button that follows this route, they will be not able to access this content if they do not have the roles. + +## Redirect over forbidden + +If the you want to redirect the user to a page after a forbidden access, you can use the **redirectUrl** as in the example below: + +```ts +const appRoutes: Routes = [ + ... + { + path: 'examplepath', + component: ExampleComponent, + canActivate: [ AuthGuardSsoRoleService ], + data: { roles: ['ACTIVITI_USER'], redirectUrl: '/error/403'} + }, + ... +] +``` + +**Note**: you can use this Guard in and with the other ADF auth guards. + +## See also + +- [Auth guard ecm service](auth-guard-ecm.service.md) +- [Auth guard bpm service](auth-guard-bpm.service.md) +- [Auth guard service](auth-guard.service.md) diff --git a/docs/core/auth-guard.service.md b/docs/core/services/auth-guard.service.md similarity index 92% rename from docs/core/auth-guard.service.md rename to docs/core/services/auth-guard.service.md index 9ec28576a7..52b87c811d 100644 --- a/docs/core/auth-guard.service.md +++ b/docs/core/services/auth-guard.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Auth Guard service](../../lib/core/services/auth-guard.service.ts "Defined in auth-guard.service.ts") +# [Auth Guard service](../../../lib/core/services/auth-guard.service.ts "Defined in auth-guard.service.ts") Adds authentication to a route within the app. diff --git a/docs/core/authentication.service.md b/docs/core/services/authentication.service.md similarity index 89% rename from docs/core/authentication.service.md rename to docs/core/services/authentication.service.md index 4cd24a868a..17e244bdbf 100644 --- a/docs/core/authentication.service.md +++ b/docs/core/services/authentication.service.md @@ -2,10 +2,10 @@ Title: Authentication Service Added: v2.0.0 Status: Active -Last reviewed: 2018-11-19 +Last reviewed: 2019-03-19 --- -# [Authentication Service](../../lib/core/services/authentication.service.ts "Defined in authentication.service.ts") +# [Authentication Service](../../../lib/core/services/authentication.service.ts "Defined in authentication.service.ts") Provides authentication to ACS and APS. @@ -72,6 +72,9 @@ Provides authentication to ACS and APS. - **isRememberMeSet**(): `boolean`
Checks whether the "remember me" cookie was set or not. - **Returns** `boolean` - True if set, false otherwise +- **isSSODiscoveryConfigured**(): `boolean`
+ Checks if SSO is configured correctly. + - **Returns** `boolean` - True if configured correctly, false otherwise - **login**(username: `string`, password: `string`, rememberMe: `boolean` = `false`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Logs the user in. - _username:_ `string` - Username for the login @@ -81,9 +84,9 @@ Provides authentication to ACS and APS. - **logout**(): `any`
Logs the user out. - **Returns** `any` - Response event called when logout is complete -- **setRedirect**(url: [`RedirectionModel`](../../lib/core/models/redirection.model.ts))
+- **setRedirect**(url: [`RedirectionModel`](../../../lib/core/models/redirection.model.ts))
Sets the URL to redirect to after login. - - _url:_ [`RedirectionModel`](../../lib/core/models/redirection.model.ts) - URL to redirect to + - _url:_ [`RedirectionModel`](../../../lib/core/models/redirection.model.ts) - URL to redirect to - **ssoImplicitLogin**()
Logs the user in with SSO @@ -111,4 +114,4 @@ export class AppComponent { ## See also -- [Login component](login.component.md) +- [Login component](../components/login.component.md) diff --git a/docs/core/bpm-user.service.md b/docs/core/services/bpm-user.service.md similarity index 66% rename from docs/core/bpm-user.service.md rename to docs/core/services/bpm-user.service.md index 08f2da3cfb..c580f4e9cc 100644 --- a/docs/core/bpm-user.service.md +++ b/docs/core/services/bpm-user.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Bpm User service](../../lib/core/userinfo/services/bpm-user.service.ts "Defined in bpm-user.service.ts") +# [Bpm User service](../../../lib/core/userinfo/services/bpm-user.service.ts "Defined in bpm-user.service.ts") Gets information about the current Process Services user. @@ -13,9 +13,9 @@ Gets information about the current Process Services user. ### Methods -- **getCurrentUserInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmUserModel`](../core/bpm-user.model.md)`>`
+- **getCurrentUserInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmUserModel`](../../core/models/bpm-user.model.md)`>`
Gets information about the current user. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmUserModel`](../core/bpm-user.model.md)`>` - User information object + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmUserModel`](../../core/models/bpm-user.model.md)`>` - User information object - **getCurrentUserProfileImage**(): `string`
Gets the current user's profile image as a URL. - **Returns** `string` - URL string @@ -23,7 +23,7 @@ Gets information about the current Process Services user. ## Details The class returned by `getCurrentUserInfo` is detailed -in the [Bpm User model docs](bpm-user.model.md). +in the [Bpm User model docs](../models/bpm-user.model.md). See the [getProfile](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-activiti-rest-api/docs/ProfileApi.md#getProfile) @@ -33,5 +33,5 @@ methods in the Alfresco JS API for more information about the REST calls used by ## See also -- [Ecm user service](ecm-user.service.md) -- [Bpm user model](bpm-user.model.md) +- [Ecm user service](../services/ecm-user.service.md) +- [Bpm user model](../models/bpm-user.model.md) diff --git a/docs/core/card-item-types.service.md b/docs/core/services/card-item-types.service.md similarity index 53% rename from docs/core/card-item-types.service.md rename to docs/core/services/card-item-types.service.md index cbaeff6591..3aba8f86f6 100644 --- a/docs/core/card-item-types.service.md +++ b/docs/core/services/card-item-types.service.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Card Item Type service](../../lib/core/card-view/services/card-item-types.service.ts "Defined in card-item-types.service.ts") +# [Card Item Type service](../../../lib/core/card-view/services/card-item-types.service.ts "Defined in card-item-types.service.ts") -Maps type names to field component types for the [Card View component](../core/card-view.component.md). +Maps type names to field component types for the [Card View component](../components/card-view.component.md). ## Class members @@ -18,9 +18,9 @@ Maps type names to field component types for the [Card View component](../core/c - _type:_ `string` - The type whose resolver you want - _defaultValue:_ `Type<__type>` - Default type returned for types that are not yet mapped - **Returns** `DynamicComponentResolveFunction` - Resolver function -- **resolveComponentType**(model: [`DynamicComponentModel`](../../lib/core/services/dynamic-component-mapper.service.ts), defaultValue: `Type<__type>` = `this.defaultValue`): `Type<__type>`
+- **resolveComponentType**(model: [`DynamicComponentModel`](../../../lib/core/services/dynamic-component-mapper.service.ts), defaultValue: `Type<__type>` = `this.defaultValue`): `Type<__type>`
Finds the component type that is needed to render a form field. - - _model:_ [`DynamicComponentModel`](../../lib/core/services/dynamic-component-mapper.service.ts) - [Form](../../lib/process-services/task-list/models/form.model.ts) field model for the field to render + - _model:_ [`DynamicComponentModel`](../../../lib/core/services/dynamic-component-mapper.service.ts) - [Form](../../../lib/process-services/task-list/models/form.model.ts) field model for the field to render - _defaultValue:_ `Type<__type>` - Default type returned for field types that are not yet mapped. - **Returns** `Type<__type>` - Component type - **setComponentTypeResolver**(type: `string`, resolver: `DynamicComponentResolveFunction`, override: `boolean` = `true`)
@@ -31,7 +31,7 @@ Maps type names to field component types for the [Card View component](../core/c ## Details -The [Card View component](card-view.component.md) uses this service to find the component +The [Card View component](../components/card-view.component.md) uses this service to find the component type that is required to display a particular field type (text, date, etc). The service maps a type name string to a corresponding `DynamicComponentResolveFunction` that takes a model object as a parameter and returns the component type needed to display that model. @@ -40,20 +40,20 @@ The default mapping is shown below: | Type string | Component | | ----------- | --------- | -| 'text' | [`CardViewTextItemComponent`](../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | -| 'int' | [`CardViewTextItemComponent`](../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | -| 'float' | [`CardViewTextItemComponent`](../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | -| 'date' | [`CardViewDateItemComponent`](../../lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts) | -| 'datetime' | [`CardViewDateItemComponent`](../../lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts) | -| 'bool' | [`CardViewBoolItemComponent`](../../lib/core/card-view/components/card-view-boolitem/card-view-boolitem.component.ts) | -| 'map' | [`CardViewMapItemComponent`](../../lib/core/card-view/components/card-view-mapitem/card-view-mapitem.component.ts) | +| 'text' | [`CardViewTextItemComponent`](../../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | +| 'int' | [`CardViewTextItemComponent`](../../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | +| 'float' | [`CardViewTextItemComponent`](../../../lib/core/card-view/components/card-view-textitem/card-view-textitem.component.ts) | +| 'date' | [`CardViewDateItemComponent`](../../../lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts) | +| 'datetime' | [`CardViewDateItemComponent`](../../../lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts) | +| 'bool' | [`CardViewBoolItemComponent`](../../../lib/core/card-view/components/card-view-boolitem/card-view-boolitem.component.ts) | +| 'map' | [`CardViewMapItemComponent`](../../../lib/core/card-view/components/card-view-mapitem/card-view-mapitem.component.ts) | ### Adding new type mappings You can define your own custom field types for the Card View (see the -[Card View Item interface](card-view-item.interface.md) page for full details of how to do this). -When you have defined the field component, you need to register it with the [Card Item Type service](../../lib/core/card-view/services/card-item-types.service.ts) -so that the [Card View component](../core/card-view.component.md) can make use of it: +[Card View Item interface](../interfaces/card-view-item.interface.md) page for full details of how to do this). +When you have defined the field component, you need to register it with the [Card Item Types service](../../../lib/core/card-view/services/card-item-types.service.ts) +so that the [Card View component](../components/card-view.component.md) can make use of it: ```ts @Component({ @@ -71,5 +71,5 @@ export class SomeParentComponent { ## See also -- [Card View component](card-view.component.md) -- [Card View Item interface](card-view-item.interface.md) +- [Card View component](../components/card-view.component.md) +- [Card View Item interface](../interfaces/card-view-item.interface.md) diff --git a/docs/core/card-view-update.service.md b/docs/core/services/card-view-update.service.md similarity index 74% rename from docs/core/card-view-update.service.md rename to docs/core/services/card-view-update.service.md index b53810290d..959b79173a 100644 --- a/docs/core/card-view-update.service.md +++ b/docs/core/services/card-view-update.service.md @@ -5,13 +5,13 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Card View Update service](../../lib/core/card-view/services/card-view-update.service.ts "Defined in card-view-update.service.ts") +# [Card View Update service](../../../lib/core/card-view/services/card-view-update.service.ts "Defined in card-view-update.service.ts") -Reports edits and clicks within fields of a [Card View component](../core/card-view.component.md). +Reports edits and clicks within fields of a [Card View component](../components/card-view.component.md). ## Details -You can use the [Card View Update service](../core/card-view-update.service.md) to respond to edits and clicks within items on +You can use the [Card View Update service](card-view-update.service.md) to respond to edits and clicks within items on a card view. This might involve updating application data to reflect the changes made to the view or could simply be a matter of highlighting a clicked item. @@ -55,8 +55,8 @@ constructor(private cardViewUpdateService: CardViewUpdateService) { } ``` -The constructor here also sets the [`CardViewTextItemModel`](../../lib/core/card-view/models/card-view-textitem.model.ts) instances that define the layout of the -card view (see the [Card View component](card-view.component.md) for further information +The constructor here also sets the [`CardViewTextItemModel`](../../../lib/core/card-view/models/card-view-textitem.model.ts) instances that define the layout of the +card view (see the [Card View component](../components/card-view.component.md) for further information about this). The model objects and the `key` property are used to identify which item has been clicked or updated when an event occurs. @@ -77,7 +77,7 @@ called after updates and clicks, respectively. ### Responding to updates -The update function is passed a parameter of type [`UpdateNotification`](../../lib/core/card-view/services/card-view-update.service.ts): +The update function is passed a parameter of type [`UpdateNotification`](../../../lib/core/card-view/services/card-view-update.service.ts): ```ts export interface UpdateNotification { @@ -86,8 +86,8 @@ export interface UpdateNotification { } ``` -Here, `target` contains the [`CardViewTextItemModel`](../../lib/core/card-view/models/card-view-textitem.model.ts) that was used to initialize -the field in question (in practice, this might be a [`CardViewDateItemModel`](../../lib/core/card-view/models/card-view-dateitem.model.ts) or [`CardViewMapItemModel`](../../lib/core/card-view/models/card-view-mapitem.model.ts) if +Here, `target` contains the [`CardViewTextItemModel`](../../../lib/core/card-view/models/card-view-textitem.model.ts) that was used to initialize +the field in question (in practice, this might be a [`CardViewDateItemModel`](../../../lib/core/card-view/models/card-view-dateitem.model.ts) or [`CardViewMapItemModel`](../../../lib/core/card-view/models/card-view-mapitem.model.ts) if the card layout includes these objects). The `changed` property contains an object with a single property: ```ts @@ -111,11 +111,11 @@ respondToCardUpdate(un: UpdateNotification) { Note that the function will only be called if the `editable` property of the model object is set to true for this item. Also, the `editable` value of all items will be overridden if `editable` is set to false -on the [Card View component](card-view.component.md) itself. +on the [Card View component](../components/card-view.component.md) itself. ### Responding to clicks -The click function is passed a [`ClickNotification`](../../lib/core/card-view/services/card-view-update.service.ts) object, which is similar to [`UpdateNotification`](../../lib/core/card-view/services/card-view-update.service.ts) described above, +The click function is passed a [`ClickNotification`](../../../lib/core/card-view/services/card-view-update.service.ts) object, which is similar to [`UpdateNotification`](../../../lib/core/card-view/services/card-view-update.service.ts) described above, but without the `changed` property. Use the `target` property to identify the item that was clicked: ```ts @@ -128,4 +128,4 @@ Note that this function will only be called if the `clickable` property of the m ## See also -- [Card view component](card-view.component.md) +- [Card view component](../components/card-view.component.md) diff --git a/docs/core/comment-content.service.md b/docs/core/services/comment-content.service.md similarity index 70% rename from docs/core/comment-content.service.md rename to docs/core/services/comment-content.service.md index da4b68402e..c061aef5dc 100644 --- a/docs/core/comment-content.service.md +++ b/docs/core/services/comment-content.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-04-12 --- -# [Comment Content service](../../lib/core/services/comment-content.service.ts "Defined in comment-content.service.ts") +# [Comment Content service](../../../lib/core/services/comment-content.service.ts "Defined in comment-content.service.ts") Adds and retrieves comments for nodes in Content Services. @@ -13,15 +13,15 @@ Adds and retrieves comments for nodes in Content Services. ### Methods -- **addNodeComment**(nodeId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>`
+- **addNodeComment**(nodeId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>`
Adds a comment to a node. - _nodeId:_ `string` - ID of the target node - _message:_ `string` - Text for the comment - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>` - Details of the comment added -- **getNodeComments**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>` - Details of the comment added +- **getNodeComments**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>`
Gets all comments that have been added to a node. - _nodeId:_ `string` - ID of the target node - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>` - Details for each comment + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>` - Details for each comment ## Details diff --git a/docs/core/comment-process.service.md b/docs/core/services/comment-process.service.md similarity index 66% rename from docs/core/comment-process.service.md rename to docs/core/services/comment-process.service.md index d06baa0b28..87bccb60fc 100644 --- a/docs/core/comment-process.service.md +++ b/docs/core/services/comment-process.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Comment Process service](../../lib/core/services/comment-process.service.ts "Defined in comment-process.service.ts") +# [Comment Process service](../../../lib/core/services/comment-process.service.ts "Defined in comment-process.service.ts") Adds and retrieves comments for task and process instances in Process Services. @@ -13,24 +13,24 @@ Adds and retrieves comments for task and process instances in Process Services. ### Methods -- **addProcessInstanceComment**(processInstanceId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>`
+- **addProcessInstanceComment**(processInstanceId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>`
Adds a comment to a process instance. - _processInstanceId:_ `string` - ID of the target process instance - _message:_ `string` - Text for the comment - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>` - Details of the comment added -- **addTaskComment**(taskId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>` - Details of the comment added +- **addTaskComment**(taskId: `string`, message: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>`
Adds a comment to a task. - _taskId:_ `string` - ID of the target task - _message:_ `string` - Text for the comment - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`>` - Details about the comment -- **getProcessInstanceComments**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`>` - Details about the comment +- **getProcessInstanceComments**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>`
Gets all comments that have been added to a process instance. - _processInstanceId:_ `string` - ID of the target process instance - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>` - Details for each comment -- **getTaskComments**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>` - Details for each comment +- **getTaskComments**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>`
Gets all comments that have been added to a task. - _taskId:_ `string` - ID of the target task - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../lib/core/models/comment.model.ts)`[]>` - Details for each comment + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`CommentModel`](../../../lib/core/models/comment.model.ts)`[]>` - Details for each comment ## Details diff --git a/docs/core/content.service.md b/docs/core/services/content.service.md similarity index 73% rename from docs/core/content.service.md rename to docs/core/services/content.service.md index d9286b186d..04711086d2 100644 --- a/docs/core/content.service.md +++ b/docs/core/services/content.service.md @@ -2,10 +2,10 @@ Title: Content service Added: v2.0.0 Status: Active -Last reviewed: 2018-11-13 +Last reviewed: 2019-03-13 --- -# [Content service](../../lib/core/services/content.service.ts "Defined in content.service.ts") +# [Content service](../../../lib/core/services/content.service.ts "Defined in content.service.ts") Accesses app-generated data objects via URLs and file downloads. @@ -13,12 +13,6 @@ Accesses app-generated data objects via URLs and file downloads. ### Methods -- **createFolder**(relativePath: `string`, name: `string`, parentId?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>`
- Creates a folder. - - _relativePath:_ `string` - Location to create the folder - - _name:_ `string` - Folder name - - _parentId:_ `string` - (Optional) Node ID of parent folder - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>` - Information about the new folder - **createTrustedUrl**(blob: [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)): `string`
Creates a trusted object URL from the [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob). WARNING: calling this method with untrusted user data exposes your application to XSS security risks! - _blob:_ [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) - Data to wrap into object URL @@ -37,13 +31,13 @@ Accesses app-generated data objects via URLs and file downloads. - _fileName:_ `string` - Name of the resulting file. - **getContentUrl**(node: `any`, attachment?: `boolean`, ticket?: `string`): `string`
Gets a content URL for the given node. - - _node:_ `any` - Node to get URL for. + - _node:_ `any` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to get URL for. - _attachment:_ `boolean` - (Optional) Toggles whether to retrieve content as an attachment for download - _ticket:_ `string` - (Optional) Custom ticket to use for authentication - **Returns** `string` - URL string - **getDocumentThumbnailUrl**(node: `any`, attachment?: `boolean`, ticket?: `string`): `string`
Gets a thumbnail URL for the given document node. - - _node:_ `any` - Node to get URL for. + - _node:_ `any` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to get URL for. - _attachment:_ `boolean` - (Optional) Toggles whether to retrieve content as an attachment for download - _ticket:_ `string` - (Optional) Custom ticket to use for authentication - **Returns** `string` - URL string @@ -56,19 +50,20 @@ Accesses app-generated data objects via URLs and file downloads. Gets content for the given node. - _nodeId:_ `string` - ID of the target node - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Content data -- **hasAllowableOperations**(node: `any`): `boolean`
- Checks if the node has the properties allowableOperations - - _node:_ `any` - Node to check allowableOperations - - **Returns** `boolean` - True if the node has the property, false otherwise -- **hasAllowableOperations**(node: `Node`, permission: [`AllowableOperationsEnum`](../../lib/core/models/allowable-operations.enum.ts)`|string`): `boolean`
+- **hasAllowableOperations**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), allowableOperation: [`AllowableOperationsEnum`](../../../lib/core/models/allowable-operations.enum.ts)`|string`): `boolean`
Checks if the user has permissions on that node - - _node:_ `Node` - Node to check allowableOperations - - _permission:_ [`AllowableOperationsEnum`](../../lib/core/models/allowable-operations.enum.ts)`|string` - Create, delete, update, updatePermissions, !create, !delete, !update, !updatePermissions + - _node:_ [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to check allowableOperations + - _allowableOperation:_ [`AllowableOperationsEnum`](../../../lib/core/models/allowable-operations.enum.ts)`|string` - Create, delete, update, updatePermissions, !create, !delete, !update, !updatePermissions + - **Returns** `boolean` - True if the user has the required permissions, false otherwise +- **hasPermissions**(node: [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md), permission: [`PermissionsEnum`](../../../lib/core/models/permissions.enum.ts)`|string`): `boolean`
+ Checks if the user has permission on that node + - _node:_ [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to check permissions + - _permission:_ [`PermissionsEnum`](../../../lib/core/models/permissions.enum.ts)`|string` - Required permission type - **Returns** `boolean` - True if the user has the required permissions, false otherwise ## Details -Use the [Content service](../core/content.service.md) to deliver data to the user from [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) objects. +Use the [Content service](content.service.md) to deliver data to the user from [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) objects. The [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) class (implemented in the browser, not ADF) represents an array of bytes that you can diff --git a/docs/core/cookie.service.md b/docs/core/services/cookie.service.md similarity index 94% rename from docs/core/cookie.service.md rename to docs/core/services/cookie.service.md index 241865613a..0dabc6f10b 100644 --- a/docs/core/cookie.service.md +++ b/docs/core/services/cookie.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Cookie service](../../lib/core/services/cookie.service.ts "Defined in cookie.service.ts") +# [Cookie service](../../../lib/core/services/cookie.service.ts "Defined in cookie.service.ts") Stores key-value data items as browser cookies. diff --git a/docs/core/deleted-nodes-api.service.md b/docs/core/services/deleted-nodes-api.service.md similarity index 58% rename from docs/core/deleted-nodes-api.service.md rename to docs/core/services/deleted-nodes-api.service.md index 7267044651..70d86b1897 100644 --- a/docs/core/deleted-nodes-api.service.md +++ b/docs/core/services/deleted-nodes-api.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-04-05 --- -# [Deleted Nodes Api service](../../lib/core/services/deleted-nodes-api.service.ts "Defined in deleted-nodes-api.service.ts") +# [Deleted Nodes Api service](../../../lib/core/services/deleted-nodes-api.service.ts "Defined in deleted-nodes-api.service.ts") Gets a list of Content Services nodes currently in the trash. @@ -13,14 +13,14 @@ Gets a list of Content Services nodes currently in the trash. ### Methods -- **getDeletedNodes**(options?: `Object`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+- **getDeletedNodes**(options?: `Object`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets a list of nodes in the trash. - _options:_ `Object` - (Optional) Options for JS-API call - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of nodes in the trash + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of nodes in the trash ## Details -The `getDeletedNodes` method returns a [`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts) object that lists +The `getDeletedNodes` method returns a [`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) object that lists the items in the trash. The format of the `options` parameter is described in the [getDeletedNodes](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodesApi.md#getDeletedNodes) page of the Alfresco JS API docs. diff --git a/docs/core/discovery-api.service.md b/docs/core/services/discovery-api.service.md similarity index 58% rename from docs/core/discovery-api.service.md rename to docs/core/services/discovery-api.service.md index e5278f5945..bc18b451b7 100644 --- a/docs/core/discovery-api.service.md +++ b/docs/core/services/discovery-api.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Discovery Api service](../../lib/core/services/discovery-api.service.ts "Defined in discovery-api.service.ts") +# [Discovery Api service](../../../lib/core/services/discovery-api.service.ts "Defined in discovery-api.service.ts") Gets version and license information for Process Services and Content Services. @@ -13,21 +13,21 @@ Gets version and license information for Process Services and Content Services. ### Methods -- **getBpmProductInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmProductVersionModel`](../../lib/core/models/product-version.model.ts)`>`
+- **getBpmProductInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmProductVersionModel`](../../../lib/core/models/product-version.model.ts)`>`
Gets product information for Process Services. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmProductVersionModel`](../../lib/core/models/product-version.model.ts)`>` - ProductVersionModel containing product details -- **getEcmProductInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmProductVersionModel`](../../lib/core/models/product-version.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`BpmProductVersionModel`](../../../lib/core/models/product-version.model.ts)`>` - ProductVersionModel containing product details +- **getEcmProductInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmProductVersionModel`](../../../lib/core/models/product-version.model.ts)`>`
Gets product information for Content Services. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmProductVersionModel`](../../lib/core/models/product-version.model.ts)`>` - ProductVersionModel containing product details + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmProductVersionModel`](../../../lib/core/models/product-version.model.ts)`>` - ProductVersionModel containing product details ## Details The product license and version information is returned using the -classes defined in the [Product Version model](product-version.model.md). +classes defined in the [Product Version model](../models/product-version.model.md). See the [Alfresco JS API docs](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-discovery-rest-api) to learn more about the REST API used by this service. ## See also -- [Product version model](product-version.model.md) +- [Product version model](../models/product-version.model.md) diff --git a/docs/core/download-zip.service.md b/docs/core/services/download-zip.service.md similarity index 96% rename from docs/core/download-zip.service.md rename to docs/core/services/download-zip.service.md index 3e80108a9c..f7a93055e3 100644 --- a/docs/core/download-zip.service.md +++ b/docs/core/services/download-zip.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-08 --- -# [Download zip service](../../lib/core/services/download-zip.service.ts "Defined in download-zip.service.ts") +# [Download zip service](../../../lib/core/services/download-zip.service.ts "Defined in download-zip.service.ts") Creates and manages downloads. diff --git a/docs/core/ecm-user.service.md b/docs/core/services/ecm-user.service.md similarity index 64% rename from docs/core/ecm-user.service.md rename to docs/core/services/ecm-user.service.md index 5456534e97..ddbb175f81 100644 --- a/docs/core/ecm-user.service.md +++ b/docs/core/services/ecm-user.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Ecm User service](../../lib/core/userinfo/services/ecm-user.service.ts "Defined in ecm-user.service.ts") +# [Ecm User service](../../../lib/core/userinfo/services/ecm-user.service.ts "Defined in ecm-user.service.ts") Gets information about a Content Services user. @@ -13,13 +13,13 @@ Gets information about a Content Services user. ### Methods -- **getCurrentUserInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../core/ecm-user.model.md)`>`
+- **getCurrentUserInfo**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`>`
Gets information about the user who is currently logged-in. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../core/ecm-user.model.md)`>` - User information as for getUserInfo -- **getUserInfo**(userName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../core/ecm-user.model.md)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`>` - User information as for getUserInfo +- **getUserInfo**(userName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`>`
Gets information about a user identified by their username. - _userName:_ `string` - Target username - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../core/ecm-user.model.md)`>` - User information + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`EcmUserModel`](../../core/models/ecm-user.model.md)`>` - User information - **getUserProfileImage**(avatarId: `string`): `string`
Returns a profile image as a URL. - _avatarId:_ `string` - Target avatar @@ -28,8 +28,8 @@ Gets information about a Content Services user. ## Details The class returned by `getUserInfo` and `getCurrentUserInfo` is detailed -in the [Ecm User model docs](ecm-user.model.md). The `avatarId` passed to -`getUserProfileImage` is available as a field of the [`EcmUserModel`](../core/ecm-user.model.md) instance +in the [Ecm User model docs](../models/ecm-user.model.md). The `avatarId` passed to +`getUserProfileImage` is available as a field of the [`EcmUserModel`](../../core/models/ecm-user.model.md) instance returned for a particular person. See the @@ -38,5 +38,5 @@ method in the Alfresco JS API for more information about the REST calls used by ## See also -- [Bpm user service](bpm-user.service.md) -- [Ecm user model](ecm-user.model.md) +- [Bpm user service](../services/bpm-user.service.md) +- [Ecm user model](../models/ecm-user.model.md) diff --git a/docs/core/favorites-api.service.md b/docs/core/services/favorites-api.service.md similarity index 67% rename from docs/core/favorites-api.service.md rename to docs/core/services/favorites-api.service.md index 092b3b7296..016d6d056f 100644 --- a/docs/core/favorites-api.service.md +++ b/docs/core/services/favorites-api.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-05-04 --- -# [Favorites Api service](../../lib/core/services/favorites-api.service.ts "Defined in favorites-api.service.ts") +# [Favorites Api service](../../../lib/core/services/favorites-api.service.ts "Defined in favorites-api.service.ts") Gets a list of items a user has marked as their favorites. @@ -13,20 +13,20 @@ Gets a list of items a user has marked as their favorites. ### Methods -- **getFavorites**(personId: `string`, options?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+- **getFavorites**(personId: `string`, options?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets the favorites for a user. - _personId:_ `string` - ID of the user - _options:_ `any` - (Optional) Options supported by JS-API - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of favorites + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of favorites - **remapFavoriteEntries**(entries: `any[]`): `any[]`
- _entries:_ `any[]` - - **Returns** `any[]` - -- **remapFavoritesData**(data: `any` = `{}`): [`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)
+- **remapFavoritesData**(data: `any` = `{}`): [`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)
- _data:_ `any` - - - **Returns** [`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts) - + - **Returns** [`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) - - **remapEntry**(\_\_namedParameters: `Function`): `any`
diff --git a/docs/core/form-rendering.service.md b/docs/core/services/form-rendering.service.md similarity index 51% rename from docs/core/form-rendering.service.md rename to docs/core/services/form-rendering.service.md index a4f6f11b43..1551307936 100644 --- a/docs/core/form-rendering.service.md +++ b/docs/core/services/form-rendering.service.md @@ -5,9 +5,9 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Form Rendering service](../../lib/core/form/services/form-rendering.service.ts "Defined in form-rendering.service.ts") +# [Form Rendering service](../../../lib/core/form/services/form-rendering.service.ts "Defined in form-rendering.service.ts") -Maps a form field type string onto the corresponding form [widget component](../insights/widget.component.md) type. +Maps a form field type string onto the corresponding form [widget component](../../insights/components/widget.component.md) type. ## Class members @@ -18,9 +18,9 @@ Maps a form field type string onto the corresponding form [widget component](../ - _type:_ `string` - The type whose resolver you want - _defaultValue:_ `Type<__type>` - Default type returned for types that are not yet mapped - **Returns** `DynamicComponentResolveFunction` - Resolver function -- **resolveComponentType**(model: [`DynamicComponentModel`](../../lib/core/services/dynamic-component-mapper.service.ts), defaultValue: `Type<__type>` = `this.defaultValue`): `Type<__type>`
+- **resolveComponentType**(model: [`DynamicComponentModel`](../../../lib/core/services/dynamic-component-mapper.service.ts), defaultValue: `Type<__type>` = `this.defaultValue`): `Type<__type>`
Finds the component type that is needed to render a form field. - - _model:_ [`DynamicComponentModel`](../../lib/core/services/dynamic-component-mapper.service.ts) - [Form](../../lib/process-services/task-list/models/form.model.ts) field model for the field to render + - _model:_ [`DynamicComponentModel`](../../../lib/core/services/dynamic-component-mapper.service.ts) - [Form](../../../lib/process-services/task-list/models/form.model.ts) field model for the field to render - _defaultValue:_ `Type<__type>` - Default type returned for field types that are not yet mapped. - **Returns** `Type<__type>` - Component type - **setComponentTypeResolver**(type: `string`, resolver: `DynamicComponentResolveFunction`, override: `boolean` = `true`)
@@ -31,10 +31,10 @@ Maps a form field type string onto the corresponding form [widget component](../ ## Details -The [`Form`](../../lib/process-services/task-list/models/form.model.ts) Field component uses this service to choose which widget to use to render an instance of a -form field. The [`Form`](../../lib/process-services/task-list/models/form.model.ts) Field model stores the field type name as a string (see the table below). -The [`Form`](../../lib/process-services/task-list/models/form.model.ts) Rendering service maintains a mapping between each type name and -a corresponding `DynamicComponentResolveFunction`. The function takes a [`FormFieldModel`](../core/form-field.model.md) object as its argument and +The [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Field component uses this service to choose which widget to use to render an instance of a +form field. The [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Field model stores the field type name as a string (see the table below). +The [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Rendering service maintains a mapping between each type name and +a corresponding `DynamicComponentResolveFunction`. The function takes a [`FormFieldModel`](../../core/models/form-field.model.md) object as its argument and uses the data from the object to determine which widget should be used to render the field. In some cases, the field type string alone is enough to determine the widget type and so the function @@ -60,27 +60,27 @@ formRenderingService.setComponentTypeResolver('text', customResolver, true); ### Default type mapping -The [`Form`](../../lib/process-services/task-list/models/form.model.ts) Rendering service is initialized with the mapping shown in the table below: +The [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Rendering service is initialized with the mapping shown in the table below: | Stencil name | Field type string | Component type | | ------------ | ----------------- | -------------- | -| Amount | "amount" | [`AmountWidgetComponent`](../../lib/core/form/components/widgets/amount/amount.widget.ts) | -| Attach | "upload" | AttachWidgetComponent or [`UploadWidgetComponent`](../../lib/core/form/components/widgets/upload/upload.widget.ts) (based on metadata) | -| Checkbox | "boolean" | [`CheckboxWidgetComponent`](../../lib/core/form/components/widgets/checkbox/checkbox.widget.ts) | -| Date | "date" | [`DateWidgetComponent`](../../lib/core/form/components/widgets/date/date.widget.ts) | -| Display text | "readonly-text" | [`DisplayTextWidgetComponentComponent`](../../lib/core/form/components/widgets/display-text/display-text.widget.ts) | +| Amount | "amount" | [`AmountWidgetComponent`](../../../lib/core/form/components/widgets/amount/amount.widget.ts) | +| Attach | "upload" | AttachWidgetComponent or [`UploadWidgetComponent`](../../../lib/core/form/components/widgets/upload/upload.widget.ts) (based on metadata) | +| Checkbox | "boolean" | [`CheckboxWidgetComponent`](../../../lib/core/form/components/widgets/checkbox/checkbox.widget.ts) | +| Date | "date" | [`DateWidgetComponent`](../../../lib/core/form/components/widgets/date/date.widget.ts) | +| Display text | "readonly-text" | [`DisplayTextWidgetComponentComponent`](../../../lib/core/form/components/widgets/display-text/display-text.widget.ts) | | Display value | "readonly" | DisplayValueWidgetComponent | -| Dropdown | "dropdown" | [`DropdownWidgetComponent`](../../lib/core/form/components/widgets/dropdown/dropdown.widget.ts) | -| Dynamic table | "dynamic-table" | [`DynamicTableWidgetComponent`](../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.ts) | -| Group of people | "functional-group" | [`FunctionalGroupWidgetComponent`](../../lib/core/form/components/widgets/functional-group/functional-group.widget.ts) | -| Header | "group" | [`ContainerWidgetComponent`](../../lib/core/form/components/widgets/container/container.widget.ts) | -| Hyperlink | "hyperlink" | [`HyperlinkWidgetComponent`](../../lib/core/form/components/widgets/hyperlink/hyperlink.widget.ts) | -| Multi-line text | "multi-line-text" | [`MultilineTextWidgetComponentComponent`](../../lib/core/form/components/widgets/multiline-text/multiline-text.widget.ts) | -| Number | "integer" | [`NumberWidgetComponent`](../../lib/core/form/components/widgets/number/number.widget.ts) | -| People | "people" | [`PeopleWidgetComponent`](../../lib/core/form/components/widgets/people/people.widget.ts) | -| Radio buttons | "radio-buttons" | [`RadioButtonsWidgetComponent`](../../lib/core/form/components/widgets/radio-buttons/radio-buttons.widget.ts) | -| Text | "text" | [`TextWidgetComponent`](../../lib/core/form/components/widgets/text/text.widget.ts) | -| Typeahead | "typeahead" | [`TypeaheadWidgetComponent`](../../lib/core/form/components/widgets/typeahead/typeahead.widget.ts) | +| Dropdown | "dropdown" | [`DropdownWidgetComponent`](../../../lib/core/form/components/widgets/dropdown/dropdown.widget.ts) | +| Dynamic table | "dynamic-table" | [`DynamicTableWidgetComponent`](../../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.ts) | +| Group of people | "functional-group" | [`FunctionalGroupWidgetComponent`](../../../lib/core/form/components/widgets/functional-group/functional-group.widget.ts) | +| Header | "group" | [`ContainerWidgetComponent`](../../../lib/core/form/components/widgets/container/container.widget.ts) | +| Hyperlink | "hyperlink" | [`HyperlinkWidgetComponent`](../../../lib/core/form/components/widgets/hyperlink/hyperlink.widget.ts) | +| Multi-line text | "multi-line-text" | [`MultilineTextWidgetComponentComponent`](../../../lib/core/form/components/widgets/multiline-text/multiline-text.widget.ts) | +| Number | "integer" | [`NumberWidgetComponent`](../../../lib/core/form/components/widgets/number/number.widget.ts) | +| People | "people" | [`PeopleWidgetComponent`](../../../lib/core/form/components/widgets/people/people.widget.ts) | +| Radio buttons | "radio-buttons" | [`RadioButtonsWidgetComponent`](../../../lib/core/form/components/widgets/radio-buttons/radio-buttons.widget.ts) | +| Text | "text" | [`TextWidgetComponent`](../../../lib/core/form/components/widgets/text/text.widget.ts) | +| Typeahead | "typeahead" | [`TypeaheadWidgetComponent`](../../../lib/core/form/components/widgets/typeahead/typeahead.widget.ts) | You can add new items to the mapping or replace existing items in order to customize the way fields are rendered. @@ -97,11 +97,11 @@ formRenderingService.setComponentTypeResolver('text', newResolver, true); You would typically use this to replace an existing widget with your own custom version that implements a modified layout or responds differently when the data is entered. See the -[Form Extensibility and Customisation](../user-guide/extensibility.md) guide for further details and examples +[Form Extensibility and Customisation](../../user-guide/extensibility.md) guide for further details and examples of this technique. ## See also -- [Extensibility](../user-guide/extensibility.md) -- [Form field model](form-field.model.md) -- [Form component](form.component.md) +- [Extensibility](../../user-guide/extensibility.md) +- [Form field model](../models/form-field.model.md) +- [Form component](../components/form.component.md) diff --git a/docs/core/form.service.md b/docs/core/services/form.service.md similarity index 67% rename from docs/core/form.service.md rename to docs/core/services/form.service.md index cf088d3fc7..4bf16d9da4 100644 --- a/docs/core/form.service.md +++ b/docs/core/services/form.service.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Form service](../../lib/core/form/services/form.service.ts "Defined in form.service.ts") +# [Form service](../../../lib/core/form/services/form.service.ts "Defined in form.service.ts") Implements Process Services form methods @@ -39,29 +39,29 @@ class MyComponent { | Name | Args Type | Description | | ---- | --------- | ----------- | -| formLoaded | [`FormEvent`](../../lib/core/form/events/form.event.ts) | Raised when form has been loaded or reloaded | -| formFieldValueChanged | [`FormFieldEvent`](../../lib/core/form/events/form-field.event.ts) | Raised when input values change | -| taskCompleted | [`FormEvent`](../../lib/core/form/events/form.event.ts) | Raised when a task is completed successfully | -| taskCompletedError | [`FormErrorEvent`](../../lib/core/form/events/form-error.event.ts) | Raised when a task is completed unsuccessfully | -| taskSaved | [`FormEvent`](../../lib/core/form/events/form.event.ts) | Raised when a task is saved successfully | -| taskSavedError | [`FormErrorEvent`](../../lib/core/form/events/form-error.event.ts) | Raised when a task is saved unsuccessfully | -| executeOutcome | [`FormOutcomeEvent`](../../lib/core/form/components/widgets/core/form-outcome-event.model.ts) | Raised when a form outcome is executed | +| formLoaded | [`FormEvent`](../../../lib/core/form/events/form.event.ts) | Raised when form has been loaded or reloaded | +| formFieldValueChanged | [`FormFieldEvent`](../../../lib/core/form/events/form-field.event.ts) | Raised when input values change | +| taskCompleted | [`FormEvent`](../../../lib/core/form/events/form.event.ts) | Raised when a task is completed successfully | +| taskCompletedError | [`FormErrorEvent`](../../../lib/core/form/events/form-error.event.ts) | Raised when a task is completed unsuccessfully | +| taskSaved | [`FormEvent`](../../../lib/core/form/events/form.event.ts) | Raised when a task is saved successfully | +| taskSavedError | [`FormErrorEvent`](../../../lib/core/form/events/form-error.event.ts) | Raised when a task is saved unsuccessfully | +| executeOutcome | [`FormOutcomeEvent`](../../../lib/core/form/components/widgets/core/form-outcome-event.model.ts) | Raised when a form outcome is executed | | formEvents | Event | You can subscribe to this event to listen : ( click, blur, change, focus, focusin, focusout, input, invalid, select) of any elements in the form , see doc below | -| validateForm | [`ValidateFormEvent`](../../lib/core/form/events/validate-form.event.ts) | Raised each time a form is validated. You can use it to provide custom validation or prevent default behaviour. | -| validateFormField | [`ValidateFormFieldEvent`](../../lib/core/form/events/validate-form-field.event.ts) | Raised each time a form field is validated. You can use it to provide custom validation or prevent default behaviour. | +| validateForm | [`ValidateFormEvent`](../../../lib/core/form/events/validate-form.event.ts) | Raised each time a form is validated. You can use it to provide custom validation or prevent default behaviour. | +| validateFormField | [`ValidateFormFieldEvent`](../../../lib/core/form/events/validate-form-field.event.ts) | Raised each time a form field is validated. You can use it to provide custom validation or prevent default behaviour. | ### Methods -- `parseForm(json: any, data?:`[`FormValues,`](../../lib/core/form/components/widgets/core/form-values.ts)`readOnly: boolean = false):`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) - Parses JSON data to create a corresponding [`Form`](../../lib/process-services/task-list/models/form.model.ts) model. +- `parseForm(json: any, data?:`[`FormValues,`](../../../lib/core/form/components/widgets/core/form-values.ts)`readOnly: boolean = false):`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts) + Parses JSON data to create a corresponding [`Form`](../../../lib/process-services/task-list/models/form.model.ts) model. - `json` - JSON to create the form - `data` - (Optional) Values for the form fields - `readOnly` - Should the form fields be read-only? - `createFormFromANode(formName: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Create a [`Form`](../../lib/process-services/task-list/models/form.model.ts) with a field for each metadata property. + Create a [`Form`](../../../lib/process-services/task-list/models/form.model.ts) with a field for each metadata property. - `formName` - Name of the new form - `createForm(formName: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Create a [`Form`](../../lib/process-services/task-list/models/form.model.ts). + Create a [`Form`](../../../lib/process-services/task-list/models/form.model.ts). - `formName` - Name of the new form - `saveForm(formId: string, formModel: FormDefinitionModel):`[`Observable`](http://reactivex.io/documentation/observable.html)`` Saves a form. @@ -86,20 +86,20 @@ class MyComponent { Gets a task. - `taskId` - Task Id - `saveTaskForm(taskId: string, formValues: FormValues):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Save Task [`Form`](../../lib/process-services/task-list/models/form.model.ts). + Save Task [`Form`](../../../lib/process-services/task-list/models/form.model.ts). - `taskId` - Task Id - - `formValues` - [`Form`](../../lib/process-services/task-list/models/form.model.ts) Values -- `completeTaskForm(taskId: string, formValues:`[`FormValues,`](../../lib/core/form/components/widgets/core/form-values.ts)`outcome?: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Complete Task [`Form`](../../lib/process-services/task-list/models/form.model.ts) + - `formValues` - [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Values +- `completeTaskForm(taskId: string, formValues:`[`FormValues,`](../../../lib/core/form/components/widgets/core/form-values.ts)`outcome?: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` + Complete Task [`Form`](../../../lib/process-services/task-list/models/form.model.ts) - `taskId` - Task Id - - `formValues` - [`Form`](../../lib/process-services/task-list/models/form.model.ts) Values - - `outcome` - (Optional) [`Form`](../../lib/process-services/task-list/models/form.model.ts) Outcome + - `formValues` - [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Values + - `outcome` - (Optional) [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Outcome - `getTaskForm(taskId: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Get [`Form`](../../lib/process-services/task-list/models/form.model.ts) related to a taskId + Get [`Form`](../../../lib/process-services/task-list/models/form.model.ts) related to a taskId - `taskId` - Task Id - `getFormDefinitionById(formId: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` - Get [`Form`](../../lib/process-services/task-list/models/form.model.ts) Definition - - `formId` - [`Form`](../../lib/process-services/task-list/models/form.model.ts) Id + Get [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Definition + - `formId` - [`Form`](../../../lib/process-services/task-list/models/form.model.ts) Id - `getFormDefinitionByName(name: string):`[`Observable`](http://reactivex.io/documentation/observable.html)`` Returns form definition with a given name. - `name` - The form name @@ -133,11 +133,11 @@ class MyComponent { - `getUserProfileImageApi(userId: number): string` Returns a URL for the profile picture of a user. - `userId` - ID of the target user -- [`getWorkflowUsers(filter: string, groupId?: string): Observable`](../core/user-process.model.md) +- [`getWorkflowUsers(filter: string, groupId?: string): Observable`](../../core/models/user-process.model.md) Gets a list of workflow users. - `filter` - Filter to select specific users - `groupId` - (Optional) Group ID for the search -- [`getWorkflowGroups(filter: string, groupId?: string): Observable`](../../lib/core/form/components/widgets/core/group.model.ts) +- [`getWorkflowGroups(filter: string, groupId?: string): Observable`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts) Gets a list of groups in a workflow. - `filter` - Filter to select specific groups - `groupId` - (Optional) Group ID for the search diff --git a/docs/core/highlight-transform.service.md b/docs/core/services/highlight-transform.service.md similarity index 69% rename from docs/core/highlight-transform.service.md rename to docs/core/services/highlight-transform.service.md index 860d5e687f..b1b79b85db 100644 --- a/docs/core/highlight-transform.service.md +++ b/docs/core/services/highlight-transform.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Highlight Transform service](../../lib/core/services/highlight-transform.service.ts "Defined in highlight-transform.service.ts") +# [Highlight Transform service](../../../lib/core/services/highlight-transform.service.ts "Defined in highlight-transform.service.ts") Adds HTML to a string to highlight chosen sections. @@ -13,12 +13,12 @@ Adds HTML to a string to highlight chosen sections. ### Methods -- **highlight**(text: `string`, search: `string`, wrapperClass: `string` = `"highlight"`): [`HighlightTransformResult`](../../lib/core/services/highlight-transform.service.ts)
+- **highlight**(text: `string`, search: `string`, wrapperClass: `string` = `"adf-highlight"`): [`HighlightTransformResult`](../../../lib/core/services/highlight-transform.service.ts)
Searches for `search` string(s) within `text` and highlights all occurrences. - _text:_ `string` - Text to search within - _search:_ `string` - Text pattern to search for - _wrapperClass:_ `string` - CSS class used to provide highlighting style - - **Returns** [`HighlightTransformResult`](../../lib/core/services/highlight-transform.service.ts) - New text along with boolean value to indicate whether anything was highlighted + - **Returns** [`HighlightTransformResult`](../../../lib/core/services/highlight-transform.service.ts) - New text along with boolean value to indicate whether anything was highlighted ## Details @@ -33,7 +33,7 @@ highlight any of those words individually. The <span> element includes a `class` attribute which defaults to "highlight" but you can pass any class name you like using the `wrapperClass` parameter. -The resulting text with HTML highlighting is returned within a [`HighlightTransformResult`](../../lib/core/services/highlight-transform.service.ts) +The resulting text with HTML highlighting is returned within a [`HighlightTransformResult`](../../../lib/core/services/highlight-transform.service.ts) object: ```ts @@ -48,5 +48,5 @@ took place) and true otherwise. ## See also -- [Text highlight pipe](text-highlight.pipe.md) -- [Highlight directive](highlight.directive.md) +- [Text highlight pipe](../pipes/text-highlight.pipe.md) +- [Highlight directive](../directives/highlight.directive.md) diff --git a/docs/core/services/identity-user.service.md b/docs/core/services/identity-user.service.md new file mode 100644 index 0000000000..e77b6392fd --- /dev/null +++ b/docs/core/services/identity-user.service.md @@ -0,0 +1,32 @@ +--- +Title: Identity user service +Added: v3.0.0 +Status: Active +Last reviewed: 2019-02-08 +--- + +# [Identity user service](../../../lib/process-services-cloud/src/lib/services/identity-user.service.ts "Defined in identity-user.service.ts") + +Gets OAuth2 personal details and roles for users. + +## Class members + +### Methods + +- **findUsersByUsername**(username: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ Finds groups filtered by username. + - _username:_ `string` - Object containing the name filter string + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of users information + +## Details + +[OAuth2](https://oauth.net/2/) defines an _access token_ (used when +authenticating a user) and a number of _authentication roles_ that the user +can participate in (see +[this page](https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2) +for an introduction to OAuth2 and a description of the roles). You can use the +[Identity user service](identity-user.service.md) to access this information for users, including the current user. + +## See also + +- [JWT helper service](jwt-helper.service.md) diff --git a/docs/core/jwt-helper.service.md b/docs/core/services/jwt-helper.service.md similarity index 85% rename from docs/core/jwt-helper.service.md rename to docs/core/services/jwt-helper.service.md index 54a7296e03..41051f4506 100644 --- a/docs/core/jwt-helper.service.md +++ b/docs/core/services/jwt-helper.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-09 --- -# [JWT helper service](../../lib/core/services/jwt-helper.service.ts "Defined in jwt-helper.service.ts") +# [JWT helper service](../../../lib/core/services/jwt-helper.service.ts "Defined in jwt-helper.service.ts") Decodes a JSON Web Token (JWT) to a JavaScript object. diff --git a/docs/core/log.service.md b/docs/core/services/log.service.md similarity index 92% rename from docs/core/log.service.md rename to docs/core/services/log.service.md index aba22f116a..e20efac49a 100644 --- a/docs/core/log.service.md +++ b/docs/core/services/log.service.md @@ -5,13 +5,13 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Log Service](../../lib/core/services/log.service.ts "Defined in log.service.ts") +# [Log Service](../../../lib/core/services/log.service.ts "Defined in log.service.ts") Provides log functionality. ## Basic Usage -**[app.component](../../demo-shell/src/app/app.component.ts).ts** +**app.component.ts** ```ts import { LogService } from '@alfresco/adf-core'; @@ -64,10 +64,10 @@ export class AppComponent { Logs a message at the "ERROR" level. - _message:_ `any` - (Optional) Message to log - _optionalParams:_ `any[]` - Interpolation values for the message in "printf" format -- **getLogLevel**(level: `string`): [`LogLevelsEnum`](../../lib/core/models/log-levels.model.ts)
+- **getLogLevel**(level: `string`): [`LogLevelsEnum`](../../../lib/core/models/log-levels.model.ts)
Converts a log level name string into its numeric equivalent. - _level:_ `string` - Level name - - **Returns** [`LogLevelsEnum`](../../lib/core/models/log-levels.model.ts) - Numeric log level + - **Returns** [`LogLevelsEnum`](../../../lib/core/models/log-levels.model.ts) - Numeric log level - **group**(groupTitle?: `string`, optionalParams: `any[]`)
Starts an indented group of log messages. - _groupTitle:_ `string` - (Optional) Title shown at the start of the group @@ -125,7 +125,7 @@ For example, you can set the default log level to `WARNING` as follows: ### Log message bus -The [log service](../core/log.service.md) also provides an +The [log service](log.service.md) also provides an [`Observable`](http://reactivex.io/documentation/observable.html) called `_onMessage_` that you can subscribe to if you want to receive all the log messages. The message object passed as a parameter to the `onMessage` handler has the following format: diff --git a/docs/core/login-dialog.service.md b/docs/core/services/login-dialog.service.md similarity index 69% rename from docs/core/login-dialog.service.md rename to docs/core/services/login-dialog.service.md index 142a1a50ca..35d5a21f92 100644 --- a/docs/core/login-dialog.service.md +++ b/docs/core/services/login-dialog.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-02-08 --- -# [Login Dialog service](../../lib/core/services/login-dialog.service.ts "Defined in login-dialog.service.ts") +# [Login Dialog service](../../../lib/core/services/login-dialog.service.ts "Defined in login-dialog.service.ts") Manages login dialogs. @@ -22,10 +22,10 @@ Manages login dialogs. ## Details Use the methods of this service to manage login dialogs from code. As an alternative, you may -find it easier to use the [Login dialog component](login-dialog.component.md) to display the +find it easier to use the [Login dialog component](../components/login-dialog.component.md) to display the dialog directly from HTML. ## See also -- [Login dialog component](login-dialog.component.md) -- [Login component](login.component.md) +- [Login dialog component](../components/login-dialog.component.md) +- [Login component](../components/login.component.md) diff --git a/docs/core/services/node.service.md b/docs/core/services/node.service.md new file mode 100644 index 0000000000..6e3b7fcbd3 --- /dev/null +++ b/docs/core/services/node.service.md @@ -0,0 +1,57 @@ +--- +Title: Node Service +Added: v2.0.0 +Status: Active +Last reviewed: 2018-11-20 +--- + +# [Node Service](../../../lib/core/form/services/node.service.ts "Defined in node.service.ts") + +Gets Alfresco Repository node metadata and creates nodes with metadata. + +## Class members + +### Methods + +- **createNode**(name: `string`, nodeType: `string`, properties: `any`, path: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>`
+ Create a new Node from form metadata + - _name:_ `string` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) name + - _nodeType:_ `string` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) type + - _properties:_ `any` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) body properties + - _path:_ `string` - Path to the node + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>` - The created node +- **createNodeMetadata**(nodeType: `string`, nameSpace: `any`, data: `any`, path: `string`, name?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>`
+ Create a new Node from form metadata. + - _nodeType:_ `string` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) type + - _nameSpace:_ `any` - Namespace for properties + - _data:_ `any` - [Property](../../../lib/content-services/content-metadata/interfaces/property.interface.ts) data to store in the node under namespace + - _path:_ `string` - Path to the node + - _name:_ `string` - (Optional) [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) name + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`>` - The created node +- **getNodeMetadata**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeMetadata`](../../../lib/core/form/models/node-metadata.model.ts)`>`
+ Get the metadata and the nodeType for a nodeId cleaned by the prefix. + - _nodeId:_ `string` - ID of the target node + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeMetadata`](../../../lib/core/form/models/node-metadata.model.ts)`>` - Node metadata + +## Details + +Note that this service cannot be used to create nodes with content. + +The `path` parameter to `createNode` and `createNodeMetadata` specifies an intermediate +path of folders to create between the root and the target node. + +### Importing + +```ts +import { NodeService } from '@alfresco/adf-core'; + +export class SomePageComponent implements OnInit { + + constructor(private nodeService: NodeService) { + } +``` + +## See also + +- [Nodes api service](nodes-api.service.md) +- [Deleted nodes api service](deleted-nodes-api.service.md) diff --git a/docs/core/nodes-api.service.md b/docs/core/services/nodes-api.service.md similarity index 88% rename from docs/core/nodes-api.service.md rename to docs/core/services/nodes-api.service.md index 447feec378..7715704909 100644 --- a/docs/core/nodes-api.service.md +++ b/docs/core/services/nodes-api.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Nodes Api service](../../lib/core/services/nodes-api.service.ts "Defined in nodes-api.service.ts") +# [Nodes Api service](../../../lib/core/services/nodes-api.service.ts "Defined in nodes-api.service.ts") Accesses and manipulates ACS document nodes using their node IDs. @@ -46,11 +46,11 @@ Accesses and manipulates ACS document nodes using their node IDs. - _nodeId:_ `string` - ID of the target node - _options:_ `any` - Optional parameters supported by JS-API - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md)`>` - Node information -- **getNodeChildren**(nodeId: `string`, options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+- **getNodeChildren**(nodeId: `string`, options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets the items contained in a folder node. - _nodeId:_ `string` - ID of the target node - _options:_ `any` - Optional parameters supported by JS-API - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of child items from the folder + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of child items from the folder - **restoreNode**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md)`>`
Restores a node previously moved to the trashcan. - _nodeId:_ `string` - ID of the node to restore @@ -73,7 +73,7 @@ by dashes, eg: The string is convenient for storage, for passing as an [Angular route parameter](https://angular.io/guide/router) and other purposes but doesn't enable you to do very much with the node itself. -The [Nodes Api Service](../core/nodes-api.service.md) has methods for getting information about nodes and +The [Nodes Api Service](nodes-api.service.md) has methods for getting information about nodes and managing them within the repository (creating, deleting, etc). Other lower level interfaces to the ACS nodes API are also available - see the @@ -85,7 +85,7 @@ for more information. ### Getting node information -The `getNode` method gives access to the [MinimalNode](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md) object that represents the +The `getNode` method gives access to the [`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md) object that represents the details of a node: ```ts @@ -111,11 +111,11 @@ modification dates, etc. Also, the `id` and `parentId` properties contain the no ID strings for the current node and its enclosing folder. Sometimes, a [`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md) is provided directly, for example, the `folderNode` property -of a [Document List component](../content-services/document-list.component.md) or the data context of a -[Document List row](../content-services/document-list.component.md#underlying-node-object). In these cases, +of a [Document List component](../../content-services/components/document-list.component.md) or the data context of a +[Document List row](../../content-services/components/document-list.component.md#underlying-node-object). In these cases, you might pass the `id` or `parentId` as a [route parameter](https://angular.io/guide/router) to a page describing the node in full detail. The component receiving the node ID can -use the [Nodes Api service](../core/nodes-api.service.md) to "decode" the ID string into a `MinimalNode`: +use the [Nodes Api service](nodes-api.service.md) to "decode" the ID string into a [`MinimalNode`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeMinimalEntry.md): ```ts import { ActivatedRoute, Router } from '@angular/router'; @@ -188,5 +188,5 @@ pages in the Alfresco JS API for further details and options. Note that you can ## See also - [Deleted nodes api service](deleted-nodes-api.service.md) -- [Document list component](../content-services/document-list.component.md) +- [Document list component](../../content-services/components/document-list.component.md) - [Node service](node.service.md) diff --git a/docs/core/notification.service.md b/docs/core/services/notification.service.md similarity index 81% rename from docs/core/notification.service.md rename to docs/core/services/notification.service.md index 01710781de..e72c2070e6 100644 --- a/docs/core/notification.service.md +++ b/docs/core/services/notification.service.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Notification Service](../../lib/core/services/notification.service.ts "Defined in notification.service.ts") +# [Notification Service](../../../lib/core/services/notification.service.ts "Defined in notification.service.ts") Shows a notification message with optional feedback. -![Notification Service screenshot](../docassets/images/NotiService.png) +![Notification Service screenshot](../../docassets/images/NotiService.png) ## Class members @@ -17,12 +17,12 @@ Shows a notification message with optional feedback. - **dismissSnackMessageAction**()
dismiss the notification snackbar -- **openSnackMessage**(message: `string`, config: `number|MatSnackBarConfig` = [`NotificationService`](../core/notification.service.md)`.DEFAULT_DURATION_MESSAGE`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)``
+- **openSnackMessage**(message: `string`, config: `number|MatSnackBarConfig` = [`NotificationService`](../../core/services/notification.service.md)`.DEFAULT_DURATION_MESSAGE`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)``
Opens a SnackBar notification to show a message. - _message:_ `string` - The message (or resource key) to show. - _config:_ `number|MatSnackBarConfig` - Time before notification disappears after being shown or MatSnackBarConfig object - **Returns** [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)`` - Information/control object for the SnackBar -- **openSnackMessageAction**(message: `string`, action: `string`, config: `number|MatSnackBarConfig` = [`NotificationService`](../core/notification.service.md)`.DEFAULT_DURATION_MESSAGE`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)``
+- **openSnackMessageAction**(message: `string`, action: `string`, config: `number|MatSnackBarConfig` = [`NotificationService`](../../core/services/notification.service.md)`.DEFAULT_DURATION_MESSAGE`): [`MatSnackBarRef`](https://material.angular.io/components/snack-bar/overview)``
Opens a SnackBar notification with a message and a response button. - _message:_ `string` - The message (or resource key) to show. - _action:_ `string` - Caption for the response button @@ -31,7 +31,7 @@ Shows a notification message with optional feedback. ## Details -The [Notification Service](../core/notification.service.md) is implemented on top of the Angular Material Design snackbar. +The [Notification Service](notification.service.md) is implemented on top of the Angular Material Design snackbar. Use this service to show a notification message, and optionally get feedback from it. ```ts diff --git a/docs/core/page-title.service.md b/docs/core/services/page-title.service.md similarity index 87% rename from docs/core/page-title.service.md rename to docs/core/services/page-title.service.md index e9afbc12a6..849bd1ee31 100644 --- a/docs/core/page-title.service.md +++ b/docs/core/services/page-title.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Page Title service](../../lib/core/services/page-title.service.ts "Defined in page-title.service.ts") +# [Page Title service](../../../lib/core/services/page-title.service.ts "Defined in page-title.service.ts") Sets the page title. diff --git a/docs/core/people-content.service.md b/docs/core/services/people-content.service.md similarity index 80% rename from docs/core/people-content.service.md rename to docs/core/services/people-content.service.md index f0dd4394b0..2b91ec0a22 100644 --- a/docs/core/people-content.service.md +++ b/docs/core/services/people-content.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-04-06 --- -# [People Content service](../../lib/core/services/people-content.service.ts "Defined in people-content.service.ts") +# [People Content service](../../../lib/core/services/people-content.service.ts "Defined in people-content.service.ts") Gets information about a Content Services user. @@ -24,8 +24,8 @@ Gets information about a Content Services user. ## Details The class returned by `getPerson` and `getCurrentPerson` is detailed -in the [Ecm User model docs](ecm-user.model.md). The `avatarId` passed to -`getUserProfileImage` is available as a field of the [`EcmUserModel`](../core/ecm-user.model.md) instance +in the [Ecm User model docs](../models/ecm-user.model.md). The `avatarId` passed to +`getUserProfileImage` is available as a field of the [`EcmUserModel`](../../core/models/ecm-user.model.md) instance returned for a particular person. See the @@ -35,4 +35,4 @@ method in the Alfresco JS API for more information about the REST calls used by ## See also - [People process service](people-process.service.md) -- [Ecm user model](ecm-user.model.md) +- [Ecm user model](../models/ecm-user.model.md) diff --git a/docs/core/people-process.service.md b/docs/core/services/people-process.service.md similarity index 68% rename from docs/core/people-process.service.md rename to docs/core/services/people-process.service.md index f2b79db067..10a4a3abbf 100644 --- a/docs/core/people-process.service.md +++ b/docs/core/services/people-process.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-04-05 --- -# [People Process service](../../lib/core/services/people-process.service.ts "Defined in people-process.service.ts") +# [People Process service](../../../lib/core/services/people-process.service.ts "Defined in people-process.service.ts") Gets information about Process Services users. @@ -13,25 +13,25 @@ Gets information about Process Services users. ### Methods -- **getUserImage**(user: [`UserProcessModel`](../core/user-process.model.md)): `string`
+- **getUserImage**(user: [`UserProcessModel`](../../core/models/user-process.model.md)): `string`
Gets the profile picture URL for the specified user. - - _user:_ [`UserProcessModel`](../core/user-process.model.md) - The target user + - _user:_ [`UserProcessModel`](../../core/models/user-process.model.md) - The target user - **Returns** `string` - Profile picture URL -- **getWorkflowUsers**(taskId?: `string`, searchWord?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>`
+- **getWorkflowUsers**(taskId?: `string`, searchWord?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>`
Gets information about users across all tasks. - _taskId:_ `string` - (Optional) ID of the task - _searchWord:_ `string` - (Optional) Filter text to search for - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>` - Array of user information objects -- **involveUserWithTask**(taskId: `string`, idToInvolve: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>` - Array of user information objects +- **involveUserWithTask**(taskId: `string`, idToInvolve: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>`
Sets a user to be involved with a task. - _taskId:_ `string` - ID of the target task - _idToInvolve:_ `string` - ID of the user to involve - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>` - Empty response when the update completes -- **removeInvolvedUser**(taskId: `string`, idToRemove: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>` - Empty response when the update completes +- **removeInvolvedUser**(taskId: `string`, idToRemove: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>`
Removes a user who is currently involved with a task. - _taskId:_ `string` - ID of the target task - _idToRemove:_ `string` - ID of the user to remove - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>` - Empty response when the update completes + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>` - Empty response when the update completes ## Details @@ -40,7 +40,7 @@ in the task name. The `taskId` parameter, if used, specifies a task to be _exclu results. You would typically use this feature to find new users to assign to a task, in which case you would want to exclude users already assigned to that task. -The [User Process model](user-process.model.md) class used by the methods is seen throughout +The [User Process model](../models/user-process.model.md) class used by the methods is seen throughout ADF's Process Services features. Note that for `involveUserWithTask` and `removeInvolvedUser`, null data is returned rather than usable details about users. @@ -53,6 +53,6 @@ You can find more information about the REST API methods used by this service in ## See also -- [User process model](user-process.model.md) -- [Bpm user model](bpm-user.model.md) +- [User process model](../models/user-process.model.md) +- [Bpm user model](../models/bpm-user.model.md) - [People content service](people-content.service.md) diff --git a/docs/core/process-content.service.md b/docs/core/services/process-content.service.md similarity index 96% rename from docs/core/process-content.service.md rename to docs/core/services/process-content.service.md index 832b0f1bfc..06da886eb9 100644 --- a/docs/core/process-content.service.md +++ b/docs/core/services/process-content.service.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Process Content Service](../../lib/core/form/services/process-content.service.ts "Defined in process-content.service.ts") +# [Process Content Service](../../../lib/core/form/services/process-content.service.ts "Defined in process-content.service.ts") Manipulates content related to a Process Instance or Task Instance in APS. @@ -52,13 +52,15 @@ Manipulates content related to a Process Instance or Task Instance in APS. Gets a URL for direct access to a related content file. - _contentId:_ `number` - ID of the related content - **Returns** `string` - URL to access the content -- **getProcessRelatedContent**(processId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+- **getProcessRelatedContent**(processId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Gets related content items for a process instance. - _processId:_ `string` - ID of the target process + - _opts:_ `any` - (Optional) Options supported by JS-API - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Metadata for the content -- **getTaskRelatedContent**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+- **getTaskRelatedContent**(taskId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Gets related content items for a task instance. - _taskId:_ `string` - ID of the target task + - _opts:_ `any` - (Optional) Options supported by JS-API - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Metadata for the content - **handleError**(error: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Reports an error message. diff --git a/docs/core/renditions.service.md b/docs/core/services/renditions.service.md similarity index 94% rename from docs/core/renditions.service.md rename to docs/core/services/renditions.service.md index 7686ab669a..3da126c3f3 100644 --- a/docs/core/renditions.service.md +++ b/docs/core/services/renditions.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-23 --- -# [Renditions service](../../lib/core/services/renditions.service.ts "Defined in renditions.service.ts") +# [Renditions service](../../../lib/core/services/renditions.service.ts "Defined in renditions.service.ts") Manages prearranged conversions of content to different formats. @@ -67,9 +67,9 @@ _rendition_ is a prearranged conversion that is set up for an item for convenien repeated use. More information about renditions is available in the [Content Services documentation](https://docs.alfresco.com/5.2/references/dev-extension-points-content-transformer.html). -In the [Renditions service](../core/renditions.service.md) methods, the `nodeId` is a string identifying the content +In the [Renditions service](renditions.service.md) methods, the `nodeId` is a string identifying the content node that the rendition applies to. This can be obtained from -[Document List component](../content-services/document-list.component.md) events and various other places +[Document List component](../../content-services/components/document-list.component.md) events and various other places in the ADF API. The `encoding` identifies the conversion performed by the rendition. See the diff --git a/docs/core/search-configuration.service.md b/docs/core/services/search-configuration.service.md similarity index 68% rename from docs/core/search-configuration.service.md rename to docs/core/services/search-configuration.service.md index 2a973c7d84..008e8e0bba 100644 --- a/docs/core/search-configuration.service.md +++ b/docs/core/services/search-configuration.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-09-13 --- -# [Search Configuration service](../../lib/core/services/search-configuration.service.ts "Defined in search-configuration.service.ts") +# [Search Configuration service](../../../lib/core/services/search-configuration.service.ts "Defined in search-configuration.service.ts") Provides fine control of parameters to a search. @@ -28,12 +28,12 @@ object. This configures the search to use `searchTerm` along with `maxResults` a specified for the paging of the search results. This service is a standard implementation of the -[Search configuration interface](search-configuration.interface.md) that works well for many +[Search configuration interface](../interfaces/search-configuration.interface.md) that works well for many common cases. However, you can also supply your own implementation if you need to. See the -[Search configuration interface](search-configuration.interface.md) page for full details and +[Search configuration interface](../interfaces/search-configuration.interface.md) page for full details and example code. ## See also -- [Search component](../content-services/search.component.md) -- [Search configuration interface](search-configuration.interface.md) +- [Search component](../../content-services/components/search.component.md) +- [Search configuration interface](../interfaces/search-configuration.interface.md) diff --git a/docs/core/search.service.md b/docs/core/services/search.service.md similarity index 50% rename from docs/core/search.service.md rename to docs/core/services/search.service.md index 23d3ba3795..04b94721f9 100644 --- a/docs/core/search.service.md +++ b/docs/core/services/search.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-12-03 --- -# [Search service](../../lib/core/services/search.service.ts "Defined in search.service.ts") +# [Search service](../../../lib/core/services/search.service.ts "Defined in search.service.ts") Accesses the Content Services Search API. @@ -13,32 +13,32 @@ Accesses the Content Services Search API. ### Methods -- **getNodeQueryResults**(term: `string`, options?: [`SearchOptions`](../../lib/core/services/search.service.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+- **getNodeQueryResults**(term: `string`, options?: [`SearchOptions`](../../../lib/core/services/search.service.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets a list of nodes that match the given search criteria. - _term:_ `string` - Term to search for - - _options:_ [`SearchOptions`](../../lib/core/services/search.service.ts) - (Optional) Options for delivery of the search results - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of nodes resulting from the search -- **search**(searchTerm: `string`, maxResults: `number`, skipCount: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+ - _options:_ [`SearchOptions`](../../../lib/core/services/search.service.ts) - (Optional) Options for delivery of the search results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of nodes resulting from the search +- **search**(searchTerm: `string`, maxResults: `number`, skipCount: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Performs a search. - _searchTerm:_ `string` - Term to search for - _maxResults:_ `number` - Maximum number of items in the list of results - _skipCount:_ `number` - Number of higher-ranked items to skip over in the list - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of search results -- **searchByQueryBody**(queryBody: `QueryBody`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of search results +- **searchByQueryBody**(queryBody: `QueryBody`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Performs a search with its parameters supplied by a QueryBody object. - _queryBody:_ `QueryBody` - Object containing the search parameters - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of search results + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of search results ## Details See the [search method](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-search-rest-api/docs/SearchApi.md#search) in the Alfresco JS-API for the format of the query and returned data. -The [Search Configuration service](../core/search-configuration.service.md) +The [Search Configuration service](../services/search-configuration.service.md) has a method to generate the QueryBody object used by `searchByQueryBody`. The properties of the -SearchOptions +[`SearchOptions`](../../../lib/core/services/search.service.ts) interface are documented in source file comments. ## See also -- [Search Configuration service](../core/search-configuration.service.md) +- [Search Configuration service](../services/search-configuration.service.md) diff --git a/docs/core/shared-links-api.service.md b/docs/core/services/shared-links-api.service.md similarity index 57% rename from docs/core/shared-links-api.service.md rename to docs/core/services/shared-links-api.service.md index 18410b2d1a..6229f05c25 100644 --- a/docs/core/shared-links-api.service.md +++ b/docs/core/services/shared-links-api.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-06-08 --- -# [Shared Links Api service](../../lib/core/services/shared-links-api.service.ts "Defined in shared-links-api.service.ts") +# [Shared Links Api service](../../../lib/core/services/shared-links-api.service.ts "Defined in shared-links-api.service.ts") Finds shared links to Content Services items. @@ -13,19 +13,19 @@ Finds shared links to Content Services items. ### Methods -- **createSharedLinks**(nodeId: `string`, options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+- **createSharedLinks**(nodeId: `string`, options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkEntry.md)`>`
Creates a shared link available to the current user. - _nodeId:_ `string` - ID of the node to link to - _options:_ `any` - Options supported by JS-API - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - The shared link just created -- **deleteSharedLink**(sharedId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkEntry.md)`>` - The shared link just created +- **deleteSharedLink**(sharedId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkEntry.md)`>`
Deletes a shared link. - _sharedId:_ `string` - ID of the link to delete - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Null response notifying when the operation is complete -- **getSharedLinks**(options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SharedLinkEntry`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/SharedLinkEntry.md)`>` - Null response notifying when the operation is complete +- **getSharedLinks**(options: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>`
Gets shared links available to the current user. - _options:_ `any` - Options supported by JS-API - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts)`>` - List of shared links + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md)`>` - List of shared links ## Details diff --git a/docs/core/sites.service.md b/docs/core/services/sites.service.md similarity index 90% rename from docs/core/sites.service.md rename to docs/core/services/sites.service.md index 93e939b9ed..ff830f9170 100644 --- a/docs/core/sites.service.md +++ b/docs/core/services/sites.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Sites service](../../lib/core/services/sites.service.ts "Defined in sites.service.ts") +# [Sites service](../../../lib/core/services/sites.service.ts "Defined in sites.service.ts") Accesses and manipulates sites from a Content Services repository. @@ -21,19 +21,19 @@ Accesses and manipulates sites from a Content Services repository. - **getEcmCurrentLoggedUserName**(): `string`
Gets the username of the user currently logged into ACS. - **Returns** `string` - Username string -- **getSite**(siteId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>`
+- **getSite**(siteId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>`
Gets the details for a site. - _siteId:_ `string` - ID of the target site - _opts:_ `any` - (Optional) Options supported by JS-API - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>` - Information about the site -- **getSiteContent**(siteId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>` - Information about the site +- **getSiteContent**(siteId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>`
Gets a site's content. - _siteId:_ `string` - ID of the target site - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>` - Site content -- **getSiteMembers**(siteId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>` - Site content +- **getSiteMembers**(siteId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>`
Gets a list of all a site's members. - _siteId:_ `string` - ID of the target site - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`>` - Site members + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SiteEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SiteEntry.md)`|__type>` - Site members - **getSites**(opts: `any` = `{}`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SitePaging`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/SitePaging.md)`>`
Gets a list of all sites in the repository. - _opts:_ `any` - Options supported by JS-API diff --git a/docs/core/storage.service.md b/docs/core/services/storage.service.md similarity index 94% rename from docs/core/storage.service.md rename to docs/core/services/storage.service.md index e34971609b..90435c6731 100644 --- a/docs/core/storage.service.md +++ b/docs/core/services/storage.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Storage service](../../lib/core/services/storage.service.ts "Defined in storage.service.ts") +# [Storage service](../../../lib/core/services/storage.service.ts "Defined in storage.service.ts") Stores items in the form of key-value pairs. diff --git a/docs/core/services/thumbnail.service.md b/docs/core/services/thumbnail.service.md new file mode 100644 index 0000000000..4c7f3d6149 --- /dev/null +++ b/docs/core/services/thumbnail.service.md @@ -0,0 +1,72 @@ +--- +Title: Thumbnail service +Added: v2.0.0 +Status: Active +Last reviewed: 2019-03-20 +--- + +# [Thumbnail service](../../../lib/core/services/thumbnail.service.ts "Defined in thumbnail.service.ts") + +Retrieves an SVG thumbnail image to represent a document type. + +## Class members + +### Methods + +- **getDefaultMimeTypeIcon**(): `string`
+ Gets a "miscellaneous" thumbnail URL for types with no other icon defined. + - **Returns** `string` - URL string +- **getDocumentThumbnailUrl**(node: `any`): `string`
+ Gets a thumbnail URL for the given document node. + - _node:_ `any` - [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) to get URL for. + - **Returns** `string` - URL string +- **getMimeTypeIcon**(mimeType: `string`): `string`
+ Gets a thumbnail URL for a MIME type. + - _mimeType:_ `string` - MIME type for the thumbnail + - **Returns** `string` - URL string + +## Details + +The service can locate a thumbnail icon (in SVG format) for either +a document node or a MIME type. The default mapping between types +and icons is shown in the table below: + +| Document | Icon | Types | +| -------- | ---- | ----- | +| Compressed archive | ![Archive thumbnail](../../docassets/images/ft_ic_archive.png) | 'application/x-compressed', 'application/x-zip-compressed', 'application/zip' | +| Text | ![Text thumbnail](../../docassets/images/ft_ic_document.png) | 'text/plain', 'application/json', 'application/x-javascript', 'application/vnd.apple.pages' | +| Bitmap/raster image | ![Bitmap thumbnail](../../docassets/images/ft_ic_raster_image.png) | 'image/png', 'image/jpeg', 'image/gif' | +| MP4 video | ![MP4 thumbnail](../../docassets/images/ft_ic_video.png) | 'video/mp4' | +| SVG vector image | ![SVG thumbnail](../../docassets/images/ft_ic_vector_image.png) | 'image/svg+xml' | +| HTML file | ![HTML thumbnail](../../docassets/images/ft_ic_website.png) | 'text/html' | +| PDF file | ![PDF thumbnail](../../docassets/images/ft_ic_pdf.png) | 'application/pdf' | +| Folder | ![Folder thumbnail](../../docassets/images/ft_ic_folder.png) | | +| Disabled folder | ![Disabled folder thumbnail](../../docassets/images/ft_ic_folder_disable.png) | | +| Excel spreadsheet | ![Spreadsheet thumbnail](../../docassets/images/ft_ic_ms_excel.png) | 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' | +| PowerPoint slideshow | ![PowerPoint thumbnail](../../docassets/images/ft_ic_ms_powerpoint.png) | 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' | +| Word document | ![Word thumbnail](../../docassets/images/ft_ic_ms_word.png) | 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' | +| Keynote presentation | ![Keynote thumbnail](../../docassets/images/ft_ic_presentation.png) | 'application/vnd.apple.keynote' | +| Numbers spreadsheet | ![Numbers thumbnail](../../docassets/images/ft_ic_spreadsheet.png) | 'application/vnd.apple.numbers' | + +### Mat-icon + +All the ADF icons for MIME types are now registered into the [`MatIconRegistry`](https://material.angular.io/components/icon/api), so you can use all +the icons via the <mat-icon> tag: + +```javascript +import { ThumbnailService } from '@alfresco/adf-core'; + +constructor(public thumbnailService: ThumbnailService) { +}‍‍‍‍‍‍‍‍ +``` + +```html +MP4 +PDF +GIF +..... +``` + +## See also + +- [Mime type icon pipe](../pipes/mime-type-icon.pipe.md) diff --git a/docs/core/translation.service.md b/docs/core/services/translation.service.md similarity index 94% rename from docs/core/translation.service.md rename to docs/core/services/translation.service.md index 2a748546e7..884a07958b 100644 --- a/docs/core/translation.service.md +++ b/docs/core/services/translation.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-02-08 --- -# [Translation service](../../lib/core/services/translation.service.ts "Defined in translation.service.ts") +# [Translation service](../../../lib/core/services/translation.service.ts "Defined in translation.service.ts") Supports localisation. @@ -165,7 +165,7 @@ You can register as many entries as you like. Depending on your application, you may want to have buttons or dropdown menus to allow language selection for the end users. -You can use [`TranslationService`](../core/translation.service.md) to switch languages from your code based on input events of your choice: +You can use [`TranslationService`](../../core/services/translation.service.md) to switch languages from your code based on input events of your choice: ```ts class MyComponent { @@ -180,4 +180,4 @@ class MyComponent { ## See Also -- [Internationalization](../user-guide/internationalization.md) +- [Internationalization](../../user-guide/internationalization.md) diff --git a/docs/core/upload.service.md b/docs/core/services/upload.service.md similarity index 51% rename from docs/core/upload.service.md rename to docs/core/services/upload.service.md index d2b3622052..f31ac97276 100644 --- a/docs/core/upload.service.md +++ b/docs/core/services/upload.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Upload Service](../../lib/core/services/upload.service.ts "Defined in upload.service.ts") +# [Upload Service](../../../lib/core/services/upload.service.ts "Defined in upload.service.ts") Provides access to various APIs related to file upload features. @@ -13,21 +13,21 @@ Provides access to various APIs related to file upload features. ### Methods -- **addToQueue**(files: [`FileModel`](../../lib/core/models/file.model.ts)`[]`): [`FileModel`](../../lib/core/models/file.model.ts)`[]`
+- **addToQueue**(files: [`FileModel`](../../../lib/core/models/file.model.ts)`[]`): [`FileModel`](../../../lib/core/models/file.model.ts)`[]`
Adds files to the uploading queue to be uploaded - - _files:_ [`FileModel`](../../lib/core/models/file.model.ts)`[]` - One or more separate parameters or an array of files to queue - - **Returns** [`FileModel`](../../lib/core/models/file.model.ts)`[]` - Array of files that were not blocked from upload by the ignore list -- **cancelUpload**(files: [`FileModel`](../../lib/core/models/file.model.ts)`[]`)
+ - _files:_ [`FileModel`](../../../lib/core/models/file.model.ts)`[]` - One or more separate parameters or an array of files to queue + - **Returns** [`FileModel`](../../../lib/core/models/file.model.ts)`[]` - Array of files that were not blocked from upload by the ignore list +- **cancelUpload**(files: [`FileModel`](../../../lib/core/models/file.model.ts)`[]`)
Cancels uploading of files. - - _files:_ [`FileModel`](../../lib/core/models/file.model.ts)`[]` - One or more separate parameters or an array of files specifying uploads to cancel + - _files:_ [`FileModel`](../../../lib/core/models/file.model.ts)`[]` - One or more separate parameters or an array of files specifying uploads to cancel - **clearQueue**()
Clears the upload queue -- **getQueue**(): [`FileModel`](../../lib/core/models/file.model.ts)`[]`
+- **getQueue**(): [`FileModel`](../../../lib/core/models/file.model.ts)`[]`
Gets the file Queue - - **Returns** [`FileModel`](../../lib/core/models/file.model.ts)`[]` - Array of files that form the queue -- **getUploadPromise**(file: [`FileModel`](../../lib/core/models/file.model.ts)): `any`
+ - **Returns** [`FileModel`](../../../lib/core/models/file.model.ts)`[]` - Array of files that form the queue +- **getUploadPromise**(file: [`FileModel`](../../../lib/core/models/file.model.ts)): `any`
Gets an upload promise for a file. - - _file:_ [`FileModel`](../../lib/core/models/file.model.ts) - The target file + - _file:_ [`FileModel`](../../../lib/core/models/file.model.ts) - The target file - **Returns** `any` - [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) that is resolved if the upload is successful or error otherwise - **isUploading**(): `boolean`
Checks whether the service is uploading a file. @@ -40,15 +40,15 @@ Provides access to various APIs related to file upload features. | Name | Type | Description | | ---- | ---- | ----------- | -| queueChanged | [`FileModel`](../../lib/core/models/file.model.ts)\[] | Emitted when the file queue changes. | -| fileUpload | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted when a [File model](../../lib/core/models/file.model.ts) changes its state. | -| fileUploadStarting | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted when an upload starts. | -| fileUploadCancelled | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted when an upload gets cancelled by the user. | -| fileUploadProgress | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted during the file upload process and contains the current progress for a particular [File model](../../lib/core/models/file.model.ts). | -| fileUploadAborted | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted when a file upload gets aborted by the server. | -| fileUploadError | [`FileUploadEvent`](../../lib/core/events/file.event.ts) | Emitted when an error occurs during a file upload. | -| fileUploadComplete | [`FileUploadCompleteEvent`](../../lib/core/events/file.event.ts) | Emitted when a file upload is complete. | -| fileUploadDelete | [`FileUploadDeleteEvent`](../../lib/core/events/file.event.ts) | Emitted when an uploaded file is removed from server. | +| queueChanged | [`FileModel`](../../../lib/core/models/file.model.ts)\[] | Emitted when the file queue changes. | +| fileUpload | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted when a [File model](../../../lib/core/models/file.model.ts) changes its state. | +| fileUploadStarting | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted when an upload starts. | +| fileUploadCancelled | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted when an upload gets cancelled by the user. | +| fileUploadProgress | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted during the file upload process and contains the current progress for a particular [File model](../../../lib/core/models/file.model.ts). | +| fileUploadAborted | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted when a file upload gets aborted by the server. | +| fileUploadError | [`FileUploadEvent`](../../../lib/core/events/file.event.ts) | Emitted when an error occurs during a file upload. | +| fileUploadComplete | [`FileUploadCompleteEvent`](../../../lib/core/events/file.event.ts) | Emitted when a file upload is complete. | +| fileUploadDelete | [`FileUploadDeleteEvent`](../../../lib/core/events/file.event.ts) | Emitted when an uploaded file is removed from server. | | fileDeleted | string | This can be invoked when a file is deleted from an external source to upload the file dialog status. | ## Details diff --git a/docs/core/user-preferences.service.md b/docs/core/services/user-preferences.service.md similarity index 80% rename from docs/core/user-preferences.service.md rename to docs/core/services/user-preferences.service.md index 87ced849d3..b3f7853569 100644 --- a/docs/core/user-preferences.service.md +++ b/docs/core/services/user-preferences.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [User Preferences Service](../../lib/core/services/user-preferences.service.ts "Defined in user-preferences.service.ts") +# [User Preferences Service](../../../lib/core/services/user-preferences.service.ts "Defined in user-preferences.service.ts") Stores preferences for the app and for individual components. @@ -21,13 +21,10 @@ Stores preferences for the app and for individual components. - **getDefaultLocale**(): `string`
Gets the default locale. - **Returns** `string` - Default locale language code -- **getDefaultPageSizes**(): `number[]`
- Gets an array containing the available page sizes. - - **Returns** `number[]` - Array of page size values - **getPropertyKey**(property: `string`): `string`
Gets the full property key with prefix. - _property:_ `string` - The property name - - **Returns** `string` - [Property](../../lib/content-services/content-metadata/interfaces/property.interface.ts) key + - **Returns** `string` - [Property](../../../lib/content-services/content-metadata/interfaces/property.interface.ts) key - **getStoragePrefix**(): `string`
Gets the active storage prefix for preferences. - **Returns** `string` - Storage prefix @@ -70,7 +67,7 @@ class AppComponent { } ``` -As soon as you assign the storage prefix, all settings that you get or set via the [`UserPreferencesService`](../core/user-preferences.service.md) will be saved to a dedicated profile. +As soon as you assign the storage prefix, all settings that you get or set via the [`UserPreferencesService`](../../core/services/user-preferences.service.md) will be saved to a dedicated profile. You can import the service into your controller and use its APIs as shown below: @@ -95,12 +92,12 @@ The service also provides quick access to a set of the "known" properties used a | ---- | ---- | ----------- | | authType | `string` | Authorization type (can be "ECM", "BPM" or "ALL"). | | disableCSRF | `boolean` | Prevents the CSRF Token from being submitted if true. Only valid for Process Services. | -| paginationSize | `number` | [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) size. | +| paginationSize | `number` | [`Pagination`](../../../lib/content-services/document-list/models/document-library.model.ts) size. | | locale | `string` | Current locale setting. | ## User Preference onChange Stream -Whenever a property is set with the [user preferences service,](../core/user-preferences.service.md) an `onChange` event is sent with the +Whenever a property is set with the [user preferences service,](user-preferences.service.md) an `onChange` event is sent with the whole set of user properties. This is useful when a component needs to react to a property change: ```ts @@ -111,7 +108,7 @@ whole set of user properties. This is useful when a component needs to react to ``` You can also use the `select` method to get notification when a particular property is changed. -A set of basic properties is added into the enumeration [`UserPreferenceValues`](../../lib/core/services/user-preferences.service.ts) which gives you the key value to access the standard user preference service properties : **PaginationSize**, **DisableCSRF**, **Locale** and **SupportedPageSizes**. +A set of basic properties is added into the enumeration [`UserPreferenceValues`](../../../lib/core/services/user-preferences.service.ts) which gives you the key value to access the standard user preference service properties : **PaginationSize**, **DisableCSRF**, **Locale** and **SupportedPageSizes**. ```ts userPreferences.disableCSRF = true; diff --git a/docs/core/thumbnail.service.md b/docs/core/thumbnail.service.md deleted file mode 100644 index f2cac0d855..0000000000 --- a/docs/core/thumbnail.service.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -Title: Thumbnail service -Added: v2.0.0 -Status: Active -Last reviewed: 2018-11-13 ---- - -# [Thumbnail service](../../lib/core/services/thumbnail.service.ts "Defined in thumbnail.service.ts") - -Retrieves an SVG thumbnail image to represent a document type. - -## Class members - -### Methods - -- **getDefaultMimeTypeIcon**(): `string`
- Gets a "miscellaneous" thumbnail URL for types with no other icon defined. - - **Returns** `string` - URL string -- **getDocumentThumbnailUrl**(node: `any`): `string`
- Gets a thumbnail URL for the given document node. - - _node:_ `any` - Node to get URL for. - - **Returns** `string` - URL string -- **getMimeTypeIcon**(mimeType: `string`): `string`
- Gets a thumbnail URL for a MIME type. - - _mimeType:_ `string` - MIME type for the thumbnail - - **Returns** `string` - URL string - -## Details - -The service can locate a thumbnail icon (in SVG format) for either -a document node or a MIME type. The default mapping between types -and icons is shown in the table below: - -| Document | Icon | Types | -| -------- | ---- | ----- | -| Compressed archive | ![Archive thumbnail](../docassets/images/ft_ic_archive.png) | 'application/x-compressed', 'application/x-zip-compressed', 'application/zip' | -| Text | ![Text thumbnail](../docassets/images/ft_ic_document.png) | 'text/plain', 'application/json', 'application/x-javascript', 'application/vnd.apple.pages' | -| Bitmap/raster image | ![Bitmap thumbnail](../docassets/images/ft_ic_raster_image.png) | 'image/png', 'image/jpeg', 'image/gif' | -| MP4 video | ![MP4 thumbnail](../docassets/images/ft_ic_video.png) | 'video/mp4' | -| SVG vector image | ![SVG thumbnail](../docassets/images/ft_ic_vector_image.png) | 'image/svg+xml' | -| HTML file | ![HTML thumbnail](../docassets/images/ft_ic_website.png) | 'text/html' | -| PDF file | ![PDF thumbnail](../docassets/images/ft_ic_pdf.png) | 'application/pdf' | -| Folder | ![Folder thumbnail](../docassets/images/ft_ic_folder.png) | | -| Disabled folder | ![Disabled folder thumbnail](../docassets/images/ft_ic_folder_disable.png) | | -| Excel spreadsheet | ![Spreadsheet thumbnail](../docassets/images/ft_ic_ms_excel.png) | 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' | -| PowerPoint slideshow | ![PowerPoint thumbnail](../docassets/images/ft_ic_ms_powerpoint.png) | 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.openxmlformats-officedocument.presentationml.template', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' | -| Word document | ![Word thumbnail](../docassets/images/ft_ic_ms_word.png) | 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' | -| Keynote presentation | ![Keynote thumbnail](../docassets/images/ft_ic_presentation.png) | 'application/vnd.apple.keynote' | -| Numbers spreadsheet | ![Numbers thumbnail](../docassets/images/ft_ic_spreadsheet.png) | 'application/vnd.apple.numbers' | - -### Mat-icon - -All the ADF icons for MIME types are now registered into the [`MatIconRegistry`](https://material.angular.io/components/icon/api), so you can use all -the icons via the <mat-icon> tag: - -```javascript -import { ThumbnailService } from '@alfresco/adf-core'; - -constructor(public thumbnailService: ThumbnailService) { -}‍‍‍‍‍‍‍‍ -``` - -```html -MP4 -PDF -GIF -..... -``` - -## See also - -- [Mime type icon pipe](mime-type-icon.pipe.md) diff --git a/docs/core/content.widget.md b/docs/core/widgets/content.widget.md similarity index 88% rename from docs/core/content.widget.md rename to docs/core/widgets/content.widget.md index 65a62a3e0c..b437d00252 100644 --- a/docs/core/content.widget.md +++ b/docs/core/widgets/content.widget.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [APS Content Component](../../lib/core/form/components/widgets/content/content.widget.ts "Defined in content.widget.ts") +# [APS Content Component](../../../lib/core/form/components/widgets/content/content.widget.ts "Defined in content.widget.ts") Shows the content preview. diff --git a/docs/docassets/images/adf-cloud-process-header.png b/docs/docassets/images/adf-cloud-process-header.png new file mode 100644 index 0000000000..c49fb43769 Binary files /dev/null and b/docs/docassets/images/adf-cloud-process-header.png differ diff --git a/docs/docassets/images/datatable-expand-5.png b/docs/docassets/images/datatable-expand-5.png new file mode 100644 index 0000000000..b450b94eac Binary files /dev/null and b/docs/docassets/images/datatable-expand-5.png differ diff --git a/docs/docassets/images/datatable-sticky-header.png b/docs/docassets/images/datatable-sticky-header.png new file mode 100644 index 0000000000..55b9c5017e Binary files /dev/null and b/docs/docassets/images/datatable-sticky-header.png differ diff --git a/docs/docassets/images/datatable-truncated-text.png b/docs/docassets/images/datatable-truncated-text.png new file mode 100644 index 0000000000..3ca00adc5e Binary files /dev/null and b/docs/docassets/images/datatable-truncated-text.png differ diff --git a/docs/docassets/images/datatable-wrapped-text.png b/docs/docassets/images/datatable-wrapped-text.png new file mode 100644 index 0000000000..c3e1f68b7e Binary files /dev/null and b/docs/docassets/images/datatable-wrapped-text.png differ diff --git a/docs/docassets/images/search-facet-fields.png b/docs/docassets/images/search-facet-fields.png index 3e87f851b7..ac39e551d6 100644 Binary files a/docs/docassets/images/search-facet-fields.png and b/docs/docassets/images/search-facet-fields.png differ diff --git a/docs/docassets/images/search-facet-intervals.png b/docs/docassets/images/search-facet-intervals.png new file mode 100644 index 0000000000..b9eccd6361 Binary files /dev/null and b/docs/docassets/images/search-facet-intervals.png differ diff --git a/docs/extensions/README.md b/docs/extensions/README.md deleted file mode 100644 index e30f6084af..0000000000 --- a/docs/extensions/README.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -Title: Extensions API -Github only: true ---- - -# Extensions API - -Contains components related to the Extensions functionality. -See the library's -[README file](../../lib/extensions/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Dynamic component](dynamic.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Displays dynamically-loaded extension components. | [Source](../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts) | - -## Services - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Extension service](extension.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Manages and runs basic extension functionality. | [Source](../../lib/extensions/src/lib/services/extension.service.ts) | - - diff --git a/docs/extensions/dynamic.component.md b/docs/extensions/components/dynamic.component.md similarity index 73% rename from docs/extensions/dynamic.component.md rename to docs/extensions/components/dynamic.component.md index 0e139a3556..af4ad4f28a 100644 --- a/docs/extensions/dynamic.component.md +++ b/docs/extensions/components/dynamic.component.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2018-12-17 --- -# [Dynamic Component](../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts "Defined in dynamic.component.ts") +# [Dynamic Component](../../../lib/extensions/src/lib/components/dynamic-component/dynamic.component.ts "Defined in dynamic.component.ts") Displays dynamically-loaded extension components. @@ -24,7 +24,7 @@ Use the Dynamic component to create extensible apps (ie, apps that provide a generalized UI structure where the specific content can be "plugged in" by other developers). The `id` property refers to a component that has previously been registered using the `setComponents` method -of the [Extension service](../../lib/extensions/src/lib/services/extension.service.ts): +of the [Extension service](../services/extension.service.md): ```ts // Registering the extension components. @@ -48,11 +48,10 @@ Use this to provide the extension developer with a standard layout that contains placeholders defined by instances of the Dynamic component. The developer can then register any desired components to correspond to the defined component IDs. For example, the extensible app might be shipped -with the standard [Document List component](../content-services/document-list.component.md) registered against `plugInName.components.docList`. +with the standard [Document List component](../../content-services/components/document-list.component.md) registered against `plugInName.components.docList`. The extension developer can replace this with a custom class simply by registering that class with `setComponents` before use. ## See also -- [Extension service](../../lib/extensions/src/lib/services/extension.service.ts) -- [Dynamic tab component](../../lib/extensions/src/lib/components/dynamic-tab/dynamic-tab.component.ts) +- [Extension service](../services/extension.service.md) diff --git a/docs/extensions/components/preview-extension.component.md b/docs/extensions/components/preview-extension.component.md new file mode 100644 index 0000000000..4b0f275ff5 --- /dev/null +++ b/docs/extensions/components/preview-extension.component.md @@ -0,0 +1,105 @@ +--- +Title: Preview Extension Component +Added: v3.1.0 +Status: Experimental +Last reviewed: 2019-03-15 +--- + +# [Preview Extension component](../../../lib/extensions/src/lib/components/viewer/preview-extension.component.ts "Defined in preview-extension.component.ts") + +Supports dynamically-loaded viewer preview extensions. + +See the [ACA monaco extension](https://github.com/eromano/aca-monaco-extension) for +an example of a real working viewer extension project. + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| extension | `string` | | File extension (.jpg, .png, etc) for the viewer. | +| id | `string` | | ID string of the component to preview. | +| node | [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) | | [Node](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) containing the content to display. | +| url | `string` | | URL of the content in the repository. | + +## Details + +To create your custom extension viewer you need to create the following files in a separate project: + +The Module needs to declare the ID of your extension: + +```ts +export class YourExtensionViewerModule { + constructor(extensions: ExtensionService) { + extensions.setComponents({ + 'your-extension.main.component': YourExtensionViewerComponent + }); + } +} +``` + +Your [viewer component](../../core/components/viewer.component.md) extension contains +the business logic: + +```ts +import { Node } from '@alfresco/js-api'; +import { ViewerExtensionInterface } from '@alfresco/adf-extensions'; + +@Component({ + selector: 'your-extension-viewer', + templateUrl: './your-extension-view.component.html', + styleUrls: ['./your-extension-view.component.css'], + encapsulation: ViewEncapsulation.None +}) +export class YourExtensionViewerComponent implements ViewerExtensionInterface { + + showToolbar = true; + + @Input() + url: string; + + @Input() + node: Node; + + + ....YOUR CUSTOM LOGIC +} +``` + +The [viewer component](../../core/components/viewer.component.md) +also needs an HTML template (which is referenced by the `templateUrl` property +in the `@Component` decorator of the component class above): + +```HTML +
This is your custom extension viewer template
+``` + +You also need to provide a [viewer component](../../core/components/viewer.component.md)`extension.json` file containing its details: + +```JSON +{ + "$version": "1.0.0", + "$name": "my viewer extension", + "$description": "my viewer plugin", + "features": { + "viewer": { + "content": [ + { + "id": "dev.tools.viewer.viewer", + "fileExtension": ["png", "jpg"], + "component": "your-extension.main.component" + } + ] + } + } +} +``` + +See the [App extensions](../../user-guide/app-extensions.md) page for +further details of how to develop extensions. + +## See also + +- [Extension service](../services/extension.service.md) +- [App extensions](../../user-guide/app-extensions.md) diff --git a/docs/extensions/extension.service.md b/docs/extensions/services/extension.service.md similarity index 59% rename from docs/extensions/extension.service.md rename to docs/extensions/services/extension.service.md index a1e5f81af0..f3904f526e 100644 --- a/docs/extensions/extension.service.md +++ b/docs/extensions/services/extension.service.md @@ -2,10 +2,10 @@ Title: Extension Service Added: v3.0.0 Status: Experimental -Last reviewed: 2018-12-17 +Last reviewed: 2019-03-19 --- -# [Extension Service](../../lib/extensions/src/lib/services/extension.service.ts "Defined in extension.service.ts") +# [Extension Service](../../../lib/extensions/src/lib/services/extension.service.ts "Defined in extension.service.ts") Manages and runs basic extension functionality. @@ -13,38 +13,42 @@ Manages and runs basic extension functionality. ### Methods -- **evaluateRule**(ruleId: `string`, context: [`RuleContext`](../../lib/extensions/src/lib/config/rule.extensions.ts)): `boolean`
+- **evaluateRule**(ruleId: `string`, context: [`RuleContext`](../../../lib/extensions/src/lib/config/rule.extensions.ts)): `boolean`
Evaluates a rule. - _ruleId:_ `string` - ID of the rule to evaluate - - _context:_ [`RuleContext`](../../lib/extensions/src/lib/config/rule.extensions.ts) - Parameter object for the evaluator with details of app state + - _context:_ [`RuleContext`](../../../lib/extensions/src/lib/config/rule.extensions.ts) - Parameter object for the evaluator with details of app state - **Returns** `boolean` - True if the rule passed, false otherwise -- **getActionById**(id: `string`): [`ActionRef`](../../lib/extensions/src/lib/config/action.extensions.ts)
+- **getActionById**(id: `string`): [`ActionRef`](../../../lib/extensions/src/lib/config/action.extensions.ts)
Retrieves an action using its ID value. - _id:_ `string` - The ID value to look for - - **Returns** [`ActionRef`](../../lib/extensions/src/lib/config/action.extensions.ts) - Action or null if not found + - **Returns** [`ActionRef`](../../../lib/extensions/src/lib/config/action.extensions.ts) - Action or null if not found - **getAuthGuards**(ids: `string[]`): `Array>`
Retrieves one or more auth guards using an array of ID values. - _ids:_ `string[]` - Array of ID value to look for - **Returns** `Array>` - Array of auth guards or empty array if none were found - **getComponentById**(id: `string`): `Type<>`
- Retrieves a registered [extension component](../../lib/extensions/src/lib/services/component-register.service.ts) using its ID value. + Retrieves a registered [extension component](../../../lib/extensions/src/lib/services/component-register.service.ts) using its ID value. - _id:_ `string` - The ID value to look for - **Returns** `Type<>` - The component or null if not found - **getEvaluator**(key: `string`): `RuleEvaluator`
Retrieves a RuleEvaluator function using its key name. - _key:_ `string` - Key name to look for - **Returns** `RuleEvaluator` - RuleEvaluator or null if not found -- **getRouteById**(id: `string`): [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts)
+- **getFeature**(key: `string`): `any[]`
+ Gets features by key. + - _key:_ `string` - Key string, using dot notation + - **Returns** `any[]` - Features array found by key +- **getRouteById**(id: `string`): [`RouteRef`](../../../lib/extensions/src/lib/config/routing.extensions.ts)
Retrieves a route using its ID value. - _id:_ `string` - The ID value to look for - - **Returns** [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts) - The route or null if not found -- **getRuleById**(id: `string`): [`RuleRef`](../../lib/extensions/src/lib/config/rule.extensions.ts)
+ - **Returns** [`RouteRef`](../../../lib/extensions/src/lib/config/routing.extensions.ts) - The route or null if not found +- **getRuleById**(id: `string`): [`RuleRef`](../../../lib/extensions/src/lib/config/rule.extensions.ts)
Retrieves a rule using its ID value. - _id:_ `string` - The ID value to look for - - **Returns** [`RuleRef`](../../lib/extensions/src/lib/config/rule.extensions.ts) - The rule or null if not found -- **load**(): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts)`>`
+ - **Returns** [`RuleRef`](../../../lib/extensions/src/lib/config/rule.extensions.ts) - The rule or null if not found +- **load**(): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../../lib/extensions/src/lib/config/extension.config.ts)`>`
Loads and registers an extension config file and plugins (specified by path properties). - - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts)`>` - The loaded config data + - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`<`[`ExtensionConfig`](../../../lib/extensions/src/lib/config/extension.config.ts)`>` - The loaded config data - **runExpression**(value: `string`, context?: `any`): `any`
Runs a lightweight expression stored in a string. - _value:_ `string` - String containing the expression or literal value @@ -59,11 +63,11 @@ Manages and runs basic extension functionality. - **setEvaluators**(values: `Function`)
Adds one or more new rule evaluators to the existing set. - _values:_ `Function` - The new evaluators to add -- **setup**(config: [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts))
+- **setup**(config: [`ExtensionConfig`](../../../lib/extensions/src/lib/config/extension.config.ts))
Registers extensions from a config object. - - _config:_ [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts) - Object with config data + - _config:_ [`ExtensionConfig`](../../../lib/extensions/src/lib/config/extension.config.ts) - Object with config data ## Details Use the methods of this service to add extensibility features to your app. You can find further -details in the [App extensions](../user-guide/app-extensions.md) page. +details in the [App extensions](../../user-guide/app-extensions.md) page. diff --git a/docs/insights/README.md b/docs/insights/README.md deleted file mode 100644 index 87f73b30c8..0000000000 --- a/docs/insights/README.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -Title: Insights API -Github only: true ---- - -# Insights API - -Contains components for Process Services analytics and diagrams. -See the library's -[README file](../../lib/insights/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Widget component](widget.component.md) | Base class for standard and custom widget classes. | [Source](../../lib/insights/analytics-process/components/widgets/widget.component.ts) | -| [Analytics generator component](analytics-generator.component.md) | Generates and shows charts | [Source](../../lib/insights/analytics-process/components/analytics-generator.component.ts) | -| [Analytics report list component](analytics-report-list.component.md) | Shows a list of all available reports | [Source](../../lib/insights/analytics-process/components/analytics-report-list.component.ts) | -| [Analytics component](analytics.component.md) | Shows the charts related to the reportId passed as input | [Source](../../lib/insights/analytics-process/components/analytics.component.ts) | -| [Diagram component](diagram.component.md) | Displays process diagrams. | [Source](../../lib/insights/diagram/components/diagram.component.ts) | - - diff --git a/docs/insights/analytics-generator.component.md b/docs/insights/components/analytics-generator.component.md similarity index 69% rename from docs/insights/analytics-generator.component.md rename to docs/insights/components/analytics-generator.component.md index 7931e84b9b..eb2beda143 100644 --- a/docs/insights/analytics-generator.component.md +++ b/docs/insights/components/analytics-generator.component.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Analytics Generator Component](../../lib/insights/analytics-process/components/analytics-generator.component.ts "Defined in analytics-generator.component.ts") +# [Analytics Generator Component](../../../lib/insights/analytics-process/components/analytics-generator.component.ts "Defined in analytics-generator.component.ts") Generates and shows charts @@ -24,7 +24,7 @@ Generates and shows charts | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | reportId | `number` | | | -| reportParamQuery | [`ReportQuery`](../../lib/insights/diagram/models/report/reportQuery.model.ts) | undefined | | +| reportParamQuery | [`ReportQuery`](../../../lib/insights/diagram/models/report/reportQuery.model.ts) | undefined | | ### Events diff --git a/docs/insights/analytics-report-list.component.md b/docs/insights/components/analytics-report-list.component.md similarity index 72% rename from docs/insights/analytics-report-list.component.md rename to docs/insights/components/analytics-report-list.component.md index 4d478d11e1..af90001246 100644 --- a/docs/insights/analytics-report-list.component.md +++ b/docs/insights/components/analytics-report-list.component.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [APS Analytics List Component](../../lib/insights/analytics-process/components/analytics-report-list.component.ts "Defined in analytics-report-list.component.ts") +# [APS Analytics List Component](../../../lib/insights/analytics-process/components/analytics-report-list.component.ts "Defined in analytics-report-list.component.ts") Shows a list of all available reports @@ -31,5 +31,5 @@ Shows a list of all available reports | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | | -| reportClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ReportParametersModel`](../../lib/insights/diagram/models/report/reportParameters.model.ts)`>` | | +| reportClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ReportParametersModel`](../../../lib/insights/diagram/models/report/reportParameters.model.ts)`>` | | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | | diff --git a/docs/insights/analytics.component.md b/docs/insights/components/analytics.component.md similarity index 77% rename from docs/insights/analytics.component.md rename to docs/insights/components/analytics.component.md index 1dfa89c4fe..ceb22b8625 100644 --- a/docs/insights/analytics.component.md +++ b/docs/insights/components/analytics.component.md @@ -4,11 +4,11 @@ Added: v2.0.0 Status: Active --- -# [APS Analytics Component](../../lib/insights/analytics-process/components/analytics.component.ts "Defined in analytics.component.ts") +# [APS Analytics Component](../../../lib/insights/analytics-process/components/analytics.component.ts "Defined in analytics.component.ts") Shows the charts related to the reportId passed as input -![Analytics-without-parameters](../docassets/images/analytics-without-parameters.png) +![Analytics-without-parameters](../../docassets/images/analytics-without-parameters.png) ## Basic Usage diff --git a/docs/insights/diagram.component.md b/docs/insights/components/diagram.component.md similarity index 90% rename from docs/insights/diagram.component.md rename to docs/insights/components/diagram.component.md index 196b6e0482..cd6f0990cb 100644 --- a/docs/insights/diagram.component.md +++ b/docs/insights/components/diagram.component.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Diagram Component](../../lib/insights/diagram/components/diagram.component.ts "Defined in diagram.component.ts") +# [Diagram Component](../../../lib/insights/diagram/components/diagram.component.ts "Defined in diagram.component.ts") Displays process diagrams. diff --git a/docs/insights/widget.component.md b/docs/insights/components/widget.component.md similarity index 68% rename from docs/insights/widget.component.md rename to docs/insights/components/widget.component.md index bbe4088b00..90700735bb 100644 --- a/docs/insights/widget.component.md +++ b/docs/insights/components/widget.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-03-29 --- -# [Widget component](../../lib/insights/analytics-process/components/widgets/widget.component.ts "Defined in widget.component.ts") +# [Widget component](../../../lib/insights/analytics-process/components/widgets/widget.component.ts "Defined in widget.component.ts") Base class for standard and custom widget classes. @@ -40,10 +40,10 @@ export class CustomEditorComponent extends WidgetComponent {} ## Details -The [Widget component](../insights/widget.component.md) is the base class for all standard and custom form widgets. See the -[Form Extensibility and Customisation](../user-guide/extensibility.md) page for full details about +The [Widget component](widget.component.md) is the base class for all standard and custom form widgets. See the +[Form Extensibility and Customisation](../../user-guide/extensibility.md) page for full details about implementing custom widgets. ## See also -- [Extensibility](../user-guide/extensibility.md) +- [Extensibility](../../user-guide/extensibility.md) diff --git a/docs/license-info/README.md b/docs/license-info/README.md new file mode 100644 index 0000000000..ea7fe6c384 --- /dev/null +++ b/docs/license-info/README.md @@ -0,0 +1,11 @@ +--- +Title: License information +Github only: true +--- + +# License information + +The pages linked below contain the licenses for all third party dependencies of ADF. + +- [ADF v3.1](license-info-v3.1.0.md) +- [ADF v3.0](license-info-v3.0.0.md) \ No newline at end of file diff --git a/docs/license-info/license-info-v3.1.0.md b/docs/license-info/license-info-v3.1.0.md new file mode 100644 index 0000000000..bea70c46aa --- /dev/null +++ b/docs/license-info/license-info-v3.1.0.md @@ -0,0 +1,436 @@ +--- +Title: License info, ADF v3.1.0 +--- + +# License information for ADF v3.1.0 + +This page lists all third party libraries that ADF v3.1.0 depends on. + +## Libraries + +| Name | Version | License | +| -- | -- | -- | +| [@alfresco/adf-content-services](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-core](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-extensions](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-insights](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-process-services-cloud](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-process-services](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/adf-testing](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@alfresco/js-api](https://github.com/Alfresco/alfresco-js-api) | 3.1.0-6eec5abc14bb31af3512cba5492f4ba43ffa2fac | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@angular/animations](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/cdk](https://github.com/angular/material2) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/common](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/compiler](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/core](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/flex-layout](https://github.com/angular/flex-layout) | 7.0.0-beta.23 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/forms](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/http](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/material-moment-adapter](https://github.com/angular/material2) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/material](https://github.com/angular/material2) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/platform-browser](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/router](https://github.com/angular/angular) | 7.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@mat-datetimepicker/core](https://github.com/kuhnroyal/mat-datetimepicker) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@mat-datetimepicker/moment](https://github.com/kuhnroyal/mat-datetimepicker) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@ngx-translate/core](https://github.com/ngx-translate/core) | 11.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/ast](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/floating-point-hex-parser](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-api-error](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-buffer](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-code-frame](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-fsm](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [@webassemblyjs/helper-module-context](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-wasm-bytecode](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/helper-wasm-section](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/ieee754](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/leb128](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/utf8](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wasm-edit](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wasm-gen](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wasm-opt](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wasm-parser](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wast-parser](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@webassemblyjs/wast-printer](https://github.com/xtuc/webassemblyjs) | 1.7.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@xtuc/ieee754](https://github.com/feross/ieee754) | 1.2.0 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [@xtuc/long](https://github.com/dcodeIO/long.js) | 4.2.1 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [acorn-dynamic-import](https://github.com/kesne/acorn-dynamic-import) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [acorn](https://github.com/acornjs/acorn) | 6.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [adf-monaco-extension](https://github.com/eromano/aca-monaco-extension) | 0.0.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [adf-tslint-rules](https://github.com/Alfresco/alfresco-ng2-components) | 0.0.6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [ajv-errors](https://github.com/epoberezkin/ajv-errors) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ajv-keywords](https://github.com/epoberezkin/ajv-keywords) | 3.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ajv](https://github.com/epoberezkin/ajv) | 6.10.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [alfresco-components](https://github.com/Alfresco/alfresco-ng2-components) | 3.1.0-beta5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [ansi-regex](https://github.com/chalk/ansi-regex) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ansi-styles](https://github.com/chalk/ansi-styles) | 2.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ansi-styles](https://github.com/chalk/ansi-styles) | 3.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [anymatch](https://github.com/micromatch/anymatch) | 2.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [app-root-path](https://github.com/inxilpro/node-app-root-path) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [app-root-path](https://github.com/inxilpro/node-app-root-path) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [aproba](https://github.com/iarna/aproba) | 1.2.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [argparse](https://github.com/nodeca/argparse) | 1.0.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [arr-diff](https://github.com/jonschlinkert/arr-diff) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [arr-flatten](https://github.com/jonschlinkert/arr-flatten) | 1.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [arr-union](https://github.com/jonschlinkert/arr-union) | 3.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [array-unique](https://github.com/jonschlinkert/array-unique) | 0.3.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [asn1.js](https://github.com/indutny/asn1.js) | 4.10.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [assert](https://github.com/defunctzombie/commonjs-assert) | 1.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [assign-symbols](https://github.com/jonschlinkert/assign-symbols) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [async-each](https://github.com/paulmillr/async-each) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [asynckit](https://github.com/alexindigo/asynckit) | 0.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [atob](git://git.coolaj86.com/coolaj86/atob.js) | 2.1.2 | ([MIT](http://www.opensource.org/licenses/MIT) OR [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)) | +| [babel-code-frame](https://github.com/babel/babel/tree/master/packages/babel-code-frame) | 6.26.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [balanced-match](https://github.com/juliangruber/balanced-match) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [base64-js](https://github.com/beatgammit/base64-js) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [base](https://github.com/node-base/base) | 0.11.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [big.js](https://github.com/MikeMcl/big.js) | 5.2.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [binary-extensions](https://github.com/sindresorhus/binary-extensions) | 1.13.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [bluebird](https://github.com/petkaantonov/bluebird) | 3.5.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [bn.js](https://github.com/indutny/bn.js) | 4.11.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [brace-expansion](https://github.com/juliangruber/brace-expansion) | 1.1.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [braces](https://github.com/micromatch/braces) | 2.3.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [brorand](https://github.com/indutny/brorand) | 1.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [browserify-aes](https://github.com/crypto-browserify/browserify-aes) | 1.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [browserify-cipher](https://github.com/crypto-browserify/browserify-cipher) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [browserify-des](https://github.com/crypto-browserify/browserify-des) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [browserify-rsa](https://github.com/crypto-browserify/browserify-rsa) | 4.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [browserify-sign](https://github.com/crypto-browserify/browserify-sign) | 4.0.4 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [browserify-zlib](https://github.com/devongovett/browserify-zlib) | 0.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [buffer-from](https://github.com/LinusU/buffer-from) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [buffer-xor](https://github.com/crypto-browserify/buffer-xor) | 1.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [buffer](https://github.com/feross/buffer) | 4.9.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [builtin-modules](https://github.com/sindresorhus/builtin-modules) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [builtin-status-codes](https://github.com/bendrucker/builtin-status-codes) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cacache](https://github.com/zkat/cacache) | 11.3.2 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [cache-base](https://github.com/jonschlinkert/cache-base) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chalk](https://github.com/chalk/chalk) | 1.1.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chalk](https://github.com/chalk/chalk) | 2.4.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chart.js](https://github.com/chartjs/Chart.js) | 2.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chart.js](https://github.com/chartjs/Chart.js) | 2.8.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chartjs-color-string](https://github.com/chartjs/chartjs-color-string) | 0.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chartjs-color](https://github.com/chartjs/chartjs-color) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chokidar](https://github.com/paulmillr/chokidar) | 2.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chownr](https://github.com/isaacs/chownr) | 1.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [chrome-trace-event](github.com:samccone/chrome-trace-event) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cipher-base](https://github.com/crypto-browserify/cipher-base) | 1.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [class-utils](https://github.com/jonschlinkert/class-utils) | 0.3.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [classlist.js](https://github.com/eligrey/classList.js) | 1.1.20150312 | [Public Domain](https://opendatacommons.org/licenses/pddl/1-0/index.html) | +| [codelyzer](https://github.com/mgechev/codelyzer) | 4.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [collection-visit](https://github.com/jonschlinkert/collection-visit) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-convert](https://github.com/harthur/color-convert) | 0.5.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-convert](https://github.com/Qix-/color-convert) | 1.9.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-name](https://github.com/dfcreative/color-name) | 1.1.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-name](https://github.com/colorjs/color-name) | 1.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [combined-stream](https://github.com/felixge/node-combined-stream) | 1.0.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [commander](https://github.com/tj/commander.js) | 2.19.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [commondir](https://github.com/substack/node-commondir) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [component-emitter](https://github.com/component/emitter) | 1.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [concat-map](https://github.com/substack/node-concat-map) | 0.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [concat-stream](https://github.com/maxogden/concat-stream) | 1.6.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [console-browserify](https://github.com/Raynos/console-browserify) | 1.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [constants-browserify](https://github.com/juliangruber/constants-browserify) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cookiejar](https://github.com/bmeck/node-cookiejar) | 2.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [copy-concurrently](https://github.com/npm/copy-concurrently) | 1.0.5 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [copy-descriptor](https://github.com/jonschlinkert/copy-descriptor) | 0.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [core-js](https://github.com/zloirock/core-js) | 2.6.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [core-util-is](https://github.com/isaacs/core-util-is) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [create-ecdh](https://github.com/crypto-browserify/createECDH) | 4.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [create-hash](https://github.com/crypto-browserify/createHash) | 1.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [create-hmac](https://github.com/crypto-browserify/createHmac) | 1.1.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [crypto-browserify](https://github.com/crypto-browserify/crypto-browserify) | 3.12.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [css-selector-tokenizer](https://github.com/css-modules/css-selector-tokenizer) | 0.7.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cssauron](https://github.com/chrisdickinson/cssauron) | 1.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cssesc](https://github.com/mathiasbynens/cssesc) | 0.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [custom-event-polyfill](https://github.com/krambuhl/custom-event-polyfill) | 0.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cyclist](https://github.com/mafintosh/cyclist) | 0.2.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [d](https://github.com/medikoo/d) | 0.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [d](https://github.com/medikoo/d) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [date-now](https://github.com/Colingo/date-now) | 0.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [debug](https://github.com/visionmedia/debug) | 2.6.9 | [MIT](http://www.opensource.org/licenses/MIT) | +| [debug](https://github.com/visionmedia/debug) | 3.2.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) | 0.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [define-property](https://github.com/jonschlinkert/define-property) | 0.2.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [define-property](https://github.com/jonschlinkert/define-property) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [define-property](https://github.com/jonschlinkert/define-property) | 2.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [delayed-stream](https://github.com/felixge/node-delayed-stream) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [des.js](https://github.com/indutny/des.js) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [diff](https://github.com/kpdecker/jsdiff) | 3.5.0 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [diffie-hellman](https://github.com/crypto-browserify/diffie-hellman) | 5.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [domain-browser](https://github.com/bevry/domain-browser) | 1.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [duplexify](https://github.com/mafintosh/duplexify) | 3.7.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [elliptic](https://github.com/indutny/elliptic) | 6.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [emoji-regex](https://github.com/mathiasbynens/emoji-regex) | 6.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [emojis-list](https://github.com/kikobeats/emojis-list) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [end-of-stream](https://github.com/mafintosh/end-of-stream) | 1.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [enhanced-resolve](https://github.com/webpack/enhanced-resolve) | 4.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [errno](https://github.com/rvagg/node-errno) | 0.1.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [es5-ext](https://github.com/medikoo/es5-ext) | 0.10.49 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [es6-iterator](https://github.com/medikoo/es6-iterator) | 2.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [es6-symbol](https://github.com/medikoo/es6-symbol) | 3.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [escape-string-regexp](https://github.com/sindresorhus/escape-string-regexp) | 1.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [eslint-scope](https://github.com/eslint/eslint-scope) | 4.0.3 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [esprima](https://github.com/jquery/esprima) | 4.0.1 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [esrecurse](https://github.com/estools/esrecurse) | 4.2.1 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [estraverse](https://github.com/estools/estraverse) | 4.2.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [esutils](https://github.com/estools/esutils) | 2.0.2 | [BSD](http://www.opensource.org/licenses/BSD-2-Clause) | +| [eve-raphael](https://github.com/tomasAlabes/eve) | 0.5.0 | [Apache](http://www.apache.org/licenses/LICENSE-2.0) | +| [event-emitter](https://github.com/medikoo/event-emitter) | 0.3.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [events](https://github.com/Gozala/events) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [evp_bytestokey](https://github.com/crypto-browserify/EVP_BytesToKey) | 1.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [expand-brackets](https://github.com/jonschlinkert/expand-brackets) | 2.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [extend-shallow](https://github.com/jonschlinkert/extend-shallow) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [extend-shallow](https://github.com/jonschlinkert/extend-shallow) | 3.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [extend](https://github.com/justmoon/node-extend) | 2.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [extend](https://github.com/justmoon/node-extend) | 3.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [extglob](https://github.com/micromatch/extglob) | 2.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fast-deep-equal](https://github.com/epoberezkin/fast-deep-equal) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fastparse](https://github.com/webpack/fastparse) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [figgy-pudding](https://github.com/zkat/figgy-pudding) | 3.5.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [fill-range](https://github.com/jonschlinkert/fill-range) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [find-cache-dir](https://github.com/avajs/find-cache-dir) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [find-up](https://github.com/sindresorhus/find-up) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [flush-write-stream](https://github.com/mafintosh/flush-write-stream) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [for-in](https://github.com/jonschlinkert/for-in) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [form-data](https://github.com/form-data/form-data) | 2.3.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [formidable](https://github.com/felixge/node-formidable) | 1.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fragment-cache](https://github.com/jonschlinkert/fragment-cache) | 0.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [from2](https://github.com/hughsk/from2) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fs-write-stream-atomic](https://github.com/npm/fs-write-stream-atomic) | 1.0.10 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [fs.realpath](https://github.com/isaacs/fs.realpath) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [get-value](https://github.com/jonschlinkert/get-value) | 2.0.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [github-slugger](https://github.com/Flet/github-slugger) | 1.2.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [glob-parent](https://github.com/es128/glob-parent) | 3.1.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [glob](https://github.com/isaacs/node-glob) | 7.1.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [graceful-fs](https://github.com/isaacs/node-graceful-fs) | 4.1.15 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [hammerjs](https://github.com/hammerjs/hammer.js) | 2.0.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-ansi](https://github.com/sindresorhus/has-ansi) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-flag](https://github.com/sindresorhus/has-flag) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-value](https://github.com/jonschlinkert/has-value) | 0.3.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-value](https://github.com/jonschlinkert/has-value) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-values](https://github.com/jonschlinkert/has-values) | 0.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-values](https://github.com/jonschlinkert/has-values) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [hash-base](https://github.com/crypto-browserify/hash-base) | 3.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [hash.js](https://github.com/indutny/hash.js) | 1.1.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [hmac-drbg](https://github.com/indutny/hmac-drbg) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [hosted-git-info](https://github.com/npm/hosted-git-info) | 2.7.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [https-browserify](https://github.com/substack/https-browserify) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ieee754](https://github.com/feross/ieee754) | 1.1.12 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [iferr](https://github.com/shesek/iferr) | 0.1.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [imurmurhash](https://github.com/jensyt/imurmurhash-js) | 0.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [indexof](https://github.com/component/indexof) | 0.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [inflight](https://github.com/npm/inflight) | 1.0.6 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [inherits](https://github.com/isaacs/inherits) | 2.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [inherits](https://github.com/isaacs/inherits) | 2.0.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [is-accessor-descriptor](https://github.com/jonschlinkert/is-accessor-descriptor) | 0.1.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-accessor-descriptor](https://github.com/jonschlinkert/is-accessor-descriptor) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-binary-path](https://github.com/sindresorhus/is-binary-path) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-buffer](https://github.com/feross/is-buffer) | 1.1.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-data-descriptor](https://github.com/jonschlinkert/is-data-descriptor) | 0.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-data-descriptor](https://github.com/jonschlinkert/is-data-descriptor) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-descriptor](https://github.com/jonschlinkert/is-descriptor) | 0.1.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-descriptor](https://github.com/jonschlinkert/is-descriptor) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-extendable](https://github.com/jonschlinkert/is-extendable) | 0.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-extendable](https://github.com/jonschlinkert/is-extendable) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-extglob](https://github.com/jonschlinkert/is-extglob) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-glob](https://github.com/jonschlinkert/is-glob) | 3.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-glob](https://github.com/jonschlinkert/is-glob) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-number](https://github.com/jonschlinkert/is-number) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-plain-object](https://github.com/jonschlinkert/is-plain-object) | 2.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [is-windows](https://github.com/jonschlinkert/is-windows) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [isarray](https://github.com/juliangruber/isarray) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [isobject](https://github.com/jonschlinkert/isobject) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [isobject](https://github.com/jonschlinkert/isobject) | 3.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [js-tokens](https://github.com/lydell/js-tokens) | 3.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [js-yaml](https://github.com/nodeca/js-yaml) | 3.12.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [jsesc](https://github.com/mathiasbynens/jsesc) | 0.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [json-parse-better-errors](https://github.com/zkat/json-parse-better-errors) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [json-schema-traverse](https://github.com/epoberezkin/json-schema-traverse) | 0.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [json5](https://github.com/json5/json5) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [kind-of](https://github.com/jonschlinkert/kind-of) | 3.2.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [kind-of](https://github.com/jonschlinkert/kind-of) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [kind-of](https://github.com/jonschlinkert/kind-of) | 5.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [kind-of](https://github.com/jonschlinkert/kind-of) | 6.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [levenshtein-edit-distance](https://github.com/wooorm/levenshtein-edit-distance) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [loader-runner](https://github.com/webpack/loader-runner) | 2.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [loader-utils](https://github.com/webpack/loader-utils) | 1.2.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [locate-path](https://github.com/sindresorhus/locate-path) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [lodash.debounce](https://github.com/lodash/lodash) | 4.0.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [lru-cache](https://github.com/isaacs/node-lru-cache) | 5.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [make-dir](https://github.com/sindresorhus/make-dir) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [map-cache](https://github.com/jonschlinkert/map-cache) | 0.2.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [map-visit](https://github.com/jonschlinkert/map-visit) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [md5.js](https://github.com/crypto-browserify/md5.js) | 1.3.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mdast-util-definitions](https://github.com/syntax-tree/mdast-util-definitions) | 1.2.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mdast-util-to-string](https://github.com/syntax-tree/mdast-util-to-string) | 1.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [memory-fs](https://github.com/webpack/memory-fs) | 0.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [methods](https://github.com/jshttp/methods) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [micromatch](https://github.com/micromatch/micromatch) | 3.1.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [miller-rabin](https://github.com/indutny/miller-rabin) | 4.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime-db](https://github.com/jshttp/mime-db) | 1.38.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime-types](https://github.com/jshttp/mime-types) | 2.1.22 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime](https://github.com/broofa/node-mime) | 1.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [minimalistic-assert](https://github.com/calvinmetcalf/minimalistic-assert) | 1.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimalistic-crypto-utils](https://github.com/indutny/minimalistic-crypto-utils) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [minimatch-browser](https://github.com/isaacs/minimatch) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimatch](https://github.com/isaacs/minimatch) | 3.0.4 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimist](https://github.com/substack/minimist) | 0.0.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [minimist](https://github.com/substack/minimist) | 1.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mississippi](https://github.com/maxogden/mississippi) | 3.0.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [mixin-deep](https://github.com/jonschlinkert/mixin-deep) | 1.3.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mkdirp](https://github.com/substack/node-mkdirp) | 0.5.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [moment-es6](https://github.com/Agamnentzar/moment-es6) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [moment](https://github.com/moment/moment) | 2.22.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [move-concurrently](https://github.com/npm/move-concurrently) | 1.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [ms](https://github.com/zeit/ms) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ms](https://github.com/zeit/ms) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [nanomatch](https://github.com/micromatch/nanomatch) | 1.2.13 | [MIT](http://www.opensource.org/licenses/MIT) | +| [neo-async](https://github.com/suguru03/neo-async) | 2.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [next-tick](https://github.com/medikoo/next-tick) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ng2-charts](https://github.com/valor-software/ng2-charts) | 1.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ngx-monaco-editor](https://github.com/atularen/ngx-monaco-editor) | 6.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [node-ensure](https://github.com/bauerca/node-ensure) | 0.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [node-libs-browser](https://github.com/webpack/node-libs-browser) | 2.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [normalize-path](https://github.com/jonschlinkert/normalize-path) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [object-copy](https://github.com/jonschlinkert/object-copy) | 0.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [object-visit](https://github.com/jonschlinkert/object-visit) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [object.pick](https://github.com/jonschlinkert/object.pick) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [once](https://github.com/isaacs/once) | 1.4.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [os-browserify](https://github.com/CoderPuppy/os-browserify) | 0.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [p-limit](https://github.com/sindresorhus/p-limit) | 2.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [p-locate](https://github.com/sindresorhus/p-locate) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [p-try](https://github.com/sindresorhus/p-try) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pako](https://github.com/nodeca/pako) | 1.0.10 | ([MIT](http://www.opensource.org/licenses/MIT) AND [Zlib](http://www.zlib.net/zlib_license.html)) | +| [parallel-transform](https://github.com/mafintosh/parallel-transform) | 1.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [parse-asn1](https://github.com/crypto-browserify/parse-asn1) | 5.1.4 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [parse5](https://github.com/inikulin/parse5) | 5.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pascalcase](https://github.com/jonschlinkert/pascalcase) | 0.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-browserify](https://github.com/substack/path-browserify) | 0.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-dirname](https://github.com/es128/path-dirname) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-exists](https://github.com/sindresorhus/path-exists) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-is-absolute](https://github.com/sindresorhus/path-is-absolute) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-parse](https://github.com/jbgutierrez/path-parse) | 1.0.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pbkdf2](https://github.com/crypto-browserify/pbkdf2) | 3.0.17 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pdfjs-dist](https://github.com/mozilla/pdfjs-dist) | 2.0.943 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [pify](https://github.com/sindresorhus/pify) | 4.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pkg-dir](https://github.com/sindresorhus/pkg-dir) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [posix-character-classes](https://github.com/jonschlinkert/posix-character-classes) | 0.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [process-nextick-args](https://github.com/calvinmetcalf/process-nextick-args) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [process](https://github.com/shtylman/node-process) | 0.11.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [promise-inflight](https://github.com/iarna/promise-inflight) | 1.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [propose](https://github.com/liushuping/propose) | 0.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [prr](https://github.com/rvagg/prr) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [public-encrypt](https://github.com/crypto-browserify/publicEncrypt) | 4.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pump](https://github.com/mafintosh/pump) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pump](https://github.com/mafintosh/pump) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pumpify](https://github.com/mafintosh/pumpify) | 1.5.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [punycode](https://github.com/bestiejs/punycode.js) | 1.3.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [punycode](https://github.com/bestiejs/punycode.js) | 1.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [punycode](https://github.com/bestiejs/punycode.js) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [qs](https://github.com/ljharb/qs) | 6.6.0 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [querystring-es3](https://github.com/mike-spainhower/querystring) | 0.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [querystring](https://github.com/Gozala/querystring) | 0.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [randombytes](https://github.com/crypto-browserify/randombytes) | 2.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [randomfill](https://github.com/crypto-browserify/randomfill) | 1.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [raphael](https://github.com/DmitryBaranovskiy/raphael) | 2.2.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [readable-stream](https://github.com/nodejs/readable-stream) | 2.3.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [readdirp](https://github.com/paulmillr/readdirp) | 2.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [reflect-metadata](https://github.com/rbuckton/reflect-metadata) | 0.1.13 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [regenerate](https://github.com/mathiasbynens/regenerate) | 1.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regex-not](https://github.com/jonschlinkert/regex-not) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regexpu-core](https://github.com/mathiasbynens/regexpu-core) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regjsgen](https://github.com/d10/regjsgen) | 0.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regjsparser](https://github.com/jviereck/regjsparser) | 0.1.5 | [BSD](http://www.opensource.org/licenses/BSD-2-Clause) | +| [remark-validate-links](https://github.com/remarkjs/remark-validate-links) | 8.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [remove-trailing-separator](https://github.com/darsain/remove-trailing-separator) | 1.1.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [repeat-element](https://github.com/jonschlinkert/repeat-element) | 1.1.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [repeat-string](https://github.com/jonschlinkert/repeat-string) | 1.6.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [resolve-url](https://github.com/lydell/resolve-url) | 0.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [resolve](https://github.com/browserify/resolve) | 1.10.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ret](https://github.com/fent/ret.js) | 0.1.15 | [MIT](http://www.opensource.org/licenses/MIT) | +| [rimraf](https://github.com/isaacs/rimraf) | 2.6.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [ripemd160](https://github.com/crypto-browserify/ripemd160) | 2.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [run-queue](https://github.com/iarna/run-queue) | 1.0.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [rxjs](https://github.com/reactivex/rxjs) | 6.4.0 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [safe-buffer](https://github.com/feross/safe-buffer) | 5.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [safe-regex](https://github.com/substack/safe-regex) | 1.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [schema-utils](https://github.com/webpack-contrib/schema-utils) | 0.4.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [schema-utils](https://github.com/webpack-contrib/schema-utils) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [semver-dsl](https://github.com/mgechev/semver-dsl) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [semver](https://github.com/npm/node-semver) | 5.6.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [serialize-javascript](https://github.com/yahoo/serialize-javascript) | 1.6.1 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [set-value](https://github.com/jonschlinkert/set-value) | 0.4.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [set-value](https://github.com/jonschlinkert/set-value) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [setimmediate](https://github.com/YuzuJS/setImmediate) | 1.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [sha.js](https://github.com/crypto-browserify/sha.js) | 2.4.11 | ([MIT](http://www.opensource.org/licenses/MIT) AND [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause)) | +| [snapdragon-node](https://github.com/jonschlinkert/snapdragon-node) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [snapdragon-util](https://github.com/jonschlinkert/snapdragon-util) | 3.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [snapdragon](https://github.com/jonschlinkert/snapdragon) | 0.8.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-list-map](https://github.com/webpack/source-list-map) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-map-resolve](https://github.com/lydell/source-map-resolve) | 0.5.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-map-support](https://github.com/evanw/node-source-map-support) | 0.5.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-map-url](https://github.com/lydell/source-map-url) | 0.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-map](https://github.com/mozilla/source-map) | 0.5.6 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [source-map](https://github.com/mozilla/source-map) | 0.5.7 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [source-map](https://github.com/mozilla/source-map) | 0.6.1 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [split-string](https://github.com/jonschlinkert/split-string) | 3.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [sprintf-js](https://github.com/alexei/sprintf.js) | 1.0.3 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [sprintf-js](https://github.com/alexei/sprintf.js) | 1.1.2 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [ssri](https://github.com/zkat/ssri) | 6.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [static-extend](https://github.com/jonschlinkert/static-extend) | 0.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [stream-browserify](https://github.com/browserify/stream-browserify) | 2.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [stream-each](https://github.com/mafintosh/stream-each) | 1.2.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [stream-http](https://github.com/jhiesey/stream-http) | 2.8.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [stream-shift](https://github.com/mafintosh/stream-shift) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [string_decoder](https://github.com/nodejs/string_decoder) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [strip-ansi](https://github.com/chalk/strip-ansi) | 3.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [superagent](https://github.com/visionmedia/superagent) | 3.8.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [supports-color](https://github.com/chalk/supports-color) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [supports-color](https://github.com/chalk/supports-color) | 5.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [systemjs](https://github.com/systemjs/systemjs) | 0.19.27 | [MIT](http://www.opensource.org/licenses/MIT) | +| [tapable](https://github.com/webpack/tapable) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) | 1.2.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [terser](https://github.com/fabiosantoscode/terser) | 3.17.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [through2](https://github.com/rvagg/through2) | 2.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [through](https://github.com/dominictarr/through) | 2.3.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [timers-browserify](https://github.com/jryans/timers-browserify) | 2.0.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [to-arraybuffer](https://github.com/jhiesey/to-arraybuffer) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [to-object-path](https://github.com/jonschlinkert/to-object-path) | 0.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [to-regex-range](https://github.com/micromatch/to-regex-range) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [to-regex](https://github.com/jonschlinkert/to-regex) | 3.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [tslib](https://github.com/Microsoft/tslib) | 1.9.3 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [tslint](https://github.com/palantir/tslint) | 5.9.1 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [tsutils](https://github.com/ajafff/tsutils) | 2.29.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [tty-browserify](https://github.com/substack/tty-browserify) | 0.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [typedarray](https://github.com/substack/typedarray) | 0.0.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [typescript](https://github.com/Microsoft/TypeScript) | 3.1.6 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [union-value](https://github.com/jonschlinkert/union-value) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [unique-filename](https://github.com/iarna/unique-filename) | 1.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [unique-slug](https://github.com/iarna/unique-slug) | 2.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [unist-util-is](https://github.com/syntax-tree/unist-util-is) | 2.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [unist-util-visit-parents](https://github.com/syntax-tree/unist-util-visit-parents) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [unist-util-visit](https://github.com/syntax-tree/unist-util-visit) | 1.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [unset-value](https://github.com/jonschlinkert/unset-value) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [upath](https://github.com/anodynos/upath) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [uri-js](https://github.com/garycourt/uri-js) | 4.2.2 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [urix](https://github.com/lydell/urix) | 0.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [url](https://github.com/defunctzombie/node-url) | 0.11.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [urljoin](https://github.com/yanni4night/urljoin) | 0.1.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [use](https://github.com/jonschlinkert/use) | 3.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [util-deprecate](https://github.com/TooTallNate/util-deprecate) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [util](https://github.com/defunctzombie/node-util) | 0.10.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [util](https://github.com/defunctzombie/node-util) | 0.11.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [vm-browserify](https://github.com/substack/vm-browserify) | 0.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [watchpack](https://github.com/webpack/watchpack) | 1.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [web-animations-js](https://github.com/web-animations/web-animations-js) | 2.3.1 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [webpack-sources](https://github.com/webpack/webpack-sources) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [webpack](https://github.com/webpack/webpack) | 4.29.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [when](https://github.com/cujojs/when) | 3.7.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [worker-farm](https://github.com/rvagg/node-worker-farm) | 1.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [worker-loader](https://github.com/webpack-contrib/worker-loader) | 2.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [wrappy](https://github.com/npm/wrappy) | 1.0.2 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [xtend](https://github.com/Raynos/xtend) | 4.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [y18n](https://github.com/yargs/y18n) | 4.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [yallist](https://github.com/isaacs/yallist) | 3.0.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [zone.js](https://github.com/angular/zone.js) | 0.8.29 | [MIT](http://www.opensource.org/licenses/MIT) | diff --git a/docs/process-services-cloud/README.md b/docs/process-services-cloud/README.md deleted file mode 100644 index 0144b84b29..0000000000 --- a/docs/process-services-cloud/README.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -Title: Process Services Cloud API -Github only: true ---- - -# Process Services Cloud API - -Contains components related to Process Services Cloud. -See the library's -[README file](../../lib/process-services-cloud/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [App list cloud component](app-list-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Shows all deployed cloud application instances. | [Source](../../lib/process-services-cloud/src/lib/app/components/app-list-cloud.component.ts) | -| [Group cloud component](group-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Searches Groups. | [Source](../../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts) | -| [Edit process filter cloud component](edit-process-filter-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Shows Process Filter Details. | [Source](../../lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts) | -| [Process filters cloud component](process-filters-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Lists all available process filters and allows to select a filter. | [Source](../../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts) | -| [Process list cloud component](process-list-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts) | -| [Start process cloud component](start-process-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Starts a process. | [Source](../../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts) | -| [People cloud component](people-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Allows one or more users to be selected (with auto-suggestion) based on the input parameters. | [Source](../../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts) | -| [Start task cloud component](start-task-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Creates/starts a new task for the specified app. | [Source](../../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts) | -| [Edit task filter cloud component](edit-task-filter-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Edits Task Filter Details. | [Source](../../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts) | -| [Task filters cloud component](task-filters-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Shows all available filters. | [Source](../../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts) | -| [Task header cloud component](task-header-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Shows all the information related to a task. | [Source](../../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts) | -| [Task list cloud component](task-list-cloud.component.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts) | - -## Pipes - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Group initial pipe](group-initial.pipe.md) | Extracts the initial character from a group name. | [Source](../../lib/process-services-cloud/src/lib/group/pipe/group-initial.pipe.ts) | - -## Services - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Apps process cloud service](apps-process-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Gets details of deployed apps for the current user. | [Source](../../lib/process-services-cloud/src/lib/app/services/apps-process-cloud.service.ts) | -| [Group cloud service](group-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Searches and gets information for groups. | [Source](../../lib/process-services-cloud/src/lib/group/services/group-cloud.service.ts) | -| [Process filter cloud service](process-filter-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../../lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts) | -| [Process list cloud service](process-list-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Searches processes. | [Source](../../lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts) | -| [Start process cloud service](start-process-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Gets process definitions and starts processes. | [Source](../../lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts) | -| [Start task cloud service](start-task-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Starts standalone tasks. | [Source](../../lib/process-services-cloud/src/lib/task/start-task/services/start-task-cloud.service.ts) | -| [Task filter cloud service](task-filter-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Manages task filters. | [Source](../../lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts) | -| [Task header cloud service](task-header-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Manages cloud tasks. | [Source](../../lib/process-services-cloud/src/lib/task/task-header/services/task-header-cloud.service.ts) | -| [Task list cloud service](task-list-cloud.service.md) ![Experimental](../docassets/images/ExperimentalIcon.png) | Searches tasks. | [Source](../../lib/process-services-cloud/src/lib/task/task-list/services/task-list-cloud.service.ts) | - - diff --git a/docs/process-services-cloud/app-list-cloud.component.md b/docs/process-services-cloud/components/app-list-cloud.component.md similarity index 61% rename from docs/process-services-cloud/app-list-cloud.component.md rename to docs/process-services-cloud/components/app-list-cloud.component.md index 881d02ca89..234585d6a8 100644 --- a/docs/process-services-cloud/app-list-cloud.component.md +++ b/docs/process-services-cloud/components/app-list-cloud.component.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2019-01-08 --- -# [App List Cloud Component](../../lib/process-services-cloud/src/lib/app/components/app-list-cloud.component.ts "Defined in app-list-cloud.component.ts") +# [App List Cloud Component](../../../lib/process-services-cloud/src/lib/app/components/app-list-cloud.component.ts "Defined in app-list-cloud.component.ts") Shows all deployed cloud application instances. @@ -17,7 +17,7 @@ Shows all deployed cloud application instances. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can show custom content when there are no apps available by supplying an `` section: @@ -31,6 +31,17 @@ You can show custom content when there are no apps available by supplying an ``` +## Activiti 7 + +If you are generating a project for Activiti 7, you must add the list of apps you want to use in **app.config.json** . + +For example : + +```json + "alfresco-deployed-apps" : [{"name": "simple-app"}] +``` + + ## Class members ### Properties @@ -43,4 +54,4 @@ You can show custom content when there are no apps available by supplying an | Name | Type | Description | | ---- | ---- | ----------- | -| appClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ApplicationInstanceModel`](../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`>` | Emitted when an app entry is clicked. | +| appClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`>` | Emitted when an app entry is clicked. | diff --git a/docs/process-services-cloud/components/edit-process-filter-cloud.component.md b/docs/process-services-cloud/components/edit-process-filter-cloud.component.md new file mode 100644 index 0000000000..4e149b099f --- /dev/null +++ b/docs/process-services-cloud/components/edit-process-filter-cloud.component.md @@ -0,0 +1,204 @@ +--- +Title: Edit Process Filter Cloud component +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-27 +--- + +# [Edit Process Filter Cloud component](../../../lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts "Defined in edit-process-filter-cloud.component.ts") + +Shows/edits process filter details. + +![edit-process-filter-cloud](../../docassets/images/edit-process-filter-cloud.component.png) + +## Contents + +- [Basic Usage](#basic-usage) +- [Class members](#class-members) + - [Properties](#properties) + - [Events](#events) +- [Details](#details) + - [Editing APS2 process filters](#editing-aps2-process-filters) + - [Filter properties](#filter-properties) + - [Sort properties](#sort-properties) + - [Action properties](#action-properties) +- [See also](#see-also) + +## Basic Usage + +```html + + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| actions | `string[]` | | List of sort actions. | +| appName | `string` | | The name of the application. | +| filterProperties | `string[]` | | List of process filter properties to display | +| id | `string` | | Id of the process instance filter. | +| showFilterActions | `boolean` | true | Toggles editing of process filter actions. | +| showTitle | `boolean` | true | Toggles editing of the process filter title. | +| sortProperties | `string[]` | | List of sort properties to display. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| action | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterAction`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a filter action occurs i.e Save, SaveAs, Delete. | +| filterChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a process instance filter property changes. | + +## Details + +### Editing APS2 process filters + +Use the `appName` and `id` properties to choose which process filter to edit: + +```html + + +``` + +### Filter properties + +You can supply various _filter properties_ to edit. These will determine +which processes are found by a filter. The full set of properties is +given below: + +| Name | Description | +| ---- | ----------- | +| **_appName_** | Name of the app | +| **_processInstanceId_** | Process instance ID | +| **_processName_** | Process name. | +| **_initiator_** | ID of the user who initiated the process | +| **_status_** | Execution status of the process. | +| **_processDefinitionId_** | Process definition ID | +| **_processDefinitionKey_** | Process definition key | +| **_lastModified_** | Date the process was last modified. If lastModified defined the component will show the range **_lastModifiedTo_**, **_lastModifiedFrom_** | +| **_sort_** | Field on which the filter results will be sorted. Can be "id", "name", "status", "startDate". | +| **_order_** | Sort ordering of the filter results (this doesn't participate in the filtering itself) | + +By default, the **_status_**, **_sort_** and **_order_** properties are +displayed in the editor. However, you can also choose which properties +to show using the `filterProperties` array. +For example, the code below initializes the editor with the **_appName_**, +**_processInstanceId_**, **_processName_** and **_lastModified_** properties: + +```ts +export class SomeComponent implements OnInit { + + filterProperties: string[] = [ + "processName" + "processInstanceId", + "lastModified"]; + + onFilterChange(filter: ProcessFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: ProcessFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +```html + + +``` + +With this configuration, only the four listed properties will be shown. + +### Sort properties + +You can supply a list of _sort properties_ to sort the processes. You can use +any of the [filter properties](#filter-properties) listed above as +sort properties and you can also use the process **_id_** and **_startDate_** +properties and use **_name_** as a shorthand for **_processName_**. + +By default, the **_id_**, **_name_**, **_status_** and **_startDate_** properties are +displayed in the editor. However, you can also choose which sort properties +to show using the `sortProperties` array. +For example, the code below initializes the editor with the **_startDate_** and **_lastModified_** properties: + +```ts +export class SomeComponent implements OnInit { + + sortProperties: string[] = [ + "startDate", + "lastModified"]; + + onFilterChange(filter: ProcessFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: ProcessFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +```html + + +``` + +With this configuration, only the two listed sort properties will be shown. + +### Action properties + +You can supply various _actions_ to apply on process filter. + +| Name | Description | +| ---- | ----------- | +| **_save_** | Save process filter. | +| **_saveAs_** | Creates a new process filter. | +| **_delete_** | Delete process filter. | + +By default, the **_save_**, **_saveAs_** and **_delete_** actions are +displayed in the editor. However, you can also choose which actions to +show using the `actions` array. +For example, the code below initializes the editor with the **_save_** and **_delete_** actions: + +```ts +export class SomeComponent implements OnInit { + + actions: string[] = ['save', 'delete']; + + onFilterChange(filter: ProcessFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: ProcessFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +```html + + +``` + +With this configuration, only the two actions will be shown. + +## See also + +- [Edit task filter cloud component](edit-task-filter-cloud.component.md) diff --git a/docs/process-services-cloud/components/edit-task-filter-cloud.component.md b/docs/process-services-cloud/components/edit-task-filter-cloud.component.md new file mode 100644 index 0000000000..4812bee72f --- /dev/null +++ b/docs/process-services-cloud/components/edit-task-filter-cloud.component.md @@ -0,0 +1,205 @@ +--- +Title: Edit Task Filter Cloud component +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-27 +--- + +# [Edit Task Filter Cloud component](../../../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts "Defined in edit-task-filter-cloud.component.ts") + +Edits task filter details. + +![edit-task-filter-cloud](../../docassets/images/edit-task-filter-cloud.component.png) + +## Contents + +- [Basic Usage](#basic-usage) +- [Class members](#class-members) + - [Properties](#properties) + - [Events](#events) +- [Details](#details) + - [Editing APS2 task filters](#editing-aps2-task-filters) + - [Filter properties](#filter-properties) + - [Sort properties](#sort-properties) + - [Action properties](#action-properties) +- [See also](#see-also) + +## Basic Usage + +```html + + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| actions | `string[]` | | List of task filter actions. | +| appName | `string` | | (required) Name of the app. | +| filterProperties | `string[]` | | List of task filter properties to display. | +| id | `string` | | (required) ID of the task filter. | +| showFilterActions | `boolean` | true | Toggles the filter actions. | +| showTitle | `boolean` | true | Toggles the title. | +| sortProperties | `string[]` | | List of sort properties to display. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| action | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskFilterAction`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a filter action occurs (i.e Save, Save As, Delete). | +| filterChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a task filter property changes. | + +## Details + +### Editing APS2 task filters + +Use the `appName` and `id` properties to choose which task filter to edit: + +```html + + +``` + +### Filter properties + +You can supply various _filter properties_ to edit that will determine +which tasks are found by a filter. The full set of properties is +given below: + +| Name | Description | +| ---- | ----------- | +| **_appName_** | Name of the app | +| **_status_** | Execution state of the task. | +| **_assignee_** | User the task is assigned to | +| **_taskName_** | Name of the task | +| **_parentTaskId_** | ID of the task's parent task | +| **_priority_** | Task priority | +| **_createdDate_** | Date the task was created | +| **_standAlone_** | Standalone status of the task | +| **_owner_** | User ID of the task's owner | +| **_processDefinitionId_** | Process definition ID | +| **_processDefinitionKey_** | Process definition key | +| **_processInstanceId_** | Process instance ID | +| **_lastModified_** | Date the task was last modified. If lastModified defined the component will show the range **_lastModifiedFrom_**, **_lastModifiedTo_** | +| **_sort_** | Field on which the filter results will be sorted (doesn't participate in the filtering itself). Can be "id", "name", "createdDate", "priority", "processDefinitionId". | +| **_order_** | Sort ordering of the filter results it can be ASC or DESC (doesn't participate in the filtering itself). | + +By default, the **_status_**, **_assignee_**, **_sort_** and **_order_** properties +are displayed in the editor. However, you can also choose which properties +to show using the `filterProperties` array. For example, the code below initializes +the editor with the **_appName_**, **_processInstanceId_**, **_createdDate_** and +**_lastModified_** properties: + +```ts +import { UserProcessModel } from '@alfresco/adf-core'; + +export class SomeComponent implements OnInit { + + filterProperties: string[] = [ + "appName", + "processInstanceId", + "createdDate", + "lastModified"]; + + onFilterChange(filter: TaskFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: TaskFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +With this configuration, only the four listed properties will be shown. + +### Sort properties + +You can supply a list of _sort properties_ to sort the tasks. You can use +any of the [filter properties](#filter-properties) listed above as +sort properties and you can also use the task **_id_** property and +use **_name_** as a shorthand for **_taskName_**. + +By default, the **_id_**, **_name_**, **_createdDate_** and **_priority_** properties are +displayed in the editor. However, you can also choose which sort properties +to show using the `sortProperties` array. +For example, the code below initializes the editor with the **_createdDate_** , **_lastModified_** and **_priority_** properties: + +```ts +export class SomeComponent implements OnInit { + + sortProperties: string[] = [ + "createdDate", + "lastModified", + "priority"]; + + onFilterChange(filter: TaskFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: TaskFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +```html + + +``` + +With this configuration, only the three listed sort properties will be shown. + +### Action properties + +You can supply various _actions_ to apply on task filter. + +| Name | Description | +| ---- | ----------- | +| **_save_** | Save task filter. | +| **_saveAs_** | Creates a new task filter. | +| **_delete_** | Delete task filter. | + +By default, the **_save_**, **_saveAs_** and **_delete_** actions are +displayed in the editor. However, you can also choose which actions to +show using the `actions` array. +For example, the code below initializes the editor with the **_save_** and **_delete_** actions: + +```ts +export class SomeComponent implements OnInit { + + actions: string[] = ['save', 'delete']; + + onFilterChange(filter: TaskFilterCloudModel) { + console.log('On filter change: ', filter); + } + + onAction($event: TaskFilterAction) { + console.log('Clicked action: ', $event); + } +``` + +```html + + +``` + +With this configuration, only the two actions will be shown. + +## See also + +- [Edit process filter cloud component](edit-process-filter-cloud.component.md) diff --git a/docs/process-services-cloud/group-cloud.component.md b/docs/process-services-cloud/components/group-cloud.component.md similarity index 59% rename from docs/process-services-cloud/group-cloud.component.md rename to docs/process-services-cloud/components/group-cloud.component.md index 23c4bc8117..ad94ba5784 100644 --- a/docs/process-services-cloud/group-cloud.component.md +++ b/docs/process-services-cloud/components/group-cloud.component.md @@ -2,10 +2,10 @@ Title: Group Cloud component Added: v3.0.0 Status: Experimental -Last reviewed: 2019-01-15 +Last reviewed: 2019-03-20 --- -# [Group Cloud component](../../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts "Defined in group-cloud.component.ts") +# [Group Cloud component](../../../lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts "Defined in group-cloud.component.ts") Searches Groups. @@ -18,7 +18,7 @@ Searches Groups. ``` -![adf-cloud-group](../docassets/images/group-cloud.component.png) +![adf-cloud-group](../../docassets/images/group-cloud.component.png) ## Class members @@ -28,16 +28,16 @@ Searches Groups. | ---- | ---- | ------------- | ----------- | | appName | `string` | | Name of the application. If specified this shows the users who have access to the app. | | mode | `string` | | User selection mode (single/multiple). | -| preSelectGroups | [`GroupModel`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`[]` | \[] | Array of users to be pre-selected. This pre-selects all users in multi selection mode and only the first user of the array in single selection mode. | -| roles | `string[]` | | Role names of the groups to be listed. | +| preSelectGroups | [`GroupModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`[]` | \[] | Array of users to be pre-selected. This pre-selects all users in multi selection mode and only the first user of the array in single selection mode. | +| roles | `string[]` | \[] | Role names of the groups to be listed. | | title | `string` | | Title of the field | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| removeGroup | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`GroupModel`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`>` | Emitted when a group is removed. | -| selectGroup | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`GroupModel`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`>` | Emitted when a group is selected. | +| removeGroup | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`GroupModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`>` | Emitted when a group is removed. | +| selectGroup | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`GroupModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`>` | Emitted when a group is selected. | ## Details @@ -52,7 +52,7 @@ is the default): ``` -![adf-cloud-group](../docassets/images/group-cloud.component-single.png) +![adf-cloud-group](../../docassets/images/group-cloud.component-single.png) #### Multiple selection @@ -62,7 +62,7 @@ is the default): ``` -![adf-cloud-group](../docassets/images/group-cloud.component-multiple-mode.png) +![adf-cloud-group](../../docassets/images/group-cloud.component-multiple-mode.png) ### Pre-selection diff --git a/docs/process-services-cloud/components/people-cloud.component.md b/docs/process-services-cloud/components/people-cloud.component.md new file mode 100644 index 0000000000..9dff8da2e0 --- /dev/null +++ b/docs/process-services-cloud/components/people-cloud.component.md @@ -0,0 +1,39 @@ +--- +Title: People Cloud Component +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-20 +--- + +# [People Cloud Component](../../../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts "Defined in people-cloud.component.ts") + +Allows one or more users to be selected (with auto-suggestion) based on the input parameters. + +## Basic Usage + +```html + + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| appName | `string` | | Name of the application. If specified, this shows the users who have access to the app. | +| mode | `string` | | User selection mode (single/multiple). | +| preSelectUsers | [`IdentityUserModel`](../../../lib/core/userinfo/models/identity-user.model.ts)`[]` | | Array of users to be pre-selected. All users in the array are pre-selected in multi selection mode, but only the first user is pre-selected in single selection mode. Mandatory properties are: id, email, username | +| roles | `string[]` | | Role names of the users to be listed. | +| validate | `Boolean` | false | This flag enables the validation on the preSelectUsers passed as input. In case the flag is true the components call the identity service to verify the validity of the information passed as input. Otherwise, no check will be done. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| removeUser | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`IdentityUserModel`](../../../lib/core/userinfo/models/identity-user.model.ts)`>` | Emitted when a selected user is removed in multi selection mode. | +| selectUser | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`IdentityUserModel`](../../../lib/core/userinfo/models/identity-user.model.ts)`>` | Emitted when a user is selected. | +| warning | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an warning occurs. | diff --git a/docs/process-services-cloud/process-filters-cloud.component.md b/docs/process-services-cloud/components/process-filters-cloud.component.md similarity index 64% rename from docs/process-services-cloud/process-filters-cloud.component.md rename to docs/process-services-cloud/components/process-filters-cloud.component.md index 9627f24a2c..d09a1fe44f 100644 --- a/docs/process-services-cloud/process-filters-cloud.component.md +++ b/docs/process-services-cloud/components/process-filters-cloud.component.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2019-01-08 --- -# [Process Filters Cloud Component](../../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts "Defined in process-filters-cloud.component.ts") +# [Process Filters Cloud Component](../../../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.ts "Defined in process-filters-cloud.component.ts") Lists all available process filters and allows to select a filter. @@ -25,7 +25,7 @@ Lists all available process filters and allows to select a filter. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | appName | `string` | | (required) The application name | -| filterParam | [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) | | (optional) The filter to be selected by default | +| filterParam | [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) | | (optional) The filter to be selected by default | | showIcons | `boolean` | false | (optional) Toggles showing an icon by the side of each filter | ### Events @@ -33,5 +33,5 @@ Lists all available process filters and allows to select a filter. | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when any error occurs while loading the filters | -| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a filter is selected/clicked | +| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a filter is selected/clicked | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when filters are loaded successfully | diff --git a/docs/process-services-cloud/components/process-header-cloud.component.md b/docs/process-services-cloud/components/process-header-cloud.component.md new file mode 100644 index 0000000000..5914593f4c --- /dev/null +++ b/docs/process-services-cloud/components/process-header-cloud.component.md @@ -0,0 +1,55 @@ +--- +Title: Process Header Cloud Component +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-15 +--- + +# [Process Header Cloud Component](../../../lib/process-services-cloud/src/lib/process/process-header/components/process-header-cloud.component.ts "Defined in process-header-cloud.component.ts") + +Shows all the information related to a process instance. + +![adf-cloud-process-header](../../docassets/images/adf-cloud-process-header.png) + +## Basic Usage + +```html + + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| appName | `string` | | (Required) The name of the application. | +| processInstanceId | `string` | | (Required) The id of the process instance. | + +## Details + +The component populates an internal array of +[`CardViewModel`](../../core/components/card-view.component.md) with the information to display. + +By default all properties are displayed: + +**_id_**, **_name_**, **_description_**, **_status_**, **_initiator_**, **_startDate_**, **_lastModified_**, **_parentId_**, **_businessKey_**. + +However, you can also choose which properties to show using a configuration in `app.config.json`: + +```json + "adf-cloud-process-header": { + "presets": { + "properties" : [ "name", "status", "initiator", "parentId"] + } + } +``` + +With this configuration, only the four listed properties will be shown. + +## See also + +- [Process header cloud service](../../process-services-cloud/services/process-header-cloud.service.md) diff --git a/docs/process-services-cloud/process-list-cloud.component.md b/docs/process-services-cloud/components/process-list-cloud.component.md similarity index 76% rename from docs/process-services-cloud/process-list-cloud.component.md rename to docs/process-services-cloud/components/process-list-cloud.component.md index 1b1daeb7e8..478daa2f00 100644 --- a/docs/process-services-cloud/process-list-cloud.component.md +++ b/docs/process-services-cloud/components/process-list-cloud.component.md @@ -2,10 +2,10 @@ Title: Process Instance List Cloud component Added: v3.0.0 Status: Experimental -Last reviewed: 2018-11-09 +Last reviewed: 2019-03-25 --- -# [Process Instance List Cloud component](../../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts "Defined in process-list-cloud.component.ts") +# [Process Instance List Cloud component](../../../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts "Defined in process-list-cloud.component.ts") Renders a list containing all the process instances matched by the parameters specified. @@ -27,11 +27,11 @@ Renders a list containing all the process instances matched by the parameters sp ```html + [appName]="'app-name'"> ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside an `` sub-component will be shown when the process list is empty: @@ -50,17 +50,19 @@ when the process list is empty: | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| appVersion | `string` | "" | The related application version. | -| applicationName | `string` | "" | The name of the application. | -| businessKey | `string` | "" | Filter the tasks to display only the ones with this businessKey value. | +| appName | `string` | "" | The name of the application. | +| businessKey | `string` | "" | Filter the processes to display only the ones with this businessKey value. | | id | `string` | "" | Filter the processes to display only the ones with this ID. | | initiator | `string` | "" | Name of the initiator of the process. | +| lastModifiedFrom | `string` | "" | Filter the processes. Display only process with lastModifiedTo equal to the supplied date. | +| lastModifiedTo | `string` | "" | Filter the processes. Display only process with lastModifiedTo equal to the supplied date. | | multiselect | `boolean` | false | Toggles multiple row selection and renders checkboxes at the beginning of each row | | name | `string` | "" | Filter the processes to display only the ones with this name. | +| presetColumn | `string` | | Custom preset column schema in JSON format. | | processDefinitionId | `string` | "" | Filter the processes to display only the ones with this process definition ID. | | processDefinitionKey | `string` | "" | Filter the processes to display only the ones with this process definition key. | | selectionMode | `string` | "single" | Row selection mode. Can be "none", "single" or "multiple". For multiple mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | -| sorting | [`ProcessListCloudSortingModel`](../../lib/process-services-cloud/src/lib/process/process-list/models/process-list-sorting.model.ts)`[]` | | Array of objects specifying the sort order and direction for the list. The sort parameters are for BE sorting. | +| sorting | [`ProcessListCloudSortingModel`](../../../lib/process-services-cloud/src/lib/process/process-list/models/process-list-sorting.model.ts)`[]` | | Array of objects specifying the sort order and direction for the list. The sort parameters are for BE sorting. | | status | `string` | "" | Filter the processes to display only the ones with this status. | ### Events @@ -100,12 +102,12 @@ You can define a custom schema for the list in the `app.config.json` file and ac ```html + [appName]="'appName'"> ``` You can also define the schema in the HTML using the -[Data column component](../core/data-column.component.md). You can combine this with schema +[Data column component](../../core/components/data-column.component.md). You can combine this with schema information defined in `app.config.json` as in the example below: ```json @@ -133,7 +135,7 @@ information defined in `app.config.json` as in the example below: ```html + [appName]="'appName'" > @@ -145,7 +147,7 @@ information defined in `app.config.json` as in the example below: ``` These are all the available columns that can be displayed in this component: -**_appName_**, **_businessKey_**, **_description_**, **_id_**, **_initiator_**, **_lastModified_**, **_processName_**, **_parentId_**, **_processDefinitionId_**, **_processDefinitionKey_**, **_startDate_** and **_status_**. +**_appName_**, **_businessKey_**, **_description_**, **_id_**, **_initiator_**, **_lastModified_**, **_processName_**, **_parentId_**, **_processDefinitionId_**, **_processDefinitionKey_**, and **_status_**. ### Setting Sorting Order for the list @@ -157,7 +159,7 @@ let sorting = [{ orderBy: 'status', direction: 'desc' }]; ```html ``` @@ -185,6 +187,6 @@ The Process Instance List also supports pagination: ## See also -- [Data column component](../core/data-column.component.md) -- [Data Table Adapter interface](../core/datatable-adapter.interface.md) -- [Pagination component](../core/pagination.component.md) +- [Data column component](../../core/components/data-column.component.md) +- [Data Table Adapter interface](../../core/interfaces/datatable-adapter.interface.md) +- [Pagination component](../../core/components/pagination.component.md) diff --git a/docs/process-services-cloud/start-process-cloud.component.md b/docs/process-services-cloud/components/start-process-cloud.component.md old mode 100755 new mode 100644 similarity index 62% rename from docs/process-services-cloud/start-process-cloud.component.md rename to docs/process-services-cloud/components/start-process-cloud.component.md index 944f854d5a..a0fd558b06 --- a/docs/process-services-cloud/start-process-cloud.component.md +++ b/docs/process-services-cloud/components/start-process-cloud.component.md @@ -2,14 +2,14 @@ Title: Start Process Cloud Component Added: v3.0.0 Status: Experimental -Last reviewed: 2019-01-08 +Last reviewed: 2019-03-20 --- -# [Start Process Cloud Component](../../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts "Defined in start-process-cloud.component.ts") +# [Start Process Cloud Component](../../../lib/process-services-cloud/src/lib/process/start-process/components/start-process-cloud.component.ts "Defined in start-process-cloud.component.ts") Starts a process. -![adf-start-process](../docassets/images/startProcess.png) +![adf-start-process](../../docassets/images/startProcess.png) ## Basic Usage @@ -30,15 +30,15 @@ Starts a process. | name | `string` | "" | Name of the process. | | processDefinitionName | `string` | | Name of the process definition. | | showSelectProcessDropdown | `boolean` | true | Show/hide the process dropdown list. | -| variables | `Map[]` | | Variables to attach to the payload. | +| variables | `Map[]` | | Variables to attach to the payload. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the starting process is cancelled | -| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when an error occurs. | -| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the process is successfully started. | +| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the starting process is cancelled | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when an error occurs. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the process is successfully started. | ## Details diff --git a/docs/process-services-cloud/start-task-cloud.component.md b/docs/process-services-cloud/components/start-task-cloud.component.md similarity index 78% rename from docs/process-services-cloud/start-task-cloud.component.md rename to docs/process-services-cloud/components/start-task-cloud.component.md index ca0dfa86df..45510ce08e 100644 --- a/docs/process-services-cloud/start-task-cloud.component.md +++ b/docs/process-services-cloud/components/start-task-cloud.component.md @@ -2,14 +2,14 @@ Title: Start Task Cloud Component Added: v3.0.0 Status: Experimental -Last reviewed: 2019-01-08 +Last reviewed: 2019-03-20 --- -# [Start Task Cloud Component](../../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts "Defined in start-task-cloud.component.ts") +# [Start Task Cloud Component](../../../lib/process-services-cloud/src/lib/task/start-task/components/start-task-cloud.component.ts "Defined in start-task-cloud.component.ts") Creates/starts a new task for the specified app. -![adf-cloud-start-task](../docassets/images/adf-cloud-start-task.png) +![adf-cloud-start-task](../../docassets/images/adf-cloud-start-task.png) ## Basic Usage diff --git a/docs/process-services-cloud/task-filters-cloud.component.md b/docs/process-services-cloud/components/task-filters-cloud.component.md similarity index 67% rename from docs/process-services-cloud/task-filters-cloud.component.md rename to docs/process-services-cloud/components/task-filters-cloud.component.md index 71da861f46..6f8b40826e 100644 --- a/docs/process-services-cloud/task-filters-cloud.component.md +++ b/docs/process-services-cloud/components/task-filters-cloud.component.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2019-01-08 --- -# [Task Filters Cloud component](../../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts "Defined in task-filters-cloud.component.ts") +# [Task Filters Cloud component](../../../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.ts "Defined in task-filters-cloud.component.ts") Shows all available filters. @@ -22,7 +22,7 @@ Shows all available filters. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | appName | `string` | | Display filters available to the current user for the application with the specified name. | -| filterParam | [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) | | Parameters to use for the task filter cloud. If there is no match then the default filter (the first one in the list) is selected. | +| filterParam | [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) | | Parameters to use for the task filter cloud. If there is no match then the default filter (the first one in the list) is selected. | | showIcons | `boolean` | false | Toggles display of the filter's icons. | ### Events @@ -30,7 +30,7 @@ Shows all available filters. | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs during loading. | -| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a filter in the list is clicked. | +| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a filter in the list is clicked. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the list is loaded. | ## Details @@ -45,7 +45,7 @@ Use the `filterParam` property to restrict the range of filters that are shown: ``` -You can use properties from [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) +You can use properties from [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) as the value of `filterParam` as shown in the table below: | Name | Type | Description | diff --git a/docs/process-services-cloud/task-header-cloud.component.md b/docs/process-services-cloud/components/task-header-cloud.component.md similarity index 75% rename from docs/process-services-cloud/task-header-cloud.component.md rename to docs/process-services-cloud/components/task-header-cloud.component.md index cc1a16fa5a..fa3ae215c9 100644 --- a/docs/process-services-cloud/task-header-cloud.component.md +++ b/docs/process-services-cloud/components/task-header-cloud.component.md @@ -2,20 +2,20 @@ Title: Task Header Cloud Component Added: v3.0.0 Status: Experimental -Last reviewed: 2019-01-18 +Last reviewed: 2019-03-20 --- -# [Task Header Cloud Component](../../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts "Defined in task-header-cloud.component.ts") +# [Task Header Cloud Component](../../../lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts "Defined in task-header-cloud.component.ts") Shows all the information related to a task. -![adf-task-header](../docassets/images/adf-task-header.png) +![adf-task-header](../../docassets/images/adf-task-header.png) ## Basic Usage ```html ``` @@ -39,12 +39,12 @@ Shows all the information related to a task. ## Details -The component populates an internal array of -[CardViewModel](../core/card-view.component.md) with the information that we want to display. +The component populates an internal array of +[CardViewModel](../../core/components/card-view.component.md) with the information that we want to display. By default all properties are displayed: -**_assignee_**, **_status_**, **_priority_**, **_dueDate_**, **_category_**, **_parentName_**, **_created_**, **_id_**, **_description_**, **_formName_**. +**_assignee_**, **_status_**, **_priority_**, **_dueDate_**, **_category_**, **_parentName_**, **_created_**, **_id_**, **_description_**, **_formName_**. However, you can also choose which properties to show using a configuration in `app.config.json`: diff --git a/docs/process-services-cloud/task-list-cloud.component.md b/docs/process-services-cloud/components/task-list-cloud.component.md similarity index 79% rename from docs/process-services-cloud/task-list-cloud.component.md rename to docs/process-services-cloud/components/task-list-cloud.component.md index f15c77c634..b4e716855e 100644 --- a/docs/process-services-cloud/task-list-cloud.component.md +++ b/docs/process-services-cloud/components/task-list-cloud.component.md @@ -2,10 +2,10 @@ Title: Task List Cloud component Added: v3.0.0 Status: Experimental -Last reviewed: 2019-01-08 +Last reviewed: 2019-03-25 --- -# [Task List Cloud component](../../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts "Defined in task-list-cloud.component.ts") +# [Task List Cloud component](../../../lib/process-services-cloud/src/lib/task/task-list/components/task-list-cloud.component.ts "Defined in task-list-cloud.component.ts") Renders a list containing all the tasks matched by the parameters specified. @@ -28,11 +28,11 @@ Renders a list containing all the tasks matched by the parameters specified. ```html + [appName]="'APPLICATION-NAME'" > ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside an `` sub-component will be shown when the task list is empty: @@ -51,24 +51,25 @@ when the task list is empty: | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| applicationName | `string` | "" | The name of the application. | +| appName | `string` | "" | The name of the application. | | assignee | `string` | "" | The assignee of the process. Possible values are: "assignee" (the current user is the assignee), "candidate" (the current user is a task candidate", "group_x" (the task is assigned to a group where the current user is a member, no value (the current user is involved). | | createdDate | `string` | "" | Filter the tasks. Display only tasks created on the supplied date. | | dueDate | `string` | "" | Filter the tasks. Display only tasks with dueDate equal to the supplied date. | +| id | `string` | "" | Filter the tasks. Display only tasks with id equal to the supplied value. | | lastModifiedFrom | `string` | "" | Filter the tasks. Display only tasks with lastModifiedFrom equal to the supplied date. | | lastModifiedTo | `string` | "" | Filter the tasks. Display only tasks with lastModifiedTo equal to the supplied date. | -| id | `string` | "" | Filter the tasks. Display only tasks with id equal to the supplied value. | | multiselect | `boolean` | false | Toggles multiple row selection, rendering a checkbox at the beginning of each row. | | name | `string` | "" | Filter the tasks. Display only tasks with the supplied name. | +| owner | `string` | "" | Filter the tasks. Display only tasks with owner equal to the supplied value. | | parentTaskId | `string` | "" | Filter the tasks. Display only tasks with parentTaskId equal to the supplied value. | +| presetColumn | `string` | | Custom preset column schema in JSON format. | +| priority | `number` | | Filter the tasks. Display only tasks with priority equal to the supplied value. | | processDefinitionId | `string` | "" | Filter the tasks. Display only tasks with processDefinitionId equal to the supplied value. | | processInstanceId | `string` | "" | Filter the tasks. Display only tasks with processInstanceId equal to the supplied value. | | selectionMode | `string` | "single" | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, you can use the Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | -| sorting | [`TaskListCloudSortingModel`](../../lib/process-services-cloud/src/lib/task/task-list/models/task-list-sorting.model.ts)`[]` | | Specifies how the table should be sorted. The parameters are for BE sorting. | +| sorting | [`TaskListCloudSortingModel`](../../../lib/process-services-cloud/src/lib/task/task-list/models/task-list-sorting.model.ts)`[]` | | Specifies how the table should be sorted. The parameters are for BE sorting. | +| standAlone | `boolean` | false | Filter the tasks. Display only the tasks that belong to a process in case is false or tasks that doesn't belong to a process in case of true. | | status | `string` | "" | Filter the tasks. Display only tasks with status equal to the supplied value. | -| owner | `string` | "" | Filter the tasks. Display only tasks with owner equal to the supplied value. | -| priority | `string` | "" | Filter the tasks. Display only tasks with priority equal to the supplied value. | -| standAlone | `string` | "" | Filter the tasks. Display only the tasks that belong to a process in case is false or tasks that doesn't belong to a process in case of true. | ### Events @@ -153,7 +154,7 @@ You can use an HTML-based schema and an `app.config.json` custom schema declarat ```html + [appName]="'appName'"> @@ -187,7 +188,7 @@ The Tasklist also supports pagination as shown in the example below: ```html + [appName]="'APPLICATION-NAME'"> @@ -196,8 +197,8 @@ The Tasklist also supports pagination as shown in the example below: ### DataTableAdapter example -See the [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) page for full details of the interface and its standard -implementation, [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts). Below is an example of how you can set up the adapter for a +See the [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) page for full details of the interface and its standard +implementation, [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts). Below is an example of how you can set up the adapter for a typical tasklist. ```json @@ -211,10 +212,10 @@ typical tasklist. ### DataColumn Features -You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [`DataColumn`](../../lib/core/datatable/data/data-column.model.ts) page for more information about these features. +You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [`DataColumn`](../../../lib/core/datatable/data/data-column.model.ts) page for more information about these features. ## See also -- [Data column component](../core/data-column.component.md) -- [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) -- [Pagination component](../core/pagination.component.md) +- [Data column component](../../core/components/data-column.component.md) +- [Data Table Adapter interface](../../core/interfaces/datatable-adapter.interface.md) +- [Pagination component](../../core/components/pagination.component.md) diff --git a/docs/process-services-cloud/directives/claim-task.directive.md b/docs/process-services-cloud/directives/claim-task.directive.md new file mode 100644 index 0000000000..8244aabffa --- /dev/null +++ b/docs/process-services-cloud/directives/claim-task.directive.md @@ -0,0 +1,32 @@ +--- +Title: Claim Task Directive +Added: v3.1.0 +Status: Experimental +Last reviewed: 2019-03-25 +--- + +# [Claim task directive](../../../lib/process-services-cloud/src/lib/task/directives/claim-task.directive.ts "Defined in claim-task.directive.ts") + +Claims a task + +## Basic Usage + +```html + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| appName | `string` | | (Required) The name of the application. | +| taskId | `string` | | (Required) The id of the task. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task cannot be completed. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task is completed. | diff --git a/docs/process-services-cloud/directives/complete-task.directive.md b/docs/process-services-cloud/directives/complete-task.directive.md new file mode 100644 index 0000000000..b88abcb934 --- /dev/null +++ b/docs/process-services-cloud/directives/complete-task.directive.md @@ -0,0 +1,32 @@ +--- +Title: Complete Task Directive +Added: v3.1.0 +Status: Experimental +Last reviewed: 2019-03-19 +--- + +# [Complete task directive](../../../lib/process-services-cloud/src/lib/task/directives/complete-task.directive.ts "Defined in complete-task.directive.ts") + +Completes a task. + +## Basic Usage + +```html + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| appName | `string` | | (Required) The name of the application. | +| taskId | `string` | | (Required) The id of the task. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task cannot be completed. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task is completed. | diff --git a/docs/process-services-cloud/directives/unclaim-task.directive.md b/docs/process-services-cloud/directives/unclaim-task.directive.md new file mode 100644 index 0000000000..6c01fa04fb --- /dev/null +++ b/docs/process-services-cloud/directives/unclaim-task.directive.md @@ -0,0 +1,32 @@ +--- +Title: Unclaim Task Directive +Added: v3.1.0 +Status: Experimental +Last reviewed: 2019-03-25 +--- + +# [Unclaim task directive](../../../lib/process-services-cloud/src/lib/task/directives/unclaim-task.directive.ts "Defined in unclaim-task.directive.ts") + +Unclaims a task + +## Basic Usage + +```html + +``` + +## Class members + +### Properties + +| Name | Type | Default value | Description | +| ---- | ---- | ------------- | ----------- | +| appName | `string` | | (Required) The name of the application. | +| taskId | `string` | | (Required) The id of the task. | + +### Events + +| Name | Type | Description | +| ---- | ---- | ----------- | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task cannot be completed. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task is completed. | diff --git a/docs/process-services-cloud/edit-process-filter-cloud.component.md b/docs/process-services-cloud/edit-process-filter-cloud.component.md deleted file mode 100644 index 5caee8dccb..0000000000 --- a/docs/process-services-cloud/edit-process-filter-cloud.component.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -Title: Edit Process Filter Cloud component -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-30 ---- - -# [Edit Process Filter Cloud component](../../lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.ts "Defined in edit-process-filter-cloud.component.ts") - -Shows Process Filter Details. - -![edit-process-filter-cloud](../docassets/images/edit-process-filter-cloud.component.png) - -## Contents - -- [Basic Usage](#basic-usage) -- [Class members](#class-members) - - [Properties](#properties) - - [Events](#events) -- [Details](#details) - - [Editing APS2 process filters](#editing-aps2-process-filters) - - [Filter properties](#filter-properties) -- [See also](#see-also) - -## Basic Usage - -```html - - -``` - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| appName | `string` | | The name of the application. | -| filterProperties | `string[]` | | List of process filter properties to display | -| id | `string` | | Id of the process instance filter. | -| showFilterActions | `boolean` | true | Toggles editing of process filter actions. | -| showTitle | `boolean` | true | Toggles editing of the process filter title. | - -### Events - -| Name | Type | Description | -| ---- | ---- | ----------- | -| action | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterActionType`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a filter action occurs i.e Save, SaveAs, Delete. | -| filterChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`>` | Emitted when a process instance filter property changes. | - -## Details - -### Editing APS2 process filters - -Use the `appName` and `id` properties to choose which process filter to edit: - -```html - - -``` - -### Filter properties - -You can supply various _filter properties_ to edit that will determine -which processes are found by a filter. The full set of properties is -given below: - -| Name | Description | -| ---- | ----------- | -| **_appName_** | Name of the app | -| **_processInstanceId_** | Process instance ID | -| **_processName_** | Process name. | -| **_initiator_** | ID of the user who initiated the process | -| **_state_** | Execution state of the process. | -| **_processDefinitionId_** | Process definition ID | -| **_processDefinitionKey_** | Process definition key | -| **_lastModifiedFrom_** | Finds processes modified _after_ this date | -| **_lastModifiedTo_** | Finds processes modified _before_ this date | -| **_sort_** | Field on which the filter results will be sorted (doesn't participate in the filtering itself). Can be "id", "name", "status" or "startDate". | -| **_order_** | Sort ordering of the filter results (this doesn't participate in the filtering itself) | - -By default, the **_state_**, **_sort_** and **_order_** properties are -displayed in the editor. However, you can also choose which properties -to show using the `filterProperties` array. -For example, the code below initializes the editor with the **_appName_**, -**_processInstanceId_**, **_startDate_** and **_lastModified_** properties: - -```ts -import { UserProcessModel } from '@alfresco/adf-core'; - -export class SomeComponent implements OnInit { - - filterProperties: string[] = [ - "appName", - "processInstanceId", - "startDate", - "lastModified"]; - - onFilterChange(filter: ProcessFilterCloudModel) { - console.log('On filter change: ', filter); - } - - onAction($event: ProcessFilterActionType) { - console.log('Clicked action: ', $event); - } -``` - -With this configuration, only the four listed properties will be shown. - -**Note:** Currently, the `sort` property has a limited set of properties -to choose from: **_id_**, **_name_**, **_status_** and **_startDate_**. - -## See also - -- [Edit task filter cloud component](edit-task-filter-cloud.component.md) diff --git a/docs/process-services-cloud/edit-task-filter-cloud.component.md b/docs/process-services-cloud/edit-task-filter-cloud.component.md deleted file mode 100644 index 41ac7e39d0..0000000000 --- a/docs/process-services-cloud/edit-task-filter-cloud.component.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -Title: Edit Task Filter Cloud component -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-30 ---- - -# [Edit Task Filter Cloud component](../../lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.ts "Defined in edit-task-filter-cloud.component.ts") - -Edits Task Filter Details. - -![edit-task-filter-cloud](../docassets/images/edit-task-filter-cloud.component.png) - -## Basic Usage - -```html - - -``` - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| appName | `string` | | (required) Name of the app. | -| id | `string` | "" | (required) The id of the Task filter. | -| filterProperties | `string []` | `['state', 'assignment', 'sort', 'order']` | List of task filter properties to display. | -| showFilterActions | `boolean` | `true` | Toggles edit task filter actions. | -| showTitle | `boolean` | `true` | Toggles edit task filter title. | - -### Events - -| Name | Type | Description | -| ---- | ---- | ----------- | -| action | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FilterActionType`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a filter action occurs (i.e Save, Save As, Delete). | -| filterChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`>` | Emitted when a task filter property changes. | - -## Details - -### Editing APS2 task filters - -Use the `appName` and `id` properties to choose which task filter to edit: - -```html - - -``` - -### Filter properties - -You can supply various *filter properties* to edit that will determine -which tasks are found by a filter. The full set of properties is -given below: - -| Name | Description | -| -- | -- | -| **_appName_** | Name of the app | -| **_state_** | Execution state of the task. | -| **_assignment_** | User the task is assigned to | -| **_taskName_** | Name of the task | -| **_parentTaskId_** | ID of the task's parent task | -| **_priority_** | Task priority | -| **_standAlone_** | Standalone status of the task | -| **_owner_** | User ID of the task's owner | -| **_processDefinitionId_** | Process definition ID | -| **_processDefinitionKey_** | Process definition key | -| **_processInstanceId_** | Process instance ID | -| **_lastModifiedFrom_** | Finds tasks modified *after* this date | -| **_lastModifiedTo_** | Finds tasks modified *before* this date | -| **_sort_** | Field on which the filter results will be sorted (doesn't participate in the filtering itself). Can be "id", "name", "createdDate", "priority", "processDefinitionId". | -| **_order_** | Sort ordering of the filter results it can be ASC or DESC (doesn't participate in the filtering itself). | - -By default, the **_state_**, **_assignment_**, **_sort_** and **_order_** properties -are displayed in the editor. However, you can also choose which properties -to show using the `filterProperties` array. For example, the code below initializes -the editor with the **_appName_**, **_processInstanceId_**, **_startDate_** and -**_lastModifiedTo_** properties: - -```ts -import { UserProcessModel } from '@alfresco/adf-core'; - -export class SomeComponent implements OnInit { - - filterProperties: string[] = [ - "appName", - "processInstanceId", - "startDate", - "lastModifiedTo"]; - - onFilterChange(filter: TaskFilterCloudModel) { - console.log('On filter change: ', filter); - } - - onAction($event: FilterActionType) { - console.log('Clicked action: ', $event); - } -``` - -With this configuration, only the four listed properties will be shown. - -**Note:** Currently, the `sort` property has a limited set of properties -to choose from: **_id_**, **_name_**, **_status_** and **_startDate_**. - -## See also - -- [Edit process filter cloud component](edit-process-filter-cloud.component.md) diff --git a/docs/process-services-cloud/people-cloud.component.md b/docs/process-services-cloud/people-cloud.component.md deleted file mode 100644 index 04f2009ed1..0000000000 --- a/docs/process-services-cloud/people-cloud.component.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -Title: People Cloud Component -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-18 ---- - -# [People Cloud Component](../../lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.ts "Defined in people-cloud.component.ts") - -Allows one or more users to be selected (with auto-suggestion) based on the input parameters. - -## Basic Usage - -```html - - -``` - -## Class members - -### Properties - -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| appName | `string` | | Name of the application. If specified, this shows the users who have access to the app. | -| mode | `string` | | User selection mode (single/multiple). | -| preSelectUsers | [`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`[]` | | Array of users to be pre-selected. All users in the array are pre-selected in multi selection mode, but only the first user is pre-selected in single selection mode. | -| roles | `string[]` | | Role names of the users to be listed. | - -### Events - -| Name | Type | Description | -| ---- | ---- | ----------- | -| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| removeUser | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`>` | Emitted when a selected user is removed in multi selection mode. | -| selectUser | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`IdentityUserModel`](../../lib/core/userinfo/models/identity-user.model.ts)`>` | Emitted when a user is selected. | diff --git a/docs/process-services-cloud/group-initial.pipe.md b/docs/process-services-cloud/pipes/group-initial.pipe.md similarity index 61% rename from docs/process-services-cloud/group-initial.pipe.md rename to docs/process-services-cloud/pipes/group-initial.pipe.md index b3a95468b3..253196f0b3 100644 --- a/docs/process-services-cloud/group-initial.pipe.md +++ b/docs/process-services-cloud/pipes/group-initial.pipe.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-17 --- -# [Group initial pipe](../../lib/process-services-cloud/src/lib/group/pipe/group-initial.pipe.ts "Defined in group-initial.pipe.ts") +# [Group initial pipe](../../../lib/process-services-cloud/src/lib/group/pipe/group-initial.pipe.ts "Defined in group-initial.pipe.ts") Extracts the initial character from a group name. @@ -23,11 +23,11 @@ Extracts the initial character from a group name. ## Details -This pipe takes a [`GroupModel`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts) +This pipe takes a [`GroupModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts) object as its parameter and extracts the initial character from the `name` property. The initial is a handy way to identify the group in lists and other situations where there is limited screen space available. ## See also -- [Group cloud component](../process-services-cloud/group-cloud.component.md) +- [Group cloud component](../components/group-cloud.component.md) diff --git a/docs/process-services-cloud/process-filter-cloud.service.md b/docs/process-services-cloud/process-filter-cloud.service.md deleted file mode 100644 index 6399de7ed9..0000000000 --- a/docs/process-services-cloud/process-filter-cloud.service.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -Title: Process Filter Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-09 ---- - -# [Process Filter Cloud Service](../../lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts "Defined in process-filter-cloud.service.ts") - -Manage Process Filters, which are pre-configured Process Instance queries. - -## Class members - -### Methods - -- **addFilter**(filter: [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
- Adds a new process instance filter - - _filter:_ [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to add -- **deleteFilter**(filter: [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
- Delete process instance filter - - _filter:_ [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to delete -- **getAllProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
- Creates and returns a filter for "All" Process instances. - - _appName:_ `string` - Name of the target app - - **Returns** [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter -- **getCompletedProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
- Creates and returns a filter for "Completed" Process instances. - - _appName:_ `string` - Name of the target app - - **Returns** [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter -- **getProcessFilterById**(appName: `string`, id: `string`): [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
- Get process instance filter for given filter id - - _appName:_ `string` - Name of the target app - - _id:_ `string` - Id of the target process instance filter - - **Returns** [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - Details of process filter -- **getProcessFilters**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`[]>`
- Gets all process instance filters for a process app. - - _appName:_ `string` - Name of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`[]>` - Observable of process filter details -- **getRunningProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
- Creates and returns a filter for "Running" Process instances. - - _appName:_ `string` - Name of the target app - - **Returns** [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter -- **updateFilter**(filter: [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
- Update process instance filter - - _filter:_ [`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to update - -## Details - -The methods of this service generally return an instance of -[`ProcessFilterCloudModel`](../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) or an array of instances. - -You can use the returned filters to get matching process instances for the process app, -such as 'Running', 'Completed', 'All', etc. - -## See also - -- [Process filters cloud component](process-filters-cloud.component.md) -- [Task filter cloud service](task-filter-cloud.service.md) diff --git a/docs/process-services-cloud/process-list-cloud.service.md b/docs/process-services-cloud/process-list-cloud.service.md deleted file mode 100644 index a0050761bc..0000000000 --- a/docs/process-services-cloud/process-list-cloud.service.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -Title: Process List Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-02-06 ---- - -# [Process List Cloud Service](../../lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts "Defined in process-list-cloud.service.ts") - -Searches processes. - -## Class members - -### Methods - -- **getProcessByRequest**(requestNode: [`ProcessQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Finds a process using an object with optional query properties. - - _requestNode:_ [`ProcessQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts) - Query object - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Process information - -## Details - -Note that for a call to `getProcessByRequest`, the -[`ProcessQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts) object -must at minimum have the `appName` property correctly set. diff --git a/docs/process-services-cloud/apps-process-cloud.service.md b/docs/process-services-cloud/services/apps-process-cloud.service.md similarity index 51% rename from docs/process-services-cloud/apps-process-cloud.service.md rename to docs/process-services-cloud/services/apps-process-cloud.service.md index 1b3f3325a8..4001d4b018 100644 --- a/docs/process-services-cloud/apps-process-cloud.service.md +++ b/docs/process-services-cloud/services/apps-process-cloud.service.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2019-01-09 --- -# [Apps Process Cloud Service](../../lib/process-services-cloud/src/lib/app/services/apps-process-cloud.service.ts "Defined in apps-process-cloud.service.ts") +# [Apps Process Cloud Service](../../../lib/process-services-cloud/src/lib/app/services/apps-process-cloud.service.ts "Defined in apps-process-cloud.service.ts") Gets details of deployed apps for the current user. @@ -13,16 +13,16 @@ Gets details of deployed apps for the current user. ### Methods -- **getDeployedApplicationsByStatus**(status: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>`
+- **getDeployedApplicationsByStatus**(status: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>`
Gets a list of deployed apps for this user by status. - _status:_ `string` - Required status value - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>` - The list of deployed apps + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ApplicationInstanceModel`](../../../lib/process-services-cloud/src/lib/app/models/application-instance.model.ts)`[]>` - The list of deployed apps ## Details -This service implements some features of the [Apps process service](../core/apps-process.service.md) +This service implements some features of the [Apps process service](../../core/services/apps-process.service.md) with modifications for cloud use. ## See also -- [Apps process service](../core/apps-process.service.md) +- [Apps process service](../../core/services/apps-process.service.md) diff --git a/docs/process-services-cloud/group-cloud.service.md b/docs/process-services-cloud/services/group-cloud.service.md similarity index 77% rename from docs/process-services-cloud/group-cloud.service.md rename to docs/process-services-cloud/services/group-cloud.service.md index f764da1b6b..05af259252 100644 --- a/docs/process-services-cloud/group-cloud.service.md +++ b/docs/process-services-cloud/services/group-cloud.service.md @@ -5,7 +5,7 @@ Status: Experimental Last reviewed: 2019-02-06 --- -# [Group Cloud Service](../../lib/process-services-cloud/src/lib/group/services/group-cloud.service.ts "Defined in group-cloud.service.ts") +# [Group Cloud Service](../../../lib/process-services-cloud/src/lib/group/services/group-cloud.service.ts "Defined in group-cloud.service.ts") Searches and gets information for groups. @@ -29,9 +29,9 @@ Searches and gets information for groups. - _groupId:_ `string` - ID of the target group - _roleNames:_ `string[]` - Array of role names - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - True if the group has one or more of the roles, false otherwise -- **findGroupsByName**(searchParams: [`GroupSearchParam`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
+- **findGroupsByName**(searchParams: [`GroupSearchParam`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
Finds groups filtered by name. - - _searchParams:_ [`GroupSearchParam`](../../lib/process-services-cloud/src/lib/group/models/group.model.ts) - Object containing the name filter string + - _searchParams:_ [`GroupSearchParam`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts) - Object containing the name filter string - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of group information - **getClientIdByApplicationName**(applicationName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Gets the client ID using the app name. @@ -42,14 +42,14 @@ Searches and gets information for groups. - _groupId:_ `string` - ID of the target group - _clientId:_ `string` - ID of the client - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - List of roles -- **getGroupDetailsById**(groupId: `string`): `any`
+- **getGroupRoles**(groupId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`GroupRoleModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`[]>`
Gets details for a specified group. - _groupId:_ `string` - ID of the target group - - **Returns** `any` - Group details + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`GroupRoleModel`](../../../lib/process-services-cloud/src/lib/group/models/group.model.ts)`[]>` - Group details ## Details See the [Groups API](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/activiti-rest-api/docs/GroupsApi.md) page in the Alfresco JS-API docs for further details about the information about the format -of the returned data. \ No newline at end of file +of the returned data. diff --git a/docs/process-services-cloud/services/process-filter-cloud.service.md b/docs/process-services-cloud/services/process-filter-cloud.service.md new file mode 100644 index 0000000000..59a87e6b72 --- /dev/null +++ b/docs/process-services-cloud/services/process-filter-cloud.service.md @@ -0,0 +1,58 @@ +--- +Title: Process Filter Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-01-09 +--- + +# [Process Filter Cloud Service](../../../lib/process-services-cloud/src/lib/process/process-filters/services/process-filter-cloud.service.ts "Defined in process-filter-cloud.service.ts") + +Manage Process Filters, which are pre-configured Process Instance queries. + +## Class members + +### Methods + +- **addFilter**(filter: [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
+ Adds a new process instance filter + - _filter:_ [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to add +- **deleteFilter**(filter: [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
+ Delete process instance filter + - _filter:_ [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to delete +- **getAllProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
+ Creates and returns a filter for "All" Process instances. + - _appName:_ `string` - Name of the target app + - **Returns** [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter +- **getCompletedProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
+ Creates and returns a filter for "Completed" Process instances. + - _appName:_ `string` - Name of the target app + - **Returns** [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter +- **getProcessFilterById**(appName: `string`, id: `string`): [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
+ Get process instance filter for given filter id + - _appName:_ `string` - Name of the target app + - _id:_ `string` - Id of the target process instance filter + - **Returns** [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - Details of process filter +- **getProcessFilters**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`[]>`
+ Gets all process instance filters for a process app. + - _appName:_ `string` - Name of the target app + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)`[]>` - Observable of process filter details +- **getRunningProcessesFilter**(appName: `string`): [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts)
+ Creates and returns a filter for "Running" Process instances. + - _appName:_ `string` - Name of the target app + - **Returns** [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The newly created filter +- **updateFilter**(filter: [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts))
+ Update process instance filter + - _filter:_ [`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) - The new filter to update + +## Details + +The methods of this service generally return an instance of +[`ProcessFilterCloudModel`](../../../lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts) or an array of instances. + +You can use the returned filters to get matching process instances for the process app, +such as 'Running', 'Completed', 'All', etc. + +## See also + +- [Process filters cloud component](../components/process-filters-cloud.component.md) +- [Task filter cloud service](task-filter-cloud.service.md) diff --git a/docs/process-services-cloud/services/process-header-cloud.service.md b/docs/process-services-cloud/services/process-header-cloud.service.md new file mode 100644 index 0000000000..381fc9a2ae --- /dev/null +++ b/docs/process-services-cloud/services/process-header-cloud.service.md @@ -0,0 +1,32 @@ +--- +Title: Process Header Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-15 +--- + +# [Process Header Cloud Service](../../../lib/process-services-cloud/src/lib/process/process-header/services/process-header-cloud.service.ts "Defined in process-header-cloud.service.ts") + +Manages cloud process instances. + +## Class members + +### Methods + +- **getProcessInstanceById**(appName: `string`, processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>`
+ Gets details of a process instance. + - _appName:_ `string` - Name of the app + - _processInstanceId:_ `string` - ID of the process instance whose details you want + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` - Process instance details + +## Details + +The methods work in much the same way as the equivalent methods in the +[Process list Cloud Component](../components/process-list-cloud.component.md) +but they use the cloud variants of the classes for return values. See the +[Process list Cloud Service](process-list-cloud.service.md) page for usage examples. + +## See also + +- [Process list Cloud Service](process-list-cloud.service.md) +- [Process header cloud component](../../process-services-cloud/components/process-header-cloud.component.md) diff --git a/docs/process-services-cloud/services/process-list-cloud.service.md b/docs/process-services-cloud/services/process-list-cloud.service.md new file mode 100644 index 0000000000..dc0261825d --- /dev/null +++ b/docs/process-services-cloud/services/process-list-cloud.service.md @@ -0,0 +1,39 @@ +--- +Title: Process List Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-03-25 +--- + +# [Process List Cloud Service](../../../lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts "Defined in process-list-cloud.service.ts") + +Searches processes. + +## Class members + +### Methods + +- **getProcessByRequest**(requestNode: [`ProcessQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ Finds a process using an object with optional query properties. + - _requestNode:_ [`ProcessQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts) - Query object + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Process information + +## Details + +Note that for a call to `getProcessByRequest`, the +[`ProcessQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts) object +must at minimum have the `appName` property correctly set. + +## Activiti 7 + +If you are generating a project for Activiti 7, you must add the list of apps you want to use in **app.config.json** . + +For example : + +```json + "alfresco-deployed-apps" : [{"name": "simple-app"}] +``` + +## See also + +- [App list cloud component](../components/app-list-cloud.component.md) diff --git a/docs/process-services-cloud/services/start-process-cloud.service.md b/docs/process-services-cloud/services/start-process-cloud.service.md new file mode 100644 index 0000000000..fa3c19b55e --- /dev/null +++ b/docs/process-services-cloud/services/start-process-cloud.service.md @@ -0,0 +1,36 @@ +--- +Title: Start Process Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-01-09 +--- + +# [Start Process Cloud Service](../../../lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts "Defined in start-process-cloud.service.ts") + +Gets process definitions and starts processes. + +## Class members + +### Methods + +- **getProcessDefinitions**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>`
+ Gets the process definitions associated with an app. + - _appName:_ `string` - Name of the target app + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>` - Array of process definitions +- **startProcess**(appName: `string`, requestPayload: [`ProcessPayloadCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>`
+ Starts a process based on a process definition, name, form values or variables. + - _appName:_ `string` - name of the Application + - _requestPayload:_ [`ProcessPayloadCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts) - Details of the process (definition key, name, variables, etc) + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` - Details of the process instance just started + +## Details + +You can use the `startProcess` method in much the same way as the `startProcess` method in the +[Process service](../../process-services/services/process.service.md) (see the [Process service](../../process-services/services/process.service.md) page +for an example). However, the cloud version +combines the process details and variables conveniently into the +[`ProcessPayloadCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts) object. + +## See also + +- [Process service](../../process-services/services/process.service.md) diff --git a/docs/process-services-cloud/services/start-task-cloud.service.md b/docs/process-services-cloud/services/start-task-cloud.service.md new file mode 100644 index 0000000000..d9aa6f3a35 --- /dev/null +++ b/docs/process-services-cloud/services/start-task-cloud.service.md @@ -0,0 +1,30 @@ +--- +Title: Start Task Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-01-09 +--- + +# [Start Task Cloud Service](../../../lib/process-services-cloud/src/lib/task/start-task/services/start-task-cloud.service.ts "Defined in start-task-cloud.service.ts") + +Starts standalone tasks. + +## Class members + +### Methods + +- **createNewTask**(taskDetails: [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Creates a new standalone task. + - _taskDetails:_ [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - Details of the task to create + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Details of the newly created task + +## Details + +The `createNewTask` method works the same way as the method with the same name in the +[Tasklist service](../../process-services/services/tasklist.service.md) +but uses the cloud variants of the classes for the parameter and return value. See the +[Tasklist service](../../process-services/services/tasklist.service.md) page for usage examples. + +## See also + +- [Tasklist service](../../process-services/services/tasklist.service.md) diff --git a/docs/process-services-cloud/services/task-cloud.service.md b/docs/process-services-cloud/services/task-cloud.service.md new file mode 100644 index 0000000000..23ff3ae9dc --- /dev/null +++ b/docs/process-services-cloud/services/task-cloud.service.md @@ -0,0 +1,65 @@ +--- +Title: Task Cloud Service +Added: v3.1.0 +Status: Experimental +Last reviewed: 2019-03-29 +--- + +# [Task Cloud Service](../../../lib/process-services-cloud/src/lib/task/services/task-cloud.service.ts "Defined in task-cloud.service.ts") + +Manages task cloud. + +## Class members + +### Methods + +- **canClaimTask**(taskDetails: [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): `boolean`
+ Validate if a task can be claimed. + - _taskDetails:_ [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - task details object + - **Returns** `boolean` - Boolean value if the task can be completed +- **canCompleteTask**(taskDetails: [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): `boolean`
+ Validate if a task can be completed. + - _taskDetails:_ [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - task details object + - **Returns** `boolean` - Boolean value if the task can be completed +- **canUnclaimTask**(taskDetails: [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): `boolean`
+ Validate if a task can be unclaimed. + - _taskDetails:_ [`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - task details object + - **Returns** `boolean` - Boolean value if the task can be completed +- **claimTask**(appName: `string`, taskId: `string`, assignee: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Claims a task for an assignee. + - _appName:_ `string` - Name of the app + - _taskId:_ `string` - ID of the task to claim + - _assignee:_ `string` - User to assign the task to + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Details of the claimed task +- **completeTask**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Complete a task. + - _appName:_ `string` - Name of the app + - _taskId:_ `string` - ID of the task to complete + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Details of the task that was completed +- **getTaskById**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Gets details of a task. + - _appName:_ `string` - Name of the app + - _taskId:_ `string` - ID of the task whose details you want + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Task details +- **unclaimTask**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Un-claims a task. + - _appName:_ `string` - Name of the app + - _taskId:_ `string` - ID of the task to unclaim + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Details of the task that was unclaimed +- **updateTask**(appName: `string`, taskId: `string`, updatePayload: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
+ Updates the details (name, description, due date) for a task. + - _appName:_ `string` - Name of the app + - _taskId:_ `string` - ID of the task to update + - _updatePayload:_ `any` - Data to update the task + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Updated task details + +## Details + +The methods work in much the same way as the equivalent methods in the +[Tasklist service](../../process-services/services/tasklist.service.md) +but they use the cloud variants of the classes for return values. See the +[Tasklist service](../../process-services/services/tasklist.service.md) page for usage examples. + +## See also + +- [Tasklist service](../../process-services/services/tasklist.service.md) diff --git a/docs/process-services-cloud/services/task-filter-cloud.service.md b/docs/process-services-cloud/services/task-filter-cloud.service.md new file mode 100644 index 0000000000..7635fdb802 --- /dev/null +++ b/docs/process-services-cloud/services/task-filter-cloud.service.md @@ -0,0 +1,66 @@ +--- +Title: Task Filter Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-01-09 +--- + +# [Task Filter Cloud Service](../../../lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts "Defined in task-filter-cloud.service.ts") + +Manages task filters. + +## Class members + +### Methods + +- **addFilter**(filter: [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
+ Adds a new task filter. + - _filter:_ [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The new filter to add +- **deleteFilter**(filter: [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
+ Deletes a task filter + - _filter:_ [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The filter to delete +- **getCompletedTasksFilterInstance**(appName: `string`): [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
+ Creates and returns a filter for "Completed" task instances. + - _appName:_ `string` - Name of the target app + - **Returns** [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The newly created filter +- **getMyTasksFilterInstance**(appName: `string`): [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
+ Creates and returns a filter for "My Tasks" task instances. + - _appName:_ `string` - Name of the target app + - **Returns** [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The newly created filter +- **getTaskFilterById**(appName: `string`, id: `string`): [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
+ Gets a task filter. + - _appName:_ `string` - Name of the target app + - _id:_ `string` - ID of the task + - **Returns** [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - Details of the task filter +- **getTaskListFilters**(appName?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`[]>`
+ Gets all task filters for a process app. + - _appName:_ `string` - (Optional) Name of the target app + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`[]>` - Observable of task filter details +- **getUsername**(): `string`
+ Gets the username field from the access token. + - **Returns** `string` - Username string +- **getValueFromToken**(key: `string`)
+ Gets a named value from the access token. + - _key:_ `string` - Key name of the value +- **updateFilter**(filter: [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
+ Updates a task filter. + - _filter:_ [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The filter to update + +## Details + +The methods of this service generally return an instance of [`TaskFilterCloudModel`](../../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) or +an array of instances. For example, you could use `getTaskListFilters` as follows: + +```ts +this.taskFilterService.getTaskListFilters(appName).subscribe( (filters: TaskFilterCloudModel[]) => { + console.log('Task filters: ', filters); +}, error => { + console.log('Error: ', error); +}); +``` + +These filters can now be used to get matching task instances for the process app. + +## See also + +- [Task filter service](../../process-services/services/task-filter.service.md) diff --git a/docs/process-services-cloud/services/task-list-cloud.service.md b/docs/process-services-cloud/services/task-list-cloud.service.md new file mode 100644 index 0000000000..36ab32c940 --- /dev/null +++ b/docs/process-services-cloud/services/task-list-cloud.service.md @@ -0,0 +1,25 @@ +--- +Title: Task List Cloud Service +Added: v3.0.0 +Status: Experimental +Last reviewed: 2019-02-06 +--- + +# [Task List Cloud Service](../../../lib/process-services-cloud/src/lib/task/task-list/services/task-list-cloud.service.ts "Defined in task-list-cloud.service.ts") + +Searches tasks. + +## Class members + +### Methods + +- **getTaskByRequest**(requestNode: [`TaskQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ Finds a task using an object with optional query properties. + - _requestNode:_ [`TaskQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts) - Query object + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Task information + +## Details + +Note that for a call to `getTaskByRequest`, the +[`TaskQueryCloudRequestModel`](../../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts) object +must at minimum have the `appName` property correctly set. diff --git a/docs/process-services-cloud/start-process-cloud.service.md b/docs/process-services-cloud/start-process-cloud.service.md deleted file mode 100644 index 6d5bd0ea1a..0000000000 --- a/docs/process-services-cloud/start-process-cloud.service.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -Title: Start Process Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-09 ---- - -# [Start Process Cloud Service](../../lib/process-services-cloud/src/lib/process/start-process/services/start-process-cloud.service.ts "Defined in start-process-cloud.service.ts") - -Gets process definitions and starts processes. - -## Class members - -### Methods - -- **getProcessDefinitions**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>`
- Gets the process definitions associated with an app. - - _appName:_ `string` - Name of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>` - Array of process definitions -- **startProcess**(appName: `string`, requestPayload: [`ProcessPayloadCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>`
- Starts a process based on a process definition, name, form values or variables. - - _appName:_ `string` - name of the Application - - _requestPayload:_ [`ProcessPayloadCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts) - Details of the process (definition key, name, variables, etc) - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` - Details of the process instance just started - -## Details - -You can use the `startProcess` method in much the same way as the `startProcess` method in the -[Process service](../process-services/process.service.md) (see the [Process service](../process-services/process.service.md) page -for an example). However, the cloud version -combines the process details and variables conveniently into the -[`ProcessPayloadCloud`](../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts) object. - -## See also - -- [Process service](../process-services/process.service.md) diff --git a/docs/process-services-cloud/start-task-cloud.service.md b/docs/process-services-cloud/start-task-cloud.service.md deleted file mode 100644 index 6f0c6c9823..0000000000 --- a/docs/process-services-cloud/start-task-cloud.service.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -Title: Start Task Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-09 ---- - -# [Start Task Cloud Service](../../lib/process-services-cloud/src/lib/task/start-task/services/start-task-cloud.service.ts "Defined in start-task-cloud.service.ts") - -Starts standalone tasks. - -## Class members - -### Methods - -- **createNewTask**(taskDetails: [`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
- Creates a new standalone task. - - _taskDetails:_ [`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts) - Details of the task to create - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Details of the newly created task - -## Details - -The `createNewTask` method works the same way as the method with the same name in the -[Tasklist service](../process-services/tasklist.service.md) -but uses the cloud variants of the classes for the parameter and return value. See the -[Tasklist service](../process-services/tasklist.service.md) page for usage examples. - -## See also - -- [Tasklist service](../process-services/tasklist.service.md) diff --git a/docs/process-services-cloud/task-filter-cloud.service.md b/docs/process-services-cloud/task-filter-cloud.service.md deleted file mode 100644 index 443d7c6d03..0000000000 --- a/docs/process-services-cloud/task-filter-cloud.service.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -Title: Task Filter Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-09 ---- - -# [Task Filter Cloud Service](../../lib/process-services-cloud/src/lib/task/task-filters/services/task-filter-cloud.service.ts "Defined in task-filter-cloud.service.ts") - -Manages task filters. - -## Class members - -### Methods - -- **addFilter**(filter: [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
- Adds a new task filter. - - _filter:_ [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The new filter to add -- **deleteFilter**(filter: [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
- Deletes a task filter - - _filter:_ [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The filter to delete -- **getCompletedTasksFilterInstance**(appName: `string`): [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
- Creates and returns a filter for "Completed" task instances. - - _appName:_ `string` - Name of the target app - - **Returns** [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The newly created filter -- **getMyTasksFilterInstance**(appName: `string`): [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
- Creates and returns a filter for "My [`Tasks`](../../e2e/actions/APS-cloud/tasks.ts)" task instances. - - _appName:_ `string` - Name of the target app - - **Returns** [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The newly created filter -- **getTaskFilterById**(appName: `string`, id: `string`): [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)
- Gets a task filter. - - _appName:_ `string` - Name of the target app - - _id:_ `string` - ID of the task - - **Returns** [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - Details of the task filter -- **getTaskListFilters**(appName?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`[]>`
- Gets all task filters for a process app. - - _appName:_ `string` - (Optional) Name of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts)`[]>` - Observable of task filter details -- **getUsername**(): `string`
- Gets the username field from the access token. - - **Returns** `string` - Username string -- **getValueFromToken**(key: `string`)
- Gets a named value from the access token. - - _key:_ `string` - Key name of the value -- **updateFilter**(filter: [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts))
- Updates a task filter. - - _filter:_ [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) - The filter to update - -## Details - -The methods of this service generally return an instance of [`TaskFilterCloudModel`](../../lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts) or -an array of instances. For example, you could use `getTaskListFilters` as follows: - -```ts -this.taskFilterService.getTaskListFilters(appName).subscribe( (filters: TaskFilterCloudModel[]) => { - console.log('Task filters: ', filters); -}, error => { - console.log('Error: ', error); -}); -``` - -These filters can now be used to get matching task instances for the process app. - -## See also - -- [Task filter service](../process-services/task-filter.service.md) diff --git a/docs/process-services-cloud/task-header-cloud.service.md b/docs/process-services-cloud/task-header-cloud.service.md deleted file mode 100644 index 1a39a56e24..0000000000 --- a/docs/process-services-cloud/task-header-cloud.service.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -Title: Task Header Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-01-18 ---- - -# [Task Header Cloud Service](../../lib/process-services-cloud/src/lib/task/task-header/services/task-header-cloud.service.ts "Defined in task-header-cloud.service.ts") - -Manages cloud tasks. - -## Class members - -### Methods - -- **claimTask**(appName: `string`, taskId: `string`, assignee: `string`): `any`
- Claims a task for an assignee. - - _appName:_ `string` - Name of the app - - _taskId:_ `string` - ID of the task to claim - - _assignee:_ `string` - User to assign the task to - - **Returns** `any` - Details of the claimed task -- **getTaskById**(appName: `string`, taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>`
- Gets details of a task. - - _appName:_ `string` - Name of the app - - _taskId:_ `string` - ID of the task whose details you want - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsCloudModel`](../../lib/process-services-cloud/src/lib/task/start-task/models/task-details-cloud.model.ts)`>` - Task details -- **unclaimTask**(appName: `string`, taskId: `string`): `any`
- Un-claims a task. - - _appName:_ `string` - Name of the app - - _taskId:_ `string` - ID of the task to unclaim - - **Returns** `any` - Details of the task that was unclaimed -- **updateTask**(appName: `string`, taskId: `string`, updatePayload: `any`): `any`
- Updates the details (name, description, due date) for a task. - - _appName:_ `string` - Name of the app - - _taskId:_ `string` - ID of the task to update - - _updatePayload:_ `any` - Data to update the task - - **Returns** `any` - Updated task details - -## Details - -The methods work in much the same way as the equivalent methods in the -[Tasklist service](../process-services/tasklist.service.md) -but they use the cloud variants of the classes for return values. See the -[Tasklist service](../process-services/tasklist.service.md) page for usage examples. - -## See also - -- [Tasklist service](../process-services/tasklist.service.md) diff --git a/docs/process-services-cloud/task-list-cloud.service.md b/docs/process-services-cloud/task-list-cloud.service.md deleted file mode 100644 index d9cf84b443..0000000000 --- a/docs/process-services-cloud/task-list-cloud.service.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -Title: Task List Cloud Service -Added: v3.0.0 -Status: Experimental -Last reviewed: 2019-02-06 ---- - -# [Task List Cloud Service](../../lib/process-services-cloud/src/lib/task/task-list/services/task-list-cloud.service.ts "Defined in task-list-cloud.service.ts") - -Searches tasks. - -## Class members - -### Methods - -- **getTaskByRequest**(requestNode: [`TaskQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
- Finds a task using an object with optional query properties. - - _requestNode:_ [`TaskQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts) - Query object - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Task information - -## Details - -Note that for a call to `getTaskByRequest`, the -[`TaskQueryCloudRequestModel`](../../lib/process-services-cloud/src/lib/task/task-list/models/filter-cloud-model.ts) object -must at minimum have the `appName` property correctly set. diff --git a/docs/process-services/README.md b/docs/process-services/README.md deleted file mode 100644 index adfd898e0a..0000000000 --- a/docs/process-services/README.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -Title: Process Services API -Github only: true ---- - -# Process Services API - -Contains components related to Process Services. -See the library's -[README file](../../lib/process-services/README.md) -for more information about installing and using the source code. - - - -## Components - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Apps list component](apps-list.component.md) | Shows all available apps. | [Source](../../lib/process-services/app-list/apps-list.component.ts) | -| [Create process attachment component](create-process-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified process instance. | [Source](../../lib/process-services/attachment/create-process-attachment.component.ts) | -| [Create task attachment component](create-task-attachment.component.md) | Displays an Upload Component (Drag and Click) to upload the attachment to a specified task. | [Source](../../lib/process-services/attachment/create-task-attachment.component.ts) | -| [Process attachment list component](process-attachment-list.component.md) | Displays documents attached to a specified process instance. | [Source](../../lib/process-services/attachment/process-attachment-list.component.ts) | -| [Task attachment list component](task-attachment-list.component.md) | Displays documents attached to a specified task. | [Source](../../lib/process-services/attachment/task-attachment-list.component.ts) | -| [People component](people.component.md) | Displays users involved with a specified task | [Source](../../lib/process-services/people/components/people/people.component.ts) | -| [People list component](people-list.component.md) | Shows a list of users (people). | [Source](../../lib/process-services/people/components/people-list/people-list.component.ts) | -| [People search component](people-search.component.md) | Searches users/people. | [Source](../../lib/process-services/people/components/people-search/people-search.component.ts) | -| [Process comments component](process-comments.component.md) | Displays comments associated with a particular process instance and allows the user to add new comments. | [Source](../../lib/process-services/process-comments/process-comments.component.ts) | -| [Process filters component](process-filters.component.md) | Collection of criteria used to filter process instances, which may be customized by users. | [Source](../../lib/process-services/process-list/components/process-filters.component.ts) | -| [Process instance details component](process-instance-details.component.md) | Displays detailed information about a specified process instance | [Source](../../lib/process-services/process-list/components/process-instance-details.component.ts) | -| [Process instance header component](process-instance-header.component.md) | Sub-component of the process details component, which renders some general information about the selected process. | [Source](../../lib/process-services/process-list/components/process-instance-header.component.ts) | -| [Process instance tasks component](process-instance-tasks.component.md) | Lists both the active and completed tasks associated with a particular process instance | [Source](../../lib/process-services/process-list/components/process-instance-tasks.component.ts) | -| [Process list component](process-list.component.md) | Renders a list containing all the process instances matched by the parameters specified. | [Source](../../lib/process-services/process-list/components/process-list.component.ts) | -| [Start process component](start-process.component.md) | Starts a process. | [Source](../../lib/process-services/process-list/components/start-process.component.ts) | -| [Attach form component](attach-form.component.md) | This component can be used when there is no form attached to a task and you want to add one. | [Source](../../lib/process-services/task-list/components/attach-form.component.ts) | -| [Checklist component](checklist.component.md) | Shows the checklist task functionality. | [Source](../../lib/process-services/task-list/components/checklist.component.ts) | -| [Start task component](start-task.component.md) | Creates/Starts a new task for the specified app. | [Source](../../lib/process-services/task-list/components/start-task.component.ts) | -| [Task details component](task-details.component.md) | Shows the details of the task ID passed in as input. | [Source](../../lib/process-services/task-list/components/task-details.component.ts) | -| [Task filters component](task-filters.component.md) | Shows all available filters. | [Source](../../lib/process-services/task-list/components/task-filters.component.ts) | -| [Task header component](task-header.component.md) | Shows all the information related to a task. | [Source](../../lib/process-services/task-list/components/task-header.component.ts) | -| [Task list component](task-list.component.md) | Renders a list containing all the tasks matched by the parameters specified. | [Source](../../lib/process-services/task-list/components/task-list.component.ts) | -| [Task standalone component](task-standalone.component.md) | This component can be used when the task doesn't belong to any processes. | [Source](../../lib/process-services/task-list/components/task-standalone.component.ts) | - -## Directives - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Process audit directive](process-audit.directive.md) | Fetches the Process Audit information in PDF or JSON format. | [Source](../../lib/process-services/process-list/components/process-audit.directive.ts) | -| [Task audit directive](task-audit.directive.md) | Fetches the Task Audit information in PDF or JSON format. | [Source](../../lib/process-services/task-list/components/task-audit.directive.ts) | - -## Services - -| Name | Description | Source link | -| ---- | ----------- | ----------- | -| [Process filter service](process-filter.service.md) | Manage Process Filters, which are pre-configured Process Instance queries. | [Source](../../lib/process-services/process-list/services/process-filter.service.ts) | -| [Process service](process.service.md) | Manages Process Instances, Process Variables, and Process Audit Log. | [Source](../../lib/process-services/process-list/services/process.service.ts) | -| [Task filter service](task-filter.service.md) | Manage Task Filters, which are pre-configured Task Instance queries. | [Source](../../lib/process-services/task-list/services/task-filter.service.ts) | -| [Tasklist service](tasklist.service.md) | Manages Task Instances. | [Source](../../lib/process-services/task-list/services/tasklist.service.ts) | - - diff --git a/docs/process-services/apps-list.component.md b/docs/process-services/components/apps-list.component.md similarity index 79% rename from docs/process-services/apps-list.component.md rename to docs/process-services/components/apps-list.component.md index 34995b6659..56d1cb9945 100644 --- a/docs/process-services/apps-list.component.md +++ b/docs/process-services/components/apps-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Apps List Component](../../lib/process-services/app-list/apps-list.component.ts "Defined in apps-list.component.ts") +# [Apps List Component](../../../lib/process-services/app-list/apps-list.component.ts "Defined in apps-list.component.ts") Shows all available apps. -![how-filter-apps](../docassets/images/how-filter-apps.png) +![how-filter-apps](../../docassets/images/how-filter-apps.png) ## Basic Usage @@ -19,7 +19,7 @@ Shows all available apps. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can show custom content when there are no apps available by supplying an `` section: @@ -46,7 +46,7 @@ You can show custom content when there are no apps available by supplying an | Name | Type | Description | | ---- | ---- | ----------- | -| appClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`AppDefinitionRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` | Emitted when an app entry is clicked. | +| appClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`AppDefinitionRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` | Emitted when an app entry is clicked. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | ## Details @@ -79,4 +79,4 @@ For example, if you set `filtersAppId` as follows: ...then only the Tasks app, the app with `deploymentId` 15037 and the app with "my app name" will be shown. -![how-filter-apps](../docassets/images/how-filter-apps.png) +![how-filter-apps](../../docassets/images/how-filter-apps.png) diff --git a/docs/process-services/attach-form.component.md b/docs/process-services/components/attach-form.component.md similarity index 87% rename from docs/process-services/attach-form.component.md rename to docs/process-services/components/attach-form.component.md index c1a85863f0..fbf5bc7ddf 100644 --- a/docs/process-services/attach-form.component.md +++ b/docs/process-services/components/attach-form.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-20 --- -# [Attach Form component](../../lib/process-services/task-list/components/attach-form.component.ts "Defined in attach-form.component.ts") +# [Attach Form component](../../../lib/process-services/task-list/components/attach-form.component.ts "Defined in attach-form.component.ts") This component can be used when there is no form attached to a task and you want to add one. diff --git a/docs/process-services/checklist.component.md b/docs/process-services/components/checklist.component.md similarity index 78% rename from docs/process-services/checklist.component.md rename to docs/process-services/components/checklist.component.md index 6e85b205f1..8a4b341e12 100644 --- a/docs/process-services/checklist.component.md +++ b/docs/process-services/components/checklist.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Checklist Component](../../lib/process-services/task-list/components/checklist.component.ts "Defined in checklist.component.ts") +# [Checklist Component](../../../lib/process-services/task-list/components/checklist.component.ts "Defined in checklist.component.ts") Shows the checklist task functionality. @@ -33,6 +33,6 @@ Shows the checklist task functionality. | Name | Type | Description | | ---- | ---- | ----------- | -| checklistTaskCreated | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` | Emitted when a new checklist task is created. | +| checklistTaskCreated | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` | Emitted when a new checklist task is created. | | checklistTaskDeleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a checklist task is deleted. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | diff --git a/docs/process-services/create-process-attachment.component.md b/docs/process-services/components/create-process-attachment.component.md similarity index 81% rename from docs/process-services/create-process-attachment.component.md rename to docs/process-services/components/create-process-attachment.component.md index d07906f0bb..9d423a195b 100644 --- a/docs/process-services/create-process-attachment.component.md +++ b/docs/process-services/components/create-process-attachment.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Create Process Attachment component](../../lib/process-services/attachment/create-process-attachment.component.ts "Defined in create-process-attachment.component.ts") +# [Create Process Attachment component](../../../lib/process-services/attachment/create-process-attachment.component.ts "Defined in create-process-attachment.component.ts") Displays an Upload Component (Drag and Click) to upload the attachment to a specified process instance. -![process-create-attachment](../docassets/images/process-create-attachment.png) +![process-create-attachment](../../docassets/images/process-create-attachment.png) ## Basic Usage diff --git a/docs/process-services/create-task-attachment.component.md b/docs/process-services/components/create-task-attachment.component.md similarity index 81% rename from docs/process-services/create-task-attachment.component.md rename to docs/process-services/components/create-task-attachment.component.md index 08e5ad4ae0..80b52e8b6d 100644 --- a/docs/process-services/create-task-attachment.component.md +++ b/docs/process-services/components/create-task-attachment.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Create Task Attachment Component](../../lib/process-services/attachment/create-task-attachment.component.ts "Defined in create-task-attachment.component.ts") +# [Create Task Attachment Component](../../../lib/process-services/attachment/create-task-attachment.component.ts "Defined in create-task-attachment.component.ts") Displays an Upload Component (Drag and Click) to upload the attachment to a specified task. -![task-create-attachment](../docassets/images/task-create-attachment.png) +![task-create-attachment](../../docassets/images/task-create-attachment.png) ## Basic Usage diff --git a/docs/process-services/people-list.component.md b/docs/process-services/components/people-list.component.md similarity index 69% rename from docs/process-services/people-list.component.md rename to docs/process-services/components/people-list.component.md index 5b3d54f54e..6b43c76534 100644 --- a/docs/process-services/people-list.component.md +++ b/docs/process-services/components/people-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [People list component](../../lib/process-services/people/components/people-list/people-list.component.ts "Defined in people-list.component.ts") +# [People list component](../../../lib/process-services/people/components/people-list/people-list.component.ts "Defined in people-list.component.ts") Shows a list of users (people). -![ADF People List](../docassets/images/adf-people-list.png) +![ADF People List](../../docassets/images/adf-people-list.png) ## Basic Usage @@ -44,8 +44,8 @@ export class SomeComponent implements OnInit { } ``` -You can use column templates with the [people list component](../process-services/people-list.component.md), since it is based on the -[Datatable component](../core/datatable.component.md): +You can use column templates with the [people list component](people-list.component.md), since it is based on the +[Datatable component](../../core/components/datatable.component.md): @@ -79,11 +79,11 @@ You can use column templates with the [people list component](../process-service | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | actions | `boolean` | false | Toggles whether or not actions should be visible, i.e. the 'Three-Dots' menu. | -| users | [`UserProcessModel`](../core/user-process.model.md)`[]` | | The array of user data used to populate the people list. | +| users | [`UserProcessModel`](../../core/models/user-process.model.md)`[]` | | The array of user data used to populate the people list. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| clickAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserEventModel`](../../lib/process-services/task-list/models/user-event.model.ts)`>` | Emitted when the user clicks in the 'Three Dots' drop down menu for a row. | -| clickRow | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserProcessModel`](../core/user-process.model.md)`>` | Emitted when the user clicks a row in the people list. | +| clickAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserEventModel`](../../../lib/process-services/task-list/models/user-event.model.ts)`>` | Emitted when the user clicks in the 'Three Dots' drop down menu for a row. | +| clickRow | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`>` | Emitted when the user clicks a row in the people list. | diff --git a/docs/process-services/people-search.component.md b/docs/process-services/components/people-search.component.md similarity index 76% rename from docs/process-services/people-search.component.md rename to docs/process-services/components/people-search.component.md index 6f426cc29f..4389ed0dd0 100644 --- a/docs/process-services/people-search.component.md +++ b/docs/process-services/components/people-search.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [People Search component](../../lib/process-services/people/components/people-search/people-search.component.ts "Defined in people-search.component.ts") +# [People Search component](../../../lib/process-services/people/components/people-search/people-search.component.ts "Defined in people-search.component.ts") Searches users/people. @@ -15,7 +15,7 @@ Searches users/people. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) You can provide a title for the search header and a label for the action button using special sub-components in the body of the `` element: @@ -33,7 +33,7 @@ special sub-components in the body of the `` element: | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| results | [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../core/user-process.model.md)`[]>` | | Parameters for displaying the list. | +| results | [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`[]>` | | Parameters for displaying the list. | ### Events @@ -41,7 +41,7 @@ special sub-components in the body of the `` element: | ---- | ---- | ----------- | | closeSearch | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the "close" button is clicked. | | searchPeople | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a search is performed with a new keyword. | -| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserProcessModel`](../core/user-process.model.md)`>` | Emitted when a user is selected and the action button is clicked. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`UserProcessModel`](../../core/models/user-process.model.md)`>` | Emitted when a user is selected and the action button is clicked. | ## Details diff --git a/docs/process-services/people.component.md b/docs/process-services/components/people.component.md similarity index 70% rename from docs/process-services/people.component.md rename to docs/process-services/components/people.component.md index 86c636d748..7f20a65315 100644 --- a/docs/process-services/people.component.md +++ b/docs/process-services/components/people.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2018-11-19 --- -# [People Component](../../lib/process-services/people/components/people/people.component.ts "Defined in people.component.ts") +# [People Component](../../../lib/process-services/people/components/people/people.component.ts "Defined in people.component.ts") Displays users involved with a specified task -![activiti-people](../docassets/images/activiti_people.png) +![activiti-people](../../docassets/images/activiti_people.png) ## Contents @@ -39,7 +39,7 @@ Displays users involved with a specified task | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| people | [`UserProcessModel`](../core/user-process.model.md)`[]` | \[] | The array of User objects to display. | +| people | [`UserProcessModel`](../../core/models/user-process.model.md)`[]` | \[] | The array of User objects to display. | | readOnly | `boolean` | false | Should the data be read-only? | | taskId | `string` | "" | The numeric ID of the task. | @@ -47,12 +47,12 @@ Displays users involved with a specified task ### How to customize the people component behavior -The [people component](../process-services/people.component.md) provides two options to customize its behavior: +The [people component](people.component.md) provides two options to customize its behavior: - _involveUserAndCloseSearch_: The selected user gets added and then the search section is closed - _involveUserWithoutCloseSearch_: The selected user gets added without closing the search section -This makes it easy to customize the [people component](../process-services/people.component.md) to involve the user via a single or double click event: +This makes it easy to customize the [people component](people.component.md) to involve the user via a single or double click event: ### Involve People single click and close search @@ -65,7 +65,7 @@ This makes it easy to customize the [people component](../process-services/peopl ``` -![involve-people-single-click-and-close-search](../docassets/images/involve-people-single-click-and-close-search.gif) +![involve-people-single-click-and-close-search](../../docassets/images/involve-people-single-click-and-close-search.gif) ### Involve People single click without close search @@ -78,7 +78,7 @@ This makes it easy to customize the [people component](../process-services/peopl ``` -![involve-people-single-click-without-close-search](../docassets/images/involve-people-single-click-without-close-search.gif) +![involve-people-single-click-without-close-search](../../docassets/images/involve-people-single-click-without-close-search.gif) ### Involve People double click and close search @@ -91,7 +91,7 @@ This makes it easy to customize the [people component](../process-services/peopl ``` -![involve-people-double-click-and-close-search](../docassets/images/involve-people-double-click-and-close-search.gif) +![involve-people-double-click-and-close-search](../../docassets/images/involve-people-double-click-and-close-search.gif) ### Involve People double double without close search @@ -104,4 +104,4 @@ This makes it easy to customize the [people component](../process-services/peopl ``` -![involve-people-double-click-without-close-search](../docassets/images/involve-people-double-click-without-close-search.gif) +![involve-people-double-click-without-close-search](../../docassets/images/involve-people-double-click-without-close-search.gif) diff --git a/docs/process-services/process-attachment-list.component.md b/docs/process-services/components/process-attachment-list.component.md similarity index 79% rename from docs/process-services/process-attachment-list.component.md rename to docs/process-services/components/process-attachment-list.component.md index eb80134a1f..3208457218 100644 --- a/docs/process-services/process-attachment-list.component.md +++ b/docs/process-services/components/process-attachment-list.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Process Attachment List component](../../lib/process-services/attachment/process-attachment-list.component.ts "Defined in process-attachment-list.component.ts") +# [Process Attachment List component](../../../lib/process-services/attachment/process-attachment-list.component.ts "Defined in process-attachment-list.component.ts") Displays documents attached to a specified process instance. -![process-attachment-list-sample](../docassets/images/process-attachment-list.png) +![process-attachment-list-sample](../../docassets/images/process-attachment-list.png) ## Basic Usage @@ -20,7 +20,7 @@ Displays documents attached to a specified process instance. ``` -Make sure to override the [`UploadService`](../core/upload.service.md) with the [`ProcessUploadService`](../../lib/process-services/task-list/services/process-upload.service.ts) +Make sure to override the [`UploadService`](../../core/services/upload.service.md) with the [`ProcessUploadService`](../../../lib/process-services/task-list/services/process-upload.service.ts) ```ts import { UploadService } from '@alfresco/adf-core'; @@ -37,7 +37,7 @@ export class MyCustomProcessAttachmentComponent { } ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside the `` element will be shown when the list is empty: @@ -48,11 +48,11 @@ the list is empty: ``` -![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) +![custom-no-content-drag-drop-template-sample](../../docassets/images/custom-no-content-drag-drop-template.png) A default template will be used if you don't supply a custom one to override it: -![default-no-content-template-sample](../docassets/images/default-no-content-template.png) +![default-no-content-template-sample](../../docassets/images/default-no-content-template.png) ## Class members @@ -76,7 +76,7 @@ A default template will be used if you don't supply a custom one to override it: ### How to Add Drag and Drop Functionality You can wrap the attachment list with an -[Upload Drag Area component](../content-services/upload-drag-area.component.md) +[Upload Drag Area component](../../content-services/components/upload-drag-area.component.md) to let the user upload attachments to empty lists. When you do this, you can also supply a custom _no content template_ (using <adf-empty-list>) to invite the user to add their attachments: diff --git a/docs/process-services/process-comments.component.md b/docs/process-services/components/process-comments.component.md similarity index 83% rename from docs/process-services/process-comments.component.md rename to docs/process-services/components/process-comments.component.md index 08e2519ec6..7977890652 100644 --- a/docs/process-services/process-comments.component.md +++ b/docs/process-services/components/process-comments.component.md @@ -4,7 +4,7 @@ Added: v2.0.0 Status: Active --- -# [Process Instance Comments component](../../lib/process-services/process-comments/process-comments.component.ts "Defined in process-comments.component.ts") +# [Process Instance Comments component](../../../lib/process-services/process-comments/process-comments.component.ts "Defined in process-comments.component.ts") Displays comments associated with a particular process instance and allows the user to add new comments. diff --git a/docs/process-services/process-filters.component.md b/docs/process-services/components/process-filters.component.md similarity index 81% rename from docs/process-services/process-filters.component.md rename to docs/process-services/components/process-filters.component.md index f68e6fcb0c..09f63642ee 100644 --- a/docs/process-services/process-filters.component.md +++ b/docs/process-services/components/process-filters.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-09-14 --- -# [Process Filters Component](../../lib/process-services/process-list/components/process-filters.component.ts "Defined in process-filters.component.ts") +# [Process Filters Component](../../../lib/process-services/process-list/components/process-filters.component.ts "Defined in process-filters.component.ts") Collection of criteria used to filter process instances, which may be customized by users. @@ -17,7 +17,7 @@ Collection of criteria used to filter process instances, which may be customized - [Events](#events) - [Details](#details) - [How filter the activiti process filters](#how-filter-the-activiti-process-filters) - - [FilterParamsModel](#filterparamsmodel) + - [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) - [See also](#see-also) ## Basic Usage @@ -36,7 +36,7 @@ Collection of criteria used to filter process instances, which may be customized | ---- | ---- | ------------- | ----------- | | appId | `number` | | Display filters available to the current user for the application with the specified ID. | | appName | `string` | | Display filters available to the current user for the application with the specified name. | -| filterParam | [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) | | The parameters to filter the task filter. If there is no match then the default one (ie, the first filter in the list) is selected. | +| filterParam | [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) | | The parameters to filter the task filter. If there is no match then the default one (ie, the first filter in the list) is selected. | | showIcon | `boolean` | true | Toggle to show or hide the filter's icon. | ### Events @@ -66,7 +66,7 @@ If both `appId` and `appName` are specified then `appName` will take precedence ``` -You can use inside the filterParam one of the properties defined by [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) (see below). +You can use inside the filterParam one of the properties defined by [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) (see below). ### FilterParamsModel @@ -86,4 +86,4 @@ You can use inside the filterParam one of the properties defined by [`FilterPara ## See also -- [Process Filter service](process-filter.service.md) +- [Process Filter service](../services/process-filter.service.md) diff --git a/docs/process-services/process-instance-details.component.md b/docs/process-services/components/process-instance-details.component.md similarity index 80% rename from docs/process-services/process-instance-details.component.md rename to docs/process-services/components/process-instance-details.component.md index e2ce81f58d..f34fafd3e7 100644 --- a/docs/process-services/process-instance-details.component.md +++ b/docs/process-services/components/process-instance-details.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Process Details component](../../lib/process-services/process-list/components/process-instance-details.component.ts "Defined in process-instance-details.component.ts") +# [Process Details component](../../../lib/process-services/process-list/components/process-instance-details.component.ts "Defined in process-instance-details.component.ts") Displays detailed information about a specified process instance @@ -34,4 +34,4 @@ Displays detailed information about a specified process instance | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | | processCancelled | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the current process is cancelled by the user from within the component. | | showProcessDiagram | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the "show diagram" button is clicked. | -| taskClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsEvent`](../../lib/process-services/task-list/models/task-details.event.ts)`>` | Emitted when a task is clicked. | +| taskClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsEvent`](../../../lib/process-services/task-list/models/task-details.event.ts)`>` | Emitted when a task is clicked. | diff --git a/docs/process-services/process-instance-header.component.md b/docs/process-services/components/process-instance-header.component.md similarity index 68% rename from docs/process-services/process-instance-header.component.md rename to docs/process-services/components/process-instance-header.component.md index 1ff061e3c5..d36238d702 100644 --- a/docs/process-services/process-instance-header.component.md +++ b/docs/process-services/components/process-instance-header.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Process Instance Details Header component](../../lib/process-services/process-list/components/process-instance-header.component.ts "Defined in process-instance-header.component.ts") +# [Process Instance Details Header component](../../../lib/process-services/process-list/components/process-instance-header.component.ts "Defined in process-instance-header.component.ts") Sub-component of the process details component, which renders some general information about the selected process. -![adf-process-instance-header](../docassets/images/adf-process-instance-header-attachment.png) +![adf-process-instance-header](../../docassets/images/adf-process-instance-header-attachment.png) ## Basic Usage @@ -25,7 +25,7 @@ Sub-component of the process details component, which renders some general infor | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| processInstance | [`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts) | | (**required**) Full details of the process instance to display information about. | +| processInstance | [`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts) | | (**required**) Full details of the process instance to display information about. | ## Details diff --git a/docs/process-services/process-instance-tasks.component.md b/docs/process-services/components/process-instance-tasks.component.md similarity index 63% rename from docs/process-services/process-instance-tasks.component.md rename to docs/process-services/components/process-instance-tasks.component.md index 2a01920dac..3872d59229 100644 --- a/docs/process-services/process-instance-tasks.component.md +++ b/docs/process-services/components/process-instance-tasks.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Process Instance Tasks component](../../lib/process-services/process-list/components/process-instance-tasks.component.ts "Defined in process-instance-tasks.component.ts") +# [Process Instance Tasks component](../../../lib/process-services/process-list/components/process-instance-tasks.component.ts "Defined in process-instance-tasks.component.ts") Lists both the active and completed tasks associated with a particular process instance @@ -24,7 +24,7 @@ Lists both the active and completed tasks associated with a particular process i | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| processInstanceDetails | [`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts) | | (**required**) The ID of the process instance to display tasks for. | +| processInstanceDetails | [`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts) | | (**required**) The ID of the process instance to display tasks for. | | showRefreshButton | `boolean` | true | Toggles whether to show a refresh button next to the list of tasks to allow it to be updated from the server. | ### Events @@ -32,4 +32,4 @@ Lists both the active and completed tasks associated with a particular process i | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| taskClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsEvent`](../../lib/process-services/task-list/models/task-details.event.ts)`>` | Emitted when a task is clicked. | +| taskClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsEvent`](../../../lib/process-services/task-list/models/task-details.event.ts)`>` | Emitted when a task is clicked. | diff --git a/docs/process-services/process-list.component.md b/docs/process-services/components/process-list.component.md similarity index 81% rename from docs/process-services/process-list.component.md rename to docs/process-services/components/process-list.component.md index 6ad3f48ff7..1176a44cc5 100644 --- a/docs/process-services/process-list.component.md +++ b/docs/process-services/components/process-list.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-01-16 --- -# [Process Instance List](../../lib/process-services/process-list/components/process-list.component.ts "Defined in process-list.component.ts") +# [Process Instance List](../../../lib/process-services/process-list/components/process-list.component.ts "Defined in process-list.component.ts") Renders a list containing all the process instances matched by the parameters specified. @@ -32,7 +32,7 @@ Renders a list containing all the process instances matched by the parameters sp ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside an `` sub-component will be shown when the process list is empty: @@ -52,7 +52,7 @@ when the process list is empty: | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | appId | `number` | | The id of the app. | -| data | [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) | | Data source to define the datatable. | +| data | [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) | | Data source to define the datatable. | | multiselect | `boolean` | false | Toggles multiple row selection, which renders checkboxes at the beginning of each row | | page | `number` | 0 | The page number of the processes to fetch. | | presetColumn | `string` | | Custom preset column schema in JSON format. | @@ -70,12 +70,13 @@ when the process list is empty: | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs while loading the list of process instances from the server. | | rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a row in the process list is clicked. | -| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessListModel`](../../lib/process-services/process-list/models/process-list.model.ts)`>` | Emitted when the list of process instances has been loaded successfully from the server. | +| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessListModel`](../../../lib/process-services/process-list/models/process-list.model.ts)`>` | Emitted when the list of process instances has been loaded successfully from the server. | ## Details -You can define a custom schema for the list in the `app.config.json` file and access it with the -`presetColumn` property as shown below: +The list can show any of the properties of the +[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts) +class. The example below shows how to define a custom schema for the list in the `app.config.json` file and access it with the `presetColumn` property: ```json "adf-process-list": { @@ -107,7 +108,7 @@ You can define a custom schema for the list in the `app.config.json` file and ac ``` You can also define the schema in the HTML using the -[Data column component](../core/data-column.component.md). You can combine this with schema +[Data column component](../../core/components/data-column.component.md). You can combine this with schema information defined in `app.config.json` as in the example below: ```json @@ -186,6 +187,6 @@ The Process Instance List also supports pagination: ## See also -- [Data column component](../core/data-column.component.md) -- [Data Table Adapter interface](../core/datatable-adapter.interface.md) -- [Pagination component](../core/pagination.component.md) +- [Data column component](../../core/components/data-column.component.md) +- [Data Table Adapter interface](../../core/interfaces/datatable-adapter.interface.md) +- [Pagination component](../../core/components/pagination.component.md) diff --git a/docs/process-services/select-apps-dialog.component.md b/docs/process-services/components/select-apps-dialog.component.md similarity index 75% rename from docs/process-services/select-apps-dialog.component.md rename to docs/process-services/components/select-apps-dialog.component.md index ebf656fc86..383207998d 100644 --- a/docs/process-services/select-apps-dialog.component.md +++ b/docs/process-services/components/select-apps-dialog.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Select App Component](../../lib/process-services/app-list/select-apps-dialog-component.ts "Defined in select-apps-dialog-component.ts") +# [Select App Component](../../../lib/process-services/app-list/select-apps-dialog-component.ts "Defined in select-apps-dialog-component.ts") Shows all available apps and returns the selected app. -![select-apps-dialog](../docassets/images/select-apps-dialog.png) +![select-apps-dialog](../../docassets/images/select-apps-dialog.png) ## Basic Usage diff --git a/docs/process-services/start-process.component.md b/docs/process-services/components/start-process.component.md similarity index 80% rename from docs/process-services/start-process.component.md rename to docs/process-services/components/start-process.component.md index d497d70ac9..fb1e5cee29 100644 --- a/docs/process-services/start-process.component.md +++ b/docs/process-services/components/start-process.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Start Process component](../../lib/process-services/process-list/components/start-process.component.ts "Defined in start-process.component.ts") +# [Start Process component](../../../lib/process-services/process-list/components/start-process.component.ts "Defined in start-process.component.ts") Starts a process. -![adf-start-process ](../docassets/images/startProcess.png) +![adf-start-process ](../../docassets/images/startProcess.png) ## Contents @@ -43,16 +43,16 @@ Starts a process. | processDefinitionName | `string` | | (optional) Definition name of the process to start. | | processFilterSelector | `boolean` | true | (optional) Parameter to enable selection of process when filtering. | | showSelectProcessDropdown | `boolean` | true | Hide or show the process selection dropdown. | -| values | [`FormValues`](../../lib/core/form/components/widgets/core/form-values.ts) | | Parameter to pass form field values in the start form if one is associated. | -| variables | [`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]` | | Variables in the input to the process [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md). | +| values | [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts) | | Parameter to pass form field values in the start form if one is associated. | +| variables | [`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]` | | Variables in the input to the process [RestVariable](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-activiti-rest-api/docs/RestVariable.md). | ### Events | Name | Type | Description | | ---- | ---- | ----------- | -| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when the process is canceled. | -| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when an error occurs. | -| start | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when the process starts. | +| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when the process is canceled. | +| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when an error occurs. | +| start | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>` | Emitted when the process starts. | ## Details @@ -170,7 +170,7 @@ Note that in the object above, the key `file` is the name of the attach file fie The result will be the start form prefilled with the file data: -![Start process load file](../docassets/images/start_process.png) +![Start process load file](../../docassets/images/start_process.png) ## See also diff --git a/docs/process-services/start-task.component.md b/docs/process-services/components/start-task.component.md similarity index 82% rename from docs/process-services/start-task.component.md rename to docs/process-services/components/start-task.component.md index f7e0d36af0..eb757644d2 100644 --- a/docs/process-services/start-task.component.md +++ b/docs/process-services/components/start-task.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Start Task Component](../../lib/process-services/task-list/components/start-task.component.ts "Defined in start-task.component.ts") +# [Start Task Component](../../../lib/process-services/task-list/components/start-task.component.ts "Defined in start-task.component.ts") Creates/Starts a new task for the specified app. -![adf-start-task](../docassets/images/adf-start-task.png) +![adf-start-task](../../docassets/images/adf-start-task.png) ## Basic Usage diff --git a/docs/process-services/task-attachment-list.component.md b/docs/process-services/components/task-attachment-list.component.md similarity index 71% rename from docs/process-services/task-attachment-list.component.md rename to docs/process-services/components/task-attachment-list.component.md index 50d522b5cb..f32168645b 100644 --- a/docs/process-services/task-attachment-list.component.md +++ b/docs/process-services/components/task-attachment-list.component.md @@ -5,11 +5,22 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Task Attachment List Component](../../lib/process-services/attachment/task-attachment-list.component.ts "Defined in task-attachment-list.component.ts") +# [Task Attachment List Component](../../../lib/process-services/attachment/task-attachment-list.component.ts "Defined in task-attachment-list.component.ts") Displays documents attached to a specified task. -![task-attachment-list-sample](../docassets/images/task-attachment-list.png) +![task-attachment-list-sample](../../docassets/images/task-attachment-list.png) + +## Contents + +- [Basic Usage](#basic-usage) + - [Transclusions](#transclusions) +- [Class members](#class-members) + - [Properties](#properties) + - [Events](#events) +- [Details](#details) + - [How to Add Drag and Drop Functionality](#how-to-add-drag-and-drop-functionality) +- [See also](#see-also) ## Basic Usage @@ -20,7 +31,7 @@ Displays documents attached to a specified task. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside the `` element will be displayed when the list is empty: @@ -31,11 +42,11 @@ when the list is empty: ``` -![custom-no-content-drag-drop-template-sample](../docassets/images/custom-no-content-drag-drop-template.png) +![custom-no-content-drag-drop-template-sample](../../docassets/images/custom-no-content-drag-drop-template.png) A default "no content" template is displayed if you don't supply one to override it: -![default-no-content-template-sample](../docassets/images/default-no-content-template.png) +![default-no-content-template-sample](../../docassets/images/default-no-content-template.png) ## Class members @@ -43,7 +54,7 @@ A default "no content" template is displayed if you don't supply one to override | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | -| disabled | `boolean` | false | Disable/Enable read only mode for attachement list. | +| disabled | `boolean` | false | Disable/Enable read only mode for attachment list. | | taskId | `string` | | (**required**) The ID of the task to display. | ### Events @@ -58,7 +69,7 @@ A default "no content" template is displayed if you don't supply one to override ### How to Add Drag and Drop Functionality -You can wrap the component with an [Upload Drag Area component](../content-services/upload-drag-area.component.md) +You can wrap the component with an [Upload Drag Area component](../../content-services/components/upload-drag-area.component.md) to enable the user to upload attachments for empty lists. When you do this, you can also pass a custom _no content template_ as shown below. The component invites the user to drag files to upload whenever the list is empty. @@ -89,7 +100,7 @@ import { UploadService } from '@alfresco/adf-core'; import { TaskUploadService } from '@alfresco/adf-process-services'; ``` -Make sure you override the [`UploadService`](../core/upload.service.md) with the [`TaskUploadService`](../../lib/process-services/task-list/services/task-upload.service.ts) +Make sure you override the [`UploadService`](../../core/services/upload.service.md) with the [`TaskUploadService`](../../../lib/process-services/task-list/services/task-upload.service.ts) ```ts @Component({ @@ -105,4 +116,4 @@ export class MyCustomTaskAttachmentComponent { ## See also -- [Upload Drag Area Component](../content-services/upload-drag-area.component.md) +- [Upload Drag Area Component](../../content-services/components/upload-drag-area.component.md) diff --git a/docs/process-services/task-details.component.md b/docs/process-services/components/task-details.component.md similarity index 68% rename from docs/process-services/task-details.component.md rename to docs/process-services/components/task-details.component.md index e49141ac8d..46e4fb37fd 100644 --- a/docs/process-services/task-details.component.md +++ b/docs/process-services/components/task-details.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Task Details component](../../lib/process-services/task-list/components/task-details.component.ts "Defined in task-details.component.ts") +# [Task Details component](../../../lib/process-services/task-list/components/task-details.component.ts "Defined in task-details.component.ts") Shows the details of the task ID passed in as input. @@ -24,7 +24,7 @@ Shows the details of the task ID passed in as input. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | debugMode | `boolean` | false | Toggles debug mode. | -| fieldValidators | `FormFieldValidator[]` | \[] | Field validators for use with the form. | +| fieldValidators | [`FormFieldValidator`](../../../lib/core/form/components/widgets/core/form-field-validator.ts)`[]` | \[] | Field validators for use with the form. | | readOnlyForm | `boolean` | false | Toggles read-only state of the form. All form widgets render as read-only if enabled. | | showChecklist | `boolean` | true | Toggles `Checklist` feature for the Header component. | | showComments | `boolean` | true | Toggles `Comments` feature for the Header component. | @@ -45,12 +45,12 @@ Shows the details of the task ID passed in as input. | assignTask | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a task is assigned. | | claimedTask | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a task is claimed. | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs. | -| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | -| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | -| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when the form field content is clicked. | -| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | -| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | -| taskCreated | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` | Emitted when a checklist task is created. | +| executeOutcome | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormOutcomeEvent`](../../../lib/core/form/components/widgets/core/form-outcome-event.model.ts)`>` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | +| formCompleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Complete` outcome. | +| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when the form field content is clicked. | +| formLoaded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is loaded or reloaded. | +| formSaved | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FormModel`](../../../lib/core/form/components/widgets/core/form.model.ts)`>` | Emitted when the form is submitted with the `Save` or custom outcomes. | +| taskCreated | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` | Emitted when a checklist task is created. | | taskDeleted | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a checklist task is deleted. | | unClaimedTask | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a task is unclaimed. | @@ -58,7 +58,7 @@ Shows the details of the task ID passed in as input. ### Custom 'empty Task Details' template -By default the [Task Details component](../process-services/task-details.component.md) shows a simple "No Tasks" message when there are +By default the [Task Details component](task-details.component.md) shows a simple "No Tasks" message when there are no details. You can change this by adding the a custom HTML template as in the following example: diff --git a/docs/process-services/task-filters.component.md b/docs/process-services/components/task-filters.component.md similarity index 70% rename from docs/process-services/task-filters.component.md rename to docs/process-services/components/task-filters.component.md index 5cd5fb17ab..985caada3d 100644 --- a/docs/process-services/task-filters.component.md +++ b/docs/process-services/components/task-filters.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-16 --- -# [Task Filters component](../../lib/process-services/task-list/components/task-filters.component.ts "Defined in task-filters.component.ts") +# [Task Filters component](../../../lib/process-services/task-list/components/task-filters.component.ts "Defined in task-filters.component.ts") Shows all available filters. @@ -23,7 +23,7 @@ Shows all available filters. | ---- | ---- | ------------- | ----------- | | appId | `number` | | Display filters available to the current user for the application with the specified ID. | | appName | `string` | | Display filters available to the current user for the application with the specified name. | -| filterParam | [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) | | Parameters to use for the task filter. If there is no match then the default filter (the first one the list) is selected. | +| filterParam | [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) | | Parameters to use for the task filter. If there is no match then the default filter (the first one the list) is selected. | | showIcon | `boolean` | | Toggles display of the filter's icon. | ### Events @@ -31,7 +31,7 @@ Shows all available filters. | Name | Type | Description | | ---- | ---- | ----------- | | error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when an error occurs during loading. | -| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` | Emitted when a filter in the list is clicked. | +| filterClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` | Emitted when a filter in the list is clicked. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the list is loaded. | ## Details @@ -46,7 +46,7 @@ Use the `filterParam` property to restrict the range of filters that are shown: ``` -You can use properties from [`FilterParamsModel`](../../lib/process-services/task-list/models/filter.model.ts) +You can use properties from [`FilterParamsModel`](../../../lib/process-services/task-list/models/filter.model.ts) as the value of `filterParam` as shown in the table below: | Name | Type | Description | diff --git a/docs/process-services/task-header.component.md b/docs/process-services/components/task-header.component.md similarity index 73% rename from docs/process-services/task-header.component.md rename to docs/process-services/components/task-header.component.md index d8fdcfae32..8d0bdf0de7 100644 --- a/docs/process-services/task-header.component.md +++ b/docs/process-services/components/task-header.component.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Task Header component](../../lib/process-services/task-list/components/task-header.component.ts "Defined in task-header.component.ts") +# [Task Header component](../../../lib/process-services/task-list/components/task-header.component.ts "Defined in task-header.component.ts") Shows all the information related to a task. -![adf-task-header](../docassets/images/adf-task-header.png) +![adf-task-header](../../docassets/images/adf-task-header.png) ## Basic Usage @@ -26,7 +26,7 @@ Shows all the information related to a task. | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | formName | `string` | null | The name of the form. | -| taskDetails | [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts) | | (required) Details related to the task. | +| taskDetails | [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) | | (required) Details related to the task. | ### Events @@ -38,7 +38,7 @@ Shows all the information related to a task. ## Details The component populates an internal array of -[CardViewModel](../core/card-view.component.md) with the information that we want to display. +[CardViewModel](../../core/components/card-view.component.md) with the information that we want to display. By default all properties are displayed: diff --git a/docs/process-services/task-list.component.md b/docs/process-services/components/task-list.component.md similarity index 84% rename from docs/process-services/task-list.component.md rename to docs/process-services/components/task-list.component.md index c0209b31a9..af8c51b303 100644 --- a/docs/process-services/task-list.component.md +++ b/docs/process-services/components/task-list.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2019-02-08 --- -# [Task List component](../../lib/process-services/task-list/components/task-list.component.ts "Defined in task-list.component.ts") +# [Task List component](../../../lib/process-services/task-list/components/task-list.component.ts "Defined in task-list.component.ts") Renders a list containing all the tasks matched by the parameters specified. @@ -34,7 +34,7 @@ Renders a list containing all the tasks matched by the parameters specified. ``` -### [Transclusions](../user-guide/transclusion.md) +### [Transclusions](../../user-guide/transclusion.md) Any content inside an `` sub-component will be shown when the task list is empty: @@ -55,7 +55,7 @@ when the task list is empty: | ---- | ---- | ------------- | ----------- | | appId | `number` | | The id of the app. | | assignment | `string` | | The assignment of the process. Possible values are: "assignee" (the current user is the assignee), "candidate" (the current user is a task candidate, "group_x" (the task is assigned to a group where the current user is a member, no value (the current user is involved). | -| data | [`DataTableAdapter`](../../lib/core/datatable/data/datatable-adapter.ts) | | Data source object that represents the number and the type of the columns that you want to show. | +| data | [`DataTableAdapter`](../../../lib/core/datatable/data/datatable-adapter.ts) | | Data source object that represents the number and the type of the columns that you want to show. | | dueAfter | `string` | | Filter the tasks. Display only tasks with `created_date` after `dueAfter`. | | dueBefore | `string` | | Filter the tasks. Display only tasks with `created_date` before `dueBefore`. | | includeProcessInstance | `boolean` | | Toggles inclusion of Process Instances | @@ -90,7 +90,9 @@ renders details of any chosen instance. ### Setting the column schema -You can use an HTML-based schema declaration to set a column schema for the tasklist as shown below : +You can configure the list to show any of the properties of the +[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) +class. The example below shows how to set up the column schema from HTML: ```html @@ -209,9 +211,9 @@ The Tasklist also supports pagination as shown in the example below: ### DataTableAdapter example -See the [Data Table Adapter interface](../core/datatable-adapter.interface.md) page for full details of the interface and its standard -implementation, [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts). Below is an example of how you can set up the adapter for a -typical tasklist. +See the [Data Table Adapter interface](../../core/interfaces/datatable-adapter.interface.md) page for full details of the interface and its standard +implementation, [`ObjectDataTableAdapter`](../../../lib/core/datatable/data/object-datatable-adapter.ts). Below is an example of how you can set up the adapter for a +typical tasklist: ```json [ @@ -224,10 +226,10 @@ typical tasklist. ### DataColumn Features -You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [Data Column component](../../lib/core/datatable/data/data-column.model.ts) page for more information about these features. +You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [Data Column component](../../core/components/data-column.component.md) page for more information about these features. ## See also -- [Data column component](../core/data-column.component.md) -- [Data Table Adapter interface](../core/datatable-adapter.interface.md) -- [Pagination component](../core/pagination.component.md) +- [Data column component](../../core/components/data-column.component.md) +- [Data Table Adapter interface](../../core/interfaces/datatable-adapter.interface.md) +- [Pagination component](../../core/components/pagination.component.md) diff --git a/docs/process-services/task-standalone.component.md b/docs/process-services/components/task-standalone.component.md similarity index 89% rename from docs/process-services/task-standalone.component.md rename to docs/process-services/components/task-standalone.component.md index 4f78441daf..e86381dd45 100644 --- a/docs/process-services/task-standalone.component.md +++ b/docs/process-services/components/task-standalone.component.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-19 --- -# [Task Standalone component](../../lib/process-services/task-list/components/task-standalone.component.ts "Defined in task-standalone.component.ts") +# [Task Standalone component](../../../lib/process-services/task-list/components/task-standalone.component.ts "Defined in task-standalone.component.ts") This component can be used when the task doesn't belong to any processes. diff --git a/docs/process-services/process-audit.directive.md b/docs/process-services/directives/process-audit.directive.md similarity index 83% rename from docs/process-services/process-audit.directive.md rename to docs/process-services/directives/process-audit.directive.md index e531028726..2500f6ab42 100644 --- a/docs/process-services/process-audit.directive.md +++ b/docs/process-services/directives/process-audit.directive.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Process Audit Directive](../../lib/process-services/process-list/components/process-audit.directive.ts "Defined in process-audit.directive.ts") +# [Process Audit Directive](../../../lib/process-services/process-list/components/process-audit.directive.ts "Defined in process-audit.directive.ts") Fetches the Process Audit information in PDF or JSON format. -![adf-process-audit-directive](../docassets/images/adf-process-audit-directive.png) +![adf-process-audit-directive](../../docassets/images/adf-process-audit-directive.png) ## Basic Usage diff --git a/docs/process-services/task-audit.directive.md b/docs/process-services/directives/task-audit.directive.md similarity index 84% rename from docs/process-services/task-audit.directive.md rename to docs/process-services/directives/task-audit.directive.md index 391327cc72..688e00d89d 100644 --- a/docs/process-services/task-audit.directive.md +++ b/docs/process-services/directives/task-audit.directive.md @@ -5,11 +5,11 @@ Status: Active Last reviewed: 2019-01-14 --- -# [Task Audit Directive](../../lib/process-services/task-list/components/task-audit.directive.ts "Defined in task-audit.directive.ts") +# [Task Audit Directive](../../../lib/process-services/task-list/components/task-audit.directive.ts "Defined in task-audit.directive.ts") Fetches the Task Audit information in PDF or JSON format. -![adf-task-audit-directive](../docassets/images/adf-task-audit-directive.png) +![adf-task-audit-directive](../../docassets/images/adf-task-audit-directive.png) ## Basic Usage diff --git a/docs/process-services/process-filter.service.md b/docs/process-services/services/process-filter.service.md similarity index 63% rename from docs/process-services/process-filter.service.md rename to docs/process-services/services/process-filter.service.md index a2f195ec55..a77588b9e7 100644 --- a/docs/process-services/process-filter.service.md +++ b/docs/process-services/services/process-filter.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-13 --- -# [Process Filter Service](../../lib/process-services/process-list/services/process-filter.service.ts "Defined in process-filter.service.ts") +# [Process Filter Service](../../../lib/process-services/process-list/services/process-filter.service.ts "Defined in process-filter.service.ts") Manage Process Filters, which are pre-configured Process Instance queries. @@ -13,41 +13,41 @@ Manage Process Filters, which are pre-configured Process Instance queries. ### Methods -- **addProcessFilter**(filter: [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>`
+- **addProcessFilter**(filter: [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>`
Adds a filter. - - _filter:_ [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) - The filter to add - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>` - The filter just added + - _filter:_ [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) - The filter to add + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>` - The filter just added - **callApiProcessFilters**(appId?: `number`): `any`
Calls `getUserProcessInstanceFilters` from the Alfresco JS API. - _appId:_ `number` - (Optional) ID of the target app - **Returns** `any` - List of filter details -- **createDefaultFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`[]>`
+- **createDefaultFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`[]>`
Creates and returns the default filters for an app. - _appId:_ `number` - ID of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`[]>` - Default filters just created -- **getProcessFilterById**(filterId: `number`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`[]>` - Default filters just created +- **getProcessFilterById**(filterId: `number`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>`
Retrieves the process filter by ID. - _filterId:_ `number` - ID of the filter - _appId:_ `number` - (Optional) ID of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>` - Details of the filter -- **getProcessFilterByName**(filterName: `string`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>` - Details of the filter +- **getProcessFilterByName**(filterName: `string`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>`
Retrieves the process filter by name. - _filterName:_ `string` - Name of the filter - _appId:_ `number` - (Optional) ID of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`>` - Details of the filter -- **getProcessFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`>` - Details of the filter +- **getProcessFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`[]>`
Gets all filters defined for a Process App. - _appId:_ `number` - ID of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)`[]>` - Array of filter details -- **getRunningFilterInstance**(appId: `number`): [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts)
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)`[]>` - Array of filter details +- **getRunningFilterInstance**(appId: `number`): [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts)
Creates and returns a filter that matches "running" process instances. - _appId:_ `number` - ID of the target app - - **Returns** [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) - Filter just created + - **Returns** [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) - Filter just created ## Details The methods of this service generally return an instance of -[`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) or an array of instances. For example, you +[`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) or an array of instances. For example, you could use `getProcessFilters` as follows: ```ts @@ -60,7 +60,7 @@ this.processFilterService.getProcessFilters(processAppId) }); ``` -The response is an array of [`FilterProcessRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) objects: +The response is an array of [`FilterProcessRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) objects: filters: 0: {id: 15, appId: 2, name: "Running", recent: true, icon: "glyphicon-random", …} @@ -75,5 +75,5 @@ such as 'Running', 'Completed', 'All', etc. ## See also -- [Process Filters component](process-filters.component.md) +- [Process Filters component](../components/process-filters.component.md) - [Task Filter service](task-filter.service.md) diff --git a/docs/process-services/process.service.md b/docs/process-services/services/process.service.md similarity index 66% rename from docs/process-services/process.service.md rename to docs/process-services/services/process.service.md index 0a8b54b7f2..644c1e6c5c 100644 --- a/docs/process-services/process.service.md +++ b/docs/process-services/services/process.service.md @@ -2,12 +2,12 @@ Title: Process Service Added: v2.0.0 Status: Active -Last reviewed: 2018-03-20 +Last reviewed: 2019-03-20 --- -# [Process Service](../../lib/process-services/process-list/services/process.service.ts "Defined in process.service.ts") +# [Process Service](../../../lib/process-services/process-list/services/process.service.ts "Defined in process.service.ts") -Manages Process Instances, Process Variables, and Process Audit Log. +Manages process instances, process variables, and process audit Log. ## Class members @@ -17,11 +17,11 @@ Manages Process Instances, Process Variables, and Process Audit Log. Cancels a process instance. - _processInstanceId:_ `string` - ID of process to cancel - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Null response notifying when the operation is complete -- **createOrUpdateProcessInstanceVariables**(processInstanceId: `string`, variables: `RestVariable[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>`
+- **createOrUpdateProcessInstanceVariables**(processInstanceId: `string`, variables: `RestVariable[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>`
Creates or updates variables for a process instance. - _processInstanceId:_ `string` - ID of the target process - _variables:_ `RestVariable[]` - Variables to update - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>` - Array of instance variable info + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>` - Array of instance variable info - **deleteProcessInstanceVariable**(processInstanceId: `string`, variableName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Deletes a variable for a process instance. - _processInstanceId:_ `string` - ID of the target process @@ -35,41 +35,41 @@ Manages Process Instances, Process Variables, and Process Audit Log. Fetches the Process Audit information as a PDF. - _processId:_ `string` - ID of the target process - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)`>` - Binary PDF data -- **getProcess**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>`
+- **getProcess**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>`
Gets Process Instance metadata. - _processInstanceId:_ `string` - ID of the target process - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>` - Metadata for the instance -- **getProcessDefinitions**(appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionRepresentation`](../../lib/process-services/process-list/models/process-definition.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>` - Metadata for the instance +- **getProcessDefinitions**(appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionRepresentation`](../../../lib/process-services/process-list/models/process-definition.model.ts)`[]>`
Gets process definitions associated with an app. - _appId:_ `number` - (Optional) ID of a target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionRepresentation`](../../lib/process-services/process-list/models/process-definition.model.ts)`[]>` - Array of process definitions -- **getProcessInstanceVariables**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionRepresentation`](../../../lib/process-services/process-list/models/process-definition.model.ts)`[]>` - Array of process definitions +- **getProcessInstanceVariables**(processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>`
Gets the variables for a process instance. - _processInstanceId:_ `string` - ID of the target process - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>` - Array of instance variable info -- **getProcessInstances**(requestNode: [`ProcessFilterParamRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts), processDefinitionKey?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../lib/process-services/process-list/models/process-list.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]>` - Array of instance variable info +- **getProcessInstances**(requestNode: [`ProcessFilterParamRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts), processDefinitionKey?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../../lib/process-services/process-list/models/process-list.model.ts)`>`
Gets process instances for a filter and optionally a process definition. - - _requestNode:_ [`ProcessFilterParamRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) - Filter for instances + - _requestNode:_ [`ProcessFilterParamRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) - Filter for instances - _processDefinitionKey:_ `string` - (Optional) Limits returned instances to a process definition - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../lib/process-services/process-list/models/process-list.model.ts)`>` - List of process instances -- **getProcessTasks**(processInstanceId: `string`, state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../../lib/process-services/process-list/models/process-list.model.ts)`>` - List of process instances +- **getProcessTasks**(processInstanceId: `string`, state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`[]>`
Gets task instances for a process instance. - _processInstanceId:_ `string` - ID of the process instance - _state:_ `string` - (Optional) Task state filter (can be "active" or "completed") - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`[]>` - Array of task instance details -- **getProcesses**(requestNode: [`ProcessFilterParamRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts), processDefinitionKey?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../lib/process-services/process-list/models/process-list.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`[]>` - Array of task instance details +- **getProcesses**(requestNode: [`ProcessFilterParamRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts), processDefinitionKey?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../../lib/process-services/process-list/models/process-list.model.ts)`>`
Gets processes for a filter and optionally a process definition. - - _requestNode:_ [`ProcessFilterParamRepresentationModel`](../../lib/process-services/process-list/models/filter-process.model.ts) - Filter for instances + - _requestNode:_ [`ProcessFilterParamRepresentationModel`](../../../lib/process-services/process-list/models/filter-process.model.ts) - Filter for instances - _processDefinitionKey:_ `string` - (Optional) Limits returned instances to a process definition - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../lib/process-services/process-list/models/process-list.model.ts)`>` - List of processes -- **startProcess**(processDefinitionId: `string`, name: `string`, outcome?: `string`, startFormValues?: [`FormValues`](../../lib/core/form/components/widgets/core/form-values.ts), variables?: [`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessListModel`](../../../lib/process-services/process-list/models/process-list.model.ts)`>` - List of processes +- **startProcess**(processDefinitionId: `string`, name: `string`, outcome?: `string`, startFormValues?: [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts), variables?: [`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>`
Starts a process based on a process definition, name, form values or variables. - _processDefinitionId:_ `string` - Process definition ID - _name:_ `string` - Process name - _outcome:_ `string` - (Optional) Process outcome - - _startFormValues:_ [`FormValues`](../../lib/core/form/components/widgets/core/form-values.ts) - (Optional) Values for the start form - - _variables:_ [`ProcessInstanceVariable`](../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]` - (Optional) Array of process instance variables - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts)`>` - Details of the process instance just started + - _startFormValues:_ [`FormValues`](../../../lib/core/form/components/widgets/core/form-values.ts) - (Optional) Values for the start form + - _variables:_ [`ProcessInstanceVariable`](../../../lib/process-services/process-list/models/process-instance-variable.model.ts)`[]` - (Optional) Array of process instance variables + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts)`>` - Details of the process instance just started ## Details @@ -113,7 +113,7 @@ this.processService.startProcess(processDefinitionId, name, outcome, startFormVa }); ``` -A [`ProcessInstance`](../../lib/process-services/process-list/models/process-instance.model.ts) object is returned for a successfully started process. This implements the +A [`ProcessInstance`](../../../lib/process-services/process-list/models/process-instance.model.ts) object is returned for a successfully started process. This implements the [ProcessInstanceRepresentation interface](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-activiti-rest-api/docs/ProcessInstanceRepresentation.md). You can start the process with process variables instead of form field values using diff --git a/docs/process-services/task-filter.service.md b/docs/process-services/services/task-filter.service.md similarity index 61% rename from docs/process-services/task-filter.service.md rename to docs/process-services/services/task-filter.service.md index 8e6a413722..1523340683 100644 --- a/docs/process-services/task-filter.service.md +++ b/docs/process-services/services/task-filter.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-06-07 --- -# [Task Filter Service](../../lib/process-services/task-list/services/task-filter.service.ts "Defined in task-filter.service.ts") +# [Task Filter Service](../../../lib/process-services/task-list/services/task-filter.service.ts "Defined in task-filter.service.ts") Manage Task Filters, which are pre-configured Task Instance queries. @@ -13,52 +13,52 @@ Manage Task Filters, which are pre-configured Task Instance queries. ### Methods -- **addFilter**(filter: [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>`
+- **addFilter**(filter: [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>`
Adds a new task filter - - _filter:_ [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The new filter to add - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter just added + - _filter:_ [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The new filter to add + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter just added - **callApiTaskFilters**(appId?: `number`): [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)``
Calls `getUserTaskFilters` from the Alfresco JS API. - _appId:_ `number` - (Optional) ID of the target app - **Returns** [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)`` - List of task filters -- **createDefaultFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]>`
+- **createDefaultFilters**(appId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]>`
Creates and returns the default filters for a process app. - _appId:_ `number` - ID of the target app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]>` - Array of default filters just created -- **getCompletedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]>` - Array of default filters just created +- **getCompletedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)
Creates and returns a filter for "Completed" task instances. - _appId:_ `number` - ID of the target app - - **Returns** [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter -- **getInvolvedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)
+ - **Returns** [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter +- **getInvolvedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)
Creates and returns a filter for "Involved" task instances. - _appId:_ `number` - ID of the target app - - **Returns** [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter -- **getMyTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)
+ - **Returns** [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter +- **getMyTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)
Creates and returns a filter for "My Tasks" task instances. - _appId:_ `number` - ID of the target app - - **Returns** [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter -- **getQueuedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)
+ - **Returns** [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter +- **getQueuedTasksFilterInstance**(appId: `number`): [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)
Creates and returns a filter for "Queued Tasks" task instances. - _appId:_ `number` - ID of the target app - - **Returns** [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter -- **getTaskFilterById**(filterId: `number`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>`
+ - **Returns** [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The newly created filter +- **getTaskFilterById**(filterId: `number`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>`
Gets a task filter by ID. - _filterId:_ `number` - ID of the filter - _appId:_ `number` - (Optional) ID of the app for the filter - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter -- **getTaskFilterByName**(taskName: `string`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter +- **getTaskFilterByName**(taskName: `string`, appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>`
Gets a task filter by name. - _taskName:_ `string` - Name of the filter - _appId:_ `number` - (Optional) ID of the app for the filter - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter -- **getTaskListFilters**(appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` - Details of task filter +- **getTaskListFilters**(appId?: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]>`
Gets all task filters for a process app. - _appId:_ `number` - (Optional) Optional ID for a specific app - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]>` - Array of task filter details + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]>` - Array of task filter details ## Details -The methods of this service generally return an instance of [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) or +The methods of this service generally return an instance of [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) or an array of instances. For example, you could use `getTaskListFilters` as follows: ```ts @@ -70,7 +70,7 @@ this.taskFilterService.getTaskListFilters(processAppId).subscribe( (filters: Fil }); ``` -The response is an array of [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) objects: +The response is an array of [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) objects: filters: 0: {id: 10, appId: 2, name: "Involved Tasks", recent: true, icon: "glyphicon-align-left", …} @@ -98,5 +98,5 @@ export class SomePageComponent implements OnInit { ## See also -- [Task Filters component](task-filters.component.md) +- [Task Filters component](../components/task-filters.component.md) - [Process Filter service](process-filter.service.md) diff --git a/docs/process-services/tasklist.service.md b/docs/process-services/services/tasklist.service.md similarity index 60% rename from docs/process-services/tasklist.service.md rename to docs/process-services/services/tasklist.service.md index ac6914dd46..da5d24525c 100644 --- a/docs/process-services/tasklist.service.md +++ b/docs/process-services/services/tasklist.service.md @@ -5,7 +5,7 @@ Status: Active Last reviewed: 2018-11-14 --- -# [Tasklist Service](../../lib/process-services/task-list/services/tasklist.service.ts "Defined in tasklist.service.ts") +# [Tasklist Service](../../../lib/process-services/task-list/services/tasklist.service.ts "Defined in tasklist.service.ts") Manages Task Instances. @@ -13,45 +13,45 @@ Manages Task Instances. ### Methods -- **addTask**(task: [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+- **addTask**(task: [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Adds a subtask (ie, a checklist task) to a parent task. - - _task:_ [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts) - The task to add - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - The subtask that was added -- **assignTask**(taskId: `string`, requestNode: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - _task:_ [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) - The task to add + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - The subtask that was added +- **assignTask**(taskId: `string`, requestNode: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Assigns a task to a user or group. - _taskId:_ `string` - The task to assign - _requestNode:_ `any` - User or group to assign the task to - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the assigned task -- **assignTaskByUserId**(taskId: `string`, userId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the assigned task +- **assignTaskByUserId**(taskId: `string`, userId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Assigns a task to a user. - _taskId:_ `string` - ID of the task to assign - _userId:_ `string` - ID of the user to assign the task to - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the assigned task + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the assigned task - **attachFormToATask**(taskId: `string`, formId: `number`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Attaches a form to a task. - _taskId:_ `string` - ID of the target task - _formId:_ `number` - ID of the form to add - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Null response notifying when the operation is complete -- **claimTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+- **claimTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Claims a task for the current user. - _taskId:_ `string` - ID of the task to claim - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the claimed task + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the claimed task - **completeTask**(taskId: `string`): `any`
Gives completed status to a task. - _taskId:_ `string` - ID of the target task - **Returns** `any` - Null response notifying when the operation is complete -- **createNewTask**(task: [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+- **createNewTask**(task: [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Creates a new standalone task. - - _task:_ [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts) - Details of the new task - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the newly created task -- **deleteForm**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - _task:_ [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) - Details of the new task + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Details of the newly created task +- **deleteForm**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Deletes a form from a task. - _taskId:_ `string` - Task id related to form - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete -- **deleteTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete +- **deleteTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Deletes a subtask (ie, a checklist task) from a parent task. - _taskId:_ `string` - The task to delete - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete - **fetchTaskAuditJsonById**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)``
Fetch the Task Audit information in JSON format - _taskId:_ `string` - ID of the target task @@ -60,64 +60,64 @@ Manages Task Instances. Fetches the Task Audit information in PDF format. - _taskId:_ `string` - ID of the target task - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)`>` - Binary PDF data -- **findAllTaskByState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts), state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>`
+- **findAllTaskByState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts), state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>`
Gets all tasks matching a query and state value. - - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks. + - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks. - _state:_ `string` - (Optional) Task state. Can be "open" or "completed". - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks -- **findAllTasksWithoutState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks +- **findAllTasksWithoutState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>`
Gets all tasks matching the supplied query but ignoring the task state. - - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks -- **findTasksByState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts), state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>`
+ - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks +- **findTasksByState**(requestNode: [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts), state?: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>`
Gets tasks matching a query and state value. - - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks + - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks - _state:_ `string` - (Optional) Task state. Can be "open" or "completed". - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks -- **getFilterForTaskById**(taskId: `string`, filterList: [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks +- **getFilterForTaskById**(taskId: `string`, filterList: [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>`
Gets all the filters in the list that belong to a task. - _taskId:_ `string` - ID of the target task - - _filterList:_ [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`[]` - List of filters to search through - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` - Filters belonging to the task -- **getFormList**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Form`](../../lib/process-services/task-list/models/form.model.ts)`[]>`
+ - _filterList:_ [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`[]` - List of filters to search through + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` - Filters belonging to the task +- **getFormList**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Form`](../../../lib/process-services/task-list/models/form.model.ts)`[]>`
Gets all available reusable forms. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Form`](../../lib/process-services/task-list/models/form.model.ts)`[]>` - Array of form details -- **getTaskChecklist**(id: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`[]>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Form`](../../../lib/process-services/task-list/models/form.model.ts)`[]>` - Array of form details +- **getTaskChecklist**(id: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`[]>`
Gets the checklist for a task. - _id:_ `string` - ID of the target task - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`[]>` - Array of checklist task details -- **getTaskDetails**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`[]>` - Array of checklist task details +- **getTaskDetails**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Gets details for a task. - _taskId:_ `string` - ID of the target task. - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Task details -- **getTasks**(requestNode: [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Task details +- **getTasks**(requestNode: [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>`
Gets all the tasks matching the supplied query. - - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks -- **getTotalTasks**(requestNode: [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
+ - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts)`>` - List of tasks +- **getTotalTasks**(requestNode: [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)``
Gets the total number of the tasks found by a query. - - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks + - _requestNode:_ [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - Query to search for tasks - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`` - Number of tasks -- **isTaskRelatedToFilter**(taskId: `string`, filterModel: [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>`
+- **isTaskRelatedToFilter**(taskId: `string`, filterModel: [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>`
Checks if a taskId is filtered with the given filter. - _taskId:_ `string` - ID of the target task - - _filterModel:_ [`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) - The filter you want to check - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts)`>` - The filter if it is related or null otherwise -- **unclaimTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - _filterModel:_ [`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) - The filter you want to check + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`FilterRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts)`>` - The filter if it is related or null otherwise +- **unclaimTask**(taskId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Un-claims a task for the current user. - _taskId:_ `string` - ID of the task to unclaim - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete -- **updateTask**(taskId: `any`, updated: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>`
+ - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Null response notifying when the operation is complete +- **updateTask**(taskId: `any`, updated: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>`
Updates the details (name, description, due date) for a task. - _taskId:_ `any` - ID of the task to update - _updated:_ `any` - Data to update the task (as a `TaskUpdateRepresentation` instance). - - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts)`>` - Updated task details + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts)`>` - Updated task details ## Details ### Task details -Several of the methods return one or more [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts) instances corresponding +Several of the methods return one or more [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) instances corresponding to tasks or subtasks matched by a query of some kind. For example, `getTaskDetails` could be used as shown below: @@ -130,7 +130,7 @@ this.tasklistService.getTaskDetails(taskInstanceId).subscribe( (taskInstance: Ta }); ``` -The resulting [`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts) object contains information like the following: +The resulting [`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts) object contains information like the following: adhocTaskCanBeReassigned: false assignee: UserProcessModel {pictureId: null, id: 1, email: "admin@app.activiti.com", firstName: null, lastName: "Administrator"} @@ -166,7 +166,7 @@ The resulting [`TaskDetailsModel`](../../lib/process-services/task-list/models/t ### Queries -Some of the methods run a search query contained in a [`TaskQueryRequestRepresentationModel`](../../lib/process-services/task-list/models/filter.model.ts) and +Some of the methods run a search query contained in a [`TaskQueryRequestRepresentationModel`](../../../lib/process-services/task-list/models/filter.model.ts) and return the matched tasks. Below is an example of how you might run a query using `getTasks`: ```ts @@ -205,8 +205,8 @@ The `assignment` property filters tasks based on how they are assigned (or not a Use `assignee` if you are interested in tasks that are assigned to a user. If you want to see pooled tasks (i.e. tasks that needs to be claimed by a user), then use `candidate`. -A successful query returns a [`TaskListModel`](../../lib/process-services/task-list/models/task-list.model.ts) with the `data` property set to an array of -[`TaskDetailsModel`](../../lib/process-services/task-list/models/task-details.model.ts): +A successful query returns a [`TaskListModel`](../../../lib/process-services/task-list/models/task-list.model.ts) with the `data` property set to an array of +[`TaskDetailsModel`](../../../lib/process-services/task-list/models/task-details.model.ts): data: 0: {id: "75010", name: "Approve Invoice - Invoice-10202.pdf", description: null, category: null, assignee: {…}, …} diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index 0ca2e427c3..e2daf1d303 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -9,6 +9,7 @@ The first **General available** release was v2.0.0. ## General available +- [3.1.0](RelNote310.md) - [3.0.0](RelNote300.md) - [2.6.0](RelNote260.md) - [2.5.0](RelNote250.md) diff --git a/docs/release-notes/RelNote161.md b/docs/release-notes/RelNote161.md index d3d22ae8af..6e43800c37 100644 --- a/docs/release-notes/RelNote161.md +++ b/docs/release-notes/RelNote161.md @@ -38,7 +38,7 @@ The release can be found on GitHub at [this link.](https://github.com/Alfresco/a The roadmap for ADF is taking form, and we have a high focus on bringing in engaging design and UX, as well as add more and more content capabilities into ADF. -Our focus while developing ADF 1.6.1 has been improving the Document List, Improved Preview, Finalize the design of the [Login component,](../core/login.component.md) External configuration, Performance enhancements for development, improvements in forms as well as paving the way for editing metadata and using forms for content. +Our focus while developing ADF 1.6.1 has been improving the Document List, Improved Preview, Finalize the design of the [Login component,](../core/components/login.component.md) External configuration, Performance enhancements for development, improvements in forms as well as paving the way for editing metadata and using forms for content. This release builds on last month's contains bug fixes and new feature. See the list below for major details. @@ -53,9 +53,9 @@ Below the most relevant features of this release. - New extension support in viewer - Extend TypeScript definitions for JS-API - ADF Card View -- [Task Header Component](../process-services/task-header.component.md) -- Process and [Task attachment list component](../process-services/task-attachment-list.component.md) -- Add [people Component](../process-services/people.component.md) +- [Task Header Component](../process-services/components/task-header.component.md) +- Process and [Task attachment list component](../process-services/components/task-attachment-list.component.md) +- Add [people Component](../process-services/components/people.component.md) - Breadcrumb root path personalisation - [`Form`](../../lib/process-services/task-list/models/form.model.ts) events bus - [`Form`](../../lib/process-services/task-list/models/form.model.ts) render independent from APS @@ -67,7 +67,7 @@ Below the most relevant features of this release. ![](images/Screen+Shot+2017-06-29+at+00.12.55.png) -_The ng2-alfresco-viewer if the [renditions service](../core/renditions.service.md) can convert the unsupported document in PDF will show a pop up with the double possibility to Download the file or convert it to PDF._ +_The ng2-alfresco-viewer if the [renditions service](../core/services/renditions.service.md) can convert the unsupported document in PDF will show a pop up with the double possibility to Download the file or convert it to PDF._ ### 2. Datatable loading state @@ -174,11 +174,11 @@ Result: This component was already present in the previous ADF versions but we changed the design and improve the code. -With this component, you can easily involve a person into a task. The component itself is composed of two different component, the [search component,](../content-services/search.component.md) the [people list component](../process-services/people-list.component.md). +With this component, you can easily involve a person into a task. The component itself is composed of two different component, the [search component,](../content-services/components/search.component.md) the [people list component](../process-services/components/people-list.component.md). -The [search component](../content-services/search.component.md) has the goal to find a person not involved and show the results in a list. The list is always a [data table component](../../lib/core/datatable/components/datatable/datatable.component.ts) with the action menu disabled. +The [search component](../content-services/components/search.component.md) has the goal to find a person not involved and show the results in a list. The list is always a [data table component](../../lib/core/datatable/components/datatable/datatable.component.ts) with the action menu disabled. -The [people list component](../process-services/people-list.component.md) shows all the people involved in a task in a list. +The [people list component](../process-services/components/people-list.component.md) shows all the people involved in a task in a list. The component is a wrapper of the data-table component with a custom action i.e. Remove the person from the list. @@ -279,13 +279,13 @@ And the underlying component controller code can be as follows: #### Parsing form definitions -The [`FormService`](../core/form.service.md) got a new API to parse form definitions from JSON into the [`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) instances without using [`Form`](../../lib/process-services/task-list/models/form.model.ts) Component like it was previously. +The [`FormService`](../core/services/form.service.md) got a new API to parse form definitions from JSON into the [`FormModel`](../../lib/core/form/components/widgets/core/form.model.ts) instances without using [`Form`](../../lib/process-services/task-list/models/form.model.ts) Component like it was previously. formService.parseForm(formDefinitionJSON) #### Controlling outcome actions -It is now possible to control what happens when end users click the form outcome buttons, like Save, Complete, etc. The [`FormService`](../core/form.service.md) gets a new cancellable event called "executeOutcome" for that purpose. +It is now possible to control what happens when end users click the form outcome buttons, like Save, Complete, etc. The [`FormService`](../core/services/form.service.md) gets a new cancellable event called "executeOutcome" for that purpose. export class FormDemoComponent implements OnInit { @@ -315,7 +315,7 @@ By default, all application settings are stored in the "app.config.json" file in You can get more details on application configuration in the following articles: - [Demo App Readme](../..//demo-shell/README.md#application-settings-server-side) -- [AppConfigService Readme](../core/app-config.service.md) +- [AppConfigService Readme](../core/services/app-config.service.md) ### 13. Proxy settings and CORS @@ -369,10 +369,10 @@ Below you can find a detailed list of tickets addressed in the new release. For - \[[ADF-622](https://issues.alfresco.com/jira/browse/ADF-622)] - Extend TypeScript definitions for JS-API - \[[ADF-631](https://issues.alfresco.com/jira/browse/ADF-631)] - Viewer - Should play also the mp3 file - \[[ADF-667](https://issues.alfresco.com/jira/browse/ADF-667)] - It should be possible to disable row selection in Document List -- \[[ADF-710](https://issues.alfresco.com/jira/browse/ADF-710)] - Create a [Process Attachment List component](../process-services/process-attachment-list.component.md) +- \[[ADF-710](https://issues.alfresco.com/jira/browse/ADF-710)] - Create a [Process Attachment List component](../process-services/components/process-attachment-list.component.md) - \[[ADF-712](https://issues.alfresco.com/jira/browse/ADF-712)] - Task Attachment - Provide a way to attach a new content - \[[ADF-713](https://issues.alfresco.com/jira/browse/ADF-713)] - Process Attachment - Provide a way to attach a new content -- \[[ADF-793](https://issues.alfresco.com/jira/browse/ADF-793)] - Convert to PDF the document that the [renditions service](../core/renditions.service.md) provide +- \[[ADF-793](https://issues.alfresco.com/jira/browse/ADF-793)] - Convert to PDF the document that the [renditions service](../core/services/renditions.service.md) provide - \[[ADF-804](https://issues.alfresco.com/jira/browse/ADF-804)] - Add proxy configuration in demo shell - \[[ADF-843](https://issues.alfresco.com/jira/browse/ADF-843)] - [`Form`](../../lib/process-services/task-list/models/form.model.ts) events bus - \[[ADF-845](https://issues.alfresco.com/jira/browse/ADF-845)] - Breadcrumb path personalisation @@ -411,7 +411,7 @@ Below you can find a detailed list of tickets addressed in the new release. For - \[[ADF-737](https://issues.alfresco.com/jira/browse/ADF-737)] - Analytics report - Should expose the Models - \[[ADF-739](https://issues.alfresco.com/jira/browse/ADF-739)] - Viewer within tasks and processes does not display all supported file extensions. - \[[ADF-759](https://issues.alfresco.com/jira/browse/ADF-759)] - Cannot use script.sh with node 8.0.0 and npm 5.0. -- \[[ADF-765](https://issues.alfresco.com/jira/browse/ADF-765)] - [Rating Component](../content-services/rating.component.md) is not working. +- \[[ADF-765](https://issues.alfresco.com/jira/browse/ADF-765)] - [Rating Component](../content-services/components/rating.component.md) is not working. - \[[ADF-766](https://issues.alfresco.com/jira/browse/ADF-766)] - "Remove" file option within the Attachment list is not working. - \[[ADF-779](https://issues.alfresco.com/jira/browse/ADF-779)] - Broken thumbnails are displayed in Processes Attachment list. - \[[ADF-781](https://issues.alfresco.com/jira/browse/ADF-781)] - Folder content is not uploaded if a folder with the same name already exists @@ -423,7 +423,7 @@ Below you can find a detailed list of tickets addressed in the new release. For - \[[ADF-833](https://issues.alfresco.com/jira/browse/ADF-833)] - Data table - single and double click - \[[ADF-842](https://issues.alfresco.com/jira/browse/ADF-842)] - Error is received in console log when a form is completed - \[[ADF-883](https://issues.alfresco.com/jira/browse/ADF-883)] - [`UserInfo`](../../lib/content-services/document-list/models/document-library.model.ts) - Build errors -- \[[ADF-884](https://issues.alfresco.com/jira/browse/ADF-884)] - [`FormComponent`](../core/form.component.md) - Compilation error +- \[[ADF-884](https://issues.alfresco.com/jira/browse/ADF-884)] - [`FormComponent`](../core/components/form.component.md) - Compilation error - \[[ADF-893](https://issues.alfresco.com/jira/browse/ADF-893)] - Create Attachment Task/Process - Compilation error - \[[ADF-897](https://issues.alfresco.com/jira/browse/ADF-897)] - ActivitiPeopleList - use the prexif adf - \[[ADF-906](https://issues.alfresco.com/jira/browse/ADF-906)] - data property on activiti-form component do not react on changes - 2007 Github diff --git a/docs/release-notes/RelNote170.md b/docs/release-notes/RelNote170.md index e97ff19ed2..272311d50a 100644 --- a/docs/release-notes/RelNote170.md +++ b/docs/release-notes/RelNote170.md @@ -42,7 +42,7 @@ The release can be found on GitHub at [this link.](https://github.com/Alfresco/a ## Goals for this release -In the ADF 1.7 release we've had a big focus on Content capabilities. We brought in a new design for the Document List and the Uploader. Quite a few changes has made its way in to the release, breadcrumbs now has multiple modes (drop down and normal) and has been separated from the document list. The [pagination component](../core/pagination.component.md) is now separated from the document list and has a new design too, and we've added toolbars to the document list. We will continue this effort to split up into more granular components and improve the design. +In the ADF 1.7 release we've had a big focus on Content capabilities. We brought in a new design for the Document List and the Uploader. Quite a few changes has made its way in to the release, breadcrumbs now has multiple modes (drop down and normal) and has been separated from the document list. The [pagination component](../core/components/pagination.component.md) is now separated from the document list and has a new design too, and we've added toolbars to the document list. We will continue this effort to split up into more granular components and improve the design. We have introduced a "Copy and Move" component that integrates into the document list. The idea is to use the same picker for both forms and document list, i.e use it to select content in a form, or select the destination to copy or move items into. This is still work in progress as some of the features in the picker, such as search highlight didn't make it in time for code freeze. We will continue to improve this in the next release. @@ -57,7 +57,7 @@ Below the most relevant features of this release: - ADF prefix - Copy and Move Component - Dropdown sites/favorites Component -- [Toolbar Component](../core/toolbar.component.md) +- [Toolbar Component](../core/components/toolbar.component.md) - Upload Component New design - Upload ignore list configuration service - Start Task New design @@ -66,7 +66,7 @@ Below the most relevant features of this release: - Login new property - TaskDetails - DueDate and Description editable - Configuration back end service hostname feature -- [User Preferences Service](../core/user-preferences.service.md) +- [User Preferences Service](../core/services/user-preferences.service.md) - Search results highlighting properties - Change document list style rows based on permissions - APS Audit REST API in the JS API @@ -225,7 +225,7 @@ Developers have now a possibility storing and retrieving user preferences for ei } } -The [`UserPreferencesService`](../core/user-preferences.service.md) provides an API needed to store preferences based on different profiles. You can now have multiple users on the same machine with different set of preferences (like pagination size, authentication type, etc). +The [`UserPreferencesService`](../core/services/user-preferences.service.md) provides an API needed to store preferences based on different profiles. You can now have multiple users on the same machine with different set of preferences (like pagination size, authentication type, etc). ### 14. Search results highlighting properties @@ -242,7 +242,7 @@ You can now customize the document list style row based on the permissions of th ### 16. APS Audit REST API in the JS API -Two new methods has been added into the alfresco-js-api to support retrieve the audit informations inside the [process service](../process-services/process.service.md): +Two new methods has been added into the alfresco-js-api to support retrieve the audit informations inside the [process service](../process-services/services/process.service.md): | API | Name | HTTP method | URL | Description | | --- | ---- | ----------- | --- | ----------- | @@ -256,15 +256,15 @@ For further details about those endepoints please refer to the [official documen In the ng2-alfresco-core component, there are a lot of services that you can use out of the box outside our component and you can find the complete list [here](https://github.com/Alfresco/alfresco-ng2-components/tree/master/ng2-components#services) The list below is the list of the new services added in 1.7.0: -- [`DeletedNodesApiService`](../core/deleted-nodes-api.service.md) -- [`FavoritesApiService`](../core/favorites-api.service.md) -- [`NodesApiService`](../core/nodes-api.service.md) +- [`DeletedNodesApiService`](../core/services/deleted-nodes-api.service.md) +- [`FavoritesApiService`](../core/services/favorites-api.service.md) +- [`NodesApiService`](../core/services/nodes-api.service.md) - PeopleApiService - SearchApiService -- [`SharedLinksApiService`](../core/shared-links-api.service.md) +- [`SharedLinksApiService`](../core/services/shared-links-api.service.md) - SitesApiService -- [`ThumbnailService`](../core/thumbnail.service.md) -- [`SearchService`](../core/search.service.md) +- [`ThumbnailService`](../core/services/thumbnail.service.md) +- [`SearchService`](../core/services/search.service.md) ### 18. Code Contribution Guide and CLA @@ -335,7 +335,7 @@ Release Notes - Apps Development Framework - Version 1.7. - \[[ADF-195](https://issues.alfresco.com/jira/browse/ADF-195)] - fix 'change detection crash' when using router multiple times - 1550 Github - \[[ADF-334](https://issues.alfresco.com/jira/browse/ADF-334)] - "$" symbol on a currency/amount field is shown against the label - 1707 Github -- \[[ADF-523](https://issues.alfresco.com/jira/browse/ADF-523)] - [Search Component](../content-services/search.component.md) - Unable to delete a file +- \[[ADF-523](https://issues.alfresco.com/jira/browse/ADF-523)] - [Search Component](../content-services/components/search.component.md) - Unable to delete a file - \[[ADF-733](https://issues.alfresco.com/jira/browse/ADF-733)] - Activiti start process - AppId should not be mandatory - \[[ADF-770](https://issues.alfresco.com/jira/browse/ADF-770)] - Wrong highlight is displayed around options within DocumentList. - \[[ADF-778](https://issues.alfresco.com/jira/browse/ADF-778)] - "Upload Dialog" displays files that were previously uploaded on a different account. @@ -358,11 +358,11 @@ Release Notes - Apps Development Framework - Version 1.7. - \[[ADF-1048](https://issues.alfresco.com/jira/browse/ADF-1048)] - Multiple files attached to a task within a form are not displayed - \[[ADF-1056](https://issues.alfresco.com/jira/browse/ADF-1056)] - [`Form`](../../lib/process-services/task-list/models/form.model.ts) List Component does not display the forms of the user - \[[ADF-1068](https://issues.alfresco.com/jira/browse/ADF-1068)] - Files can be uploaded using drag and drop when 'enable file' is unchecked -- \[[ADF-1070](https://issues.alfresco.com/jira/browse/ADF-1070)] - [User preferences service](../core/user-preferences.service.md) does not restore prefix on page reload. +- \[[ADF-1070](https://issues.alfresco.com/jira/browse/ADF-1070)] - [User preferences service](../core/services/user-preferences.service.md) does not restore prefix on page reload. - \[[ADF-1072](https://issues.alfresco.com/jira/browse/ADF-1072)] - Unsupported type of file attached to a task or process can not be converted to pdf - \[[ADF-1078](https://issues.alfresco.com/jira/browse/ADF-1078)] - [Tasks] - Task Details are displayed inside Task Filters list. - \[[ADF-1079](https://issues.alfresco.com/jira/browse/ADF-1079)] - [Process Services] - Not able to start a process. -- \[[ADF-1081](https://issues.alfresco.com/jira/browse/ADF-1081)] - Scroll bar is missing in [comments component](../core/comments.component.md) +- \[[ADF-1081](https://issues.alfresco.com/jira/browse/ADF-1081)] - Scroll bar is missing in [comments component](../core/components/comments.component.md) - \[[ADF-1097](https://issues.alfresco.com/jira/browse/ADF-1097)] - File with unaccepted extension is uploaded when 'Format' is set to 'All files' - \[[ADF-1134](https://issues.alfresco.com/jira/browse/ADF-1134)] - [Document List] Selection events not raised for certain scenarios - \[[ADF-1138](https://issues.alfresco.com/jira/browse/ADF-1138)] - Start Task [`Form`](../../lib/process-services/task-list/models/form.model.ts) Assignee dropdown show null value inside @@ -382,7 +382,7 @@ Release Notes - Apps Development Framework - Version 1.7. - \[[ADF-1199](https://issues.alfresco.com/jira/browse/ADF-1199)] - `MinimalNodeEntryEntity` is missing the "allowableOperations" property - \[[ADF-1200](https://issues.alfresco.com/jira/browse/ADF-1200)] - The URL validation error message is still displayed after changing the invalid url with a valid one - \[[ADF-1201](https://issues.alfresco.com/jira/browse/ADF-1201)] - 508 Compliance Resolution for the App tiles. - 2131 Github -- \[[ADF-1216](https://issues.alfresco.com/jira/browse/ADF-1216)] - The included packages are not displayed in [About Component](../core/about.component.md) if the user is logged only on Content Services +- \[[ADF-1216](https://issues.alfresco.com/jira/browse/ADF-1216)] - The included packages are not displayed in [About Component](../core/components/about.component.md) if the user is logged only on Content Services - \[[ADF-1228](https://issues.alfresco.com/jira/browse/ADF-1228)] - Task Details - The People and Involve component are not aligned - \[[ADF-1229](https://issues.alfresco.com/jira/browse/ADF-1229)] - Task Filter - Wrong task filter is selected when a new task is created @@ -390,14 +390,14 @@ Release Notes - Apps Development Framework - Version 1.7. - \[[ADF-112](https://issues.alfresco.com/jira/browse/ADF-112)] - Task Header in TaskDetails component shows DueDate but is not editable - \[[ADF-402](https://issues.alfresco.com/jira/browse/ADF-402)] - Process Diagram Widget - Show the current process state -- \[[ADF-487](https://issues.alfresco.com/jira/browse/ADF-487)] - Info tab should show [Content Service](../core/content.service.md) and [Process service](../process-services/process.service.md) information +- \[[ADF-487](https://issues.alfresco.com/jira/browse/ADF-487)] - Info tab should show [Content Service](../core/services/content.service.md) and [Process service](../process-services/services/process.service.md) information - \[[ADF-858](https://issues.alfresco.com/jira/browse/ADF-858)] - Provide ability to attach multiple files on process Form- 1988 Github - \[[ADF-917](https://issues.alfresco.com/jira/browse/ADF-917)] - Upload ignore list files configuration - \[[ADF-955](https://issues.alfresco.com/jira/browse/ADF-955)] - Custom icons for selected rows -- \[[ADF-960](https://issues.alfresco.com/jira/browse/ADF-960)] - Allow changing copyright section for [Login component](../core/login.component.md) -- \[[ADF-967](https://issues.alfresco.com/jira/browse/ADF-967)] - Evaluate "hostname" and "port" in the [app config service](../core/app-config.service.md) +- \[[ADF-960](https://issues.alfresco.com/jira/browse/ADF-960)] - Allow changing copyright section for [Login component](../core/components/login.component.md) +- \[[ADF-967](https://issues.alfresco.com/jira/browse/ADF-967)] - Evaluate "hostname" and "port" in the [app config service](../core/services/app-config.service.md) - \[[ADF-968](https://issues.alfresco.com/jira/browse/ADF-968)] - Dropdown sites and favorites -- \[[ADF-983](https://issues.alfresco.com/jira/browse/ADF-983)] - [User Preferences Service](../core/user-preferences.service.md) +- \[[ADF-983](https://issues.alfresco.com/jira/browse/ADF-983)] - [User Preferences Service](../core/services/user-preferences.service.md) - \[[ADF-1038](https://issues.alfresco.com/jira/browse/ADF-1038)] - Dropdown breadcrumbs - \[[ADF-1039](https://issues.alfresco.com/jira/browse/ADF-1039)] - Search results highlighting - \[[ADF-1040](https://issues.alfresco.com/jira/browse/ADF-1040)] - Change document list style rows based on permissions @@ -409,7 +409,7 @@ Release Notes - Apps Development Framework - Version 1.7. ### Task - \[[ADF-497](https://issues.alfresco.com/jira/browse/ADF-497)] - Improvement to task comment (activiti-comments) component - 1829 Github -- \[[ADF-506](https://issues.alfresco.com/jira/browse/ADF-506)] - Unify [thumbnail service](../core/thumbnail.service.md) across search and document list +- \[[ADF-506](https://issues.alfresco.com/jira/browse/ADF-506)] - Unify [thumbnail service](../core/services/thumbnail.service.md) across search and document list - \[[ADF-861](https://issues.alfresco.com/jira/browse/ADF-861)] - Add codelizer in ng2-alfresco-viewer ng2-alfresco-webscript - \[[ADF-862](https://issues.alfresco.com/jira/browse/ADF-862)] - Add codelizer in ng2-alfresco-login ng2-alfresco-search - \[[ADF-867](https://issues.alfresco.com/jira/browse/ADF-867)] - Add codelizer in demo-shell and genral build @@ -424,7 +424,7 @@ Release Notes - Apps Development Framework - Version 1.7. - \[[ADF-924](https://issues.alfresco.com/jira/browse/ADF-924)] - Upload Component - Import the logic/design from EFSS - \[[ADF-973](https://issues.alfresco.com/jira/browse/ADF-973)] - Remove demo projects from components folder - \[[ADF-992](https://issues.alfresco.com/jira/browse/ADF-992)] - Integrate SFS enhancements to Document List -- \[[ADF-993](https://issues.alfresco.com/jira/browse/ADF-993)] - Integrate SFS enhancements for [Toolbar component](../core/toolbar.component.md) +- \[[ADF-993](https://issues.alfresco.com/jira/browse/ADF-993)] - Integrate SFS enhancements for [Toolbar component](../core/components/toolbar.component.md) - \[[ADF-1002](https://issues.alfresco.com/jira/browse/ADF-1002)] - Attachment Task list - Add Drag and drop functionality - \[[ADF-1030](https://issues.alfresco.com/jira/browse/ADF-1030)] - Datatable - enable isLoading to show the spinner in all the components - \[[ADF-1044](https://issues.alfresco.com/jira/browse/ADF-1044)] - Activiti Comment - use the new design inside the demoshell diff --git a/docs/release-notes/RelNote180.md b/docs/release-notes/RelNote180.md index 7a1b848f3d..7c84949697 100644 --- a/docs/release-notes/RelNote180.md +++ b/docs/release-notes/RelNote180.md @@ -39,7 +39,7 @@ The release can be found on GitHub at [this link.](https://github.com/Alfresco/a ## Goals for this release -In the ADF 1.8 release we've introduced a number of new generic features, such as Info Drawer, theming capabilities and lots of form customizations and accessibility. The task list now works with the [pagination component](../core/pagination.component.md) and we have started the work to completely redesign the [viewer component](../core/viewer.component.md). +In the ADF 1.8 release we've introduced a number of new generic features, such as Info Drawer, theming capabilities and lots of form customizations and accessibility. The task list now works with the [pagination component](../core/components/pagination.component.md) and we have started the work to completely redesign the [viewer component](../core/components/viewer.component.md). We continue the effort to migrate to @angular/material, it will be a few more releases before we wrap up that work. The data table and document list continue to get new features and enhancements, with the new data sources and layout presets we open up possibilities for externalizing the layout and sources for the document list. This release builds on last month's contains bug fixes and new feature. See the list below for major details. @@ -51,7 +51,7 @@ Please report issues with this release in the [issue tracker](https://github.com Below the most relevant features of this release: - Theming ADF component -- [Info Drawer component](../core/info-drawer.component.md) +- [Info Drawer component](../core/components/info-drawer.component.md) - [`Form`](../../lib/process-services/task-list/models/form.model.ts) style component enhancements - Empty form template - Additional data sources input for Document List @@ -78,7 +78,7 @@ When you want more customization than a pre-built theme offers, you can create y ### 2. Info Drawer component -It is now possible to use the [Info Drawer component,](../core/info-drawer.component.md) which gives you a sidebar like look with tabbing support. For more information about the usage, check the documentation in the core package. +It is now possible to use the [Info Drawer component,](../core/components/info-drawer.component.md) which gives you a sidebar like look with tabbing support. For more information about the usage, check the documentation in the core package. ![](images/info-drawer.gif) @@ -105,7 +105,7 @@ New events that allow taking control over the [`Form`](../../lib/process-service validateForm: Subject validateFormField: Subject() -The [validateForm](../core/form.service.md) event is raised every time the entire [`Form`](../../lib/process-services/task-list/models/form.model.ts) is re-validated. This happens also every time a field value or some of the properties is changed (for example the "required" property). The [validateFormField](../core/form.service.md) event is raised every time a single [`Form`](../../lib/process-services/task-list/models/form.model.ts) Field is re-validated. +The [validateForm](../core/services/form.service.md) event is raised every time the entire [`Form`](../../lib/process-services/task-list/models/form.model.ts) is re-validated. This happens also every time a field value or some of the properties is changed (for example the "required" property). The [validateFormField](../core/services/form.service.md) event is raised every time a single [`Form`](../../lib/process-services/task-list/models/form.model.ts) Field is re-validated. Both events are "cancellable", that means you can apply your own validation rules, change corresponding field validation state, or even prevent the default behaviour if needed. @@ -137,7 +137,7 @@ New "getFieldById" method to simplify certain scenarios when accessing multiple The [`Form`](../../lib/process-services/task-list/models/form.model.ts) now controls all Field validators. It becomes possible managing existing validator instances, replacing them, or extending form validation with custom rules and error messages. The "adf-form" component now also supports binding custom validator sets to the underlying [FormModel,](../../lib/core/form/components/widgets/core/form.model.ts) that allows defining validation sets in your code and binding via HTML. -You can read more details on the new Validation layer in the [`Form`](../../lib/process-services/task-list/models/form.model.ts) readme: [Form Field Validators](../core/form-field-validator.interface.md). The "demo shell" application has been also extended to demonstrate custom validators in action. You can check the code here: [Demo Field Validator](../core/form-field-validator.interface.md). +You can read more details on the new Validation layer in the [`Form`](../../lib/process-services/task-list/models/form.model.ts) readme: [Form Field Validators](../core/interfaces/form-field-validator.interface.md). The "demo shell" application has been also extended to demonstrate custom validators in action. You can check the code here: [Demo Field Validator](../core/interfaces/form-field-validator.interface.md). ### 7. DataTable Accessibility Improvements @@ -159,7 +159,7 @@ Further enhancements were implemented for the Copy & move dialog. From now, you ### 9. Download as a ZIP functionality -The ADF framework provides support for downloading nodes (Files and Folders) as "ZIP" archives. The **alfresco-js-api** library features new support for the [Downloads](https://api-explorer.alfresco.com/api-explorer/#/downloads) API. In addition, the Core library (ng2-alfresco-core) provides a ["DownloadZipDialogComponent"](../core/download-zip.service.md) that allows invoking "Download as Zip" dialogues from any place in your code. +The ADF framework provides support for downloading nodes (Files and Folders) as "ZIP" archives. The **alfresco-js-api** library features new support for the [Downloads](https://api-explorer.alfresco.com/api-explorer/#/downloads) API. In addition, the Core library (ng2-alfresco-core) provides a ["DownloadZipDialogComponent"](../core/services/download-zip.service.md) that allows invoking "Download as Zip" dialogues from any place in your code. ![](images/download-as-zip.gif) @@ -194,7 +194,7 @@ And the code behind in this case can be as follows: ### 11. Profile picture in Comments and Involved people -With the new ADF release, if the user has a profile picture, it will be shown inside the Comment/Involved [People component](../process-services/people.component.md): +With the new ADF release, if the user has a profile picture, it will be shown inside the Comment/Involved [People component](../process-services/components/people.component.md): ![involved people component with images](images/Screen+Shot+2017-09-05+at+11.31.50.png) @@ -529,7 +529,7 @@ Release Notes - Apps Development Framework - Version 1.8. - \[[ADF-1300](https://issues.alfresco.com/jira/browse/ADF-1300)] - Download as a ZIP functionality demo (5.2.1 repo) - \[[ADF-1318](https://issues.alfresco.com/jira/browse/ADF-1318)] - Create 'time ago' date converter - \[[ADF-1356](https://issues.alfresco.com/jira/browse/ADF-1356)] - Single configuration of i18n service per project -- \[[ADF-1372](https://issues.alfresco.com/jira/browse/ADF-1372)] - Provide support for custom tooltips for [Upload Button component](../content-services/upload-button.component.md) +- \[[ADF-1372](https://issues.alfresco.com/jira/browse/ADF-1372)] - Provide support for custom tooltips for [Upload Button component](../content-services/components/upload-button.component.md) - \[[ADF-1404](https://issues.alfresco.com/jira/browse/ADF-1404)] - Data Column enhancements for Document List - \[[ADF-1421](https://issues.alfresco.com/jira/browse/ADF-1421)] - Provide default column layout for Document List - \[[ADF-1427](https://issues.alfresco.com/jira/browse/ADF-1427)] - Show custom root in the breadcrumb even if node is not loaded @@ -539,13 +539,13 @@ Release Notes - Apps Development Framework - Version 1.8. ## Task - \[[ADF-1188](https://issues.alfresco.com/jira/browse/ADF-1188)] - Upload drag drop component - Add a property to disable the component -- \[[ADF-1306](https://issues.alfresco.com/jira/browse/ADF-1306)] - Process [Task Audit Directive](../process-services/task-audit.directive.md) +- \[[ADF-1306](https://issues.alfresco.com/jira/browse/ADF-1306)] - Process [Task Audit Directive](../process-services/directives/task-audit.directive.md) - \[[ADF-1309](https://issues.alfresco.com/jira/browse/ADF-1309)] - [`Pagination`](../../lib/content-services/document-list/models/document-library.model.ts) of task list - \[[ADF-714](https://issues.alfresco.com/jira/browse/ADF-714)] - Unify pagination across all components - \[[ADF-1116](https://issues.alfresco.com/jira/browse/ADF-1116)] - Task list without any status filter - \[[ADF-1139](https://issues.alfresco.com/jira/browse/ADF-1139)] - People Search - Provide a way to reset the search field when a user is selected - \[[ADF-852](https://issues.alfresco.com/jira/browse/ADF-852)] - [Form] Update [`Form`](../../lib/process-services/task-list/models/form.model.ts) widget to Material library -- \[[ADF-520](https://issues.alfresco.com/jira/browse/ADF-520)] - remove the debug button from [Analytics Component](../insights/analytics.component.md) +- \[[ADF-520](https://issues.alfresco.com/jira/browse/ADF-520)] - remove the debug button from [Analytics Component](../insights/components/analytics.component.md) - \[[ADF-157](https://issues.alfresco.com/jira/browse/ADF-157)] - upload dialog Wrong number on File Upload Count - 1511 Github - \[[ADF-569](https://issues.alfresco.com/jira/browse/ADF-569)] - Provide support to Undo uploaded files in the Upload component - \[[ADF-720](https://issues.alfresco.com/jira/browse/ADF-720)] - Review all the template use diff --git a/docs/release-notes/RelNote190.md b/docs/release-notes/RelNote190.md index b897b9a41b..6889541ad8 100644 --- a/docs/release-notes/RelNote190.md +++ b/docs/release-notes/RelNote190.md @@ -49,11 +49,11 @@ Below the most relevant features of this release: - Infinite scrolling - Requeue option added to adf-task-header - Tasklist now support multi-select -- [Page title service](../core/page-title.service.md) +- [Page title service](../core/services/page-title.service.md) - Viewer enhancements - Document List presets - Login redirect options -- [Logout directive](../core/logout.directive.md) +- [Logout directive](../core/directives/logout.directive.md) - Breadcrumb enhancements - Documentation @@ -100,7 +100,7 @@ The component also provides a new event **rowSelected** that contains all the se ### 4.Page Title Service -The 1.9.0 version features a new service ["PageTitleService"](../core/page-title.service.md) in the "ng2-alfresco-core" package. This service allows changing the title of the page (browser tab) on demand from the code. The format of the title is always "<Application Name> - <Title>" where "<Application Name>" is taken from the application configuration file: +The 1.9.0 version features a new service ["PageTitleService"](../core/services/page-title.service.md) in the "ng2-alfresco-core" package. This service allows changing the title of the page (browser tab) on demand from the code. The format of the title is always "<Application Name> - <Title>" where "<Application Name>" is taken from the application configuration file: { "application": { @@ -110,10 +110,10 @@ The 1.9.0 version features a new service ["PageTitleService"](../core/page-title ### 5.Viewer Enhancements -[Viewer component](../core/viewer.component.md) has been updated with improved UI and support for integration with Angular Router. +[Viewer component](../core/components/viewer.component.md) has been updated with improved UI and support for integration with Angular Router. The major features and improvements are: -- New [toolbar component](../core/toolbar.component.md) for all Viewer types +- New [toolbar component](../core/components/toolbar.component.md) for all Viewer types - Automatic PDF rendition fetching for various content types (".docx", ".pptx", etc.) - Floating action toolbar for the PDF viewer @@ -178,7 +178,7 @@ It is now possible to store layouts for Document List in the global application ### 7.Login redirect options -The [Login component](../core/login.component.md) provides a new **successRoute** property as a way to automatically redirect the user to the particular application route upon successful sign in. +The [Login component](../core/components/login.component.md) provides a new **successRoute** property as a way to automatically redirect the user to the particular application route upon successful sign in. @@ -190,7 +190,7 @@ You can turn any clickable HTML element or other Angular Component into a Logout ### 9.Breadcrumb enhancements -The [Breadcrumb component](../content-services/breadcrumb.component.md) exposes a new **rootId** property to allow you restricting the root element to a particular node. Component automatically trims the elements if full node path needs to be cut. You can use this together with the **root** property that allows renaming the root (first) element of the path. +The [Breadcrumb component](../content-services/components/breadcrumb.component.md) exposes a new **rootId** property to allow you restricting the root element to a particular node. Component automatically trims the elements if full node path needs to be cut. You can use this together with the **root** property that allows renaming the root (first) element of the path. @@ -261,7 +261,7 @@ Release Notes - Apps Development Framework - Version 1.9. - \[[ADF-1521](https://issues.alfresco.com/jira/browse/ADF-1521)] - Display value fields configured with process variables are not rendered in ADF 1.8. - \[[ADF-1523](https://issues.alfresco.com/jira/browse/ADF-1523)] - APS task form remains disabled when no custom outcome is provided in ADF 1.8. - \[[ADF-1525](https://issues.alfresco.com/jira/browse/ADF-1525)] - In APS forms, hyperlink fields are not rendered when configured with process variables -- \[[ADF-1526](https://issues.alfresco.com/jira/browse/ADF-1526)] - The [form component](../core/form.component.md) is not responsive in ADF 1.8. +- \[[ADF-1526](https://issues.alfresco.com/jira/browse/ADF-1526)] - The [form component](../core/components/form.component.md) is not responsive in ADF 1.8. - \[[ADF-1528](https://issues.alfresco.com/jira/browse/ADF-1528)] - [`Form`](../../lib/process-services/task-list/models/form.model.ts) renderer does not display generated documents - github 2303 - \[[ADF-1529](https://issues.alfresco.com/jira/browse/ADF-1529)] - Broken styles for toolbar buttons. - \[[ADF-1530](https://issues.alfresco.com/jira/browse/ADF-1530)] - [Viewer] Extension viewer doens't work anymore @@ -317,7 +317,7 @@ Release Notes - Apps Development Framework - Version 1.9. - \[[ADF-1643](https://issues.alfresco.com/jira/browse/ADF-1643)] - [Checklist] add checklist produce a consolo error - \[[ADF-1644](https://issues.alfresco.com/jira/browse/ADF-1644)] - Search Icon is not properly displayed - \[[ADF-1646](https://issues.alfresco.com/jira/browse/ADF-1646)] - [Settings] prefix icon is not aligned -- \[[ADF-1651](https://issues.alfresco.com/jira/browse/ADF-1651)] - Site List drop down from [Document List component](../content-services/document-list.component.md) does not display all sites +- \[[ADF-1651](https://issues.alfresco.com/jira/browse/ADF-1651)] - Site List drop down from [Document List component](../content-services/components/document-list.component.md) does not display all sites - \[[ADF-1653](https://issues.alfresco.com/jira/browse/ADF-1653)] - Suggestion list on people widget is still displayed after deleting all letters inside the input - \[[ADF-1654](https://issues.alfresco.com/jira/browse/ADF-1654)] - Cannot add a checklist within a task. - \[[ADF-1662](https://issues.alfresco.com/jira/browse/ADF-1662)] - [User info] name is not centered @@ -339,7 +339,7 @@ Release Notes - Apps Development Framework - Version 1.9. - \[[ADF-1477](https://issues.alfresco.com/jira/browse/ADF-1477)] - Automatic i18n support for breadcrumb root element - \[[ADF-1522](https://issues.alfresco.com/jira/browse/ADF-1522)] - Load Document List presets from the app.config file - \[[ADF-1524](https://issues.alfresco.com/jira/browse/ADF-1524)] - Provide support for route to redirect on successful Login -- \[[ADF-1613](https://issues.alfresco.com/jira/browse/ADF-1613)] - [Logout directive](../core/logout.directive.md) +- \[[ADF-1613](https://issues.alfresco.com/jira/browse/ADF-1613)] - [Logout directive](../core/directives/logout.directive.md) ## Task @@ -350,7 +350,7 @@ Release Notes - Apps Development Framework - Version 1.9. - \[[ADF-1249](https://issues.alfresco.com/jira/browse/ADF-1249)] - Remove mdl from ng2-activiti-diagrams - \[[ADF-1250](https://issues.alfresco.com/jira/browse/ADF-1250)] - Remove mdl from ng2-activiti-analytics - \[[ADF-1251](https://issues.alfresco.com/jira/browse/ADF-1251)] - Remove mdl from demo shell -- \[[ADF-1492](https://issues.alfresco.com/jira/browse/ADF-1492)] - Document List - Export [`ContentNodeSelectorComponent`](../content-services/content-node-selector.component.md) and [ContentNodeSelectorComponentData](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) +- \[[ADF-1492](https://issues.alfresco.com/jira/browse/ADF-1492)] - Document List - Export [`ContentNodeSelectorComponent`](../content-services/components/content-node-selector.component.md) and [ContentNodeSelectorComponentData](../../lib/content-services/content-node-selector/content-node-selector.component-data.interface.ts) - \[[ADF-1496](https://issues.alfresco.com/jira/browse/ADF-1496)] - Remove "Disable upload button when user has no permissions" switch. - \[[ADF-1504](https://issues.alfresco.com/jira/browse/ADF-1504)] - Rename UserInfoComponentModule to [`UserInfoModule`](../../lib/core/userinfo/userinfo.module.ts) - \[[ADF-1515](https://issues.alfresco.com/jira/browse/ADF-1515)] - Internationalization - ADF strings review diff --git a/docs/release-notes/RelNote200.md b/docs/release-notes/RelNote200.md index 2e90cbb1d1..26ba665fe2 100644 --- a/docs/release-notes/RelNote200.md +++ b/docs/release-notes/RelNote200.md @@ -66,7 +66,7 @@ Please note the only major version valid for the package @alfresco/adf-insights ## Goals for this release -While this release had a high focus on stabilization and bug fixes, we have also introduced new and enhanced features. These include a completely revamped [Viewer component,](../core/viewer.component.md) a new metadata component and file versioning. Also, ADF is now localized into 11 different languages. In total we have closed around 242 issues in JIRA. +While this release had a high focus on stabilization and bug fixes, we have also introduced new and enhanced features. These include a completely revamped [Viewer component,](../core/components/viewer.component.md) a new metadata component and file versioning. Also, ADF is now localized into 11 different languages. In total we have closed around 242 issues in JIRA. Since we follow [SEMVER](https://semver.org), we can only introduce breaking changes in major releases. We learned a lot and we needed to restructure and rename components to make things easier moving forward. You can see all the details about the breaking changes below. We have continued to expand and rewrite our documentation. We now have a new component catalog @@ -88,22 +88,22 @@ Below the most relevant features of this release: - Create Folder and Edit Folder dialogues - Editable file metadata - File versioning -- [Search Component](../content-services/search.component.md) refatoring +- [Search Component](../content-services/components/search.component.md) refatoring - Max file size constraints properties in Upload Button - Register Alfresco file type icons within the mat-icon -- [`LogService`](../core/log.service.md) configuration +- [`LogService`](../core/services/log.service.md) configuration - Favorite node Directive - Delete multiple nodes directive - Task Attachment list customizable template - CS and PS setting host component -- Complete [process service](../process-services/process.service.md) type definition in the alfresco-js-api +- Complete [process service](../process-services/services/process.service.md) type definition in the alfresco-js-api - Redirect to original path upon successful login - Task List override the default columns - Internationalization support ### 1. Viewer Enhancements -The [Viewer component](../core/viewer.component.md) has been enhanced with the following features: +The [Viewer component](../core/components/viewer.component.md) has been enhanced with the following features: - Automatic PDF renditions for APS content - Automatic PDF renditions for ACS content @@ -115,16 +115,16 @@ The [Viewer component](../core/viewer.component.md) has been enhanced with the f - Custom "traffic light" menu that you can fill with your own content - Ability to download the file previewed - Ability to hide/show any button on the toolbar -- Ability to hide, show or even replace entire [toolbar component](../core/toolbar.component.md) +- Ability to hide, show or even replace entire [toolbar component](../core/components/toolbar.component.md) ![](images/pastedImage_1.png) -It is now very simple to use the [Viewer component](../core/viewer.component.md) in an "Inline" mode on a separate page when using the Angular Router. +It is now very simple to use the [Viewer component](../core/components/viewer.component.md) in an "Inline" mode on a separate page when using the Angular Router. This allows you to have separate URLs for previewing content and later revisiting a file by navigating to a corresponding link. In addition, the "Overlay" mode has been stabilised. It now handles subsequent reopenings correctly. -You can find more details in the corresponding documentation: [Viewer Component](../core/viewer.component.md). +You can find more details in the corresponding documentation: [Viewer Component](../core/components/viewer.component.md). ### 2. Pagination Component and DocumentList integration @@ -137,7 +137,7 @@ ADF provides a lightweight integration with the DocumentList component out of th -For more details on custom pagination features see the following article: [Pagination Component](../core/pagination.component.md) +For more details on custom pagination features see the following article: [Pagination Component](../core/components/pagination.component.md) ### 3. Create Folder and Edit Folder dialogs @@ -158,8 +158,8 @@ In order to greatly simplify your development experience, two extra Angular dire For more details please refer to: -- [Folder Create directive](../content-services/folder-create.directive.md) -- [Folder Edit directive](../content-services/folder-edit.directive.md) +- [Folder Create directive](../content-services/directives/folder-create.directive.md) +- [Folder Edit directive](../content-services/directives/folder-edit.directive.md) ### 4. Editable file metadata @@ -179,7 +179,7 @@ You can now see and restore previous versions of a file node. This component can ### 6. Search Component refactoring -We have completely separated the documentlist component from the [search component](../content-services/search.component.md). We also support customizing the search result with any template you like and optionally creating your own custom search autocomplete. +We have completely separated the documentlist component from the [search component](../content-services/components/search.component.md). We also support customizing the search result with any template you like and optionally creating your own custom search autocomplete. The adf-search-control provides you with a standard input search with an pre-styled autocomplete table : @@ -219,16 +219,16 @@ This allows you to fetch the search result typed from the input/textarea element For more details please refer to: -- [Search Control Component](../content-services/search-control.component.md) -- [Search Component](../content-services/search.component.md) +- [Search Control Component](../content-services/components/search-control.component.md) +- [Search Component](../content-services/components/search.component.md) ### 7. Max file size constraints properties in Upload Button -The [upload button component](../content-services/upload-button.component.md) now provides a new parameter to disallow uploading files larger than a certain size (in bytes): +The [upload button component](../content-services/components/upload-button.component.md) now provides a new parameter to disallow uploading files larger than a certain size (in bytes): -For more details please refer to [Upload button documentation](../content-services/upload-button.component.md) +For more details please refer to [Upload button documentation](../content-services/components/upload-button.component.md) ### 8. Register Alfresco file type icons within the mat-icon @@ -241,7 +241,7 @@ All the ADF MIME type icons are now registered into the [MatIconRegistry](https: constructor(public thumbnailService: ThumbnailService) { } -To see the list of all supported MIME types please refer to [Thumbnail service documentation](../core/thumbnail.service.md). +To see the list of all supported MIME types please refer to [Thumbnail service documentation](../core/services/thumbnail.service.md). ### 9. LogService configuration @@ -252,11 +252,11 @@ By default the level is TRACE. If you want to silence all log output in ADF you "logLevel": " SILENT" } -The [log service](../core/log.service.md) provides 6 level of logs: TRACE, DEBUG, INFO, WARN, ERROR, SILENT. For more information please refer to [log service documentation.](../core/log.service.md) +The [log service](../core/services/log.service.md) provides 6 level of logs: TRACE, DEBUG, INFO, WARN, ERROR, SILENT. For more information please refer to [log service documentation.](../core/services/log.service.md) ### 10. Favorite node directive -The [NodeFavoriteDirective](../core/node-favorite.directive.md) instance can be bound to a button to retrieve and manage a favorites node list: +The [NodeFavoriteDirective](../core/directives/node-favorite.directive.md) instance can be bound to a button to retrieve and manage a favorites node list: +``` + +For more details refer to the : +- [Claim task directive](../process-services-cloud/directives/claim-task.directive.md) + +#### EditTaskComponent allows sorting and actions customization +You can supply various _filter properties_ to edit that will determine +which tasks are found by a filter. + +By default, the **_id_**, **_name_**, **_createdDate_** and **_priority_** properties are +displayed in the editor. However, you can also choose which sort properties +to show using the `sortProperties` array. + +For more details refer to the : +- [Edit Task Filter Cloud component](../process-services-cloud/components/edit-task-filter-cloud.component.md) + +#### EditProcessComponent allow sorting and actions customization +You can supply various _filter properties_ to edit that will determine +which tasks are found by a filter. + +By default, the **_status_**, **_sort_** and **_order_** properties are +displayed in the editor. However, you can also choose which properties +to show using the `filterProperties` array. + +For more details refer to the : +- [Edit Process Filter Cloud component](../process-services-cloud/components/edit-process-filter-cloud.component.md) + +#### Complete task directive + +```html + +``` +For more details refer to the : +- [Complete task directive](../process-services-cloud/directives/complete-task.directive.md) + +### Enhanced DocumentList + +Following some suggestions from customers and partners, we enhanced the `Datatable` and `Document List` to allow a "sticky" header. +If you have a long table with many rows, you might want to fix the header in place so it is +always visible. You can do this using the following steps. + +First, set the `stickyHeader` property of your datatable to `true`: + +```html + + +``` + +```html + + +``` + +For more details refer to the : +- [Document List Component](../content-services/components/document-list.component.md) +- [DataTable component](../core/components/datatable.component.md) + +### Enhanced Metadata viewer + +As of this version of ADF, developers can include the full list of types/aspects into the metadata viewer, without the need to specify all of them. The limit of the previous version was that developers were requested to specify the list of types/aspects or an asterisk to say "include all". The use case represented by "include all except X, Y, Z..." was not covered but now it is. + +You can list all the properties by simply adding `includeAll: boolean` to your config. This config will display all the aspects and properties available for that specific file. + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true + } + } +} +``` + +Futhermore, you can also exclude specific aspects by adding the `exclude` property. It can be either a string if it's only one aspect or an array if you want to exclude multiple aspects at once: + +```json +"content-metadata": { + "presets": { + "default": { + "includeAll": true, + "exclude": "exif:exif" + } + } +} +``` + +For more details refer to the : +- [Content Metadata Card component](../content-services/components/content-metadata-card.component.md) + +### Search pattern highlight + +As another example of good feedback we had from the developers on the ground about improving ADF, we introduced the custom highlighting of results in search. With ADF 3.1, developers can customize the pattern highlighting and the markers to use. + +You can configure highlighting using the `search` entry in the `app.config.json` file. +An example query for search highlighting could look like this: + +```json +{ + "search": { + "highlight": { + "prefix": "¿", + "postfix": "?", + "mergeContiguous": true, + "fields": [ + { + "field": "cm:title" + }, + { + "field": "description", + "prefix": "(", + "postfix": ")" + } + + ] + } + } +} + +``` + + +The example above changes the highlighting prefix and postfix from the default to '¿?' for all +fields except the "description" field, which uses '()' instead. The highlight information will +then be added in each node entry response. + +For more details refer to the : +- [Search Filter component highlight](../content-services/components/search-filter.component.md#highlight) + + +### Facet Intervals + +These provide custom categories based on admin defined ranges inside `intervals`. +You can specify exactly what you want for each interval in the config file and you can +use overlapping ranges if necessary. + +#### FacetIntervals Properties + +| Name | Type | Description | +| ---- | ---- | ----------- | +| intervals | array | Specifies the fields to facet by interval. | +| expanded | boolean | Toggles expanded state of the facet intervals. | + +Note: the `sets` parameter from the Search API (which sets the intervals for all fields) +is not yet supported. + +```json +{ + "search": { + "facetIntervals":{ + "expanded": true, + "intervals":[ + { + "label":"TheCreated", + "field":"cm:created", + "sets":[ + { "label":"lastYear", "start":"2017", "end":"2018", "endInclusive":false }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlier", "start":"*", "end":"2017", "endInclusive":false } + ] + }, + { + "label":"TheModified", + "field":"cm:modified", + "sets":[ + { "label":"2016", "start":"2017", "end":"2018", "endInclusive":false }, + { "label":"currentYear", "start":"NOW/YEAR", "end":"NOW/YEAR+1YEAR" }, + { "label":"earlierThan2017", "start":"*", "end":"2017", "endInclusive":false } + ] + } + ] + } + } +} +``` + +You can specify a value for the `mincount` property inside each `intervals` item to set the minimum count required for a facet interval to be displayed. By default, only the intervals that have 1 or more response entries are displayed at runtime. +Check the [schema.json](https://github.com/Alfresco/alfresco-ng2-components/blob/master/lib/core/app-config/schema.json) file +for further details about the structure and properties of `intervals` that you can set inside the configuration file. + +Each defined `intervals` item is collected into its own collapsible category identified uniquely +by its `label`. The code snippet just above will result in the following display of facet intervals: + +![Facet Intervals](../docassets/images/search-facet-intervals.png) + +For more details refer to the : +- [Facet intervals section of the Search Filter Component docs](../content-services/components/search-filter.component.md#facet-intervals) + + +### SSO Role AuthGuard +The [Auth Guard SSO role service](../core/services/auth-guard-sso-role.service.md) implements an Angular +[route guard](https://angular.io/guide/router#milestone-5-route-guards) +to check the user has the right role permission. This is typically used with the +`canActivate` guard check in the route definition. The roles that user needs to have in order to access the route has to be specified in the roles array as in the example below: + +```ts +const appRoutes: Routes = [ + ... + { + path: 'examplepath', + component: ExampleComponent, + canActivate: [ AuthGuardSsoRoleService ], + data: { roles: ['USER_ROLE1', 'USER_ROLE2']} + }, + ... +] +``` + +For more details refer to the : +- [Facet intervals](../core/services/auth-guard-sso-role.service.md) + +### Improved accessibility + +In terms of [accessibility](https://en.wikipedia.org/wiki/Computer_accessibility), ADF version 3.1 introduces some bug fixes kindly requested from some customers and partners about [Section508](https://www.section508.gov/). Alfresco plans to introduce more enhancements from this point of view, so more improvements will be added in the next releases. + +### Arabic and RTL languages support + +Due to regular requests, we also decided to support the Arabic language in ADF. In ADF 3.1 the team introduces another new feature by starting the first iteration of support for Right To Left languages. Starting from ADF version 3.1, you can (easily) [change an ADF application to work correctly with a RTL language](../user-guide/rtl-support.md). + +We are quite happy with the current support of RTL languages on ADF, but feedback is welcome if you find something that could be improved or added for a better user experience. + +## Localisation + +This release includes: French, German, Italian, Spanish, Arabic, Japanese, Dutch, Norwegian (Bokmål), Russian, Brazilian Portuguese and Simplified Chinese versions. + +In the next version we plan to include as supported languages also: Danish, Finnish, Swedish, Czech, Polish. + +## References + +Below is a brief list of references to help you start using the new release: + +- [Getting started guides with Alfresco Application Development Framework](https://community.alfresco.com/community/application-development-framework/pages/get-started) +- [Alfresco ADF Documentation on the Builder Network](../README.md) +- [Gitter chat supporting Alfresco ADF](https://gitter.im/Alfresco/alfresco-ng2-components) +- [ADF examples on GitHub](https://github.com/Alfresco/adf-examples) +- [Official GitHub Project - alfresco-ng2-components](https://github.com/Alfresco/alfresco-ng2-components) +- [Official GitHub Project - alfresco-js-api](https://github.com/Alfresco/alfresco-js-api) +- [Official GitHub Project - generator-ng2-alfresco-app](https://github.com/Alfresco/generator-ng2-alfresco-app) + +Please refer to the [official documentation](http://docs.alfresco.com/) for further details and suggestions. + +## Issues addressed + +Below is the list of JIRA issues that were closed for this release. + +### Documentation + +- [ADF-271](https://issues.alfresco.com/jira/browse/ADF-271) - ADD all valid fields that the tasklist can display - 1643 Github + +- [ADF-449](https://issues.alfresco.com/jira/browse/ADF-449) - Missing documentation for content-action in Data table + +- [ADF-588](https://issues.alfresco.com/jira/browse/ADF-588) - tasks/processes - more documentation about the available fields + +- [ADF-3040](https://issues.alfresco.com/jira/browse/ADF-3040) - Markdown templates sometimes add whitespace incorrectly + +- [ADF-4008](https://issues.alfresco.com/jira/browse/ADF-4008) - Add the documentation for the default columns available in adf-process-list-cloud + +- [ADF-4146](https://issues.alfresco.com/jira/browse/ADF-4146) - How to migrate an application from ADF 2.6 to ADF 3.0 + +- [ADF-4152](https://issues.alfresco.com/jira/browse/ADF-4152) - Add subfolders to docs library folders to represent class types + +- [ADF-4160](https://issues.alfresco.com/jira/browse/ADF-4160) - Clarify the behaviour of the InfoDrawer configuration for default * + +- [ADF-4189](https://issues.alfresco.com/jira/browse/ADF-4189) - Improve `allowDropFiles` prop description for Document List docs + +- [ADF-4190](https://issues.alfresco.com/jira/browse/ADF-4190) - Fix source file paths generated by auto-linking tools + +- [ADF-4228](https://issues.alfresco.com/jira/browse/ADF-4228) - Tutorial on how to switch an ADF app to be able to support RTL languages + +- [ADF-4239](https://issues.alfresco.com/jira/browse/ADF-4239) - Update introduction text + +- [ADF-4249](https://issues.alfresco.com/jira/browse/ADF-4249) - Doc review for 3.1 + +- [ADF-4260](https://issues.alfresco.com/jira/browse/ADF-4260) - How to migrate an application from ADF 3.0 to ADF 3.1 + +- [ADF-4262](https://issues.alfresco.com/jira/browse/ADF-4262) - Release note for version 3.1.0 + +- [ADF-4285](https://issues.alfresco.com/jira/browse/ADF-4285) - The documentation of content metadata component is misleading + +- [ADF-4294](https://issues.alfresco.com/jira/browse/ADF-4294) - Creating the list of third party Open Source for ADF 3.1 (to be done as last task) + +- [ADF-4300](https://issues.alfresco.com/jira/browse/ADF-4300) - Add the sort properties for edit task cloud component + +### Feature + +- [ADF-3497](https://issues.alfresco.com/jira/browse/ADF-3497) - Facet intervals on search filter + +- [ADF-3677](https://issues.alfresco.com/jira/browse/ADF-3677) - SearchQueryBuilderService to support highlight + +- [ADF-3735](https://issues.alfresco.com/jira/browse/ADF-3735) - SSO Login Error for login component + +- [ADF-3798](https://issues.alfresco.com/jira/browse/ADF-3798) - [Demo Shell] [APS2] Show Task list related to a Process + +- [ADF-4003](https://issues.alfresco.com/jira/browse/ADF-4003) - Add roles filtering to PeopleCloudComponent + +- [ADF-4078](https://issues.alfresco.com/jira/browse/ADF-4078) - Fixed headers in the document list + +- [ADF-4099](https://issues.alfresco.com/jira/browse/ADF-4099) - The metadata group is always showed even though the properties are not there + +- [ADF-4122](https://issues.alfresco.com/jira/browse/ADF-4122) - Sticky header on DataTable + +- [ADF-4125](https://issues.alfresco.com/jira/browse/ADF-4125) - Simplify extension load in extension module + +- [ADF-4127](https://issues.alfresco.com/jira/browse/ADF-4127) - Claim a task on the new generation of BPM engines + +- [ADF-4128](https://issues.alfresco.com/jira/browse/ADF-4128) - Task Cloud completion/back + +- [ADF-4162](https://issues.alfresco.com/jira/browse/ADF-4162) - Adding the "includeAll" type of object to the presets configurations of the InforDrawer + +- [ADF-4221](https://issues.alfresco.com/jira/browse/ADF-4221) - Avoiding to show a group of metadata, if any of the properties are empty + +- [ADF-4225](https://issues.alfresco.com/jira/browse/ADF-4225) - Viewer extension accept multiple file type + +- [ADF-4267](https://issues.alfresco.com/jira/browse/ADF-4267) - Sticky header on Document List + +### Epic + +- [ADF-9](https://issues.alfresco.com/jira/browse/ADF-9) - Document list feature + +- [ADF-14](https://issues.alfresco.com/jira/browse/ADF-14) - Destination picker (copy/move) + +- [ADF-262](https://issues.alfresco.com/jira/browse/ADF-262) - File viewer + +- [ADF-1452](https://issues.alfresco.com/jira/browse/ADF-1452) - Documentation + +- [ADF-1463](https://issues.alfresco.com/jira/browse/ADF-1463) - Adding of automated tests + +- [ADF-3296](https://issues.alfresco.com/jira/browse/ADF-3296) - APS 2.x & Activiti 7 compatibility + +- [ADF-3349](https://issues.alfresco.com/jira/browse/ADF-3349) - Activiti 7+ support + +- [ADF-3741](https://issues.alfresco.com/jira/browse/ADF-3741) - Support for Activiti version 7 (and APS 2), maintaining the backward compatibility with APS 1.x. + +- [ADF-3742](https://issues.alfresco.com/jira/browse/ADF-3742) - Extensibility of ADF applications + +- [ADF-3857](https://issues.alfresco.com/jira/browse/ADF-3857) - Accessibility + +- [ADF-4246](https://issues.alfresco.com/jira/browse/ADF-4246) - Testing Microsoft Internet Explorer + +### Story + +- [ADF-2129](https://issues.alfresco.com/jira/browse/ADF-2129) - Results highlighting (P2) + +- [ADF-3472](https://issues.alfresco.com/jira/browse/ADF-3472) - Whitelisting metadata by default with the ability to hide some of them by configuration + +### Bug + +- [ADF-1713](https://issues.alfresco.com/jira/browse/ADF-1713) - Small adjustments for Task and Process for consistency - Demo Shell + +- [ADF-1954](https://issues.alfresco.com/jira/browse/ADF-1954) - [IE11] Breadcrumbs are not well aligned + +- [ADF-2971](https://issues.alfresco.com/jira/browse/ADF-2971) - Mandatory search config + +- [ADF-3401](https://issues.alfresco.com/jira/browse/ADF-3401) - The filter facets are not reseted when user makes a new search query + +- [ADF-3444](https://issues.alfresco.com/jira/browse/ADF-3444) - Site list displays only a certain number of sites. + +- [ADF-3604](https://issues.alfresco.com/jira/browse/ADF-3604) - 'Sign in' and copyrights is displayed on login dialog from 'Attach Folder' from Share. + +- [ADF-3678](https://issues.alfresco.com/jira/browse/ADF-3678) - Custom Process Filter - Different results in APS than in ADF + +- [ADF-3843](https://issues.alfresco.com/jira/browse/ADF-3843) - Is not possible to change theInfinite pagination pageSize + +- [ADF-3861](https://issues.alfresco.com/jira/browse/ADF-3861) - [508 compliance] Multi-select, hamburger menu (row-based action menu) should be 508 compliant + +- [ADF-3862](https://issues.alfresco.com/jira/browse/ADF-3862) - [508 compliance] Documents and images should be readable + +- [ADF-3863](https://issues.alfresco.com/jira/browse/ADF-3863) - [508 compliance] The user should be informed of what the label is that he/she is selecting + +- [ADF-3878](https://issues.alfresco.com/jira/browse/ADF-3878) - Created date value of Column column should be in upper case + +- [ADF-3934](https://issues.alfresco.com/jira/browse/ADF-3934) - People Cloud Component - Remove the concept of assignee + +- [ADF-3979](https://issues.alfresco.com/jira/browse/ADF-3979) - GroupCloudComponent should be able to detect "preSelectGroups" input changes + +- [ADF-3989](https://issues.alfresco.com/jira/browse/ADF-3989) - The list of apps in 'appName' filter is duplicated after switching between saved filters + +- [ADF-3995](https://issues.alfresco.com/jira/browse/ADF-3995) - 'ProcessInstanceId' value is not displayed into a saved filter + +- [ADF-4023](https://issues.alfresco.com/jira/browse/ADF-4023) - [Demo-shell] Pagination layout is broken in Process List Cloud + +- [ADF-4058](https://issues.alfresco.com/jira/browse/ADF-4058) - Process Cloud - 502 Bad Gateway when try to create an task or an process + +- [ADF-4065](https://issues.alfresco.com/jira/browse/ADF-4065) - The input field to add comments is visible when permission is denied. + +- [ADF-4068](https://issues.alfresco.com/jira/browse/ADF-4068) - Tasks - Able to add a description with spaces + +- [ADF-4076](https://issues.alfresco.com/jira/browse/ADF-4076) - Error when accessing Active Task after closing process diagram + +- [ADF-4097](https://issues.alfresco.com/jira/browse/ADF-4097) - [Demo shell] Add comment button not displayed in Comment section + +- [ADF-4143](https://issues.alfresco.com/jira/browse/ADF-4143) - LastModifiedFrom and LastModifiedTo fields of edit task filter cloud component validations are wrong + +- [ADF-4148](https://issues.alfresco.com/jira/browse/ADF-4148) - [kerberos] Text Viewer Component not passing the withCredentials parameter + +- [ADF-4153](https://issues.alfresco.com/jira/browse/ADF-4153) - Unable to open the Task Details page. + +- [ADF-4154](https://issues.alfresco.com/jira/browse/ADF-4154) - Unit tests failing after upgrade to ADF 3.1.0-beta3 + +- [ADF-4156](https://issues.alfresco.com/jira/browse/ADF-4156) - Regression in TaskListComponent Caused by in-place Date Formatting + +- [ADF-4165](https://issues.alfresco.com/jira/browse/ADF-4165) - ADF 3.0 Not able to login with implicitFlow false + +- [ADF-4179](https://issues.alfresco.com/jira/browse/ADF-4179) - adf- prefix missing - style not applied to facet-buttons + +- [ADF-4183](https://issues.alfresco.com/jira/browse/ADF-4183) - Login dialog does not redirect correctly after page reload + +- [ADF-4196](https://issues.alfresco.com/jira/browse/ADF-4196) - Datatable component not always selects the row after click + +- [ADF-4199](https://issues.alfresco.com/jira/browse/ADF-4199) - The 'Locally set' permission label is not displayed properly in the UI screen. + +- [ADF-4202](https://issues.alfresco.com/jira/browse/ADF-4202) - Not able to start a standalone task using start task cloud component + +- [ADF-4205](https://issues.alfresco.com/jira/browse/ADF-4205) - Error in console when User tries to add user or group to permissions. + +- [ADF-4215](https://issues.alfresco.com/jira/browse/ADF-4215) - Locale doesn't change when a user changes the browser locale + +- [ADF-4220](https://issues.alfresco.com/jira/browse/ADF-4220) - [SSO] Not able to login with implicitFlow false after changing the config + +- [ADF-4229](https://issues.alfresco.com/jira/browse/ADF-4229) - Big space issue in case of RTL ADF application + +- [ADF-4230](https://issues.alfresco.com/jira/browse/ADF-4230) - Pagination arrows in the wrong order, in case or RTL ADF application + +- [ADF-4281](https://issues.alfresco.com/jira/browse/ADF-4281) - Completed processes default filters is not doing the correct call + +- [ADF-4282](https://issues.alfresco.com/jira/browse/ADF-4282) - The name of the content is not well aligned in documentList on small devices + +- [ADF-4287](https://issues.alfresco.com/jira/browse/ADF-4287) - The alignment in datatable is wrong + +- [ADF-4301](https://issues.alfresco.com/jira/browse/ADF-4301) - [Accessibility] Not able to navigate through tasks in task list using tab + +- [ADF-4305](https://issues.alfresco.com/jira/browse/ADF-4305) - DocumentList - CardViewMode - Field values missing in the display. + +- [ADF-4313](https://issues.alfresco.com/jira/browse/ADF-4313) - [Demo shell] Form field looks like an editable field in task header after task was completed + +- [ADF-4316](https://issues.alfresco.com/jira/browse/ADF-4316) - People component table is not well aligned + +- [ADF-4318](https://issues.alfresco.com/jira/browse/ADF-4318) - Process definition is not automatically selected if the app contains more than one + +### Task + +- [ADF-3873](https://issues.alfresco.com/jira/browse/ADF-3873) - Create automated tests for edit process filters + +- [ADF-3888](https://issues.alfresco.com/jira/browse/ADF-3888) - Implement automated tests for all the properties of task list and edit task filters components + +- [ADF-3976](https://issues.alfresco.com/jira/browse/ADF-3976) - EditTaskComponent - Be able to customise the sorting and actions + +- [ADF-3977](https://issues.alfresco.com/jira/browse/ADF-3977) - EditProcessComponent - Be able to change the sort and actions + +- [ADF-3978](https://issues.alfresco.com/jira/browse/ADF-3978) - Travis on dev branch - should not run the jobs Create docker pr Deploy docker pr + +- [ADF-3981](https://issues.alfresco.com/jira/browse/ADF-3981) - Automate Login Component manual test C291854 + +- [ADF-3986](https://issues.alfresco.com/jira/browse/ADF-3986) - [ProcessListCloudComponent] Be able to filter process with all possible params + +- [ADF-4004](https://issues.alfresco.com/jira/browse/ADF-4004) - Automate attach file test case + +- [ADF-4012](https://issues.alfresco.com/jira/browse/ADF-4012) - Automate ADF-3872 - to be able to set default columns in adf-process-list-cloud + +- [ADF-4015](https://issues.alfresco.com/jira/browse/ADF-4015) - automate ADF-3982 - Should be able to filter tasks with all possible params + +- [ADF-4045](https://issues.alfresco.com/jira/browse/ADF-4045) - Automate test infinite pagination delete + +- [ADF-4048](https://issues.alfresco.com/jira/browse/ADF-4048) - PeopleCloud - Improve the preselectUsers + +- [ADF-4061](https://issues.alfresco.com/jira/browse/ADF-4061) - Automate test for navigating to a non empty folder in >= 2nd page + +- [ADF-4064](https://issues.alfresco.com/jira/browse/ADF-4064) - Remove multiple elements locators + +- [ADF-4067](https://issues.alfresco.com/jira/browse/ADF-4067) - [APS2] Application Name input should have the same name in all components + +- [ADF-4083](https://issues.alfresco.com/jira/browse/ADF-4083) - Parse 'escaped' empty spaced labels inside facetFields or facetIntervals + +- [ADF-4089](https://issues.alfresco.com/jira/browse/ADF-4089) - contentListPage refactoring + +- [ADF-4094](https://issues.alfresco.com/jira/browse/ADF-4094) - Automate Permissions Component + +- [ADF-4121](https://issues.alfresco.com/jira/browse/ADF-4121) - Fixing failing e2e tests + +- [ADF-4123](https://issues.alfresco.com/jira/browse/ADF-4123) - Process Cloud Instance Details Header component + +- [ADF-4124](https://issues.alfresco.com/jira/browse/ADF-4124) - [Demo Shell] TaskListCloud with the filter on a Process instance + +- [ADF-4132](https://issues.alfresco.com/jira/browse/ADF-4132) - [Artificial Intelligence] Smart viewer for ADF recognising entities + +- [ADF-4145](https://issues.alfresco.com/jira/browse/ADF-4145) - [Artificial Intelligence] Transformation Services added to the ACS instance in the ADF development pipeline + +- [ADF-4147](https://issues.alfresco.com/jira/browse/ADF-4147) - Add a way to test selectionMode on demo-shell for task list cloud component + +- [ADF-4149](https://issues.alfresco.com/jira/browse/ADF-4149) - e2e tests - Move the pages from the e2e folder to the adf-testing + +- [ADF-4155](https://issues.alfresco.com/jira/browse/ADF-4155) - AppList - be able to show the list of apps even in case the deployment service is missing + +- [ADF-4158](https://issues.alfresco.com/jira/browse/ADF-4158) - No Alfresco-supplied docker image should run as root + +- [ADF-4159](https://issues.alfresco.com/jira/browse/ADF-4159) - DemoShell add nested-menu + +- [ADF-4184](https://issues.alfresco.com/jira/browse/ADF-4184) - Add Arabic i18n support + +- [ADF-4192](https://issues.alfresco.com/jira/browse/ADF-4192) - Remove spinner check from editTaskFilter tests + +- [ADF-4195](https://issues.alfresco.com/jira/browse/ADF-4195) - Automate tests for SSO login with implicitFlow false + +- [ADF-4201](https://issues.alfresco.com/jira/browse/ADF-4201) - About component improvements + +- [ADF-4208](https://issues.alfresco.com/jira/browse/ADF-4208) - [E2E] Make the pipeline green again ! + +- [ADF-4217](https://issues.alfresco.com/jira/browse/ADF-4217) - [Yeoman generator] Remove APS2 and leave Activiti only. + +- [ADF-4222](https://issues.alfresco.com/jira/browse/ADF-4222) - Fix the compilation errors on the Development branch, so that this can be added to the rules. + +- [ADF-4223](https://issues.alfresco.com/jira/browse/ADF-4223) - Export folder-name dialog validators + +- [ADF-4233](https://issues.alfresco.com/jira/browse/ADF-4233) - DemoShell - Change nested menu layout + +### Feature (Task) + +- [ADF-3945](https://issues.alfresco.com/jira/browse/ADF-3945) - Provide a way to change the infinite pagination pageSize + +- [ADF-4038](https://issues.alfresco.com/jira/browse/ADF-4038) - Add appName filter parameter for people/group demo component + +- [ADF-4095](https://issues.alfresco.com/jira/browse/ADF-4095) - Automate C268974 - Inherit Permission + +- [ADF-4100](https://issues.alfresco.com/jira/browse/ADF-4100) - Automate C274691 Dropdown menu + +- [ADF-4101](https://issues.alfresco.com/jira/browse/ADF-4101) - Automate C276978 - Add user + +- [ADF-4102](https://issues.alfresco.com/jira/browse/ADF-4102) - Automate - C276980 - Duplicate user/group + +- [ADF-4103](https://issues.alfresco.com/jira/browse/ADF-4103) - Automate - C276982 - Remove User/Group + +- [ADF-4104](https://issues.alfresco.com/jira/browse/ADF-4104) - Automate - C277014 - Role - Dropdown + +- [ADF-4105](https://issues.alfresco.com/jira/browse/ADF-4105) - Automate C277002 - Role - Site Dropdown + +- [ADF-4106](https://issues.alfresco.com/jira/browse/ADF-4106) - Automate C276993 - Role - Consumer + +- [ADF-4107](https://issues.alfresco.com/jira/browse/ADF-4107) - Automate C276994 - Role - Site Consumer + +- [ADF-4108](https://issues.alfresco.com/jira/browse/ADF-4108) - Automate - C276996 - Role - Contributor + +- [ADF-4109](https://issues.alfresco.com/jira/browse/ADF-4109) - Automate C276997 - Role - Site Contributor + +- [ADF-4110](https://issues.alfresco.com/jira/browse/ADF-4110) - Automate - C277000 - Role - Editor + +- [ADF-4111](https://issues.alfresco.com/jira/browse/ADF-4111) - Automate C277003 - Role - Collaborator + +- [ADF-4112](https://issues.alfresco.com/jira/browse/ADF-4112) - Automate C277005 Role - Site Collaborator + +- [ADF-4113](https://issues.alfresco.com/jira/browse/ADF-4113) - Automate C277004 Role - Coordinator + +- [ADF-4114](https://issues.alfresco.com/jira/browse/ADF-4114) - Automate - C277006 Role - Site Manager + +- [ADF-4115](https://issues.alfresco.com/jira/browse/ADF-4115) - Automate C277100 - EVERYONE group + +- [ADF-4116](https://issues.alfresco.com/jira/browse/ADF-4116) - Automate C277118 - Site Consumer - Add new version + +- [ADF-4117](https://issues.alfresco.com/jira/browse/ADF-4117) - Automate C279881 - No permissions + +- [ADF-4120](https://issues.alfresco.com/jira/browse/ADF-4120) - automate ADF-3989 - The list of apps in 'appName' filter is duplicated after switching between saved filters + +- [ADF-4126](https://issues.alfresco.com/jira/browse/ADF-4126) - Automate ADF-4003 - Add roles filtering to PeopleCloudComponent + +- [ADF-4129](https://issues.alfresco.com/jira/browse/ADF-4129) - Automate ADF-4066 - Task doesn't have an assignee when the assignee is empty from Start Task form + +- [ADF-4151](https://issues.alfresco.com/jira/browse/ADF-4151) - Automation test for code editor displayed when opening a .js file + +- [ADF-4166](https://issues.alfresco.com/jira/browse/ADF-4166) - Move apps-section-cloud.e2e.ts to adf-testing + +- [ADF-4197](https://issues.alfresco.com/jira/browse/ADF-4197) - Automation test for redirection after page reload + +- [ADF-4209](https://issues.alfresco.com/jira/browse/ADF-4209) - [E2E] Fix Core tests + +- [ADF-4210](https://issues.alfresco.com/jira/browse/ADF-4210) - [E2E] Fix Content-services and Search tests + +- [ADF-4211](https://issues.alfresco.com/jira/browse/ADF-4211) - Fix process-services-cloud tests + +- [ADF-4218](https://issues.alfresco.com/jira/browse/ADF-4218) - [E2E] Fix Insight tests + +- [ADF-4226](https://issues.alfresco.com/jira/browse/ADF-4226) - Implement automated test for infinitePagination + +- [ADF-4244](https://issues.alfresco.com/jira/browse/ADF-4244) - Fix search tests + + +Please refer to the [Alfresco issue tracker](https://issues.alfresco.com/jira/projects/ADF/issues/ADF-581?filter=allopenissues) for other known issues in this release. If you have any questions about the release, please contact us using [Gitter](https://gitter.im/Alfresco/alfresco-ng2-components). + +Thanks to the whole application team and the amazing Alfresco community for the hard work. diff --git a/docs/roadmap.md b/docs/roadmap.md index 739a8d6254..afdc9da4d5 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -6,20 +6,21 @@ Title: ADF roadmap Below is a list of the high level feature themes planned for the forthcoming versions of ADF. -Last updated 15 Jan 2019: +Last updated 26 Feb 2019: -- First Governance components about file plans. +- Continue with the Activiti features. +- Accessibility (508 compliance and automatic tests). +- Search highlighting. +- Better metadata viewer (whitelisting by default). +- Support for languages that are written right-to-left (such as Arabic). +- Continue with Governance features into ADF. - Better experience in plugin/extensions. -- Accessibility. -- Analytics components to show tables and charts. +- Application dashboards. +- Permission driven menus. - Experimental features: - Artificial Intelligence plugins/components. - Web components for ADF to be framework agnostic. - Rapid Application Development. - - **Disclaimer**: The list above may change in the future and it does not -represent an official promise about features to be implemented. The purpose -of this public roadmap is to share infomation openly with our ecosystem -of customers, partners and enthusiasts. +represent an official promise about features to be implemented. The purpose of this public roadmap is to share infomation openly with our ecosystem of customers, partners and enthusiasts. diff --git a/docs/tutorials/README.md b/docs/tutorials/README.md index dc1ade1809..831c9b5e35 100644 --- a/docs/tutorials/README.md +++ b/docs/tutorials/README.md @@ -14,8 +14,8 @@ Github only: true | [**Adding a new view**](new-view.md) | Beginner | In this tutorial you will learn how to create a new view in your application and how to access it using a defined endpoint. | | [**Using ADF Components**](using-components.md) | Basic | In this tutorial you will learn how to extend, use and configure ADF Components. | | [**Basic theming**](basic-theming.md) | Beginner | In this tutorial you will see how to theme an ADF app by modifying the CSS. | -| [**Customizing the Login component**](customising-login.md) | Intermediate | In this tutorial you will learn how to customize the Login component following the technical documentation. | +| [**Customizing the Login component**](customising-login.md) | Intermediate | In this tutorial you will learn how to customize the [Login component](../core/components/login.component.md) following the technical documentation. | | [**Working with a Data Table**](working-with-data-table.md) | Intermediate | In this tutorial you will learn how to populate a DataTable component. | -| [**Working with the Nodes API Service**](working-with-nodes-api-service.md) | Intermediate | In this tutorial you will learn how to use the [`NodesApiService`](../core/nodes-api.service.md). | +| [**Working with the Nodes API Service**](working-with-nodes-api-service.md) | Intermediate | In this tutorial you will learn how to use the [`NodesApiService`](../core/services/nodes-api.service.md). | | [**Working with Nodes using the JS API**](working-with-nodes-js-api.md) | Intermediate | In this tutorial you will learn how to use the [`AlfrescoCoreRestApi`](https://github.com/Alfresco/alfresco-js-api/tree/master/src/alfresco-core-rest-api). | -| [**Content metadata component**](content-metadata-component.md) | Advanced | In this tutorial you will learn how to work with the [`ContentMetadataComponent`](../content-services/content-metadata.component.md). | +| [**Content metadata component**](content-metadata-component.md) | Advanced | In this tutorial you will learn how to work with the [`ContentMetadataComponent`](../content-services/components/content-metadata-card.component.md). | diff --git a/docs/tutorials/content-metadata-component.md b/docs/tutorials/content-metadata-component.md index b1e55fe6d5..58d1b7eff8 100644 --- a/docs/tutorials/content-metadata-component.md +++ b/docs/tutorials/content-metadata-component.md @@ -5,13 +5,13 @@ Level: Advanced # Content metadata component -In this tutorial you will learn how to work with the [`ContentMetadataComponent`](../content-services/content-metadata.component.md). +In this tutorial you will learn how to work with the [`ContentMetadataComponent`](../content-services/components/content-metadata-card.component.md). This component is used to render the standard and custom metadata of generic content item (called a _node_) stored in Alfresco Content Services. With the usual approach "learning by doing", you will see here some practical examples you might find useful in your own applicatioin. As a starting point, we will use and customize the [Alfresco Content App](https://github.com/Alfresco/alfresco-content-app). ## About the `ContentMetadataComponent` -As described in the [`ContentMetadataComponent`](../content-services/content-metadata.component.md) documentation, the `adf-content-metadata-card` tag has some useful attributes, included the `preset` attribute, which is used to point to a collection of aspects/properties to render. +As described in the [`ContentMetadataComponent`](../content-services/components/content-metadata-card.component.md) documentation, the `adf-content-metadata-card` tag has some useful attributes, included the `preset` attribute, which is used to point to a collection of aspects/properties to render. Below, you can see the `preset` value requesting to render all the available aspects/properties: diff --git a/docs/tutorials/customising-login.md b/docs/tutorials/customising-login.md index 42d9f9bb02..a95dfc2b8a 100644 --- a/docs/tutorials/customising-login.md +++ b/docs/tutorials/customising-login.md @@ -5,7 +5,7 @@ Level: Intermediate # Customizing the Login component -In this tutorial you will learn how to customize the [Login component](../core/login.component.md) following the technical documentation. +In this tutorial you will learn how to customize the [Login component](../core/components/login.component.md) following the technical documentation. The task will be very simple. See the documentation for further details about customizing this component, along with examples. @@ -16,17 +16,17 @@ Starting from an existing ADF application, the `Login` component, like any other it is stored in the `/src/app/components/login` path. In an ADF app created with [Yeoman](http://yeoman.io/) it is stored in the `/src/app/login` path. -Once you have located the Login component for your application, you can customize it as described below. +Once you have located the [Login component](../core/components/login.component.md) for your application, you can customize it as described below. ## Changing the header As with every regular [Angular Component](https://angular.io/guide/architecture-components), -you can customize the Login component can be customised via CSS, HTML and Typescript. In this simple +you can customize the [Login component](../core/components/login.component.md) can be customised via CSS, HTML and Typescript. In this simple example, we will customize the header (as described also in the -[technical documentation](../core/login.component.md)). +[technical documentation](../core/components/login.component.md)). -Open the [`login.component`](../core/login.component.md)`.html` file and change the content to match the following source code: +Open the [`login.component`](../core/components/login.component.md)`.html` file and change the content to match the following source code: ```html @@ -40,7 +40,7 @@ After saving the file, the login form will look like this: ## More examples -As mentioned earlier, this is a very basic example and the Login component can be customized +As mentioned earlier, this is a very basic example and the [Login component](../core/components/login.component.md) can be customized much more extensively than this. For a complete and detailed description, full of examples, check the -[technical documentation about the component](../core/login.component.md). -This describes every customization available for the Login component. +[technical documentation about the component](../core/components/login.component.md). +This describes every customization available for the [Login component](../core/components/login.component.md). diff --git a/docs/tutorials/using-components.md b/docs/tutorials/using-components.md index 725fd93491..705b318832 100644 --- a/docs/tutorials/using-components.md +++ b/docs/tutorials/using-components.md @@ -9,7 +9,7 @@ In this tutorial you will learn how to extend, use and configure ADF Components. ![login](../docassets/images/login.jpg) -We will be customizing the [Login component](../core/login.component.md) as an example, where we will remove the `Remember me`, `Need Help?` and `Register` links in the footer and setup an event listener that displays an alert when the login form is submitted. We will finish off by setting up a custom footer. +We will be customizing the [Login component](../core/components/login.component.md) as an example, where we will remove the `Remember me`, `Need Help?` and `Register` links in the footer and setup an event listener that displays an alert when the login form is submitted. We will finish off by setting up a custom footer. The final result will look like this: @@ -21,7 +21,7 @@ We have carefully picked these three customizations because they cover the three 2. Event Listeners 3. HTML Extensions / _Content Projection_ -You should always consult the documentation for the component you are looking to use. For this exercise it would be useful to open a browser window with the [Login Component](../core/login.component.md) +You should always consult the documentation for the component you are looking to use. For this exercise it would be useful to open a browser window with the [Login Component](../core/components/login.component.md) documentation. Let's do a practical example with each approach. @@ -68,7 +68,7 @@ Save the file. The browser will automatically reload once the file is saved. The Now that we've successfully configured properties on the `` component, it's time to look at events. -Again, looking at the [Login Component](../core/login.component.md) +Again, looking at the [Login Component](../core/components/login.component.md) docs, we can see that it emits three events: `success`, `error` and `executeSubmit`. We can subscribe to these events and have our custom code executed when these events are emitted. Let's hook into the `executeSubmit` and do a simple `alert()` when the form is submitted. @@ -115,7 +115,7 @@ export class LoginComponent { } ``` -Save the files, go to the [login component,](../core/login.component.md) enter a valid username and password and you should now see an alert. Looking in the console in the browser, you'll see the event data. Here we get all the details for the form. +Save the files, go to the [login component,](../core/components/login.component.md) enter a valid username and password and you should now see an alert. Looking in the console in the browser, you'll see the event data. Here we get all the details for the form. ## Content Projection / HTMl Extensions @@ -163,7 +163,7 @@ Inside the `` or `` tags we can put anythi ### Bonus objective: Add a custom logo and background to the login screen -Are you up for a challenge? Explore the [Login component](../core/login.component.md) +Are you up for a challenge? Explore the [Login component](../core/components/login.component.md) docs to find out how you can change the logo and background image! # Next steps diff --git a/docs/tutorials/working-with-data-table.md b/docs/tutorials/working-with-data-table.md index c5bf39fb4d..d394e72b80 100644 --- a/docs/tutorials/working-with-data-table.md +++ b/docs/tutorials/working-with-data-table.md @@ -12,7 +12,7 @@ The custom data for the table generally comes from a generic back-end service or ## Prerequisites and data source Before diving deep into the technical description of the -[DataTable component](../core/datatable.component.md), +[DataTable component](../core/components/datatable.component.md), let's start with a description of the development environment and its prerequisites. In this tutorial we will start from an existing ADF application set up to use (at least) Alfresco Content @@ -24,7 +24,7 @@ is well documented, and you can choose to However, if you prefer to create a brand new ADF application from scratch then you should still be able to follow the tutorial without difficulty. -For this tutorial, the endpoint used to populate the [DataTable component](../../lib/core/datatable/components/datatable/datatable.component.ts) is the +For this tutorial, the endpoint used to populate the [DataTable component](../core/components/datatable.component.md) is the [`/people` service](https://api-explorer.alfresco.com/api-explorer/#!/people/listPeople) which lists all users available in an Alfresco Content Services instance. The `/people` service is suitable for the purpose of this tutorial because it is available by default in the Alfresco Content Services REST API. @@ -171,7 +171,7 @@ of the DataTable, and even smaller components like Attachment List, Comment List Content Selector are also based on it. Looking at the -[documentation](../core/datatable.component.md), +[documentation](../core/components/datatable.component.md), we can see that it has a lot of different options, including single/multi selection, click events, context menus, actions and keyboard navigation. @@ -201,10 +201,10 @@ access to all the data in the row, if required. When you click a row, you should ## DataTable columns Let's dig a bit deeper into the different options for rendering columns within the DataTable. The documentation for the -[Data Column component](../core/data-column.component.md) +[Data Column component](../core/components/data-column.component.md) is quite in-depth and has lots of examples. We highly recommend checking it out. -From the documentation we can see that the [Data Column component](../core/data-column.component.md) has quite a few properties but the +From the documentation we can see that the [Data Column component](../core/components/data-column.component.md) has quite a few properties but the most important ones are `key`, `type`, `sortable`, `title` and `class`. - `key` is the name of the corresponding property in the [`ObjectDataTableAdapter`](../../lib/core/datatable/data/object-datatable-adapter.ts) object. diff --git a/docs/tutorials/working-with-nodes-api-service.md b/docs/tutorials/working-with-nodes-api-service.md index 18e3d5e55b..367032bd08 100644 --- a/docs/tutorials/working-with-nodes-api-service.md +++ b/docs/tutorials/working-with-nodes-api-service.md @@ -5,9 +5,9 @@ Level: Intermediate # Working with the Nodes API Service -In this tutorial you will learn how to use the [`NodesApiService`](../core/nodes-api.service.md). +In this tutorial you will learn how to use the [`NodesApiService`](../core/services/nodes-api.service.md). -We have developed some practical examples to show you how to interact with an instance of Alfresco Content Services without using the REST endpoints directly. With this approach the [`NodesApiService`](../core/nodes-api.service.md) is used as an abstraction layer, defined by one of the services in the ADF Core library. +We have developed some practical examples to show you how to interact with an instance of Alfresco Content Services without using the REST endpoints directly. With this approach the [`NodesApiService`](../core/services/nodes-api.service.md) is used as an abstraction layer, defined by one of the services in the ADF Core library. ## Contents @@ -25,7 +25,7 @@ We have developed some practical examples to show you how to interact with an in ## Preparing the development environment -To focus the description on the [`NodesApiService`](../core/nodes-api.service.md), we will develop on top of the +To focus the description on the [`NodesApiService`](../core/services/nodes-api.service.md), we will develop on top of the [Alfresco Example Content Application](https://github.com/Alfresco/alfresco-content-app). If you don't have it already installed in your development environment then see the _how-to_ description in @@ -62,18 +62,18 @@ the preview of the content: ![nodesapiservices_myonnodedoubleclick](../docassets/images/nodesapiservices_myonnodedoubleclick.png) -The Alfresco Example Content app is now set up to demonstrate the usage of the [`NodesApiService`](../core/nodes-api.service.md). +The Alfresco Example Content app is now set up to demonstrate the usage of the [`NodesApiService`](../core/services/nodes-api.service.md). ## Basic examples of usage -For a first look at the [`NodesApiService`](../core/nodes-api.service.md), let's check the `FileComponent` component stored in +For a first look at the [`NodesApiService`](../core/services/nodes-api.service.md), let's check the `FileComponent` component stored in `src/app/components/files/files.component.ts`. In the source code, you can see the `nodesApi` -property that represents the [`NodesApiService`](../core/nodes-api.service.md) in the [`FilesComponent`](../../demo-shell/src/app/components/files/files.component.ts). See the `fetchNode` and +property that represents the [`NodesApiService`](../core/services/nodes-api.service.md) in the [`FilesComponent`](../../demo-shell/src/app/components/files/files.component.ts). See the `fetchNode` and `fetchNodes` methods for some very basic examples. ## About the NodesApiService -Before going further, let's introduce the [`NodesApiService`](../core/nodes-api.service.md) class. +Before going further, let's introduce the [`NodesApiService`](../core/services/nodes-api.service.md) class. As you can see, the available methods are easy to understand and they should be all you need to manage the nodes of your content repository. @@ -84,7 +84,7 @@ Observables provide support for passing messages between publishers and subscrib applications. Observables offer significant benefits over other techniques for event handling, asynchronous programming, and handling multiple values. -The return values of the [`NodesApiService`](../core/nodes-api.service.md) methods are managed in the usual way for Observables. +The return values of the [`NodesApiService`](../core/services/nodes-api.service.md) methods are managed in the usual way for Observables. You "subscribe" to the asynchronous messaging using the following syntax: ```ts @@ -103,13 +103,13 @@ for further details. ### NodePaging -When a method returns a list of nodes rather than a single node, it usually returns an [`Observable`](http://reactivex.io/documentation/observable.html) of the [`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts) class. See the -[`NodePaging`](../../lib/content-services/document-list/models/document-library.model.ts) +When a method returns a list of nodes rather than a single node, it usually returns an [`Observable`](http://reactivex.io/documentation/observable.html) of the [`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) class. See the +[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/NodePaging.md) docs for further details. ## Retrieving info and metadata from a node -As a first example of the usage of the [`NodesApiService`](../core/nodes-api.service.md), let's retrieve the properties of a content node using its identifier. Edit the `myOnNodeDoubleClick` method in `src/app/components/files/files.component.ts`, as shown below: +As a first example of the usage of the [`NodesApiService`](../core/services/nodes-api.service.md), let's retrieve the properties of a content node using its identifier. Edit the `myOnNodeDoubleClick` method in `src/app/components/files/files.component.ts`, as shown below: ```ts myOnNodeDoubleClick(nodeId) { @@ -133,7 +133,7 @@ other visual component) then the principle is the same. ## Retrieving the node's children -Another common use of the [`NodesApiService`](../core/nodes-api.service.md) is to retrieve a list of the children of a folder node. +Another common use of the [`NodesApiService`](../core/services/nodes-api.service.md) is to retrieve a list of the children of a folder node. Edit `src/app/components/files/files.component.ts` again, changing the `onNodeDoubleClick` method to match the source code below: @@ -170,7 +170,7 @@ in the browser's console you will see something like the following screenshot: ## Creating and deleting a subfolder -The [`NodesApiService`](../core/nodes-api.service.md) class is not just for retrieving data. You can also use it to manage a +The [`NodesApiService`](../core/services/nodes-api.service.md) class is not just for retrieving data. You can also use it to manage a real CRUD of nodes (content and folders). In the following examples, you will see how to create a subfolder of the double clicked folder and also how to delete it. diff --git a/docs/upgrade-guide/upgrade26-30.md b/docs/upgrade-guide/upgrade26-30.md new file mode 100644 index 0000000000..56d6495c2e --- /dev/null +++ b/docs/upgrade-guide/upgrade26-30.md @@ -0,0 +1,575 @@ +--- +Title: Upgrading from ADF v2.6 to v3.0 +--- + +# Upgrading from ADF v2.6 to v3.0 + +This guide explains how to upgrade your ADF v2.6 project to work with v3.0. + +**Note:** the steps described below might involve making significant changes +to your code. If you are working with a versioning system then you should +commit any changes you are currently working on. If you aren't using versioning +then be sure to make a backup copy of your project before going ahead with the +upgrade. + +Since 3.0 is a major version release, there are [breaking changes](#breaking-changes) +you need to take into account as well as the usual library updates. After updating +the libraries, check the other sections to see if any of the changes affect your +project. + +## Library updates + +### Automatic update using the Yeoman Generator + +If your application has few changes from the original app created by the +[Yeoman generator](https://github.com/Alfresco/generator-ng2-alfresco-app) +then you may be able to update your project with the following steps: + +1. Update the Yeoman generator to the latest version (3.0.0). Note that + you might need to run these commands with `sudo` on Linux or MacOS: + + ```sh + npm uninstall -g generator-alfresco-adf-app + npm install -g generator-alfresco-adf-app + ``` + +2. Run the new yeoman app generator: + + ```sh + yo alfresco-adf-app + ``` + +3. Clean your old distribution and dependencies by deleting the `node_modules` folder + and the `package-lock.json` file. + +4. Install the dependencies: + ```sh + npm install + ``` + +At this point, the generator might have overwritten some of your code where it differs from +the original generated app. Be sure to check for any differences from your project code +(using a versioning system might make this easier) and if there are any differences, +retrofit your changes. When you have done this, you should be able to start the application +as usual: + +```sh +npm run start +``` + +After starting the app, if everything is working fine, that's all and you don't need to do anything else. However, if things don't work as they should then recover the original version of the project and try the manual approach. + +### Manual update + +1. Update the `package.json` file with the latest library versions: + ```json + "dependencies": { + ... + "@alfresco/adf-core": "3.0.0", + "@alfresco/adf-content-services": "3.0.0", + "@alfresco/adf-process-services-cloud": "3.0.0", + "@alfresco/adf-insights": "3.0.0", + "@alfresco/js-api": "3.0.0", + ... + ``` + +2. Clean your old distribution and dependencies by deleting `node_modules` and `package-lock.json`. + +3. Reinstall your dependencies + ```sh + npm install + ``` + +## Breaking changes + +The ADF project follows the [semver](https://semver.org/) conventions and so we +only make breaking changes (ie, not backward-compatible) in *major* versions. +ADF 3.0 is the first major version since general availability so a number of +deprecated items have been removed and also some existing items have been +renamed. The sections below explain how to adapt your project to the changes +in 3.0. See also our +[breaking changes](../breaking-changes/breaking-change-2.6.0-3.0.0.md) +document for more information about the changes and links to the associated +pull requests. + +- [JS-API changes](#js-api-changes) +- [Permissions vs Allowable Operations](#permissions-vs-allowable-operations) +- [Deprecated items](#deprecated-items) +- [Relocated classes](#relocated-classes) +- [Renamed items](#renamed-items) +- [CSS classes with "adf-" prefix added](#css-classes-with-adf--prefix-added) + +## JS-API changes + +The name package of the JS-API has been modified to use the `@alfresco` namespace and so +you should change all `alfresco-js-api` imports to `@alfresco/js-api`. +See the +[JS-API documentation](https://github.com/Alfresco/alfresco-js-api) +for more details on how to use the new v3.0.0 +[Legacy Endpoint porting](https://github.com/Alfresco/alfresco-js-api#legacy-endpoint-porting-ver-2xx). + +Also, the JS-API `callApi` method signature has been modified. The `authNames` +parameter has been removed because the type of authentication is configured +when the JS-API is constructed. You should remove references to `authNames` +from your code. + +v2.6.1 and before: + +```ts +callApi( + path: string, + httpMethod: string, + pathParams?: any, + queryParams?: any, + headerParams?: any, + formParams?: any, + bodyParam?: any, + authNames?: string[], + contentTypes?: string[], + accepts?: string[], + returnType?: any, + contextRoot?: string, + responseType?: string +): Promise; +``` + +After v3.0.0: + +```ts +callApi( + path: string, + httpMethod: string, + pathParams?: any, + queryParams?: any, + headerParams?: any, + formParams?: any, + bodyParam?: any, + contentTypes?: string[], + accepts?: string[], + returnType?: any, + contextRoot?: string, + responseType?: string +): Promise; +``` + +## Permissions vs Allowable Operations + +The `hasPermission` method in the [`ContentService`](../core/services/content.service.md) +was found to be actually checking the `allowableOperation` value. To reflect this, +the method has been renamed as `hasAllowableOperations` and a new `hasPermission` +method has been added (this one checks the permissions correctly as expected). + +If you were using the old `hasPermission` method successfully in v2.6 then you should +update your code to use `hasAllowableOperations`, which has the same behavior. If your +code was having problems with the earlier incorrect behavior of `hasPermission` then +you should find it now works correctly. + +Related to this issue is the `hasPermission` method of the +[Document List Service](../content-services/services/document-list.service.md) which has been +made redundant by +[`ContentService`](../core/services/content.service.md)`.hasAllowableOperations` and has now been removed. + +Also, the former Node Permission Directive has now been renamed as the +[Check Allowable Operation directive](../core/directives/check-allowable-operation.directive.md) +to better reflect its true behavior. You should therefore replace existing references to +`adf-node-permission` with `adf-check-allowable-operation`. + +## Deprecated items + +The deprecated items listed below have been removed from ADF as of v3.0. You should +update your code to use the suggested fix for each item that affects your project. + +- The `adf-accordion` and `adf-accordion-group` components have been removed. + Replace instances of these components with the Angular + [`mat-accordion`](https://material.angular.io/components/expansion/overview#accordion) + component. See the + [`mat-expansion-panel`](https://material.angular.io/components/expansion/overview) + doc page for an example of how to do this. +- [Viewer component](../core/components/viewer.component.md): The `allowShare` input has been removed. Inject the + [Share Directive](../content-services/directives/content-node-share.directive.md) in a + [custom toolbar](../core/components/viewer.component.md#custom-toolbar) to recreate the behavior of the Share button. +- [Viewer component](../core/components/viewer.component.md): The handling of the sidebar has been updated to allow left and right sidebars + at the same time. The following properties have changed, so you should + update your code to use the new properties: + + - The `allowSidebar` input has now been split into `allowLeftSidebar` and `allowRightSidebar`. + - The `showSidebar` input has now been split into `showLeftSidebar` and `showRightSidebar`. + - The `sidebarTemplate` input has now been split into `sidebarLeftTemplate` and + `sidebarRightTemplate`. + - The `sidebarPosition` input has been removed (the other new inputs render it obsolete). +- The `createFolder` event of the [`UploadBase`](../../lib/content-services/upload/components/base-upload/upload-base.ts) + class (emitted when a folder was created) has been removed. You should modify your code to use the `success` event instead. +- [Login component](../core/components/login.component.md): Two inputs have been removed: `disableCsrf` and `providers`. Set the + properties with the same names in `app.config.json` to get the same effect. +- [File Draggable Directive](../content-services/directives/file-draggable.directive.md): The `file-draggable` event has been removed. + Use `filesDropped` instead to get the same effect. +- [Search control component](../content-services/components/search-control.component.md): The `QueryBody`, and + `customQueryBody` inputs of the [`SearchControlComponent`](../content-services/components/search-control.component.md) have been removed. See the + [Search configuration interface](../core/interfaces/search-configuration.interface.md) + page to learn how to get the same functionality. +- [Document list component](../content-services/components/document-list.component.md): Several inputs have been removed or replaced: + + - The `skipCount` input has been removed. You can define + the same value in pagination using the `pageSize` property. + - The `enableInfiniteScrolling` input has been removed. To choose the pagination strategy, add either the + [Infinite Pagination Component](../core/components/infinite-pagination.component.md) or the normal [Pagination Component](../core/components/pagination.component.md) and assign + your document list as the `target`. + - The `folderNode` input has been removed. Use the `currentFolderId` and `node` inputs + instead. +- The `SettingsService` class has been removed. Access the equivalent properties with the + [App config service](../core/services/app-config.service.md) +- [Form service](../core/services/form.service.md): the `addFieldsToAForm` method has been removed. + + +## Relocated classes + +The following classes have been moved from their original libraries to the Core +library. You should modify your code to import these classes from +`@alfresco/adf-core`. + +- [`DownloadZipDialogComponent`](../core/dialogs/download-zip.dialog.md) (formerly Content Services) +- [`NodeDownloadDirective`](../core/directives/node-download.directive.md) (formerly Content Services) +- [`CommentsModule`](../../lib/core/comments/comments.module.ts) (formerly Process Services) +- [`CommentListComponent`](../core/components/comment-list.component.md) (formerly Process Services) +- [`CommentsComponent`](../core/components/comments.component.md) (formerly Process Services) + +Also, `CommentProcessModel` was moved from Process Services to Core and renamed as [`CommentModel`](../../lib/core/models/comment.model.ts). You should update both the name of the class and the import line in your code. + +## Renamed items + +The items listed below have been renamed (the old names have been deprecated for +some time but have now been removed). If your code refers to the old names then +you should replace them with the new ones. + +### Classes + +`CommentProcessModel` was moved from Process Services to Core and renamed as [`CommentModel`](../../lib/core/models/comment.model.ts) + +### Properties and methods + +- ``: The `onError` event has now been renamed as `error`. +- ``: The `fileNodeId` input that supplies the [`Node`](https://github.com/Alfresco/alfresco-js-api/blob/development/src/api/content-rest-api/docs/Node.md) Id of the file to +load has been renamed as `nodeId`. +- ``: The `parentId` input has been renamed as `rootFolderId`. + +### Component selectors + +- `adf-filters` is now `adf-task-filters`. +- `adf-node-permission` is now `adf-check-allowable-operation`. +- `analytics-report-list` is now `adf-analytics-report-list`. +- `analytics-report-parameters` is now `adf-analytics-report-parameters`. +- `context-menu-holder` is now `adf-context-menu-holder`. +- `diagram-alfresco-publish-task` is now `adf-diagram-publish-task`. +- `diagram-sequence-flow` is now `adf-diagram-sequence-flow`. +- `file-uploading-dialog` is now `adf-file-uploading-dialog`. + +## CSS classes with "adf-" prefix added + +A new style linting rule requires all CSS classes defined by ADF to have the prefix +`adf-`. If you use modified versions of these classes then you will need to add the +`adf-` prefix to the appropriate class names for them to be recognised. + +The names of the changed classes are listed below according to the file in which +they are defined. The new form of the name (ie, with the `adf-` prefix added) is +listed but there are a few exceptions where the names were also altered in other ways. +These changes are noted with an arrow "->". + +- [Content services CSS classes](#content-services-css-classes) +- [Core CSS classes](#core-css-classes) +- [Insights CSS classes](#insights-css-classes) +- [Process services cloud CSS classes](#process-services-cloud-css-classes) +- [Process services CSS classes](#process-services-css-classes) + +### Content services CSS classes + +#### [../../lib/content-services/breadcrumb/breadcrumb.component.scss](../../lib/content-services/breadcrumb/breadcrumb.component.scss) +- `adf-isRoot` +- `adf-focus` +- `adf-active` + +#### [../../lib/content-services/content-node-selector/content-node-selector-panel.component.scss](../../lib/content-services/content-node-selector/content-node-selector-panel.component.scss) +- `adf-search-results-label` +- `adf-dropdown-breadcrumb-item-chevron` + +#### [../../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.scss](../../lib/content-services/permission-manager/components/add-permission/add-permission-dialog.component.scss) +- `adf-choose-action` + +#### [../../lib/content-services/content-node-selector/content-node-selector.component.scss](../../lib/content-services/content-node-selector/content-node-selector.component.scss) +- `adf-choose-action` + +#### [../../lib/content-services/content-node-share/content-node-share.dialog.scss](../../lib/content-services/content-node-share/content-node-share.dialog.scss) +- `adf-input-action` +- `adf-full-width` + +#### [../../lib/core/dialogs/download-zip.dialog.scss](../../lib/core/dialogs/download-zip.dialog.scss) +- `adf-spacer` + +#### [../../lib/content-services/document-list/components/document-list.component.scss](../../lib/content-services/document-list/components/document-list.component.scss) +- `adf-document-list_empty_template` +- `adf-document-list__this-space-is-empty` +- `adf-document-list__drag-drop` +- `adf-document-list__any-files-here-to-add` +- `adf-document-list__empty_doc_lib` +- `adf-cell-container` +- `adf-cell-value` + +#### [../../lib/content-services/search/components/search-check-list/search-check-list.component.scss](../../lib/content-services/search/components/search-check-list/search-check-list.component.scss) +- `adf-facet-filter` +- `adf-facet-name` + +#### [../../lib/content-services/search/components/search-control.component.scss](../../lib/content-services/search/components/search-control.component.scss) +- `adf-highlight` + +#### [../../lib/content-services/search/components/search-filter/search-filter.component.scss](../../lib/content-services/search/components/search-filter/search-filter.component.scss) +- `adf-checklist` +- `adf-facet-label` +- `adf-facet-result-filter` +- `adf-facet-buttons` + +#### [../../lib/content-services/search/components/search-radio/search-radio.component.scss](../../lib/content-services/search/components/search-radio/search-radio.component.scss) +- `adf-facet-filter` +- `adf-filter-label` + +#### [../../lib/content-services/site-dropdown/sites-dropdown.component.scss](../../lib/content-services/site-dropdown/sites-dropdown.component.scss) +- `adf-full-width` + +#### [../../lib/content-services/upload/components/file-uploading-dialog.component.scss](../../lib/content-services/upload/components/file-uploading-dialog.component.scss) +- `adf-upload-dialog` +- `adf-upload-dialog__content` + +#### [../../lib/content-services/version-manager/version-manager.component.scss](../../lib/content-services/version-manager/version-manager.component.scss) +- `adf-upload-new-version` + +### Core CSS classes + +#### [../../lib/core/about/about.component.scss](../../lib/core/about/about.component.scss) +- `adf-about-container` + +#### [../../lib/core/buttons-menu/buttons-menu.component.scss](../../lib/core/buttons-menu/buttons-menu.component.scss) +- `adf-material-icons` + +#### [../../lib/core/card-view/components/card-view-keyvaluepairsitem/card-view-keyvaluepairsitem.component.scss](../../lib/core/card-view/components/card-view-keyvaluepairsitem/card-view-keyvaluepairsitem.component.scss) +- `adf-card-view` + +#### [../../lib/core/comments/comment-list.component.scss](../../lib/core/comments/comment-list.component.scss) +- `adf-is-selected` + +#### [../../lib/core/datatable/components/datatable/datatable.component.scss](../../lib/core/datatable/components/datatable/datatable.component.scss) +- `adf-is-selected` +- `alfresco-datatable__actions-cell` -> `adf-datatable__actions-cell` +- `adf-image-table-cell` +- `adf-cell-container` +- `adf-no-select` +- `adf-sortable` +- `adf-cell-value` +- `adf-full-width` +- `adf-ellipsis-cell` +- `adf-sr-only` +- `adf-hidden` +- `adf-desktop-only` + +#### [../../lib/core/form/components/form.component.scss](../../lib/core/form/components/form.component.scss) +- `adf-debug-toggle-text` +- `adf-invalid-color` + +#### [../../lib/core/form/components/widgets/container/container.widget.scss](../../lib/core/form/components/widgets/container/container.widget.scss) +- `adf-hidden` +- `adf-container-widget__header-text` +- `adf-collapsible` +- `adf-grid-list` +- `adf-grid-list-item` + +#### [../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.scss](../../lib/core/form/components/widgets/dynamic-table/dynamic-table.widget.scss) +- `adf-is-selected` +- `adf-no-select` +- `adf-sortable` +- `adf-full-width` + +#### [../../lib/core/layout/components/layout-container/layout-container.component.scss](../../lib/core/layout/components/layout-container/layout-container.component.scss) +- `adf-sidenav--hidden` + +#### [../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.scss](../../lib/core/layout/components/sidenav-layout/sidenav-layout.component.scss) +- `adf-sidenav-layout` +- `adf-layout__content` + +#### [../../lib/core/login/components/login-dialog-panel.component.scss](../../lib/core/login/components/login-dialog-panel.component.scss) +- `adf-copyright` + +#### [../../lib/core/login/components/login.component.scss](../../lib/core/login/components/login.component.scss) +- `adf-ie11FixerParent` +- `adf-ie11FixerChild` +- `adf-show` +- `adf-hide` +- `adf-icon-inline` +- `adf-error-icon` +- `adf-isChecking` +- `adf-isWelcome` +- `adf-welcome-icon` +- `adf-login-checking-spinner` +- `adf-is-active` +- `adf-copyright` +- `adf-login-rememberme` -> - `adf-login-remember-me` + +#### [../../lib/core/settings/host-settings.component.scss](../../lib/core/settings/host-settings.component.scss) +- `adf-full-width` + +#### [../../lib/core/viewer/components/imgViewer.component.scss](../../lib/core/viewer/components/imgViewer.component.scss) +- `adf-image-container` + +#### [../../lib/core/viewer/components/pdfViewer-thumbnails.component.scss](../../lib/core/viewer/components/pdfViewer-thumbnails.component.scss) +- `adf-pdf-thumbnails` + +#### [../../lib/core/viewer/components/pdfViewer.component.scss](../../lib/core/viewer/components/pdfViewer.component.scss) +- `adf-loader-container` +- `adf-thumbnails-template` +- `adf-loader-item` + +#### [../../lib/core/viewer/components/pdfViewerHost.component.scss](../../lib/core/viewer/components/pdfViewerHost.component.scss) +- `adf-highlight` +- `adf-begin` +- `adf-end` +- `adf-middle` +- `adf-selected` +- `adf-endOfContent` +- `adf-active` +- `adf-annotationLayer` +- `adf-linkAnnotation` +- `adf-textAnnotation` +- `adf-popupWrapper` +- `adf-popup` +- `adf-highlightAnnotation` +- `adf-underlineAnnotation` +- `adf-squigglyAnnotation` +- `adf-strikeoutAnnotation` +- `adf-fileAttachmentAnnotation` +- `adf-pdfViewer` +- `adf-page` +- `adf-loadingIcon` +- `adf-removePageBorders` +- `adf-hidden` +- `adf-viewer-pdf-viewer` + +#### [../../lib/core/viewer/components/viewer.component.scss](../../lib/core/viewer/components/viewer.component.scss) +- `adf-full-screen` +- `adf-info-drawer-content` + +### Insights CSS classes + +#### [../../lib/insights/analytics-process/components/analytics-generator.component.scss](../../lib/insights/analytics-process/components/analytics-generator.component.scss) +- `adf-chart` +- `adf-analytics-row__entry` +- `adf-report-icons` +- `adf-full-width` +- `adf-partial-width` +- `adf-clear-both` + +#### [../../lib/insights/analytics-process/components/analytics-report-list.component.scss](../../lib/insights/analytics-process/components/analytics-report-list.component.scss) +- `adf-activiti-filters__entry` +- `adf-activiti-filters__entry-icon` +- `adf-activiti-filters__label` +- `adf-active` +- `adf-application-title` + +#### [../../lib/insights/analytics-process/components/analytics-report-parameters.component.scss](../../lib/insights/analytics-process/components/analytics-report-parameters.component.scss) +- `adf-dropdown-widget` +- `adf-dropdown-widget__select` +- `adf-dropdown-widget__invalid` +- `adf-dropdown-widget__label` +- `adf-is-hide` +- `adf-report-container-setting` +- `adf-option_button_details` +- `adf-export-message` +- `adf-save-export-input` +- `adf-delete-parameter` +- `adf-hide` + +#### [../../lib/insights/analytics-process/components/analytics.component.scss](../../lib/insights/analytics-process/components/analytics.component.scss) +- `adf-chart` + +#### [../../lib/insights/analytics-process/components/widgets/duration/duration.widget.scss](../../lib/insights/analytics-process/components/widgets/duration/duration.widget.scss) +- `adf-dropdown-container` + +#### [../../lib/insights/diagram/components/tooltip/diagram-tooltip.component.scss](../../lib/insights/diagram/components/tooltip/diagram-tooltip.component.scss) +- `adf-is-active` + +### Process services cloud CSS classes + +#### [../../lib/process-services-cloud/src/lib/app/components/app-details-cloud.component.scss](../../lib/process-services-cloud/src/lib/app/components/app-details-cloud.component.scss) +- `adf-line-clamp` + +#### [../../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.scss](../../lib/process-services-cloud/src/lib/process/process-filters/components/process-filters-cloud.component.scss) +- `adf-active` + +#### [../../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.scss](../../lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.scss) +- `adf-no-content-message` + +#### [../../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.scss](../../lib/process-services-cloud/src/lib/task/task-filters/components/task-filters-cloud.component.scss) +- `adf-active` + +### Process services CSS classes + +#### [../../lib/process-services/app-list/apps-list.component.scss](../../lib/process-services/app-list/apps-list.component.scss) +- `adf-line-clamp` + +#### [../../lib/process-services/attachment/process-attachment-list.component.scss](../../lib/process-services/attachment/process-attachment-list.component.scss) +- `adf-data-cell` + +#### [../../lib/process-services/attachment/task-attachment-list.component.scss](../../lib/process-services/attachment/task-attachment-list.component.scss) +- `adf-data-cell` + +#### [../../lib/process-services/content-widget/attach-file-widget-dialog.component.scss](../../lib/process-services/content-widget/attach-file-widget-dialog.component.scss) +- `adf-choose-action` + +#### [../../lib/process-services/people/components/people-search-field/people-search-field.component.scss](../../lib/process-services/people/components/people-search-field/people-search-field.component.scss) +- `adf-search-text-container` +- `adf-search-list-container` +- `adf-people-pic` +- `adf-people-img` + +#### [../../lib/process-services/people/components/people-search/people-search.component.scss](../../lib/process-services/people/components/people-search/people-search.component.scss) +- `adf-activiti-label` +- `adf-fix-element-user-list` +- `adf-search-text-header` +- `adf-search-list-action-container` + +#### [../../lib/process-services/people/components/people/people.component.scss](../../lib/process-services/people/components/people/people.component.scss) +- `adf-assignment-header` +- `adf-assignment-count` +- `adf-add-people` +- `adf-assignment-top-container` +- `adf-assignment-top-container-content` +- `adf-assignment-container` +- `adf-assignment-list-container` +- `adf-cell-container` +- `adf-people-email` +- `adf-people-img` + +#### [../../lib/process-services/process-comments/process-comments.component.scss](../../lib/process-services/process-comments/process-comments.component.scss) +- `adf-activiti-label` +- `adf-icon` +- `adf-list-wrap` +- `adf-hide-long-names` + +#### [../../lib/process-services/process-list/components/process-filters.component.scss](../../lib/process-services/process-list/components/process-filters.component.scss) +- `adf-active` + +#### [../../lib/process-services/task-list/components/checklist.component.scss](../../lib/process-services/task-list/components/checklist.component.scss) +- `adf-activiti-label` +- `adf-checklist-menu-container` +- `adf-checklist-none-message` +- `activiti-label` -> `adfactiviti-label` + +#### [../../lib/process-services/task-list/components/start-task.component.scss](../../lib/process-services/task-list/components/start-task.component.scss) +- `adf-people-widget-content` + +#### [../../lib/process-services/task-list/components/task-details.component.scss](../../lib/process-services/task-list/components/task-details.component.scss) +- `adf-error-dialog` +- `adf-activiti-task-details__header` +- `adf-activiti-task-details__action-button` +- `adf-assignment-container` +- `adf-task-header` +- `adf-assign-edit-view` +- `adf-property` + +#### [../../lib/process-services/task-list/components/task-filters.component.scss](../../lib/process-services/task-list/components/task-filters.component.scss) +- `adf-active` diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md index a0425ccfd4..8fcb31eced 100644 --- a/docs/user-guide/README.md +++ b/docs/user-guide/README.md @@ -10,10 +10,13 @@ on an item below to see the corresponding guide page. +- [Introduction to ADF](adf-introduction.md) - [Angular Material Design](angular-material-design.md) +- [App extensions](app-extensions.md) - [Form Extensibility and Customisation](extensibility.md) - [Internationalization in ADF](internationalization.md) - [Theming](theming.md) +- [Right-to-left language support](rtl-support.md) - [Transclusion](transclusion.md) - [Typography](typography.md) - [Walkthrough - adding indicators to highlight information about a node](metadata-indicators.md) diff --git a/docs/user-guide/adf-introduction.md b/docs/user-guide/adf-introduction.md new file mode 100644 index 0000000000..5468958fab --- /dev/null +++ b/docs/user-guide/adf-introduction.md @@ -0,0 +1,35 @@ +--- +Title: Introduction to ADF +Added: 2019-03-13 +--- + +# Introduction to the Application Development Framework (ADF) + +Alfresco's Application Development Framework (ADF) lets you add your own custom front end to the existing Alfresco services. + +ADF is a set of custom [TypeScript](https://www.typescriptlang.org/) classes based on +the [Angular](https://angular.io/) web application framework. The most important classes +are the **components** that implement interactive UI features. +The components and other classes access information from Alfresco's main backend products, +[Content Services](https://www.alfresco.com/platform/content-services-ecm) and +[Process Services](https://www.alfresco.com/platform/process-services-bpm). +You can combine these classes to produce your own custom web app with the exact styling, +branding, and features that you need. Some examples of where this can be useful are: + +- **Feature based apps** with functionality based around tasks that arise frequently + in your business. +- **Role based apps** where specific types of user have their own feature set, tailor-made + for their role in the business. +- [**Mashups**](https://whatis.techtarget.com/definition/mash-up) where Alfresco services + are integrated with services from other suppliers in the same app. + +## Getting started with ADF + +You can find full instructions for installing ADF and its prerequisites in our +tutorial +[_Creating your first ADF application_](../tutorials/creating-your-first-adf-application.md). +When you have the environment and the scaffold app set up, the other +[tutorials](../tutorials/README.md) then explain how to connect to the backend services +and add custom features to your app. Use the [component reference](../README.md) pages +to learn [about component](../core/components/about.component.md) features and the [user guide](../user-guide/README.md) +to learn about specific tasks and topics in depth. diff --git a/docs/user-guide/app-extensions.md b/docs/user-guide/app-extensions.md index 1c8f930be4..4d08ef0df0 100644 --- a/docs/user-guide/app-extensions.md +++ b/docs/user-guide/app-extensions.md @@ -45,7 +45,7 @@ a place in the app where the actual content will be supplied dynamically. ADF provides a number of features that offer extension points or help with extensibility in general: -- **Components**: The [Dynamic component](../extensions/dynamic.component.md) +- **Components**: The [Dynamic component](../extensions/components/dynamic.component.md) has no content of its own but it has an `id` property that references a registered component extension ID. The referenced component will be added as a child of the Dynamic component at runtime. @@ -78,9 +78,9 @@ with extensibility in general: ## Setting up an app for extensibility -You can register component classes for use with the [Dynamic component](../extensions/dynamic.component.md) +You can register component classes for use with the [Dynamic component](../extensions/components/dynamic.component.md) using the `setComponents` method of the -[Extension service](../extensions/extension.service.md) (see the Dynamic component page for further details +[Extension service](../extensions/services/extension.service.md) (see the Dynamic component page for further details and code samples). The service also has `setAuthGuards` and `setEvaluators` methods that behave analogously. @@ -117,7 +117,7 @@ below: } ``` -You can use the `load` method of the [Extension service](../extensions/extension.service.md) to read the file into a +You can use the `load` method of the [Extension service](../extensions/services/extension.service.md) to read the file into a convenient object that implements the [`ExtensionConfig`](../../lib/extensions/src/lib/config/extension.config.ts) and [`ExtensionRef`](../../lib/extensions/src/lib/config/extension.config.ts) interfaces. Note that the `extension.schema.json` file contains a [JSON schema](http://json-schema.org/) that allows for format checking and also text completion in some editors. @@ -144,7 +144,7 @@ following example: ``` You can access routes from the config using the `getRouteById` method of the -[Extension service,](../extensions/extension.service.md) which returns a [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts) object. Note that the references +[Extension service,](../extensions/services/extension.service.md) which returns a [`RouteRef`](../../lib/extensions/src/lib/config/routing.extensions.ts) object. Note that the references to the component and auth guards are extension IDs, [as described above](#extension-points). @@ -173,7 +173,7 @@ The `actions` array has the following structure: ] ``` -The [Extension service](../extensions/extension.service.md) defines a `getActionById` method that returns an +The [Extension service](../extensions/services/extension.service.md) defines a `getActionById` method that returns an [`ActionRef`](../../lib/extensions/src/lib/config/action.extensions.ts) object corresponding to an item from this array. The `type` property refers to an action type that must be provided by the @@ -185,7 +185,7 @@ a message, URL or other static text data. However, you can also define a JavaScript expression here by surrounding it with `$( ... )`. The expression has access to an object named `context` which typically contains information about the app state. You can supply the object that contains this data via the -`runExpression` method of the [Extension service,](../extensions/extension.service.md) which actually evaluates the +`runExpression` method of the [Extension service,](../extensions/services/extension.service.md) which actually evaluates the expression. Note that the result of the expression doesn't necessarily have to be a string. @@ -204,7 +204,7 @@ The simplest type of rule is configured as shown below: ``` The `type` is the ID of a `RuleEvaluator` function that has been registered using -the `setEvaluators` method of the [Extension service](../extensions/extension.service.md). +the `setEvaluators` method of the [Extension service](../extensions/services/extension.service.md). The evaluator is a boolean function that represents whether a certain condition is true or false (eg, whether an item is selected, whether the user has certain options enabled, etc). The evaluator has access to a context object diff --git a/docs/user-guide/extensibility.md b/docs/user-guide/extensibility.md index c63f1b179f..b7fee1ba74 100644 --- a/docs/user-guide/extensibility.md +++ b/docs/user-guide/extensibility.md @@ -26,19 +26,19 @@ _Note: it is assumed you are familiar with Alfresco Process Services (powered by ## How components and widgets are rendered on a Form -All form field editors (aka widgets) on a [`Form`](../../lib/process-services/task-list/models/form.model.ts) are rendered by means of [`FormFieldComponent`](../core/form-field.component.md) -that takes an instance of a [`FormFieldModel`](../core/form-field.model.md): +All form field editors (aka widgets) on a [`Form`](../../lib/process-services/task-list/models/form.model.ts) are rendered by means of [`FormFieldComponent`](../core/components/form-field.component.md) +that takes an instance of a [`FormFieldModel`](../core/models/form-field.model.md): ```html ``` -This component depends on [`FormRenderingService`](../core/form-rendering.service.md) service to map [`FormFieldModel`](../core/form-field.model.md) to UI component +This component depends on [`FormRenderingService`](../core/services/form-rendering.service.md) service to map [`FormFieldModel`](../core/models/form-field.model.md) to UI component based on field type or metadata information. ### Component type resolvers -[`FormRenderingService`](../core/form-rendering.service.md) maps field types to corresponding instances exposing `ComponentTypeResolver` interface: +[`FormRenderingService`](../core/services/form-rendering.service.md) maps field types to corresponding instances exposing `ComponentTypeResolver` interface: ```ts export interface ComponentTypeResolver { @@ -46,7 +46,7 @@ export interface ComponentTypeResolver { } ``` -Typically a `ComponentTypeResolver` is a function that takes [`FormFieldModel`](../core/form-field.model.md) and returns corresponding component type. +Typically a `ComponentTypeResolver` is a function that takes [`FormFieldModel`](../core/models/form-field.model.md) and returns corresponding component type. It can be either a predefined component type or a dynamically evaluated based on field properties and metadata. #### Static component mapping @@ -66,7 +66,7 @@ formRenderingService.setComponentTypeResolver('text', () => CustomWidgetComponen #### Dynamic component mapping -Alternatively your resolver may return different component types based on [`FormFieldModel`](../core/form-field.model.md) state and condition: +Alternatively your resolver may return different component types based on [`FormFieldModel`](../core/models/form-field.model.md) state and condition: ```ts let customResolver: ComponentTypeResolver = (field: FormFieldModel): Type<{}> => { @@ -111,7 +111,7 @@ First let's create a simple APS form with `Text` widgets: ![default text widget](../docassets/images/text-default-widget.png) -Every custom widget must inherit [`WidgetComponent`](../insights/widget.component.md) class in order to function properly: +Every custom widget must inherit [`WidgetComponent`](../insights/components/widget.component.md) class in order to function properly: ```ts import { Component } from '@angular/core'; @@ -158,7 +158,7 @@ don't forget to import it into your main application one: export class AppModule {} ``` -Now you can import [`FormRenderingService`](../core/form-rendering.service.md) in any of your Views and override default mapping similar to the following: +Now you can import [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and override default mapping similar to the following: ```ts import { Component } from '@angular/core'; @@ -252,7 +252,7 @@ And import into your Application Module export class AppModule {} ``` -Now you can import [`FormRenderingService`](../core/form-rendering.service.md) in any of your Views and provide new mapping: +Now you can import [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and provide new mapping: ```ts import { Component } from '@angular/core'; @@ -274,7 +274,7 @@ At runtime you should now see your custom Angular component rendered in place of ## See Also -- [Form field model](../core/form-field.model.md) -- [Form rendering service](../core/form-rendering.service.md) -- [Form component](../core/form.component.md) -- [Widget component](../insights/widget.component.md) +- [Form field model](../core/models/form-field.model.md) +- [Form rendering service](../core/services/form-rendering.service.md) +- [Form component](../core/components/form.component.md) +- [Widget component](../insights/components/widget.component.md) diff --git a/docs/user-guide/internationalization.md b/docs/user-guide/internationalization.md index ebc55747f1..00d764b4b9 100644 --- a/docs/user-guide/internationalization.md +++ b/docs/user-guide/internationalization.md @@ -71,11 +71,11 @@ below: ``` The hierarchical structure is referred to in the UI using the familiar "dot" -notation (so `FORM.START_FORM.TITLE` would be the key for the "Start [Form"](../../lib/process-services/task-list/models/form.model.ts) +notation (so `FORM.START_FORM.TITLE` would be the key for the "Start Form" string here). This is useful for grouping related messages and providing singular and plural versions, among other things. -The [Translation service](../core/translation.service.md) defines the `get` method to +The [Translation service](../core/services/translation.service.md) defines the `get` method to get the translation of a key in the current language. A simple component might contain code like this: @@ -140,11 +140,11 @@ should check you are using the key correctly. ## Using the translate pipe -Using [`TranslationService`](../core/translation.service.md)`.get` is straightforward but it is often more +Using [`TranslationService`](../core/services/translation.service.md)`.get` is straightforward but it is often more convenient to add translation keys directly into your page's HTML. Use the `translate` pipe to convert a key in the page directly to the corresponding text. For example, the following will display the -"Start [Form"](../../lib/process-services/task-list/models/form.model.ts) text as above but without any code or variables in the +"Start Form" text as above but without any code or variables in the component's `.ts` file: @@ -178,7 +178,7 @@ following: } ``` -The [Translation service](../core/translation.service.md) page has full details +The [Translation service](../core/services/translation.service.md) page has full details of how to add custom translations, including the locations of the required files and code samples for enabling the new translations in your app. @@ -207,7 +207,7 @@ messages whose content can change at runtime. For example, in the built-in The sections in curly braces are _interpolation variables_ that you supply at runtime. You can specify them by passing an extra parameter to -[`TranslationService`](../core/translation.service.md)`.get`; this is an object whose properties have the same +[`TranslationService`](../core/services/translation.service.md)`.get`; this is an object whose properties have the same names as the interpolation variables in the string: ```ts @@ -232,7 +232,7 @@ You can use interpolations with the `translate` pipe in a similar way: ## How the display language is selected -The `locale` preference in the [user preferences](../core/user-preferences.service.md) +The `locale` preference in the [user preferences](../core/services/user-preferences.service.md) contains the language code that will be used to display the ADF app. Since the user preferences can only be saved by the app when it runs, they will not immediately be available when the app launches for the first time. The app uses the following priorities to determine @@ -251,37 +251,37 @@ The table below illustrates how the selection is made: | X | fr | jp | en | fr | | it | fr | jp | en | it | -The [translation service](../core/translation.service.md) probes the browser culture first, for example `en-GB`. +The [translation service](../core/services/translation.service.md) probes the browser culture first, for example `en-GB`. If the `en-GB.json` file does not exist, the service falls back to the language id: `en`. Once the locale language is determined, it is saved to the user preferences and this saved value will be used from that point on, regardless of the `app.config.json` and browser settings. However, you can change the `locale` user preference from code using the -[User Preferences service](../core/user-preferences.service.md) and the updated value +[User Preferences service](../core/services/user-preferences.service.md) and the updated value will still override any browser or `app.config.json` settings. -ADF also provides a [Language Menu component](../core/language-menu.component.md) that +ADF also provides a [Language Menu component](../core/components/language-menu.component.md) that you can add to a page to let the user set the `locale` preference easily. The list of available languages is defined in the `app.config.json` file for the app. The `translate` pipe reacts automatically to a change in the locale language and immediately updates the display. However, text added via a variable set using -[`TranslationService`](../core/translation.service.md)`.get`, as in the example above, will not be +[`TranslationService`](../core/services/translation.service.md)`.get`, as in the example above, will not be updated directly in this way. Instead, you will need to get a new translation and set the variable's value again explicitly from the code. -See the [Language Menu component](../core/language-menu.component.md) page for further +See the [Language Menu component](../core/components/language-menu.component.md) page for further details and usage examples. ## Support for i18n within ADF components Some components allow you to use translation keys in places where you would normally supply your own messages directly. For example, the -[Data Column component](../core/data-column.component.md) can accept a key instead of +[Data Column component](../core/components/data-column.component.md) can accept a key instead of normal text to specify the column title. Consult the documentation for a component to see if it has built-in support for i18n. ## See also -- [Translation service](../core/translation.service.md) -- [Language Menu component](../core/language-menu.component.md) +- [Translation service](../core/services/translation.service.md) +- [Language Menu component](../core/components/language-menu.component.md) diff --git a/docs/user-guide/rtl-support.md b/docs/user-guide/rtl-support.md new file mode 100644 index 0000000000..d50e1c6dbc --- /dev/null +++ b/docs/user-guide/rtl-support.md @@ -0,0 +1,27 @@ +--- +Title: Right-to-left language support +Added: 2019-03-13 +--- + +# Right-to-left language support + +ADF currently has limited support for languages that are written from right to left (such as Arabic). + +ADF has been updated and tested to work with the HTML +[`dir` attribute](https://www.w3.org/TR/html51/dom.html#the-dir-attribute) +added to the main `` element in `index.html`. When the attribute is set to +`rtl`, text in the app will be right-aligned as required for right-to-left languages: + +```html + + ... + +``` + +Also, we have a [translation file](internationalization.md) for Arabic (code: "ar"), +which is the +[most widely used](https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_speakers) +language written from right to left. + +It is on our [roadmap](../roadmap.md) to extend and improve our support for RTL languages +in the coming versions of ADF. diff --git a/docs/user-guide/transclusion.md b/docs/user-guide/transclusion.md index 0d8a3544f3..7a5e75c8bf 100644 --- a/docs/user-guide/transclusion.md +++ b/docs/user-guide/transclusion.md @@ -13,11 +13,11 @@ most cases, this is used to make small customizations (for example, the various list components let you supply custom content to show when the list is empty). However, there are also a few "containers" whose entire content is set by the user with the container itself being mainly for convenient display and formatting -(for example, the [Info drawer component](../core/info-drawer.component.md)). +(for example, the [Info drawer component](../core/components/info-drawer.component.md)). You supply the content you want to transclude between the opening and closing tags of the main component. In a few cases, this content can be completely free-form as with -the body section of the [Login component](../core/login.component.md): +the body section of the [Login component](../core/components/login.component.md): ```html @@ -28,7 +28,7 @@ the body section of the [Login component](../core/login.component.md): ``` More often, though, the main component makes use of one or more sub-components to add -structure to the transclusion. For example, the [Login component](../core/login.component.md) +structure to the transclusion. For example, the [Login component](../core/components/login.component.md) also has sub-components for the header and footer regions in addition to the free-form content of the body: diff --git a/docs/versionIndex.md b/docs/versionIndex.md index 4419fcaca8..81c929430d 100644 --- a/docs/versionIndex.md +++ b/docs/versionIndex.md @@ -12,6 +12,7 @@ backend services have been tested with each released version of ADF. ## Versions +- [v3.1.0](#v310) - [v3.0.0](#v300) - [v2.6.0](#v260) - [v2.5.0](#v250) @@ -21,45 +22,61 @@ backend services have been tested with each released version of ADF. - [v2.1.0](#v210) - [v2.0.0](#v200) +## v3.1.0 + +**Release:** 2019-03-29
+ + + +- [Auth guard sso role service](core/services/auth-guard-sso-role.service.md) +- [Claim task directive](process-services-cloud/directives/claim-task.directive.md) +- [Complete task directive](process-services-cloud/directives/complete-task.directive.md) +- [Preview extension component](extensions/components/preview-extension.component.md) +- [Task cloud service](process-services-cloud/services/task-cloud.service.md) +- [Unclaim task directive](process-services-cloud/directives/unclaim-task.directive.md) + + + ## v3.0.0 -**Release:** Forthcoming
+**Release:** 2019-02-13
### Components added -- [App list cloud component](process-services-cloud/app-list-cloud.component.md) -- [Apps process cloud service](process-services-cloud/apps-process-cloud.service.md) -- [Dynamic component](extensions/dynamic.component.md) -- [Edit process filter cloud component](process-services-cloud/edit-process-filter-cloud.component.md) -- [Edit task filter cloud component](process-services-cloud/edit-task-filter-cloud.component.md) -- [Extension service](extensions/extension.service.md) -- [File upload error pipe](content-services/file-upload-error.pipe.md) -- [Format space pipe](core/format-space.pipe.md) -- [Full name pipe](core/full-name.pipe.md) -- [Group cloud component](process-services-cloud/group-cloud.component.md) -- [Group cloud service](process-services-cloud/group-cloud.service.md) -- [Group initial pipe](process-services-cloud/group-initial.pipe.md) -- [Icon component](core/icon.component.md) -- [Identity user service](core/identity-user.service.md) -- [Jwt helper service](core/jwt-helper.service.md) -- [People cloud component](process-services-cloud/people-cloud.component.md) -- [Process filter cloud service](process-services-cloud/process-filter-cloud.service.md) -- [Process filters cloud component](process-services-cloud/process-filters-cloud.component.md) -- [Process list cloud component](process-services-cloud/process-list-cloud.component.md) -- [Process list cloud service](process-services-cloud/process-list-cloud.service.md) -- [Start process cloud component](process-services-cloud/start-process-cloud.component.md) -- [Start process cloud service](process-services-cloud/start-process-cloud.service.md) -- [Start task cloud component](process-services-cloud/start-task-cloud.component.md) -- [Start task cloud service](process-services-cloud/start-task-cloud.service.md) -- [Task filter cloud service](process-services-cloud/task-filter-cloud.service.md) -- [Task filters cloud component](process-services-cloud/task-filters-cloud.component.md) -- [Task header cloud component](process-services-cloud/task-header-cloud.component.md) -- [Task header cloud service](process-services-cloud/task-header-cloud.service.md) -- [Task list cloud component](process-services-cloud/task-list-cloud.component.md) -- [Task list cloud service](process-services-cloud/task-list-cloud.service.md) -- [Tree view component](content-services/tree-view.component.md) +- [App list cloud component](process-services-cloud/components/app-list-cloud.component.md) +- [Apps process cloud service](process-services-cloud/services/apps-process-cloud.service.md) +- [Dynamic component](extensions/components/dynamic.component.md) +- [Edit process filter cloud component](process-services-cloud/components/edit-process-filter-cloud.component.md) +- [Edit task filter cloud component](process-services-cloud/components/edit-task-filter-cloud.component.md) +- [Extension service](extensions/services/extension.service.md) +- [File upload error pipe](content-services/pipes/file-upload-error.pipe.md) +- [Format space pipe](core/pipes/format-space.pipe.md) +- [Full name pipe](core/pipes/full-name.pipe.md) +- [Group cloud component](process-services-cloud/components/group-cloud.component.md) +- [Group cloud service](process-services-cloud/services/group-cloud.service.md) +- [Group initial pipe](process-services-cloud/pipes/group-initial.pipe.md) +- [Icon component](core/components/icon.component.md) +- [Identity user service](core/services/identity-user.service.md) +- [Jwt helper service](core/services/jwt-helper.service.md) +- [People cloud component](process-services-cloud/components/people-cloud.component.md) +- [Process filter cloud service](process-services-cloud/services/process-filter-cloud.service.md) +- [Process filters cloud component](process-services-cloud/components/process-filters-cloud.component.md) +- [Process header cloud component](process-services-cloud/components/process-header-cloud.component.md) +- [Process header cloud service](process-services-cloud/services/process-header-cloud.service.md) +- [Process list cloud component](process-services-cloud/components/process-list-cloud.component.md) +- [Process list cloud service](process-services-cloud/services/process-list-cloud.service.md) +- [Start process cloud component](process-services-cloud/components/start-process-cloud.component.md) +- [Start process cloud service](process-services-cloud/services/start-process-cloud.service.md) +- [Start task cloud component](process-services-cloud/components/start-task-cloud.component.md) +- [Start task cloud service](process-services-cloud/services/start-task-cloud.service.md) +- [Task filter cloud service](process-services-cloud/services/task-filter-cloud.service.md) +- [Task filters cloud component](process-services-cloud/components/task-filters-cloud.component.md) +- [Task header cloud component](process-services-cloud/components/task-header-cloud.component.md) +- [Task list cloud component](process-services-cloud/components/task-list-cloud.component.md) +- [Task list cloud service](process-services-cloud/services/task-list-cloud.service.md) +- [Tree view component](content-services/components/tree-view.component.md) @@ -82,9 +99,9 @@ backend services have been tested with each released version of ADF. -- [Login dialog panel component](core/login-dialog-panel.component.md) -- [Login dialog component](core/login-dialog.component.md) -- [Login dialog service](core/login-dialog.service.md) +- [Login dialog panel component](core/components/login-dialog-panel.component.md) +- [Login dialog component](core/components/login-dialog.component.md) +- [Login dialog service](core/services/login-dialog.service.md) @@ -100,7 +117,7 @@ backend services have been tested with each released version of ADF. -- [Header component](core/header.component.md) +- [Header component](core/components/header.component.md) @@ -116,24 +133,24 @@ backend services have been tested with each released version of ADF. -- [About component](core/about.component.md) -- [Add permission dialog component](content-services/add-permission-dialog.component.md) -- [Add permission panel component](content-services/add-permission-panel.component.md) -- [Add permission component](content-services/add-permission.component.md) -- [App config pipe](core/app-config.pipe.md) -- [Buttons menu component](core/buttons-menu.component.md) -- [Empty content component](core/empty-content.component.md) -- [Error content component](core/error-content.component.md) -- [Info drawer tab component](core/info-drawer-tab.component.md) -- [Node permission dialog service](content-services/node-permission-dialog.service.md) -- [Search check list component](content-services/search-check-list.component.md) -- [Search date range component](content-services/search-date-range.component.md) -- [Search filter service](content-services/search-filter.service.md) -- [Search number range component](content-services/search-number-range.component.md) -- [Search radio component](content-services/search-radio.component.md) -- [Search slider component](content-services/search-slider.component.md) -- [Search text component](content-services/search-text.component.md) -- [Sorting picker component](core/sorting-picker.component.md) +- [About component](core/components/about.component.md) +- [Add permission dialog component](content-services/components/add-permission-dialog.component.md) +- [Add permission panel component](content-services/components/add-permission-panel.component.md) +- [Add permission component](content-services/components/add-permission.component.md) +- [App config pipe](core/pipes/app-config.pipe.md) +- [Buttons menu component](core/components/buttons-menu.component.md) +- [Empty content component](core/components/empty-content.component.md) +- [Error content component](core/components/error-content.component.md) +- [Info drawer tab component](core/components/info-drawer-tab.component.md) +- [Node permission dialog service](content-services/services/node-permission-dialog.service.md) +- [Search check list component](content-services/components/search-check-list.component.md) +- [Search date range component](content-services/components/search-date-range.component.md) +- [Search filter service](content-services/services/search-filter.service.md) +- [Search number range component](content-services/components/search-number-range.component.md) +- [Search radio component](content-services/components/search-radio.component.md) +- [Search slider component](content-services/components/search-slider.component.md) +- [Search text component](content-services/components/search-text.component.md) +- [Sorting picker component](core/components/sorting-picker.component.md) @@ -149,17 +166,17 @@ backend services have been tested with each released version of ADF. -- [Comment content service](core/comment-content.service.md) -- [Content node share directive](content-services/content-node-share.directive.md) -- [Custom resources service](content-services/custom-resources.service.md) -- [Inherited button directive](content-services/inherited-button.directive.md) -- [Permission list component](content-services/permission-list.component.md) -- [Search chip list component](content-services/search-chip-list.component.md) -- [Search filter component](content-services/search-filter.component.md) -- [Search query builder service](content-services/search-query-builder.service.md) -- [Search sorting picker component](content-services/search-sorting-picker.component.md) -- [Sidenav layout component](core/sidenav-layout.component.md) -- [Upload version button component](content-services/upload-version-button.component.md) +- [Comment content service](core/services/comment-content.service.md) +- [Content node share directive](content-services/directives/content-node-share.directive.md) +- [Custom resources service](content-services/services/custom-resources.service.md) +- [Inherited button directive](content-services/directives/inherited-button.directive.md) +- [Permission list component](content-services/components/permission-list.component.md) +- [Search chip list component](content-services/components/search-chip-list.component.md) +- [Search filter component](content-services/components/search-filter.component.md) +- [Search query builder service](content-services/services/search-query-builder.service.md) +- [Search sorting picker component](content-services/components/search-sorting-picker.component.md) +- [Sidenav layout component](core/components/sidenav-layout.component.md) +- [Upload version button component](content-services/components/upload-version-button.component.md) @@ -175,8 +192,8 @@ backend services have been tested with each released version of ADF. -- [Node download directive](core/node-download.directive.md) -- [Node lock directive](content-services/node-lock.directive.md) +- [Node download directive](core/directives/node-download.directive.md) +- [Node lock directive](content-services/directives/node-lock.directive.md) @@ -192,12 +209,11 @@ backend services have been tested with each released version of ADF. -- [Content metadata card component](content-services/content-metadata-card.component.md) -- [Content metadata component](content-services/content-metadata.component.md) -- [Content node dialog service](content-services/content-node-dialog.service.md) -- [Content node selector panel component](content-services/content-node-selector-panel.component.md) -- [Search configuration service](core/search-configuration.service.md) -- [Sidebar action menu component](core/sidebar-action-menu.component.md) +- [Content metadata card component](content-services/components/content-metadata-card.component.md) +- [Content node dialog service](content-services/services/content-node-dialog.service.md) +- [Content node selector panel component](content-services/components/content-node-selector-panel.component.md) +- [Search configuration service](core/services/search-configuration.service.md) +- [Sidebar action menu component](core/components/sidebar-action-menu.component.md) @@ -213,154 +229,154 @@ backend services have been tested with each released version of ADF. -- [Activiti alfresco service](core/activiti-alfresco.service.md) -- [Alfresco api service](core/alfresco-api.service.md) -- [Analytics generator component](insights/analytics-generator.component.md) -- [Analytics report list component](insights/analytics-report-list.component.md) -- [Analytics component](insights/analytics.component.md) -- [App config service](core/app-config.service.md) -- [Apps list component](process-services/apps-list.component.md) -- [Apps process service](core/apps-process.service.md) -- [Attach form component](process-services/attach-form.component.md) -- [Auth guard bpm service](core/auth-guard-bpm.service.md) -- [Auth guard ecm service](core/auth-guard-ecm.service.md) -- [Auth guard service](core/auth-guard.service.md) -- [Authentication service](core/authentication.service.md) -- [Bpm user model](core/bpm-user.model.md) -- [Bpm user service](core/bpm-user.service.md) -- [Breadcrumb component](content-services/breadcrumb.component.md) -- [Card item types service](core/card-item-types.service.md) -- [Card view update service](core/card-view-update.service.md) -- [Card view component](core/card-view.component.md) -- [Checklist component](process-services/checklist.component.md) -- [Comment list component](core/comment-list.component.md) -- [Comment process service](core/comment-process.service.md) -- [Comments component](core/comments.component.md) -- [Content action component](content-services/content-action.component.md) -- [Content node selector component](content-services/content-node-selector.component.md) -- [Content service](core/content.service.md) -- [Content widget](core/content.widget.md) -- [Context menu directive](core/context-menu.directive.md) -- [Cookie service](core/cookie.service.md) -- [Create process attachment component](process-services/create-process-attachment.component.md) -- [Create task attachment component](process-services/create-task-attachment.component.md) -- [Data column component](core/data-column.component.md) -- [Datatable component](core/datatable.component.md) -- [Deleted nodes api service](core/deleted-nodes-api.service.md) -- [Diagram component](insights/diagram.component.md) -- [Discovery api service](core/discovery-api.service.md) -- [Document actions service](content-services/document-actions.service.md) -- [Document list component](content-services/document-list.component.md) -- [Document list service](content-services/document-list.service.md) -- [Download zip service](core/download-zip.service.md) -- [Dropdown breadcrumb component](content-services/dropdown-breadcrumb.component.md) -- [Ecm user model](core/ecm-user.model.md) -- [Ecm user service](core/ecm-user.service.md) -- [Empty list component](core/empty-list.component.md) -- [Favorites api service](core/favorites-api.service.md) -- [File draggable directive](content-services/file-draggable.directive.md) -- [File size pipe](core/file-size.pipe.md) -- [File uploading dialog component](content-services/file-uploading-dialog.component.md) -- [Folder actions service](content-services/folder-actions.service.md) -- [Folder create directive](content-services/folder-create.directive.md) -- [Folder edit directive](content-services/folder-edit.directive.md) -- [Form field component](core/form-field.component.md) -- [Form field model](core/form-field.model.md) -- [Form list component](core/form-list.component.md) -- [Form rendering service](core/form-rendering.service.md) -- [Form component](core/form.component.md) -- [Form service](core/form.service.md) -- [Highlight transform service](core/highlight-transform.service.md) -- [Highlight directive](core/highlight.directive.md) -- [Host settings component](core/host-settings.component.md) -- [Image resolver model](content-services/image-resolver.model.md) -- [Infinite pagination component](core/infinite-pagination.component.md) -- [Info drawer layout component](core/info-drawer-layout.component.md) -- [Info drawer component](core/info-drawer.component.md) -- [Language menu component](core/language-menu.component.md) -- [Like component](content-services/like.component.md) -- [Log service](core/log.service.md) -- [Login component](core/login.component.md) -- [Logout directive](core/logout.directive.md) -- [Mime type icon pipe](core/mime-type-icon.pipe.md) -- [Node delete directive](core/node-delete.directive.md) -- [Node favorite directive](core/node-favorite.directive.md) -- [Node name tooltip pipe](core/node-name-tooltip.pipe.md) -- [Node permission directive](core/node-permission.directive.md) -- [Node permission service](content-services/node-permission.service.md) -- [Node restore directive](core/node-restore.directive.md) -- [Node service](core/node.service.md) -- [Nodes api service](core/nodes-api.service.md) -- [Notification service](core/notification.service.md) -- [Page title service](core/page-title.service.md) -- [Pagination component](core/pagination.component.md) -- [People content service](core/people-content.service.md) -- [People list component](process-services/people-list.component.md) -- [People process service](core/people-process.service.md) -- [People search component](process-services/people-search.component.md) -- [People component](process-services/people.component.md) -- [Permissions style model](content-services/permissions-style.model.md) -- [Process attachment list component](process-services/process-attachment-list.component.md) -- [Process audit directive](process-services/process-audit.directive.md) -- [Process comments component](process-services/process-comments.component.md) -- [Process content service](core/process-content.service.md) -- [Process filter service](process-services/process-filter.service.md) -- [Process filters component](process-services/process-filters.component.md) -- [Process instance details component](process-services/process-instance-details.component.md) -- [Process instance header component](process-services/process-instance-header.component.md) -- [Process instance tasks component](process-services/process-instance-tasks.component.md) -- [Process list component](process-services/process-list.component.md) -- [Process service](process-services/process.service.md) -- [Product version model](core/product-version.model.md) -- [Rating component](content-services/rating.component.md) -- [Rating service](content-services/rating.service.md) -- [Renditions service](core/renditions.service.md) -- [Row filter model](content-services/row-filter.model.md) -- [Search control component](content-services/search-control.component.md) -- [Search component](content-services/search.component.md) -- [Search service](core/search.service.md) -- [Select apps dialog component](process-services/select-apps-dialog.component.md) -- [Shared links api service](core/shared-links-api.service.md) -- [Sites dropdown component](content-services/sites-dropdown.component.md) -- [Sites service](core/sites.service.md) -- [Start form component](core/start-form.component.md) -- [Start process component](process-services/start-process.component.md) -- [Start task component](process-services/start-task.component.md) -- [Storage service](core/storage.service.md) -- [Tag actions component](content-services/tag-actions.component.md) -- [Tag list component](content-services/tag-list.component.md) -- [Tag node list component](content-services/tag-node-list.component.md) -- [Tag service](content-services/tag.service.md) -- [Task attachment list component](process-services/task-attachment-list.component.md) -- [Task audit directive](process-services/task-audit.directive.md) -- [Task details component](process-services/task-details.component.md) -- [Task filter service](process-services/task-filter.service.md) -- [Task filters component](process-services/task-filters.component.md) -- [Task header component](process-services/task-header.component.md) -- [Task list component](process-services/task-list.component.md) -- [Task standalone component](process-services/task-standalone.component.md) -- [Tasklist service](process-services/tasklist.service.md) -- [Text highlight pipe](core/text-highlight.pipe.md) -- [Text mask component](core/text-mask.component.md) -- [Thumbnail service](core/thumbnail.service.md) -- [Time ago pipe](core/time-ago.pipe.md) -- [Toolbar divider component](core/toolbar-divider.component.md) -- [Toolbar title component](core/toolbar-title.component.md) -- [Toolbar component](core/toolbar.component.md) -- [Translation service](core/translation.service.md) -- [Upload button component](content-services/upload-button.component.md) -- [Upload drag area component](content-services/upload-drag-area.component.md) -- [Upload directive](core/upload.directive.md) -- [Upload service](core/upload.service.md) -- [User info component](core/user-info.component.md) -- [User initial pipe](core/user-initial.pipe.md) -- [User preferences service](core/user-preferences.service.md) -- [User process model](core/user-process.model.md) -- [Version list component](content-services/version-list.component.md) -- [Version manager component](content-services/version-manager.component.md) -- [Viewer component](core/viewer.component.md) -- [Webscript component](content-services/webscript.component.md) -- [Widget component](insights/widget.component.md) +- [Activiti alfresco service](core/services/activiti-alfresco.service.md) +- [Alfresco api service](core/services/alfresco-api.service.md) +- [Analytics generator component](insights/components/analytics-generator.component.md) +- [Analytics report list component](insights/components/analytics-report-list.component.md) +- [Analytics component](insights/components/analytics.component.md) +- [App config service](core/services/app-config.service.md) +- [Apps list component](process-services/components/apps-list.component.md) +- [Apps process service](core/services/apps-process.service.md) +- [Attach form component](process-services/components/attach-form.component.md) +- [Auth guard bpm service](core/services/auth-guard-bpm.service.md) +- [Auth guard ecm service](core/services/auth-guard-ecm.service.md) +- [Auth guard service](core/services/auth-guard.service.md) +- [Authentication service](core/services/authentication.service.md) +- [Bpm user model](core/models/bpm-user.model.md) +- [Bpm user service](core/services/bpm-user.service.md) +- [Breadcrumb component](content-services/components/breadcrumb.component.md) +- [Card item types service](core/services/card-item-types.service.md) +- [Card view update service](core/services/card-view-update.service.md) +- [Card view component](core/components/card-view.component.md) +- [Check allowable operation directive](core/directives/check-allowable-operation.directive.md) +- [Checklist component](process-services/components/checklist.component.md) +- [Comment list component](core/components/comment-list.component.md) +- [Comment process service](core/services/comment-process.service.md) +- [Comments component](core/components/comments.component.md) +- [Content action component](content-services/components/content-action.component.md) +- [Content node selector component](content-services/components/content-node-selector.component.md) +- [Content service](core/services/content.service.md) +- [Content widget](core/widgets/content.widget.md) +- [Context menu directive](core/directives/context-menu.directive.md) +- [Cookie service](core/services/cookie.service.md) +- [Create process attachment component](process-services/components/create-process-attachment.component.md) +- [Create task attachment component](process-services/components/create-task-attachment.component.md) +- [Data column component](core/components/data-column.component.md) +- [Datatable component](core/components/datatable.component.md) +- [Deleted nodes api service](core/services/deleted-nodes-api.service.md) +- [Diagram component](insights/components/diagram.component.md) +- [Discovery api service](core/services/discovery-api.service.md) +- [Document actions service](content-services/services/document-actions.service.md) +- [Document list component](content-services/components/document-list.component.md) +- [Document list service](content-services/services/document-list.service.md) +- [Download zip service](core/services/download-zip.service.md) +- [Dropdown breadcrumb component](content-services/components/dropdown-breadcrumb.component.md) +- [Ecm user model](core/models/ecm-user.model.md) +- [Ecm user service](core/services/ecm-user.service.md) +- [Empty list component](core/components/empty-list.component.md) +- [Favorites api service](core/services/favorites-api.service.md) +- [File draggable directive](content-services/directives/file-draggable.directive.md) +- [File size pipe](core/pipes/file-size.pipe.md) +- [File uploading dialog component](content-services/components/file-uploading-dialog.component.md) +- [Folder actions service](content-services/services/folder-actions.service.md) +- [Folder create directive](content-services/directives/folder-create.directive.md) +- [Folder edit directive](content-services/directives/folder-edit.directive.md) +- [Form field component](core/components/form-field.component.md) +- [Form field model](core/models/form-field.model.md) +- [Form list component](core/components/form-list.component.md) +- [Form rendering service](core/services/form-rendering.service.md) +- [Form component](core/components/form.component.md) +- [Form service](core/services/form.service.md) +- [Highlight transform service](core/services/highlight-transform.service.md) +- [Highlight directive](core/directives/highlight.directive.md) +- [Host settings component](core/components/host-settings.component.md) +- [Image resolver model](content-services/models/image-resolver.model.md) +- [Infinite pagination component](core/components/infinite-pagination.component.md) +- [Info drawer layout component](core/components/info-drawer-layout.component.md) +- [Info drawer component](core/components/info-drawer.component.md) +- [Language menu component](core/components/language-menu.component.md) +- [Like component](content-services/components/like.component.md) +- [Log service](core/services/log.service.md) +- [Login component](core/components/login.component.md) +- [Logout directive](core/directives/logout.directive.md) +- [Mime type icon pipe](core/pipes/mime-type-icon.pipe.md) +- [Node delete directive](core/directives/node-delete.directive.md) +- [Node favorite directive](core/directives/node-favorite.directive.md) +- [Node name tooltip pipe](core/pipes/node-name-tooltip.pipe.md) +- [Node permission service](content-services/services/node-permission.service.md) +- [Node restore directive](core/directives/node-restore.directive.md) +- [Node service](core/services/node.service.md) +- [Nodes api service](core/services/nodes-api.service.md) +- [Notification service](core/services/notification.service.md) +- [Page title service](core/services/page-title.service.md) +- [Pagination component](core/components/pagination.component.md) +- [People content service](core/services/people-content.service.md) +- [People list component](process-services/components/people-list.component.md) +- [People process service](core/services/people-process.service.md) +- [People search component](process-services/components/people-search.component.md) +- [People component](process-services/components/people.component.md) +- [Permissions style model](content-services/models/permissions-style.model.md) +- [Process attachment list component](process-services/components/process-attachment-list.component.md) +- [Process audit directive](process-services/directives/process-audit.directive.md) +- [Process comments component](process-services/components/process-comments.component.md) +- [Process content service](core/services/process-content.service.md) +- [Process filter service](process-services/services/process-filter.service.md) +- [Process filters component](process-services/components/process-filters.component.md) +- [Process instance details component](process-services/components/process-instance-details.component.md) +- [Process instance header component](process-services/components/process-instance-header.component.md) +- [Process instance tasks component](process-services/components/process-instance-tasks.component.md) +- [Process list component](process-services/components/process-list.component.md) +- [Process service](process-services/services/process.service.md) +- [Product version model](core/models/product-version.model.md) +- [Rating component](content-services/components/rating.component.md) +- [Rating service](content-services/services/rating.service.md) +- [Renditions service](core/services/renditions.service.md) +- [Row filter model](content-services/models/row-filter.model.md) +- [Search control component](content-services/components/search-control.component.md) +- [Search component](content-services/components/search.component.md) +- [Search service](core/services/search.service.md) +- [Select apps dialog component](process-services/components/select-apps-dialog.component.md) +- [Shared links api service](core/services/shared-links-api.service.md) +- [Sites dropdown component](content-services/components/sites-dropdown.component.md) +- [Sites service](core/services/sites.service.md) +- [Start form component](core/components/start-form.component.md) +- [Start process component](process-services/components/start-process.component.md) +- [Start task component](process-services/components/start-task.component.md) +- [Storage service](core/services/storage.service.md) +- [Tag actions component](content-services/components/tag-actions.component.md) +- [Tag list component](content-services/components/tag-list.component.md) +- [Tag node list component](content-services/components/tag-node-list.component.md) +- [Tag service](content-services/services/tag.service.md) +- [Task attachment list component](process-services/components/task-attachment-list.component.md) +- [Task audit directive](process-services/directives/task-audit.directive.md) +- [Task details component](process-services/components/task-details.component.md) +- [Task filter service](process-services/services/task-filter.service.md) +- [Task filters component](process-services/components/task-filters.component.md) +- [Task header component](process-services/components/task-header.component.md) +- [Task list component](process-services/components/task-list.component.md) +- [Task standalone component](process-services/components/task-standalone.component.md) +- [Tasklist service](process-services/services/tasklist.service.md) +- [Text highlight pipe](core/pipes/text-highlight.pipe.md) +- [Text mask component](core/components/text-mask.component.md) +- [Thumbnail service](core/services/thumbnail.service.md) +- [Time ago pipe](core/pipes/time-ago.pipe.md) +- [Toolbar divider component](core/components/toolbar-divider.component.md) +- [Toolbar title component](core/components/toolbar-title.component.md) +- [Toolbar component](core/components/toolbar.component.md) +- [Translation service](core/services/translation.service.md) +- [Upload button component](content-services/components/upload-button.component.md) +- [Upload drag area component](content-services/components/upload-drag-area.component.md) +- [Upload directive](core/directives/upload.directive.md) +- [Upload service](core/services/upload.service.md) +- [User info component](core/components/user-info.component.md) +- [User initial pipe](core/pipes/user-initial.pipe.md) +- [User preferences service](core/services/user-preferences.service.md) +- [User process model](core/models/user-process.model.md) +- [Version list component](content-services/components/version-list.component.md) +- [Version manager component](content-services/components/version-manager.component.md) +- [Viewer component](core/components/viewer.component.md) +- [Webscript component](content-services/components/webscript.component.md) +- [Widget component](insights/components/widget.component.md) diff --git a/e2e/actions/ACS/node.actions.ts b/e2e/actions/ACS/node.actions.ts index f3652b3f05..493cda365d 100644 --- a/e2e/actions/ACS/node.actions.ts +++ b/e2e/actions/ACS/node.actions.ts @@ -30,8 +30,10 @@ export class NodeActions { let promises = []; let nodeList; - for (let i = 0; i < (numberOfElements - 1) ; i++ ) { - promises.push(alfrescoJsApi.core.nodesApi.getNode(idList[i])); + for (let i = 0; i < (numberOfElements - 1); i++) { + if (idList[i] && idList[i].trim() !== '') { + promises.push(alfrescoJsApi.core.nodesApi.getNode(idList[i])); + } } nodeList = await Promise.all(promises); return nodeList; diff --git a/e2e/actions/APS-cloud/apiservice.ts b/e2e/actions/APS-cloud/apiservice.ts index 801bc0a6e6..6ef8cef966 100644 --- a/e2e/actions/APS-cloud/apiservice.ts +++ b/e2e/actions/APS-cloud/apiservice.ts @@ -15,23 +15,22 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import TestConfig = require('../../test.config'); +import { AlfrescoApiConfig } from '@alfresco/js-api/src/alfrescoApiConfig'; export class ApiService { - HOST_SSO = TestConfig.adf.hostSso; - HOST_BPM = TestConfig.adf.hostBPM; - HOST_IDENTITY = TestConfig.adf.hostIdentity; + HOST_SSO: string = TestConfig.adf.hostSso; + HOST_BPM: string = TestConfig.adf.hostBPM; + HOST_IDENTITY: string = TestConfig.adf.hostIdentity; - apiService = new AlfrescoApi({ + config: AlfrescoApiConfig = { provider: 'BPM', - bpmHost: `${this.HOST_BPM}`, - identityHost: `${this.HOST_IDENTITY}`, + hostBpm: this.HOST_BPM, authType: 'OAUTH', oauth2: { - host: `${this.HOST_SSO}`, - authType: '/protocol/openid-connect/token', + host: this.HOST_SSO, clientId: 'activiti', scope: 'openid', secret: '', @@ -41,7 +40,15 @@ export class ApiService { redirectUriLogout: '/logout' } - }); + }; + + apiService: any; + + constructor(clientId: string = 'activiti') { + this.config.oauth2.clientId = clientId; + this.apiService = new AlfrescoApi(this.config); + + } async login(username, password) { await this.apiService.login(username, password); @@ -50,7 +57,6 @@ export class ApiService { async performBpmOperation(path, method, queryParams, postBody) { const uri = this.HOST_BPM + path; const pathParams = {}, formParams = {}; - const authNames = []; const contentTypes = ['application/json']; const accepts = ['application/json']; @@ -58,8 +64,8 @@ export class ApiService { 'Authorization': 'bearer ' + this.apiService.oauth2Auth.token }; - return this.apiService.bpmClient.callCustomApi(uri, method, pathParams, queryParams, headerParams, formParams, postBody, - authNames, contentTypes, accepts, {}) + return this.apiService.processClient.callCustomApi(uri, method, pathParams, queryParams, headerParams, formParams, postBody, + contentTypes, accepts, Object) .catch((error) => { throw (error); }); @@ -68,7 +74,6 @@ export class ApiService { async performIdentityOperation(path, method, queryParams, postBody) { const uri = this.HOST_IDENTITY + path; const pathParams = {}, formParams = {}; - const authNames = []; const contentTypes = ['application/json']; const accepts = ['application/json']; @@ -76,8 +81,8 @@ export class ApiService { 'Authorization': 'bearer ' + this.apiService.oauth2Auth.token }; - return this.apiService.bpmClient.callCustomApi(uri, method, pathParams, queryParams, headerParams, formParams, postBody, - authNames, contentTypes, accepts, {}) + return this.apiService.processClient.callCustomApi(uri, method, pathParams, queryParams, headerParams, formParams, postBody, + contentTypes, accepts, Object) .catch((error) => { throw (error); }); diff --git a/e2e/actions/APS-cloud/groupIdentity.ts b/e2e/actions/APS-cloud/groupIdentity.ts new file mode 100644 index 0000000000..899cd4e066 --- /dev/null +++ b/e2e/actions/APS-cloud/groupIdentity.ts @@ -0,0 +1,77 @@ +/*! + * @license + * Copyright 2019 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 { ApiService } from '../APS-cloud/apiservice'; +import { Util } from '../../util/util'; + +export class GroupIdentity { + + api: ApiService = new ApiService(); + + async init(username, password) { + await this.api.login(username, password); + } + + async createIdentityGroup(groupName = Util.generateRandomString(5)) { + await this.createGroup(groupName); + const group = await this.getGroupInfoByGroupName(groupName); + return group; + } + + async deleteIdentityGroup(groupId) { + await this.deleteGroup(groupId); + } + + async createGroup(groupName) { + const path = '/groups'; + const method = 'POST'; + const queryParams = {}, postBody = { + 'name': groupName + 'TestGroup' + }; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } + + async deleteGroup(groupId) { + const path = `/groups/${groupId}`; + const method = 'DELETE'; + const queryParams = {}, postBody = { + }; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } + + async getGroupInfoByGroupName(groupName) { + const path = `/groups`; + const method = 'GET'; + const queryParams = { 'search' : groupName }, postBody = {}; + + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data[0]; + } + + async assignRole(groupId, roleId, roleName) { + const path = `/groups/${groupId}/role-mappings/realm`; + const method = 'POST'; + const queryParams = {}, + postBody = [{'id': roleId, 'name': roleName}]; + + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } + +} diff --git a/e2e/actions/APS-cloud/identity.ts b/e2e/actions/APS-cloud/identity.ts index e1ab489b8e..d8b616f3d4 100644 --- a/e2e/actions/APS-cloud/identity.ts +++ b/e2e/actions/APS-cloud/identity.ts @@ -17,91 +17,77 @@ import { ApiService } from '../APS-cloud/apiservice'; import { Util } from '../../util/util'; -import { AppConfigService } from '@alfresco/adf-core'; export class Identity { - api: ApiService = new ApiService(); + api: ApiService; - constructor(appConfig: AppConfigService) { - } + async init(username: string, password: string, clientId?: string) { + this.api = new ApiService(clientId); + await this.api.login(username, password); + } - async init(username, password) { - await this.api.login(username, password); - } + async createIdentityUser(username = Util.generateRandomString(5), password = Util.generateRandomString(5)) { + await this.createUser(username); + const user = await this.getUserInfoByUsername(username); + await this.resetPassword(user.id, password); + user.password = password; + return user; + } - async createIdentityUser(username = Util.generateRandomString(5), password = Util.generateRandomString(5)) { - await this.createUser(username); - const user = await this.getUserInfoByUsername(username); - await this.resetPassword(user[0].id, password); - user[0].password = password; - return user; - } + async deleteIdentityUser(userId) { + await this.deleteUser(userId); + } - async deleteIdentityUser(userId) { - await this.deleteUser(userId); - } + async createUser(username) { + const path = '/users'; + const method = 'POST'; + const queryParams = {}, postBody = { + 'username': username, + 'firstName': username, + 'lastName': 'LastName', + 'enabled': true, + 'email': username + '@alfresco.com' + }; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } - async createUser(username) { - const path = '/users'; - const method = 'POST'; - const queryParams = {}, postBody = { - 'username': username, - 'firstName': username, - 'lastName': 'LastName', - 'enabled': true, - 'email': username + '@alfresco.com' - }; - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } + async deleteUser(userId) { + const path = `/users/${userId}`; + const method = 'DELETE'; + const queryParams = {}, postBody = {}; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } - async deleteUser(userId) { - const path = `/users/${userId}`; - const method = 'DELETE'; - const queryParams = {}, postBody = { - }; - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } + async getUserInfoByUsername(username) { + const path = `/users`; + const method = 'GET'; + const queryParams = { 'username': username }, postBody = {}; - async getUserInfoByUsername(username) { - const path = `/users`; - const method = 'GET'; - const queryParams = { 'username' : username }, postBody = {}; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data[0]; + } - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } + async resetPassword(id, password) { + const path = `/users/${id}/reset-password`; + const method = 'PUT'; + const queryParams = {}, + postBody = { 'type': 'password', 'value': password, 'temporary': false }; - async resetPassword(id, password) { - const path = `/users/${id}/reset-password`; - const method = 'PUT'; - const queryParams = {}, - postBody = {'type': 'password', 'value': password, 'temporary': false}; + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } + async assignRole(userId, roleId, roleName) { + const path = `/users/${userId}/role-mappings/realm`; + const method = 'POST'; + const queryParams = {}, + postBody = [{ 'id': roleId, 'name': roleName }]; - async getRoleByName(roleName) { - const path = `/roles/${roleName}`; - const method = 'GET'; - const queryParams = {}, - postBody = {}; - - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } - - async assignRole(userId, roleId, roleName) { - const path = `/users/${userId}/role-mappings/realm`; - const method = 'POST'; - const queryParams = {}, - postBody = [{'id': roleId, 'name': roleName}]; - - const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); - return data; - } + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + return data; + } } diff --git a/e2e/actions/APS-cloud/roles.ts b/e2e/actions/APS-cloud/roles.ts new file mode 100644 index 0000000000..3f0893c19c --- /dev/null +++ b/e2e/actions/APS-cloud/roles.ts @@ -0,0 +1,43 @@ +/*! + * @license + * Copyright 2019 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 { ApiService } from '../APS-cloud/apiservice'; + +export class Roles { + + api: ApiService = new ApiService(); + + async init(username, password) { + await this.api.login(username, password); + } + + async getRoleIdByRoleName(roleName) { + const path = `/roles`; + const method = 'GET'; + let roleId; + const queryParams = {}, postBody = {}; + + const data = await this.api.performIdentityOperation(path, method, queryParams, postBody); + for (let key in data) { + if (data[key].name === roleName) { + roleId = data[key].id; + } + } + return roleId; + } + +} diff --git a/e2e/actions/APS-cloud/tasks.ts b/e2e/actions/APS-cloud/tasks.ts index d92052c255..b22bf3e6e2 100644 --- a/e2e/actions/APS-cloud/tasks.ts +++ b/e2e/actions/APS-cloud/tasks.ts @@ -89,11 +89,11 @@ export class Tasks { return data; } - async createStandaloneSubtask(taskId, appName, name) { - const path = '/' + appName + '-rb/v1/tasks/' + taskId + '/subtask'; + async createStandaloneSubtask(parentTaskId, appName, name) { + const path = '/' + appName + '-rb/v1/tasks'; const method = 'POST'; - const queryParams = {}, postBody = {'name': name, 'payloadType': 'CreateTaskPayload'}; + const queryParams = {}, postBody = {'name': name, 'parentTaskId': parentTaskId, 'payloadType': 'CreateTaskPayload'}; const data = await this.api.performBpmOperation(path, method, queryParams, postBody); return data; diff --git a/e2e/actions/APS/apps.actions.ts b/e2e/actions/APS/apps.actions.ts index 1d71bbb755..99459acb8c 100644 --- a/e2e/actions/APS/apps.actions.ts +++ b/e2e/actions/APS/apps.actions.ts @@ -25,7 +25,7 @@ import { browser } from 'protractor'; export class AppsActions { async getProcessTaskId(alfrescoJsApi, processId) { - let taskList = await alfrescoJsApi.activiti.taskApi.listTasks(); + let taskList = await alfrescoJsApi.activiti.taskApi.listTasks({}); let taskId = -1; taskList.data.forEach((task) => { diff --git a/e2e/actions/drop.actions.ts b/e2e/actions/drop.actions.ts index bfea5ef461..5b49f6428b 100644 --- a/e2e/actions/drop.actions.ts +++ b/e2e/actions/drop.actions.ts @@ -49,7 +49,7 @@ let JS_BIND_INPUT = function (target) { }; let JS_BIND_INPUT_FOLDER = function (target) { - let input = document.createElement('input'); + let input: any = document.createElement('input'); input.type = 'file'; input.style.display = 'none'; input.multiple = true; diff --git a/e2e/content-services/comments/comment-component.e2e.ts b/e2e/content-services/comments/comment-component.e2e.ts index 2208d89eb9..966e15f973 100644 --- a/e2e/content-services/comments/comment-component.e2e.ts +++ b/e2e/content-services/comments/comment-component.e2e.ts @@ -29,7 +29,7 @@ import resources = require('../../util/resources'); import CONSTANTS = require('../../util/constants'); import { Util } from '../../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; @@ -88,7 +88,8 @@ describe('Comment Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBar.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); done(); }); @@ -195,7 +196,7 @@ describe('Comment Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBar.clickContentServicesButton(); done(); }); diff --git a/e2e/content-services/directives/create-folder-directive.e2e.ts b/e2e/content-services/directives/create-folder-directive.e2e.ts index 37d0ffdc33..e512df5f9b 100644 --- a/e2e/content-services/directives/create-folder-directive.e2e.ts +++ b/e2e/content-services/directives/create-folder-directive.e2e.ts @@ -20,11 +20,10 @@ import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { CreateFolderDialog } from '../../pages/adf/dialog/createFolderDialog'; import { NotificationPage } from '../../pages/adf/notificationPage'; import { MetadataViewPage } from '../../pages/adf/metadataViewPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { browser, Key } from 'protractor'; describe('Create folder directive', function () { @@ -34,7 +33,6 @@ describe('Create folder directive', function () { let createFolderDialog = new CreateFolderDialog(); let notificationPage = new NotificationPage(); let metadataViewPage = new MetadataViewPage(); - let contentListPage = new ContentListPage(); let acsUser = new AcsUserModel(); @@ -103,7 +101,7 @@ describe('Create folder directive', function () { contentServicesPage.createNewFolder(folderName); contentServicesPage.checkContentIsDisplayed(folderName); - contentServicesPage.navigateToFolder(folderName); + contentServicesPage.doubleClickRow(folderName); contentServicesPage.createNewFolder(folderName); contentServicesPage.checkContentIsDisplayed(folderName); @@ -122,7 +120,7 @@ describe('Create folder directive', function () { contentServicesPage.checkContentIsDisplayed(folderName); - contentListPage.metadataContent(folderName); + contentServicesPage.metadataContent(folderName); expect(metadataViewPage.getPropertyText('properties.cm:description')).toEqual('this is the description'); }); diff --git a/e2e/content-services/directives/create-library-directive.e2e.ts b/e2e/content-services/directives/create-library-directive.e2e.ts index 74c25fe467..47a52e595b 100644 --- a/e2e/content-services/directives/create-library-directive.e2e.ts +++ b/e2e/content-services/directives/create-library-directive.e2e.ts @@ -22,7 +22,7 @@ import { CustomSources } from '../../pages/adf/demo-shell/customSourcesPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { browser, Key } from 'protractor'; import { Util } from '../../util/util'; diff --git a/e2e/content-services/document-list/document-list-actions.e2e.ts b/e2e/content-services/document-list/document-list-actions.e2e.ts index c720d21e60..74f10b3872 100644 --- a/e2e/content-services/document-list/document-list-actions.e2e.ts +++ b/e2e/content-services/document-list/document-list-actions.e2e.ts @@ -18,11 +18,10 @@ import { browser } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { FileModel } from '../../models/ACS/fileModel'; import { Util } from '../../util/util'; @@ -31,7 +30,7 @@ describe('Document List Component - Actions', () => { let loginPage = new LoginPage(); let contentServicesPage = new ContentServicesPage(); - let contentListPage = new ContentListPage(); + let contentListPage = contentServicesPage.getDocumentList(); let uploadedFolder, secondUploadedFolder; let uploadActions = new UploadActions(); let acsUser = null; @@ -88,8 +87,8 @@ describe('Document List Component - Actions', () => { it('[C213257] Should be able to copy a file', () => { browser.driver.sleep(15000); - contentListPage.rightClickOnRowNamed(pdfUploadedNode.entry.name); - contentListPage.pressContextMenuActionNamed('Copy'); + contentListPage.rightClickOnRow(pdfUploadedNode.entry.name); + contentServicesPage.pressContextMenuActionNamed('Copy'); contentServicesPage.typeIntoNodeSelectorSearchField(folderName); contentServicesPage.clickContentNodeSelectorResult(folderName); contentServicesPage.clickCopyButton(); @@ -99,45 +98,45 @@ describe('Document List Component - Actions', () => { }); it('[C280561] Should be able to delete a file via dropdown menu', () => { - contentListPage.deleteContent(pdfFileModel.name); - contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentServicesPage.deleteContent(pdfFileModel.name); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); pdfUploadedNode = null; }); it('[C280562] Should be able to delete multiple files via dropdown menu', () => { - contentListPage.clickRowToSelect(pdfFileModel.name); - contentListPage.clickRowToSelect(testFileModel.name); - contentListPage.deleteContent(pdfFileModel.name); - contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); - contentListPage.checkContentIsDisplayed(testFileModel.name); + contentListPage.selectRow(pdfFileModel.name); + contentListPage.selectRow(testFileModel.name); + contentServicesPage.deleteContent(pdfFileModel.name); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentServicesPage.checkContentIsDisplayed(testFileModel.name); }); it('[C280565] Should be able to delete a file using context menu', () => { - contentListPage.rightClickOnRowNamed(pdfFileModel.name); - contentListPage.pressContextMenuActionNamed('Delete'); - contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentListPage.rightClickOnRow(pdfFileModel.name); + contentServicesPage.pressContextMenuActionNamed('Delete'); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); pdfUploadedNode = null; }); it('[C280566] Should be able to open context menu with right click', () => { - contentListPage.rightClickOnRowNamed(pdfFileModel.name); - contentListPage.checkContextActionIsVisible('Download'); - contentListPage.checkContextActionIsVisible('Copy'); - contentListPage.checkContextActionIsVisible('Move'); - contentListPage.checkContextActionIsVisible('Delete'); - contentListPage.checkContextActionIsVisible('Info'); - contentListPage.checkContextActionIsVisible('Manage versions'); - contentListPage.checkContextActionIsVisible('Permission'); - contentListPage.checkContextActionIsVisible('Lock'); + contentListPage.rightClickOnRow(pdfFileModel.name); + contentServicesPage.checkContextActionIsVisible('Download'); + contentServicesPage.checkContextActionIsVisible('Copy'); + contentServicesPage.checkContextActionIsVisible('Move'); + contentServicesPage.checkContextActionIsVisible('Delete'); + contentServicesPage.checkContextActionIsVisible('Info'); + contentServicesPage.checkContextActionIsVisible('Manage versions'); + contentServicesPage.checkContextActionIsVisible('Permission'); + contentServicesPage.checkContextActionIsVisible('Lock'); }); it('[C280567] Should be able to delete multiple files using context menu', () => { - contentListPage.clickRowToSelect(pdfFileModel.name); - contentListPage.clickRowToSelect(testFileModel.name); - contentListPage.rightClickOnRowNamed(pdfFileModel.name); - contentListPage.pressContextMenuActionNamed('Delete'); - contentListPage.checkContentIsNotDisplayed(pdfFileModel.name); - contentListPage.checkContentIsDisplayed(testFileModel.name); + contentListPage.selectRow(pdfFileModel.name); + contentListPage.selectRow(testFileModel.name); + contentListPage.rightClickOnRow(pdfFileModel.name); + contentServicesPage.pressContextMenuActionNamed('Delete'); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); + contentServicesPage.checkContentIsDisplayed(testFileModel.name); }); }); @@ -173,25 +172,25 @@ describe('Document List Component - Actions', () => { }); it('[C260123] Should be able to delete a folder using context menu', () => { - contentListPage.deleteContent(folderName); - contentListPage.checkContentIsNotDisplayed(folderName); + contentServicesPage.deleteContent(folderName); + contentServicesPage.checkContentIsNotDisplayed(folderName); uploadedFolder = null; }); it('[C280568] Should be able to open context menu with right click', () => { - contentListPage.rightClickOnRowNamed(folderName); - contentListPage.checkContextActionIsVisible('Download'); - contentListPage.checkContextActionIsVisible('Copy'); - contentListPage.checkContextActionIsVisible('Move'); - contentListPage.checkContextActionIsVisible('Delete'); - contentListPage.checkContextActionIsVisible('Info'); - contentListPage.checkContextActionIsVisible('Permission'); + contentListPage.rightClickOnRow(folderName); + contentServicesPage.checkContextActionIsVisible('Download'); + contentServicesPage.checkContextActionIsVisible('Copy'); + contentServicesPage.checkContextActionIsVisible('Move'); + contentServicesPage.checkContextActionIsVisible('Delete'); + contentServicesPage.checkContextActionIsVisible('Info'); + contentServicesPage.checkContextActionIsVisible('Permission'); }); it('[C260138] Should be able to copy a folder', () => { browser.driver.sleep(15000); - contentListPage.copyContent(folderName); + contentServicesPage.copyContent(folderName); contentServicesPage.typeIntoNodeSelectorSearchField(secondFolderName); contentServicesPage.clickContentNodeSelectorResult(secondFolderName); contentServicesPage.clickCopyButton(); diff --git a/e2e/content-services/document-list/document-list-component.e2e.ts b/e2e/content-services/document-list/document-list-component.e2e.ts index b589f2b0b6..ff35981cab 100644 --- a/e2e/content-services/document-list/document-list-component.e2e.ts +++ b/e2e/content-services/document-list/document-list-component.e2e.ts @@ -24,7 +24,7 @@ import { ViewerPage } from '../../pages/adf/viewerPage'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); import { Util } from '../../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { ErrorPage } from '../../pages/adf/errorPage'; import { FileModel } from '../../models/ACS/fileModel'; @@ -91,6 +91,8 @@ describe('Document List Component', () => { afterAll(async (done) => { await this.alfrescoJsApi.core.sitesApi.deleteSite(privateSite.entry.id); + navBar.openLanguageMenu(); + navBar.chooseLanguage('English'); done(); }); @@ -178,8 +180,12 @@ describe('Document List Component', () => { done(); }); + beforeEach(async (done) => { + await loginPage.loginToContentServicesUsingUserModel(acsUser); + done(); + }); + it('[C279926] Should only display the user\'s files and folders', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); contentServicesPage.checkContentIsDisplayed(folderName); contentServicesPage.checkContentIsDisplayed(pdfFileModel.name); @@ -188,7 +194,6 @@ describe('Document List Component', () => { }); it('[C279927] Should display default columns', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); contentServicesPage.checkColumnNameHeader(); contentServicesPage.checkColumnSizeHeader(); @@ -199,7 +204,6 @@ describe('Document List Component', () => { it('[C279928] Should be able to display date with timeAgo', async (done) => { await this.alfrescoJsApi.login(acsUser.id, acsUser.password); timeAgoUploadedNode = await uploadActions.uploadFile(this.alfrescoJsApi, timeAgoFileModel.location, timeAgoFileModel.name, '-my-'); - loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); let dateValue = contentServicesPage.getColumnValueForRow(timeAgoFileModel.name, 'Created'); expect(dateValue).toContain('ago'); @@ -210,7 +214,6 @@ describe('Document List Component', () => { await this.alfrescoJsApi.login(acsUser.id, acsUser.password); mediumDateUploadedNode = await uploadActions.uploadFile(this.alfrescoJsApi, mediumFileModel.location, mediumFileModel.name, '-my-'); let createdDate = moment(mediumDateUploadedNode.createdAt).format('ll'); - loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); contentServicesPage.enableMediumTimeFormat(); let dateValue = contentServicesPage.getColumnValueForRow(mediumFileModel.name, 'Created'); @@ -240,16 +243,20 @@ describe('Document List Component', () => { beforeAll(async (done) => { - acsUser = new AcsUserModel(); + let user = new AcsUserModel(); await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + await this.alfrescoJsApi.core.peopleApi.addPerson(user); - await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + await this.alfrescoJsApi.login(user.id, user.password); fileANode = await uploadActions.uploadFile(this.alfrescoJsApi, fakeFileA.location, fakeFileA.name, '-my-'); fileBNode = await uploadActions.uploadFile(this.alfrescoJsApi, fakeFileB.location, fakeFileB.name, '-my-'); fileCNode = await uploadActions.uploadFile(this.alfrescoJsApi, fakeFileC.location, fakeFileC.name, '-my-'); + + loginPage.loginToContentServicesUsingUserModel(user); + contentServicesPage.goToDocumentList(); + done(); }); @@ -268,39 +275,27 @@ describe('Document List Component', () => { }); it('[C260112] Should be able to sort by name (Ascending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByName('asc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByName('asc')).toBe(true, 'List is not sorted.'); }); it('[C272770] Should be able to sort by name (Descending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByName('desc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByName('desc')).toBe(true, 'List is not sorted.'); }); it('[C272771] Should be able to sort by author (Ascending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByAuthor('asc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByAuthor('asc')).toBe(true, 'List is not sorted.'); }); it('[C272772] Should be able to sort by author (Descending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByAuthor('desc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByAuthor('desc')).toBe(true, 'List is not sorted.'); }); it('[C272773] Should be able to sort by date (Ascending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByCreated('asc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByCreated('asc')).toBe(true, 'List is not sorted.'); }); it('[C272774] Should be able to sort by date (Descending)', () => { - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - contentServicesPage.sortAndCheckListIsOrderedByCreated('desc'); + expect(contentServicesPage.sortAndCheckListIsOrderedByCreated('desc')).toBe(true, 'List is not sorted.'); }); }); @@ -323,7 +318,7 @@ describe('Document List Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); contentServicesPage.createNewFolder(folderName); - contentServicesPage.navigateToFolder(folderName); + contentServicesPage.doubleClickRow(folderName); contentServicesPage.checkEmptyFolderTextToBe('This folder is empty'); contentServicesPage.checkEmptyFolderImageUrlToContain('/assets/images/empty_doc_lib.svg'); done(); @@ -344,7 +339,7 @@ describe('Document List Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); contentServicesPage.checkContentIsDisplayed(uploadedFolder.entry.name); - contentServicesPage.navigateToFolder(uploadedFolder.entry.name); + contentServicesPage.doubleClickRow(uploadedFolder.entry.name); contentServicesPage.uploadFile(testFile.location); contentServicesPage.checkContentIsDisplayed(testFile.name); done(); @@ -645,7 +640,7 @@ describe('Document List Component', () => { it('[C280130] Should be able to go back to List View', () => { contentServicesPage.clickGridViewButton(); contentServicesPage.checkAcsContainer(); - contentServicesPage.navigateToFolder(folderName); + contentServicesPage.doubleClickRow(folderName); contentServicesPage.checkRowIsDisplayed(pdfFile.name); }); diff --git a/e2e/content-services/document-list/document-list-pagination.e2e.ts b/e2e/content-services/document-list/document-list-pagination.e2e.ts index 45284bf0c9..cbf709a8ef 100644 --- a/e2e/content-services/document-list/document-list-pagination.e2e.ts +++ b/e2e/content-services/document-list/document-list-pagination.e2e.ts @@ -26,7 +26,7 @@ import { FolderModel } from '../../models/ACS/folderModel'; import TestConfig = require('../../test.config'); import { Util } from '../../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; describe('Document List - Pagination', function () { @@ -54,10 +54,10 @@ describe('Document List - Pagination', function () { let navigationBarPage = new NavigationBarPage(); let acsUser = new AcsUserModel(); - let newFolderModel = new FolderModel({ 'name': 'newFolder' }); + let newFolderModel = new FolderModel({'name': 'newFolder'}); let fileNames = [], nrOfFiles = 20, currentPage = 1, secondSetOfFiles = [], secondSetNumber = 25; - let folderTwoModel = new FolderModel({ 'name': 'folderTwo' }); - let folderThreeModel = new FolderModel({ 'name': 'folderThree' }); + let folderTwoModel = new FolderModel({'name': 'folderTwo'}); + let folderThreeModel = new FolderModel({'name': 'folderThree'}); beforeAll(async (done) => { let uploadActions = new UploadActions(); @@ -90,7 +90,7 @@ describe('Document List - Pagination', function () { it('[C260062] Should use default pagination settings', function () { contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); @@ -105,7 +105,7 @@ describe('Document List - Pagination', function () { it('[C274713] Should be able to set Items per page to 20', function () { contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); paginationPage.selectItemsPerPage(itemsPerPage.twenty); @@ -132,7 +132,7 @@ describe('Document List - Pagination', function () { it('[C260069] Should be able to set Items per page to 5', function () { contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); paginationPage.selectItemsPerPage(itemsPerPage.five); @@ -188,7 +188,7 @@ describe('Document List - Pagination', function () { it('[C260067] Should be able to set Items per page to 10', function () { currentPage = 1; contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); paginationPage.selectItemsPerPage(itemsPerPage.ten); @@ -225,7 +225,7 @@ describe('Document List - Pagination', function () { it('[C260065] Should be able to set Items per page to 15', function () { currentPage = 1; contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); @@ -258,15 +258,15 @@ describe('Document List - Pagination', function () { it('[C91320] Pagination should preserve sorting', function () { contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); paginationPage.selectItemsPerPage(itemsPerPage.twenty); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); - contentServicesPage.getElementsDisplayedName().then(function (list) { - contentServicesPage.checkElementsSortedAsc(list); + contentServicesPage.getElementsDisplayedName().then((elements) => { + contentServicesPage.checkElementsSortedAsc(elements); }); contentServicesPage.sortByName(false); @@ -302,20 +302,20 @@ describe('Document List - Pagination', function () { contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); - contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.doubleClickRow(newFolderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); contentServicesPage.createNewFolder(folderTwoModel.name).checkContentIsDisplayed(folderTwoModel.name); - contentServicesPage.navigateToFolder(folderTwoModel.name); + contentServicesPage.doubleClickRow(folderTwoModel.name); contentServicesPage.checkPaginationIsNotDisplayed(); }); it('[C260071] Should be able to change pagination when having 25 files', function () { currentPage = 1; contentServicesPage.goToDocumentList(); - contentServicesPage.navigateToFolder(folderThreeModel.name); + contentServicesPage.doubleClickRow(folderThreeModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); expect(contentServicesPage.getActiveBreadcrumb()).toEqual(folderThreeModel.name); diff --git a/e2e/content-services/lock-file.e2e.ts b/e2e/content-services/lock-file.e2e.ts index 1dbe7ce217..2f3251373c 100644 --- a/e2e/content-services/lock-file.e2e.ts +++ b/e2e/content-services/lock-file.e2e.ts @@ -30,16 +30,15 @@ import { Util } from '../util/util'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; describe('Lock File', () => { const loginPage = new LoginPage(); const navigationBarPage = new NavigationBarPage(); - const contentServicesPage = new ContentServicesPage(); - const contentList = contentServicesPage.getUploadAreaDocumentList(); const lockFilePage = new LockFilePage(); + const contentServices = new ContentServicesPage(); let adminUser = new AcsUserModel(); let managerUser = new AcsUserModel(); @@ -105,7 +104,9 @@ describe('Lock File', () => { loginPage.loginToContentServicesUsingUserModel(adminUser); - navigationBarPage.openContentServicesFolder(documentLibrary); + await navigationBarPage.openContentServicesFolder(documentLibrary); + + contentServices.waitForTableBody(); done(); }); @@ -129,7 +130,7 @@ describe('Lock File', () => { }); it('[C286604] Should be able to open Lock file option by clicking the lock image', () => { - contentList.lockContent(pngFileModel.name); + contentServices.lockContent(pngFileModel.name); lockFilePage.checkLockFileCheckboxIsDisplayed(); lockFilePage.checkCancelButtonIsDisplayed(); @@ -137,38 +138,38 @@ describe('Lock File', () => { }); it('[C286625] Should be able to click Cancel to cancel lock file operation', () => { - contentList.lockContent(pngFileModel.name); + contentServices.lockContent(pngFileModel.name); lockFilePage.checkLockFileCheckboxIsDisplayed(); lockFilePage.clickCancelButton(); - contentList.checkUnlockedIcon(pngFileModel.name); + contentServices.checkUnlockedIcon(pngFileModel.name); }); it('[C286603] Should be able to click on Lock file checkbox and lock a file', () => { - contentList.lockContent(pngFileToLock.name); + contentServices.lockContent(pngFileToLock.name); lockFilePage.checkLockFileCheckboxIsDisplayed(); lockFilePage.clickLockFileCheckbox(); lockFilePage.clickSaveButton(); - contentList.checkLockedIcon(pngFileToLock.name); + contentServices.checkLockedIcon(pngFileToLock.name); }); it('[C286618] Should be able to uncheck Lock file checkbox and unlock a file', () => { - contentList.lockContent(pngFileModel.name); + contentServices.lockContent(pngFileModel.name); lockFilePage.checkLockFileCheckboxIsDisplayed(); lockFilePage.clickLockFileCheckbox(); lockFilePage.clickSaveButton(); - contentList.checkLockedIcon(pngFileModel.name); - contentList.lockContent(pngFileModel.name); + contentServices.checkLockedIcon(pngFileModel.name); + contentServices.lockContent(pngFileModel.name); lockFilePage.clickLockFileCheckbox(); lockFilePage.clickSaveButton(); - contentList.checkUnlockedIcon(pngFileModel.name); + contentServices.checkUnlockedIcon(pngFileModel.name); }); }); @@ -198,7 +199,7 @@ describe('Lock File', () => { }); it('[C286610] Should not be able to delete a locked file', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -214,7 +215,7 @@ describe('Lock File', () => { }); it('[C286611] Should not be able to rename a locked file', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -230,7 +231,7 @@ describe('Lock File', () => { }); it('[C286612] Should not be able to move a locked file', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -245,7 +246,7 @@ describe('Lock File', () => { }); it('[C286613] Should not be able to update a new version on a locked file', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -295,7 +296,7 @@ describe('Lock File', () => { }); it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -308,7 +309,7 @@ describe('Lock File', () => { }); it('[C286615] Owner of the locked file should be able to update a new version if Allow owner to modify is checked', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -321,7 +322,7 @@ describe('Lock File', () => { }); it('[C286616] Owner of the locked file should be able to move if Allow owner to modify is checked', async () => { - await contentList.lockContent(pngFileModel.name); + await contentServices.lockContent(pngFileModel.name); await lockFilePage.checkLockFileCheckboxIsDisplayed(); await lockFilePage.clickLockFileCheckbox(); @@ -337,15 +338,15 @@ describe('Lock File', () => { }); it('[C286617] Owner of the locked file should be able to delete if Allow owner to modify is checked', () => { - contentList.lockContent(pngFileToLock.name); + contentServices.lockContent(pngFileToLock.name); lockFilePage.checkLockFileCheckboxIsDisplayed(); lockFilePage.clickLockFileCheckbox(); lockFilePage.clickAllowOwnerCheckbox(); lockFilePage.clickSaveButton(); - contentList.deleteContentWithRoot(pngFileToBeLocked.entry.name); - contentList.checkContentIsNotDisplayed(pngFileToBeLocked.entry.name); + contentServices.deleteContent(pngFileToBeLocked.entry.name); + contentServices.checkContentIsNotDisplayed(pngFileToBeLocked.entry.name); }); }); diff --git a/e2e/content-services/notifications-component.e2e.ts b/e2e/content-services/notifications-component.e2e.ts index f4b603c200..21496ea342 100644 --- a/e2e/content-services/notifications-component.e2e.ts +++ b/e2e/content-services/notifications-component.e2e.ts @@ -18,7 +18,7 @@ import { LoginPage } from '../pages/adf/loginPage'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { NotificationPage } from '../pages/adf/notificationPage'; import { browser } from 'protractor'; diff --git a/e2e/content-services/permissions-component.e2e.ts b/e2e/content-services/permissions-component.e2e.ts deleted file mode 100644 index 39ba45a101..0000000000 --- a/e2e/content-services/permissions-component.e2e.ts +++ /dev/null @@ -1,120 +0,0 @@ -/*! - * @license - * Copyright 2019 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 { PermissionsPage } from '../pages/adf/permissionsPage'; -import { LoginPage } from '../pages/adf/loginPage'; -import { ContentServicesPage } from '../pages/adf/contentServicesPage'; -import { AcsUserModel } from '../models/ACS/acsUserModel'; -import TestConfig = require('../test.config'); -import resources = require('../util/resources'); -import { ContentListPage } from '../pages/adf/dialog/contentListPage'; -import AlfrescoApi = require('alfresco-js-api-node'); -import { FileModel } from '../models/ACS/fileModel'; -import { UploadActions } from '../actions/ACS/upload.actions'; -import { Util } from '../util/util'; -import { browser } from 'protractor'; - -describe('Permissions Component', function () { - - let loginPage = new LoginPage(); - let contentServicesPage = new ContentServicesPage(); - let permissionsPage = new PermissionsPage(); - let uploadActions = new UploadActions(); - let contentList = new ContentListPage(); - let acsUser, file; - - let fileModel = new FileModel({ - 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name, - 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location - }); - - let groupBody = { - id: Util.generateRandomString(), - displayName: Util.generateRandomString() - }; - - let groupId; - - beforeAll(async (done) => { - this.alfrescoJsApi = new AlfrescoApi({ - provider: 'ECM', - hostEcm: TestConfig.adf.url - }); - - acsUser = new AcsUserModel(); - - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - - await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); - - let group = await this.alfrescoJsApi.core.groupsApi.createGroup(groupBody); - - groupId = group.entry.id; - - browser.driver.sleep(15000); // wait search get the groups - - done(); - }); - - beforeEach(async (done) => { - await this.alfrescoJsApi.login(acsUser.id, acsUser.password); - - file = await uploadActions.uploadFile(this.alfrescoJsApi, fileModel.location, fileModel.name, '-my-'); - - loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - - contentList.checkContentIsDisplayed(fileModel.name); - contentList.rightClickOnRowNamed(fileModel.name); - contentList.pressContextMenuActionNamed('Permission'); - - done(); - }); - - afterEach(async (done) => { - await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, file.entry.id); - - done(); - }); - - afterAll(async (done) => { - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - - await this.alfrescoJsApi.core.groupsApi.deleteGroup(groupId); - done(); - }); - - it('[C286272] Should be able to see results when searching for a user', () => { - permissionsPage.checkAddPermissionButtonIsDisplayed(); - permissionsPage.clickAddPermissionButton(); - permissionsPage.checkAddPermissionDialogIsDisplayed(); - permissionsPage.checkSearchUserInputIsDisplayed(); - permissionsPage.searchUserOrGroup('a'); - permissionsPage.checkResultListIsDisplayed(); - }); - - it('[C276979] Should be able to give permissions to a group of people', () => { - permissionsPage.checkAddPermissionButtonIsDisplayed(); - permissionsPage.clickAddPermissionButton(); - permissionsPage.checkAddPermissionDialogIsDisplayed(); - permissionsPage.checkSearchUserInputIsDisplayed(); - permissionsPage.searchUserOrGroup('GROUP_' + groupBody.id); - permissionsPage.clickUserOrGroup('GROUP_' + groupBody.id); - permissionsPage.checkUserOrGroupIsAdded('GROUP_' + groupBody.id); - }); - -}); diff --git a/e2e/content-services/permissions/permissions-component.e2e.ts b/e2e/content-services/permissions/permissions-component.e2e.ts new file mode 100644 index 0000000000..b825f01ec5 --- /dev/null +++ b/e2e/content-services/permissions/permissions-component.e2e.ts @@ -0,0 +1,862 @@ +/*! + * @license + * Copyright 2019 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 { PermissionsPage } from '../../pages/adf/permissionsPage'; + +import { LoginPage } from '../../pages/adf/loginPage'; + +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; + +import { AcsUserModel } from '../../models/ACS/acsUserModel'; + +import TestConfig = require('../../test.config'); + +import resources = require('../../util/resources'); + +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; + +import { FileModel } from '../../models/ACS/fileModel'; + +import { UploadActions } from '../../actions/ACS/upload.actions'; + +import { Util } from '../../util/util'; + +import { browser, protractor } from 'protractor'; + +import { FolderModel } from '../../models/ACS/folderModel'; + +import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; + +import { ViewerPage } from '../../pages/adf/viewerPage'; + +import { NotificationPage } from '../../pages/adf/notificationPage'; + +import { MetadataViewPage } from '../../pages/adf/metadataViewPage'; + +import { UploadDialog } from '../../pages/adf/dialog/uploadDialog'; + +describe('Permissions Component', function () { + + const loginPage = new LoginPage(); + + const contentServicesPage = new ContentServicesPage(); + + const permissionsPage = new PermissionsPage(); + + const uploadActions = new UploadActions(); + + let contentList = contentServicesPage.getDocumentList(); + + const searchDialog = new SearchDialog(); + + const viewerPage = new ViewerPage(); + + const metadataViewPage = new MetadataViewPage(); + + const notificationPage = new NotificationPage(); + + let uploadDialog = new UploadDialog(); + + let fileOwnerUser, filePermissionUser, file; + + let fileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location + + }); + + let testFileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.TEST.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.TEST.file_location + + }); + + let pngFileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + + }); + + let groupBody = { + + id: Util.generateRandomString(), + + displayName: Util.generateRandomString() + + }; + + let alfrescoJsApi = new AlfrescoApi({ + + provider: 'ECM', + + hostEcm: TestConfig.adf.url + + }); + + let roleConsumerFolderModel = new FolderModel({'name': 'roleConsumer' + Util.generateRandomString()}); + + let roleCoordinatorFolderModel = new FolderModel({'name': 'roleCoordinator' + Util.generateRandomString()}); + + let roleCollaboratorFolderModel = new FolderModel({'name': 'roleCollaborator' + Util.generateRandomString()}); + + let roleContributorFolderModel = new FolderModel({'name': 'roleContributor' + Util.generateRandomString()}); + + let roleEditorFolderModel = new FolderModel({'name': 'roleEditor' + Util.generateRandomString()}); + + let roleConsumerFolder, roleCoordinatorFolder, roleContributorFolder, roleCollaboratorFolder, roleEditorFolder; + + let folders; + + fileOwnerUser = new AcsUserModel(); + + filePermissionUser = new AcsUserModel(); + + const duplicateUserPermissionMessage = 'One or more of the permissions you have set is already present : authority -> ' + filePermissionUser.getId() + ' / role -> Contributor'; + + beforeAll(async (done) => { + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await alfrescoJsApi.core.peopleApi.addPerson(fileOwnerUser); + + await alfrescoJsApi.core.peopleApi.addPerson(filePermissionUser); + + await alfrescoJsApi.core.groupsApi.createGroup(groupBody); + + await alfrescoJsApi.login(fileOwnerUser.id, fileOwnerUser.password); + + roleConsumerFolder = await uploadActions.createFolder(alfrescoJsApi, roleConsumerFolderModel.name, '-my-'); + + roleCoordinatorFolder = await uploadActions.createFolder(alfrescoJsApi, roleCoordinatorFolderModel.name, '-my-'); + + roleContributorFolder = await uploadActions.createFolder(alfrescoJsApi, roleContributorFolderModel.name, '-my-'); + + roleCollaboratorFolder = await uploadActions.createFolder(alfrescoJsApi, roleCollaboratorFolderModel.name, '-my-'); + + roleEditorFolder = await uploadActions.createFolder(alfrescoJsApi, roleEditorFolderModel.name, '-my-'); + + folders = [roleConsumerFolder, roleContributorFolder, roleCoordinatorFolder, roleCollaboratorFolder, roleEditorFolder]; + + await alfrescoJsApi.core.nodesApi.updateNode(roleConsumerFolder.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: filePermissionUser.getId(), + + name: 'Consumer', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await alfrescoJsApi.core.nodesApi.updateNode(roleCollaboratorFolder.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: filePermissionUser.getId(), + + name: 'Collaborator', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await alfrescoJsApi.core.nodesApi.updateNode(roleCoordinatorFolder.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: filePermissionUser.getId(), + + name: 'Coordinator', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await alfrescoJsApi.core.nodesApi.updateNode(roleContributorFolder.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: filePermissionUser.getId(), + + name: 'Contributor', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await alfrescoJsApi.core.nodesApi.updateNode(roleEditorFolder.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: filePermissionUser.getId(), + + name: 'Editor', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'RoleConsumer' + fileModel.name, roleConsumerFolder.entry.id); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'RoleContributor' + fileModel.name, roleContributorFolder.entry.id); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'RoleCoordinator' + fileModel.name, roleCoordinatorFolder.entry.id); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'RoleCollaborator' + fileModel.name, roleCollaboratorFolder.entry.id); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'RoleEditor' + fileModel.name, roleEditorFolder.entry.id); + + browser.driver.sleep(15000); // wait search get the groups, files and folders + + done(); + + }); + + afterAll(async (done) => { + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await folders.forEach(function (folder) { + + uploadActions.deleteFilesOrFolder(alfrescoJsApi, folder.entry.id); + + }); + + done(); + + }); + + describe('Inherit and assigning permissions', function () { + + beforeEach(async (done) => { + + await alfrescoJsApi.login(fileOwnerUser.id, fileOwnerUser.password); + + file = await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, fileModel.name, '-my-'); + + loginPage.loginToContentServicesUsingUserModel(fileOwnerUser); + + contentServicesPage.goToDocumentList(); + + contentServicesPage.checkContentIsDisplayed(fileModel.name); + + contentServicesPage.checkSelectedSiteIsDisplayed('My files'); + + contentList.rightClickOnRow(fileModel.name); + + contentServicesPage.pressContextMenuActionNamed('Permission'); + + permissionsPage.checkPermissionContainerIsDisplayed(); + + done(); + + }); + + afterEach(async (done) => { + + await uploadActions.deleteFilesOrFolder(alfrescoJsApi, file.entry.id); + + done(); + + }); + + it('[C268974] Inherit Permission', () => { + + permissionsPage.checkPermissionInheritedButtonIsDisplayed(); + + expect(permissionsPage.getPermissionInheritedButtonText()).toBe('Permission Inherited'); + + permissionsPage.checkPermissionsDatatableIsDisplayed(); + + permissionsPage.clickPermissionInheritedButton(); + + expect(permissionsPage.getPermissionInheritedButtonText()).toBe('Inherit Permission'); + + permissionsPage.checkNoPermissionsIsDisplayed(); + + permissionsPage.clickPermissionInheritedButton(); + + expect(permissionsPage.getPermissionInheritedButtonText()).toBe('Permission Inherited'); + + permissionsPage.checkPermissionsDatatableIsDisplayed(); + + }); + + it('[C286272] Should be able to see results when searching for a user', () => { + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup('a'); + + permissionsPage.checkResultListIsDisplayed(); + + }); + + it('[C276979] Should be able to give permissions to a group of people', () => { + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup('GROUP_' + groupBody.id); + + permissionsPage.clickUserOrGroup('GROUP_' + groupBody.id); + + permissionsPage.checkUserOrGroupIsAdded('GROUP_' + groupBody.id); + + }); + + it('[C277100] Should display EVERYONE group in the search result set', () => { + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup(filePermissionUser.getId()); + + permissionsPage.checkResultListIsDisplayed(); + + permissionsPage.checkUserOrGroupIsDisplayed('EVERYONE'); + + permissionsPage.searchUserOrGroup('somerandomtext'); + + permissionsPage.checkResultListIsDisplayed(); + + permissionsPage.checkUserOrGroupIsDisplayed('EVERYONE'); + + }); + + }); + + describe('Changing and duplicate Permissions', function () { + + beforeEach(async (done) => { + + await alfrescoJsApi.login(fileOwnerUser.id, fileOwnerUser.password); + + file = await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, fileModel.name, '-my-'); + + loginPage.loginToContentServicesUsingUserModel(fileOwnerUser); + + contentServicesPage.goToDocumentList(); + + contentServicesPage.checkContentIsDisplayed(fileModel.name); + + contentServicesPage.checkSelectedSiteIsDisplayed('My files'); + + contentList.rightClickOnRow(fileModel.name); + + contentServicesPage.pressContextMenuActionNamed('Permission'); + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup(filePermissionUser.getId()); + + permissionsPage.clickUserOrGroup(filePermissionUser.getFirstName()); + + permissionsPage.checkUserOrGroupIsAdded(filePermissionUser.getId()); + + done(); + + }); + + afterEach(async (done) => { + + await uploadActions.deleteFilesOrFolder(alfrescoJsApi, file.entry.id); + + done(); + + }); + + it('[C274691] Should be able to add a new User with permission to the file and also change locally set permissions', () => { + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Contributor'); + + permissionsPage.clickRoleDropdown(); + + expect(permissionsPage.getRoleDropdownOptions().count()).toBe(5); + + expect(permissionsPage.getRoleDropdownOptions().get(0).getText()).toBe('Contributor'); + + expect(permissionsPage.getRoleDropdownOptions().get(1).getText()).toBe('Collaborator'); + + expect(permissionsPage.getRoleDropdownOptions().get(2).getText()).toBe('Coordinator'); + + expect(permissionsPage.getRoleDropdownOptions().get(3).getText()).toBe('Editor'); + + expect(permissionsPage.getRoleDropdownOptions().get(4).getText()).toBe('Consumer'); + + permissionsPage.selectOption('Collaborator'); + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Collaborator'); + + permissionsPage.clickRoleDropdown(); + + permissionsPage.selectOption('Coordinator'); + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Coordinator'); + + permissionsPage.clickRoleDropdown(); + + permissionsPage.selectOption('Editor'); + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Editor'); + + permissionsPage.clickRoleDropdown(); + + permissionsPage.selectOption('Consumer'); + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Consumer'); + + }); + + it('[C276980] Should not be able to duplicate User or Group to the locally set permissions', () => { + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Contributor'); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup(filePermissionUser.getId()); + + permissionsPage.clickUserOrGroup(filePermissionUser.getFirstName()); + + expect(permissionsPage.getAssignPermissionErrorText()).toBe(duplicateUserPermissionMessage); + + }); + + it('[C276982] Should be able to remove User or Group from the locally set permissions', () => { + + expect(permissionsPage.getRoleCellValue(filePermissionUser.getId())).toEqual('Contributor'); + + permissionsPage.clickDeletePermissionButton(); + + permissionsPage.checkUserOrGroupIsDeleted(filePermissionUser.getId()); + + }); + + }); + + describe('Role: Consumer, Contributor, Coordinator, Collaborator, Editor, No Permissions', function () { + + it('[C276993] Role Consumer', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleConsumerFolderModel.name) + + .resultTableContainsRow(roleConsumerFolderModel.name) + + .clickOnSpecificRow(roleConsumerFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleConsumer' + fileModel.name); + + contentList.doubleClickRow('RoleConsumer' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('RoleConsumer' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('RoleConsumer' + fileModel.name); + + notificationPage.checkNotifyContains('You don\'t have access to do this.'); + + contentServicesPage.uploadFile(fileModel.location); + + notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content'); + + }); + + it('[C276996] Role Contributor', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleContributorFolderModel.name) + + .resultTableContainsRow(roleContributorFolderModel.name) + + .clickOnSpecificRow(roleContributorFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleContributor' + fileModel.name); + + contentList.doubleClickRow('RoleContributor' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('RoleContributor' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('RoleContributor' + fileModel.name); + + notificationPage.checkNotifyContains('You don\'t have access to do this.'); + + contentServicesPage.uploadFile(testFileModel.location).checkContentIsDisplayed(testFileModel.name); + + uploadDialog.fileIsUploaded(testFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + }); + + it('[C277000] Role Editor', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleEditorFolderModel.name) + + .resultTableContainsRow(roleEditorFolderModel.name) + + .clickOnSpecificRow(roleEditorFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleEditor' + fileModel.name); + + contentList.doubleClickRow('RoleEditor' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('RoleEditor' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + browser.controlFlow().execute(async () => { + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('RoleEditor' + fileModel.name); + + metadataViewPage.editIconIsDisplayed(); + + await metadataViewPage.editIconClick(); + + metadataViewPage.editPropertyIconIsDisplayed('properties.cm:title'); + + metadataViewPage.clickEditPropertyIcons('properties.cm:title'); + + metadataViewPage.enterPropertyText('properties.cm:title', 'newTitle1'); + + await metadataViewPage.clickUpdatePropertyIcon('properties.cm:title'); + + expect(metadataViewPage.getPropertyText('properties.cm:title')).toEqual('newTitle1'); + + metadataViewPage.clickCloseButton(); + + contentServicesPage.uploadFile(fileModel.location); + + notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content'); + + }); + + }); + + it('[C277003] Role Collaborator', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleCollaboratorFolderModel.name) + + .resultTableContainsRow(roleCollaboratorFolderModel.name) + + .clickOnSpecificRow(roleCollaboratorFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleCollaborator' + fileModel.name); + + contentList.doubleClickRow('RoleCollaborator' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('RoleCollaborator' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + browser.controlFlow().execute(async () => { + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('RoleCollaborator' + fileModel.name); + + metadataViewPage.editIconIsDisplayed(); + + await metadataViewPage.editIconClick(); + + metadataViewPage.editPropertyIconIsDisplayed('properties.cm:title'); + + metadataViewPage.clickEditPropertyIcons('properties.cm:title'); + + metadataViewPage.enterPropertyText('properties.cm:title', 'newTitle2'); + + await metadataViewPage.clickUpdatePropertyIcon('properties.cm:title'); + + expect(metadataViewPage.getPropertyText('properties.cm:title')).toEqual('newTitle2'); + + metadataViewPage.clickCloseButton(); + + contentServicesPage.uploadFile(testFileModel.location).checkContentIsDisplayed(testFileModel.name); + + uploadDialog.fileIsUploaded(testFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + }); + + }); + + it('[C277004] Role Coordinator', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleCoordinatorFolderModel.name) + + .resultTableContainsRow(roleCoordinatorFolderModel.name) + + .clickOnSpecificRow(roleCoordinatorFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleCoordinator' + fileModel.name); + + contentList.doubleClickRow('RoleCoordinator' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.metadataContent('RoleCoordinator' + fileModel.name); + + metadataViewPage.editIconIsDisplayed(); + + browser.controlFlow().execute(async () => { + + await metadataViewPage.editIconClick(); + + metadataViewPage.editPropertyIconIsDisplayed('properties.cm:title'); + + metadataViewPage.clickEditPropertyIcons('properties.cm:title'); + + metadataViewPage.enterPropertyText('properties.cm:title', 'newTitle3'); + + await metadataViewPage.clickUpdatePropertyIcon('properties.cm:title'); + + expect(metadataViewPage.getPropertyText('properties.cm:title')).toEqual('newTitle3'); + + metadataViewPage.clickCloseButton(); + + contentServicesPage.uploadFile(pngFileModel.location).checkContentIsDisplayed(pngFileModel.name); + + uploadDialog.fileIsUploaded(pngFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.checkContentIsDisplayed('RoleCoordinator' + fileModel.name); + + contentServicesPage.deleteContent('RoleCoordinator' + fileModel.name); + + contentServicesPage.checkContentIsNotDisplayed('RoleCoordinator' + fileModel.name); + + }); + + }); + + it('[C279881] No Permission User', () => { + + loginPage.loginToContentServicesUsingUserModel(filePermissionUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(roleConsumerFolderModel.name) + + .resultTableContainsRow(roleConsumerFolderModel.name) + + .clickOnSpecificRow(roleConsumerFolderModel.name); + + contentServicesPage.checkContentIsDisplayed('RoleConsumer' + fileModel.name); + + contentServicesPage.checkSelectedSiteIsDisplayed('My files'); + + contentList.rightClickOnRow('RoleConsumer' + fileModel.name); + + contentServicesPage.pressContextMenuActionNamed('Permission'); + + permissionsPage.checkPermissionInheritedButtonIsDisplayed(); + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickPermissionInheritedButton(); + + notificationPage.checkNotifyContains('You are not allowed to change permissions'); + + notificationPage.checkNotificationSnackBarIsNotDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + notificationPage.checkNotifyContains('You are not allowed to change permissions'); + + }); + + }); + +}); diff --git a/e2e/content-services/permissions/site-permissions.e2e.ts b/e2e/content-services/permissions/site-permissions.e2e.ts new file mode 100644 index 0000000000..73abd0eedf --- /dev/null +++ b/e2e/content-services/permissions/site-permissions.e2e.ts @@ -0,0 +1,588 @@ +/*! + * @license + * Copyright 2019 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 { PermissionsPage } from '../../pages/adf/permissionsPage'; + +import { LoginPage } from '../../pages/adf/loginPage'; + +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; + +import { AcsUserModel } from '../../models/ACS/acsUserModel'; + +import TestConfig = require('../../test.config'); + +import resources = require('../../util/resources'); + +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; + +import { FileModel } from '../../models/ACS/fileModel'; + +import { UploadActions } from '../../actions/ACS/upload.actions'; + +import { Util } from '../../util/util'; + +import { browser, protractor } from 'protractor'; + +import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; + +import { ViewerPage } from '../../pages/adf/viewerPage'; + +import { NotificationPage } from '../../pages/adf/notificationPage'; + +import CONSTANTS = require('../../util/constants'); + +import { MetadataViewPage } from '../../pages/adf/metadataViewPage'; + +import { UploadDialog } from '../../pages/adf/dialog/uploadDialog'; + +import { VersionManagePage } from '../../pages/adf/versionManagerPage'; + +describe('Permissions Component', function () { + + const loginPage = new LoginPage(); + + const contentServicesPage = new ContentServicesPage(); + + const permissionsPage = new PermissionsPage(); + + const uploadActions = new UploadActions(); + + let contentList = contentServicesPage.getDocumentList(); + + const searchDialog = new SearchDialog(); + + const viewerPage = new ViewerPage(); + + const metadataViewPage = new MetadataViewPage(); + + const notificationPage = new NotificationPage(); + + const versionManagePage = new VersionManagePage(); + + let uploadDialog = new UploadDialog(); + + let folderOwnerUser, consumerUser, siteConsumerUser, contributorUser, managerUser, collaboratorUser; + + let publicSite, privateSite, folderName; + + let fileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location + + }); + + let testFileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.TEST.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.TEST.file_location + + }); + + let pngFileModel = new FileModel({ + + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + + }); + + let alfrescoJsApi = new AlfrescoApi({ + + provider: 'ECM', + + hostEcm: TestConfig.adf.url + + }); + + let siteFolder, privateSiteFile; + + folderOwnerUser = new AcsUserModel(); + + consumerUser = new AcsUserModel(); + + siteConsumerUser = new AcsUserModel(); + + collaboratorUser = new AcsUserModel(); + + contributorUser = new AcsUserModel(); + + managerUser = new AcsUserModel(); + + beforeAll(async (done) => { + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await alfrescoJsApi.core.peopleApi.addPerson(folderOwnerUser); + + await alfrescoJsApi.core.peopleApi.addPerson(siteConsumerUser); + + await alfrescoJsApi.core.peopleApi.addPerson(consumerUser); + + await alfrescoJsApi.core.peopleApi.addPerson(contributorUser); + + await alfrescoJsApi.core.peopleApi.addPerson(collaboratorUser); + + await alfrescoJsApi.core.peopleApi.addPerson(managerUser); + + await alfrescoJsApi.login(folderOwnerUser.id, folderOwnerUser.password); + + let publicSiteName = `PUBLIC_TEST_SITE_${Util.generateRandomString(5)}`; + + let privateSiteName = `PRIVATE_TEST_SITE_${Util.generateRandomString(5)}`; + + folderName = `MEESEEKS_${Util.generateRandomString(5)}`; + + let publicSiteBody = {visibility: 'PUBLIC', title: publicSiteName}; + + let privateSiteBody = {visibility: 'PRIVATE', title: privateSiteName}; + + publicSite = await alfrescoJsApi.core.sitesApi.createSite(publicSiteBody); + + privateSite = await alfrescoJsApi.core.sitesApi.createSite(privateSiteBody); + + await alfrescoJsApi.core.sitesApi.addSiteMember(publicSite.entry.id, { + + id: siteConsumerUser.id, + + role: CONSTANTS.CS_USER_ROLES.CONSUMER + + }); + + await alfrescoJsApi.core.sitesApi.addSiteMember(publicSite.entry.id, { + + id: collaboratorUser.id, + + role: CONSTANTS.CS_USER_ROLES.COLLABORATOR + + }); + + await alfrescoJsApi.core.sitesApi.addSiteMember(publicSite.entry.id, { + + id: contributorUser.id, + + role: CONSTANTS.CS_USER_ROLES.CONTRIBUTOR + + }); + + await alfrescoJsApi.core.sitesApi.addSiteMember(publicSite.entry.id, { + + id: managerUser.id, + + role: CONSTANTS.CS_USER_ROLES.MANAGER + + }); + + await alfrescoJsApi.core.sitesApi.addSiteMember(privateSite.entry.id, { + + id: managerUser.id, + + role: CONSTANTS.CS_USER_ROLES.MANAGER + + }); + + siteFolder = await uploadActions.createFolder(alfrescoJsApi, folderName, publicSite.entry.guid); + + privateSiteFile = await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'privateSite' + fileModel.name, privateSite.entry.guid); + + await alfrescoJsApi.core.nodesApi.updateNode(privateSiteFile.entry.id, + + { + + permissions: { + + locallySet: [{ + + authorityId: managerUser.getId(), + + name: 'SiteConsumer', + + accessStatus: 'ALLOWED' + + }] + + } + + }); + + await uploadActions.uploadFile(alfrescoJsApi, fileModel.location, 'Site' + fileModel.name, siteFolder.entry.id); + + browser.driver.sleep(15000); // wait search get the groups, files and folders + + done(); + + }); + + afterAll(async (done) => { + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await alfrescoJsApi.core.sitesApi.deleteSite(publicSite.entry.id); + + await alfrescoJsApi.core.sitesApi.deleteSite(privateSite.entry.id); + + done(); + + }); + + describe('Role Site Dropdown', function () { + + beforeEach(async (done) => { + + loginPage.loginToContentServicesUsingUserModel(folderOwnerUser); + + browser.get(TestConfig.adf.url + '/files/' + publicSite.entry.guid); + + contentServicesPage.checkContentIsDisplayed(folderName); + + contentServicesPage.checkSelectedSiteIsDisplayed('My files'); + + contentList.rightClickOnRow(folderName); + + contentServicesPage.pressContextMenuActionNamed('Permission'); + + permissionsPage.checkPermissionInheritedButtonIsDisplayed(); + + permissionsPage.checkAddPermissionButtonIsDisplayed(); + + permissionsPage.clickAddPermissionButton(); + + permissionsPage.checkAddPermissionDialogIsDisplayed(); + + permissionsPage.checkSearchUserInputIsDisplayed(); + + permissionsPage.searchUserOrGroup(consumerUser.getId()); + + permissionsPage.clickUserOrGroup(consumerUser.getFirstName()); + + permissionsPage.checkUserOrGroupIsAdded(consumerUser.getId()); + + done(); + + }); + + it('[C277002] Should display the Role Site dropdown', () => { + + expect(permissionsPage.getRoleCellValue(consumerUser.getId())).toEqual('SiteCollaborator'); + + permissionsPage.clickRoleDropdown(); + + expect(permissionsPage.getRoleDropdownOptions().count()).toBe(4); + + expect(permissionsPage.getRoleDropdownOptions().get(0).getText()).toBe('SiteCollaborator'); + + expect(permissionsPage.getRoleDropdownOptions().get(1).getText()).toBe('SiteConsumer'); + + expect(permissionsPage.getRoleDropdownOptions().get(2).getText()).toBe('SiteContributor'); + + expect(permissionsPage.getRoleDropdownOptions().get(3).getText()).toBe('SiteManager'); + + }); + + }); + + describe('Roles: SiteConsumer, SiteCollaborator, SiteContributor, SiteManager', function () { + + it('[C276994] Role SiteConsumer', () => { + + loginPage.loginToContentServicesUsingUserModel(siteConsumerUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(folderName) + + .resultTableContainsRow(folderName) + + .clickOnSpecificRow(folderName); + + contentServicesPage.checkContentIsDisplayed('Site' + fileModel.name); + + contentList.doubleClickRow('Site' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('Site' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('Site' + fileModel.name); + + notificationPage.checkNotifyContains('You don\'t have access to do this.'); + + contentServicesPage.uploadFile(fileModel.location); + + notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content'); + + }); + + it('[C276997] Role SiteContributor', () => { + + loginPage.loginToContentServicesUsingUserModel(contributorUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(folderName) + + .resultTableContainsRow(folderName) + + .clickOnSpecificRow(folderName); + + contentServicesPage.checkContentIsDisplayed('Site' + fileModel.name); + + contentList.doubleClickRow('Site' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('Site' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('Site' + fileModel.name); + + notificationPage.checkNotifyContains('You don\'t have access to do this.'); + + contentServicesPage.uploadFile(testFileModel.location).checkContentIsDisplayed(testFileModel.name); + + uploadDialog.fileIsUploaded(testFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + }); + + it('[C277005] Role SiteCollaborator', () => { + + loginPage.loginToContentServicesUsingUserModel(collaboratorUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(folderName) + + .resultTableContainsRow(folderName) + + .clickOnSpecificRow(folderName); + + contentServicesPage.checkContentIsDisplayed('Site' + fileModel.name); + + contentList.doubleClickRow('Site' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.checkDeleteIsDisabled('Site' + fileModel.name); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + browser.controlFlow().execute(async () => { + + contentList.checkActionMenuIsNotDisplayed(); + + contentServicesPage.metadataContent('Site' + fileModel.name); + + metadataViewPage.editIconIsDisplayed(); + + await metadataViewPage.editIconClick(); + + metadataViewPage.editPropertyIconIsDisplayed('properties.cm:title'); + + metadataViewPage.clickEditPropertyIcons('properties.cm:title'); + + metadataViewPage.enterPropertyText('properties.cm:title', 'newTitle'); + + await metadataViewPage.clickUpdatePropertyIcon('properties.cm:title'); + + expect(metadataViewPage.getPropertyText('properties.cm:title')).toEqual('newTitle'); + + metadataViewPage.clickCloseButton(); + + contentServicesPage.uploadFile(pngFileModel.location).checkContentIsDisplayed(pngFileModel.name); + + uploadDialog.fileIsUploaded(pngFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + }); + + }); + + it('[C277006] Role SiteManager', () => { + + loginPage.loginToContentServicesUsingUserModel(managerUser); + + contentServicesPage.goToDocumentList(); + + searchDialog + + .checkSearchIconIsVisible() + + .clickOnSearchIcon() + + .checkSearchBarIsVisible() + + .enterText(folderName) + + .resultTableContainsRow(folderName) + + .clickOnSpecificRow(folderName); + + contentServicesPage.checkContentIsDisplayed('Site' + fileModel.name); + + contentList.doubleClickRow('Site' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.clickCloseButton(); + + contentList.waitForTableBody(); + + contentServicesPage.metadataContent('Site' + fileModel.name); + + metadataViewPage.editIconIsDisplayed(); + + browser.controlFlow().execute(async () => { + + await metadataViewPage.editIconClick(); + + metadataViewPage.editPropertyIconIsDisplayed('properties.cm:description'); + + metadataViewPage.clickEditPropertyIcons('properties.cm:description'); + + metadataViewPage.enterDescriptionText('newDescription'); + + await metadataViewPage.clickUpdatePropertyIcon('properties.cm:description'); + + expect(metadataViewPage.getPropertyText('properties.cm:description')).toEqual('newDescription'); + + metadataViewPage.clickCloseButton(); + + contentServicesPage.uploadFile(testFileModel.location).checkContentIsDisplayed(testFileModel.name); + + uploadDialog.fileIsUploaded(testFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.checkContentIsDisplayed('Site' + fileModel.name); + + contentServicesPage.deleteContent('Site' + fileModel.name); + + contentServicesPage.checkContentIsNotDisplayed('Site' + fileModel.name); + + }); + + }); + + }); + + describe('Site Consumer - Add new version', function () { + + it('[C277118] Should be able to add new version with Site Consumer permission on file', () => { + + loginPage.loginToContentServicesUsingUserModel(managerUser); + + browser.get(TestConfig.adf.url + '/files/' + privateSite.entry.guid); + + contentServicesPage.checkContentIsDisplayed('privateSite' + fileModel.name); + + contentList.doubleClickRow('privateSite' + fileModel.name); + + viewerPage.checkFileIsLoaded(); + + viewerPage.checkInfoButtonIsDisplayed(); + + viewerPage.clickInfoButton(); + + viewerPage.checkInfoSideBarIsDisplayed(); + + viewerPage.clickMoveRightChevron(); + + viewerPage.clickMoveRightChevron(); + + viewerPage.clickOnTab('Versions'); + + viewerPage.checkTabIsActive('Versions'); + + versionManagePage + + .checkUploadNewVersionsButtonIsDisplayed() + + .clickAddNewVersionsButton() + + .checkMajorChangeIsDisplayed() + + .checkMinorChangeIsDisplayed() + + .checkCommentTextIsDisplayed() + + .checkCancelButtonIsDisplayed(); + + versionManagePage.uploadNewVersionFile(pngFileModel.location); + + versionManagePage.checkFileVersionExist('1.0'); + + expect(versionManagePage.getFileVersionName('1.0')).toEqual('privateSite' + fileModel.name); + + versionManagePage.checkFileVersionExist('1.1'); + + expect(versionManagePage.getFileVersionName('1.1')).toEqual(pngFileModel.name); + + viewerPage.checkFileNameIsDisplayed(pngFileModel.name); + + }); + + }); + +}); diff --git a/e2e/content-services/share-file/share-file.e2e.ts b/e2e/content-services/share-file/share-file.e2e.ts index 1604c59943..1f5ffab72b 100644 --- a/e2e/content-services/share-file/share-file.e2e.ts +++ b/e2e/content-services/share-file/share-file.e2e.ts @@ -27,7 +27,7 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; @@ -35,7 +35,7 @@ describe('Share file', () => { const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = contentServicesPage.getUploadAreaDocumentList(); + const contentListPage = contentServicesPage.getDocumentList(); const shareDialog = new ShareDialog(); const navigationBarPage = new NavigationBarPage(); const viewerPage = new ViewerPage(); @@ -66,6 +66,10 @@ describe('Share file', () => { nodeId = pngUploadedFile.entry.id; + loginPage.loginToContentServicesUsingUserModel(acsUser); + + navigationBarPage.clickContentServicesButton(); + done(); }); @@ -81,16 +85,21 @@ describe('Share file', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); contentServicesPage.waitForTableBody(); - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + done(); + }); + afterEach(async (done) => { + await browser.refresh(); + contentServicesPage.waitForTableBody(); done(); }); it('[C286549] Should check automatically toggle button in Share dialog', () => { + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.shareToggleButtonIsChecked(); @@ -99,6 +108,7 @@ describe('Share file', () => { }); it('[C286544] Should display notification when clicking URL copy button', () => { + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickShareLinkButton(); @@ -111,6 +121,7 @@ describe('Share file', () => { }); it('[C286543] Should be possible to close Share dialog', () => { + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.checkShareLinkIsDisplayed(); @@ -118,7 +129,16 @@ describe('Share file', () => { shareDialog.dialogIsClosed(); }); + it('[C286578] Should disable today option in expiration day calendar', () => { + contentListPage.selectRow(pngFileModel.name); + contentServicesPage.clickShareButton(); + shareDialog.checkDialogIsDisplayed(); + shareDialog.clickDateTimePickerButton(); + shareDialog.calendarTodayDayIsDisabled(); + }); + it('[C286548] Should be possible to set expiry date for link', async () => { + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickDateTimePickerButton(); @@ -137,6 +157,7 @@ describe('Share file', () => { }); it('[C286578] Should disable today option in expiration day calendar', () => { + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickDateTimePickerButton(); @@ -147,7 +168,7 @@ describe('Share file', () => { describe('Shared link preview', () => { afterEach( (done) => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); done(); }); @@ -155,7 +176,7 @@ describe('Share file', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); contentServicesPage.waitForTableBody(); @@ -163,7 +184,7 @@ describe('Share file', () => { }); it('[C286565] Should open file when logged user access shared link', async () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickShareLinkButton(); @@ -174,7 +195,7 @@ describe('Share file', () => { }); it('[C287803] Should the URL be kept the same when opening the share dialog multiple times', async () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickShareLinkButton(); @@ -192,7 +213,7 @@ describe('Share file', () => { }); it('[C286539] Should open file when non-logged user access shared link', async () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.checkShareLinkIsDisplayed(); diff --git a/e2e/content-services/share-file/unshare-file.e2e.ts b/e2e/content-services/share-file/unshare-file.e2e.ts index 0343301881..64483aa5f0 100644 --- a/e2e/content-services/share-file/unshare-file.e2e.ts +++ b/e2e/content-services/share-file/unshare-file.e2e.ts @@ -20,14 +20,13 @@ import { Util } from '../../util/util'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { ErrorPage } from '../../pages/adf/errorPage'; import { ShareDialog } from '../../pages/adf/dialog/shareDialog'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; @@ -35,8 +34,8 @@ describe('Unshare file', () => { const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = contentServicesPage.getUploadAreaDocumentList(); - let navBar = new NavigationBarPage(); + const contentListPage = contentServicesPage.getDocumentList(); + const navBar = new NavigationBarPage(); const errorPage = new ErrorPage(); const shareDialog = new ShareDialog(); const siteName = `PRIVATE-TEST-SITE-${Util.generateRandomString(5)}`; @@ -102,7 +101,8 @@ describe('Unshare file', () => { nodeId = pngUploadedFile.entry.id; loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navBar.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); done(); }); @@ -118,7 +118,7 @@ describe('Unshare file', () => { }); it('[C286550] Should display unshare confirmation dialog', () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickUnShareFile(); @@ -126,7 +126,7 @@ describe('Unshare file', () => { }); it('[C286551] Should be able to cancel unshare action', () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickUnShareFile(); @@ -136,7 +136,7 @@ describe('Unshare file', () => { }); it('[C286552] Should be able to confirm unshare action', async () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickUnShareFile(); @@ -146,7 +146,7 @@ describe('Unshare file', () => { }); it('[C280556] Should redirect to 404 when trying to access an unshared file', async () => { - contentListPage.clickRowToSelectWithRoot(pngFileModel.name); + contentListPage.selectRow(pngFileModel.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); let sharedLink = await shareDialog.getShareLink(); @@ -168,8 +168,8 @@ describe('Unshare file', () => { it('[C286555] Should NOT be able to unshare file without permission', () => { navBar.goToSite(testSite); - contentListPage.navigateToFolder('documentLibrary'); - contentListPage.clickRowToSelect(nodeBody.name); + contentListPage.doubleClickRow('documentLibrary'); + contentListPage.selectRow(nodeBody.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.shareToggleButtonIsChecked(); diff --git a/e2e/content-services/tag-component.e2e.ts b/e2e/content-services/tag-component.e2e.ts index cf9a9af3cb..d5c6fda406 100644 --- a/e2e/content-services/tag-component.e2e.ts +++ b/e2e/content-services/tag-component.e2e.ts @@ -25,7 +25,7 @@ import { AppNavigationBarPage } from '../pages/adf/process-services/appNavigatio import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; import { Util } from '../util/util'; diff --git a/e2e/content-services/trashcan-pagination.e2e.ts b/e2e/content-services/trashcan-pagination.e2e.ts index f9b150e33e..aa8af99d23 100644 --- a/e2e/content-services/trashcan-pagination.e2e.ts +++ b/e2e/content-services/trashcan-pagination.e2e.ts @@ -27,8 +27,9 @@ import { FolderModel } from '../models/ACS/folderModel'; import TestConfig = require('../test.config'); import { Util } from '../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; +import { browser } from 'protractor'; describe('Trashcan - Pagination', () => { let pagination = { diff --git a/e2e/content-services/tree-view-component.e2e.ts b/e2e/content-services/tree-view-component.e2e.ts index 09343f4c30..69298ce622 100644 --- a/e2e/content-services/tree-view-component.e2e.ts +++ b/e2e/content-services/tree-view-component.e2e.ts @@ -23,7 +23,7 @@ import { AcsUserModel } from '../models/ACS/acsUserModel'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; describe('Tree View Component', () => { diff --git a/e2e/content-services/upload/cancel-upload.e2e.ts b/e2e/content-services/upload/cancel-upload.e2e.ts new file mode 100644 index 0000000000..5194952e0a --- /dev/null +++ b/e2e/content-services/upload/cancel-upload.e2e.ts @@ -0,0 +1,128 @@ +/*! + * @license + * Copyright 2019 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 { browser } from 'protractor'; + +import { LoginPage } from '../../pages/adf/loginPage'; +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; +import { UploadDialog } from '../../pages/adf/dialog/uploadDialog'; +import { UploadToggles } from '../../pages/adf/dialog/uploadToggles'; + +import { AcsUserModel } from '../../models/ACS/acsUserModel'; +import { FileModel } from '../../models/ACS/fileModel'; + +import TestConfig = require('../../test.config'); +import resources = require('../../util/resources'); + +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; +import { UploadActions } from '../../actions/ACS/upload.actions'; + +describe('Upload component', () => { + + let contentServicesPage = new ContentServicesPage(); + let uploadDialog = new UploadDialog(); + let uploadToggles = new UploadToggles(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + let uploadActions = new UploadActions(); + + let firstPdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF_B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF_B.file_location + }); + let pngFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + }); + let largeFile = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_name, + 'location': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_location + }); + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + let pdfUploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, firstPdfFileModel.location, firstPdfFileModel.name, '-my-'); + + Object.assign(firstPdfFileModel, pdfUploadedFile.entry); + + done(); + }); + + beforeEach(() => { + contentServicesPage.goToDocumentList(); + }); + + afterEach(async (done) => { + let nodesPromise = await contentServicesPage.getElementsDisplayedId(); + + nodesPromise.forEach(async (currentNode) => { + if (currentNode && currentNode !== 'Node id') { + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, currentNode); + } + }); + + done(); + }); + + it('[C272792] Should be possible to cancel upload of a big file using row cancel icon', () => { + browser.executeScript(' setTimeout(() => {document.querySelector(\'mat-icon[class*="adf-file-uploading-row__action"]\').click();}, 3000)'); + + contentServicesPage.uploadFile(largeFile.location); + + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(largeFile.name); + }); + + it('[C287790] Should be possible to cancel upload of a big file through the cancel uploads button', () => { + browser.executeScript(' setInterval(() => {document.querySelector("#adf-upload-dialog-cancel-all").click();' + + 'document.querySelector("#adf-upload-dialog-cancel").click(); }, 500)'); + + contentServicesPage.uploadFile(largeFile.location); + + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(largeFile.name); + }); + + it('[C272793] Should be able to cancel multiple files upload', () => { + browser.executeScript(' setInterval(() => {document.querySelector("#adf-upload-dialog-cancel-all").click();' + + 'document.querySelector("#adf-upload-dialog-cancel").click(); }, 500)'); + + uploadToggles.enableMultipleFileUpload(); + contentServicesPage.uploadMultipleFile([pngFileModel.location, largeFile.location]); + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(pngFileModel.name).checkContentIsNotDisplayed(largeFile.name); + uploadToggles.disableMultipleFileUpload(); + }); + +}); diff --git a/e2e/content-services/upload/excluded-file.e2e.ts b/e2e/content-services/upload/excluded-file.e2e.ts index 76be3e2b26..596159365f 100644 --- a/e2e/content-services/upload/excluded-file.e2e.ts +++ b/e2e/content-services/upload/excluded-file.e2e.ts @@ -30,7 +30,7 @@ import { FolderModel } from '../../models/ACS/folderModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { DropActions } from '../../actions/drop.actions'; import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; @@ -110,7 +110,7 @@ describe('Upload component - Excluded Files', () => { .checkContentIsNotDisplayed(iniExcludedFile.name); }); - it('[C260125] Should not upload excluded file when they are in a Folder', () => { + xit('[C260125] Should not upload excluded file when they are in a Folder', () => { uploadToggles.enableFolderUpload(); contentServicesPage.uploadFolder(folderWithExcludedFile.location); diff --git a/e2e/content-services/upload/upload-dialog.ts b/e2e/content-services/upload/upload-dialog.ts new file mode 100644 index 0000000000..37737ed837 --- /dev/null +++ b/e2e/content-services/upload/upload-dialog.ts @@ -0,0 +1,174 @@ +/*! + * @license + * Copyright 2019 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 { LoginPage } from '../../pages/adf/loginPage'; +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; +import { UploadDialog } from '../../pages/adf/dialog/uploadDialog'; +import { UploadToggles } from '../../pages/adf/dialog/uploadToggles'; + +import { AcsUserModel } from '../../models/ACS/acsUserModel'; +import { FileModel } from '../../models/ACS/fileModel'; + +import TestConfig = require('../../test.config'); +import resources = require('../../util/resources'); + +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; +import { UploadActions } from '../../actions/ACS/upload.actions'; + +describe('Upload component', () => { + + let contentServicesPage = new ContentServicesPage(); + let uploadDialog = new UploadDialog(); + let uploadToggles = new UploadToggles(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + let uploadActions = new UploadActions(); + + let firstPdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF_B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF_B.file_location + }); + let docxFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.DOCX.file_name, + 'location': resources.Files.ADF_DOCUMENTS.DOCX.file_location + }); + let pdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF.file_location + }); + let pngFileModelTwo = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PNG_B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PNG_B.file_location + }); + let pngFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + }); + let filesLocation = [pdfFileModel.location, docxFileModel.location, pngFileModel.location, firstPdfFileModel.location]; + let filesName = [pdfFileModel.name, docxFileModel.name, pngFileModel.name, firstPdfFileModel.name]; + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + let pdfUploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, firstPdfFileModel.location, firstPdfFileModel.name, '-my-'); + + Object.assign(firstPdfFileModel, pdfUploadedFile.entry); + + done(); + }); + + beforeEach(() => { + contentServicesPage.goToDocumentList(); + }); + + afterEach(async (done) => { + let nodesPromise = await contentServicesPage.getElementsDisplayedId(); + + nodesPromise.forEach(async (currentNodePromise) => { + await currentNodePromise.then(async (currentNode) => { + if (currentNode && currentNode !== 'Node id') { + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, currentNode); + } + }); + }); + + done(); + }); + + it('[C260143] Should be possible to maximize/minimize the upload dialog', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); + + uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.minimizeUploadDialog().dialogIsMinimized(); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.maximizeUploadDialog().dialogIsDisplayed().fileIsUploaded(docxFileModel.name); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); + }); + + it('[C291902] Should be shown upload counter display in dialog box', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); + + uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); + expect(uploadDialog.getTitleText()).toEqual('Uploaded 1 / 1'); + uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); + }); + + it('[C260168] Should be possible to cancel upload using dialog icon', () => { + contentServicesPage.uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); + uploadDialog.removeUploadedFile(pdfFileModel.name).fileIsCancelled(pdfFileModel.name); + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); + }); + + it('[C260176] Should remove files from upload dialog box when closed', () => { + contentServicesPage.uploadFile(pngFileModelTwo.location).checkContentIsDisplayed(pngFileModelTwo.name); + + uploadDialog.fileIsUploaded(pngFileModelTwo.name); + + contentServicesPage.uploadFile(pngFileModel.location).checkContentIsDisplayed(pngFileModel.name); + + uploadDialog.fileIsUploaded(pngFileModel.name).fileIsUploaded(pngFileModelTwo.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); + + uploadDialog.fileIsUploaded(pdfFileModel.name).fileIsNotDisplayedInDialog(pngFileModel.name).fileIsNotDisplayedInDialog(pngFileModelTwo.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + }); + + it('[C260170] Should be possible to upload multiple files', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + + uploadToggles.enableMultipleFileUpload(); + + contentServicesPage.uploadMultipleFile(filesLocation).checkContentsAreDisplayed(filesName); + + uploadDialog.filesAreUploaded(filesName); + + expect(uploadDialog.getTitleText()).toEqual('Uploaded 4 / 4'); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + uploadToggles.disableMultipleFileUpload(); + }); + +}); diff --git a/e2e/content-services/upload/uploader-component.e2e.ts b/e2e/content-services/upload/uploader-component.e2e.ts index 3d18c66538..a79d341cea 100644 --- a/e2e/content-services/upload/uploader-component.e2e.ts +++ b/e2e/content-services/upload/uploader-component.e2e.ts @@ -31,7 +31,7 @@ import resources = require('../../util/resources'); import { Util } from '../../util/util'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { DropActions } from '../../actions/drop.actions'; @@ -57,18 +57,10 @@ describe('Upload component', () => { 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, 'location': resources.Files.ADF_DOCUMENTS.PDF.file_location }); - let pngFileModelTwo = new FileModel({ - 'name': resources.Files.ADF_DOCUMENTS.PNG_B.file_name, - 'location': resources.Files.ADF_DOCUMENTS.PNG_B.file_location - }); let pngFileModel = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location }); - let largeFile = new FileModel({ - 'name': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_name, - 'location': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_location - }); let fileWithSpecificSize = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.TXT_400B.file_name, 'location': resources.Files.ADF_DOCUMENTS.TXT_400B.file_location @@ -87,8 +79,6 @@ describe('Upload component', () => { }); let uploadedFileInFolder = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.FILE_INSIDE_FOLDER_ONE.file_name }); let uploadedFileInFolderTwo = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.FILE_INSIDE_FOLDER_TWO.file_name }); - let filesLocation = [pdfFileModel.location, docxFileModel.location, pngFileModel.location, firstPdfFileModel.location]; - let filesName = [pdfFileModel.name, docxFileModel.name, pngFileModel.name, firstPdfFileModel.name]; beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -117,144 +107,229 @@ describe('Upload component', () => { contentServicesPage.goToDocumentList(); }); - afterEach(async (done) => { - let nodesPromise = await contentServicesPage.getContentList().getAllNodeIdInList(); + describe('', () => { - nodesPromise.forEach(async (currentNodePromise) => { - await currentNodePromise.then(async (currentNode) => { - if (currentNode && currentNode !== 'Node id') { + beforeEach(() => { + contentServicesPage.goToDocumentList(); + }); + + afterEach(async (done) => { + + contentServicesPage.getElementsDisplayedId().then((nodeList) => { + nodeList.forEach(async (currentNode) => { await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, currentNode); - } + }); }); + + done(); }); - done(); - }); + it('[C272788] Should display upload button', () => { + expect(contentServicesPage.getSingleFileButtonTooltip()).toEqual('Custom tooltip'); - it('[C272788] Should display upload button', () => { - expect(contentServicesPage.getSingleFileButtonTooltip()).toEqual('Custom tooltip'); - - contentServicesPage - .checkUploadButton() - .checkContentIsDisplayed(firstPdfFileModel.name); - }); - - it('[C260173] Should be able to upload folder when enabled', () => { - uploadToggles.enableFolderUpload(); - contentServicesPage.uploadFolder(folderOne.location); - uploadDialog.checkUploadCompleted().then(() => { - contentServicesPage.checkContentIsDisplayed(folderOne.name); + contentServicesPage + .checkUploadButton() + .checkContentIsDisplayed(firstPdfFileModel.name); }); - expect(contentServicesPage.getFolderButtonTooltip()).toEqual('Custom tooltip'); - uploadDialog.fileIsUploaded(uploadedFileInFolder.name); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.doubleClickRow(folderOne.name).checkContentIsDisplayed(uploadedFileInFolder.name); - contentServicesPage.goToDocumentList(); - uploadToggles.disableFolderUpload(); - }); - it('[C272789] Should be able to upload PDF file', () => { - contentServicesPage - .uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.name); + xit('[C260173] Should be able to upload folder when enabled', () => { + uploadToggles.enableFolderUpload(); + uploadToggles.checkFolderUploadToggleIsEnabled(); - uploadDialog.fileIsUploaded(pdfFileModel.name); + contentServicesPage.uploadFolder(folderOne.location); + uploadDialog.checkUploadCompleted().then(() => { + contentServicesPage.checkContentIsDisplayed(folderOne.name); + }); + expect(contentServicesPage.getFolderButtonTooltip()).toEqual('Custom tooltip'); + uploadDialog.fileIsUploaded(uploadedFileInFolder.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.doubleClickRow(folderOne.name).checkContentIsDisplayed(uploadedFileInFolder.name); + contentServicesPage.goToDocumentList(); + uploadToggles.disableFolderUpload(); + }); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - }); + it('[C272789] Should be able to upload PDF file', () => { + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); - it('[C272790] Should be able to upload text file', () => { - contentServicesPage - .uploadFile(docxFileModel.location) - .checkContentIsDisplayed(docxFileModel.name); + uploadDialog.fileIsUploaded(pdfFileModel.name); - uploadDialog.fileIsUploaded(docxFileModel.name); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - }); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + }); - it('[C260141] Should be possible to upload PNG file', () => { - contentServicesPage - .uploadFile(pngFileModel.location) - .checkContentIsDisplayed(pngFileModel.name); + it('[C272790] Should be able to upload text file', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); - uploadDialog.fileIsUploaded(pngFileModel.name); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - }); + uploadDialog.fileIsUploaded(docxFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + }); - it('[C260143] Should be possible to maximize/minimize the upload dialog', () => { - contentServicesPage - .uploadFile(docxFileModel.location) - .checkContentIsDisplayed(docxFileModel.name); + it('[C260141] Should be possible to upload PNG file', () => { + contentServicesPage + .uploadFile(pngFileModel.location) + .checkContentIsDisplayed(pngFileModel.name); - uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); - expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); - expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); - uploadDialog.minimizeUploadDialog().dialogIsMinimized(); - expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); - expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); - uploadDialog.maximizeUploadDialog().dialogIsDisplayed().fileIsUploaded(docxFileModel.name); - expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); - expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); - uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); - }); + uploadDialog.fileIsUploaded(pngFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + }); - it('[C291902] Should be shown upload counter display in dialog box', () => { - contentServicesPage - .uploadFile(docxFileModel.location) - .checkContentIsDisplayed(docxFileModel.name); + it('[C260143] Should be possible to maximize/minimize the upload dialog', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); - uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); - expect(uploadDialog.getTitleText()).toEqual('Uploaded 1 / 1'); - uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); - }); + uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.minimizeUploadDialog().dialogIsMinimized(); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.maximizeUploadDialog().dialogIsDisplayed().fileIsUploaded(docxFileModel.name); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); + }); - it('[C260168] Should be possible to cancel upload using dialog icon', () => { - contentServicesPage.uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.name); - uploadDialog.removeUploadedFile(pdfFileModel.name).fileIsCancelled(pdfFileModel.name); - expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); - }); + it('[C272794] Should display tooltip for uploading files', () => { + uploadToggles.enableMultipleFileUpload(); + uploadToggles.checkMultipleFileUploadToggleIsEnabled(); - it('[C272792] Should be possible to cancel upload of a big file using row cancel icon', () => { - browser.executeScript(' setTimeout(() => {document.querySelector(\'mat-icon[class*="adf-file-uploading-row__action"]\').click();}, 3000)'); + browser.driver.sleep(1000); + expect(contentServicesPage.getMultipleFileButtonTooltip()).toEqual('Custom tooltip'); + uploadToggles.disableMultipleFileUpload(); + }); - contentServicesPage.uploadFile(largeFile.location); + it('[C279920] Should rename a file uploaded twice', () => { + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); - expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.checkContentIsNotDisplayed(largeFile.name); - }); + pdfFileModel.setVersion('1'); - it('[C287790] Should be possible to cancel upload of a big file through the cancel uploads button', () => { - browser.executeScript(' setTimeout(() => {document.querySelector("#adf-upload-dialog-cancel-all").click();' + - 'document.querySelector("#adf-upload-dialog-cancel").click(); }, 3000)'); + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.getVersionName()); - contentServicesPage.uploadFile(largeFile.location); + uploadDialog + .clickOnCloseButton() + .dialogIsNotDisplayed(); - expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.checkContentIsNotDisplayed(largeFile.name); - }); + pdfFileModel.setVersion(''); + }); - it('[C272793] Should be able to cancel multiple files upload', () => { - browser.executeScript(' setTimeout(() => {document.querySelector("#adf-upload-dialog-cancel-all").click();' + - 'document.querySelector("#adf-upload-dialog-cancel").click(); }, 3000)'); + it('[C260172] Should be possible to enable versioning', () => { + uploadToggles.enableVersioning(); + uploadToggles.checkVersioningToggleIsEnabled(); - uploadToggles.enableMultipleFileUpload(); - contentServicesPage.uploadMultipleFile([pngFileModel.location, largeFile.location]); - expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.checkContentIsNotDisplayed(pngFileModel.name).checkContentIsNotDisplayed(largeFile.name); - uploadToggles.disableMultipleFileUpload(); - }); + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); - it('[C272794] Should display tooltip for uploading files', () => { - uploadToggles.enableMultipleFileUpload(); - browser.driver.sleep(1000); - expect(contentServicesPage.getMultipleFileButtonTooltip()).toEqual('Custom tooltip'); - uploadToggles.disableMultipleFileUpload(); + pdfFileModel.setVersion('1'); + + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); + + uploadDialog + .fileIsUploaded(pdfFileModel.name); + + uploadDialog + .clickOnCloseButton() + .dialogIsNotDisplayed(); + + contentServicesPage + .checkContentIsNotDisplayed(pdfFileModel.getVersionName()); + + pdfFileModel.setVersion(''); + uploadToggles.disableVersioning(); + }); + + it('[C260174] Should be possible to set a max size', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + uploadToggles.enableMaxSize(); + uploadToggles.checkMaxSizeToggleIsEnabled(); + uploadToggles.addMaxSize('400'); + contentServicesPage.uploadFile(fileWithSpecificSize.location); + uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(fileWithSpecificSize.name); + contentServicesPage.checkContentIsNotDisplayed(fileWithSpecificSize.name); + uploadToggles.addMaxSize('399'); + contentServicesPage.uploadFile(fileWithSpecificSize.location); + + // expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); + + contentServicesPage.checkContentIsNotDisplayed(fileWithSpecificSize.name); + uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); + contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); + uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); + + uploadToggles.disableMaxSize(); + }); + + it('[C272796] Should be possible to set max size to 0', () => { + contentServicesPage.goToDocumentList(); + uploadToggles.enableMaxSize(); + uploadToggles.checkMaxSizeToggleIsEnabled(); + uploadToggles.addMaxSize('0'); + contentServicesPage.uploadFile(fileWithSpecificSize.location); + // expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); + + uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); + contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); + uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); + + uploadToggles.disableMaxSize(); + }); + + it('[C272797] Should be possible to set max size to 1', () => { + uploadToggles.enableMaxSize(); + uploadToggles.checkMaxSizeToggleIsEnabled(); + browser.driver.sleep(1000); + uploadToggles.addMaxSize('1'); + uploadToggles.disableMaxSize(); + contentServicesPage.uploadFile(fileWithSpecificSize.location); + uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsDisplayed(fileWithSpecificSize.name); + }); + + it('[C91318] Should Enable/Disable upload button when change the disable property', () => { + uploadToggles.clickCheckboxDisableUpload(); + expect(contentServicesPage.uploadButtonIsEnabled()).toBeFalsy(); + + uploadToggles.clickCheckboxDisableUpload(); + expect(contentServicesPage.uploadButtonIsEnabled()).toBeTruthy(); + }); + + xit('[C279882] Should be possible Upload a folder in a folder', () => { + uploadToggles.enableFolderUpload(); + browser.driver.sleep(1000); + contentServicesPage.uploadFolder(folderOne.location); + uploadDialog.checkUploadCompleted().then(() => { + contentServicesPage.checkContentIsDisplayed(folderOne.name); + }); + uploadDialog.fileIsUploaded(uploadedFileInFolder.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.doubleClickRow(folderOne.name).checkContentIsDisplayed(uploadedFileInFolder.name); + + uploadToggles.enableFolderUpload(); + browser.driver.sleep(1000); + contentServicesPage.uploadFolder(folderTwo.location); + uploadDialog.checkUploadCompleted().then(() => { + contentServicesPage.checkContentIsDisplayed(folderTwo.name); + }); + uploadDialog.fileIsUploaded(uploadedFileInFolderTwo.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.doubleClickRow(folderTwo.name).checkContentIsDisplayed(uploadedFileInFolderTwo.name); + + uploadToggles.disableFolderUpload(); + }); }); it('[C260171] Should upload only the extension filter allowed when Enable extension filter is enabled', () => { @@ -289,163 +364,6 @@ describe('Upload component', () => { uploadToggles.disableExtensionFilter(); }); - it('[C279920] Should rename a file uploaded twice', () => { - contentServicesPage - .uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.name); - - pdfFileModel.setVersion('1'); - - contentServicesPage - .uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.getVersionName()); - - uploadDialog - .clickOnCloseButton() - .dialogIsNotDisplayed(); - - pdfFileModel.setVersion(''); - }); - - it('[C260172] Should be possible to enable versioning', () => { - uploadToggles.enableVersioning(); - - contentServicesPage - .uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.name); - - pdfFileModel.setVersion('1'); - - contentServicesPage - .uploadFile(pdfFileModel.location) - .checkContentIsDisplayed(pdfFileModel.name); - - uploadDialog - .fileIsUploaded(pdfFileModel.name); - - uploadDialog - .clickOnCloseButton() - .dialogIsNotDisplayed(); - - contentServicesPage - .checkContentIsNotDisplayed(pdfFileModel.getVersionName()); - - pdfFileModel.setVersion(''); - uploadToggles.disableVersioning(); - }); - - it('[C260176] Should remove files from upload dialog box when closed', () => { - contentServicesPage.uploadFile(pngFileModelTwo.location).checkContentIsDisplayed(pngFileModelTwo.name); - - uploadDialog.fileIsUploaded(pngFileModelTwo.name); - - contentServicesPage.uploadFile(pngFileModel.location).checkContentIsDisplayed(pngFileModel.name); - - uploadDialog.fileIsUploaded(pngFileModel.name).fileIsUploaded(pngFileModelTwo.name); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - - contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); - - uploadDialog.fileIsUploaded(pdfFileModel.name).fileIsNotDisplayedInDialog(pngFileModel.name).fileIsNotDisplayedInDialog(pngFileModelTwo.name); - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - }); - - it('[C260170] Should be possible to upload multiple files', () => { - contentServicesPage.goToDocumentList(); - contentServicesPage.checkAcsContainer(); - - uploadToggles.enableMultipleFileUpload(); - - contentServicesPage.uploadMultipleFile(filesLocation).checkContentsAreDisplayed(filesName); - - uploadDialog.filesAreUploaded(filesName); - - expect(uploadDialog.getTitleText()).toEqual('Uploaded 4 / 4'); - - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - - uploadToggles.disableMultipleFileUpload(); - }); - - it('[C260174] Should be possible to set a max size', () => { - contentServicesPage.goToDocumentList(); - contentServicesPage.checkAcsContainer(); - uploadToggles.enableMaxSize(); - uploadToggles.addMaxSize('400'); - contentServicesPage.uploadFile(fileWithSpecificSize.location); - uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.deleteContent(fileWithSpecificSize.name).checkContentIsNotDisplayed(fileWithSpecificSize.name); - uploadToggles.addMaxSize('399'); - contentServicesPage.uploadFile(fileWithSpecificSize.location); - - // expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); - - contentServicesPage.checkContentIsNotDisplayed(fileWithSpecificSize.name); - uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); - contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); - uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); - - uploadToggles.disableMaxSize(); - }); - - it('[C272796] Should be possible to set max size to 0', () => { - contentServicesPage.goToDocumentList(); - uploadToggles.enableMaxSize(); - uploadToggles.addMaxSize('0'); - contentServicesPage.uploadFile(fileWithSpecificSize.location); - // expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); - - uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); - contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); - uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); - - uploadToggles.disableMaxSize(); - }); - - it('[C272797] Should be possible to set max size to 1', () => { - uploadToggles.enableMaxSize(); - browser.driver.sleep(1000); - uploadToggles.addMaxSize('1'); - uploadToggles.disableMaxSize(); - contentServicesPage.uploadFile(fileWithSpecificSize.location); - uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.checkContentIsDisplayed(fileWithSpecificSize.name); - }); - - it('[C91318] Should Enable/Disable upload button when change the disable property', () => { - uploadToggles.clickCheckboxDisableUpload(); - expect(contentServicesPage.uploadButtonIsEnabled()).toBeFalsy(); - - uploadToggles.clickCheckboxDisableUpload(); - expect(contentServicesPage.uploadButtonIsEnabled()).toBeTruthy(); - }); - - it('[C279882] Should be possible Upload a folder in a folder', () => { - uploadToggles.enableFolderUpload(); - browser.driver.sleep(1000); - contentServicesPage.uploadFolder(folderOne.location); - uploadDialog.checkUploadCompleted().then(() => { - contentServicesPage.checkContentIsDisplayed(folderOne.name); - }); - uploadDialog.fileIsUploaded(uploadedFileInFolder.name); - - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.doubleClickRow(folderOne.name).checkContentIsDisplayed(uploadedFileInFolder.name); - - uploadToggles.enableFolderUpload(); - browser.driver.sleep(1000); - contentServicesPage.uploadFolder(folderTwo.location); - uploadDialog.checkUploadCompleted().then(() => { - contentServicesPage.checkContentIsDisplayed(folderTwo.name); - }); - uploadDialog.fileIsUploaded(uploadedFileInFolderTwo.name); - - uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); - contentServicesPage.doubleClickRow(folderTwo.name).checkContentIsDisplayed(uploadedFileInFolderTwo.name); - - uploadToggles.disableFolderUpload(); - }); - it('[C291921] Should display tooltip for uploading files on a not found location', async () => { let folderName = Util.generateRandomString(8); diff --git a/e2e/content-services/upload/user-permission.e2e.ts b/e2e/content-services/upload/user-permission.e2e.ts index 0b1076e551..b2f651b11d 100644 --- a/e2e/content-services/upload/user-permission.e2e.ts +++ b/e2e/content-services/upload/user-permission.e2e.ts @@ -33,7 +33,8 @@ import { FolderModel } from '../../models/ACS/folderModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; + import CONSTANTS = require('../../util/constants'); describe('Upload - User permission', () => { @@ -63,8 +64,8 @@ describe('Upload - User permission', () => { }); let folder = new FolderModel({ - 'name': resources.Files.ADF_DOCUMENTS.FOLDER_ONE.folder_name, - 'location': resources.Files.ADF_DOCUMENTS.FOLDER_ONE.folder_location + 'name': resources.Files.ADF_DOCUMENTS.FOLDER_TWO.folder_name, + 'location': resources.Files.ADF_DOCUMENTS.FOLDER_TWO.folder_location }); beforeAll(() => { @@ -117,15 +118,15 @@ describe('Upload - User permission', () => { done(); }); - it('[C212861] Should not be allowed to Drag and drop a file/folder in a folder with consumer permissions', () => { + xit('[C212861] Should not be allowed to Drag and drop a file/folder in a folder with consumer permissions', () => { contentServicesPage.checkDragAndDropDIsDisplayed(); - contentServicesPage.dragAndDropFile(emptyFile.location); contentServicesPage.dragAndDropFolder(folder.location); - - contentServicesPage.checkContentIsDisplayed(emptyFile.name); contentServicesPage.checkContentIsDisplayed(folder.name); + contentServicesPage.dragAndDropFile(emptyFile.location); + contentServicesPage.checkContentIsDisplayed(emptyFile.name); + navigationBarPage.openContentServicesFolder(this.consumerSite.entry.guid); browser.sleep(3000); @@ -172,8 +173,9 @@ describe('Upload - User permission', () => { notificationPage.checkNotifyContains('You don\'t have the create permission to upload the content'); }); - it('[C279916] Should not be allowed to upload a folder in folder with consumer permissions', () => { + xit('[C279916] Should not be allowed to upload a folder in folder with consumer permissions', () => { uploadToggles.enableFolderUpload(); + uploadToggles.checkFolderUploadToggleIsEnabled(); contentServicesPage.uploadFolder(folder.location) .checkContentIsDisplayed(folder.name); @@ -189,6 +191,7 @@ describe('Upload - User permission', () => { browser.sleep(3000); uploadToggles.enableFolderUpload(); + uploadToggles.checkFolderUploadToggleIsEnabled(); contentServicesPage.uploadFolder(folder.location); @@ -206,11 +209,14 @@ describe('Upload - User permission', () => { done(); }); - it('[C260130] Should be allowed to Drag and drop a file/folder in a folder with manager permissions', () => { + xit('[C260130] Should be allowed to Drag and drop a file/folder in a folder with manager permissions', () => { contentServicesPage.checkDragAndDropDIsDisplayed(); contentServicesPage.dragAndDropFile(emptyFile.location); + contentServicesPage.checkContentIsDisplayed(emptyFile.name); + contentServicesPage.dragAndDropFolder(folder.location); + contentServicesPage.checkContentIsDisplayed(folder.name); let fileInTheUploadedFolder = 'share_profile_pic.png'; @@ -224,8 +230,9 @@ describe('Upload - User permission', () => { uploadDialog.fileIsUploaded(emptyFile.name); }); - it('[C279918] Should be allowed to upload a folder in a folder with manager permissions', () => { + xit('[C279918] Should be allowed to upload a folder in a folder with manager permissions', () => { uploadToggles.enableFolderUpload(); + uploadToggles.checkFolderUploadToggleIsEnabled(); contentServicesPage.uploadFolder(folder.location); uploadDialog.checkUploadCompleted().then(() => { diff --git a/e2e/content-services/version/version-actions.e2e.ts b/e2e/content-services/version/version-actions.e2e.ts index 5dfd77c776..78644f1f63 100644 --- a/e2e/content-services/version/version-actions.e2e.ts +++ b/e2e/content-services/version/version-actions.e2e.ts @@ -19,7 +19,6 @@ import { by, element } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { VersionManagePage } from '../../pages/adf/versionManagerPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; @@ -28,17 +27,18 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { Util } from '../../util/util'; import path = require('path'); +import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Version component actions', () => { const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = new ContentListPage(); const versionManagePage = new VersionManagePage(); + const navigationBarPage = new NavigationBarPage(); let acsUser = new AcsUserModel(); @@ -75,8 +75,9 @@ describe('Version component actions', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); - contentListPage.versionManagerContent(txtFileModel.name); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); + contentServicesPage.versionManagerContent(txtFileModel.name); done(); }); diff --git a/e2e/content-services/version/version-permissions.e2e.ts b/e2e/content-services/version/version-permissions.e2e.ts index 5f91456165..dd4d6deffb 100644 --- a/e2e/content-services/version/version-permissions.e2e.ts +++ b/e2e/content-services/version/version-permissions.e2e.ts @@ -18,11 +18,11 @@ import { element, by } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { VersionManagePage } from '../../pages/adf/versionManagerPage'; import { UploadDialog } from '../../pages/adf/dialog/uploadDialog'; import { NotificationPage } from '../../pages/adf/notificationPage'; +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { FileModel } from '../../models/ACS/fileModel'; @@ -30,7 +30,7 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { NodeActions } from '../../actions/ACS/node.actions'; @@ -40,11 +40,11 @@ import CONSTANTS = require('../../util/constants'); describe('Version component permissions', () => { const loginPage = new LoginPage(); - const contentListPage = new ContentListPage(); const versionManagePage = new VersionManagePage(); const navigationBarPage = new NavigationBarPage(); const uploadDialog = new UploadDialog(); const notificationPage = new NotificationPage(); + const contentServices = new ContentServicesPage(); let site; let acsUser = new AcsUserModel(); @@ -158,7 +158,7 @@ describe('Version component permissions', () => { }); it('[C277200] should a user with Manager permission be able to upload a new version for a file with different creator', () => { - contentListPage.versionManagerContent(differentCreatorFile.name); + contentServices.versionManagerContent(differentCreatorFile.name); versionManagePage.showNewVersionButton.click(); @@ -179,7 +179,7 @@ describe('Version component permissions', () => { }); it('[C277204] Should a user with Manager permission not be able to upload a new version for a locked file', () => { - contentListPage.versionManagerContent(lockFileModel.name); + contentServices.versionManagerContent(lockFileModel.name); versionManagePage.showNewVersionButton.click(); @@ -193,7 +193,7 @@ describe('Version component permissions', () => { }); it('[C277196] Should a user with Manager permission be able to upload a new version for the created file', () => { - contentListPage.versionManagerContent(sameCreatorFile.name); + contentServices.versionManagerContent(sameCreatorFile.name); versionManagePage.showNewVersionButton.click(); @@ -225,13 +225,13 @@ describe('Version component permissions', () => { }); it('[C277197] Should a user with Consumer permission not be able to upload a new version for a file with different creator', () => { - contentListPage.versionManagerContent(differentCreatorFile.name); + contentServices.versionManagerContent(differentCreatorFile.name); notificationPage.checkNotifyContains(`You don't have access to do this`); }); it('[C277201] Should a user with Consumer permission not be able to upload a new version for a locked file', () => { - contentListPage.versionManagerContent(lockFileModel.name); + contentServices.versionManagerContent(lockFileModel.name); notificationPage.checkNotifyContains(`You don't have access to do this`); }); @@ -265,7 +265,7 @@ describe('Version component permissions', () => { }); it('[C277177] Should a user with Contributor permission be able to upload a new version for the created file', () => { - contentListPage.versionManagerContent(sameCreatorFile.name); + contentServices.versionManagerContent(sameCreatorFile.name); versionManagePage.showNewVersionButton.click(); @@ -286,13 +286,13 @@ describe('Version component permissions', () => { }); it('[C277198] Should a user with Contributor permission not be able to upload a new version for a file with different creator', () => { - contentListPage.versionManagerContent(differentCreatorFile.name); + contentServices.versionManagerContent(differentCreatorFile.name); notificationPage.checkNotifyContains(`You don't have access to do this`); }); it('[C277202] Should a user with Contributor permission not be able to upload a new version for a locked file', () => { - contentListPage.versionManagerContent(lockFileModel.name); + contentServices.versionManagerContent(lockFileModel.name); notificationPage.checkNotifyContains(`You don't have access to do this`); }); @@ -325,7 +325,7 @@ describe('Version component permissions', () => { }); it('[C277195] Should a user with Collaborator permission be able to upload a new version for the created file', () => { - contentListPage.versionManagerContent(sameCreatorFile.name); + contentServices.versionManagerContent(sameCreatorFile.name); versionManagePage.showNewVersionButton.click(); @@ -346,7 +346,7 @@ describe('Version component permissions', () => { }); it('[C277203] Should a user with Collaborator permission not be able to upload a new version for a locked file', () => { - contentListPage.versionManagerContent(lockFileModel.name); + contentServices.versionManagerContent(lockFileModel.name); versionManagePage.showNewVersionButton.click(); @@ -360,7 +360,7 @@ describe('Version component permissions', () => { }); it('[C277199] should a user with Collaborator permission be able to upload a new version for a file with different creator', () => { - contentListPage.versionManagerContent(differentCreatorFile.name); + contentServices.versionManagerContent(differentCreatorFile.name); versionManagePage.showNewVersionButton.click(); diff --git a/e2e/content-services/version/version-properties.e2e.ts b/e2e/content-services/version/version-properties.e2e.ts index 36957e00fa..f649a73173 100644 --- a/e2e/content-services/version/version-properties.e2e.ts +++ b/e2e/content-services/version/version-properties.e2e.ts @@ -19,7 +19,6 @@ import { by, element } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { VersionManagePage } from '../../pages/adf/versionManagerPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; @@ -28,16 +27,17 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { Util } from '../../util/util'; +import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Version Properties', () => { const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = new ContentListPage(); const versionManagePage = new VersionManagePage(); + const navigationBarPage = new NavigationBarPage(); let acsUser = new AcsUserModel(); @@ -74,8 +74,9 @@ describe('Version Properties', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); - contentListPage.versionManagerContent(txtFileModel.name); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); + contentServicesPage.versionManagerContent(txtFileModel.name); done(); }); diff --git a/e2e/content-services/version/version-smoke-tests.e2e.ts b/e2e/content-services/version/version-smoke-tests.e2e.ts index 5cc34c41bd..49af53ec45 100644 --- a/e2e/content-services/version/version-smoke-tests.e2e.ts +++ b/e2e/content-services/version/version-smoke-tests.e2e.ts @@ -19,7 +19,6 @@ import { browser } from 'protractor'; import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { VersionManagePage } from '../../pages/adf/versionManagerPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; @@ -28,16 +27,17 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { Util } from '../../util/util'; +import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Version component', () => { let txtUploadedFile; const loginPage = new LoginPage(); const contentServicesPage = new ContentServicesPage(); - const contentListPage = new ContentListPage(); + const navigationBarPage = new NavigationBarPage(); const versionManagePage = new VersionManagePage(); let acsUser = new AcsUserModel(); @@ -89,8 +89,9 @@ describe('Version component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); - contentListPage.versionManagerContent(txtFileModel.name); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); + contentServicesPage.versionManagerContent(txtFileModel.name); done(); }); diff --git a/e2e/core/card-view/aspect-oriented-config.e2e.ts b/e2e/core/card-view/aspect-oriented-config.e2e.ts index b4070736df..1ed8740e8e 100644 --- a/e2e/core/card-view/aspect-oriented-config.e2e.ts +++ b/e2e/core/card-view/aspect-oriented-config.e2e.ts @@ -29,7 +29,7 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { check } from '../../util/material'; @@ -42,6 +42,8 @@ describe('Aspect oriented config', () => { const navigationBarPage = new NavigationBarPage(); const configEditorPage = new ConfigEditorPage(); let contentServicesPage = new ContentServicesPage(); + let modelOneName = 'modelOne', emptyAspectName = 'emptyAspect'; + let defaultModel = 'cm', defaultEmptyPropertiesAspect = 'taggable', aspectName = 'Taggable'; let acsUser = new AcsUserModel(); @@ -61,14 +63,32 @@ describe('Aspect oriented config', () => { await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + try { + await this.alfrescoJsApi.core.customModelApi.createCustomModel('ACTIVE', modelOneName, modelOneName, modelOneName, modelOneName); + } catch (e) { + } + + try { + await this.alfrescoJsApi.core.customModelApi.createCustomAspect(modelOneName, emptyAspectName, null, emptyAspectName, emptyAspectName); + } catch (e) { + } + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); await this.alfrescoJsApi.login(acsUser.id, acsUser.password); - await uploadActions.uploadFile(this.alfrescoJsApi, pngFileModel.location, pngFileModel.name, '-my-'); + let uploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, pngFileModel.location, pngFileModel.name, '-my-'); loginPage.loginToContentServicesUsingUserModel(acsUser); + let aspects = await this.alfrescoJsApi.core.nodesApi.getNode(uploadedFile.entry.id); + + aspects.entry.aspectNames.push(modelOneName.concat(':', emptyAspectName)); + + aspects.entry.aspectNames.push(defaultModel.concat(':', defaultEmptyPropertiesAspect)); + + await this.alfrescoJsApi.core.nodesApi.updateNode(uploadedFile.entry.id, {'aspectNames': aspects.entry.aspectNames}); + done(); }); @@ -88,7 +108,7 @@ describe('Aspect oriented config', () => { it('[C261117] Should be possible restrict the display properties of one an aspect', () => { - configEditorPage.enterConfiguration('{ "presets": {' + + configEditorPage.enterBigConfigurationText('{ "presets": {' + ' "default": [{' + ' "title": "IMAGE",' + ' "items": [' + @@ -123,7 +143,7 @@ describe('Aspect oriented config', () => { it('[C260185] Should ignore not existing aspect when present in the configuration', () => { - configEditorPage.enterConfiguration(' {' + + configEditorPage.enterBigConfigurationText(' {' + ' "presets": {' + ' "default": {' + ' "exif:exif": "*",' + @@ -152,7 +172,7 @@ describe('Aspect oriented config', () => { it('[C260183] Should show all the aspect if the content-metadata configuration is NOT provided', () => { - configEditorPage.enterConfiguration('{ }'); + configEditorPage.enterBigConfigurationText('{ }'); configEditorPage.clickSaveButton(); @@ -168,15 +188,11 @@ describe('Aspect oriented config', () => { metadataViewPage.checkMetadataGroupIsPresent('EXIF'); metadataViewPage.checkMetadataGroupIsPresent('properties'); metadataViewPage.checkMetadataGroupIsPresent('Versionable'); - metadataViewPage.checkMetadataGroupIsPresent('Titled'); - metadataViewPage.checkMetadataGroupIsPresent('Auditable'); - metadataViewPage.checkMetadataGroupIsPresent('Author'); - metadataViewPage.checkMetadataGroupIsPresent('Content'); }); it('[C260182] Should show all the aspects if the default configuration contains the star symbol', () => { - configEditorPage.enterConfiguration('{' + + configEditorPage.enterBigConfigurationText('{' + ' "presets": {' + ' "default": "*"' + ' }' + @@ -197,15 +213,11 @@ describe('Aspect oriented config', () => { metadataViewPage.checkMetadataGroupIsPresent('EXIF'); metadataViewPage.checkMetadataGroupIsPresent('properties'); metadataViewPage.checkMetadataGroupIsPresent('Versionable'); - metadataViewPage.checkMetadataGroupIsPresent('Titled'); - metadataViewPage.checkMetadataGroupIsPresent('Auditable'); - metadataViewPage.checkMetadataGroupIsPresent('Author'); - metadataViewPage.checkMetadataGroupIsPresent('Content'); }); it('[C268899] Should be possible use a Translation key as Title of a metadata group', () => { - configEditorPage.enterConfiguration('{' + + configEditorPage.enterBigConfigurationText('{' + ' "presets": {' + ' "default": [' + ' {' + @@ -221,11 +233,8 @@ describe('Aspect oriented config', () => { ' "title": "GROUP-TITLE2-TRANSLATION-KEY",' + ' "items": [' + ' {' + - ' "aspect": "kitten:food",' + - ' "properties": [' + - ' "kitten:favourite-food",' + - ' "kitten:recommended-food"' + - ' ]' + + ' "aspect": "exif:exif",' + + ' "properties": "*"' + ' }' + ' ]' + ' }' + @@ -255,7 +264,7 @@ describe('Aspect oriented config', () => { it('[C279968] Should be possible use a custom preset', () => { - configEditorPage.enterConfiguration('{' + + configEditorPage.enterBigConfigurationText('{' + ' "presets": {' + ' "custom-preset": {' + ' "exif:exif": "*",' + @@ -284,4 +293,58 @@ describe('Aspect oriented config', () => { metadataViewPage.checkMetadataGroupIsPresent('EXIF'); metadataViewPage.checkMetadataGroupIsPresent('Versionable'); }); + + it('[C299186] The aspect without properties is not displayed', () => { + + configEditorPage.enterBigConfigurationText('{' + + ' "presets": { "' + modelOneName + + ' ": { "' + modelOneName + ':' + emptyAspectName + + ' ":"*"' + + ' }' + + ' }' + + '}'); + + configEditorPage.clickSaveButton(); + + navigationBarPage.clickContentServicesButton(); + + viewerPage.viewFile(pngFileModel.name); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + metadataViewPage.clickOnPropertiesTab(); + + metadataViewPage.informationButtonIsDisplayed(); + metadataViewPage.clickOnInformationButton(); + + metadataViewPage.checkMetadataGroupIsNotPresent(emptyAspectName); + }); + + it('[C299187] The aspect with empty properties is displayed when edit', () => { + + configEditorPage.enterBigConfigurationText('{' + + ' "presets": { "' + defaultModel + + ' ": { "' + defaultModel + ':' + defaultEmptyPropertiesAspect + + ' ":"*"' + + ' }' + + ' }' + + '}'); + + configEditorPage.clickSaveButton(); + + navigationBarPage.clickContentServicesButton(); + + viewerPage.viewFile(pngFileModel.name); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + metadataViewPage.clickOnPropertiesTab(); + + metadataViewPage.informationButtonIsDisplayed(); + metadataViewPage.clickOnInformationButton(); + + metadataViewPage.checkMetadataGroupIsNotPresent(aspectName); + + metadataViewPage.editIconClick(); + + metadataViewPage.checkMetadataGroupIsPresent(aspectName); + }); }); diff --git a/e2e/core/card-view/metadata-permissions.e2e.ts b/e2e/core/card-view/metadata-permissions.e2e.ts index 281a6d04f4..ff95461dd5 100644 --- a/e2e/core/card-view/metadata-permissions.e2e.ts +++ b/e2e/core/card-view/metadata-permissions.e2e.ts @@ -26,7 +26,7 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { Util } from '../../util/util'; diff --git a/e2e/core/card-view/metadata-properties.e2e.ts b/e2e/core/card-view/metadata-properties.e2e.ts index 7d2840276e..b087b87a30 100644 --- a/e2e/core/card-view/metadata-properties.e2e.ts +++ b/e2e/core/card-view/metadata-properties.e2e.ts @@ -16,7 +16,6 @@ */ import { LoginPage } from '../../pages/adf/loginPage'; -import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { ViewerPage } from '../../pages/adf/viewerPage'; import { MetadataViewPage } from '../../pages/adf/metadataViewPage'; @@ -26,9 +25,11 @@ import { FileModel } from '../../models/ACS/fileModel'; import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { check, uncheck } from '../../util/material'; +import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; +import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; describe('CardView Component - properties', () => { @@ -46,9 +47,10 @@ describe('CardView Component - properties', () => { }; let loginPage = new LoginPage(); - let contentServicesPage = new ContentServicesPage(); + let navigationBarPage = new NavigationBarPage(); let viewerPage = new ViewerPage(); let metadataViewPage = new MetadataViewPage(); + const contentServicesPage = new ContentServicesPage(); let acsUser = new AcsUserModel(); @@ -80,7 +82,8 @@ describe('CardView Component - properties', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); done(); }); diff --git a/e2e/core/card-view/metadata-smoke-tests.e2e.ts b/e2e/core/card-view/metadata-smoke-tests.e2e.ts index 5a6a3c8d8e..623ce61199 100644 --- a/e2e/core/card-view/metadata-smoke-tests.e2e.ts +++ b/e2e/core/card-view/metadata-smoke-tests.e2e.ts @@ -21,7 +21,6 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { ViewerPage } from '../../pages/adf/viewerPage'; import { MetadataViewPage } from '../../pages/adf/metadataViewPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { FileModel } from '../../models/ACS/fileModel'; @@ -30,8 +29,9 @@ import TestConfig = require('../../test.config'); import resources = require('../../util/resources'); import dateFormat = require('dateformat'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; +import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Metadata component', () => { @@ -52,7 +52,7 @@ describe('Metadata component', () => { const contentServicesPage = new ContentServicesPage(); const viewerPage = new ViewerPage(); const metadataViewPage = new MetadataViewPage(); - const contentListPage = new ContentListPage(); + const navigationBarPage = new NavigationBarPage(); let acsUser = new AcsUserModel(); @@ -87,7 +87,8 @@ describe('Metadata component', () => { pngFileModel.update(pngUploadedFile.entry); loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); done(); }); @@ -233,7 +234,7 @@ describe('Metadata component', () => { expect(metadataViewPage.getPropertyText('properties.cm:description')).toEqual('check author example description'); loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); await browser.get(fileUrl); @@ -291,14 +292,14 @@ describe('Metadata component', () => { }); it('[C261157] Should be possible use the metadata component When the node is a Folder', () => { - contentListPage.metadataContent(folderName); + contentServicesPage.metadataContent(folderName); expect(metadataViewPage.getPropertyText('name')).toEqual(folderName); expect(metadataViewPage.getPropertyText('createdByUser.displayName')).toEqual(acsUser.firstName + ' ' + acsUser.lastName); }); it('[C261158] Should be possible edit the metadata When the node is a Folder', () => { - contentListPage.metadataContent(folderName); + contentServicesPage.metadataContent(folderName); browser.controlFlow().execute(async () => { await metadataViewPage.editIconClick(); diff --git a/e2e/core/datatable/data-table-component-selection.e2e.ts b/e2e/core/datatable/data-table-component-selection.e2e.ts index d7a47ebe58..5cf971315a 100644 --- a/e2e/core/datatable/data-table-component-selection.e2e.ts +++ b/e2e/core/datatable/data-table-component-selection.e2e.ts @@ -16,11 +16,12 @@ */ import { LoginPage } from '../../pages/adf/loginPage'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTablePage } from '../../pages/adf/demo-shell/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import TestConfig = require('../../test.config'); import { AcsUserModel } from '../../models/ACS/acsUserModel'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Datatable component - selection', () => { @@ -29,6 +30,7 @@ describe('Datatable component - selection', () => { let loginPage = new LoginPage(); let acsUser = new AcsUserModel(); let navigationBarPage = new NavigationBarPage(); + let dataTableComponent = new DataTableComponentPage(); beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -49,21 +51,21 @@ describe('Datatable component - selection', () => { it('[C213258] Should be possible change the selection modes when change the selectionMode property', () => { dataTablePage.selectRow('2'); - dataTablePage.checkRowIsSelected('2'); + dataTableComponent.checkRowIsSelected('Id', '2'); dataTablePage.getNumberOfSelectedRows().then((result) => { expect(result).toEqual(1); }); dataTablePage.selectRow('3'); - dataTablePage.checkRowIsSelected('3'); + dataTableComponent.checkRowIsSelected('Id', '3'); dataTablePage.getNumberOfSelectedRows().then((result) => { expect(result).toEqual(1); }); dataTablePage.selectSelectionMode('Multiple'); dataTablePage.selectRow('1'); - dataTablePage.checkRowIsSelected('1'); + dataTableComponent.checkRowIsSelected('Id', '1'); dataTablePage.selectRowWithKeyboard('3'); - dataTablePage.checkRowIsSelected('1'); - dataTablePage.checkRowIsSelected('3'); + dataTableComponent.checkRowIsSelected('Id', '1'); + dataTableComponent.checkRowIsSelected('Id', '3'); dataTablePage.checkRowIsNotSelected('2'); dataTablePage.checkRowIsNotSelected('4'); dataTablePage.selectSelectionMode('None'); diff --git a/e2e/core/datatable/data-table-component.e2e.ts b/e2e/core/datatable/data-table-component.e2e.ts index 5c9cff3497..91f9f1ff18 100644 --- a/e2e/core/datatable/data-table-component.e2e.ts +++ b/e2e/core/datatable/data-table-component.e2e.ts @@ -16,19 +16,21 @@ */ import { LoginPage } from '../../pages/adf/loginPage'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTablePage } from '../../pages/adf/demo-shell/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; describe('Datatable component', () => { - let dataTablePage = new DataTablePage(); - let loginPage = new LoginPage(); - let acsUser = new AcsUserModel(); - let navigationBarPage = new NavigationBarPage(); + const dataTablePage = new DataTablePage(); + const loginPage = new LoginPage(); + const acsUser = new AcsUserModel(); + const navigationBarPage = new NavigationBarPage(); + const dataTableComponent = new DataTableComponentPage(); beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -48,11 +50,11 @@ describe('Datatable component', () => { }); it('[C91314] Should be possible add new row to the table', () => { - dataTablePage.getNumberOfRows().then((result) => { + dataTableComponent.numberOfRows().then((result) => { dataTablePage.addRow(); - expect(dataTablePage.getNumberOfRows()).toEqual(result + 1); + expect(dataTableComponent.numberOfRows()).toEqual(result + 1); dataTablePage.addRow(); - expect(dataTablePage.getNumberOfRows()).toEqual(result + 2); + expect(dataTableComponent.numberOfRows()).toEqual(result + 2); }); }); @@ -65,11 +67,11 @@ describe('Datatable component', () => { }); it('[C277314] Should filter the table rows when the input filter is passed', () => { - expect(dataTablePage.getNumberOfRows()).toEqual(4); + expect(dataTableComponent.numberOfRows()).toEqual(4); dataTablePage.insertFilter('Name'); - expect(dataTablePage.getNumberOfRows()).toEqual(3); + expect(dataTableComponent.numberOfRows()).toEqual(3); dataTablePage.insertFilter('I'); - expect(dataTablePage.getNumberOfRows()).toEqual(1); + expect(dataTableComponent.numberOfRows()).toEqual(1); }); }); diff --git a/e2e/core/error-component.e2e.ts b/e2e/core/error-component.e2e.ts index 48a872b126..d2782b176e 100644 --- a/e2e/core/error-component.e2e.ts +++ b/e2e/core/error-component.e2e.ts @@ -18,7 +18,7 @@ import { LoginPage } from '../pages/adf/loginPage'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { ErrorPage } from '../pages/adf/errorPage'; import { browser } from '../../node_modules/protractor'; diff --git a/e2e/core/header-component.e2e.ts b/e2e/core/header-component.e2e.ts index 19e90a0658..bd3df3c73b 100644 --- a/e2e/core/header-component.e2e.ts +++ b/e2e/core/header-component.e2e.ts @@ -17,11 +17,11 @@ import { LoginPage } from '../pages/adf/loginPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import { HeaderPage } from '../pages/adf/core/headerPage'; +import { HeaderPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; describe('Header Component', () => { diff --git a/e2e/core/icons-component.e2e.ts b/e2e/core/icons-component.e2e.ts index 397569e641..07a655d3ef 100644 --- a/e2e/core/icons-component.e2e.ts +++ b/e2e/core/icons-component.e2e.ts @@ -21,7 +21,7 @@ import { IconsPage } from '../pages/adf/iconsPage'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; describe('Universal Icon component', function () { diff --git a/e2e/core/infinite-scrolling.e2e.ts b/e2e/core/infinite-scrolling.e2e.ts index 983e32671f..3aacd5769f 100644 --- a/e2e/core/infinite-scrolling.e2e.ts +++ b/e2e/core/infinite-scrolling.e2e.ts @@ -17,6 +17,9 @@ import { LoginPage } from '../pages/adf/loginPage'; import { ContentServicesPage } from '../pages/adf/contentServicesPage'; +import { InfinitePaginationPage } from '../pages/adf/core/infinitePaginationPage'; +import { ConfigEditorPage } from '../pages/adf/configEditorPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import { FolderModel } from '../models/ACS/folderModel'; @@ -24,19 +27,24 @@ import { FolderModel } from '../models/ACS/folderModel'; import TestConfig = require('../test.config'); import { Util } from '../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; describe('Enable infinite scrolling', () => { - let loginPage = new LoginPage(); - let contentServicesPage = new ContentServicesPage(); + const loginPage = new LoginPage(); + const contentServicesPage = new ContentServicesPage(); + const infinitePaginationPage = new InfinitePaginationPage(); + const configEditorPage = new ConfigEditorPage(); + const navigationBarPage = new NavigationBarPage(); let acsUser = new AcsUserModel(); let folderModel = new FolderModel({ 'name': 'folderOne' }); - let fileNames = [], nrOfFiles = 30; - let fileNum = 0; + let fileNames = [], nrOfFiles = 30, deleteFileNames = [], nrOfDeletedFiles = 22; + let deleteUploaded; + let pageSize = 20; + let emptyFolderModel; let files = { base: 'newFile', @@ -57,25 +65,94 @@ describe('Enable infinite scrolling', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - contentServicesPage.goToDocumentList(); - fileNames = Util.generateSequenceFiles(1, nrOfFiles, files.base, files.extension); + deleteFileNames = Util.generateSequenceFiles(1, nrOfDeletedFiles, files.base, files.extension); await this.alfrescoJsApi.login(acsUser.id, acsUser.password); let folderUploadedModel = await uploadActions.createFolder(this.alfrescoJsApi, folderModel.name, '-my-'); + emptyFolderModel = await uploadActions.createFolder(this.alfrescoJsApi, 'emptyFolder', '-my-'); await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderUploadedModel.entry.id); + deleteUploaded = await uploadActions.createFolder(this.alfrescoJsApi, 'deleteFolder', '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, deleteFileNames, deleteUploaded.entry.id); + + done(); + }); + + beforeEach(async (done) => { + navigationBarPage.clickContentServicesButton(); + contentServicesPage.checkAcsContainer(); done(); }); it('[C260484] Should be possible to enable infinite scrolling', () => { - contentServicesPage.navigateToFolder(folderModel.name); + contentServicesPage.doubleClickRow(folderModel.name); contentServicesPage.enableInfiniteScrolling(); - contentServicesPage.clickLoadMoreButton(); - for (fileNum; fileNum < nrOfFiles; fileNum++) { - contentServicesPage.checkContentIsDisplayed(fileNames[fileNum]); + infinitePaginationPage.clickLoadMoreButton(); + for (let i = 0; i < nrOfFiles; i++) { + contentServicesPage.checkContentIsDisplayed(fileNames[i]); } }); + + it('[C268165] Delete folder when infinite scrolling is enabled', () => { + contentServicesPage.doubleClickRow(deleteUploaded.entry.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + contentServicesPage.enableInfiniteScrolling(); + infinitePaginationPage.clickLoadMoreButton(); + for (let i = 0; i < nrOfDeletedFiles; i++) { + contentServicesPage.checkContentIsDisplayed(deleteFileNames[i]); + } + expect(contentServicesPage.getContentList().dataTablePage().numberOfRows()).toEqual(nrOfDeletedFiles); + + contentServicesPage.deleteContent(deleteFileNames[nrOfDeletedFiles - 1]); + contentServicesPage.checkContentIsNotDisplayed(deleteFileNames[nrOfDeletedFiles - 1]); + + for (let i = 0; i < nrOfDeletedFiles - 1; i++) { + contentServicesPage.checkContentIsDisplayed(deleteFileNames[i]); + } + }); + + it('[C299201] Should use default pagination settings for infinite pagination', () => { + navigationBarPage.clickContentServicesButton(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.doubleClickRow(folderModel.name); + + contentServicesPage.enableInfiniteScrolling(); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(pageSize); + infinitePaginationPage.clickLoadMoreButton(); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(nrOfFiles); + + infinitePaginationPage.checkLoadMoreButtonIsNotDisplayed(); + }); + + it('[C299202] Should not display load more button when all the files are already displayed', () => { + navigationBarPage.clickConfigEditorButton(); + configEditorPage.clickInfinitePaginationConfiguration(); + configEditorPage.clickClearButton(); + configEditorPage.enterConfiguration('30'); + configEditorPage.clickSaveButton(); + + navigationBarPage.clickContentServicesButton(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.doubleClickRow(folderModel.name); + + contentServicesPage.enableInfiniteScrolling(); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(nrOfFiles); + + infinitePaginationPage.checkLoadMoreButtonIsNotDisplayed(); + }); + + it('[C299203] Should not display load more button when a folder is empty', () => { + navigationBarPage.clickContentServicesButton(); + contentServicesPage.checkAcsContainer(); + + contentServicesPage.doubleClickRow(emptyFolderModel.entry.name); + + infinitePaginationPage.checkLoadMoreButtonIsNotDisplayed(); + }); + }); diff --git a/e2e/core/login/login-component.e2e.ts b/e2e/core/login/login-component.e2e.ts index 9d838e8a14..226ab74a62 100644 --- a/e2e/core/login/login-component.e2e.ts +++ b/e2e/core/login/login-component.e2e.ts @@ -22,24 +22,26 @@ import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { ProcessServicesPage } from '../../pages/adf/process-services/processServicesPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; -import { UserInfoDialog } from '../../pages/adf/dialog/userInfoDialog'; +import { UserInfoPage } from '@alfresco/adf-testing'; import TestConfig = require('../../test.config'); import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { SettingsPage } from '../../pages/adf/settingsPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { Util } from '../../util/util'; +import { ErrorPage } from '../../pages/adf/errorPage'; describe('Login component', () => { let settingsPage = new SettingsPage(); let processServicesPage = new ProcessServicesPage(); let navigationBarPage = new NavigationBarPage(); - let userInfoDialog = new UserInfoDialog(); + let userInfoPage = new UserInfoPage(); let contentServicesPage = new ContentServicesPage(); let loginPage = new LoginPage(); + let errorPage = new ErrorPage(); let adminUserModel = new AcsUserModel({ 'id': TestConfig.adf.adminUser, 'password': TestConfig.adf.adminPassword @@ -54,6 +56,8 @@ describe('Login component', () => { password: 'Enter your password to sign in', required: 'Required' }; + let invalidUsername = 'invaliduser'; + let invalidPassword = 'invalidpassword'; beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -72,14 +76,22 @@ describe('Login component', () => { it('[C276746] Should display the right information in user-info when a different users logs in', () => { loginPage.loginToContentServicesUsingUserModel(userA); - navigationBarPage.clickUserProfile(); - expect(userInfoDialog.getContentHeaderTitle()).toEqual(userA.firstName + ' ' + userA.lastName); - expect(userInfoDialog.getContentEmail()).toEqual(userA.email); + userInfoPage.clickUserProfile(); + expect(userInfoPage.getContentHeaderTitle()).toEqual(userA.firstName + ' ' + userA.lastName); + expect(userInfoPage.getContentEmail()).toEqual(userA.email); loginPage.loginToContentServicesUsingUserModel(userB); - navigationBarPage.clickUserProfile(); - expect(userInfoDialog.getContentHeaderTitle()).toEqual(userB.firstName + ' ' + userB.lastName); - expect(userInfoDialog.getContentEmail()).toEqual(userB.email); + userInfoPage.clickUserProfile(); + expect(userInfoPage.getContentHeaderTitle()).toEqual(userB.firstName + ' ' + userB.lastName); + expect(userInfoPage.getContentEmail()).toEqual(userB.email); + }); + + it('[C299206] Should redirect the user without the right access role on a forbidden page', () => { + loginPage.loginToContentServicesUsingUserModel(userA); + navigationBarPage.navigateToProcessServicesCloudPage(); + expect(errorPage.getErrorCode()).toBe('403'); + expect(errorPage.getErrorTitle()).toBe('You don\'t have permission to access this server.'); + expect(errorPage.getErrorDescription()).toBe('You\'re not allowed access to this resource on the server.'); }); it('[C260036] Should require username', () => { @@ -250,4 +262,17 @@ describe('Login component', () => { loginPage.checkLoginImgURL('https://rawgit.com/Alfresco/alfresco-ng2-components/master/assets/angular2.png'); }); + it('[C291854] Should be possible login in valid credentials', () => { + browser.get(TestConfig.adf.url); + loginPage.waitForElements(); + expect(loginPage.getSignInButtonIsEnabled()).toBe(false); + loginPage.enterUsername(invalidUsername); + expect(loginPage.getSignInButtonIsEnabled()).toBe(false); + loginPage.enterPassword(invalidPassword); + expect(loginPage.getSignInButtonIsEnabled()).toBe(true); + loginPage.clickSignInButton(); + expect(loginPage.getLoginError()).toEqual(errorMessages.invalid_credentials); + loginPage.login(adminUserModel.id, adminUserModel.password); + }); + }); diff --git a/e2e/core/login/login-sso/login-sso.e2e.ts b/e2e/core/login/login-sso/login-sso.e2e.ts index 62efdcbc30..f55e61bbfc 100644 --- a/e2e/core/login/login-sso/login-sso.e2e.ts +++ b/e2e/core/login/login-sso/login-sso.e2e.ts @@ -15,34 +15,91 @@ * limitations under the License. */ -import { LoginSSOPage } from '../../../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../../../pages/adf/settingsPage'; import TestConfig = require('../../../test.config'); import { browser } from 'protractor'; import { NavigationBarPage } from '../../../pages/adf/navigationBarPage'; +import { LoginPage } from '../../../pages/adf/loginPage'; describe('Login component - SSO', () => { const settingsPage = new SettingsPage(); - const loginApsPage = new LoginSSOPage(); + const loginSSOPage = new LoginSSOPage(); + const loginPage = new LoginPage(); const navigationBarPage = new NavigationBarPage(); - let silentLogin; + let silentLogin, implicitFlow; - afterEach(() => { + describe('Login component - SSO implicit Flow', () => { + + afterEach(() => { + navigationBarPage.clickLogoutButton(); + browser.executeScript('window.sessionStorage.clear();'); + browser.executeScript('window.localStorage.clear();'); + }); + + it('[C261050] Should be possible login with SSO', () => { + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false, true, 'alfresco'); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + }); + + it('[C280667] Should be redirect directly to keycloak without show the login page with silent login', () => { + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, true, true, 'alfresco'); + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + }); + }); + + describe('SSO Login Error for login component', () => { + + it('[C299205] Should display the login error message when the SSO identity service is wrongly configured', () => { + settingsPage.setProviderEcmSso(TestConfig.adf.url, 'http://aps22/auth/realms/alfresco', TestConfig.adf.hostIdentity, false, true, 'alfresco'); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.checkLoginErrorIsDisplayed(); + expect(loginSSOPage.getLoginErrorMessage()).toContain('SSO Authentication server unreachable'); + }); + }); + + describe('Login component - SSO Grant type password (implicit flow false)', () => { + + it('[C299158] Should be possible to login with SSO, with grant type password (Implicit Flow false)', () => { + implicitFlow = false; + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin, implicitFlow, 'alfresco'); + + loginPage.waitForElements(); + + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin, implicitFlow, 'alfresco'); + browser.ignoreSynchronization = true; + + loginPage.enterUsername(TestConfig.adf.adminEmail); + loginPage.enterPassword(TestConfig.adf.adminPassword); + loginPage.clickSignInButton(); + + let isDisplayed = false; + + browser.wait(() => { + loginPage.header.isDisplayed().then( + () => { + isDisplayed = true; + }, + () => { + isDisplayed = false; + } + ); + return isDisplayed; + }, TestConfig.main.timeout, 'Element is not visible ' + loginPage.header.locator()); + }); + }); + + it('[C280665] Should be possible change the logout redirect URL', () => { + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false, true, 'alfresco', '/login'); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); navigationBarPage.clickLogoutButton(); - browser.executeScript('window.sessionStorage.clear();'); - browser.executeScript('window.localStorage.clear();'); - }); - it('[C261050] Should be possible login in the PS with SSO', () => { - silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); - loginApsPage.clickOnSSOButton(); - loginApsPage.loginAPS(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - }); + browser.getCurrentUrl().then((actualUrl) => { + expect(actualUrl).toEqual(TestConfig.adf.url + '/login'); + }); - it('[C280667] Should be redirect directly to keycloak without show the login page with silent login', () => { - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity); - loginApsPage.loginAPS(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); }); }); diff --git a/e2e/core/login/redirection.e2e.ts b/e2e/core/login/redirection.e2e.ts index 357119e4c0..3f464b445a 100644 --- a/e2e/core/login/redirection.e2e.ts +++ b/e2e/core/login/redirection.e2e.ts @@ -27,10 +27,11 @@ import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { SettingsPage } from '../../pages/adf/settingsPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { Util } from '../../util/util'; import { UploadActions } from '../../actions/ACS/upload.actions'; +import { LogoutPage } from '../../pages/adf/demo-shell/logoutPage'; describe('Login component - Redirect', () => { @@ -47,6 +48,7 @@ describe('Login component - Redirect', () => { }); let uploadedFolder; let uploadActions = new UploadActions(); + const logoutPage = new LogoutPage(); beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -119,11 +121,11 @@ describe('Login component - Redirect', () => { expect(actualUrl).toEqual(TestConfig.adf.url + '/files/' + uploadedFolder.entry.id); }); - browser.driver.sleep(1000); + contentServicesPage.waitForTableBody(); navigationBarPage.clickLogoutButton(); - browser.driver.sleep(1000); + logoutPage.checkLogoutSectionIsDisplayed(); navigationBarPage.openContentServicesFolder(uploadedFolder.entry.id); @@ -132,7 +134,43 @@ describe('Login component - Redirect', () => { loginPage.enterPassword(user.password); loginPage.clickSignInButton(); - browser.driver.sleep(1000); + navigationBarPage.checkMenuButtonIsDisplayed(); + + browser.getCurrentUrl().then((actualUrl) => { + expect(actualUrl).toEqual(TestConfig.adf.url + '/files/' + uploadedFolder.entry.id); + }); + }); + + }); + + it('[C299161] Should redirect user to requested URL after reloading login page', () => { + settingsPage.setProviderEcm(); + loginPage.login(user.id, user.password); + + browser.controlFlow().execute(async () => { + + navigationBarPage.openContentServicesFolder(uploadedFolder.entry.id); + + browser.getCurrentUrl().then((actualUrl) => { + expect(actualUrl).toEqual(TestConfig.adf.url + '/files/' + uploadedFolder.entry.id); + }); + + contentServicesPage.waitForTableBody(); + + navigationBarPage.clickLogoutButton(); + + logoutPage.checkLogoutSectionIsDisplayed(); + + navigationBarPage.openContentServicesFolder(uploadedFolder.entry.id); + loginPage.waitForElements(); + browser.refresh(); + loginPage.waitForElements(); + + loginPage.enterUsername(user.id); + loginPage.enterPassword(user.password); + loginPage.clickSignInButton(); + + navigationBarPage.checkMenuButtonIsDisplayed(); browser.getCurrentUrl().then((actualUrl) => { expect(actualUrl).toEqual(TestConfig.adf.url + '/files/' + uploadedFolder.entry.id); diff --git a/e2e/core/pagination-empty-current-page.e2e.ts b/e2e/core/pagination-empty-current-page.e2e.ts index 863dfbf716..ec2622d02e 100644 --- a/e2e/core/pagination-empty-current-page.e2e.ts +++ b/e2e/core/pagination-empty-current-page.e2e.ts @@ -18,27 +18,33 @@ import { LoginPage } from '../pages/adf/loginPage'; import { ContentServicesPage } from '../pages/adf/contentServicesPage'; import { PaginationPage } from '../pages/adf/paginationPage'; -import { Util } from '../util/util'; +import { ViewerPage } from '../pages/adf/viewerPage'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import { FolderModel } from '../models/ACS/folderModel'; +import { FileModel } from '../models/ACS/fileModel'; -import TestConfig = require('../test.config'); - -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; +import { Util } from '../util/util'; +import resources = require('../util/resources'); +import TestConfig = require('../test.config'); + describe('Pagination - returns to previous page when current is empty', () => { let loginPage = new LoginPage(); let contentServicesPage = new ContentServicesPage(); let paginationPage = new PaginationPage(); + let viewerPage = new ViewerPage(); let acsUser = new AcsUserModel(); let folderModel = new FolderModel({ 'name': 'folderOne' }); + let parentFolderModel = new FolderModel({ 'name': 'parentFolder' }); - let fileNames = [], nrOfFiles = 6; - let lastFile = 'newFile6.txt'; + let fileNames = [], nrOfFiles = 6, nrOfFolders = 5; + let lastFile = 'newFile6.txt', lastFolderResponse, pngFileUploaded; + let folderNames = ['t1', 't2', 't3', 't4', 't5', 't6']; let itemsPerPage = { five: '5', @@ -50,6 +56,11 @@ describe('Pagination - returns to previous page when current is empty', () => { extension: '.txt' }; + let pngFileInfo = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + }); + beforeAll(async (done) => { let uploadActions = new UploadActions(); @@ -68,8 +79,18 @@ describe('Pagination - returns to previous page when current is empty', () => { let folderUploadedModel = await uploadActions.createFolder(this.alfrescoJsApi, folderModel.name, '-my-'); + let parentFolderResponse = await uploadActions.createFolder(this.alfrescoJsApi, parentFolderModel.name, '-my-'); + + for (let i = 0; i < nrOfFolders; i++) { + await uploadActions.createFolder(this.alfrescoJsApi, folderNames[i], parentFolderResponse.entry.id); + } + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderUploadedModel.entry.id); + lastFolderResponse = await uploadActions.createFolder(this.alfrescoJsApi, folderNames[5], parentFolderResponse.entry.id); + + pngFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pngFileInfo.location, pngFileInfo.name, lastFolderResponse.entry.id); + loginPage.loginToContentServicesUsingUserModel(acsUser); contentServicesPage.goToDocumentList(); @@ -78,7 +99,7 @@ describe('Pagination - returns to previous page when current is empty', () => { }); it('[C274710] Should redirect to previous page when current is emptied', () => { - contentServicesPage.navigateToFolder(folderModel.name); + contentServicesPage.doubleClickRow(folderModel.name); contentServicesPage.checkAcsContainer(); contentServicesPage.waitForTableBody(); @@ -117,4 +138,30 @@ describe('Pagination - returns to previous page when current is empty', () => { }); + it('[C297494] Should display content when navigating to a non-empty folder not in the first page', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.doubleClickRow(parentFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + paginationPage.selectItemsPerPage(itemsPerPage.five); + + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + + paginationPage.clickOnNextPage(); + + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + contentServicesPage.doubleClickRow(lastFolderResponse.entry.name); + contentServicesPage.checkContentIsDisplayed(pngFileInfo.name); + + viewerPage.viewFile(pngFileUploaded.entry.name); + viewerPage.checkImgViewerIsDisplayed(); + viewerPage.clickCloseButton(); + }); }); diff --git a/e2e/core/user-info-component-cloud.e2e.ts b/e2e/core/user-info-component-cloud.e2e.ts index ff73d65401..9b1350f308 100644 --- a/e2e/core/user-info-component-cloud.e2e.ts +++ b/e2e/core/user-info-component-cloud.e2e.ts @@ -15,12 +15,12 @@ * limitations under the License. */ -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import TestConfig = require('../test.config'); import { browser } from 'protractor'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import { UserInfoDialog } from '../pages/adf/dialog/userInfoDialog'; +import { UserInfoPage } from '@alfresco/adf-testing'; import { Identity } from '../actions/APS-cloud/identity'; describe('User Info - SSO', () => { @@ -28,32 +28,32 @@ describe('User Info - SSO', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - const userInfoDialog = new UserInfoDialog(); + const userInfoPage = new UserInfoPage(); const identityService: Identity = new Identity(); let silentLogin, identityUser; beforeAll(async () => { - await identityService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + await identityService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword, 'alfresco'); identityUser = await identityService.createIdentityUser(); silentLogin = false; - settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + settingsPage.setProviderEcmSso(TestConfig.adf.url, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin, true, 'alfresco'); loginSSOPage.clickOnSSOButton(); browser.ignoreSynchronization = true; - loginSSOPage.loginAPS(identityUser['0'].username, identityUser['0'].password); + loginSSOPage.loginSSOIdentityService(identityUser.username, identityUser.password); }); - afterAll (() => { - identityService.deleteIdentityUser(identityUser[0].id); + afterAll(async () => { + await identityService.deleteIdentityUser(identityUser.id); }); it('[C290066] Should display UserInfo when login using SSO', () => { navigationBarPage.navigateToProcessServicesCloudPage(); - navigationBarPage.clickUserProfile(); - expect(userInfoDialog.getSsoHeaderTitle()).toEqual(identityUser['0'].firstName + ' ' + identityUser['0'].lastName); - expect(userInfoDialog.getSsoTitle()).toEqual(identityUser['0'].firstName + ' ' + identityUser['0'].lastName); - expect(userInfoDialog.getSsoEmail()).toEqual(identityUser['0'].email); - userInfoDialog.closeUserProfile(); + userInfoPage.clickUserProfile(); + expect(userInfoPage.getSsoHeaderTitle()).toEqual(identityUser.firstName + ' ' + identityUser.lastName); + expect(userInfoPage.getSsoTitle()).toEqual(identityUser.firstName + ' ' + identityUser.lastName); + expect(userInfoPage.getSsoEmail()).toEqual(identityUser.email); + userInfoPage.closeUserProfile(); }); diff --git a/e2e/core/user-info-component.e2e.ts b/e2e/core/user-info-component.e2e.ts index 6e11c1c2dc..619e1056c7 100644 --- a/e2e/core/user-info-component.e2e.ts +++ b/e2e/core/user-info-component.e2e.ts @@ -17,8 +17,7 @@ import { SettingsPage } from '../pages/adf/settingsPage'; import { LoginPage } from '../pages/adf/loginPage'; -import { UserInfoDialog } from '../pages/adf/dialog/userInfoDialog'; -import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { UserInfoPage } from '@alfresco/adf-testing'; import { AcsUserModel } from '../models/ACS/acsUserModel'; import { FileModel } from '../models/ACS/fileModel'; @@ -28,7 +27,7 @@ import PeopleAPI = require('../restAPI/ACS/PeopleAPI'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; @@ -36,8 +35,7 @@ describe('User Info component', () => { let settingsPage = new SettingsPage(); let loginPage = new LoginPage(); - let navigationBarPage = new NavigationBarPage(); - let userInfoDialog = new UserInfoDialog(); + let userInfoPage = new UserInfoPage(); let processUserModel, contentUserModel; let acsAvatarFileModel = new FileModel({ 'name': resources.Files.PROFILE_IMAGES.ECM.file_name, @@ -78,37 +76,37 @@ describe('User Info component', () => { loginPage.goToLoginPage(); settingsPage.setProviderEcmBpm(); loginPage.login(contentUserModel.id, contentUserModel.password); - navigationBarPage.clickUserProfile(); + userInfoPage.clickUserProfile(); - expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); - expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + expect(userInfoPage.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoPage.getContentJobTitle()).toEqual(contentUserModel.jobTitle); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.clickOnContentServicesTab(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.clickOnContentServicesTab(); - expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); - expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + expect(userInfoPage.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoPage.getContentJobTitle()).toEqual(contentUserModel.jobTitle); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.clickOnProcessServicesTab(); - userInfoDialog.checkProcessServicesTabIsSelected(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.clickOnProcessServicesTab(); + userInfoPage.checkProcessServicesTabIsSelected(); - expect(userInfoDialog.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); - expect(userInfoDialog.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); - expect(userInfoDialog.getProcessEmail()).toEqual(processUserModel.email); + expect(userInfoPage.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoPage.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoPage.getProcessEmail()).toEqual(processUserModel.email); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.closeUserProfile(); }); it('[C260113] Should display UserInfo when Content Services is enabled and Process Services is disabled', () => { @@ -116,18 +114,18 @@ describe('User Info component', () => { settingsPage.setProviderEcm(); loginPage.login(contentUserModel.id, contentUserModel.password); - navigationBarPage.clickUserProfile(); - userInfoDialog.dialogIsDisplayed(); + userInfoPage.clickUserProfile(); + userInfoPage.dialogIsDisplayed(); - expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); - expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); - expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + expect(userInfoPage.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoPage.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoPage.getContentJobTitle()).toEqual(contentUserModel.jobTitle); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.closeUserProfile(); }); it('[C260115] Should display UserInfo when Process Services is enabled and Content Services is disabled', () => { @@ -135,18 +133,18 @@ describe('User Info component', () => { settingsPage.setProviderBpm(); loginPage.login(processUserModel.email, processUserModel.password); - navigationBarPage.clickUserProfile(); + userInfoPage.clickUserProfile(); - userInfoDialog.dialogIsDisplayed(); + userInfoPage.dialogIsDisplayed(); - expect(userInfoDialog.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); - expect(userInfoDialog.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); - expect(userInfoDialog.getProcessEmail()).toEqual(processUserModel.email); + expect(userInfoPage.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoPage.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoPage.getProcessEmail()).toEqual(processUserModel.email); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.closeUserProfile(); }); it('[C260117] Should display UserInfo with profile image uploaded in ACS', async(done) => { @@ -158,11 +156,11 @@ describe('User Info component', () => { loginPage.goToLoginPage(); settingsPage.setProviderEcm(); loginPage.login(contentUserModel.id, contentUserModel.password); - navigationBarPage.clickUserProfile(); + userInfoPage.clickUserProfile(); - userInfoDialog.checkACSProfileImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkACSProfileImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.closeUserProfile(); done(); }); @@ -175,12 +173,12 @@ describe('User Info component', () => { loginPage.goToLoginPage(); settingsPage.setProviderBpm(); loginPage.login(processUserModel.email, processUserModel.password); - navigationBarPage.clickUserProfile(); + userInfoPage.clickUserProfile(); - userInfoDialog.checkAPSProfileImage(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.initialImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkAPSProfileImage(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.initialImageNotDisplayed(); + userInfoPage.closeUserProfile(); }); it('[C260120] Should not display profile image in UserInfo when deleted in ACS', () => { @@ -190,11 +188,11 @@ describe('User Info component', () => { settingsPage.setProviderEcm(); loginPage.login(contentUserModel.id, contentUserModel.password); - navigationBarPage.clickUserProfile(); + userInfoPage.clickUserProfile(); - userInfoDialog.checkInitialImage(); - userInfoDialog.APSProfileImageNotDisplayed(); - userInfoDialog.ACSProfileImageNotDisplayed(); - userInfoDialog.closeUserProfile(); + userInfoPage.checkInitialImage(); + userInfoPage.APSProfileImageNotDisplayed(); + userInfoPage.ACSProfileImageNotDisplayed(); + userInfoPage.closeUserProfile(); }); }); diff --git a/e2e/core/viewer/viewer-component.e2e.ts b/e2e/core/viewer/viewer-component.e2e.ts index d40764da71..8f6c4eb104 100644 --- a/e2e/core/viewer/viewer-component.e2e.ts +++ b/e2e/core/viewer/viewer-component.e2e.ts @@ -21,8 +21,8 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { ViewerPage } from '../../pages/adf/viewerPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { ShareDialog } from '../../pages/adf/dialog/shareDialog'; +import { AboutPage } from '../../pages/adf/demo-shell/aboutPage'; import CONSTANTS = require('../../util/constants'); import resources = require('../../util/resources'); @@ -32,7 +32,7 @@ import { FileModel } from '../../models/ACS/fileModel'; import { FolderModel } from '../../models/ACS/folderModel'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; @@ -46,8 +46,9 @@ xdescribe('Viewer', () => { let site; let acsUser = new AcsUserModel(); let pngFileUploaded; - const contentList = new ContentListPage(); + const contentList = contentServicesPage.getDocumentList(); const shareDialog = new ShareDialog(); + const about = new AboutPage(); let pngFileInfo = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, @@ -117,7 +118,6 @@ xdescribe('Viewer', () => { await this.alfrescoJsApi.login(acsUser.id, acsUser.password); pngFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pngFileInfo.location, pngFileInfo.name, site.entry.guid); - done(); }); @@ -155,7 +155,7 @@ xdescribe('Viewer', () => { }); it('[C260517] Should be possible to open any Archive file', () => { - contentServicesPage.navigateToFolder('archive'); + contentServicesPage.doubleClickRow('archive'); uploadedArchives.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -190,7 +190,7 @@ xdescribe('Viewer', () => { }); it('[C280008] Should be possible to open any Excel file', () => { - contentServicesPage.navigateToFolder('excel'); + contentServicesPage.doubleClickRow('excel'); uploadedExcels.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -225,7 +225,7 @@ xdescribe('Viewer', () => { }); it('[C280009] Should be possible to open any PowerPoint file', () => { - contentServicesPage.navigateToFolder('ppt'); + contentServicesPage.doubleClickRow('ppt'); uploadedPpt.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -260,7 +260,7 @@ xdescribe('Viewer', () => { }); it('[C280010] Should be possible to open any Text file', () => { - contentServicesPage.navigateToFolder('text'); + contentServicesPage.doubleClickRow('text'); uploadedTexts.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -295,7 +295,7 @@ xdescribe('Viewer', () => { }); it('[C280011] Should be possible to open any Word file', () => { - contentServicesPage.navigateToFolder('word'); + contentServicesPage.doubleClickRow('word'); uploadedWords.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -330,7 +330,7 @@ xdescribe('Viewer', () => { }); it('[C280012] Should be possible to open any other Document supported extension', () => { - contentServicesPage.navigateToFolder('other'); + contentServicesPage.doubleClickRow('other'); uploadedOthers.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -369,7 +369,7 @@ xdescribe('Viewer', () => { }); it('[C279966] Should be possible to open any Image supported extension', () => { - contentServicesPage.navigateToFolder('images'); + contentServicesPage.doubleClickRow('images'); uploadedImages.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -379,7 +379,7 @@ xdescribe('Viewer', () => { } }); - contentServicesPage.navigateToFolder('images-rendition'); + contentServicesPage.doubleClickRow('images-rendition'); uploadedImgRenditionFolderInfo.forEach((currentFile) => { if (currentFile.entry.name !== '.DS_Store') { @@ -431,9 +431,10 @@ xdescribe('Viewer', () => { }); it('[C260106] Should be able to open a Word file shared via API', () => { - contentServicesPage.navigateToDocumentList(); + navigationBarPage.clickContentServicesButton(); + contentServicesPage.waitForTableBody(); - contentList.clickRowToSelect(wordFileInfo.name); + contentList.selectRow(wordFileInfo.name); contentServicesPage.clickShareButton(); shareDialog.checkDialogIsDisplayed(); shareDialog.clickShareLinkButton(); @@ -452,4 +453,45 @@ xdescribe('Viewer', () => { }); }); }); + + describe('Viewer - Code editor extension', () => { + + let jsFileInfo = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.JS.file_name, + 'location': resources.Files.ADF_DOCUMENTS.JS.file_location + }); + + let jsFileUploaded; + + beforeAll(async (done) => { + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + jsFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, jsFileInfo.location, jsFileInfo.name, '-my-'); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + done(); + }); + + afterAll(async (done) => { + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, jsFileUploaded.entry.id); + done(); + }); + + it('[C297698] Should be able to add an extension for code editor viewer', () => { + navigationBarPage.checkAboutButtonIsDisplayed(); + navigationBarPage.clickAboutButton(); + + about.checkMonacoPluginIsDisplayed(); + + navigationBarPage.clickContentServicesButton(); + + contentServicesPage.waitForTableBody(); + contentServicesPage.checkContentIsDisplayed(jsFileInfo.name); + contentServicesPage.doubleClickRow(jsFileInfo.name); + + viewerPage.checkCodeViewerIsDisplayed(); + }); + }); }); diff --git a/e2e/core/viewer/viewer-content-services-component.e2e.ts b/e2e/core/viewer/viewer-content-services-component.e2e.ts index cd3d2ca719..e3b65f7d28 100644 --- a/e2e/core/viewer/viewer-content-services-component.e2e.ts +++ b/e2e/core/viewer/viewer-content-services-component.e2e.ts @@ -28,7 +28,7 @@ import resources = require('../../util/resources'); import { FileModel } from '../../models/ACS/fileModel'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; describe('Content Services Viewer', () => { diff --git a/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts b/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts index fdada17c5f..99fb46e612 100644 --- a/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts +++ b/e2e/core/viewer/viewer-custom-toolbar-info-drawer.e2e.ts @@ -26,7 +26,7 @@ import resources = require('../../util/resources'); import { FileModel } from '../../models/ACS/fileModel'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; describe('Viewer', () => { diff --git a/e2e/core/viewer/viewer-properties.e2e.ts b/e2e/core/viewer/viewer-properties.e2e.ts index 7dffe577b8..ebfca1aa6b 100644 --- a/e2e/core/viewer/viewer-properties.e2e.ts +++ b/e2e/core/viewer/viewer-properties.e2e.ts @@ -21,14 +21,14 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { ContentServicesPage } from '../../pages/adf/contentServicesPage'; import { ViewerPage } from '../../pages/adf/viewerPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import resources = require('../../util/resources'); import { FileModel } from '../../models/ACS/fileModel'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; describe('Viewer - properties', () => { @@ -38,7 +38,7 @@ describe('Viewer - properties', () => { let contentServicesPage = new ContentServicesPage(); let loginPage = new LoginPage(); let navigationBarPage = new NavigationBarPage(); - let dataTable = new DataTablePage(); + let dataTable = new DataTableComponentPage(); let pngFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, @@ -189,18 +189,18 @@ describe('Viewer - properties', () => { viewerPage.clickCloseButton(); navigationBarPage.clickOverlayViewerButton(); - dataTable.doubleClickRow(fileForOverlay.name); + dataTable.doubleClickRow('Name', fileForOverlay.name); viewerPage.checkOverlayViewerIsDisplayed(); viewerPage.clickCloseButton(); - dataTable.doubleClickRow(pngFile.name); + dataTable.doubleClickRow('Name', pngFile.name); viewerPage.checkOverlayViewerIsDisplayed(); viewerPage.clickCloseButton(); viewerPage.disableOverlay(); - dataTable.doubleClickRow(fileForOverlay.name); + dataTable.doubleClickRow('Name', fileForOverlay.name); viewerPage.checkImgContainerIsDisplayed(); viewerPage.checkInlineViewerIsDisplayed(); - dataTable.doubleClickRow(pngFile.name); + dataTable.doubleClickRow('Name', pngFile.name); viewerPage.checkImgContainerIsDisplayed(); viewerPage.checkInlineViewerIsDisplayed(); }); diff --git a/e2e/insights/analytics-component.e2e.ts b/e2e/insights/analytics-component.e2e.ts index 559fed009b..047eab0933 100644 --- a/e2e/insights/analytics-component.e2e.ts +++ b/e2e/insights/analytics-component.e2e.ts @@ -24,8 +24,7 @@ import TestConfig = require('../test.config'); import { Tenant } from '../models/APS/tenant'; import { User } from '../models/APS/user'; -import AlfrescoApi = require('alfresco-js-api-node'); -import { browser } from 'protractor'; +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; describe('Analytics Smoke Test', () => { diff --git a/e2e/models/ACS/fileModel.ts b/e2e/models/ACS/fileModel.ts index e604803bc8..fe826a127f 100644 --- a/e2e/models/ACS/fileModel.ts +++ b/e2e/models/ACS/fileModel.ts @@ -34,6 +34,7 @@ export class FileModel { secondPageText = resources.Files.ADF_DOCUMENTS.PDF.second_page_text; lastPageNumber = resources.Files.ADF_DOCUMENTS.PDF.last_page_number; createdAt = ''; + password = ''; createdByUser = new CreatedByModel(); modifiedByUser = new CreatedByModel(); content: ContentModel = {}; diff --git a/e2e/pages/adf/commentsPage.ts b/e2e/pages/adf/commentsPage.ts index 8869b2f8a5..9fce3b0640 100644 --- a/e2e/pages/adf/commentsPage.ts +++ b/e2e/pages/adf/commentsPage.ts @@ -18,7 +18,7 @@ import { element, by } from 'protractor'; import { Util } from '../../util/util'; -import { TabsPage } from './material/tabsPage'; +import { TabsPage } from '@alfresco/adf-testing'; export class CommentsPage { diff --git a/e2e/pages/adf/configEditorPage.ts b/e2e/pages/adf/configEditorPage.ts index fee2d8b7dd..f77e165655 100644 --- a/e2e/pages/adf/configEditorPage.ts +++ b/e2e/pages/adf/configEditorPage.ts @@ -62,4 +62,39 @@ export class ConfigEditorPage { Util.waitUntilElementIsClickable(button); return button.click(); } + + clickProcessListCloudConfiguration() { + let button = element(by.id('adf-process-list-cloud-conf')); + Util.waitUntilElementIsVisible(button); + Util.waitUntilElementIsClickable(button); + return button.click(); + } + + clickEditProcessCloudConfiguration() { + let button = element(by.id('adf-edit-process-filter-conf')); + Util.waitUntilElementIsVisible(button); + Util.waitUntilElementIsClickable(button); + return button.click(); + } + + clickEditTaskConfiguration() { + let button = element(by.id('adf-edit-task-filter-conf')); + Util.waitUntilElementIsVisible(button); + Util.waitUntilElementIsClickable(button); + return button.click(); + } + + clickTaskListCloudConfiguration() { + let button = element(by.id('adf-task-list-cloud-conf')); + Util.waitUntilElementIsVisible(button); + Util.waitUntilElementIsClickable(button); + return button.click(); + } + + clickInfinitePaginationConfiguration() { + let button = element(by.id('adf-infinite-pagination-conf')); + Util.waitUntilElementIsVisible(button); + Util.waitUntilElementIsClickable(button); + return button.click(); + } } diff --git a/e2e/pages/adf/content-services/documentListPage.ts b/e2e/pages/adf/content-services/documentListPage.ts new file mode 100644 index 0000000000..0d20e62ddb --- /dev/null +++ b/e2e/pages/adf/content-services/documentListPage.ts @@ -0,0 +1,91 @@ +/*! + * @license + * Copyright 2019 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 { by, element, ElementFinder, browser } from 'protractor'; +import { DataTableComponentPage } from '../dataTableComponentPage'; +import { Util } from '../../../util/util'; + +export class DocumentListPage { + + rootElement: ElementFinder; + actionMenu = element(by.css('div[role="menu"]')); + optionButton = by.css('button[data-automation-id*="action_menu_"]'); + tableBody; + dataTable; + + constructor(rootElement: ElementFinder = element.all(by.css('adf-document-list')).first()) { + this.rootElement = rootElement; + this.dataTable = new DataTableComponentPage(this.rootElement); + this.tableBody = rootElement.all(by.css('div[class="adf-datatable-body"]')).first(); + } + + checkLockedIcon(content) { + let row = this.dataTable.getRowParentElement('Display name', content); + let lockIcon = row.element(by.cssContainingText('div[title="Lock"] mat-icon', 'lock')); + Util.waitUntilElementIsVisible(lockIcon); + return this; + } + + checkUnlockedIcon(content) { + let row = this.dataTable.getRowParentElement('Display name', content); + let lockIcon = row.element(by.cssContainingText('div[title="Lock"] mat-icon', 'lock_open')); + Util.waitUntilElementIsVisible(lockIcon); + return this; + } + + waitForTableBody() { + return Util.waitUntilElementIsVisible(this.tableBody); + } + + getTooltip(nodeName) { + return this.dataTable.getTooltip('Display name', nodeName); + } + + selectRow(nodeName) { + return this.dataTable.selectRow('Display name', nodeName); + } + + rightClickOnRow(nodeName) { + return this.dataTable.rightClickOnRow('Display name', nodeName); + } + + clickOnActionMenu(content) { + let row = this.dataTable.getRowParentElement('Display name', content); + row.element(this.optionButton).click(); + Util.waitUntilElementIsVisible(this.actionMenu); + browser.sleep(500); + return this; + } + + checkActionMenuIsNotDisplayed() { + Util.waitUntilElementIsNotVisible(this.actionMenu); + return this; + } + + dataTablePage() { + return new DataTableComponentPage(this.rootElement); + } + + getAllRowsColumnValues(column) { + return this.dataTable.getAllRowsColumnValues(column); + } + + doubleClickRow(nodeName) { + this.dataTable.doubleClickRow('Display name', nodeName); + return this; + } +} diff --git a/e2e/pages/adf/content-services/search/components/search-slider.page.ts b/e2e/pages/adf/content-services/search/components/search-slider.page.ts index 4728d64ac2..b1c920bc45 100644 --- a/e2e/pages/adf/content-services/search/components/search-slider.page.ts +++ b/e2e/pages/adf/content-services/search/components/search-slider.page.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { browser, by, protractor } from 'protractor'; +import { browser, by } from 'protractor'; import { Util } from '../../../../../util/util'; export class SearchSliderPage { diff --git a/e2e/pages/adf/contentServicesPage.ts b/e2e/pages/adf/contentServicesPage.ts index c2a68d8431..c95a4a7c98 100644 --- a/e2e/pages/adf/contentServicesPage.ts +++ b/e2e/pages/adf/contentServicesPage.ts @@ -17,25 +17,24 @@ import TestConfig = require('../../test.config'); import { Util } from '../../util/util'; -import { ContentListPage } from './dialog/contentListPage'; +import { DocumentListPage } from './content-services/documentListPage'; import { CreateFolderDialog } from './dialog/createFolderDialog'; import { CreateLibraryDialog } from './dialog/createLibraryDialog'; -import { NavigationBarPage } from './navigationBarPage'; import { NodeActions } from '../../actions/ACS/node.actions'; import { DropActions } from '../../actions/drop.actions'; import { by, element, protractor, $$, browser } from 'protractor'; import path = require('path'); +import { DateUtil } from '../../util/dateUtil'; export class ContentServicesPage { - contentList = new ContentListPage(); + contentList = new DocumentListPage(element.all(by.css('adf-upload-drag-area adf-document-list')).first()); createFolderDialog = new CreateFolderDialog(); nodeActions = new NodeActions(); createLibraryDialog = new CreateLibraryDialog(); dragAndDropAction = new DropActions(); uploadBorder = element(by.id('document-list-container')); - tableBody = element.all(by.css('adf-document-list div[class="adf-datatable-body"]')).first(); contentServices = element(by.css('a[data-automation-id="Content Services"]')); currentFolder = element(by.css('div[class*="adf-breadcrumb-item adf-active"] div')); createFolderButton = element(by.css('button[data-automation-id="create-new-folder"]')); @@ -46,7 +45,6 @@ export class ContentServicesPage { uploadMultipleFileButton = element(by.css('input[data-automation-id="upload-multiple-files"]')); uploadFolderButton = element(by.css('input[data-automation-id="uploadFolder"]')); errorSnackBar = element(by.css('simple-snack-bar[class*="mat-simple-snackbar"]')); - loadMoreButton = element(by.css('button[data-automation-id="adf-infinite-pagination-button"]')); emptyPagination = element(by.css('adf-pagination[class*="adf-pagination__empty"]')); dragAndDrop = element.all(by.css('adf-upload-drag-area div')).first(); nameHeader = element(by.css('div[data-automation-id="auto_id_name"] > span')); @@ -62,24 +60,98 @@ export class ContentServicesPage { emptyFolderImage = element(by.css('.adf-empty-folder-image')); emptyRecent = element(by.css('.adf-container-recent .adf-empty-list__title')); gridViewButton = element(by.css('button[data-automation-id="document-list-grid-view"]')); - cardViewContainer = element(by.css('div.adf-document-list-container div.adf-data-table-card')); + cardViewContainer = element(by.css('div.adf-document-list-container div.adf-datatable-card')); copyButton = element(by.css('button[data-automation-id="content-node-selector-actions-choose"]')); searchInputElement = element(by.css('input[data-automation-id="content-node-selector-search-input"]')); shareNodeButton = element(by.cssContainingText('mat-icon', ' share ')); + nameColumnHeader = 'name'; + createdByColumnHeader = 'createdByUser.displayName'; + createdColumnHeader = 'createdAt'; + deleteContentElement = element(by.css('button[data-automation-id*="DELETE"]')); + metadataAction = element(by.css('button[data-automation-id*="METADATA"]')); + versionManagerAction = element(by.css('button[data-automation-id*="VERSIONS"]')); + moveContentElement = element(by.css('button[data-automation-id*="MOVE"]')); + copyContentElement = element(by.css('button[data-automation-id*="COPY"]')); + lockContentElement = element(by.css('button[data-automation-id="DOCUMENT_LIST.ACTIONS.LOCK"]')); + downloadContent = element(by.css('button[data-automation-id*="DOWNLOAD"]')); + siteListDropdown = element(by.css(`mat-select[data-automation-id='site-my-files-option']`)); - getUploadAreaDocumentList() { - return new ContentListPage(element(by.css('adf-upload-drag-area'))); + pressContextMenuActionNamed(actionName) { + let actionButton = this.checkContextActionIsVisible(actionName); + actionButton.click(); + } + + checkContextActionIsVisible(actionName) { + let actionButton = element(by.css(`button[data-automation-id="context-${actionName}"`)); + Util.waitUntilElementIsVisible(actionButton); + Util.waitUntilElementIsClickable(actionButton); + return actionButton; + } + + getDocumentList() { + return this.contentList; + } + + checkLockedIcon(content) { + return this.contentList.checkLockedIcon(content); + } + + checkUnlockedIcon(content) { + return this.contentList.checkUnlockedIcon(content); + } + + checkDeleteIsDisabled(content) { + this.contentList.clickOnActionMenu(content); + this.waitForContentOptions(); + let disabledDelete = element(by.css(`button[data-automation-id*='DELETE'][disabled='true']`)); + Util.waitUntilElementIsVisible(disabledDelete); + } + + deleteContent(content) { + this.contentList.clickOnActionMenu(content); + this.waitForContentOptions(); + this.deleteContentElement.click(); + } + + metadataContent(content) { + this.contentList.clickOnActionMenu(content); + this.waitForContentOptions(); + this.metadataAction.click(); + } + + versionManagerContent(content) { + this.contentList.clickOnActionMenu(content); + this.waitForContentOptions(); + this.versionManagerAction.click(); + } + + copyContent(content) { + this.contentList.clickOnActionMenu(content); + this.copyContentElement.click(); + } + + lockContent(content) { + this.contentList.clickOnActionMenu(content); + this.lockContentElement.click(); + } + + waitForContentOptions() { + Util.waitUntilElementIsVisible(this.copyContentElement); + Util.waitUntilElementIsVisible(this.moveContentElement); + Util.waitUntilElementIsVisible(this.deleteContentElement); + Util.waitUntilElementIsVisible(this.downloadContent); } clickFileHyperlink(fileName) { - let hyperlink = this.contentList.getFileHyperlink(fileName); + let hyperlink = this.contentList.dataTablePage().getFileHyperlink(fileName); + Util.waitUntilElementIsClickable(hyperlink); hyperlink.click(); return this; } checkFileHyperlinkIsEnabled(fileName) { - let hyperlink = this.contentList.getFileHyperlink(fileName); + let hyperlink = this.contentList.dataTablePage().getFileHyperlink(fileName); Util.waitUntilElementIsVisible(hyperlink); return this; } @@ -91,130 +163,79 @@ export class ContentServicesPage { return this; } - getElementsDisplayedCreated() { - let deferred = protractor.promise.defer(); - let fileCreatedLocator = this.contentList.getColumnLocator('Created'); - Util.waitUntilElementIsVisible(element.all(fileCreatedLocator).first()); - let initialList = []; - - element.all(fileCreatedLocator).each((item) => { - item.getAttribute('title').then((dateText) => { - if (dateText !== '') { - let date = new Date(dateText); - initialList.push(date); - } - }); - }).then(function () { - deferred.fulfill(initialList); - }); - - return deferred.promise; - } - getElementsDisplayedSize() { - let deferred = protractor.promise.defer(); - let fileSizeLocator = this.contentList.getColumnLocator('Size'); - Util.waitUntilElementIsVisible(element.all(fileSizeLocator).first()); - let initialList = []; - - element.all(fileSizeLocator).each(function (item) { - item.getAttribute('title').then((sizeText) => { - if (sizeText !== '') { - let size = Number(sizeText); - initialList.push(size); - } - }); - }).then(function () { - deferred.fulfill(initialList); - }); - - return deferred.promise; - } - - getElementsDisplayedAuthor(alfrescoJsApi) { - let deferred = protractor.promise.defer(); - let idList = this.getElementsDisplayedId(); - let numberOfElements = this.numberOfResultsDisplayed(); - this.nodeActions.getNodesDisplayed(alfrescoJsApi, idList, numberOfElements).then((nodes) => { - let initialList = []; - - nodes.forEach((item) => { - if (item.entry.createdByUser.id !== '') { - initialList.push(item.entry.createdByUser.id); - } - }); - deferred.fulfill(initialList); - }); - - return deferred.promise; + return this.contentList.dataTablePage().getAllRowsColumnValues('Size'); } getElementsDisplayedName() { - let deferred = protractor.promise.defer(); - let fileNameLocator = this.contentList.getColumnLocator('Display name'); - Util.waitUntilElementIsVisible(element.all(fileNameLocator).first()); - let initialList = []; - - element.all(fileNameLocator).each((item) => { - item.getText().then(function (name) { - if (name !== '') { - initialList.push(name); - } - }); - }).then(function () { - deferred.fulfill(initialList); - }); - - return deferred.promise; + return this.contentList.dataTablePage().getAllRowsColumnValues('Display name'); } getElementsDisplayedId() { - let deferred = protractor.promise.defer(); - let fileIdLocator = this.contentList.getColumnLocator('Node id'); - Util.waitUntilElementIsVisible(element.all(fileIdLocator).first()); - let initialList = []; - - element.all(fileIdLocator).each((item) => { - item.getText().then(function (text) { - if (text !== '') { - initialList.push(text); - } - }); - }).then(function () { - deferred.fulfill(initialList); - }); - - return deferred.promise; + return this.contentList.dataTablePage().getAllRowsColumnValues('Node id'); } checkElementsSortedAsc(elements) { let sorted = true; let i = 0; - let compareNumbers = false; - if (elements && elements[0] && typeof elements[0] === 'number') { - compareNumbers = true; - } while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { - const left = compareNumbers ? elements[i] : JSON.stringify(elements[i]); - const right = compareNumbers ? elements[i + 1] : JSON.stringify(elements[i + 1]); + const left = elements[i]; + const right = elements[i + 1]; if (left > right) { sorted = false; } i++; } + return sorted; } checkElementsSortedDesc(elements) { let sorted = true; let i = 0; + while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { - if (elements[i] < elements[i + 1]) { + const left = elements[i]; + const right = elements[i + 1]; + if (left < right) { sorted = false; } i++; } + + return sorted; + } + + checkElementsDateSortedAsc(elements) { + let sorted = true; + let i = 0; + + while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { + const left = DateUtil.parse(elements[i], 'DD-MM-YY'); + const right = DateUtil.parse(elements[i + 1], 'DD-MM-YY'); + if (left > right) { + sorted = false; + } + i++; + } + + return sorted; + } + + checkElementsDateSortedDesc(elements) { + let sorted = true; + let i = 0; + + while (elements.length > 1 && sorted === true && i < (elements.length - 1)) { + const left = DateUtil.parse(elements[i], 'DD-MM-YY'); + const right = DateUtil.parse(elements[i + 1], 'DD-MM-YY'); + if (left < right) { + sorted = false; + } + i++; + } + return sorted; } @@ -259,7 +280,7 @@ export class ContentServicesPage { } waitForTableBody() { - Util.waitUntilElementIsVisible(this.tableBody); + this.contentList.waitForTableBody(); } goToDocumentList() { @@ -274,14 +295,8 @@ export class ContentServicesPage { this.contentServices.click(); } - navigateToDocumentList() { - let navigationBarPage = new NavigationBarPage(); - navigationBarPage.clickContentServicesButton(); - this.checkAcsContainer(); - } - numberOfResultsDisplayed() { - return this.contentList.getAllDisplayedRows(); + return this.contentList.dataTablePage().numberOfRows(); } currentFolderName() { @@ -293,59 +308,51 @@ export class ContentServicesPage { return deferred.promise; } - getTooltip(content) { - return this.contentList.getRowByRowName(content).element(this.tooltip).getAttribute('title'); - } - - getBreadcrumbTooltip(nodeName: string) { - return element(by.css(`nav[data-automation-id="breadcrumb"] div[title="${nodeName}"]`)).getAttribute('title'); - } - getAllRowsNameColumn() { - return this.contentList.getAllRowsNameColumn(); + return this.contentList.getAllRowsColumnValues('Display name'); } sortByName(sortOrder) { - this.contentList.sortByName(sortOrder); + return this.contentList.dataTable.sortByColumn(sortOrder, this.nameColumnHeader); } sortByAuthor(sortOrder) { - this.contentList.sortByAuthor(sortOrder); + return this.contentList.dataTable.sortByColumn(sortOrder, this.createdByColumnHeader); } sortByCreated(sortOrder) { - return this.contentList.sortByCreated(sortOrder); + return this.contentList.dataTable.sortByColumn(sortOrder, this.createdColumnHeader); } sortAndCheckListIsOrderedByName(sortOrder) { this.sortByName(sortOrder); let deferred = protractor.promise.defer(); - this.contentList.checkListIsOrderedByNameColumn(sortOrder).then((result) => { + this.checkListIsSortedByNameColumn(sortOrder).then((result) => { deferred.fulfill(result); }); return deferred.promise; } async checkListIsSortedByNameColumn(sortOrder) { - await this.contentList.checkListIsOrderedByNameColumn(sortOrder); + return await this.contentList.dataTablePage().checkListIsSorted(sortOrder, 'Display name'); } async checkListIsSortedByCreatedColumn(sortOrder) { - await this.contentList.checkListIsOrderedByCreatedColumn(sortOrder); + return await this.contentList.dataTablePage().checkListIsSorted(sortOrder, 'Created'); } async checkListIsSortedByAuthorColumn(sortOrder) { - await this.contentList.checkListIsOrderedByAuthorColumn(sortOrder); + return await this.contentList.dataTablePage().checkListIsSorted(sortOrder, 'Created by'); } async checkListIsSortedBySizeColumn(sortOrder) { - await this.contentList.checkListIsOrderedBySizeColumn(sortOrder); + return await this.contentList.dataTablePage().checkListIsSorted(sortOrder, 'Size'); } sortAndCheckListIsOrderedByAuthor(sortOrder) { this.sortByAuthor(sortOrder); let deferred = protractor.promise.defer(); - this.contentList.checkListIsOrderedByAuthorColumn(sortOrder).then((result) => { + this.checkListIsSortedByAuthorColumn(sortOrder).then((result) => { deferred.fulfill(result); }); return deferred.promise; @@ -354,17 +361,12 @@ export class ContentServicesPage { sortAndCheckListIsOrderedByCreated(sortOrder) { this.sortByCreated(sortOrder); let deferred = protractor.promise.defer(); - this.contentList.checkListIsOrderedByCreatedColumn(sortOrder).then((result) => { + this.checkListIsSortedByCreatedColumn(sortOrder).then((result) => { deferred.fulfill(result); }); return deferred.promise; } - navigateToFolder(folder) { - this.contentList.navigateToFolder(folder); - return this; - } - doubleClickRow(nodeName) { this.contentList.doubleClickRow(nodeName); return this; @@ -392,7 +394,7 @@ export class ContentServicesPage { } checkContentIsDisplayed(content) { - this.contentList.checkContentIsDisplayed(content); + this.contentList.dataTablePage().checkContentIsDisplayed('Display name', content); return this; } @@ -404,7 +406,7 @@ export class ContentServicesPage { } checkContentIsNotDisplayed(content) { - this.contentList.checkContentIsNotDisplayed(content); + this.contentList.dataTablePage().checkContentIsNotDisplayed('Display name', content); return this; } @@ -464,11 +466,6 @@ export class ContentServicesPage { return this.uploadFileButton.isEnabled(); } - deleteContent(content) { - this.contentList.deleteContent(content); - return this; - } - getErrorMessage() { Util.waitUntilElementIsVisible(this.errorSnackBar); let deferred = protractor.promise.defer(); @@ -478,10 +475,6 @@ export class ContentServicesPage { return deferred.promise; } - checkItemInDocList(fileName) { - Util.waitUntilElementIsVisible(element(by.css(`div[data-automation-id="text_${fileName}"]`))); - } - enableInfiniteScrolling() { let infiniteScrollButton = element(by.cssContainingText('.mat-slide-toggle-content', 'Enable Infinite Scrolling')); Util.waitUntilElementIsVisible(infiniteScrollButton); @@ -510,13 +503,6 @@ export class ContentServicesPage { return this; } - clickLoadMoreButton() { - Util.waitUntilElementIsVisible(this.loadMoreButton); - Util.waitUntilElementIsClickable(this.loadMoreButton); - this.loadMoreButton.click(); - return this; - } - checkPaginationIsNotDisplayed() { Util.waitUntilElementIsVisible(this.emptyPagination); } @@ -558,20 +544,16 @@ export class ContentServicesPage { } checkLockIsDisplayedForElement(name) { - let lockButton = element(by.css(`div.adf-data-table-cell[filename="${name}"] button`)); + let lockButton = element(by.css(`div.adf-datatable-cell[filename="${name}"] button`)); Util.waitUntilElementIsVisible(lockButton); } getColumnValueForRow(file, columnName) { - let row = this.contentList.getRowByRowName(file); - Util.waitUntilElementIsVisible(row); - let rowColumn = row.element(by.css(`div[title="${columnName}"] span`)); - Util.waitUntilElementIsVisible(rowColumn); - return rowColumn.getText(); + return this.contentList.dataTablePage().getColumnValueForRow('Display name', file, columnName); } async getStyleValueForRowText(rowName, styleName) { - let row = element(by.css(`div.adf-data-table-cell[filename="${rowName}"] span.adf-datatable-cell-value[title="${rowName}"]`)); + let row = element(by.css(`div.adf-datatable-cell[filename="${rowName}"] span.adf-datatable-cell-value[title="${rowName}"]`)); Util.waitUntilElementIsVisible(row); return row.getCssValue(styleName); } @@ -595,7 +577,7 @@ export class ContentServicesPage { } checkIconForRowIsDisplayed(fileName) { - let iconRow = element(by.css(`.adf-document-list-container div.adf-data-table-cell[filename="${fileName}"] img`)); + let iconRow = element(by.css(`.adf-document-list-container div.adf-datatable-cell[filename="${fileName}"] img`)); Util.waitUntilElementIsVisible(iconRow); return iconRow; } @@ -620,22 +602,22 @@ export class ContentServicesPage { getCardElementShowedInPage() { this.checkCardViewContainerIsDisplayed(); - let actualCards = $$('div.adf-document-list-container div.adf-data-table-card div.adf-cell-value img').count(); + let actualCards = $$('div.adf-document-list-container div.adf-datatable-card div.adf-cell-value img').count(); return actualCards; } getDocumentCardIconForElement(elementName) { - let elementIcon = element(by.css(`.adf-document-list-container div.adf-data-table-cell[filename="${elementName}"] img`)); + let elementIcon = element(by.css(`.adf-document-list-container div.adf-datatable-cell[filename="${elementName}"] img`)); return elementIcon.getAttribute('src'); } checkDocumentCardPropertyIsShowed(elementName, propertyName) { - let elementProperty = element(by.css(`.adf-document-list-container div.adf-data-table-cell[filename="${elementName}"][title="${propertyName}"]`)); + let elementProperty = element(by.css(`.adf-document-list-container div.adf-datatable-cell[filename="${elementName}"][title="${propertyName}"]`)); Util.waitUntilElementIsVisible(elementProperty); } getAttributeValueForElement(elementName, propertyName) { - let elementSize = element(by.css(`.adf-document-list-container div.adf-data-table-cell[filename="${elementName}"][title="${propertyName}"] span`)); + let elementSize = element(by.css(`.adf-document-list-container div.adf-datatable-cell[filename="${elementName}"][title="${propertyName}"] span`)); return elementSize.getText(); } @@ -645,9 +627,9 @@ export class ContentServicesPage { } navigateToCardFolder(folderName) { - let folderCard = element(by.css(`.adf-document-list-container div.adf-image-table-cell.adf-data-table-cell[filename="${folderName}"]`)); + let folderCard = element(by.css(`.adf-document-list-container div.adf-image-table-cell.adf-datatable-cell[filename="${folderName}"]`)); folderCard.click(); - let folderSelected = element(by.css(`.adf-datatable-row.adf-is-selected div[filename="${folderName}"].adf-data-table-cell--image`)); + let folderSelected = element(by.css(`.adf-datatable-row.adf-is-selected div[filename="${folderName}"].adf-datatable-cell--image`)); Util.waitUntilElementIsVisible(folderSelected); browser.actions().sendKeys(protractor.Key.ENTER).perform(); } @@ -667,7 +649,7 @@ export class ContentServicesPage { } checkRowIsDisplayed(rowName) { - let row = this.contentList.getRowByRowName(rowName); + let row = this.contentList.dataTablePage().getRow('Display name', rowName); Util.waitUntilElementIsVisible(row); } @@ -691,4 +673,8 @@ export class ContentServicesPage { Util.waitUntilElementIsClickable(this.shareNodeButton); this.shareNodeButton.click(); } + + checkSelectedSiteIsDisplayed(siteName) { + Util.waitUntilElementIsVisible(this.siteListDropdown.element(by.cssContainingText('.mat-select-value-text span', siteName))); + } } diff --git a/e2e/pages/adf/core/infinitePaginationPage.ts b/e2e/pages/adf/core/infinitePaginationPage.ts new file mode 100644 index 0000000000..cb03fce84e --- /dev/null +++ b/e2e/pages/adf/core/infinitePaginationPage.ts @@ -0,0 +1,48 @@ +/*! + * @license + * Copyright 2019 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 { element, by } from 'protractor'; +import { ElementFinder } from 'protractor/built/element'; + +import { Util } from '../../../util/util'; + +export class InfinitePaginationPage { + + rootElement: ElementFinder; + loadMoreButton; + + constructor(rootElement: ElementFinder = element.all(by.css('adf-infinite-pagination')).first()) { + this.rootElement = rootElement; + this.loadMoreButton = this.rootElement.element(by.css('button[data-automation-id="adf-infinite-pagination-button"]')); + } + + clickLoadMoreButton() { + Util.waitUntilElementIsVisible(this.loadMoreButton); + Util.waitUntilElementIsClickable(this.loadMoreButton); + this.loadMoreButton.click(); + return this; + } + + checkLoadMoreButtonIsDisplayed() { + return Util.waitUntilElementIsVisible(this.loadMoreButton); + } + + checkLoadMoreButtonIsNotDisplayed() { + return Util.waitUntilElementIsNotOnPage(this.loadMoreButton); + } + +} diff --git a/e2e/pages/adf/dataTableComponentPage.ts b/e2e/pages/adf/dataTableComponentPage.ts new file mode 100644 index 0000000000..09ffdd04cf --- /dev/null +++ b/e2e/pages/adf/dataTableComponentPage.ts @@ -0,0 +1,283 @@ +/*! + * @license + * Copyright 2019 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 { browser, by, element, protractor } from 'protractor'; +import { Util } from '../../util/util'; +import { ElementFinder, ElementArrayFinder } from 'protractor/built/element'; + +export class DataTableComponentPage { + + rootElement: ElementFinder; + list: ElementArrayFinder; + contents; + tableBody; + spinner; + rows = by.css(`adf-datatable div[class*='adf-datatable-body'] div[class*='adf-datatable-row']`); + allColumns; + selectedRowNumber; + allSelectedRows; + selectAll; + + constructor(rootElement: ElementFinder = element.all(by.css('adf-datatable')).first()) { + this.rootElement = rootElement; + this.list = this.rootElement.all(by.css(`div[class*='adf-datatable-body'] div[class*='adf-datatable-row']`)); + this.contents = this.rootElement.all(by.css('div[class="adf-datatable-body"] span')); + this.tableBody = this.rootElement.all(by.css(`div[class='adf-datatable-body']`)).first(); + this.spinner = this.rootElement.element(by.css('mat-progress-spinner')); + this.allColumns = this.rootElement.all(by.css('div[data-automation-id*="auto_id_entry."]')); + this.selectedRowNumber = this.rootElement.element(by.css(`div[class*='is-selected'] div[data-automation-id*='text_']`)); + this.allSelectedRows = this.rootElement.all(by.css(`div[class*='is-selected']`)); + this.selectAll = this.rootElement.element(by.css(`div[class*='adf-datatable-header'] mat-checkbox`)); + } + + checkAllRowsButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.selectAll); + return this; + } + + checkAllRows() { + Util.waitUntilElementIsClickable(this.selectAll).then(() => { + this.selectAll.click(); + Util.waitUntilElementIsVisible(this.selectAll.element(by.css('input[aria-checked="true"]'))); + }); + return this; + } + + clickCheckbox(columnName, columnValue) { + let checkbox = this.getRowCheckbox(columnName, columnValue); + Util.waitUntilElementIsClickable(checkbox); + checkbox.click(); + } + + checkRowIsNotChecked(columnName, columnValue) { + Util.waitUntilElementIsNotOnPage(this.getRowCheckbox(columnName, columnValue).element(by.css('input[aria-checked="true"]'))); + } + + checkRowIsChecked(columnName, columnValue) { + let rowCheckbox = this.getRowCheckbox(columnName, columnValue); + Util.waitUntilElementIsVisible(rowCheckbox.element(by.css('input[aria-checked="true"]'))); + } + + getRowCheckbox(columnName, columnValue) { + return this.getRowParentElement(columnName, columnValue) + .element(by.css('mat-checkbox')); + } + + checkNoRowIsSelected() { + Util.waitUntilElementIsNotOnPage(this.selectedRowNumber); + } + + getNumberOfSelectedRows() { + return this.allSelectedRows.count(); + } + + selectRowWithKeyboard(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + browser.actions().sendKeys(protractor.Key.COMMAND).click(row).perform(); + } + + selectRow(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + Util.waitUntilElementIsClickable(row); + row.click(); + return this; + } + + checkRowIsSelected(columnName, columnValue) { + let selectedRow = this.getRow(columnName, columnValue).element(by.xpath(`ancestor::div[contains(@class, 'is-selected')]`)); + Util.waitUntilElementIsVisible(selectedRow); + return this; + } + + checkRowIsNotSelected(columnName, columnValue) { + let selectedRow = this.getRow(columnName, columnValue).element(by.xpath(`ancestor::div[contains(@class, 'is-selected')]`)); + Util.waitUntilElementIsNotOnPage(selectedRow); + return this; + } + + getColumnValueForRow(identifyingColumn, identifyingValue, columnName) { + let row = this.getRow(identifyingColumn, identifyingValue).element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row')]`)); + Util.waitUntilElementIsVisible(row); + let rowColumn = row.element(by.css(`div[title="${columnName}"] span`)); + Util.waitUntilElementIsVisible(rowColumn); + return rowColumn.getText(); + } + + /** + * Check the list is sorted. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @param locator: locator for column + * @return 'true' if the list is sorted as expected and 'false' if it isn't + */ + checkListIsSorted(sortOrder, locator) { + let deferred = protractor.promise.defer(); + let column = element.all(by.css(`div[title='${locator}'] span`)); + Util.waitUntilElementIsVisible(column.first()); + let initialList = []; + column.each(function (currentElement) { + currentElement.getText().then(function (text) { + initialList.push(text); + }); + }).then(function () { + let sortedList = initialList; + sortedList = sortedList.sort(); + if (sortOrder === false) { + sortedList = sortedList.reverse(); + } + deferred.fulfill(initialList.toString() === sortedList.toString()); + }); + return deferred.promise; + } + + rightClickOnRow(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + browser.actions().click(row, protractor.Button.RIGHT).perform(); + Util.waitUntilElementIsVisible(element(by.id('adf-context-menu-content'))); + } + + getTooltip(columnName, columnValue) { + return this.getRow(columnName, columnValue).getAttribute('title'); + } + + getFileHyperlink(filename) { + return element(by.cssContainingText('adf-name-column[class*="adf-datatable-link"] span', filename)); + } + + numberOfRows() { + return this.rootElement.all(this.rows).count(); + } + + async getAllRowsColumnValues(column) { + let columnLocator = by.css("adf-datatable div[class*='adf-datatable-body'] div[class*='adf-datatable-row'] div[title='" + column + "'] span"); + Util.waitUntilElementIsVisible(element.all(columnLocator).first()); + let initialList: any = await element.all(columnLocator).getText(); + return initialList.filter((el) => el); + } + + async getRowsWithSameColumnValues(columnName, columnValue) { + let columnLocator = by.css(`div[title='${columnName}'] div[data-automation-id="text_${columnValue}"] span`); + Util.waitUntilElementIsVisible(this.rootElement.all(columnLocator).first()); + return this.rootElement.all(columnLocator).getText(); + } + + doubleClickRow(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + Util.waitUntilElementIsVisible(row); + Util.waitUntilElementIsClickable(row); + row.click(); + this.checkRowIsSelected(columnName, columnValue); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + return this; + } + + waitForTableBody() { + Util.waitUntilElementIsVisible(this.tableBody); + } + + getFirstElementDetail(detail) { + let firstNode = element.all(by.css(`adf-datatable div[title="${detail}"] span`)).first(); + return firstNode.getText(); + } + + geCellElementDetail(detail) { + return element.all(by.css(`adf-datatable div[title="${detail}"] span`)); + } + + sortByColumn(sortOrder, column) { + let locator = by.css(`div[data-automation-id="auto_id_${column}"]`); + Util.waitUntilElementIsVisible(element(locator)); + return element(locator).getAttribute('class').then(function (result) { + if (sortOrder === true) { + if (!result.includes('sorted-asc')) { + if (result.includes('sorted-desc') || result.includes('sortable')) { + element(locator).click(); + } + } + } else { + if (result.includes('sorted-asc')) { + element(locator).click(); + } else if (result.includes('sortable')) { + element(locator).click(); + element(locator).click(); + } + } + + return Promise.resolve(); + }); + } + + checkContentIsDisplayed(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + Util.waitUntilElementIsVisible(row); + return this; + } + + checkContentIsNotDisplayed(columnName, columnValue) { + let row = this.getRow(columnName, columnValue); + Util.waitUntilElementIsNotOnPage(row); + return this; + } + + contentInPosition(position) { + Util.waitUntilElementIsVisible(this.contents); + return this.contents.get(position - 1).getText(); + } + + getRowParentElement(columnName, columnValue) { + let row = this.rootElement.all(by.css(`div[title="${columnName}"] div[data-automation-id="text_${columnValue}"]`)).first() + .element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row')]`)); + Util.waitUntilElementIsVisible(row); + return row; + } + + getRow(columnName, columnValue) { + return this.rootElement.all(by.css(`div[title="${columnName}"] div[data-automation-id="text_${columnValue}"] span`)).first(); + } + + checkSpinnerIsDisplayed() { + Util.waitUntilElementIsPresent(this.spinner); + return this; + } + + checkSpinnerIsNotDisplayed() { + Util.waitUntilElementIsNotOnPage(this.spinner); + return this; + } + + tableIsLoaded() { + Util.waitUntilElementIsVisible(this.rootElement); + return this; + } + + checkColumnIsDisplayed(column) { + Util.waitUntilElementIsVisible(element(by.css(`div[data-automation-id="auto_id_entry.${column}"]`))); + return this; + } + + getNumberOfColumns() { + return this.allColumns.count(); + } + + getNumberOfRows() { + return this.list.count(); + } + + getCellByRowAndColumn(rowColumn, rowContent, columnName) { + return this.getRowParentElement(rowColumn, rowContent).element(by.css(`div[title='${columnName}']`)); + } +} diff --git a/e2e/pages/adf/dataTablePage.ts b/e2e/pages/adf/dataTablePage.ts deleted file mode 100644 index 18b1bfaf4e..0000000000 --- a/e2e/pages/adf/dataTablePage.ts +++ /dev/null @@ -1,267 +0,0 @@ -/*! - * @license - * Copyright 2019 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 { browser, by, element, protractor } from 'protractor'; -import { Util } from '../../util/util'; -import { ElementFinder, ElementArrayFinder } from 'protractor/built/element'; - -export class DataTablePage { - - rootElement: ElementFinder; - list: ElementArrayFinder; - contents = element.all(by.css('div[class="adf-datatable-body"] span')); - multiSelect = element(by.css(`div[data-automation-id='multiselect'] label > div[class='mat-checkbox-inner-container']`)); - selectionButton = element(by.css(`div[class='mat-select-arrow']`)); - selectionDropDown = element(by.css(`div[class*='ng-trigger-transformPanel']`)); - allSelectedRows = element.all(by.css(`div[class*='is-selected']`)); - selectedRowNumber = element(by.css(`div[class*='is-selected'] div[data-automation-id*='text_']`)); - selectAll = element(by.css(`div[class*='header'] label`)); - addRowElement = element(by.xpath(`//span[contains(text(),'Add row')]/..`)); - replaceRowsElement = element(by.xpath(`//span[contains(text(),'Replace rows')]/..`)); - reset = element(by.xpath(`//span[contains(text(),'Reset to default')]/..`)); - replaceColumnsElement = element(by.xpath(`//span[contains(text(),'Replace columns')]/..`)); - createdOnColumn = element(by.css(`div[data-automation-id='auto_id_createdOn']`)); - tableBody = element.all(by.css(`div[class='adf-datatable-body']`)).first(); - spinner = element(by.css('mat-progress-spinner')); - rows = by.css(`adf-datatable div[class*='adf-datatable-body'] div[class*='adf-datatable-row']`); - - constructor(rootElement: ElementFinder = element(by.css('adf-datatable'))) { - this.rootElement = rootElement; - this.list = this.rootElement.all(by.css(`div[class*=adf-datatable-body] div[class*=adf-datatable-row]`)); - } - - getFileHyperlink(filename) { - return element(by.cssContainingText('adf-name-column[class*="adf-datatable-link"] span', filename)); - } - - getAllDisplayedRows() { - return element.all(this.rows).count(); - } - - getAllRowsNameColumn() { - return this.getAllRowsColumnValues('Name'); - } - - async getAllRowsColumnValues(locator) { - let columnLocator = by.css("adf-datatable div[class*='adf-datatable-body'] div[class*='adf-datatable-row'] div[title='" + locator + "'] span"); - Util.waitUntilElementIsVisible(element.all(columnLocator).first()); - let initialList = await element.all(columnLocator).getText(); - return initialList.filter((el) => el); - } - - getRowByRowNumber(rowNumber) { - Util.waitUntilElementIsVisible(element(by.css(`div[data-automation-id='text_` + rowNumber + `']`))); - return element(by.css(`div[data-automation-id='text_` + rowNumber + `']`)); - } - - getRowCheckbox(rowNumber) { - return this.getRowByRowNumber(rowNumber).element(by.xpath(`ancestor::div/div/mat-checkbox[contains(@class, 'mat-checkbox-checked')]`)); - } - - clickMultiSelect() { - Util.waitUntilElementIsVisible(this.multiSelect); - this.multiSelect.click(); - } - - clickReset() { - Util.waitUntilElementIsVisible(this.reset); - this.reset.click(); - } - - clickCheckbox(rowNumber) { - let checkbox = this.getRowByRowNumber(rowNumber).element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row')]//mat-checkbox/label`)); - Util.waitUntilElementIsVisible(checkbox); - checkbox.click(); - } - - selectRow(rowNumber) { - return this.getRowByRowNumber(rowNumber).click(); - } - - selectRowWithKeyboard(rowNumber) { - let row = this.getRowByRowNumber(rowNumber); - browser.actions().sendKeys(protractor.Key.COMMAND).click(row).perform(); - } - - selectSelectionMode(selectionMode) { - let selectMode = element(by.cssContainingText(`span[class='mat-option-text']`, selectionMode)); - this.selectionButton.click(); - Util.waitUntilElementIsVisible(this.selectionDropDown); - selectMode.click(); - } - - checkRowIsSelected(rowNumber) { - let isRowSelected = this.getRowByRowNumber(rowNumber).element(by.xpath(`ancestor::div[contains(@class, 'is-selected')]`)); - Util.waitUntilElementIsVisible(isRowSelected); - } - - checkRowIsNotSelected(rowNumber) { - let isRowSelected = this.getRowByRowNumber(rowNumber) - .element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row custom-row-style ng-star-inserted is-selected')]`)); - Util.waitUntilElementIsNotOnPage(isRowSelected); - } - - checkNoRowIsSelected() { - Util.waitUntilElementIsNotOnPage(this.selectedRowNumber); - } - - checkAllRows() { - Util.waitUntilElementIsVisible(this.selectAll); - this.selectAll.click(); - } - - checkRowIsChecked(rowNumber) { - Util.waitUntilElementIsVisible(this.getRowCheckbox(rowNumber)); - } - - checkRowIsNotChecked(rowNumber) { - Util.waitUntilElementIsNotOnPage(this.getRowCheckbox(rowNumber)); - } - - addRow() { - Util.waitUntilElementIsVisible(this.addRowElement); - this.addRowElement.click(); - } - - getNumberOfRows() { - return this.list.count(); - } - - getNumberOfSelectedRows() { - return this.allSelectedRows.count(); - } - - replaceRows(id) { - let rowID = this.getRowByRowNumber(id); - Util.waitUntilElementIsVisible(rowID); - this.replaceRowsElement.click(); - Util.waitUntilElementIsNotOnPage(rowID); - } - - replaceColumns() { - Util.waitUntilElementIsVisible(this.replaceColumnsElement); - this.replaceColumnsElement.click(); - Util.waitUntilElementIsNotOnPage(this.createdOnColumn); - } - - getRowsName(content) { - let row = element(by.css(`div[data-automation-id*='` + content + `']`)); - Util.waitUntilElementIsPresent(row); - return row; - } - - doubleClickRow(rowName) { - let row = this.getRowByRowName(rowName); - Util.waitUntilElementIsVisible(row); - Util.waitUntilElementIsClickable(row); - row.click(); - Util.waitUntilElementIsVisible(row.all(by.css(`div[class*='--image'] mat-icon[svgicon*='selected']`)).first()); - browser.actions().sendKeys(protractor.Key.ENTER).perform(); - return this; - } - - getRowByRowName(content) { - let rowByRowName = by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row')]`); - Util.waitUntilElementIsPresent(this.getRowsName(content).element(rowByRowName)); - return this.getRowsName(content).element(rowByRowName); - } - - waitForTableBody() { - Util.waitUntilElementIsVisible(this.tableBody); - } - - insertFilter(filterText) { - let inputFilter = element(by.css(`#adf-datatable-filter-input`)); - inputFilter.clear(); - return inputFilter.sendKeys(filterText); - } - - getNodeIdFirstElement() { - let firstNode = element.all(by.css('adf-datatable div[title="Node id"] span')).first(); - return firstNode.getText(); - } - - sortByColumn(sortOrder, locator) { - Util.waitUntilElementIsVisible(element(locator)); - return element(locator).getAttribute('class').then(function (result) { - if (sortOrder === true) { - if (!result.includes('sorted-asc')) { - if (result.includes('sorted-desc') || result.includes('sortable')) { - element(locator).click(); - } - } - } else { - if (result.includes('sorted-asc')) { - element(locator).click(); - } else if (result.includes('sortable')) { - element(locator).click(); - element(locator).click(); - } - } - - return Promise.resolve(); - }); - } - - checkContentIsDisplayed(content) { - let row = by.cssContainingText(`[data-automation-id*="${content}"]`, content); - Util.waitUntilElementIsVisible(this.tableBody.all(row).first()); - return this; - } - - checkContentIsNotDisplayed(content) { - let row = by.cssContainingText(`[data-automation-id*="${content}"]`, content); - Util.waitUntilElementIsNotOnPage(this.tableBody.all(row).first()); - return this; - } - - selectRowByContentName(content) { - let row = by.cssContainingText(`[data-automation-id*="${content}"]`, content); - Util.waitUntilElementIsVisible(this.tableBody.element(row)); - this.tableBody.element(row).click(); - return this; - } - - contentInPosition(position) { - Util.waitUntilElementIsVisible(this.contents); - return this.contents.get(position - 1).getText(); - } - - checkSpinnerIsDisplayed() { - Util.waitUntilElementIsPresent(this.spinner); - return this; - } - - checkSpinnerIsNotDisplayed() { - Util.waitUntilElementIsNotOnPage(this.spinner); - return this; - } - - checkRowIsDisplayedByName(filename) { - Util.waitUntilElementIsVisible(element.all(by.css(`div[filename="${filename}"]`)).first()); - } - - checkRowIsNotDisplayedByName(filename) { - Util.waitUntilElementIsNotOnPage(element.all(by.css(`div[filename="${filename}"]`)).first()); - } - - getNumberOfRowsDisplayedWithSameName(filename) { - Util.waitUntilElementIsVisible(element(by.css(`div[filename="${filename}"]`))); - return element.all(by.css(`div[title='Name'][filename="${filename}"]`)).count(); - } - -} diff --git a/e2e/pages/adf/demo-shell/aboutPage.ts b/e2e/pages/adf/demo-shell/aboutPage.ts new file mode 100644 index 0000000000..3b506fed58 --- /dev/null +++ b/e2e/pages/adf/demo-shell/aboutPage.ts @@ -0,0 +1,28 @@ +/*! + * @license + * Copyright 2019 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 { by, element } from 'protractor'; +import { Util } from '../../../util/util'; + +export class AboutPage { + + monacoPlugin = element(by.cssContainingText('mat-row > mat-cell', 'monaco plugin')); + + checkMonacoPluginIsDisplayed() { + return Util.waitUntilElementIsVisible(this.monacoPlugin); + } +} diff --git a/e2e/pages/adf/demo-shell/customSourcesPage.ts b/e2e/pages/adf/demo-shell/customSourcesPage.ts index 232b3a9f90..7e339a2b91 100644 --- a/e2e/pages/adf/demo-shell/customSourcesPage.ts +++ b/e2e/pages/adf/demo-shell/customSourcesPage.ts @@ -17,7 +17,7 @@ import { Util } from '../../../util/util'; import { element, by } from 'protractor'; -import { ContentListPage } from '../dialog/contentListPage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; import { NavigationBarPage } from '../navigationBarPage'; let source = { @@ -38,7 +38,7 @@ let column = { export class CustomSources { - contentList = new ContentListPage(); + dataTable = new DataTableComponentPage(); navigationBarPage = new NavigationBarPage(); toolbar = element(by.css('app-custom-sources .adf-toolbar-title')); @@ -67,13 +67,13 @@ export class CustomSources { } checkRowIsDisplayed(rowName) { - let row = this.contentList.getRowsName(rowName); - Util.waitUntilElementIsVisible(row); + return this.dataTable.checkContentIsDisplayed('Name', rowName); } getStatusCell(rowName) { - Util.waitUntilElementIsVisible(this.contentList.getCellByNameAndColumn(rowName, column.status)); - return this.contentList.getCellByNameAndColumn(rowName, column.status).getText(); + let cell = this.dataTable.getCellByRowAndColumn('Name', rowName, column.status); + Util.waitUntilElementIsVisible(cell); + return cell.getText(); } } diff --git a/e2e/pages/adf/demo-shell/dataTablePage.ts b/e2e/pages/adf/demo-shell/dataTablePage.ts new file mode 100644 index 0000000000..25f52e2ce0 --- /dev/null +++ b/e2e/pages/adf/demo-shell/dataTablePage.ts @@ -0,0 +1,127 @@ +/*! + * @license + * Copyright 2019 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 { browser, by, element, protractor } from 'protractor'; +import { DataTableComponentPage } from '../dataTableComponentPage'; +import { Util } from '../../../util/util'; + +export class DataTablePage { + + dataTable = new DataTableComponentPage(); + multiSelect = element(by.css(`div[data-automation-id='multiselect'] label > div[class='mat-checkbox-inner-container']`)); + reset = element(by.xpath(`//span[contains(text(),'Reset to default')]/..`)); + selectionButton = element(by.css(`div[class='mat-select-arrow']`)); + selectionDropDown = element(by.css(`div[class*='ng-trigger-transformPanel']`)); + allSelectedRows = element.all(by.css(`div[class*='is-selected']`)); + selectedRowNumber = element(by.css(`div[class*='is-selected'] div[data-automation-id*='text_']`)); + selectAll = element(by.css(`div[class*='header'] label`)); + addRowElement = element(by.xpath(`//span[contains(text(),'Add row')]/..`)); + replaceRowsElement = element(by.xpath(`//span[contains(text(),'Replace rows')]/..`)); + replaceColumnsElement = element(by.xpath(`//span[contains(text(),'Replace columns')]/..`)); + createdOnColumn = element(by.css(`div[data-automation-id='auto_id_createdOn']`)); + + insertFilter(filterText) { + let inputFilter = element(by.css(`#adf-datatable-filter-input`)); + inputFilter.clear(); + return inputFilter.sendKeys(filterText); + } + + addRow() { + Util.waitUntilElementIsVisible(this.addRowElement); + this.addRowElement.click(); + } + + replaceRows(id) { + let rowID = this.dataTable.getRow('Id', id); + Util.waitUntilElementIsVisible(rowID); + this.replaceRowsElement.click(); + Util.waitUntilElementIsNotVisible(rowID); + } + + replaceColumns() { + Util.waitUntilElementIsVisible(this.replaceColumnsElement); + this.replaceColumnsElement.click(); + Util.waitUntilElementIsNotOnPage(this.createdOnColumn); + } + + clickMultiSelect() { + Util.waitUntilElementIsVisible(this.multiSelect); + this.multiSelect.click(); + } + + clickReset() { + Util.waitUntilElementIsVisible(this.reset); + this.reset.click(); + } + + checkRowIsNotSelected(rowNumber) { + let isRowSelected = this.dataTable.getRow('Id', rowNumber) + .element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row custom-row-style ng-star-inserted is-selected')]`)); + Util.waitUntilElementIsNotOnPage(isRowSelected); + } + + checkNoRowIsSelected() { + Util.waitUntilElementIsNotOnPage(this.selectedRowNumber); + } + + checkAllRows() { + Util.waitUntilElementIsVisible(this.selectAll); + this.selectAll.click(); + } + + checkRowIsChecked(rowNumber) { + Util.waitUntilElementIsVisible(this.getRowCheckbox(rowNumber)); + } + + checkRowIsNotChecked(rowNumber) { + Util.waitUntilElementIsNotOnPage(this.getRowCheckbox(rowNumber)); + } + + getNumberOfSelectedRows() { + return this.allSelectedRows.count(); + } + + clickCheckbox(rowNumber) { + let checkbox = this.dataTable.getRow('Id', rowNumber).element(by.xpath(`ancestor::div[contains(@class, 'adf-datatable-row')]//mat-checkbox/label`)); + Util.waitUntilElementIsVisible(checkbox); + checkbox.click(); + } + + selectRow(rowNumber) { + let locator = this.dataTable.getRow('Id', rowNumber); + Util.waitUntilElementIsVisible(locator); + Util.waitUntilElementIsClickable(locator); + locator.click(); + return this; + } + + selectRowWithKeyboard(rowNumber) { + let row = this.dataTable.getRow('Id', rowNumber); + browser.actions().sendKeys(protractor.Key.COMMAND).click(row).perform(); + } + + selectSelectionMode(selectionMode) { + let selectMode = element(by.cssContainingText(`span[class='mat-option-text']`, selectionMode)); + this.selectionButton.click(); + Util.waitUntilElementIsVisible(this.selectionDropDown); + selectMode.click(); + } + + getRowCheckbox(rowNumber) { + return this.dataTable.getRow('Id', rowNumber).element(by.xpath(`ancestor::div/div/mat-checkbox[contains(@class, 'mat-checkbox-checked')]`)); + } +} diff --git a/e2e/pages/adf/demo-shell/logoutPage.ts b/e2e/pages/adf/demo-shell/logoutPage.ts new file mode 100644 index 0000000000..385109c538 --- /dev/null +++ b/e2e/pages/adf/demo-shell/logoutPage.ts @@ -0,0 +1,28 @@ +/*! + * @license + * Copyright 2019 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 { by, element } from 'protractor'; +import { Util } from '../../../util/util'; + +export class LogoutPage { + + logoutSection = element(by.css('div[data-automation-id="adf-logout-section"]')); + + checkLogoutSectionIsDisplayed() { + return Util.waitUntilElementIsVisible(this.logoutSection); + } +} diff --git a/e2e/pages/adf/demo-shell/process-services/peopleGroupCloudComponentPage.ts b/e2e/pages/adf/demo-shell/process-services/peopleGroupCloudComponentPage.ts new file mode 100644 index 0000000000..200c52196d --- /dev/null +++ b/e2e/pages/adf/demo-shell/process-services/peopleGroupCloudComponentPage.ts @@ -0,0 +1,89 @@ +/*! + * @license + * Copyright 2019 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 { by, element, protractor } from 'protractor'; +import { Util } from '../../../../util/util'; + +export class PeopleGroupCloudComponentPage { + + peopleCloudSingleSelection = element(by.css('mat-radio-button[data-automation-id="adf-people-single-mode"]')); + peopleCloudMultipleSelection = element(by.css('mat-radio-button[data-automation-id="adf-people-multiple-mode"]')); + peopleCloudFilterRole = element(by.css('mat-radio-button[data-automation-id="adf-people-filter-role"]')); + groupCloudSingleSelection = element(by.css('mat-radio-button[data-automation-id="adf-group-single-mode"]')); + groupCloudMultipleSelection = element(by.css('mat-radio-button[data-automation-id="adf-group-multiple-mode"]')); + groupCloudFilterRole = element(by.css('mat-radio-button[data-automation-id="adf-group-filter-role"]')); + peopleRoleInput = element(by.css('input[data-automation-id="adf-people-roles-input"]')); + peoplePreselect = element(by.css('input[data-automation-id="adf-people-preselect-input"]')); + groupRoleInput = element(by.css('input[data-automation-id="adf-group-roles-input"]')); + groupPreselect = element(by.css('input[data-automation-id="adf-group-preselect-input"]')); + peopleCloudComponentTitle = element(by.cssContainingText('mat-card-title', 'People Cloud Component')); + groupCloudComponentTitle = element(by.cssContainingText('mat-card-title', 'Groups Cloud Component')); + + checkPeopleCloudComponentTitleIsDisplayed() { + Util.waitUntilElementIsVisible(this.peopleCloudComponentTitle); + return this; + } + + checkGroupsCloudComponentTitleIsDisplayed() { + Util.waitUntilElementIsVisible(this.groupCloudComponentTitle); + return this; + } + + clickPeopleCloudMultipleSelection() { + Util.waitUntilElementIsVisible(this.peopleCloudMultipleSelection); + this.peopleCloudMultipleSelection.click(); + } + + clickPeopleCloudFilterRole() { + Util.waitUntilElementIsVisible(this.peopleCloudFilterRole); + this.peopleCloudFilterRole.click(); + } + + clickGroupCloudFilterRole() { + Util.waitUntilElementIsVisible(this.groupCloudFilterRole); + this.groupCloudFilterRole.click(); + } + + enterPeopleRoles(roles) { + Util.waitUntilElementIsVisible(this.peopleRoleInput); + this.peopleRoleInput.clear(); + this.peopleRoleInput.sendKeys(roles); + return this; + } + + clearField(locator) { + Util.waitUntilElementIsVisible(locator); + locator.getAttribute('value').then((result) => { + for (let i = result.length; i >= 0; i--) { + locator.sendKeys(protractor.Key.BACK_SPACE); + } + }); + } + + clickGroupCloudMultipleSelection() { + Util.waitUntilElementIsVisible(this.groupCloudMultipleSelection); + this.groupCloudMultipleSelection.click(); + } + + enterGroupRoles(roles) { + Util.waitUntilElementIsVisible(this.groupRoleInput); + this.groupRoleInput.clear(); + this.groupRoleInput.sendKeys(roles); + return this; + } + +} diff --git a/e2e/pages/adf/demo-shell/process-services/processListDemoPage.ts b/e2e/pages/adf/demo-shell/process-services/processListDemoPage.ts index 4b250a05c1..eed496f175 100644 --- a/e2e/pages/adf/demo-shell/process-services/processListDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services/processListDemoPage.ts @@ -16,7 +16,7 @@ */ import { Util } from '../../../../util/util'; -import { DataTablePage } from '../../dataTablePage'; +import { DataTableComponentPage } from '../../dataTableComponentPage'; import { element, by, protractor } from 'protractor'; export class ProcessListDemoPage { @@ -29,10 +29,10 @@ export class ProcessListDemoPage { stateSelector = element(by.css('mat-select[data-automation-id="state"')); sortSelector = element(by.css('mat-select[data-automation-id="sort"')); - dataTable = new DataTablePage(); + dataTable = new DataTableComponentPage(); getDisplayedProcessesNames() { - return this.dataTable.getAllRowsNameColumn(); + return this.dataTable.getAllRowsColumnValues('Name'); } selectSorting(sort) { @@ -76,11 +76,11 @@ export class ProcessListDemoPage { } checkProcessIsNotDisplayed(processName) { - return this.dataTable.checkRowIsNotDisplayedByName(processName); + return this.dataTable.checkContentIsNotDisplayed('Name', processName); } checkProcessIsDisplayed(processName) { - return this.dataTable.checkRowIsDisplayedByName(processName); + return this.dataTable.checkContentIsDisplayed('Name', processName); } checkAppIdFieldIsDisplayed() { diff --git a/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts b/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts index 7c41ec05ba..360c25dd37 100644 --- a/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts @@ -20,7 +20,9 @@ import { Util } from '../../../../util/util'; import { TaskFiltersCloudComponent } from '../../process-cloud/taskFiltersCloudComponent'; import { TaskListCloudComponent } from '../../process-cloud/taskListCloudComponent'; import { EditTaskFilterCloudComponent } from '../../process-cloud/editTaskFilterCloudComponent'; -import { element, by } from 'protractor'; +import { FormControllersPage } from '../../material/formControllersPage'; + +import { element, by, browser } from 'protractor'; export class TasksCloudDemoPage { @@ -30,10 +32,29 @@ export class TasksCloudDemoPage { taskFilters = element(by.css("mat-expansion-panel[data-automation-id='Task Filters']")); defaultActiveFilter = element.all(by.css('.adf-filters__entry')).first(); - editTaskFilterCloud = new EditTaskFilterCloudComponent(); createButton = element(by.css('button[data-automation-id="create-button"')); newTaskButton = element(by.css('button[data-automation-id="btn-start-task"]')); + settingsButton = element.all(by.cssContainingText('div[class*="mat-tab-label"] .mat-tab-labels div', 'Settings')).first(); + appButton = element.all(by.cssContainingText('div[class*="mat-tab-label"] .mat-tab-labels div', 'App')).first(); + modeDropDownArrow = element(by.css('mat-form-field[data-automation-id="selectionMode"] div[class*="arrow-wrapper"]')); + modeSelector = element(by.css("div[class*='mat-select-panel']")); + displayTaskDetailsToggle = element(by.css('mat-slide-toggle[data-automation-id="taskDetailsRedirection"]')); + multiSelectionToggle = element(by.css('mat-slide-toggle[data-automation-id="multiSelection"]')); + + formControllersPage = new FormControllersPage(); + + editTaskFilterCloud = new EditTaskFilterCloudComponent(); + + disableDisplayTaskDetails() { + this.formControllersPage.disableToggle(this.displayTaskDetailsToggle); + return this; + } + + enableMultiSelection() { + this.formControllersPage.enableToggle(this.multiSelectionToggle); + return this; + } taskFiltersCloudComponent(filter) { return new TaskFiltersCloudComponent(filter); @@ -68,6 +89,10 @@ export class TasksCloudDemoPage { return new TaskListCloudComponent().getAllRowsByColumn('Id'); } + getAllRowsByProcessDefIdColumn() { + return new TaskListCloudComponent().getAllRowsByColumn('Process Definition Id'); + } + clickOnTaskFilters() { Util.waitUntilElementIsVisible(this.taskFilters); return this.taskFilters.click(); @@ -101,4 +126,35 @@ export class TasksCloudDemoPage { return this.defaultActiveFilter.getAttribute('class').then((value) => value.includes('adf-active')); } + clickSettingsButton() { + this.settingsButton.click(); + browser.driver.sleep(400); + Util.waitUntilElementIsVisible(this.multiSelectionToggle); + Util.waitUntilElementIsVisible(this.modeDropDownArrow); + Util.waitUntilElementIsClickable(this.modeDropDownArrow); + return this; + } + + clickAppButton() { + this.appButton.click(); + this.createButtonIsDisplayed(); + return this; + } + + selectSelectionMode(mode) { + this.clickOnSelectionModeDropDownArrow(); + + let modeElement = element.all(by.cssContainingText('mat-option span', mode)).first(); + Util.waitUntilElementIsClickable(modeElement); + Util.waitUntilElementIsVisible(modeElement); + modeElement.click(); + return this; + } + + clickOnSelectionModeDropDownArrow() { + Util.waitUntilElementIsVisible(this.modeDropDownArrow); + Util.waitUntilElementIsClickable(this.modeDropDownArrow); + this.modeDropDownArrow.click(); + Util.waitUntilElementIsVisible(this.modeSelector); + } } diff --git a/e2e/pages/adf/dialog/contentListPage.ts b/e2e/pages/adf/dialog/contentListPage.ts deleted file mode 100644 index de4cd256ea..0000000000 --- a/e2e/pages/adf/dialog/contentListPage.ts +++ /dev/null @@ -1,446 +0,0 @@ -/*! - * @license - * Copyright 2019 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 { ElementFinder, browser, by, element, protractor } from 'protractor'; -import { DataTablePage } from '../dataTablePage'; -import { Util } from '../../../util/util'; - -export class ContentListPage { - - rootElement: ElementFinder; - dataTable = new DataTablePage(); - deleteContentElement = element(by.css('button[data-automation-id*="DELETE"]')); - metadataAction = element(by.css('button[data-automation-id*="METADATA"]')); - versionManagerAction = element(by.css('button[data-automation-id*="VERSIONS"]')); - moveContentElement = element(by.css('button[data-automation-id*="MOVE"]')); - copyContentElement = element(by.css('button[data-automation-id*="COPY"]')); - lockContentElement = element(by.css('button[data-automation-id="DOCUMENT_LIST.ACTIONS.LOCK"]')); - downloadContent = element(by.css('button[data-automation-id*="DOWNLOAD"]')); - actionMenu = element(by.css('div[role="menu"]')); - optionButton = by.css('button[data-automation-id*="action_menu_"]'); - rowByRowName = by.xpath('ancestor::div[contains(@class, "adf-datatable-row")]'); - nameColumn = by.css('div[class*="datatable-body"] div[class*="adf-data-table-cell"][title="Display name"]'); - nameColumnHeader = by.css('div[data-automation-id="auto_id_name"]'); - createdByColumn = by.css('div[class*="--text"][title="Created by"] span'); - sizeColumn = by.css('div[id*="document-list-container"] div[class*="adf-datatable-row"] .adf-filesize-cell'); - createdByColumnHeader = by.css('div[data-automation-id*="auto_id_createdByUser"]'); - createdColumn = by.css('div[class*="--date"] span'); - createdColumnHeader = by.css('div[data-automation-id*="auto_id_createdAt"]'); - rows = by.css('div[id="document-list-container"] div[class*="adf-datatable-body"] div[class*="adf-datatable-row"]'); - emptyFolderMessage = element(by.css('div[class="adf-empty-folder-this-space-is-empty"]')); - table = element.all(by.css('adf-datatable')).first(); - tableBody = element.all(by.css('adf-document-list div[class="adf-datatable-body"]')).first(); - - constructor(rootElement: ElementFinder = element(by.css('adf-document-list'))) { - this.rootElement = rootElement; - } - - getFileHyperlink(fileName) { - return this.dataTable.getFileHyperlink(fileName); - } - - getColumnLocator(column) { - return by.css(`div[id*='document-list-container'] div[class*='adf-datatable-row'] div[title='${column}'] span`); - } - - getTooltip(nodeName) { - return this.getRowByRowName(nodeName).element(by.css(`adf-document-list span[title="${nodeName}"]`)).getAttribute('title'); - } - - getRowsName(content) { - let row = element.all(by.css(`adf-document-list span[title='${content}']`)).first(); - Util.waitUntilElementIsVisible(row); - return row; - } - - getRowsNameWithRoot(content) { - let row = this.rootElement.all(by.css(`adf-datatable span[title='${content}']`)).first(); - Util.waitUntilElementIsVisible(row); - return row; - } - - getRowByRowName(content) { - Util.waitUntilElementIsVisible(this.getRowsName(content).element(this.rowByRowName)); - return this.getRowsName(content).element(this.rowByRowName); - } - - getRowByRowNameWithRoot(content) { - Util.waitUntilElementIsVisible(this.getRowsNameWithRoot(content).element(this.rowByRowName)); - return this.getRowsNameWithRoot(content).element(this.rowByRowName); - } - - getCellByNameAndColumn(content, columnName) { - return this.getRowByRowName(content).element(by.css(`div[title='${columnName}']`)); - } - - getAllDisplayedRows() { - return element.all(this.rows).count(); - } - - getAllRowsNameColumn() { - return this.getAllRowsColumnValues(this.nameColumn); - } - - getAllRowsColumnValues(locator) { - let deferred = protractor.promise.defer(); - Util.waitUntilElementIsVisible(element.all(locator).first()); - let initialList = []; - - element.all(locator).each(function (currentElement) { - currentElement.getText().then(function (text) { - if (text !== '') { - initialList.push(text); - } - }); - }).then(function () { - deferred.fulfill(initialList); - }); - - return deferred.promise; - } - - deleteContent(content) { - this.clickOnActionMenu(content); - this.waitForContentOptions(); - this.deleteContentElement.click(); - } - - deleteContentWithRoot(content) { - this.clickOnActionMenuWithRoot(content); - this.waitForContentOptions(); - this.deleteContentElement.click(); - } - - checkDeleteIsDisabled(content) { - this.clickOnActionMenu(content); - this.waitForContentOptions(); - let disabledDelete = element(by.css(`button[data-automation-id*='DELETE'][disabled='true']`)); - Util.waitUntilElementIsVisible(disabledDelete); - } - - metadataContent(content) { - this.clickOnActionMenu(content); - this.waitForContentOptions(); - this.metadataAction.click(); - } - - versionManagerContent(content) { - this.clickOnActionMenu(content); - this.waitForContentOptions(); - this.versionManagerAction.click(); - } - - moveContent(content) { - this.clickOnActionMenu(content); - this.moveContentElement.click(); - } - - copyContent(content) { - this.clickOnActionMenu(content); - this.copyContentElement.click(); - } - - lockContent(content) { - this.clickOnActionMenuWithRoot(content); - this.lockContentElement.click(); - } - - waitForContentOptions() { - Util.waitUntilElementIsVisible(this.copyContentElement); - Util.waitUntilElementIsVisible(this.moveContentElement); - Util.waitUntilElementIsVisible(this.deleteContentElement); - Util.waitUntilElementIsVisible(this.downloadContent); - } - - clickOnActionMenu(content) { - this.getRowByRowName(content).element(this.optionButton).click(); - Util.waitUntilElementIsVisible(this.actionMenu); - browser.sleep(500); - return this; - } - - clickOnActionMenuWithRoot(content) { - this.getRowByRowNameWithRoot(content).element(this.optionButton).click(); - Util.waitUntilElementIsVisible(this.actionMenu); - browser.sleep(500); - return this; - } - - sortByColumn(sortOrder, locator) { - Util.waitUntilElementIsVisible(element(locator)); - return element(locator).getAttribute('class').then(function (result) { - if (sortOrder === true) { - if (!result.includes('sorted-asc')) { - if (result.includes('sorted-desc') || result.includes('sortable')) { - element(locator).click(); - } - } - } else { - if (result.includes('sorted-asc')) { - element(locator).click(); - } else if (result.includes('sortable')) { - element(locator).click(); - element(locator).click(); - } - } - - return Promise.resolve(); - }); - } - - /** - * Sort the list by name column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - sortByName(sortOrder) { - this.sortByColumn(sortOrder, this.nameColumnHeader); - } - - /** - * Sort the list by author column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - sortByAuthor(sortOrder) { - this.sortByColumn(sortOrder, this.createdByColumnHeader); - } - - /** - * Sort the list by created column. - * - * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant - */ - sortByCreated(sortOrder) { - this.sortByColumn(sortOrder, this.createdColumnHeader); - } - - /** - * Check the list is sorted by name column. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't - */ - checkListIsOrderedByNameColumn(sortOrder) { - let deferred = protractor.promise.defer(); - deferred.fulfill(this.checkListIsSorted(sortOrder, this.nameColumn)); - return deferred.promise; - } - - /** - * Check the list is sorted by author column. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't - */ - checkListIsOrderedByAuthorColumn(sortOrder) { - let deferred = protractor.promise.defer(); - deferred.fulfill(this.checkListIsSorted(sortOrder, this.createdByColumn)); - return deferred.promise; - } - - checkListIsOrderedBySizeColumn(sortOrder) { - let deferred = protractor.promise.defer(); - deferred.fulfill(this.checkListIsSorted(sortOrder, this.sizeColumn)); - return deferred.promise; - } - - /** - * Check the list is sorted by created column. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't - */ - checkListIsOrderedByCreatedColumn(sortOrder) { - let deferred = protractor.promise.defer(); - let lastValue; - let sorted = true; - - element.all(this.createdColumn).map(function (currentElement) { - return currentElement.getText(); - }).then(function (texts) { - texts.forEach(function (text) { - if (lastValue !== undefined) { - let currentDate = new Date(text); - let lastDate = new Date(lastValue); - if (sortOrder === true && currentDate.getTime() < lastDate.getTime()) { - sorted = false; - } - if (sortOrder === false && currentDate.getTime() > lastDate.getTime()) { - sorted = false; - } - } - lastValue = text; - }); - deferred.fulfill(sorted); - }); - return deferred.promise; - } - - /** - * Check the list is sorted. - * - * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant - * @param locator: locator for column - * @return 'true' if the list is sorted as expected and 'false' if it isn't - */ - checkListIsSorted(sortOrder, locator) { - let deferred = protractor.promise.defer(); - Util.waitUntilElementIsVisible(element.all(locator).first()); - let initialList = []; - element.all(locator).each(function (currentElement) { - currentElement.getText().then(function (text) { - initialList.push(text); - }); - }).then(function () { - let sortedList = initialList; - sortedList = sortedList.sort(); - if (sortOrder === false) { - sortedList = sortedList.reverse(); - } - deferred.fulfill(initialList.toString() === sortedList.toString()); - }); - return deferred.promise; - } - - navigateToFolder(folder) { - let row = this.getRowsName(folder); - Util.waitUntilElementIsVisible(row); - Util.waitUntilElementIsOnPage(row); - row.click(); - this.checkRowIsSelected(folder); - browser.actions().sendKeys(protractor.Key.ENTER).perform(); - return this; - } - - doubleClickRow(selectRow) { - let row = this.getRowsName(selectRow); - Util.waitUntilElementIsVisible(row); - Util.waitUntilElementIsClickable(row); - row.click(); - Util.waitUntilElementIsVisible(this.getRowByRowName(selectRow).element(by.css(`div[class*='--image'] mat-icon[svgicon*='selected']`))); - browser.actions().sendKeys(protractor.Key.ENTER).perform(); - return this; - } - - doubleClickEntireRow(selectRow) { - let row = this.getRowByRowName(selectRow); - Util.waitUntilElementIsVisible(row); - Util.waitUntilElementIsClickable(row); - row.click(); - Util.waitUntilElementIsVisible(this.getRowByRowName(selectRow).element(by.css(`div[class*='--image'] mat-icon[svgicon*='selected']`))); - browser.actions().sendKeys(protractor.Key.ENTER).perform(); - return this; - } - - checkRowIsSelected(content) { - let isRowSelected = this.getRowsName(content).element(by.xpath(`ancestor::div[contains(@class, 'is-selected')]`)); - Util.waitUntilElementIsVisible(isRowSelected); - } - - checkRowIsSelectedWithRoot(content) { - let isRowSelected = this.getRowsNameWithRoot(content).element(by.xpath(`ancestor::div[contains(@class, 'is-selected')]`)); - Util.waitUntilElementIsVisible(isRowSelected); - } - - checkContentIsDisplayed(content) { - Util.waitUntilElementIsVisible(this.getRowByRowName(content)); - return this; - } - - getNodeIdByFilename(filename) { - let nodeIdColumn = element.all(by.xpath(`//div[@id='document-list-container']//div[@filename='${filename}' and @title='Node id']`)); - return nodeIdColumn.getText(); - } - - async getAllNodeIdInList() { - let nodeIdColumns = await element.all(by.xpath(`//div[@id='document-list-container']//div[@title='Node id']`)); - return await nodeIdColumns.map(async (currentElement) => { - return await currentElement.getText().then((nodeText) => { - return nodeText; - }); - }); - } - - checkEmptyFolderMessageIsDisplayed() { - Util.waitUntilElementIsVisible(this.emptyFolderMessage); - return this; - } - - checkContextActionIsVisible(actionName) { - let actionButton = element(by.css(`button[data-automation-id="context-${actionName}"`)); - Util.waitUntilElementIsVisible(actionButton); - Util.waitUntilElementIsClickable(actionButton); - return actionButton; - } - - pressContextMenuActionNamed(actionName) { - let actionButton = this.checkContextActionIsVisible(actionName); - actionButton.click(); - } - - clickRowToSelect(rowName) { - let row = this.getRowByRowName(rowName); - browser.actions().keyDown(protractor.Key.COMMAND).click(row).perform(); - this.checkRowIsSelected(rowName); - return this; - } - - clickRowToSelectWithRoot(rowName) { - let row = this.getRowByRowNameWithRoot(rowName); - browser.actions().keyDown(protractor.Key.COMMAND).click(row).perform(); - this.checkRowIsSelectedWithRoot(rowName); - return this; - } - - checkLockedIcon(content) { - let lockIcon = element(by.cssContainingText('div[filename="' + content + '"] mat-icon', 'lock')); - Util.waitUntilElementIsVisible(lockIcon); - return this; - } - - checkUnlockedIcon(content) { - let lockIcon = element(by.cssContainingText('div[filename="' + content + '"] mat-icon', 'lock_open')); - Util.waitUntilElementIsVisible(lockIcon); - return this; - } - - waitForTableBody() { - Util.waitUntilElementIsVisible(this.tableBody); - } - - checkContentIsNotDisplayed(filename) { - Util.waitUntilElementIsNotVisible(element.all(by.css(`#document-list-container span[title='${filename}']`)).first()); - return this; - } - - tableIsLoaded() { - Util.waitUntilElementIsVisible(this.table); - return this; - } - - checkIconColumn(file, extension) { - let row = this.getRowByRowName(file); - Util.waitUntilElementIsVisible(row.element(by.css(`div[class*='--image'] img[alt*="${extension}"]`))); - } - - rightClickOnRowNamed(rowName) { - let row = this.getRowByRowName(rowName); - browser.actions().click(row, protractor.Button.RIGHT).perform(); - Util.waitUntilElementIsVisible(element(by.id('adf-context-menu-content'))); - } -} diff --git a/e2e/pages/adf/dialog/editProcessFilterDialog.ts b/e2e/pages/adf/dialog/editProcessFilterDialog.ts new file mode 100644 index 0000000000..47250b6377 --- /dev/null +++ b/e2e/pages/adf/dialog/editProcessFilterDialog.ts @@ -0,0 +1,82 @@ +/*! + * @license + * Copyright 2019 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 { by, element, protractor } from 'protractor'; +import { Util } from '../../../util/util'; + +export class EditProcessFilterDialog { + + componentElement = element(by.css('adf-cloud-process-filter-dialog-cloud')); + title = element(by.id('adf-process-filter-dialog-title')); + filterNameInput = element(by.id('adf-filter-name-id')); + saveButtonLocator = by.id('adf-save-button-id'); + cancelButtonLocator = by.id('adf-cancel-button-id'); + + clickOnSaveButton() { + let saveButton = this.componentElement.element(this.saveButtonLocator); + Util.waitUntilElementIsVisible(saveButton); + saveButton.click(); + Util.waitUntilElementIsNotVisible(this.componentElement); + return this; + } + + checkSaveButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.componentElement.element(this.saveButtonLocator)); + return this.componentElement.element(this.saveButtonLocator).isEnabled(); + } + + clickOnCancelButton() { + let cancelButton = this.componentElement.element(this.cancelButtonLocator); + Util.waitUntilElementIsVisible(cancelButton); + cancelButton.click(); + Util.waitUntilElementIsNotVisible(this.componentElement); + return this; + } + + checkCancelButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.componentElement.element(this.cancelButtonLocator)); + return this.componentElement.element(this.cancelButtonLocator).isEnabled(); + } + + getFilterName() { + Util.waitUntilElementIsVisible(this.filterNameInput); + return this.filterNameInput.getAttribute('value'); + } + + setFilterName(filterName) { + this.clearFilterName(); + this.filterNameInput.sendKeys(filterName); + return this; + } + + clearFilterName() { + Util.waitUntilElementIsVisible(this.filterNameInput); + this.filterNameInput.click(); + this.filterNameInput.getAttribute('value').then((value) => { + for (let i = value.length; i >= 0; i--) { + this.filterNameInput.sendKeys(protractor.Key.BACK_SPACE); + } + }); + return this; + } + + getTitle() { + Util.waitUntilElementIsVisible(this.title); + return this.title.getText(); + } + +} diff --git a/e2e/pages/adf/dialog/editTaskFilterDialog.ts b/e2e/pages/adf/dialog/editTaskFilterDialog.ts index 92a91c44f3..4ae99bed12 100644 --- a/e2e/pages/adf/dialog/editTaskFilterDialog.ts +++ b/e2e/pages/adf/dialog/editTaskFilterDialog.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { by, element } from 'protractor'; +import { by, element, protractor } from 'protractor'; import { Util } from '../../../util/util'; export class EditTaskFilterDialog { diff --git a/e2e/pages/adf/dialog/shareDialog.ts b/e2e/pages/adf/dialog/shareDialog.ts index 2193e769bc..a9d3acf92d 100644 --- a/e2e/pages/adf/dialog/shareDialog.ts +++ b/e2e/pages/adf/dialog/shareDialog.ts @@ -111,7 +111,7 @@ export class ShareDialog { } calendarTodayDayIsDisabled() { - const today = this.dayPicker.element(by.css('.mat-datetimepicker-calendar-body-today')).getText(); + const today: any = this.dayPicker.element(by.css('.mat-datetimepicker-calendar-body-today')).getText(); Util.waitUntilElementIsPresent(element(by.cssContainingText('.mat-datetimepicker-calendar-body-disabled', today))); } diff --git a/e2e/pages/adf/dialog/uploadDialog.ts b/e2e/pages/adf/dialog/uploadDialog.ts index c2883e5862..1e11c82ab1 100644 --- a/e2e/pages/adf/dialog/uploadDialog.ts +++ b/e2e/pages/adf/dialog/uploadDialog.ts @@ -27,7 +27,6 @@ export class UploadDialog { cancelledStatusIcon = by.css('div[class*="status--cancelled"]'); errorStatusIcon = by.css('div[class*="status--error"] mat-icon'); errorTooltip = element(by.css('div.mat-tooltip')); - cancelWhileUploadingIcon = by.css('mat-icon[class*="adf-file-uploading-row__action adf-file-uploading-row__action--cancel"]'); rowByRowName = by.xpath('ancestor::adf-file-uploading-list-row'); title = element(by.css('span[class*="upload-dialog__title"]')); minimizeButton = element(by.css('mat-icon[title="Minimize"]')); @@ -114,12 +113,6 @@ export class UploadDialog { return this; } - removeFileWhileUploading(content) { - browser.driver.actions().mouseMove(this.getRowByRowName(content).element(this.sizeUploaded)).perform(); - this.getRowByRowName(content).element(this.cancelWhileUploadingIcon).click(); - return this; - } - getTitleText() { Util.waitUntilElementIsVisible(this.title); let deferred = protractor.promise.defer(); @@ -165,7 +158,7 @@ export class UploadDialog { numberOfCurrentFilesUploaded() { let deferred = protractor.promise.defer(); - this.getTitleText().then((text) => { + this.getTitleText().then((text: any) => { deferred.fulfill(text.split('Uploaded ')[1].split(' / ')[0]); }); return deferred.promise; @@ -173,7 +166,7 @@ export class UploadDialog { numberOfInitialFilesUploaded() { let deferred = protractor.promise.defer(); - this.getTitleText().then((text) => { + this.getTitleText().then((text: any) => { deferred.fulfill(text.split('Uploaded ')[1].split(' / ')[1]); }); return deferred.promise; diff --git a/e2e/pages/adf/dialog/uploadToggles.ts b/e2e/pages/adf/dialog/uploadToggles.ts index 8e55d1a479..ef05555eb3 100644 --- a/e2e/pages/adf/dialog/uploadToggles.ts +++ b/e2e/pages/adf/dialog/uploadToggles.ts @@ -47,6 +47,30 @@ export class UploadToggles { return this; } + checkFolderUploadToggleIsEnabled() { + let enabledToggle = element(by.css('mat-slide-toggle[id="adf-folder-upload-switch"][class*="mat-checked"]')); + Util.waitUntilElementIsVisible(enabledToggle); + return this; + } + + checkMultipleFileUploadToggleIsEnabled() { + let enabledToggle = element(by.css('mat-slide-toggle[id="adf-multiple-upload-switch"][class*="mat-checked"]')); + Util.waitUntilElementIsVisible(enabledToggle); + return this; + } + + checkMaxSizeToggleIsEnabled() { + let enabledToggle = element(by.css('mat-slide-toggle[id="adf-max-size-filter-upload-switch"][class*="mat-checked"]')); + Util.waitUntilElementIsVisible(enabledToggle); + return this; + } + + checkVersioningToggleIsEnabled() { + let enabledToggle = element(by.css('mat-slide-toggle[id="adf-version-upload-switch"][class*="mat-checked"]')); + Util.waitUntilElementIsVisible(enabledToggle); + return this; + } + disableFolderUpload() { this.formControllersPage.disableToggle(this.uploadFolderToggle); return this; diff --git a/e2e/pages/adf/filePreviewPage.ts b/e2e/pages/adf/filePreviewPage.ts index 3f0190e8fc..4672cd6733 100644 --- a/e2e/pages/adf/filePreviewPage.ts +++ b/e2e/pages/adf/filePreviewPage.ts @@ -29,8 +29,8 @@ export class FilePreviewPage { } viewFile(fileName) { - Util.waitUntilElementIsVisible(element(by.cssContainingText(`div[data-automation-id="${filename}"]`, fileName))); - browser.actions().doubleClick(element(by.cssContainingText(`div[data-automation-id="${filename}"]`, fileName))).perform(); + Util.waitUntilElementIsVisible(element(by.cssContainingText(`div[data-automation-id="${fileName}"]`, fileName))); + browser.actions().doubleClick(element(by.cssContainingText(`div[data-automation-id="${fileName}"]`, fileName))).perform(); this.waitForElements(); } @@ -38,7 +38,7 @@ export class FilePreviewPage { let deferred = protractor.promise.defer(); Util.waitUntilElementIsVisible(this.pdfTitleFromSearch); Util.waitUntilElementIsVisible(this.textLayer); - this.pdfTitleFromSearch.getText().then(function (result) { + this.pdfTitleFromSearch.getText().then((result) => { deferred.fulfill(result); }); return deferred.promise; @@ -152,13 +152,13 @@ export class FilePreviewPage { } checkCanvasWidth() { - return element.all(by.css(`div[class='canvasWrapper'] > canvas`)).first().getAttribute(`width`).then(function (width) { + return element.all(by.css(`div[class='canvasWrapper'] > canvas`)).first().getAttribute(`width`).then((width) => { return width; }); } checkCanvasHeight() { - return element.all(by.css(`div[class='canvasWrapper'] > canvas`)).first().getAttribute(`height`).then(function (height) { + return element.all(by.css(`div[class='canvasWrapper'] > canvas`)).first().getAttribute(`height`).then((height) => { return height; }); } @@ -175,14 +175,14 @@ export class FilePreviewPage { actualHeight, zoomedInHeight; - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { actualWidth = width; if (actualWidth && zoomedInWidth) { expect(zoomedInWidth).toBeGreaterThan(actualWidth); } }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then( (height) => { actualHeight = height; if (actualHeight && zoomedInHeight) { expect(zoomedInHeight).toBeGreaterThan(actualHeight); @@ -191,14 +191,14 @@ export class FilePreviewPage { this.clickZoomIn(); - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { zoomedInWidth = width; if (actualWidth && zoomedInWidth) { expect(zoomedInWidth).toBeGreaterThan(actualWidth); } }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then( (height) => { zoomedInHeight = height; if (actualHeight && zoomedInHeight) { expect(zoomedInHeight).toBeGreaterThan(actualHeight); @@ -220,27 +220,27 @@ export class FilePreviewPage { newWidth, newHeight; - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { actualWidth = width; }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then((height) => { actualHeight = height; }); this.clickZoomIn(); - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { zoomedWidth = width; }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then((height) => { zoomedHeight = height; }); this.clickActualSize(); - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { newWidth = width; if (actualWidth && zoomedWidth && newWidth) { expect(newWidth).toBeLessThan(zoomedWidth); @@ -248,7 +248,7 @@ export class FilePreviewPage { } }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then((height) => { newHeight = height; if (actualHeight && zoomedHeight && newHeight) { expect(newHeight).toBeLessThan(zoomedHeight); @@ -267,17 +267,16 @@ export class FilePreviewPage { let actualWidth, zoomedOutWidth, actualHeight, - zoomedOutHeight, - zoomedInHeight; + zoomedOutHeight; - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { actualWidth = width; if (actualWidth && zoomedOutWidth) { expect(zoomedOutWidth).toBeLessThan(actualWidth); } }); - this.checkCanvasHeight().then(function (height) { + this.checkCanvasHeight().then((height) => { actualHeight = height; if (actualHeight && zoomedOutHeight) { expect(zoomedOutHeight).toBeLessThan(actualHeight); @@ -286,15 +285,14 @@ export class FilePreviewPage { this.clickZoomOut(); - this.checkCanvasWidth().then(function (width) { + this.checkCanvasWidth().then((width) => { zoomedOutWidth = width; if (actualWidth && zoomedOutWidth) { expect(zoomedOutWidth).toBeLessThan(actualWidth); } }); - this.checkCanvasHeight().then(function (height) { - zoomedInHeight = height; + this.checkCanvasHeight().then(() => { if (actualHeight && zoomedOutHeight) { expect(zoomedOutHeight).toBeLessThan(actualHeight); } diff --git a/e2e/pages/adf/lockFilePage.ts b/e2e/pages/adf/lockFilePage.ts index 873a819311..98c79450e9 100644 --- a/e2e/pages/adf/lockFilePage.ts +++ b/e2e/pages/adf/lockFilePage.ts @@ -20,7 +20,7 @@ import { element, by } from 'protractor'; export class LockFilePage { - cancelButton = element(by.css('button[aria-label="Close dialog"]')); + cancelButton = element(by.css('button[data-automation-id="lock-dialog-btn-cancel"]')); saveButton = element(by.cssContainingText('button span', 'Save')); lockFileCheckboxText = element(by.cssContainingText('mat-checkbox label span', ' Lock file ')); lockFileCheckbox = element(by.css('mat-checkbox[data-automation-id="adf-lock-node-checkbox"]')); diff --git a/e2e/pages/adf/metadataViewPage.ts b/e2e/pages/adf/metadataViewPage.ts index 65d18ca70f..768c8ad422 100644 --- a/e2e/pages/adf/metadataViewPage.ts +++ b/e2e/pages/adf/metadataViewPage.ts @@ -43,6 +43,7 @@ export class MetadataViewPage { multiSwitch = element(by.id(`adf-metadata-multi`)); presetSwitch = element(by.id('adf-toggle-custom-preset')); defaultPropertiesSwitch = element(by.id('adf-metadata-default-properties')); + closeButton = element(by.cssContainingText('button.mat-button span', 'Close')); getTitle(): promise.Promise { Util.waitUntilElementIsVisible(this.title); @@ -282,4 +283,9 @@ export class MetadataViewPage { let property = element(by.css('div[data-automation-id="card-' + type + '-label-' + propertyName + '"]')); Util.waitUntilElementIsNotVisible(property); } + + clickCloseButton() { + Util.waitUntilElementIsVisible(this.closeButton); + this.closeButton.click(); + } } diff --git a/e2e/pages/adf/navigationBarPage.ts b/e2e/pages/adf/navigationBarPage.ts index c12d103a49..e3efb1053f 100644 --- a/e2e/pages/adf/navigationBarPage.ts +++ b/e2e/pages/adf/navigationBarPage.ts @@ -18,21 +18,24 @@ import { Util } from '../../util/util'; import { browser, by, element } from 'protractor'; import { ProcessServicesPage } from './process-services/processServicesPage'; -import { AppListCloudComponent } from './process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import TestConfig = require('../../test.config'); +import { PeopleGroupCloudComponentPage } from './demo-shell/process-services/peopleGroupCloudComponentPage'; export class NavigationBarPage { contentServicesButton = element(by.css('a[data-automation-id="Content Services"]')); dataTableButton = element(by.css('a[data-automation-id="Datatable"]')); + dataTableNestedButton = element(by.css('button[data-automation-id="Datatable"]')); taskListButton = element(by.css("a[data-automation-id='Task List']")); configEditorButton = element(by.css('a[data-automation-id="Configuration Editor"]')); processServicesButton = element(by.css('a[data-automation-id="Process Services"]')); + processServicesNestedButton = element(by.css('button[data-automation-id="App"]')); processServicesCloudButton = element(by.css('a[data-automation-id="Process Cloud"]')); + processServicesCloudHomeButton = element(by.css('button[data-automation-id="Home"]')); loginButton = element(by.css('a[data-automation-id="Login"]')); trashcanButton = element(by.css('a[data-automation-id="Trashcan"]')); overlayViewerButton = element(by.css('a[data-automation-id="Overlay Viewer"]')); - userProfileButton = element(by.css('button[data-automation-id="adf-user-profile"]')); themeButton = element(by.css('button[data-automation-id="theme menu"]')); themeMenuContent = element(by.css('div[class*="mat-menu-panel"]')); logoutButton = element(by.css('a[adf-logout]')); @@ -41,15 +44,19 @@ export class NavigationBarPage { appTitle = element(by.css('.adf-app-title')); headerDataButton = element(by.css('a[data-automation-id="Header Data"]')); menuButton = element(by.css('button[data-automation-id="adf-menu-icon"]')); - formButton = element(by.css('a[data-automation-id="Form"]')); + formButton = element(by.css('button[data-automation-id="Form"]')); treeViewButton = element(by.css('a[data-automation-id="Tree View"]')); iconsButton = element(by.css('a[data-automation-id="Icons"]')); customSourcesButton = element(by.css('a[data-automation-id="Custom Sources"]')); settingsButton = element(by.css('a[data-automation-id="Settings"]')); + peopleGroupCloudButton = element(by.css('button[data-automation-id="People/Group Cloud"]')); + aboutButton = element(by.css('a[data-automation-id="About"]')); navigateToDatatable() { Util.waitUntilElementIsVisible(this.dataTableButton); this.dataTableButton.click(); + Util.waitUntilElementIsVisible(this.dataTableNestedButton); + this.dataTableNestedButton.click(); } clickContentServicesButton() { @@ -70,19 +77,31 @@ export class NavigationBarPage { navigateToProcessServicesPage() { Util.waitUntilElementIsVisible(this.processServicesButton); this.processServicesButton.click(); + Util.waitUntilElementIsVisible(this.processServicesNestedButton); + this.processServicesNestedButton.click(); return new ProcessServicesPage(); } navigateToProcessServicesCloudPage() { Util.waitUntilElementIsVisible(this.processServicesCloudButton); this.processServicesCloudButton.click(); - return new AppListCloudComponent(); + Util.waitUntilElementIsVisible(this.processServicesCloudHomeButton); + this.processServicesCloudHomeButton.click(); + return new AppListCloudPage(); + } + + navigateToPeopleGroupCloudPage() { + Util.waitUntilElementIsVisible(this.processServicesCloudButton); + this.processServicesCloudButton.click(); + Util.waitUntilElementIsVisible(this.peopleGroupCloudButton); + this.peopleGroupCloudButton.click(); + return new PeopleGroupCloudComponentPage(); } navigateToSettingsPage() { Util.waitUntilElementIsVisible(this.settingsButton); this.settingsButton.click(); - return new AppListCloudComponent(); + return new AppListCloudPage(); } clickLoginButton() { @@ -101,11 +120,6 @@ export class NavigationBarPage { return this; } - clickUserProfile() { - Util.waitUntilElementIsVisible(this.userProfileButton); - this.userProfileButton.click(); - } - clickThemeButton() { Util.waitUntilElementIsVisible(this.themeButton); this.themeButton.click(); @@ -151,6 +165,15 @@ export class NavigationBarPage { return this.headerDataButton.click(); } + clickAboutButton() { + Util.waitUntilElementIsClickable(this.aboutButton); + return this.aboutButton.click(); + } + + checkAboutButtonIsDisplayed() { + return Util.waitUntilElementIsVisible(this.aboutButton); + } + checkMenuButtonIsDisplayed() { return Util.waitUntilElementIsVisible(this.menuButton); } @@ -176,6 +199,8 @@ export class NavigationBarPage { } clickFormButton() { + Util.waitUntilElementIsVisible(this.processServicesButton); + this.processServicesButton.click(); Util.waitUntilElementIsVisible(this.formButton); return this.formButton.click(); } diff --git a/e2e/pages/adf/paginationPage.ts b/e2e/pages/adf/paginationPage.ts index 640ff64a26..a1d3a91007 100644 --- a/e2e/pages/adf/paginationPage.ts +++ b/e2e/pages/adf/paginationPage.ts @@ -22,7 +22,7 @@ export class PaginationPage { itemsPerPageDropdown = element(by.css('div[class*="adf-pagination__perpage-block"] button')); pageSelectorDropDown = element(by.css('div[class*="adf-pagination__page-selector"]')); - pageSelectorArrow = element(by.css('button[aria-label="Current page selector"]')); + pageSelectorArrow = element(by.css('button[data-automation-id="page-selector"]')); itemsPerPage = element(by.css('span[class="adf-pagination__max-items"]')); currentPage = element(by.css('span[class="adf-pagination__current-page"]')); totalPages = element(by.css('span[class="adf-pagination__total-pages"]')); @@ -41,10 +41,8 @@ export class PaginationPage { Util.waitUntilElementIsClickable(this.itemsPerPageDropdown); browser.actions().mouseMove(this.itemsPerPageDropdown).perform(); Util.waitUntilElementIsVisible(this.itemsPerPageDropdown); - Util.waitUntilElementIsClickable(this.itemsPerPageDropdown).then(() => { - browser.driver.sleep(2000); - this.itemsPerPageDropdown.click(); - }); + Util.waitUntilElementIsClickable(this.itemsPerPageDropdown); + this.itemsPerPageDropdown.click(); Util.waitUntilElementIsVisible(this.pageSelectorDropDown); let itemsPerPage = element.all(by.cssContainingText('.mat-menu-item', numberOfItem)).first(); @@ -93,9 +91,7 @@ export class PaginationPage { Util.waitUntilElementIsClickable(this.nextPageButton); browser.actions().mouseMove(this.nextPageButton).perform(); Util.waitUntilElementIsVisible(this.nextPageButton); - Util.waitUntilElementIsClickable(this.nextPageButton).then(() => { - browser.driver.sleep(2000); - }); + Util.waitUntilElementIsClickable(this.nextPageButton); return this.nextPageButton.click(); } diff --git a/e2e/pages/adf/permissionsPage.ts b/e2e/pages/adf/permissionsPage.ts index c689a5ed59..8c83a85c76 100644 --- a/e2e/pages/adf/permissionsPage.ts +++ b/e2e/pages/adf/permissionsPage.ts @@ -18,6 +18,11 @@ import { element, by } from 'protractor'; import { Util } from '../../util/util'; +import { DataTableComponentPage } from './dataTableComponentPage'; + +let column = { + role: 'Role' +}; export class PermissionsPage { @@ -26,6 +31,20 @@ export class PermissionsPage { searchUserInput = element(by.id('searchInput')); searchResults = element.all(by.id('adf-search-results-content')).first(); addButton = element(by.id('add-permission-dialog-confirm-button')); + permissionInheritedButton = element.all(by.css("div[class='adf-inherit_permission_button'] button")).first(); + permissionInheritedButtonText = this.permissionInheritedButton.element(by.css('span')); + noPermissions = element(by.css('div[id="adf-no-permissions-template"]')); + roleDropdown = element(by.id('adf-select-role-permission')); + roleDropdownOptions = element.all(by.css('.mat-option-text')); + assignPermissionError = element(by.css('simple-snack-bar')); + deletePermissionButton = element(by.css(`button[data-automation-id='adf-delete-permission-button']`)); + permissionDisplayContainer = element(by.css(`div[id='adf-permission-display-container']`)); + closeButton = element(by.id('add-permission-dialog-close-button')); + + clickCloseButton() { + Util.waitUntilElementIsClickable(this.closeButton); + this.closeButton.click(); + } checkAddPermissionButtonIsDisplayed() { Util.waitUntilElementIsVisible(this.addPermissionButton); @@ -46,6 +65,7 @@ export class PermissionsPage { searchUserOrGroup(name) { Util.waitUntilElementIsClickable(this.searchUserInput); + this.searchUserInput.clear(); return this.searchUserInput.sendKeys(name); } @@ -66,4 +86,73 @@ export class PermissionsPage { Util.waitUntilElementIsVisible(userOrGroupName); } + checkUserOrGroupIsDeleted(name) { + let userOrGroupName = element(by.css('div[data-automation-id="text_' + name + '"]')); + Util.waitUntilElementIsNotVisible(userOrGroupName); + } + + checkPermissionInheritedButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.permissionInheritedButton); + } + + clickPermissionInheritedButton() { + Util.waitUntilElementIsClickable(this.permissionInheritedButton); + return this.permissionInheritedButton.click(); + } + + clickDeletePermissionButton() { + Util.waitUntilElementIsClickable(this.deletePermissionButton); + return this.deletePermissionButton.click(); + } + + checkNoPermissionsIsDisplayed() { + Util.waitUntilElementIsVisible(this.noPermissions); + } + + getPermissionInheritedButtonText() { + Util.waitUntilElementIsClickable(this.permissionInheritedButton); + return this.permissionInheritedButtonText.getText(); + } + + checkPermissionsDatatableIsDisplayed() { + return new DataTableComponentPage(element(by.css('[class*="adf-datatable-permission"]'))); + } + + getRoleCellValue(rowName) { + let locator = new DataTableComponentPage().getCellByRowAndColumn('Authority ID', rowName, column.role); + Util.waitUntilElementIsVisible(locator); + return locator.getText(); + } + + clickRoleDropdown() { + Util.waitUntilElementIsVisible(this.roleDropdown); + return this.roleDropdown.click(); + } + + getRoleDropdownOptions() { + Util.waitUntilElementIsVisible(this.roleDropdownOptions); + return this.roleDropdownOptions; + } + + selectOption(name) { + let selectProcessDropdown = element(by.cssContainingText('.mat-option-text', name)); + Util.waitUntilElementIsVisible(selectProcessDropdown); + Util.waitUntilElementIsClickable(selectProcessDropdown); + selectProcessDropdown.click(); + return this; + } + + getAssignPermissionErrorText() { + Util.waitUntilElementIsVisible(this.assignPermissionError); + return this.assignPermissionError.getText(); + } + + checkPermissionContainerIsDisplayed() { + Util.waitUntilElementIsVisible(this.permissionDisplayContainer); + } + + checkUserOrGroupIsDisplayed(name) { + let userOrGroupName = element(by.cssContainingText('mat-list-option .mat-list-text', name)); + Util.waitUntilElementIsVisible(userOrGroupName); + } } diff --git a/e2e/pages/adf/process-cloud/editProcessFilterCloudComponent.ts b/e2e/pages/adf/process-cloud/editProcessFilterCloudComponent.ts index 5e8acdb3b0..3a081692f7 100644 --- a/e2e/pages/adf/process-cloud/editProcessFilterCloudComponent.ts +++ b/e2e/pages/adf/process-cloud/editProcessFilterCloudComponent.ts @@ -15,12 +15,22 @@ * limitations under the License. */ import { Util } from '../../../util/util'; -import { by, element } from 'protractor'; +import { by, element, protractor } from 'protractor'; +import { EditProcessFilterDialog } from '../dialog/editProcessFilterDialog'; export class EditProcessFilterCloudComponent { customiseFilter = element(by.id('adf-edit-process-filter-title-id')); - selectedOption = element(by.css('mat-option[class*="mat-selected"]')); + selectedOption = element.all(by.css('mat-option[class*="mat-selected"]')).first(); + saveButton = element(by.css('button[data-automation-id="adf-filter-action-save"]')); + saveAsButton = element(by.css('button[data-automation-id="adf-filter-action-saveAs"]')); + deleteButton = element(by.css('button[data-automation-id="adf-filter-action-delete"]')); + + editProcessFilter = new EditProcessFilterDialog(); + + editProcessFilterDialog() { + return this.editProcessFilter; + } clickCustomiseFilterHeader() { Util.waitUntilElementIsVisible(this.customiseFilter); @@ -28,16 +38,28 @@ export class EditProcessFilterCloudComponent { return this; } - setStateFilterDropDown(option) { - this.clickOnDropDownArrow('state'); - - let stateElement = element.all(by.cssContainingText('mat-option span', option)).first(); - Util.waitUntilElementIsClickable(stateElement); - Util.waitUntilElementIsVisible(stateElement); - stateElement.click(); + checkCustomiseFilterHeaderIsExpanded() { + let expansionPanelExtended = element.all(by.css('mat-expansion-panel-header[class*="mat-expanded"]')).first(); + Util.waitUntilElementIsVisible(expansionPanelExtended); + let content = element(by.css('div[class*="mat-expansion-panel-content "][style*="visible"]')); + Util.waitUntilElementIsVisible(content); return this; } + setStatusFilterDropDown(option) { + this.clickOnDropDownArrow('status'); + + let statusElement = element.all(by.cssContainingText('mat-option span', option)).first(); + Util.waitUntilElementIsClickable(statusElement); + Util.waitUntilElementIsVisible(statusElement); + statusElement.click(); + return this; + } + + getStateFilterDropDownValue() { + return element(by.css("mat-form-field[data-automation-id='status'] span")).getText(); + } + setSortFilterDropDown(option) { this.clickOnDropDownArrow('sort'); @@ -48,6 +70,12 @@ export class EditProcessFilterCloudComponent { return this; } + getSortFilterDropDownValue() { + let sortLocator = element.all(by.css("mat-form-field[data-automation-id='sort'] span")).first(); + Util.waitUntilElementIsVisible(sortLocator); + return sortLocator.getText(); + } + setOrderFilterDropDown(option) { this.clickOnDropDownArrow('order'); @@ -58,10 +86,118 @@ export class EditProcessFilterCloudComponent { return this; } + getOrderFilterDropDownValue() { + return element(by.css("mat-form-field[data-automation-id='order'] span")).getText(); + } + clickOnDropDownArrow(option) { - let dropDownArrow = element(by.css("mat-form-field[data-automation-id='" + option + "'] div[class*='arrow']")); + let dropDownArrow = element.all(by.css("mat-form-field[data-automation-id='" + option + "'] div[class='mat-select-arrow-wrapper']")).first(); Util.waitUntilElementIsVisible(dropDownArrow); + Util.waitUntilElementIsClickable(dropDownArrow); dropDownArrow.click(); Util.waitUntilElementIsVisible(this.selectedOption); } + + setAppNameDropDown(option) { + this.clickOnDropDownArrow('appName'); + + let appNameElement = element.all(by.cssContainingText('mat-option span', option)).first(); + Util.waitUntilElementIsClickable(appNameElement); + Util.waitUntilElementIsVisible(appNameElement); + appNameElement.click(); + return this; + } + + async checkAppNamesAreUnique() { + let appNameList = element.all(by.css('mat-option[data-automation-id="adf-cloud-edit-process-property-optionsappName"] span')); + let appTextList: any = await appNameList.getText(); + let uniqueArray = appTextList.filter((appName) => { + let sameAppNameArray = appTextList.filter((eachApp) => eachApp === appName); + return sameAppNameArray.length === 1; + }); + return uniqueArray.length === appTextList.length; + } + + getNumberOfAppNameOptions() { + this.clickOnDropDownArrow('appName'); + let dropdownOptions = element.all(by.css('.mat-select-panel mat-option')); + return dropdownOptions.count(); + } + + setProcessInstanceId(option) { + return this.setProperty('processInstanceId', option); + } + + getProcessInstanceId() { + return this.getProperty('processInstanceId'); + } + + getProperty(property) { + let locator = element.all(by.css('input[data-automation-id="adf-cloud-edit-process-property-' + property + '"]')).first(); + Util.waitUntilElementIsVisible(locator); + return locator.getAttribute('value'); + } + + setProperty(property, option) { + let locator = element.all(by.css('input[data-automation-id="adf-cloud-edit-process-property-' + property + '"]')).first(); + Util.waitUntilElementIsVisible(locator); + locator.clear(); + locator.sendKeys(option); + locator.sendKeys(protractor.Key.ENTER); + return this; + } + + checkSaveButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.saveButton); + return this; + } + + checkSaveAsButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.saveAsButton); + return this; + } + + checkDeleteButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.deleteButton); + return this; + } + + checkSaveButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.saveButton); + return this.saveButton.isEnabled(); + } + + checkSaveAsButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.saveAsButton); + return this.saveAsButton.isEnabled(); + } + + checkDeleteButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.deleteButton); + return this.deleteButton.isEnabled(); + } + + clickSaveAsButton() { + let disabledButton = element(by.css(("button[data-automation-id='adf-filter-action-saveAs'][disabled]"))); + Util.waitUntilElementIsClickable(this.saveAsButton); + Util.waitUntilElementIsVisible(this.saveAsButton); + Util.waitUntilElementIsNotVisible(disabledButton); + this.saveAsButton.click(); + return this.editProcessFilter; + } + + clickDeleteButton() { + Util.waitUntilElementIsVisible(this.deleteButton); + this.deleteButton.click(); + return this; + } + + clickSaveButton() { + let disabledButton = element(by.css(("button[data-automation-id='adf-filter-action-saveAs'][disabled]"))); + Util.waitUntilElementIsClickable(this.saveButton); + Util.waitUntilElementIsVisible(this.saveButton); + Util.waitUntilElementIsNotVisible(disabledButton); + this.saveButton.click(); + return this; + } } diff --git a/e2e/pages/adf/process-cloud/editTaskFilterCloudComponent.ts b/e2e/pages/adf/process-cloud/editTaskFilterCloudComponent.ts index 3653172760..3fe046548f 100644 --- a/e2e/pages/adf/process-cloud/editTaskFilterCloudComponent.ts +++ b/e2e/pages/adf/process-cloud/editTaskFilterCloudComponent.ts @@ -22,11 +22,19 @@ import { EditTaskFilterDialog } from '../dialog/editTaskFilterDialog'; export class EditTaskFilterCloudComponent { customiseFilter = element(by.id('adf-edit-task-filter-title-id')); - selectedOption = element(by.css('mat-option[class*="mat-selected"]')); - assignment = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-assignment"]')); - saveButton = element(by.css('button[id="adf-save-id"]')); - saveAsButton = element(by.css('button[id="adf-save-as-id"]')); - deleteButton = element(by.css('button[id="adf-delete-id"]')); + selectedOption = element.all(by.css('mat-option[class*="mat-selected"]')).first(); + assignee = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-assignee"]')); + priority = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-priority"]')); + taskName = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-taskName"]')); + processDefinitionId = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-processDefinitionId"]')); + processInstanceId = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-processInstanceId"]')); + lastModifiedFrom = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-lastModifiedFrom"]')); + lastModifiedTo = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-lastModifiedTo"]')); + parentTaskId = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-parentTaskId"]')); + owner = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-owner"]')); + saveButton = element(by.css('[data-automation-id="adf-filter-action-save"]')); + saveAsButton = element(by.css('[data-automation-id="adf-filter-action-saveAs"]')); + deleteButton = element(by.css('[data-automation-id="adf-filter-action-delete"]')); editTaskFilter = new EditTaskFilterDialog(); @@ -40,18 +48,18 @@ export class EditTaskFilterCloudComponent { return this; } - setStateFilterDropDown(option) { - this.clickOnDropDownArrow('state'); + setStatusFilterDropDown(option) { + this.clickOnDropDownArrow('status'); - let stateElement = element.all(by.cssContainingText('mat-option span', option)).first(); - Util.waitUntilElementIsClickable(stateElement); - Util.waitUntilElementIsVisible(stateElement); - stateElement.click(); + let statusElement = element.all(by.cssContainingText('mat-option span', option)).first(); + Util.waitUntilElementIsVisible(statusElement); + Util.waitUntilElementIsClickable(statusElement); + statusElement.click(); return this; } - getStateFilterDropDownValue() { - return element(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-state'] span")).getText(); + getStatusFilterDropDownValue() { + return element.all(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-status'] span")).first().getText(); } setSortFilterDropDown(option) { @@ -65,7 +73,7 @@ export class EditTaskFilterCloudComponent { } getSortFilterDropDownValue() { - let elementSort = element(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-sort'] span")); + let elementSort = element.all(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-sort'] span")).first(); Util.waitUntilElementIsVisible(elementSort); return elementSort.getText(); } @@ -81,26 +89,64 @@ export class EditTaskFilterCloudComponent { } getOrderFilterDropDownValue() { - return element(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-order'] span")).getText(); + return element.all(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-order'] span")).first().getText(); } clickOnDropDownArrow(option) { - let dropDownArrow = element(by.css("mat-form-field[data-automation-id='" + option + "'] div[class*='arrow']")); + let dropDownArrow = element.all(by.css("mat-form-field[data-automation-id='" + option + "'] div[class*='arrow']")).first(); Util.waitUntilElementIsVisible(dropDownArrow); dropDownArrow.click(); Util.waitUntilElementIsVisible(this.selectedOption); } - setAssignment(option) { - Util.waitUntilElementIsVisible(this.assignment); - this.assignment.clear(); - this.assignment.sendKeys(option); - this.assignment.sendKeys(protractor.Key.ENTER); - return this; + setAssignee(option) { + return this.setProperty('assignee', option); } - getAssignment() { - return this.assignment.getText(); + getAssignee() { + return this.assignee.getText(); + } + + setPriority(option) { + return this.setProperty('priority', option); + } + + getPriority() { + return this.priority.getText(); + } + + setParentTaskId(option) { + return this.setProperty('parentTaskId', option); + } + + getParentTaskId() { + return this.parentTaskId.getText(); + } + + setOwner(option) { + return this.setProperty('owner', option); + } + + getOwner() { + return this.owner.getText(); + } + + setLastModifiedFrom(option) { + this.clearField(this.lastModifiedFrom); + return this.setProperty('lastModifiedFrom', option); + } + + getLastModifiedFrom() { + return this.lastModifiedFrom.getText(); + } + + setLastModifiedTo(option) { + this.clearField(this.lastModifiedTo); + return this.setProperty('lastModifiedTo', option); + } + + getLastModifiedTo() { + return this.lastModifiedTo.getText(); } checkSaveButtonIsDisplayed() { @@ -134,8 +180,10 @@ export class EditTaskFilterCloudComponent { } clickSaveAsButton() { + let disabledButton = element(by.css(("button[data-automation-id='adf-filter-action-saveAs'][disabled]"))); Util.waitUntilElementIsClickable(this.saveAsButton); Util.waitUntilElementIsVisible(this.saveAsButton); + Util.waitUntilElementIsNotVisible(disabledButton); this.saveAsButton.click(); return this.editTaskFilter; } @@ -152,8 +200,8 @@ export class EditTaskFilterCloudComponent { return this; } - clearAssignment() { - this.clearField(this.assignment); + clearAssignee() { + this.clearField(this.assignee); return this; } @@ -166,4 +214,53 @@ export class EditTaskFilterCloudComponent { }); } + setAppNameDropDown(option) { + this.clickOnDropDownArrow('appName'); + + let appNameElement = element.all(by.cssContainingText('mat-option span', option)).first(); + Util.waitUntilElementIsClickable(appNameElement); + Util.waitUntilElementIsVisible(appNameElement); + appNameElement.click(); + return this; + } + + getAppNameDropDownValue() { + let locator = element.all(by.css("mat-select[data-automation-id='adf-cloud-edit-task-property-appName'] span")).first(); + Util.waitUntilElementIsVisible(locator); + return locator.getText(); + } + + setTaskName(option) { + return this.setProperty('taskName', option); + } + + getTaskName() { + return this.taskName.getAttribute('value'); + } + + setProcessDefinitionId(option) { + return this.setProperty('processDefinitionId', option); + } + + getProcessDefinitionId() { + return this.processDefinitionId.getAttribute('value'); + } + + setProcessInstanceId(option) { + return this.setProperty('processInstanceId', option); + } + + setProperty(property, option) { + let locator = element(by.css('input[data-automation-id="adf-cloud-edit-task-property-' + property + '"]')); + Util.waitUntilElementIsVisible(locator); + locator.clear(); + locator.sendKeys(option); + locator.sendKeys(protractor.Key.ENTER); + return this; + } + + getProcessInstanceId() { + return this.processInstanceId.getAttribute('value'); + } + } diff --git a/e2e/pages/adf/process-cloud/groupCloudComponent.ts b/e2e/pages/adf/process-cloud/groupCloudComponent.ts new file mode 100644 index 0000000000..f262903dbf --- /dev/null +++ b/e2e/pages/adf/process-cloud/groupCloudComponent.ts @@ -0,0 +1,62 @@ +/*! + * @license + * Copyright 2019 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 { by, element, protractor } from 'protractor'; +import { Util } from '../../../util/util'; + +export class GroupCloudComponent { + + groupCloudSearch = element(by.css('input[data-automation-id="adf-cloud-group-search-input"]')); + + searchGroups(name) { + Util.waitUntilElementIsVisible(this.groupCloudSearch); + this.groupCloudSearch.clear().then(() => { + for (let i = 0; i < name.length; i++) { + this.groupCloudSearch.sendKeys(name[i]); + } + this.groupCloudSearch.sendKeys(protractor.Key.BACK_SPACE); + this.groupCloudSearch.sendKeys(name[name.length - 1]); + }); + return this; + } + + selectGroupFromList(name) { + let groupRow = element.all(by.cssContainingText('mat-option span', name)).first(); + Util.waitUntilElementIsVisible(groupRow); + groupRow.click(); + Util.waitUntilElementIsNotVisible(groupRow); + return this; + } + + checkGroupIsDisplayed(name) { + let groupRow = element.all(by.cssContainingText('mat-option span', name)).first(); + Util.waitUntilElementIsVisible(groupRow); + return this; + } + + checkGroupIsNotDisplayed(name) { + let groupRow = element.all(by.cssContainingText('mat-option span', name)).first(); + Util.waitUntilElementIsNotVisible(groupRow); + return this; + } + + checkSelectedGroup(group) { + Util.waitUntilElementIsVisible(element(by.cssContainingText('mat-chip[data-automation-id*="adf-cloud-group-chip-"]', group))); + return this; + } + +} diff --git a/e2e/pages/adf/process-cloud/peopleCloudComponent.ts b/e2e/pages/adf/process-cloud/peopleCloudComponent.ts new file mode 100644 index 0000000000..6e802db453 --- /dev/null +++ b/e2e/pages/adf/process-cloud/peopleCloudComponent.ts @@ -0,0 +1,75 @@ +/*! + * @license + * Copyright 2019 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 { by, element, protractor } from 'protractor'; +import { Util } from '../../../util/util'; + +export class PeopleCloudComponent { + + peopleCloudSearch = element(by.css('input[data-automation-id="adf-people-cloud-search-input"]')); + + searchAssigneeAndSelect(name) { + Util.waitUntilElementIsVisible(this.peopleCloudSearch); + this.peopleCloudSearch.clear(); + this.peopleCloudSearch.sendKeys(name); + this.selectAssigneeFromList(name); + return this; + } + + searchAssignee(name) { + Util.waitUntilElementIsVisible(this.peopleCloudSearch); + this.peopleCloudSearch.clear().then(() => { + for (let i = 0; i < name.length; i++) { + this.peopleCloudSearch.sendKeys(name[i]); + } + this.peopleCloudSearch.sendKeys(protractor.Key.BACK_SPACE); + this.peopleCloudSearch.sendKeys(name[name.length - 1]); + }); + return this; + } + + selectAssigneeFromList(name) { + let assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); + Util.waitUntilElementIsVisible(assigneeRow); + assigneeRow.click(); + Util.waitUntilElementIsNotVisible(assigneeRow); + return this; + } + + getAssignee() { + Util.waitUntilElementIsVisible(this.peopleCloudSearch); + return this.peopleCloudSearch.getAttribute('value'); + } + + checkUserIsDisplayed(name) { + let assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); + Util.waitUntilElementIsVisible(assigneeRow); + return this; + } + + checkUserIsNotDisplayed(name) { + let assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); + Util.waitUntilElementIsNotVisible(assigneeRow); + return this; + } + + checkSelectedPeople(person) { + Util.waitUntilElementIsVisible(element(by.cssContainingText('mat-chip-list mat-chip', person))); + return this; + } + +} diff --git a/e2e/pages/adf/process-cloud/processListCloudComponent.ts b/e2e/pages/adf/process-cloud/processListCloudComponent.ts index 089b613955..ab4e24ea0b 100644 --- a/e2e/pages/adf/process-cloud/processListCloudComponent.ts +++ b/e2e/pages/adf/process-cloud/processListCloudComponent.ts @@ -16,20 +16,36 @@ */ import { Util } from '../../../util/util'; -import { DataTablePage } from '../dataTablePage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; import { element, by } from 'protractor'; export class ProcessListCloudComponent { processList = element(by.css('adf-cloud-process-list')); - noProcessFound = element.all(by.css("p[class='adf-empty-content__title']")).first(); + noProcessFound = element.all(by.css("div[class='adf-empty-content__title']")).first(); - dataTable = new DataTablePage(this.processList); + dataTable = new DataTableComponentPage(this.processList); getDataTable() { return this.dataTable; } + checkContentIsDisplayedByName(processName) { + return this.dataTable.checkContentIsDisplayed('Name', processName); + } + + checkContentIsDisplayedById(processId) { + return this.dataTable.checkContentIsDisplayed('Id', processId); + } + + checkContentIsNotDisplayedById(processId) { + return this.dataTable.checkContentIsNotDisplayed('Id', processId); + } + + getAllRowsNameColumn() { + return this.dataTable.getAllRowsColumnValues('Name'); + } + checkProcessListIsLoaded() { Util.waitUntilElementIsVisible(this.processList); return this; diff --git a/e2e/pages/adf/process-cloud/taskListCloudComponent.ts b/e2e/pages/adf/process-cloud/taskListCloudComponent.ts index 5e9f228aaf..bb3bfffc94 100644 --- a/e2e/pages/adf/process-cloud/taskListCloudComponent.ts +++ b/e2e/pages/adf/process-cloud/taskListCloudComponent.ts @@ -16,20 +16,76 @@ */ import { Util } from '../../../util/util'; -import { DataTablePage } from '../dataTablePage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; import { element, by } from 'protractor'; +let column = { + id: 'Id' +}; + export class TaskListCloudComponent { taskList = element(by.css('adf-cloud-task-list')); - noTasksFound = element.all(by.css("p[class='adf-empty-content__title']")).first(); + noTasksFound = element.all(by.css("div[class='adf-empty-content__title']")).first(); - dataTable = new DataTablePage(this.taskList); + dataTable = new DataTableComponentPage(this.taskList); getDataTable() { return this.dataTable; } + clickCheckbox(taskName) { + return this.dataTable.clickCheckbox('Name', taskName); + } + + checkRowIsNotChecked(taskName) { + return this.dataTable.checkRowIsNotChecked('Name', taskName); + } + + checkRowIsChecked(taskName) { + return this.dataTable.checkRowIsChecked('Name', taskName); + } + + getRowsWithSameName(taskName) { + return this.dataTable.getRowsWithSameColumnValues('Name', taskName); + } + + checkRowIsSelected(taskName) { + return this.dataTable.checkRowIsSelected('Name', taskName); + } + + checkRowIsNotSelected(taskName) { + return this.dataTable.checkRowIsNotSelected('Name', taskName); + } + + selectRowWithKeyboard(taskName) { + return this.dataTable.selectRowWithKeyboard('Name', taskName); + } + + selectRow(taskName) { + return this.dataTable.selectRow('Name', taskName); + } + + getRow(taskName) { + return this.dataTable.getRow('Name', taskName); + } + + checkContentIsDisplayedByProcessInstanceId(taskName) { + return this.dataTable.checkContentIsDisplayed('ProcessInstanceId', taskName); + } + + checkContentIsDisplayedById(taskName) { + return this.dataTable.checkContentIsDisplayed('Id', taskName); + } + + checkContentIsDisplayedByName(taskName) { + return this.dataTable.checkContentIsDisplayed('Name', taskName); + } + + checkContentIsNotDisplayedByName(taskName) { + return this.dataTable.checkContentIsNotDisplayed('Name', taskName); + } + checkTaskListIsLoaded() { Util.waitUntilElementIsVisible(this.taskList); return this; @@ -40,8 +96,18 @@ export class TaskListCloudComponent { return this.noTasksFound.getText(); } - getAllRowsByColumn(column) { - return this.dataTable.getAllRowsColumnValues(column); + getAllRowsNameColumn() { + return this.dataTable.getAllRowsColumnValues('Name'); + } + + getAllRowsByColumn(columnName) { + return this.dataTable.getAllRowsColumnValues(columnName); + } + + getIdCellValue(rowName) { + let locator = new DataTableComponentPage().getCellByRowAndColumn('Name', rowName, column.id); + Util.waitUntilElementIsVisible(locator); + return locator.getText(); } } diff --git a/e2e/pages/adf/process-services/analyticsPage.ts b/e2e/pages/adf/process-services/analyticsPage.ts index 6e1254354f..ff837660b5 100644 --- a/e2e/pages/adf/process-services/analyticsPage.ts +++ b/e2e/pages/adf/process-services/analyticsPage.ts @@ -21,9 +21,8 @@ import { element, by, protractor } from 'protractor'; export class AnalyticsPage { toolbarTitleInput = element(by.css('input[data-automation-id="reportName"]')); - toolbarTitleContainer = element(by.css('div[class="adf-report-title ng-star-inserted"]')); + toolbarTitleContainer = element(by.css('adf-toolbar-title')); toolbarTitle = element(by.xpath('//mat-toolbar/adf-toolbar-title/div/h4')); - reportContainer = element(by.css('div[class="adf-report-report-container"]')); reportMessage = element(by.css('div[class="ng-star-inserted"] span')); getReport(title) { @@ -33,7 +32,6 @@ export class AnalyticsPage { } changeReportTitle(title) { - Util.waitUntilElementIsVisible(this.reportContainer); Util.waitUntilElementIsVisible(this.toolbarTitleContainer); Util.waitUntilElementIsClickable(this.toolbarTitleContainer); this.toolbarTitleContainer.click(); diff --git a/e2e/pages/adf/process-services/appNavigationBarPage.ts b/e2e/pages/adf/process-services/appNavigationBarPage.ts index 90391f72d9..8b3b1e5927 100644 --- a/e2e/pages/adf/process-services/appNavigationBarPage.ts +++ b/e2e/pages/adf/process-services/appNavigationBarPage.ts @@ -16,7 +16,7 @@ */ import { Util } from '../../../util/util'; -import { element, by } from 'protractor'; +import { element, by, browser } from 'protractor'; export class AppNavigationBarPage { diff --git a/e2e/pages/adf/process-services/dialog/createChecklistDialog.ts b/e2e/pages/adf/process-services/dialog/createChecklistDialog.ts index fdd06cbced..36d167de1a 100644 --- a/e2e/pages/adf/process-services/dialog/createChecklistDialog.ts +++ b/e2e/pages/adf/process-services/dialog/createChecklistDialog.ts @@ -26,7 +26,8 @@ export class ChecklistDialog { dialogTitle = element(by.id('add-checklist-title')); addName(name) { - Util.waitUntilElementIsVisible(this.nameField); + Util.waitUntilElementIsClickable(this.nameField); + this.nameField.clear(); this.nameField.sendKeys(name); return this; } diff --git a/e2e/pages/adf/process-services/filtersPage.ts b/e2e/pages/adf/process-services/filtersPage.ts index 5639bada7a..c2fbf060f8 100644 --- a/e2e/pages/adf/process-services/filtersPage.ts +++ b/e2e/pages/adf/process-services/filtersPage.ts @@ -17,13 +17,12 @@ import { by, element } from 'protractor'; import { Util } from '../../../util/util'; -import { ContentListPage } from '../dialog/contentListPage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; export class FiltersPage { activeFilter = element(by.css('mat-list-item[class*="active"]')); - nameColumn = by.css('div[class*="adf-datatable-body"] div[class*="adf-datatable-row"] div[class*="--text"] span'); - contentList = new ContentListPage(); + dataTable = new DataTableComponentPage(); getActiveFilter() { Util.waitUntilElementIsVisible(this.activeFilter); @@ -38,11 +37,11 @@ export class FiltersPage { } sortByName(sortOrder) { - this.contentList.sortByName(sortOrder); + this.dataTable.sortByColumn(sortOrder, 'name'); } getAllRowsNameColumn() { - return this.contentList.getAllRowsColumnValues(this.nameColumn); + return this.dataTable.getAllRowsColumnValues('Name'); } } diff --git a/e2e/pages/adf/process-services/formFields.ts b/e2e/pages/adf/process-services/formFields.ts index c2085852b0..a56bffb4bd 100644 --- a/e2e/pages/adf/process-services/formFields.ts +++ b/e2e/pages/adf/process-services/formFields.ts @@ -36,7 +36,8 @@ export class FormFields { setFieldValue(locator, field, value) { let fieldElement = element(locator(field)); Util.waitUntilElementIsVisible(fieldElement); - fieldElement.clear().sendKeys(value); + fieldElement.clear(); + fieldElement.sendKeys(value); return this; } @@ -56,13 +57,13 @@ export class FormFields { return widget; } - getFieldValue(fieldId, valueLocatorParam) { + getFieldValue(fieldId, valueLocatorParam?: any) { let value = this.getWidget(fieldId).element(valueLocatorParam || this.valueLocator); Util.waitUntilElementIsVisible(value); return value.getAttribute('value'); } - getFieldLabel(fieldId, labelLocatorParam) { + getFieldLabel(fieldId, labelLocatorParam?: any) { let label = this.getWidget(fieldId).all(labelLocatorParam || this.labelLocator).first(); Util.waitUntilElementIsVisible(label); return label.getText(); @@ -73,7 +74,7 @@ export class FormFields { return error.getText(); } - getFieldText(fieldId, labelLocatorParam) { + getFieldText(fieldId, labelLocatorParam?: any) { let label = this.getWidget(fieldId).element(labelLocatorParam || this.labelLocator); Util.waitUntilElementIsVisible(label); return label.getText(); @@ -158,7 +159,8 @@ export class FormFields { setValueInInputById(fieldId, value) { let input = element(by.id(fieldId)); Util.waitUntilElementIsVisible(input); - input.clear().sendKeys(value); + input.clear(); + input.sendKeys(value); return this; } diff --git a/e2e/pages/adf/process-services/processDetailsPage.ts b/e2e/pages/adf/process-services/processDetailsPage.ts index 62841c777e..82f272d19b 100644 --- a/e2e/pages/adf/process-services/processDetailsPage.ts +++ b/e2e/pages/adf/process-services/processDetailsPage.ts @@ -16,7 +16,7 @@ */ import { Util } from '../../../util/util'; -import { by, element } from 'protractor'; +import { by, element, protractor } from 'protractor'; export class ProcessDetailsPage { diff --git a/e2e/pages/adf/process-services/processFiltersPage.ts b/e2e/pages/adf/process-services/processFiltersPage.ts index e0dec9184c..70df30722b 100644 --- a/e2e/pages/adf/process-services/processFiltersPage.ts +++ b/e2e/pages/adf/process-services/processFiltersPage.ts @@ -16,12 +16,13 @@ */ import { Util } from '../../../util/util'; -import { ContentListPage } from '../dialog/contentListPage'; import { element, by } from 'protractor'; import { StartProcessPage } from './startProcessPage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; export class ProcessFiltersPage { + dataTable = new DataTableComponentPage(); runningFilter = element(by.css('span[data-automation-id="Running_filter"]')); completedFilter = element(by.css('div[class="mat-list-text"] > span[data-automation-id="Completed_filter"]')); allFilter = element(by.css('span[data-automation-id="All_filter"]')); @@ -30,10 +31,9 @@ export class ProcessFiltersPage { processesPage = element(by.css('div[class="adf-grid"] > div[class="adf-grid-item adf-processes-menu"]')); accordionMenu = element(by.css('.adf-processes-menu mat-accordion')); buttonWindow = element(by.css('div > button[data-automation-id="btn-start-process"] > div')); - noContentMessage = element.all(by.css('p[class="adf-empty-content__title"]')).first(); + noContentMessage = element.all(by.css('div[class="adf-empty-content__title"]')).first(); rows = by.css('adf-process-instance-list div[class="adf-datatable-body"] div[class*="adf-datatable-row"]'); tableBody = element.all(by.css('adf-datatable div[class="adf-datatable-body"]')).first(); - contentList = new ContentListPage(); nameColumn = by.css('div[class*="adf-datatable-body"] div[class*="adf-datatable-row"] div[title="Name"] span'); processIcon = by.xpath('ancestor::div[@class="mat-list-item-content"]/mat-icon'); @@ -106,11 +106,11 @@ export class ProcessFiltersPage { * @param sortOrder : 'true' to sort the list ascendant and 'false' for descendant */ sortByName(sortOrder) { - this.contentList.sortByName(sortOrder); + this.dataTable.sortByColumn(sortOrder, 'name'); } getAllRowsNameColumn() { - return this.contentList.getAllRowsColumnValues(this.nameColumn); + return this.dataTable.getAllRowsColumnValues('Name'); } checkFilterIsDisplayed(name) { diff --git a/e2e/pages/adf/process-services/processListPage.ts b/e2e/pages/adf/process-services/processListPage.ts index 1c2a2be6a5..ae161b1571 100644 --- a/e2e/pages/adf/process-services/processListPage.ts +++ b/e2e/pages/adf/process-services/processListPage.ts @@ -20,7 +20,7 @@ import { element, by } from 'protractor'; export class ProcessListPage { - processListTitle = element.all(by.css("p[class='adf-empty-content__title']")).first(); + processListTitle = element.all(by.css("div[class='adf-empty-content__title']")).first(); processInstanceList = element(by.css('adf-process-instance-list')); checkProcessListTitleIsDisplayed() { diff --git a/e2e/pages/adf/process-services/startProcessPage.ts b/e2e/pages/adf/process-services/startProcessPage.ts index 7c762b2f02..cec499039a 100644 --- a/e2e/pages/adf/process-services/startProcessPage.ts +++ b/e2e/pages/adf/process-services/startProcessPage.ts @@ -16,7 +16,7 @@ */ import { Util } from '../../../util/util'; -import { by, element, Key } from 'protractor'; +import { by, element, Key, protractor, browser } from 'protractor'; export class StartProcessPage { diff --git a/e2e/pages/adf/process-services/taskDetailsPage.ts b/e2e/pages/adf/process-services/taskDetailsPage.ts index cfe7ba12cd..176433243e 100644 --- a/e2e/pages/adf/process-services/taskDetailsPage.ts +++ b/e2e/pages/adf/process-services/taskDetailsPage.ts @@ -18,11 +18,12 @@ import { AppSettingsToggles } from './dialog/appSettingsToggles'; import { Util } from '../../../util/util'; import { element, by, protractor, browser } from 'protractor'; -import { TabsPage } from '../material/tabsPage'; +import { TabsPage } from '@alfresco/adf-testing'; export class TaskDetailsPage { appSettingsTogglesClass = new AppSettingsToggles(); + formContent = element(by.css('adf-form')); formNameField = element(by.css('span[data-automation-id*="formName"] span')); assigneeField = element(by.css('span[data-automation-id*="assignee"] span')); @@ -42,7 +43,7 @@ export class TaskDetailsPage { involvePeopleButton = element(by.css('div[class*="add-people"]')); addPeopleField = element(by.css('input[data-automation-id="adf-people-search-input"]')); addInvolvedUserButton = element(by.css('button[id="add-people"] span')); - emailInvolvedUser = by.xpath('following-sibling::div[@class="adf-people-email ng-star-inserted"]'); + emailInvolvedUser = by.xpath('following-sibling::div[@class="adf-people-email"]'); editActionInvolvedUser = by.xpath('following-sibling::div[@class="adf-people-edit-label ng-star-inserted"]'); involvedUserPic = by.xpath('ancestor::div/ancestor::div/preceding-sibling::div//div[@class="adf-people-search-people-pic ng-star-inserted"]'); taskDetailsInfoDrawer = element(by.tagName('adf-info-drawer')); @@ -231,6 +232,7 @@ export class TaskDetailsPage { addComment(comment) { Util.waitUntilElementIsVisible(this.commentField); this.commentField.sendKeys(comment); + Util.waitUntilElementIsVisible(this.addCommentButton); this.addCommentButton.click(); return this; } diff --git a/e2e/pages/adf/process-services/tasksListPage.ts b/e2e/pages/adf/process-services/tasksListPage.ts index 2fd90cd523..ecd5338af6 100644 --- a/e2e/pages/adf/process-services/tasksListPage.ts +++ b/e2e/pages/adf/process-services/tasksListPage.ts @@ -16,19 +16,43 @@ */ import { Util } from '../../../util/util'; -import { DataTablePage } from '../dataTablePage'; +import { DataTableComponentPage } from '../dataTableComponentPage'; import { by, element } from 'protractor'; export class TasksListPage { taskList = element(by.css('adf-tasklist')); - noTasksFound = element.all(by.css("p[class='adf-empty-content__title']")).first(); - dataTable = new DataTablePage(this.taskList); + noTasksFound = element.all(by.css("div[class='adf-empty-content__title']")).first(); + dataTable = new DataTableComponentPage(this.taskList); getDataTable() { return this.dataTable; } + getRowsDisplayedWithSameName(taskName) { + return this.dataTable.getRowsWithSameColumnValues('Name', taskName); + } + + checkContentIsDisplayed(taskName) { + return this.dataTable.checkContentIsDisplayed('Name', taskName); + } + + checkContentIsNotDisplayed(taskName) { + return this.dataTable.checkContentIsNotDisplayed('Name', taskName); + } + + checkRowIsSelected(taskName) { + return this.dataTable.checkRowIsSelected('Name', taskName); + } + + selectRow(taskName) { + return this.dataTable.selectRow('Name', taskName); + } + + getAllRowsNameColumn() { + return this.dataTable.getAllRowsColumnValues('Name'); + } + checkTaskListIsLoaded() { Util.waitUntilElementIsVisible(this.taskList); return this; diff --git a/e2e/pages/adf/process-services/tasksPage.ts b/e2e/pages/adf/process-services/tasksPage.ts index 9fb57be99a..8320319422 100644 --- a/e2e/pages/adf/process-services/tasksPage.ts +++ b/e2e/pages/adf/process-services/tasksPage.ts @@ -33,7 +33,7 @@ export class TasksPage { rowByRowName = by.xpath('ancestor::mat-chip'); checklistContainer = by.css('div[class*="checklist-menu"]'); taskTitle = 'h2[class="adf-activiti-task-details__header"] span'; - rows = by.css('div[class*="adf-datatable-body"] div[class*="adf-datatable-row"] div[class*="adf-data-table-cell"]'); + rows = by.css('div[class*="adf-datatable-body"] div[class*="adf-datatable-row"] div[class*="adf-datatable-cell"]'); completeButtonNoForm = element(by.id('adf-no-form-complete-button')); checklistDialog = element(by.id('checklist-dialog')); checklistNoMessage = element(by.id('checklist-none-message')); @@ -163,11 +163,11 @@ export class TasksPage { } clickSortByNameAsc() { - return this.tasksListPage().getDataTable().sortByColumn(true, this.sortByName); + return this.tasksListPage().getDataTable().sortByColumn(true, 'name'); } clickSortByNameDesc() { - return this.tasksListPage().getDataTable().sortByColumn(false, this.sortByName); + return this.tasksListPage().getDataTable().sortByColumn(false, 'name'); } } diff --git a/e2e/pages/adf/process-services/widgets/dynamicTableWidget.ts b/e2e/pages/adf/process-services/widgets/dynamicTableWidget.ts index df10141d5e..31fe69f206 100644 --- a/e2e/pages/adf/process-services/widgets/dynamicTableWidget.ts +++ b/e2e/pages/adf/process-services/widgets/dynamicTableWidget.ts @@ -35,8 +35,7 @@ export class DynamicTableWidget { calendarContent = element(by.css('div[class="mat-datetimepicker-calendar-content"]')); saveButton = element(by.cssContainingText('button span', 'Save')); errorMessage = element(by.css('div[class="adf-error-text"]')); - dateWidget = element.all(by.css('button[aria-label="Open calendar"]')).first(); - calendarNumber = element.all(by.css('td div')); + dateWidget = element.all(by.css('mat-datepicker-toggle button')).first(); tableRow = element.all(by.css('tbody tr')); dataTableInput = element(by.id('id')); @@ -134,18 +133,10 @@ export class DynamicTableWidget { return this.dateWidget.click(); } - getDateCalendarNumber(date) { - return this.calendarNumber.get(date).click(); - } - getTableRow(rowNumber) { return Util.waitUntilElementIsVisible(this.tableRow.get(rowNumber)); } - waitForCalendarToDisappear() { - Util.waitUntilElementIsNotVisible(this.calendarNumber); - } - checkItemIsPresent(item) { let row = element(by.cssContainingText('table tbody tr td span', item)); let present = Util.waitUntilElementIsVisible(row); diff --git a/e2e/pages/adf/process_cloud/editTaskFilterCloudComponent.ts b/e2e/pages/adf/process_cloud/editTaskFilterCloudComponent.ts index 6c9da720c3..f4e1c680a4 100644 --- a/e2e/pages/adf/process_cloud/editTaskFilterCloudComponent.ts +++ b/e2e/pages/adf/process_cloud/editTaskFilterCloudComponent.ts @@ -22,7 +22,7 @@ import { EditTaskFilterDialog } from '../dialog/editTaskFilterDialog'; export class EditTaskFilterCloudComponent { customiseFilter = element(by.id('adf-edit-task-filter-title-id')); - selectedOption = element(by.css('mat-option[class*="mat-selected"]')); + selectedOption = element.all(by.css('mat-option[class*="mat-selected"]')).first(); assignment = element(by.css('mat-form-field[data-automation-id="assignment"] input')); saveButton = element(by.css('button[data-automation-id="Save"]')); saveAsButton = element(by.css('button[data-automation-id="Save as"]')); diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts index cc46338836..8bc5724e3c 100644 --- a/e2e/pages/adf/searchFiltersPage.ts +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -37,6 +37,8 @@ export class SearchFiltersPage { 'mat-expansion-panel[data-automation-id="expansion-panel-My facet queries"]')); facetQueriesTypeGroup = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Type facet queries"]')); facetQueriesSizeGroup = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Size facet queries"]')); + facetIntervalsByCreated = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-The Created"]')); + facetIntervalsByModified = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-TheModified"]')); checkSearchFiltersIsDisplayed() { Util.waitUntilElementIsVisible(this.searchFilters); @@ -66,6 +68,10 @@ export class SearchFiltersPage { return this.searchCategoriesPage.checkListFiltersPage(this.fileTypeFilter); } + checkCustomFacetFieldLabelIsDisplayed(fieldLabel) { + Util.waitUntilElementIsVisible(element(by.css(`mat-expansion-panel[data-automation-id="expansion-panel-${fieldLabel}"]`))); + } + sizeSliderFilterPage() { return this.searchCategoriesPage.sliderFilter(this.sizeSliderFilter); } @@ -110,6 +116,16 @@ export class SearchFiltersPage { return this; } + checkFacetIntervalsByCreatedIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.facetIntervalsByCreated); + return this; + } + + checkFacetIntervalsByModifiedIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.facetIntervalsByModified); + return this; + } + isTypeFacetQueryGroupPresent() { return this.facetQueriesTypeGroup.isPresent(); } @@ -132,6 +148,7 @@ export class SearchFiltersPage { this.searchCategoriesPage.clickFilterHeader(this.fileSizeFilter); return this; } + checkFileSizeFilterIsCollapsed() { this.searchCategoriesPage.checkFilterIsCollapsed(this.fileSizeFilter); return this; @@ -234,4 +251,45 @@ export class SearchFiltersPage { this.searchCategoriesPage.checkFilterIsCollapsed(this.sizeSliderFilter); return this; } + + checkFacetIntervalsByCreatedIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.facetIntervalsByCreated); + return this; + } + + checkFacetIntervalsByCreatedIsCollapsed() { + this.searchCategoriesPage.checkFilterIsCollapsed(this.facetIntervalsByCreated); + return this; + } + + clickFacetIntervalsByCreatedFilterHeader() { + this.searchCategoriesPage.clickFilterHeader(this.facetIntervalsByCreated); + return this; + } + + checkFacetIntervalsByModifiedIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.facetIntervalsByModified); + return this; + } + + checkFacetIntervalsByModifiedIsCollapsed() { + this.searchCategoriesPage.checkFilterIsCollapsed(this.facetIntervalsByModified); + return this; + } + + clickFacetIntervalsByModifiedFilterHeader() { + this.searchCategoriesPage.clickFilterHeader(this.facetIntervalsByModified); + return this; + } + + checkFileTypeFacetLabelIsDisplayed(fileType) { + Util.waitUntilElementIsVisible(this.fileTypeFilter.element(by.cssContainingText('.adf-facet-label', fileType))); + return this; + } + + checkFileTypeFacetLabelIsNotDisplayed(fileType) { + Util.waitUntilElementIsNotVisible(this.fileTypeFilter.element(by.cssContainingText('.adf-facet-label', fileType))); + return this; + } + } diff --git a/e2e/pages/adf/searchResultsPage.ts b/e2e/pages/adf/searchResultsPage.ts index daba010a5c..35c10a7b8b 100644 --- a/e2e/pages/adf/searchResultsPage.ts +++ b/e2e/pages/adf/searchResultsPage.ts @@ -16,22 +16,24 @@ */ import { Util } from '../../util/util'; -import { ContentListPage } from './dialog/contentListPage'; -import { DataTablePage } from './dataTablePage'; +import { DataTableComponentPage } from './dataTableComponentPage'; import { SearchSortingPickerPage } from './content-services/search/components/search-sortingPicker.page'; -import { element, by, protractor } from 'protractor'; +import { element, by } from 'protractor'; import { ContentServicesPage } from './contentServicesPage'; export class SearchResultsPage { noResultsMessage = element(by.css('div[class="adf-no-result-message"]')); - contentList = new ContentListPage(); - dataTable = new DataTablePage(); + dataTable = new DataTableComponentPage(); searchSortingPicker = new SearchSortingPickerPage(); contentServices = new ContentServicesPage(); + getNodeHighlight(content) { + return this.dataTable.getCellByRowAndColumn('Display name', content, 'Search'); + } + tableIsLoaded() { - this.contentList.tableIsLoaded(); + this.dataTable.tableIsLoaded(); } closeActionButton() { @@ -43,16 +45,17 @@ export class SearchResultsPage { } checkContentIsDisplayed(content) { - this.contentList.checkContentIsDisplayed(content); + this.dataTable.checkContentIsDisplayed('Display name', content); return this; } numberOfResultsDisplayed() { - return this.contentList.getAllDisplayedRows(); + return this.dataTable.numberOfRows(); } checkContentIsNotDisplayed(content) { - Util.waitUntilElementIsNotOnPage(element(by.css("span[title='" + content + "']"))); + this.dataTable.checkContentIsNotDisplayed('Display name', content); + return this; } checkNoResultMessageIsDisplayed() { @@ -66,16 +69,16 @@ export class SearchResultsPage { } navigateToFolder(content) { - this.contentList.doubleClickRow(content); + this.dataTable.doubleClickRow('Display name', content); return this; } deleteContent(content) { - this.contentList.deleteContent(content); + this.contentServices.deleteContent(content); } checkDeleteIsDisabled(content) { - this.contentList.checkDeleteIsDisabled(content); + this.contentServices.checkDeleteIsDisabled(content); this.closeActionButton(); } @@ -96,22 +99,6 @@ export class SearchResultsPage { return this; } - sortAndCheckListIsOrderedByName(sortOrder) { - let deferred = protractor.promise.defer(); - this.sortByName(sortOrder); - this.dataTable.waitForTableBody(); - if (sortOrder === true) { - this.checkListIsOrderedByNameAsc().then((result) => { - deferred.fulfill(result); - }); - } else { - this.checkListIsOrderedByNameDesc().then((result) => { - deferred.fulfill(result); - }); - } - return deferred.promise; - } - async checkListIsOrderedByNameAsc() { let list = await this.contentServices.getElementsDisplayedName(); return this.contentServices.checkElementsSortedAsc(list); @@ -122,56 +109,14 @@ export class SearchResultsPage { return this.contentServices.checkElementsSortedDesc(list); } - sortAndCheckListIsOrderedByAuthor(alfrescoJsApi, sortOrder) { - let deferred = protractor.promise.defer(); - this.sortByAuthor(sortOrder); - this.dataTable.waitForTableBody(); - if (sortOrder === true) { - this.checkListIsOrderedByAuthorAsc(alfrescoJsApi).then((result) => { - deferred.fulfill(result); - }); - } else { - this.checkListIsOrderedByAuthorDesc(alfrescoJsApi).then((result) => { - deferred.fulfill(result); - }); - } - return deferred.promise; + async checkListIsOrderedByAuthorAsc() { + let authorList = await this.dataTable.geCellElementDetail('Created by'); + return this.contentServices.checkElementsSortedAsc(authorList); } - async checkListIsOrderedByAuthorAsc(alfrescoJsApi) { - let list = await this.contentServices.getElementsDisplayedAuthor(alfrescoJsApi); - return this.contentServices.checkElementsSortedAsc(list); - } - - async checkListIsOrderedByAuthorDesc(alfrescoJsApi) { - let list = await this.contentServices.getElementsDisplayedAuthor(alfrescoJsApi); - return this.contentServices.checkElementsSortedDesc(list); - } - - sortAndCheckListIsOrderedByCreated(sortOrder) { - let deferred = protractor.promise.defer(); - this.sortByCreated(sortOrder); - this.dataTable.waitForTableBody(); - if (sortOrder === true) { - this.checkListIsOrderedByCreatedAsc().then((result) => { - deferred.fulfill(result); - }); - } else { - this.checkListIsOrderedByCreatedDesc().then((result) => { - deferred.fulfill(result); - }); - } - return deferred.promise; - } - - async checkListIsOrderedByCreatedAsc() { - let list = await this.contentServices.getElementsDisplayedCreated(); - return this.contentServices.checkElementsSortedAsc(list); - } - - async checkListIsOrderedByCreatedDesc() { - let list = await this.contentServices.getElementsDisplayedCreated(); - return this.contentServices.checkElementsSortedDesc(list); + async checkListIsOrderedByAuthorDesc() { + let authorList = await this.dataTable.geCellElementDetail('Created by'); + return this.contentServices.checkElementsSortedDesc(authorList); } async checkListIsOrderedBySizeAsc() { diff --git a/e2e/pages/adf/settingsPage.ts b/e2e/pages/adf/settingsPage.ts index a6ae341862..535c586b9e 100644 --- a/e2e/pages/adf/settingsPage.ts +++ b/e2e/pages/adf/settingsPage.ts @@ -44,6 +44,7 @@ export class SettingsPage { bpmText = element(by.css('input[data-automation-id*="bpmHost"]')); clientIdText = element(by.css('input[id="clientId"]')); authHostText = element(by.css('input[id="oauthHost"]')); + logoutUrlText = element(by.css('input[id="logout-url"]')); basicAuthRadioButton = element(by.cssContainingText('mat-radio-button[id*="mat-radio"]', 'Basic Authentication')); identityHostText = element(by.css('input[id="identityHost"]')); ssoRadioButton = element(by.cssContainingText('[id*="mat-radio"]', 'SSO')); @@ -135,12 +136,28 @@ export class SettingsPage { await this.backButton.click(); } - async clickSsoRadioButton () { + async clickSsoRadioButton() { Util.waitUntilElementIsVisible(this.ssoRadioButton); await this.ssoRadioButton.click(); } - async setProviderBpmSso (processServiceURL, authHost, identityHost, silentLogin = true, implicitFlow = true ) { + async setProviderEcmSso(contentServiceURL, authHost, identityHost, silentLogin = true, implicitFlow = true, clientId?: string, logoutUr: string = '/logout') { + this.goToSettingsPage(); + this.setProvider(this.ecm.option, this.ecm.text); + Util.waitUntilElementIsNotOnPage(this.bpmText); + Util.waitUntilElementIsVisible(this.ecmText); + await this.clickSsoRadioButton(); + await this.setClientId(clientId); + await this.setContentServicesURL(contentServiceURL); + await this.setAuthHost(authHost); + await this.setIdentityHost(identityHost); + await this.setSilentLogin(silentLogin); + await this.setImplicitFlow(implicitFlow); + await this.setLogoutUrl(logoutUr); + await this.clickApply(); + } + + async setProviderBpmSso(processServiceURL, authHost, identityHost, silentLogin = true, implicitFlow = true) { this.goToSettingsPage(); this.setProvider(this.bpm.option, this.bpm.text); Util.waitUntilElementIsVisible(this.bpmText); @@ -155,56 +172,62 @@ export class SettingsPage { await this.clickApply(); } - async setProcessServicesURL (processServiceURL) { + async setLogoutUrl(logoutUrl) { + Util.waitUntilElementIsPresent(this.logoutUrlText); + this.logoutUrlText.clear(); + this.logoutUrlText.sendKeys(logoutUrl); + } + + async setProcessServicesURL(processServiceURL) { Util.waitUntilElementIsVisible(this.bpmText); this.bpmText.clear(); this.bpmText.sendKeys(processServiceURL); } - async setClientId () { + async setClientId(clientId: string = TestConfig.adf_aps.clientIdSso) { Util.waitUntilElementIsVisible(this.clientIdText); this.clientIdText.clear(); - this.clientIdText.sendKeys(TestConfig.adf_aps.clientIdSso); + this.clientIdText.sendKeys(clientId); } - async setContentServicesURL (contentServiceURL) { + async setContentServicesURL(contentServiceURL) { Util.waitUntilElementIsClickable(this.ecmText); this.ecmText.clear(); this.ecmText.sendKeys(contentServiceURL); } - clearContentServicesURL () { + clearContentServicesURL() { Util.waitUntilElementIsVisible(this.ecmText); this.ecmText.clear(); this.ecmText.sendKeys('a'); this.ecmText.sendKeys(protractor.Key.BACK_SPACE); } - clearProcessServicesURL () { + clearProcessServicesURL() { Util.waitUntilElementIsVisible(this.bpmText); this.bpmText.clear(); this.bpmText.sendKeys('a'); this.bpmText.sendKeys(protractor.Key.BACK_SPACE); } - async setAuthHost (authHostURL) { + async setAuthHost(authHostURL) { Util.waitUntilElementIsVisible(this.authHostText); await this.authHostText.clear(); await this.authHostText.sendKeys(authHostURL); } - async setIdentityHost (identityHost) { + async setIdentityHost(identityHost) { Util.waitUntilElementIsVisible(this.identityHostText); await this.identityHostText.clear(); await this.identityHostText.sendKeys(identityHost); } - async clickApply () { + async clickApply() { Util.waitUntilElementIsVisible(this.applyButton); await this.applyButton.click(); } - async setSilentLogin (enableToggle) { + async setSilentLogin(enableToggle) { await Util.waitUntilElementIsVisible(this.silentLoginToggleElement); const isChecked = (await this.silentLoginToggleElement.getAttribute('class')).includes('mat-checked'); @@ -216,7 +239,7 @@ export class SettingsPage { return Promise.resolve(); } - async setImplicitFlow (enableToggle) { + async setImplicitFlow(enableToggle) { await Util.waitUntilElementIsVisible(this.implicitFlowElement); const isChecked = (await this.implicitFlowElement.getAttribute('class')).includes('mat-checked'); diff --git a/e2e/pages/adf/tagPage.ts b/e2e/pages/adf/tagPage.ts index 9084b7e6f5..1cbdf0453b 100644 --- a/e2e/pages/adf/tagPage.ts +++ b/e2e/pages/adf/tagPage.ts @@ -16,7 +16,6 @@ */ import { Util } from '../../util/util'; -import { ContentListPage } from './dialog/contentListPage'; import { element, by, protractor, browser } from 'protractor'; @@ -134,7 +133,7 @@ export class TagPage { checkTagListIsOrderedAscending() { let deferred = protractor.promise.defer(); - new ContentListPage().checkListIsSorted(false, this.tagListRowLocator).then((result) => { + this.checkListIsSorted(false, this.tagListRowLocator).then((result) => { deferred.fulfill(result); }); return deferred.promise; @@ -142,7 +141,7 @@ export class TagPage { checkTagListByNodeIdIsOrderedAscending() { let deferred = protractor.promise.defer(); - new ContentListPage().checkListIsSorted(false, this.tagListByNodeIdRowLocator).then((result) => { + this.checkListIsSorted(false, this.tagListByNodeIdRowLocator).then((result) => { deferred.fulfill(result); }); return deferred.promise; @@ -150,12 +149,32 @@ export class TagPage { checkTagListContentServicesIsOrderedAscending() { let deferred = protractor.promise.defer(); - new ContentListPage().checkListIsSorted(false, this.tagListContentServicesRowLocator).then((result) => { + this.checkListIsSorted(false, this.tagListContentServicesRowLocator).then((result) => { deferred.fulfill(result); }); return deferred.promise; } + checkListIsSorted(sortOrder, locator) { + let deferred = protractor.promise.defer(); + let tagList = element.all(locator); + Util.waitUntilElementIsVisible(tagList.first()); + let initialList = []; + tagList.each(function (currentElement) { + currentElement.getText().then(function (text) { + initialList.push(text); + }); + }).then(function () { + let sortedList = initialList; + sortedList = sortedList.sort(); + if (sortOrder === false) { + sortedList = sortedList.reverse(); + } + deferred.fulfill(initialList.toString() === sortedList.toString()); + }); + return deferred.promise; + } + checkDeleteTagFromTagListByNodeIdIsDisplayed(name) { let deleteChip = element(by.id('tag_chips_delete_' + name)); return Util.waitUntilElementIsVisible(deleteChip); diff --git a/e2e/pages/adf/versionManagerPage.ts b/e2e/pages/adf/versionManagerPage.ts index adf26c925c..6b70c98a2f 100644 --- a/e2e/pages/adf/versionManagerPage.ts +++ b/e2e/pages/adf/versionManagerPage.ts @@ -42,6 +42,32 @@ export class VersionManagePage { return this; } + checkMajorChangeIsDisplayed() { + Util.waitUntilElementIsVisible(this.majorRadio); + return this; + } + + checkMinorChangeIsDisplayed() { + Util.waitUntilElementIsVisible(this.minorRadio); + return this; + } + + checkCommentTextIsDisplayed() { + Util.waitUntilElementIsVisible(this.commentText); + return this; + } + + clickAddNewVersionsButton() { + Util.waitUntilElementIsVisible(this.showNewVersionButton); + this.showNewVersionButton.click(); + return this; + } + + checkCancelButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.cancelButton); + return this; + } + uploadNewVersionFile(fileLocation) { browser.setFileDetector(new remote.FileDetector()); Util.waitUntilElementIsVisible(this.uploadNewVersionButton); diff --git a/e2e/pages/adf/viewerPage.ts b/e2e/pages/adf/viewerPage.ts index a131f5661f..0d6798079c 100644 --- a/e2e/pages/adf/viewerPage.ts +++ b/e2e/pages/adf/viewerPage.ts @@ -17,7 +17,7 @@ import { Util } from '../../util/util'; -import { TabsPage } from './material/tabsPage'; +import { TabsPage } from '@alfresco/adf-testing'; import { FormControllersPage } from './material/formControllersPage'; import { element, by, browser, protractor } from 'protractor'; @@ -95,6 +95,13 @@ export class ViewerPage { timeButton = element(by.id('adf-viewer-time')); bugButton = element(by.id('adf-viewer-bug')); + codeViewer = element(by.id('adf-monaco-file-editor')); + moveRightChevron = element(by.css('.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron')); + + checkCodeViewerIsDisplayed() { + return Util.waitUntilElementIsVisible(this.codeViewer); + } + viewFile(fileName) { let fileView = element.all(by.css(`#document-list-container div[filename="${fileName}"]`)).first(); Util.waitUntilElementIsVisible(fileView); @@ -614,4 +621,9 @@ export class ViewerPage { Util.waitUntilElementIsVisible(this.viewer.element(by.css('div[class*="adf-viewer-inline-container"]'))); return this; } + + clickMoveRightChevron() { + Util.waitUntilElementIsVisible(this.moveRightChevron); + return this.moveRightChevron.click(); + } } diff --git a/e2e/process-services-cloud/apps-section-cloud.e2e.ts b/e2e/process-services-cloud/apps-section-cloud.e2e.ts index 577000b12e..a87ac0ed2f 100644 --- a/e2e/process-services-cloud/apps-section-cloud.e2e.ts +++ b/e2e/process-services-cloud/apps-section-cloud.e2e.ts @@ -15,27 +15,29 @@ * limitations under the License. */ -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import TestConfig = require('../test.config'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { browser } from 'protractor'; describe('Applications list', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - const appListCloudComponent = new AppListCloudComponent(); + const appListCloudPage = new AppListCloudPage(); const appName = 'simple-app'; it('[C289910] Should the app be displayed on dashboard when is deployed on APS', () => { settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity); - loginSSOPage.loginAPS(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); navigationBarPage.navigateToProcessServicesCloudPage(); - appListCloudComponent.checkApsContainer(); - appListCloudComponent.checkAppIsDisplayed(appName); - appListCloudComponent.goToApp(appName); + appListCloudPage.checkApsContainer(); + appListCloudPage.checkAppIsDisplayed(appName); + appListCloudPage.goToApp(appName); }); diff --git a/e2e/process-services-cloud/edit-process-filters-component.e2e.ts b/e2e/process-services-cloud/edit-process-filters-component.e2e.ts new file mode 100644 index 0000000000..f87cdc78c5 --- /dev/null +++ b/e2e/process-services-cloud/edit-process-filters-component.e2e.ts @@ -0,0 +1,207 @@ +/*! + * @license + * Copyright 2019 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 TestConfig = require('../test.config'); + +import { LoginSSOPage } from '@alfresco/adf-testing'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; +import { AppListCloudPage } from '@alfresco/adf-testing'; +import { browser } from 'protractor'; + +describe('Edit process filters cloud', () => { + + describe('Edit process Filters', () => { + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + let appListCloudComponent = new AppListCloudPage(); + let tasksCloudDemoPage = new TasksCloudDemoPage(); + let processCloudDemoPage = new ProcessCloudDemoPage(); + + let silentLogin; + const simpleApp = 'simple-app'; + + beforeAll(async () => { + silentLogin = false; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + loginSSOPage.clickOnSSOButton(); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + }); + + beforeEach((done) => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(simpleApp); + tasksCloudDemoPage.taskListCloudComponent().checkTaskListIsLoaded(); + processCloudDemoPage.clickOnProcessFilters(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + done(); + }); + + afterEach((done) => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + done(); + }); + + it('[C291804] Delete Save and Save as actions should be displayed when clicking on custom filter header', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('All Processes'); + processCloudDemoPage.editProcessFilterCloudComponent().checkSaveButtonIsDisplayed().checkSaveAsButtonIsDisplayed() + .checkDeleteButtonIsDisplayed(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkSaveButtonIsEnabled()).toEqual(false); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkSaveAsButtonIsEnabled()).toEqual(false); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkDeleteButtonIsEnabled()).toEqual(true); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + }); + + it('[C291805] New process filter is added when clicking Save As button', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('New').clickOnSaveButton(); + + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkSaveButtonIsEnabled()).toEqual(false); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkSaveAsButtonIsEnabled()).toEqual(false); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkDeleteButtonIsEnabled()).toEqual(true); + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('StartDate'); + processCloudDemoPage.customProcessFilter('custom-new').clickProcessFilter(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().clickDeleteButton(); + }); + + it('[C291806] Two process filters with same name can be created when clicking the Save As button', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('New').clickOnSaveButton(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Name'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Name'); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton().setFilterName('New').clickOnSaveButton(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Name'); + processCloudDemoPage.editProcessFilterCloudComponent().clickDeleteButton(); + processCloudDemoPage.customProcessFilter('custom-new').clickProcessFilter(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().clickDeleteButton(); + }); + + it('[C291807] A process filter is overrided when clicking on save button', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('New').clickOnSaveButton(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Name'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Name'); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveButton(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Name'); + processCloudDemoPage.editProcessFilterCloudComponent().clickDeleteButton(); + }); + + it('[C291808] A process filter is deleted when clicking on delete button', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('New').clickOnSaveButton(); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + processCloudDemoPage.editProcessFilterCloudComponent().clickDeleteButton(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('All Processes'); + processCloudDemoPage.customProcessFilter('New').checkProcessFilterNotDisplayed(); + }); + + it('[C291810] Process filter should not be created when process filter dialog is closed', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('Cancel'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().getFilterName()).toEqual('Cancel'); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().clickOnCancelButton(); + processCloudDemoPage.customProcessFilter('Cancel').checkProcessFilterNotDisplayed(); + expect(processCloudDemoPage.getActiveFilterName()).toEqual('All Processes'); + processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); + expect(processCloudDemoPage.getActiveFilterName()).toEqual('Running Processes'); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + expect(processCloudDemoPage.getActiveFilterName()).toEqual('All Processes'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('StartDate'); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + }); + + it('[C291811] Save button of process filter dialog should be disabled when process name is empty', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Id'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().clearFilterName(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().getFilterName()).toEqual(''); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().checkSaveButtonIsEnabled()).toEqual(false); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().checkCancelButtonIsEnabled()).toEqual(true); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().clickOnCancelButton(); + + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().checkCustomiseFilterHeaderIsExpanded(); + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('StartDate'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getSortFilterDropDownValue()).toEqual('StartDate'); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveButton(); + }); + + it('[C291809] Process filter dialog is displayed when clicking on Save As button', () => { + processCloudDemoPage.allProcessesFilter().clickProcessFilter(); + + processCloudDemoPage.editProcessFilterCloudComponent().setSortFilterDropDown('Name'); + processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().checkCancelButtonIsEnabled()).toEqual(true); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().checkSaveButtonIsEnabled()).toEqual(true); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().getTitle()).toEqual('Save filter as'); + expect(processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().getFilterName()).toEqual('All Processes'); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().clickOnCancelButton(); + }); + + }); + +}); diff --git a/e2e/process-services-cloud/edit-task-filters-component.e2e.ts b/e2e/process-services-cloud/edit-task-filters-component.e2e.ts index 04f15cbcf3..711d28ba9a 100644 --- a/e2e/process-services-cloud/edit-task-filters-component.e2e.ts +++ b/e2e/process-services-cloud/edit-task-filters-component.e2e.ts @@ -17,14 +17,15 @@ import TestConfig = require('../test.config'); -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import { Util } from '../util/util'; import { Tasks } from '../actions/APS-cloud/tasks'; +import { browser } from 'protractor'; describe('Edit task filters cloud', () => { @@ -32,25 +33,26 @@ describe('Edit task filters cloud', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - let appListCloudComponent = new AppListCloudComponent(); + let appListCloudComponent = new AppListCloudPage(); let tasksCloudDemoPage = new TasksCloudDemoPage(); const tasksService: Tasks = new Tasks(); let silentLogin; const simpleApp = 'simple-app'; const completedTaskName = Util.generateRandomString(), assignedTaskName = Util.generateRandomString(); - let assignedTask, completedTask; + let assignedTask; beforeAll(async () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); await tasksService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); assignedTask = await tasksService.createStandaloneTask(assignedTaskName, simpleApp); await tasksService.claimTask(assignedTask.entry.id, simpleApp); - completedTask = await tasksService.createAndCompleteTask(completedTaskName, simpleApp); + await tasksService.createAndCompleteTask(completedTaskName, simpleApp); }); beforeEach((done) => { @@ -69,19 +71,19 @@ describe('Edit task filters cloud', () => { tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getStateFilterDropDownValue()).toEqual('ASSIGNED'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Created Date'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getStatusFilterDropDownValue()).toEqual('ASSIGNED'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('CreatedDate'); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getOrderFilterDropDownValue()).toEqual('DESC'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(assignedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTaskName); tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('Completed Tasks'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getStateFilterDropDownValue()).toEqual('COMPLETED'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Created Date'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getStatusFilterDropDownValue()).toEqual('COMPLETED'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('CreatedDate'); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getOrderFilterDropDownValue()).toEqual('DESC'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(assignedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); }); @@ -100,98 +102,75 @@ describe('Edit task filters cloud', () => { it('[C291795] New filter is added when clicking Save As button', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('New').clickOnSaveButton(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().checkSaveButtonIsEnabled()).toEqual(false); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().checkSaveAsButtonIsEnabled()).toEqual(false); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().checkDeleteButtonIsEnabled()).toEqual(true); tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Created Date'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('CreatedDate'); tasksCloudDemoPage.customTaskFilter('custom-new').clickTaskFilter(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickDeleteButton(); }); it('[C291796] Two filters with same name can be created when clicking the Save As button', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('New').clickOnSaveButton(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); - tasksCloudDemoPage.editTaskFilterCloudComponent().setSortFilterDropDown('PRIORITY'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + tasksCloudDemoPage.editTaskFilterCloudComponent().setSortFilterDropDown('Priority'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('New').clickOnSaveButton(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('PRIORITY'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Priority'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickDeleteButton(); tasksCloudDemoPage.customTaskFilter('custom-new').clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickDeleteButton(); }); it('[C291797] A filter is overrided when clicking on save button', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('New').clickOnSaveButton(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); - tasksCloudDemoPage.editTaskFilterCloudComponent().setSortFilterDropDown('NAME'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); + tasksCloudDemoPage.editTaskFilterCloudComponent().setSortFilterDropDown('Name'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('NAME'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Name'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickDeleteButton(); }); it('[C291798] A filter is deleted when clicking on delete button', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('New').clickOnSaveButton(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('New'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickDeleteButton(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); tasksCloudDemoPage.customTaskFilter('New').checkTaskFilterNotDisplayed(); @@ -199,12 +178,8 @@ describe('Edit task filters cloud', () => { it('[C291800] Task filter should not be created when task filter dialog is closed', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('PRIORITY'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('PRIORITY'); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Priority'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Priority'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().getFilterName()).toEqual('My Tasks'); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().setFilterName('Cancel'); @@ -214,22 +189,16 @@ describe('Edit task filters cloud', () => { expect(tasksCloudDemoPage.getActiveFilterName()).toEqual('My Tasks'); tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Created Date'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('CreatedDate'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); }); it('[C291801] Save button of task filter dialog should be disabled when task name is empty', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().getFilterName()).toEqual('My Tasks'); tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().clearFilterName(); @@ -241,12 +210,8 @@ describe('Edit task filters cloud', () => { it('[C291799] Task filter dialog is displayed when clicking on Save As button', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('ID'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('ID'); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setSortFilterDropDown('Id'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getSortFilterDropDownValue()).toEqual('Id'); tasksCloudDemoPage.editTaskFilterCloudComponent().clickSaveAsButton(); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().checkSaveButtonIsEnabled()).toEqual(true); expect(tasksCloudDemoPage.editTaskFilterCloudComponent().editTaskFilterDialog().checkCancelButtonIsEnabled()).toEqual(true); diff --git a/e2e/process-services-cloud/people-group-cloud-component.e2e.ts b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts new file mode 100644 index 0000000000..8c348c4ea0 --- /dev/null +++ b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts @@ -0,0 +1,175 @@ +/*! + * @license + * Copyright 2019 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 TestConfig = require('../test.config'); + +import { LoginSSOPage } from '@alfresco/adf-testing'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { PeopleGroupCloudComponentPage } from '../pages/adf/demo-shell/process-services/peopleGroupCloudComponentPage'; +import { PeopleCloudComponent } from '../pages/adf/process-cloud/peopleCloudComponent'; +import { GroupCloudComponent } from '../pages/adf/process-cloud/groupCloudComponent'; +import { browser } from 'protractor'; +import { Identity } from '../actions/APS-cloud/identity'; +import { GroupIdentity } from '../actions/APS-cloud/groupIdentity'; +import CONSTANTS = require('../util/constants'); +import { Roles } from '../actions/APS-cloud/roles'; + +describe('People Groups Cloud Component', () => { + + describe('People Groups Cloud Component', () => { + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const peopleGroupCloudComponentPage = new PeopleGroupCloudComponentPage(); + const peopleCloudComponent = new PeopleCloudComponent(); + const groupCloudComponent = new GroupCloudComponent(); + const identityService: Identity = new Identity(); + const groupIdentityService: GroupIdentity = new GroupIdentity(); + const rolesService: Roles = new Roles(); + + let silentLogin; + let apsUser; + let activitiUser; + let noRoleUser ; + let groupAps; + let groupActiviti; + let groupNoRole; + let apsUserRoleId; + let activitiUserRoleId; + let apsAdminRoleId; + let activitiAdminRoleId; + let users = new Array(); + let groups = new Array(); + + beforeAll(async () => { + await identityService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + await rolesService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + apsUser = await identityService.createIdentityUser(); + apsUserRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.APS_USER); + await identityService.assignRole(apsUser.id, apsUserRoleId, CONSTANTS.ROLES.APS_USER); + activitiUser = await identityService.createIdentityUser(); + activitiUserRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.ACTIVITI_USER); + await identityService.assignRole(activitiUser.id, activitiUserRoleId, CONSTANTS.ROLES.ACTIVITI_USER); + noRoleUser = await identityService.createIdentityUser(); + await groupIdentityService.init(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + groupAps = await groupIdentityService.createIdentityGroup(); + apsAdminRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.APS_ADMIN); + await groupIdentityService.assignRole(groupAps.id, apsAdminRoleId, CONSTANTS.ROLES.APS_ADMIN); + groupActiviti = await groupIdentityService.createIdentityGroup(); + activitiAdminRoleId = await rolesService.getRoleIdByRoleName(CONSTANTS.ROLES.ACTIVITI_ADMIN); + await groupIdentityService.assignRole(groupActiviti.id, activitiAdminRoleId, CONSTANTS.ROLES.ACTIVITI_ADMIN); + groupNoRole = await groupIdentityService.createIdentityGroup(); + users = [`${apsUser.id}`, `${activitiUser.id}`, `${noRoleUser.id}`]; + groups = [`${groupAps.id}`, `${groupActiviti.id}`, `${groupNoRole.id}`]; + silentLogin = false; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + loginSSOPage.clickOnSSOButton(); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + navigationBarPage.navigateToPeopleGroupCloudPage(); + }); + + afterAll(async () => { + for (let i = 0; i < users.length; i++) { + await identityService.deleteIdentityUser(users[i]); + } + for (let i = 0; i < groups.length; i++) { + await groupIdentityService.deleteIdentityGroup(groups[i]); + } + }); + + beforeEach( () => { + browser.refresh(); + peopleGroupCloudComponentPage.checkGroupsCloudComponentTitleIsDisplayed(); + peopleGroupCloudComponentPage.checkPeopleCloudComponentTitleIsDisplayed(); + }); + + it('[C297674] Add role filtering to PeopleCloudComponent', () => { + peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickPeopleCloudFilterRole(); + peopleGroupCloudComponentPage.enterPeopleRoles(`["${CONSTANTS.ROLES.APS_USER}"]`); + peopleCloudComponent.searchAssignee('LastName'); + peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.checkUserIsNotDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.checkSelectedPeople(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + }); + + it('[C297674] Add more than one role filtering to PeopleCloudComponent', () => { + peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickPeopleCloudFilterRole(); + peopleGroupCloudComponentPage.enterPeopleRoles(`["${CONSTANTS.ROLES.APS_USER}", "${CONSTANTS.ROLES.ACTIVITI_USER}"]`); + peopleCloudComponent.searchAssignee('LastName'); + peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.checkSelectedPeople(`${activitiUser.lastName}`); + }); + + it('[C297674] Add no role filters to PeopleCloudComponent', () => { + peopleGroupCloudComponentPage.clickPeopleCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickPeopleCloudFilterRole(); + peopleCloudComponent.searchAssignee('LastName'); + peopleCloudComponent.checkUserIsDisplayed(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName}` + ' ' + `${apsUser.lastName}`); + peopleCloudComponent.checkUserIsDisplayed(`${activitiUser.firstName}` + ' ' + `${activitiUser.lastName}`); + peopleCloudComponent.selectAssigneeFromList(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + peopleCloudComponent.checkSelectedPeople(`${noRoleUser.firstName}` + ' ' + `${noRoleUser.lastName}`); + }); + + it('[C297674] Add role filtering to GroupCloudComponent', () => { + peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickGroupCloudFilterRole(); + peopleGroupCloudComponentPage.enterGroupRoles(`["${CONSTANTS.ROLES.APS_ADMIN}"]`); + groupCloudComponent.searchGroups('TestGroup'); + groupCloudComponent.checkGroupIsDisplayed(`${groupAps.name}`); + groupCloudComponent.checkGroupIsNotDisplayed(`${groupActiviti.name}`); + groupCloudComponent.checkGroupIsNotDisplayed(`${groupNoRole.name}`); + groupCloudComponent.selectGroupFromList(`${groupAps.name}`); + groupCloudComponent.checkSelectedGroup(`${groupAps.name}`); + }); + + it('[C297674] Add more than one role filtering to GroupCloudComponent', () => { + peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickGroupCloudFilterRole(); + peopleGroupCloudComponentPage.enterGroupRoles(`["${CONSTANTS.ROLES.APS_ADMIN}", "${CONSTANTS.ROLES.ACTIVITI_ADMIN}"]`); + groupCloudComponent.searchGroups('TestGroup'); + groupCloudComponent.checkGroupIsDisplayed(`${groupActiviti.name}`); + groupCloudComponent.checkGroupIsDisplayed(`${groupAps.name}`); + groupCloudComponent.checkGroupIsNotDisplayed(`${groupNoRole.name}`); + groupCloudComponent.selectGroupFromList(`${groupActiviti.name}`); + groupCloudComponent.checkSelectedGroup(`${groupActiviti.name}`); + }); + + it('[C297674] Add no role filters to GroupCloudComponent', () => { + peopleGroupCloudComponentPage.clickGroupCloudMultipleSelection(); + peopleGroupCloudComponentPage.clickGroupCloudFilterRole(); + peopleGroupCloudComponentPage.clearField(peopleGroupCloudComponentPage.groupRoleInput); + groupCloudComponent.searchGroups('TestGroup'); + groupCloudComponent.checkGroupIsDisplayed(`${groupNoRole.name}`); + groupCloudComponent.checkGroupIsDisplayed(`${groupActiviti.name}`); + groupCloudComponent.checkGroupIsDisplayed(`${groupAps.name}`); + groupCloudComponent.selectGroupFromList(`${groupNoRole.name}`); + groupCloudComponent.checkSelectedGroup(`${groupNoRole.name}`); + }); + + }); + +}); diff --git a/e2e/process-services-cloud/process-custom-filters.e2e.ts b/e2e/process-services-cloud/process-custom-filters.e2e.ts index 863aa5c431..c6c44c5859 100644 --- a/e2e/process-services-cloud/process-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/process-custom-filters.e2e.ts @@ -17,25 +17,28 @@ import TestConfig = require('../test.config'); -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; +import { ConfigEditorPage } from '../pages/adf/configEditorPage'; import { ProcessDefinitions } from '../actions/APS-cloud/process-definitions'; import { ProcessInstances } from '../actions/APS-cloud/process-instances'; import { Tasks } from '../actions/APS-cloud/tasks'; import { Query } from '../actions/APS-cloud/query'; +import { browser, protractor } from 'protractor'; describe('Process list cloud', () => { describe('Process List', () => { + const configEditorPage = new ConfigEditorPage(); const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - let appListCloudComponent = new AppListCloudComponent(); + let appListCloudComponent = new AppListCloudPage(); let processCloudDemoPage = new ProcessCloudDemoPage(); let tasksCloudDemoPage = new TasksCloudDemoPage(); @@ -45,7 +48,7 @@ describe('Process list cloud', () => { const queryService: Query = new Query(); let silentLogin; - let completedProcess; + let completedProcess, runningProcessInstance, switchProcessInstance, noOfApps; const simpleApp = 'candidateuserapp'; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; @@ -53,12 +56,42 @@ describe('Process list cloud', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); + + navigationBarPage.clickConfigEditorButton(); + configEditorPage.clickEditProcessCloudConfiguration(); + configEditorPage.clickClearButton(); + configEditorPage.enterBigConfigurationText(`{ + "filterProperties": [ + "appName", + "status", + "processInstanceId", + "order", + "sort", + "order" + ], + "sortProperties": [ + "id", + "name", + "status", + "startDate" + ], + "actions": [ + "save", + "saveAs", + "delete" + ] + }`); + + configEditorPage.clickSaveButton(); await processDefinitionService.init(user, password); let processDefinition = await processDefinitionService.getProcessDefinitions(simpleApp); await processInstancesService.init(user, password); await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); + runningProcessInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); + switchProcessInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); completedProcess = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); await queryService.init(user, password); @@ -78,16 +111,16 @@ describe('Process list cloud', () => { }); it('[C290069] Should display processes ordered by name when Name is selected from sort dropdown', async() => { - processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('RUNNING') - .setSortFilterDropDown('NAME').setOrderFilterDropDown('ASC'); - processCloudDemoPage.processListCloudComponent().getDataTable().getAllRowsNameColumn().then(function (list) { + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('RUNNING') + .setSortFilterDropDown('Name').setOrderFilterDropDown('ASC'); + processCloudDemoPage.processListCloudComponent().getAllRowsNameColumn().then(function (list) { let initialList = list.slice(0); list.sort(); expect(JSON.stringify(initialList) === JSON.stringify(list)).toEqual(true); }); processCloudDemoPage.editProcessFilterCloudComponent().setOrderFilterDropDown('DESC'); - processCloudDemoPage.processListCloudComponent().getDataTable().getAllRowsNameColumn().then(function (list) { + processCloudDemoPage.processListCloudComponent().getAllRowsNameColumn().then(function (list) { let initialList = list.slice(0); list.sort(); list.reverse(); @@ -96,8 +129,8 @@ describe('Process list cloud', () => { }); it('[C291783] Should display processes ordered by id when Id is selected from sort dropdown', async() => { - processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('RUNNING') - .setSortFilterDropDown('ID').setOrderFilterDropDown('ASC'); + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('RUNNING') + .setSortFilterDropDown('Id').setOrderFilterDropDown('ASC'); processCloudDemoPage.processListCloudComponent().getDataTable().checkSpinnerIsDisplayed().checkSpinnerIsNotDisplayed(); processCloudDemoPage.getAllRowsByIdColumn().then(function (list) { let initialList = list.slice(0); @@ -119,6 +152,60 @@ describe('Process list cloud', () => { }); }); + it('[C297697] The value of the filter should be preserved when saving it', async() => { + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader() + .setProcessInstanceId(completedProcess.entry.id); + + processCloudDemoPage.processListCloudComponent().getDataTable().checkSpinnerIsDisplayed().checkSpinnerIsNotDisplayed(); + + expect(processCloudDemoPage.processListCloudComponent().getDataTable().numberOfRows()).toBe(1); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(completedProcess.entry.id); + + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('New').clickOnSaveButton(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('New'); + + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getProcessInstanceId()).toEqual(completedProcess.entry.id); + }); + + it('[C297646] Should display the filter dropdown fine , after switching between saved filters', async() => { + + noOfApps = processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader().getNumberOfAppNameOptions(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkAppNamesAreUnique()).toBe(true); + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + processCloudDemoPage.editProcessFilterCloudComponent().setStatusFilterDropDown('RUNNING') + .setAppNameDropDown(simpleApp).setProcessInstanceId(runningProcessInstance.entry.id); + + processCloudDemoPage.processListCloudComponent().getDataTable().checkSpinnerIsDisplayed().checkSpinnerIsNotDisplayed(); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(runningProcessInstance.entry.id); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getNumberOfAppNameOptions()).toBe(noOfApps); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkAppNamesAreUnique()).toBe(true); + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('SavedFilter').clickOnSaveButton(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('SavedFilter'); + + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getProcessInstanceId()).toEqual(runningProcessInstance.entry.id); + + processCloudDemoPage.editProcessFilterCloudComponent().setStatusFilterDropDown('RUNNING') + .setAppNameDropDown(simpleApp).setProcessInstanceId(switchProcessInstance.entry.id); + + processCloudDemoPage.processListCloudComponent().getDataTable().checkSpinnerIsDisplayed().checkSpinnerIsNotDisplayed(); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(switchProcessInstance.entry.id); + processCloudDemoPage.editProcessFilterCloudComponent().clickSaveAsButton(); + processCloudDemoPage.editProcessFilterCloudComponent().editProcessFilterDialog().setFilterName('SwitchFilter').clickOnSaveButton(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('SwitchFilter'); + + processCloudDemoPage.editProcessFilterCloudComponent().clickCustomiseFilterHeader(); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getProcessInstanceId()).toEqual(switchProcessInstance.entry.id); + expect(processCloudDemoPage.editProcessFilterCloudComponent().getNumberOfAppNameOptions()).toBe(noOfApps); + expect(processCloudDemoPage.editProcessFilterCloudComponent().checkAppNamesAreUnique()).toBe(true); + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + }); + }); }); diff --git a/e2e/process-services-cloud/process-filters-cloud.e2e.ts b/e2e/process-services-cloud/process-filters-cloud.e2e.ts index 5ae4cda5a4..e9c6731cd4 100644 --- a/e2e/process-services-cloud/process-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-filters-cloud.e2e.ts @@ -17,17 +17,18 @@ import TestConfig = require('../test.config'); -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import { ProcessDefinitions } from '../actions/APS-cloud/process-definitions'; import { ProcessInstances } from '../actions/APS-cloud/process-instances'; import { Tasks } from '../actions/APS-cloud/tasks'; import { Query } from '../actions/APS-cloud/query'; +import { browser } from 'protractor'; describe('Process filters cloud', () => { @@ -35,7 +36,7 @@ describe('Process filters cloud', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - let appListCloudComponent = new AppListCloudComponent(); + let appListCloudComponent = new AppListCloudPage(); let processCloudDemoPage = new ProcessCloudDemoPage(); let tasksCloudDemoPage = new TasksCloudDemoPage(); @@ -53,7 +54,8 @@ describe('Process filters cloud', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); await processDefinitionService.init(user, password); let processDefinition = await processDefinitionService.getProcessDefinitions(simpleApp); @@ -87,34 +89,34 @@ describe('Process filters cloud', () => { processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); processCloudDemoPage.runningProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Running Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(runningProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(runningProcess.entry.id); processCloudDemoPage.completedProcessesFilter().clickProcessFilter(); processCloudDemoPage.completedProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Completed Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsNotDisplayed(runningProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsNotDisplayedById(runningProcess.entry.id); processCloudDemoPage.allProcessesFilter().clickProcessFilter(); processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('All Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(runningProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(runningProcess.entry.id); }); it('[C290044] Should display process in Completed Processes List when process is completed', () => { processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); processCloudDemoPage.runningProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Running Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsNotDisplayed(completedProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsNotDisplayedById(completedProcess.entry.id); processCloudDemoPage.completedProcessesFilter().clickProcessFilter(); processCloudDemoPage.completedProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Completed Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(completedProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(completedProcess.entry.id); processCloudDemoPage.allProcessesFilter().clickProcessFilter(); processCloudDemoPage.allProcessesFilter().checkProcessFilterIsDisplayed(); expect(processCloudDemoPage.getActiveFilterName()).toBe('All Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(completedProcess.entry.id); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(completedProcess.entry.id); }); }); diff --git a/e2e/process-services-cloud/processList-cloud-component.e2e.ts b/e2e/process-services-cloud/processList-cloud-component.e2e.ts new file mode 100644 index 0000000000..763f945a5c --- /dev/null +++ b/e2e/process-services-cloud/processList-cloud-component.e2e.ts @@ -0,0 +1,106 @@ +/*! + * @license + * Copyright 2019 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 TestConfig = require('../test.config'); +import { LoginSSOPage } from '@alfresco/adf-testing'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; +import { AppListCloudPage } from '@alfresco/adf-testing'; + +import { ProcessDefinitions } from '../actions/APS-cloud/process-definitions'; +import { ProcessInstances } from '../actions/APS-cloud/process-instances'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ConfigEditorPage } from '../pages/adf/configEditorPage'; +import { ProcessListCloudConfiguration } from './processListCloud.config'; +import { browser } from 'protractor'; + +describe('Process list cloud', () => { + + describe('Process List', () => { + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const configEditor = new ConfigEditorPage(); + let appListCloudComponent = new AppListCloudPage(); + let processCloudDemoPage = new ProcessCloudDemoPage(); + + const processDefinitionService: ProcessDefinitions = new ProcessDefinitions(); + const processInstancesService: ProcessInstances = new ProcessInstances(); + + let silentLogin; + const simpleApp = 'candidateuserapp'; + const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; + let jsonFile; + let runningProcess; + + beforeAll(async () => { + silentLogin = false; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + loginSSOPage.clickOnSSOButton(); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); + + await processDefinitionService.init(user, password); + let processDefinition = await processDefinitionService.getProcessDefinitions(simpleApp); + await processInstancesService.init(user, password); + runningProcess = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); + + }); + + beforeEach(async (done) => { + let processListCloudConfiguration = new ProcessListCloudConfiguration(); + jsonFile = processListCloudConfiguration.getConfiguration(); + done(); + navigationBarPage.clickConfigEditorButton(); + configEditor.clickProcessListCloudConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton(); + + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(simpleApp); + processCloudDemoPage.clickOnProcessFilters(); + processCloudDemoPage.runningProcessesFilter().checkProcessFilterIsDisplayed(); + processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); + expect(processCloudDemoPage.getActiveFilterName()).toBe('Running Processes'); + processCloudDemoPage.processListCloudComponent().checkProcessListIsLoaded(); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedById(runningProcess.entry.id); + done(); + }); + + it('[C291997] Should be able to change the default columns', async() => { + + expect(processCloudDemoPage.processListCloudComponent().getDataTable().getNumberOfColumns()).toBe(13); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('id'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('name'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('status'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('startDate'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('appName'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('businessKey'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('description'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('initiator'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('lastModified'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('processName'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('processId'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('processDefinitionId'); + processCloudDemoPage.processListCloudComponent().getDataTable().checkColumnIsDisplayed('processDefinitionKey'); + + }); + + }); + +}); diff --git a/e2e/process-services-cloud/processListCloud.config.ts b/e2e/process-services-cloud/processListCloud.config.ts new file mode 100644 index 0000000000..174f750b62 --- /dev/null +++ b/e2e/process-services-cloud/processListCloud.config.ts @@ -0,0 +1,110 @@ +/*! + * @license + * Copyright 2019 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 class ProcessListCloudConfiguration { + + constructor() { + } + + getConfiguration() { + return { + 'presets': { + 'default': [ + { + 'key': 'entry.id', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.ID', + 'sortable': true + }, + { + 'key': 'entry.name', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.NAME', + 'sortable': true + }, + { + 'key': 'entry.status', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.STATUS', + 'sortable': true + }, + { + 'key': 'entry.startDate', + 'type': 'date', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.START_DATE', + 'sortable': true, + 'format': 'timeAgo' + }, + { + 'key': 'entry.appName', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.APP_NAME', + 'sortable': true + }, + { + 'key': 'entry.businessKey', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.BUSINESS_KEY', + 'sortable': true + }, + { + 'key': 'entry.description', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.DESCRIPTION', + 'sortable': true + }, + { + 'key': 'entry.initiator', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.INITIATOR', + 'sortable': true + }, + { + 'key': 'entry.lastModified', + 'type': 'date', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.LAST_MODIFIED', + 'sortable': true + }, + { + 'key': 'entry.processName', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_NAME', + 'sortable': true + }, + { + 'key': 'entry.processId', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_ID', + 'sortable': true + }, + { + 'key': 'entry.processDefinitionId', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEFINITION_ID', + 'sortable': true + }, + { + 'key': 'entry.processDefinitionKey', + 'type': 'text', + 'title': 'ADF_CLOUD_PROCESS_LIST.PROPERTIES.PROCESS_DEFINITION_KEY', + 'sortable': true + } + ] + } + }; + } +} diff --git a/e2e/process-services-cloud/start-process-cloud.e2e.ts b/e2e/process-services-cloud/start-process-cloud.e2e.ts index 047f0122b2..1c278e0da2 100644 --- a/e2e/process-services-cloud/start-process-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-process-cloud.e2e.ts @@ -15,20 +15,22 @@ * limitations under the License. */ -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import TestConfig = require('../test.config'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { StartProcessPage } from '../pages/adf/process-services/startProcessPage'; import { Util } from '../util/util'; +import { browser } from 'protractor'; + describe('Start Process', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - const appListCloudComponent = new AppListCloudComponent(); + const appListCloudComponent = new AppListCloudPage(); const processCloudDemoPage = new ProcessCloudDemoPage(); const startProcessPage = new StartProcessPage(); const processName = Util.generateRandomString(10); @@ -45,7 +47,8 @@ describe('Start Process', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudComponent.checkApsContainer(); done(); @@ -99,7 +102,7 @@ describe('Start Process', () => { processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Running Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(processName); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedByName(processName); }); @@ -122,7 +125,7 @@ describe('Start Process', () => { processCloudDemoPage.runningProcessesFilter().clickProcessFilter(); expect(processCloudDemoPage.getActiveFilterName()).toBe('Running Processes'); - processCloudDemoPage.processListCloudComponent().getDataTable().checkContentIsDisplayed(processName); + processCloudDemoPage.processListCloudComponent().checkContentIsDisplayedByName(processName); }); diff --git a/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts index 39f0a4be07..388f0bdea5 100644 --- a/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts +++ b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts @@ -15,25 +15,30 @@ * limitations under the License. */ -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import TestConfig = require('../test.config'); import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { StartTasksCloudComponent } from '../pages/adf/process-cloud/startTasksCloudComponent'; +import { StartTasksCloudPage } from '@alfresco/adf-testing'; import { Util } from '../util/util'; +import { PeopleCloudComponent } from '../pages/adf/process-cloud/peopleCloudComponent'; +import { TaskHeaderCloudPage } from '@alfresco/adf-testing'; +import { browser } from 'protractor'; describe('Start Task', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); + const taskHeaderCloudPage = new TaskHeaderCloudPage(); const navigationBarPage = new NavigationBarPage(); - const appListCloudComponent = new AppListCloudComponent(); + const appListCloudComponent = new AppListCloudPage(); const tasksCloudDemoPage = new TasksCloudDemoPage(); - const startTask = new StartTasksCloudComponent(); - const standaloneTaskName1 = Util.generateRandomString(5); - const standaloneTaskName2 = Util.generateRandomString(5); + const startTask = new StartTasksCloudPage(); + const peopleCloudComponent = new PeopleCloudComponent(); + const standaloneTaskName = Util.generateRandomString(5); + const unassignedTaskName = Util.generateRandomString(5); const taskName255Characters = Util.generateRandomString(255); const taskNameBiggerThen255Characters = Util.generateRandomString(256); const lengthValidationError = 'Length exceeded, 255 characters max.'; @@ -47,7 +52,8 @@ describe('Start Task', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudComponent.checkApsContainer(); appListCloudComponent.checkAppIsDisplayed(appName); @@ -58,29 +64,32 @@ describe('Start Task', () => { it('[C290166] Should be possible to cancel a task', () => { tasksCloudDemoPage.openNewTaskForm(); + startTask.checkFormIsDisplayed(); startTask.checkStartButtonIsDisabled() .blur(startTask.name) .checkValidationErrorIsDisplayed(requiredError); - startTask.addName(standaloneTaskName1) + startTask.addName(standaloneTaskName) .addDescription('descriptions') .addDueDate('12/12/2018'); startTask.checkStartButtonIsEnabled(); startTask.clickCancelButton(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(standaloneTaskName1); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(standaloneTaskName); }); it('[C290180] Should be able to create a new standalone task', () => { tasksCloudDemoPage.openNewTaskForm(); - startTask.addName(standaloneTaskName1) + startTask.checkFormIsDisplayed(); + startTask.addName(standaloneTaskName) .addDescription('descriptions') .addDueDate('12/12/2018') .addPriority('50') .clickStartButton(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(standaloneTaskName1); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(standaloneTaskName); }); it('[C290181] Should be displayed an error message if task name exceed 255 characters', () => { tasksCloudDemoPage.openNewTaskForm(); + startTask.checkFormIsDisplayed(); startTask.addName(taskName255Characters) .checkStartButtonIsEnabled(); startTask.addName(taskNameBiggerThen255Characters) @@ -103,30 +112,54 @@ describe('Start Task', () => { it('[C290182] Should be possible to assign the task to another user', () => { tasksCloudDemoPage.openNewTaskForm(); - startTask.addName(standaloneTaskName1) - .addAssignee('Super Admin') - .clickStartButton(); + startTask.checkFormIsDisplayed(); + startTask.addName(standaloneTaskName); + peopleCloudComponent.searchAssigneeAndSelect('Super Admin'); + startTask.checkStartButtonIsEnabled(); + startTask.clickStartButton(); tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(standaloneTaskName1); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(standaloneTaskName); }); it('[C291953] Assignee field should display the logged user as default', () => { tasksCloudDemoPage.openNewTaskForm(); - expect(startTask.getAssignee()).toContain('Admin', 'does not contain Admin'); + startTask.checkFormIsDisplayed(); + expect(peopleCloudComponent.getAssignee()).toContain('Admin', 'does not contain Admin'); startTask.clickCancelButton(); }); it('[C291956] Should be able to create a new standalone task without assignee', () => { tasksCloudDemoPage.openNewTaskForm(); - startTask.addName(standaloneTaskName2); - startTask.clearField(startTask.assignee); + startTask.checkFormIsDisplayed(); + startTask.clearField(peopleCloudComponent.peopleCloudSearch); + startTask.addName(unassignedTaskName); + startTask.clickStartButton(); + startTask.checkStartButtonIsEnabled(); + tasksCloudDemoPage.editTaskFilterCloudComponent() + .clickCustomiseFilterHeader() + .setStatusFilterDropDown('CREATED') + .clearAssignee(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(unassignedTaskName); + }); + + it('[C297675] Should create a task unassigned when assignee field is empty in Start Task form', () => { + + tasksCloudDemoPage.openNewTaskForm(); + startTask.checkFormIsDisplayed(); + startTask.addName(unassignedTaskName); + startTask.clearField(peopleCloudComponent.peopleCloudSearch); startTask.clickStartButton(); tasksCloudDemoPage.editTaskFilterCloudComponent() .clickCustomiseFilterHeader() - .setStateFilterDropDown('CREATED') - .clearAssignment(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(standaloneTaskName2); + .clearAssignee() + .setStatusFilterDropDown('CREATED'); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(unassignedTaskName); + let taskId = tasksCloudDemoPage.taskListCloudComponent().getIdCellValue(unassignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().selectRow(unassignedTaskName); + expect(taskHeaderCloudPage.getTaskDetailsHeader()).toContain(taskId); + expect(taskHeaderCloudPage.getAssignee()).toBe('No assignee'); }); }); diff --git a/e2e/process-services-cloud/task-details-cloud.e2e.ts b/e2e/process-services-cloud/task-details-cloud.e2e.ts index 4c4bae9794..ec6f5a5b4f 100644 --- a/e2e/process-services-cloud/task-details-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-details-cloud.e2e.ts @@ -16,21 +16,19 @@ */ import TestConfig = require('../test.config'); -import resources = require('../util/resources'); import CONSTANTS = require('../util/constants'); -import dateFormat = require('dateformat'); import { Util } from '../util/util'; import moment = require('moment'); -import AlfrescoApi = require('alfresco-js-api-node'); import { Tasks } from '../actions/APS-cloud/tasks'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { TaskDetailsCloudComponent } from '../pages/adf/process-cloud/TaskDetailsCloudComponent'; +import { TaskHeaderCloudPage } from '@alfresco/adf-testing'; +import { browser } from 'protractor'; describe('Task Header cloud component', () => { @@ -40,12 +38,12 @@ describe('Task Header cloud component', () => { const simpleApp = 'simple-app'; let priority = 30, description = 'descriptionTask', formatDate = 'MMM DD YYYY'; - let taskDetailsCloudPage = new TaskDetailsCloudComponent(); + let taskHeaderCloudPage = new TaskHeaderCloudPage(); const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - const appListCloudComponent = new AppListCloudComponent(); + const appListCloudComponent = new AppListCloudPage(); const tasksCloudDemoPage = new TasksCloudDemoPage(); const tasksService: Tasks = new Tasks(); @@ -55,7 +53,8 @@ describe('Task Header cloud component', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); await tasksService.init(user, password); let createdTaskId = await tasksService.createStandaloneTask(basicCreatedTaskName, simpleApp); @@ -87,61 +86,61 @@ describe('Task Header cloud component', () => { it('[C291943] Should display task details for assigned task', async () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(basicCreatedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().selectRowByContentName(basicCreatedTaskName); - expect(taskDetailsCloudPage.getId()).toEqual(basicCreatedTask.entry.id); - expect(taskDetailsCloudPage.getDescription()) + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(basicCreatedTaskName); + tasksCloudDemoPage.taskListCloudComponent().selectRow(basicCreatedTaskName); + expect(taskHeaderCloudPage.getId()).toEqual(basicCreatedTask.entry.id); + expect(taskHeaderCloudPage.getDescription()) .toEqual(basicCreatedTask.entry.description === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : basicCreatedTask.entry.description); - expect(taskDetailsCloudPage.getStatus()).toEqual(basicCreatedTask.entry.status); - expect(taskDetailsCloudPage.getPriority()).toEqual(basicCreatedTask.entry.priority === 0 ? '' : basicCreatedTask.entry.priority.toString()); - expect(taskDetailsCloudPage.getCategory()).toEqual(basicCreatedTask.entry.category === null ? + expect(taskHeaderCloudPage.getStatus()).toEqual(basicCreatedTask.entry.status); + expect(taskHeaderCloudPage.getPriority()).toEqual(basicCreatedTask.entry.priority === 0 ? '' : basicCreatedTask.entry.priority.toString()); + expect(taskHeaderCloudPage.getCategory()).toEqual(!basicCreatedTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : basicCreatedTask.entry.category); - expect(taskDetailsCloudPage.getDueDate()).toEqual(basicCreatedTask.entry.dueDate === null ? + expect(taskHeaderCloudPage.getDueDate()).toEqual(basicCreatedTask.entry.dueDate === null ? CONSTANTS.TASK_DETAILS.NO_DATE : basicCreatedDate); - expect(taskDetailsCloudPage.getCreated()).toEqual(basicCreatedDate); - expect(taskDetailsCloudPage.getAssignee()).toEqual(basicCreatedTask.entry.assignee === null ? '' : basicCreatedTask.entry.assignee); - expect(taskDetailsCloudPage.getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); - expect(taskDetailsCloudPage.getParentTaskId()) + expect(taskHeaderCloudPage.getCreated()).toEqual(basicCreatedDate); + expect(taskHeaderCloudPage.getAssignee()).toEqual(basicCreatedTask.entry.assignee === null ? '' : basicCreatedTask.entry.assignee); + expect(taskHeaderCloudPage.getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskHeaderCloudPage.getParentTaskId()) .toEqual(basicCreatedTask.entry.parentTaskId === null ? '' : basicCreatedTask.entry.parentTaskId); }); it('[C291944] Should display task details for completed task', async () => { tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(completedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().selectRowByContentName(completedTaskName); - expect(taskDetailsCloudPage.getId()).toEqual(completedTask.entry.id); - expect(taskDetailsCloudPage.getDescription()) + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().selectRow(completedTaskName); + expect(taskHeaderCloudPage.getId()).toEqual(completedTask.entry.id); + expect(taskHeaderCloudPage.getDescription()) .toEqual(completedTask.entry.description === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : completedTask.entry.description); - expect(taskDetailsCloudPage.getStatus()).toEqual(completedTask.entry.status); - expect(taskDetailsCloudPage.getPriority()).toEqual(completedTask.entry.priority === '0' ? '' : completedTask.entry.priority.toString()); - expect(taskDetailsCloudPage.getCategory()).toEqual(completedTask.entry.category === null ? + expect(taskHeaderCloudPage.getStatus()).toEqual(completedTask.entry.status); + expect(taskHeaderCloudPage.getPriority()).toEqual(completedTask.entry.priority === '0' ? '' : completedTask.entry.priority.toString()); + expect(taskHeaderCloudPage.getCategory()).toEqual(!completedTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : completedTask.entry.category); - expect(taskDetailsCloudPage.getDueDate()).toEqual(completedTask.entry.dueDate === null ? + expect(taskHeaderCloudPage.getDueDate()).toEqual(completedTask.entry.dueDate === null ? CONSTANTS.TASK_DETAILS.NO_DATE : completedCreatedDate); - expect(taskDetailsCloudPage.getCreated()).toEqual(completedCreatedDate); - expect(taskDetailsCloudPage.getAssignee()).toEqual(completedTask.entry.assignee === null ? '' : completedTask.entry.assignee); - expect(taskDetailsCloudPage.getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); - expect(taskDetailsCloudPage.getParentTaskId()) + expect(taskHeaderCloudPage.getCreated()).toEqual(completedCreatedDate); + expect(taskHeaderCloudPage.getAssignee()).toEqual(completedTask.entry.assignee === null ? '' : completedTask.entry.assignee); + expect(taskHeaderCloudPage.getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskHeaderCloudPage.getParentTaskId()) .toEqual(completedTask.entry.parentTaskId === null ? '' : completedTask.entry.parentTaskId); }); it('[C291945] Should Parent Name and Parent Id not be empty in task details for sub task', async () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(subTask.entry.name); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().selectRowByContentName(subTask.entry.name); - expect(taskDetailsCloudPage.getId()).toEqual(subTask.entry.id); - expect(taskDetailsCloudPage.getDescription()) + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(subTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(subTask.entry.name); + expect(taskHeaderCloudPage.getId()).toEqual(subTask.entry.id); + expect(taskHeaderCloudPage.getDescription()) .toEqual(subTask.entry.description === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : subTask.entry.description); - expect(taskDetailsCloudPage.getStatus()).toEqual(subTask.entry.status); - expect(taskDetailsCloudPage.getPriority()).toEqual(subTask.entry.priority === 0 ? '' : subTask.entry.priority.toString()); - expect(taskDetailsCloudPage.getCategory()).toEqual(subTask.entry.category === null ? + expect(taskHeaderCloudPage.getStatus()).toEqual(subTask.entry.status); + expect(taskHeaderCloudPage.getPriority()).toEqual(subTask.entry.priority === 0 ? '' : subTask.entry.priority.toString()); + expect(taskHeaderCloudPage.getCategory()).toEqual(!subTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : subTask.entry.category); - expect(taskDetailsCloudPage.getDueDate()).toEqual(subTask.entry.dueDate === null ? + expect(taskHeaderCloudPage.getDueDate()).toEqual(subTask.entry.dueDate === null ? CONSTANTS.TASK_DETAILS.NO_DATE : subTaskCreatedDate); - expect(taskDetailsCloudPage.getCreated()).toEqual(subTaskCreatedDate); - expect(taskDetailsCloudPage.getAssignee()).toEqual(subTask.entry.assignee === null ? '' : subTask.entry.assignee); - expect(taskDetailsCloudPage.getParentName()).toEqual(basicCreatedTask.entry.name); - expect(taskDetailsCloudPage.getParentTaskId()) + expect(taskHeaderCloudPage.getCreated()).toEqual(subTaskCreatedDate); + expect(taskHeaderCloudPage.getAssignee()).toEqual(subTask.entry.assignee === null ? '' : subTask.entry.assignee); + expect(taskHeaderCloudPage.getParentName()).toEqual(basicCreatedTask.entry.name); + expect(taskHeaderCloudPage.getParentTaskId()) .toEqual(subTask.entry.parentTaskId === null ? '' : subTask.entry.parentTaskId); }); diff --git a/e2e/process-services-cloud/task-filters-cloud.e2e.ts b/e2e/process-services-cloud/task-filters-cloud.e2e.ts index 98834ccb26..78f02c74f8 100644 --- a/e2e/process-services-cloud/task-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-filters-cloud.e2e.ts @@ -17,13 +17,14 @@ import TestConfig = require('../test.config'); -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; import { Util } from '../util/util'; import { Tasks } from '../actions/APS-cloud/tasks'; +import { browser } from 'protractor'; describe('Task filters cloud', () => { @@ -31,7 +32,7 @@ describe('Task filters cloud', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - let appListCloudComponent = new AppListCloudComponent(); + let appListCloudComponent = new AppListCloudPage(); let tasksCloudDemoPage = new TasksCloudDemoPage(); const tasksService: Tasks = new Tasks(); const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; @@ -44,7 +45,8 @@ describe('Task filters cloud', () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); }); beforeEach((done) => { @@ -66,12 +68,12 @@ describe('Task filters cloud', () => { tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('Completed Tasks'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(newTask); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(newTask); tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(newTask); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(newTask); }); it('[C289955] Should display task in Complete Tasks List when task is completed', async () => { @@ -83,12 +85,12 @@ describe('Task filters cloud', () => { tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(completedTask); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTask); tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); expect(tasksCloudDemoPage.getActiveFilterName()).toBe('Completed Tasks'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(completedTask); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTask); }); it('[C291792] Should select the first task filter from the list as default', () => { diff --git a/e2e/process-services-cloud/task-list-properties.e2e.ts b/e2e/process-services-cloud/task-list-properties.e2e.ts new file mode 100644 index 0000000000..a3d6ac250f --- /dev/null +++ b/e2e/process-services-cloud/task-list-properties.e2e.ts @@ -0,0 +1,340 @@ +/*! + * @license + * Copyright 2019 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 TestConfig = require('../test.config'); + +import { LoginSSOPage } from '@alfresco/adf-testing'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import { AppListCloudPage } from '@alfresco/adf-testing'; +import { ConfigEditorPage } from '../pages/adf/configEditorPage'; +import { TaskListCloudConfiguration } from './taskListCloud.config'; + +import { Util } from '../util/util'; +import moment = require('moment'); +import { DateUtil } from '../util/dateUtil'; + +import { Tasks } from '../actions/APS-cloud/tasks'; +import { ProcessDefinitions } from '../actions/APS-cloud/process-definitions'; +import { ProcessInstances } from '../actions/APS-cloud/process-instances'; +import { NotificationPage } from '../pages/adf/notificationPage'; +import { browser } from 'protractor'; + +describe('Edit task filters and task list properties', () => { + + describe('Edit task filters and task list properties', () => { + const configEditorPage = new ConfigEditorPage(); + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + let appListCloudComponent = new AppListCloudPage(); + let tasksCloudDemoPage = new TasksCloudDemoPage(); + + const tasksService: Tasks = new Tasks(); + const processDefinitionService: ProcessDefinitions = new ProcessDefinitions(); + const processInstancesService: ProcessInstances = new ProcessInstances(); + let notificationPage = new NotificationPage(); + + let silentLogin; + const simpleApp = 'simple-app'; + const candidateUserApp = 'candidateuserapp'; + let noTasksFoundMessage = 'No Tasks Found'; + const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; + let createdTask, notAssigned, notDisplayedTask, processDefinition, processInstance, priorityTask, subTask; + let priority = 30; + + let beforeDate = moment().add(-1, 'days').format('DD/MM/YYYY'); + let currentDate = DateUtil.formatDate('DD/MM/YYYY'); + let afterDate = moment().add(1, 'days').format('DD/MM/YYYY'); + + beforeAll(async (done) => { + silentLogin = false; + let jsonFile = new TaskListCloudConfiguration().getConfiguration(); + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + loginSSOPage.clickOnSSOButton(); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); + + navigationBarPage.clickConfigEditorButton(); + + configEditorPage.clickTaskListCloudConfiguration(); + configEditorPage.clickClearButton(); + configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton(); + notificationPage.checkNotificationSnackBarIsDisplayedWithMessage('Save'); + notificationPage.checkNotificationSnackBarIsNotDisplayed(); + + configEditorPage.clickEditTaskConfiguration(); + configEditorPage.clickClearButton(); + browser.driver.sleep(5000); + configEditorPage.enterBigConfigurationText(`{ + "filterProperties": [ + "appName", + "status", + "assignee", + "taskName", + "parentTaskId", + "priority", + "standAlone", + "owner", + "processDefinitionId", + "processInstanceId", + "lastModified", + "sort", + "order" + ], + "sortProperties": [ + "id", + "name", + "createdDate", + "priority", + "processDefinitionId" + ], + "actions": [ + "save", + "saveAs", + "delete" + ] + }`); + + configEditorPage.clickSaveButton(); + + await tasksService.init(user, password); + createdTask = await tasksService.createStandaloneTask(Util.generateRandomString(), simpleApp); + await tasksService.claimTask(createdTask.entry.id, simpleApp); + notAssigned = await tasksService.createStandaloneTask(Util.generateRandomString(), simpleApp); + priorityTask = await tasksService.createStandaloneTask(Util.generateRandomString(), simpleApp, {priority: priority}); + await tasksService.claimTask(priorityTask.entry.id, simpleApp); + notDisplayedTask = await tasksService.createStandaloneTask(Util.generateRandomString(), candidateUserApp); + await tasksService.claimTask(notDisplayedTask.entry.id, candidateUserApp); + + await processDefinitionService.init(user, password); + processDefinition = await processDefinitionService.getProcessDefinitions(simpleApp); + await processInstancesService.init(user, password); + processInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); + + subTask = await tasksService.createStandaloneSubtask(createdTask.entry.id, simpleApp, Util.generateRandomString()); + await tasksService.claimTask(subTask.entry.id, simpleApp); + + done(); + }); + + beforeEach((done) => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(simpleApp); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader(); + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + done(); + }); + + it('[C292004] Filter by appName', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getAppNameDropDownValue()).toEqual(simpleApp); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(notDisplayedTask.entry.name); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setAppNameDropDown(candidateUserApp); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getAppNameDropDownValue()).toEqual(candidateUserApp); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(notDisplayedTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297476] Filter by taskName', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setTaskName(createdTask.entry.name); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getTaskName()).toEqual(createdTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().getRowsWithSameName(createdTask.entry.name).then((list) => { + expect(list.length).toEqual(1); + }); + }); + + it('[C297613] Should be able to see No tasks found when typing a task name that does not exist', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setTaskName('invalidName'); + expect(tasksCloudDemoPage.editTaskFilterCloudComponent().getTaskName()).toEqual('invalidName'); + + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297480] Should be able to see only tasks that are part of a specific process when processInstanceId is set', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setProcessInstanceId(processInstance.entry.id) + .setStatusFilterDropDown('ALL').clearAssignee(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); + + expect(tasksCloudDemoPage.taskListCloudComponent().getDataTable().getNumberOfRows()).toBe(1); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByProcessInstanceId(processInstance.entry.id); + }); + + it('[C297684] Should be able to see No tasks found when typing an invalid processInstanceId', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setProcessInstanceId('invalidTaskId'); + + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297478] Should be able to see only tasks that are assigned to a specific user when assignee is set', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setAssignee('admin.adf'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(notAssigned.entry.name); + }); + + it('[C297686] Should be able to see No tasks found when typing an invalid user to assignee field', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setAssignee('invalid'); + + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297482] Should be able to see only tasks with specific priority when priority is set', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setPriority(priority); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(priorityTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297687] Should be able to see No tasks found when typing unused value for priority field', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setPriority('70'); + + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297481] Should be able to see only tasks with specific parentTaskId when parentTaskId is set', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setParentTaskId(subTask.entry.parentTaskId); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(subTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297486] Filter by Owner', () => { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setStatusFilterDropDown('ALL').clearAssignee().setOwner('admin.adf'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(notAssigned.entry.name); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setOwner('invalid'); + + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297484] Task is displayed when typing into lastModifiedFrom field a date before the task CreatedDate', function () { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(beforeDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(afterDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297689] Task is not displayed when typing into lastModifiedFrom field the same date as tasks CreatedDate', function () { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(currentDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297485] Task is displayed when typing into lastModifiedTo field a date after the task CreatedDate', function () { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(afterDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(beforeDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297690] Task is not displayed when typing into lastModifiedTo field the same date as tasks CreatedDate', function () { + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(currentDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTask.entry.name); + }); + + it('[C297691] Task is not displayed when typing into lastModifiedFrom field a date before the task due date ' + + 'and into lastModifiedTo a date before task due date', function () { + + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(beforeDate); + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(beforeDate); + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + it('[C297692] Task is displayed when typing into lastModifiedFrom field a date before the tasks due date ' + + 'and into lastModifiedTo a date after', function () { + + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(beforeDate); + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(afterDate); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + }); + + it('[C297693] Task is not displayed when typing into lastModifiedFrom field a date after the tasks due date ' + + 'and into lastModifiedTo a date after', function () { + + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedFrom(afterDate); + tasksCloudDemoPage.editTaskFilterCloudComponent().setLastModifiedTo(afterDate); + expect(tasksCloudDemoPage.taskListCloudComponent().getNoTasksFoundMessage()).toEqual(noTasksFoundMessage); + }); + + }); + +}); diff --git a/e2e/process-services-cloud/task-list-selection.e2e.ts b/e2e/process-services-cloud/task-list-selection.e2e.ts new file mode 100644 index 0000000000..7d184a9b84 --- /dev/null +++ b/e2e/process-services-cloud/task-list-selection.e2e.ts @@ -0,0 +1,157 @@ +/*! + * @license + * Copyright 2019 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 TestConfig = require('../test.config'); + +import { LoginSSOPage } from '@alfresco/adf-testing'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import { AppListCloudPage } from '@alfresco/adf-testing'; +import { Util } from '../util/util'; +import { Tasks } from '../actions/APS-cloud/tasks'; +import { browser } from 'protractor'; + +describe('Task list cloud - selection', () => { + + describe('Task list cloud - selection', () => { + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + let appListCloudComponent = new AppListCloudPage(); + let tasksCloudDemoPage = new TasksCloudDemoPage(); + + const tasksService: Tasks = new Tasks(); + + let silentLogin; + const simpleApp = 'simple-app'; + const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; + let noOfTasks = 3, response; + let tasks = []; + + beforeAll(async (done) => { + silentLogin = false; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); + loginSSOPage.clickOnSSOButton(); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); + + await tasksService.init(user, password); + for (let i = 0; i < noOfTasks; i++) { + response = await tasksService.createStandaloneTask(Util.generateRandomString(), simpleApp); + await tasksService.claimTask(response.entry.id, simpleApp); + tasks.push(response.entry.name); + } + + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(simpleApp); + tasksCloudDemoPage.myTasksFilter().checkTaskFilterIsDisplayed(); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + done(); + }); + + afterEach(async (done) => { + await browser.refresh(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + done(); + }); + + it('[C291914] Should not be able to select any row when selection mode is set to None', () => { + tasksCloudDemoPage.clickSettingsButton().selectSelectionMode('None'); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().selectRow(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkNoRowIsSelected(); + }); + + it('[C291918] Should be able to select only one row when selection mode is set to Single', () => { + tasksCloudDemoPage.clickSettingsButton().selectSelectionMode('Single'); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().selectRow(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsSelected(tasks[0]); + expect(tasksCloudDemoPage.taskListCloudComponent().getDataTable().getNumberOfSelectedRows()).toEqual(1); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().selectRow(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsSelected(tasks[1]); + expect(tasksCloudDemoPage.taskListCloudComponent().getDataTable().getNumberOfSelectedRows()).toEqual(1); + }); + + it('[C291919] Should be able to select only one row when selection mode is set to Multiple', () => { + tasksCloudDemoPage.clickSettingsButton().selectSelectionMode('Multiple'); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().selectRow(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsSelected(tasks[0]); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().selectRowWithKeyboard(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsSelected(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsSelected(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsNotSelected(tasks[2]); + }); + + it('[C291916] Should be able to select multiple row when multiselect is true', () => { + tasksCloudDemoPage.clickSettingsButton().enableMultiSelection(); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().clickCheckbox(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsChecked(tasks[0]); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().clickCheckbox(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsChecked(tasks[1]); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(tasks[2]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsNotChecked(tasks[2]); + tasksCloudDemoPage.taskListCloudComponent().clickCheckbox(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsNotChecked(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsChecked(tasks[0]); + }); + + it('[C291915] Should be possible select all the rows when multiselect is true', () => { + tasksCloudDemoPage.clickSettingsButton().enableMultiSelection(); + tasksCloudDemoPage.clickSettingsButton().disableDisplayTaskDetails(); + tasksCloudDemoPage.clickAppButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + + tasksCloudDemoPage.taskListCloudComponent().getDataTable() + .checkAllRowsButtonIsDisplayed() + .checkAllRows(); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsChecked(tasks[0]); + tasksCloudDemoPage.taskListCloudComponent().clickCheckbox(tasks[1]); + tasksCloudDemoPage.taskListCloudComponent().checkRowIsChecked(tasks[2]); + }); + + }); + +}); diff --git a/e2e/process-services-cloud/taskListCloud.config.ts b/e2e/process-services-cloud/taskListCloud.config.ts new file mode 100644 index 0000000000..3df314de53 --- /dev/null +++ b/e2e/process-services-cloud/taskListCloud.config.ts @@ -0,0 +1,84 @@ +/*! + * @license + * Copyright 2019 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 class TaskListCloudConfiguration { + + constructor() { + } + + getConfiguration() { + return { + 'presets': { + 'default': [ + { + 'key': 'entry.id', + 'type': 'text', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.ID', + 'sortable': true + }, + { + 'key': 'entry.name', + 'type': 'text', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.NAME', + 'sortable': true, + 'cssClass': 'full-width name-column ellipsis-cell' + }, + { + 'key': 'entry.processDefinitionId', + 'type': 'text', + 'title': 'ADF_CLOUD_EDIT_TASK_FILTER.LABEL.PROCESS_DEF_ID', + 'sortable': true, + 'cssClass': 'full-width name-column ellipsis-cell' + }, + { + 'key': 'entry.processInstanceId', + 'type': 'text', + 'title': 'ADF_CLOUD_EDIT_TASK_FILTER.LABEL.PROCESS_INSTANCE_ID', + 'sortable': true, + 'cssClass': 'full-width name-column ellipsis-cell' + }, + { + 'key': 'entry.status', + 'type': 'text', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.STATUS', + 'sortable': true + }, + { + 'key': 'entry.priority', + 'type': 'text', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.PRIORITY', + 'sortable': true + }, + { + 'key': 'entry.createdDate', + 'type': 'date', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.CREATED_DATE', + 'sortable': true, + 'format': 'timeAgo' + }, + { + 'key': 'entry.lastModified', + 'type': 'date', + 'title': 'ADF_CLOUD_TASK_LIST.PROPERTIES.LAST_MODIFIED', + 'sortable': true, + 'format': 'timeAgo' + } + ] + } + }; + } +} diff --git a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts index e3f320ce26..acdda666c3 100644 --- a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts @@ -16,21 +16,19 @@ */ import TestConfig = require('../test.config'); -import resources = require('../util/resources'); -import { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { LoginSSOPage } from '@alfresco/adf-testing'; import { SettingsPage } from '../pages/adf/settingsPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import { TasksListPage } from '../pages/adf/process_services/tasksListPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; -import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import { AppListCloudPage } from '@alfresco/adf-testing'; -import AlfrescoApi = require('alfresco-js-api-node'); import { Tasks } from '../actions/APS-cloud/tasks'; import { ProcessDefinitions } from '../actions/APS-cloud/process-definitions'; import { ProcessInstances } from '../actions/APS-cloud/process-instances'; import { Query } from '../actions/APS-cloud/query'; import { Util } from '../util/util'; +import { browser } from 'protractor'; describe('Task filters cloud', () => { @@ -38,7 +36,7 @@ describe('Task filters cloud', () => { const settingsPage = new SettingsPage(); const loginSSOPage = new LoginSSOPage(); const navigationBarPage = new NavigationBarPage(); - const appListCloudComponent = new AppListCloudComponent(); + const appListCloudComponent = new AppListCloudPage(); const tasksCloudDemoPage = new TasksCloudDemoPage(); const tasksService: Tasks = new Tasks(); const processDefinitionService: ProcessDefinitions = new ProcessDefinitions(); @@ -50,27 +48,27 @@ describe('Task filters cloud', () => { assignedTaskName = Util.generateRandomString(), deletedTaskName = Util.generateRandomString(); const simpleApp = 'simple-app'; const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; - let createdTask, assignedTask, completedTask, deletedTask; + let assignedTask, deletedTask, suspendedTasks; let orderByNameAndPriority = ['cCreatedTask', 'dCreatedTask', 'eCreatedTask']; - let suspendedTasks, cancelledTasks; let priority = 30, nrOfTasks = 3; beforeAll(async () => { silentLogin = false; settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, silentLogin); loginSSOPage.clickOnSSOButton(); - loginSSOPage.loginAPS(user, password); + browser.ignoreSynchronization = true; + loginSSOPage.loginSSOIdentityService(user, password); await tasksService.init(user, password); - createdTask = await tasksService.createStandaloneTask(createdTaskName, simpleApp); + await tasksService.createStandaloneTask(createdTaskName, simpleApp); assignedTask = await tasksService.createStandaloneTask(assignedTaskName, simpleApp); await tasksService.claimTask(assignedTask.entry.id, simpleApp); - completedTask = await tasksService.createAndCompleteTask(completedTaskName, simpleApp); + await tasksService.createAndCompleteTask(completedTaskName, simpleApp); deletedTask = await tasksService.createStandaloneTask(deletedTaskName, simpleApp); await tasksService.deleteTask(deletedTask.entry.id, simpleApp); - for ( let i = 0; i < nrOfTasks; i++ ) { - await tasksService.createStandaloneTask(orderByNameAndPriority[i], simpleApp, {priority: priority}); + for (let i = 0; i < nrOfTasks; i++) { + await tasksService.createStandaloneTask(orderByNameAndPriority[i], simpleApp, { priority: priority }); priority = priority + 20; } @@ -81,7 +79,7 @@ describe('Task filters cloud', () => { let secondProcessInstance = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, simpleApp); await queryService.init(user, password); suspendedTasks = await queryService.getProcessInstanceTasks(processInstance.entry.id, simpleApp); - cancelledTasks = await queryService.getProcessInstanceTasks(secondProcessInstance.entry.id, simpleApp); + await queryService.getProcessInstanceTasks(secondProcessInstance.entry.id, simpleApp); await processInstancesService.suspendProcessInstance(processInstance.entry.id, simpleApp); await processInstancesService.deleteProcessInstance(secondProcessInstance.entry.id, simpleApp); await queryService.getProcessInstanceTasks(processInstance.entry.id, simpleApp); @@ -91,43 +89,64 @@ describe('Task filters cloud', () => { await navigationBarPage.navigateToProcessServicesCloudPage(); appListCloudComponent.checkApsContainer(); await appListCloudComponent.goToApp(simpleApp); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); done(); }); - it('[C290045] Should display only tasks with Assigned state when Assigned is selected from state dropdown', () => { - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('ASSIGNED'); + it('[C290045] Should display only tasks with Assigned status when Assigned is selected from status dropdown', () => { + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('ASSIGNED'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(assignedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(createdTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(completedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(deletedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(deletedTaskName); }); - it('[C290061] Should display only tasks with Completed state when Completed is selected from state dropdown', () => { - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('COMPLETED'); + it('[C290061] Should display only tasks with Completed status when Completed is selected from status dropdown', () => { + tasksCloudDemoPage.editTaskFilterCloudComponent() + .clickCustomiseFilterHeader() + .setStatusFilterDropDown('COMPLETED'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(completedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(assignedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(createdTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(deletedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(deletedTaskName); }); - it('[C290139] Should display only tasks with all states when All is selected from state dropdown', () => { - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setAssignment(' ') - .setStateFilterDropDown('ALL'); + it('[C290139] Should display only tasks with all statuses when All is selected from status dropdown', () => { + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().clearAssignee() + .setStatusFilterDropDown('ALL'); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(deletedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(assignedTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(createdTaskName); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(deletedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); + }); + + it('[C290154] Should display only tasks with suspended statuses when Suspended is selected from status dropdown', () => { + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().clearAssignee() + .setStatusFilterDropDown('SUSPENDED'); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedById(suspendedTasks.list.entries[0].entry.id); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(deletedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(createdTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(assignedTaskName); + }); + + it('[C290060] Should display only tasks with Created status when Created is selected from status dropdown', () => { + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().clearAssignee().setStatusFilterDropDown('CREATED'); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(assignedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(deletedTaskName); }); it('[C290069] Should display tasks ordered by name when Name is selected from sort dropdown', () => { - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('ASSIGNED') - .setSortFilterDropDown('NAME').setOrderFilterDropDown('ASC'); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('ASSIGNED') + .setSortFilterDropDown('Name').setOrderFilterDropDown('ASC'); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().getAllRowsNameColumn().then( (list) => { + tasksCloudDemoPage.taskListCloudComponent().getAllRowsNameColumn().then( (list) => { let initialList = list.slice(0); list.sort(function (firstStr, secondStr) { return firstStr.localeCompare(secondStr); @@ -138,7 +157,7 @@ describe('Task filters cloud', () => { tasksCloudDemoPage.editTaskFilterCloudComponent().setOrderFilterDropDown('DESC'); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.taskListCloudComponent().getDataTable().getAllRowsNameColumn().then( (list) => { + tasksCloudDemoPage.taskListCloudComponent().getAllRowsNameColumn().then( (list) => { let initialList = list.slice(0); list.sort(function (firstStr, secondStr) { return firstStr.localeCompare(secondStr); @@ -149,12 +168,12 @@ describe('Task filters cloud', () => { }); it('[C290156] Should display tasks ordered by id when Id is selected from sort dropdown', () => { - tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStateFilterDropDown('ASSIGNED') - .setSortFilterDropDown('ID').setOrderFilterDropDown('ASC'); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().setStatusFilterDropDown('ASSIGNED') + .setSortFilterDropDown('Id').setOrderFilterDropDown('ASC'); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.getAllRowsByIdColumn().then( (list) => { + tasksCloudDemoPage.getAllRowsByIdColumn().then((list) => { let initialList = list.slice(0); list.sort(function (firstStr, secondStr) { return firstStr.localeCompare(secondStr); @@ -165,7 +184,7 @@ describe('Task filters cloud', () => { tasksCloudDemoPage.editTaskFilterCloudComponent().setOrderFilterDropDown('DESC'); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsDisplayed(); tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkSpinnerIsNotDisplayed(); - tasksCloudDemoPage.getAllRowsByIdColumn().then( (list) => { + tasksCloudDemoPage.getAllRowsByIdColumn().then((list) => { let initialList = list.slice(0); list.sort(function (firstStr, secondStr) { return firstStr.localeCompare(secondStr); @@ -174,7 +193,5 @@ describe('Task filters cloud', () => { expect(JSON.stringify(initialList) === JSON.stringify(list)).toEqual(true); }); }); - }); - }); diff --git a/e2e/process-services/apps-section.e2e.ts b/e2e/process-services/apps-section.e2e.ts index 0bcdf41e62..81f41ea622 100644 --- a/e2e/process-services/apps-section.e2e.ts +++ b/e2e/process-services/apps-section.e2e.ts @@ -25,7 +25,7 @@ import CONSTANTS = require('../util/constants'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; import { ModelsActions } from '../actions/APS/models.actions'; diff --git a/e2e/process-services/attach-file-widget.e2e.ts b/e2e/process-services/attach-file-widget.e2e.ts index 6d8c07f656..078c0cba16 100644 --- a/e2e/process-services/attach-file-widget.e2e.ts +++ b/e2e/process-services/attach-file-widget.e2e.ts @@ -30,7 +30,7 @@ import resources = require('../util/resources'); import { ViewerPage } from '../pages/adf/viewerPage'; import { AppsActions } from '../actions/APS/apps.actions'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; describe('Start Task - Task App', () => { @@ -99,7 +99,7 @@ describe('Start Task - Task App', () => { viewerPage.checkFileContent('1', pdfFile.firstPageText); viewerPage.checkCloseButtonIsDisplayed(); viewerPage.clickCloseButton(); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed('View file'); + taskPage.tasksListPage().checkContentIsDisplayed('View file'); }); }); diff --git a/e2e/process-services/attach-form-component.e2e.ts b/e2e/process-services/attach-form-component.e2e.ts index c65e533466..0593698dce 100644 --- a/e2e/process-services/attach-form-component.e2e.ts +++ b/e2e/process-services/attach-form-component.e2e.ts @@ -26,7 +26,7 @@ import CONSTANTS = require('../util/constants'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; import { by } from 'protractor'; @@ -98,7 +98,7 @@ describe('Attach Form Component', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(testNames.taskName); + taskPage.tasksListPage().selectRow(testNames.taskName); attachFormPage.checkNoFormMessageIsDisplayed(); attachFormPage.checkAttachFormButtonIsDisplayed(); @@ -109,7 +109,7 @@ describe('Attach Form Component', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(testNames.taskName); + taskPage.tasksListPage().selectRow(testNames.taskName); attachFormPage.clickAttachFormButton(); attachFormPage.checkDefaultFormTitleIsDisplayed(testNames.formTitle); @@ -129,7 +129,7 @@ describe('Attach Form Component', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(testNames.taskName); + taskPage.tasksListPage().selectRow(testNames.taskName); attachFormPage.clickAttachFormButton(); attachFormPage.clickAttachFormDropdown(); @@ -140,7 +140,7 @@ describe('Attach Form Component', () => { formFields.completeForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(testNames.taskName); + taskPage.tasksListPage().selectRow(testNames.taskName); expect(formFields.getFieldValue(formTextField)).toEqual(testNames.formFieldValue); }); diff --git a/e2e/process-services/checklist-component.e2e.ts b/e2e/process-services/checklist-component.e2e.ts index 6389465e8d..bf7d649b35 100644 --- a/e2e/process-services/checklist-component.e2e.ts +++ b/e2e/process-services/checklist-component.e2e.ts @@ -17,7 +17,8 @@ import { LoginPage } from '../pages/adf/loginPage'; import { TasksPage } from '../pages/adf/process-services/tasksPage'; -import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ProcessServicesPage } from '../pages/adf/process-services/processServicesPage'; +import { ChecklistDialog } from '../pages/adf/process-services/dialog/createChecklistDialog'; import CONSTANTS = require('../util/constants'); @@ -26,18 +27,20 @@ import { Tenant } from '../models/APS/tenant'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import fs = require('fs'); import path = require('path'); +import { browser } from 'protractor'; describe('Checklist component', () => { let loginPage = new LoginPage(); - let navigationBarPage = new NavigationBarPage(); let processUserModel; let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; let taskPage = new TasksPage(); + const processServices = new ProcessServicesPage(); + const checklistDialog = new ChecklistDialog(); let tasks = ['no checklist created task', 'checklist number task', 'remove running checklist', 'remove completed checklist', 'hierarchy']; let checklists = ['cancelCheckList', 'dialogChecklist', 'addFirstChecklist', 'addSecondChecklist']; @@ -74,10 +77,16 @@ describe('Checklist component', () => { done(); }); - it('[C279976] Should no checklist be created when no title is typed', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + beforeEach(async (done) => { + await browser.get(TestConfig.adf.url + '/activiti'); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + done(); + }); + + it('[C279976] Should no checklist be created when no title is typed', () => { + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.clickOnAddChecklistButton().clickCreateChecklistButton(); taskPage.checkChecklistDialogIsNotDisplayed().checkNoChecklistIsDisplayed(); @@ -85,9 +94,8 @@ describe('Checklist component', () => { }); it('[C279975] Should no checklist be created when clicking on Cancel button on checklist dialog', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.clickOnAddChecklistButton().addName(checklists[0]).clickCancelButton(); taskPage.checkChecklistDialogIsNotDisplayed().checkNoChecklistIsDisplayed(); @@ -95,9 +103,8 @@ describe('Checklist component', () => { }); it('[C261025] Should Checklist dialog be displayed when clicking on add checklist button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.clickOnAddChecklistButton(); taskPage.checkChecklistDialogIsDisplayed(); @@ -108,9 +115,8 @@ describe('Checklist component', () => { }); it('[C261026] Should Checklist number increase when a new checklist is added', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[1]).selectRowByContentName(tasks[1]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[1]); + taskPage.tasksListPage().selectRow(tasks[1]); taskPage.clickOnAddChecklistButton().addName(checklists[2]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(checklists[2]); @@ -123,13 +129,15 @@ describe('Checklist component', () => { }); it('[C279980] Should checklist be removed when clicking on remove button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[2]).selectRowByContentName(tasks[2]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[2]); + taskPage.tasksListPage().selectRow(tasks[2]); - taskPage.clickOnAddChecklistButton().addName(removeChecklist[0]).clickCreateChecklistButton(); - taskPage.clickOnAddChecklistButton().addName(removeChecklist[1]).clickCreateChecklistButton(); + taskPage.clickOnAddChecklistButton(); + taskPage.checkChecklistDialogIsDisplayed(); + checklistDialog.addName(removeChecklist[0]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(removeChecklist[0]); + + taskPage.clickOnAddChecklistButton().addName(removeChecklist[1]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(removeChecklist[1]); taskPage.removeChecklists(removeChecklist[1]); @@ -139,20 +147,20 @@ describe('Checklist component', () => { }); it('[C261027] Should not be able to remove a completed Checklist when clicking on remove button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[3]).selectRowByContentName(tasks[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[3]); + taskPage.tasksListPage().selectRow(tasks[3]); taskPage.clickOnAddChecklistButton().addName(removeChecklist[2]).clickCreateChecklistButton(); - taskPage.clickOnAddChecklistButton().addName(removeChecklist[3]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(removeChecklist[2]); + + taskPage.clickOnAddChecklistButton().addName(removeChecklist[3]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(removeChecklist[3]); - taskPage.tasksListPage().getDataTable().selectRowByContentName(removeChecklist[3]); + taskPage.tasksListPage().selectRow(removeChecklist[3]); taskPage.completeTaskNoForm(); - taskPage.tasksListPage().getDataTable().checkContentIsNotDisplayed(removeChecklist[3]); + taskPage.tasksListPage().checkContentIsNotDisplayed(removeChecklist[3]); - taskPage.tasksListPage().getDataTable().selectRowByContentName(tasks[3]); + taskPage.tasksListPage().selectRow(tasks[3]); taskPage.checkChecklistIsDisplayed(removeChecklist[2]); taskPage.checkChecklistIsDisplayed(removeChecklist[3]); expect(taskPage.getNumberOfChecklists()).toEqual('2'); @@ -161,30 +169,29 @@ describe('Checklist component', () => { }); it('[C261028] Should all checklists of a task be completed when the task is completed', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[4]).selectRowByContentName(tasks[4]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[4]); + taskPage.tasksListPage().selectRow(tasks[4]); taskPage.clickOnAddChecklistButton().addName(hierarchyChecklist[0]).clickCreateChecklistButton(); taskPage.clickOnAddChecklistButton().addName(hierarchyChecklist[1]).clickCreateChecklistButton(); - taskPage.tasksListPage().getDataTable().selectRowByContentName(hierarchyChecklist[0]); + taskPage.tasksListPage().selectRow(hierarchyChecklist[0]); taskPage.clickOnAddChecklistButton().addName(hierarchyChecklist[2]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(hierarchyChecklist[2]); - taskPage.tasksListPage().getDataTable().selectRowByContentName(hierarchyChecklist[1]); + taskPage.tasksListPage().selectRow(hierarchyChecklist[1]); taskPage.clickOnAddChecklistButton().addName(hierarchyChecklist[3]).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(hierarchyChecklist[3]); - taskPage.tasksListPage().getDataTable().selectRowByContentName(tasks[4]); + taskPage.tasksListPage().selectRow(tasks[4]); taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[4]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(hierarchyChecklist[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(hierarchyChecklist[1]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(hierarchyChecklist[2]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(hierarchyChecklist[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[4]); + taskPage.tasksListPage().checkContentIsDisplayed(hierarchyChecklist[0]); + taskPage.tasksListPage().checkContentIsDisplayed(hierarchyChecklist[1]); + taskPage.tasksListPage().checkContentIsDisplayed(hierarchyChecklist[2]); + taskPage.tasksListPage().checkContentIsDisplayed(hierarchyChecklist[3]); }); }); diff --git a/e2e/process-services/comment-component-processes.e2e.ts b/e2e/process-services/comment-component-processes.e2e.ts index db629cdbe8..7b8d1f0045 100644 --- a/e2e/process-services/comment-component-processes.e2e.ts +++ b/e2e/process-services/comment-component-processes.e2e.ts @@ -24,7 +24,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; diff --git a/e2e/process-services/comment-component-tasks.e2e.ts b/e2e/process-services/comment-component-tasks.e2e.ts index 3754e7335d..3463827786 100644 --- a/e2e/process-services/comment-component-tasks.e2e.ts +++ b/e2e/process-services/comment-component-tasks.e2e.ts @@ -27,7 +27,7 @@ import CONSTANTS = require('../util/constants'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; @@ -96,7 +96,7 @@ describe('Comment component for Processes', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName.completed_task); + taskPage.tasksListPage().selectRow(taskName.completed_task); commentsPage.checkCommentInputIsNotDisplayed(); }); @@ -119,7 +119,7 @@ describe('Comment component for Processes', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName.multiple_users); + taskPage.tasksListPage().selectRow(taskName.multiple_users); taskPage.taskDetails().selectActivityTab(); browser.controlFlow().execute(async() => { @@ -149,7 +149,7 @@ describe('Comment component for Processes', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName.multiple_users); + taskPage.tasksListPage().selectRow(taskName.multiple_users); taskPage.taskDetails().selectActivityTab(); browser.controlFlow().execute(async() => { diff --git a/e2e/process-services/custom-process-filters-sorting.e2e.ts b/e2e/process-services/custom-process-filters-sorting.e2e.ts index e9b26da7ec..1d06b82313 100644 --- a/e2e/process-services/custom-process-filters-sorting.e2e.ts +++ b/e2e/process-services/custom-process-filters-sorting.e2e.ts @@ -25,7 +25,7 @@ import { FiltersPage } from '../pages/adf/process-services/filtersPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; diff --git a/e2e/process-services/custom-process-filters.e2e.ts b/e2e/process-services/custom-process-filters.e2e.ts index ac1719e602..1c70e05501 100644 --- a/e2e/process-services/custom-process-filters.e2e.ts +++ b/e2e/process-services/custom-process-filters.e2e.ts @@ -25,7 +25,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; describe('New Process Filters', () => { diff --git a/e2e/process-services/custom-tasks-filters.e2e.ts b/e2e/process-services/custom-tasks-filters.e2e.ts index d203cd2a17..5bd1d32cbe 100644 --- a/e2e/process-services/custom-tasks-filters.e2e.ts +++ b/e2e/process-services/custom-tasks-filters.e2e.ts @@ -27,7 +27,7 @@ import TestConfig = require('../test.config'); import resources = require('../util/resources'); import { Util } from '../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { AppsRuntimeActions } from '../actions/APS/appsRuntime.actions'; import { UsersActions } from '../actions/users.actions'; @@ -129,8 +129,8 @@ describe('Start Task - Custom App', () => { expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(nrOfTasks); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName)).toEqual(true); }); expect(paginationPage.getCurrentPage()).toEqual('Page 1'); @@ -148,8 +148,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(nrOfTasks); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName)).toEqual(true); }); paginationPage.checkNextPageButtonIsDisabled(); @@ -164,8 +164,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); }); @@ -174,8 +174,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); }); @@ -184,8 +184,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); }); @@ -194,8 +194,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); }); }); @@ -209,8 +209,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.tenValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(0, 10))).toEqual(true); }); paginationPage.clickOnNextPage(); @@ -218,8 +218,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.tenValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(10, 20))).toEqual(true); }); }); @@ -233,8 +233,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * currentPage + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fifteenValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fifteenValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(0, 15))).toEqual(true); }); currentPage++; @@ -242,8 +242,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.taskList().getDataTable().waitForTableBody(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfTasks + ' of ' + nrOfTasks); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); }); }); @@ -277,8 +277,8 @@ describe('Start Task - Custom App', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual(totalNrOfPages); paginationPage.checkPageSelectorIsDisplayed(); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); }); @@ -288,8 +288,8 @@ describe('Start Task - Custom App', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual(totalNrOfPages); paginationPage.checkPageSelectorIsDisplayed(); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); }); @@ -299,8 +299,8 @@ describe('Start Task - Custom App', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual(totalNrOfPages); paginationPage.checkPageSelectorIsDisplayed(); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); }); @@ -310,8 +310,8 @@ describe('Start Task - Custom App', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual(totalNrOfPages); paginationPage.checkPageSelectorIsDisplayed(); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); }); }); @@ -333,8 +333,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.clickResetButton(); taskListSinglePage.typeDueAfter(beforeDate); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(paginationTasksName[0]); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(1); + taskListSinglePage.taskList().checkContentIsDisplayed(paginationTasksName[0]); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(1); }); it('[C286414] Task is not displayed when typing into dueAfter field a date after the task due date', function () { @@ -366,8 +366,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.clickResetButton(); taskListSinglePage.typeDueBefore(afterDate); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(paginationTasksName[0]); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(1); + taskListSinglePage.taskList().checkContentIsDisplayed(paginationTasksName[0]); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(1); }); it('[C286426] Task is not displayed when typing into dueBefore field the same date as tasks due date', function () { @@ -393,8 +393,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeDueBefore(afterDate); taskListSinglePage.typeDueAfter(beforeDate); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(paginationTasksName[0]); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(1); + taskListSinglePage.taskList().checkContentIsDisplayed(paginationTasksName[0]); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(1); }); it('[C286429] Task is not displayed when typing into dueAfter field a date after the tasks due date and into dueBefore a date after', function () { @@ -413,9 +413,9 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeAppId(appRuntime.id); expect(taskListSinglePage.getAppId()).toEqual(appRuntime.id.toString()); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(app.taskName); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(app.taskName); - taskListSinglePage.taskList().getDataTable().checkRowIsNotDisplayedByName(paginationTasksName[13]); + taskListSinglePage.taskList().checkContentIsDisplayed(app.taskName); + taskListSinglePage.taskList().checkContentIsDisplayed(app.taskName); + taskListSinglePage.taskList().checkContentIsNotDisplayed(paginationTasksName[13]); }); it('[C280569] Should be able to see No tasks found when typing an invalid appId', () => { @@ -435,8 +435,10 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeTaskName(paginationTasksName[13]); expect(taskListSinglePage.getTaskName()).toEqual(paginationTasksName[13]); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(paginationTasksName[13]); - expect(taskListSinglePage.taskList().getDataTable().getNumberOfRowsDisplayedWithSameName(paginationTasksName[13])).toEqual(2); + taskListSinglePage.taskList().checkContentIsDisplayed(paginationTasksName[13]); + taskListSinglePage.taskList().getRowsDisplayedWithSameName(paginationTasksName[13]).then((list) => { + expect(list.length).toEqual(2); + }); }); it('[C280571] Should be able to see No tasks found when typing a task name that does not exist', () => { @@ -456,8 +458,8 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeTaskId(taskWithDueDate.id); expect(taskListSinglePage.getTaskId()).toEqual(taskWithDueDate.id); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(taskWithDueDate.name); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(1); + taskListSinglePage.taskList().checkContentIsDisplayed(taskWithDueDate.name); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(1); }); it('[C280630] Should be able to see No tasks found when typing an invalid taskId', () => { @@ -476,10 +478,10 @@ describe('Start Task - Custom App', () => { taskListSinglePage.selectState('Completed'); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[0].name); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[1].name); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[2].name); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(3); + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[0].name); + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[1].name); + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[2].name); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(3); }); it('[C286597] Should be able to see only running tasks when choosing Active from state drop down', () => { @@ -488,13 +490,13 @@ describe('Start Task - Custom App', () => { taskListSinglePage.selectState('Active'); - taskListSinglePage.taskList().getDataTable().checkRowIsNotDisplayedByName(completedTasks[0].name); - taskListSinglePage.taskList().getDataTable().checkRowIsNotDisplayedByName(completedTasks[1].name); - taskListSinglePage.taskList().getDataTable().checkRowIsNotDisplayedByName(completedTasks[2].name); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + taskListSinglePage.taskList().checkContentIsNotDisplayed(completedTasks[0].name); + taskListSinglePage.taskList().checkContentIsNotDisplayed(completedTasks[1].name); + taskListSinglePage.taskList().checkContentIsNotDisplayed(completedTasks[2].name); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName)).toEqual(true); }); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(20); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(20); }); it('[C286598] Should be able to see all tasks when choosing All from state drop down', () => { @@ -503,13 +505,13 @@ describe('Start Task - Custom App', () => { taskListSinglePage.selectState('All'); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[0].name); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[1].name); - taskListSinglePage.taskList().getDataTable().checkRowIsDisplayedByName(completedTasks[2].name); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[0].name); + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[1].name); + taskListSinglePage.taskList().checkContentIsDisplayed(completedTasks[2].name); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, allTasksName)).toEqual(true); }); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(23); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(23); }); // failing due to ADF-3667, blocked by ACTIVITI-1975 @@ -523,16 +525,16 @@ describe('Start Task - Custom App', () => { taskListSinglePage.selectState('All'); taskListSinglePage.selectSort('Due (asc)'); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, sortAscByDueDate)).toEqual(true); }); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(4); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(4); taskListSinglePage.clickResetButton(); taskListSinglePage.selectState('All'); taskListSinglePage.selectSort('Due (asc)'); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(23); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(23); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list.slice(0, 4), sortAscByDueDate)).toEqual(true); expect(Util.arrayContainsArray(list.slice(4, list.length), allTasksName)).toEqual(true); }); @@ -549,16 +551,16 @@ describe('Start Task - Custom App', () => { taskListSinglePage.selectState('All'); taskListSinglePage.selectSort('Due (desc)'); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list, sortDescByDueDate)).toEqual(true); }); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(4); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(4); taskListSinglePage.clickResetButton(); taskListSinglePage.selectState('All'); taskListSinglePage.selectSort('Due (asc)'); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(23); - taskListSinglePage.taskList().getDataTable().getAllRowsNameColumn().then(function (list) { + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(23); + taskListSinglePage.taskList().getAllRowsNameColumn().then(function (list) { expect(Util.arrayContainsArray(list.slice(0, 4), sortDescByDueDate)).toEqual(true); expect(Util.arrayContainsArray(list.slice(4, list.length), allTasksName)).toEqual(true); }); @@ -573,7 +575,7 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeProcessDefinitionId(processDefinitionId.processDefinitionId); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(4); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(4); taskListSinglePage.getAllProcessDefinitionIds().then(function (list) { expect(Util.arrayContainsArray(list, processDefinitionIds)).toEqual(true); }); @@ -597,7 +599,7 @@ describe('Start Task - Custom App', () => { taskListSinglePage.typeProcessInstanceId(processDefinitionId.id); expect(taskListSinglePage.getProcessInstanceId()).toEqual(processDefinitionId.id); - expect(taskListSinglePage.taskList().getDataTable().getAllDisplayedRows()).toBe(1); + expect(taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(1); taskListSinglePage.getAllProcessInstanceIds().then(function (list) { expect(Util.arrayContainsArray(list, processInstanceIds)).toEqual(true); }); diff --git a/e2e/process-services/dynamic-table-date-picker.e2e.ts b/e2e/process-services/dynamic-table-date-picker.e2e.ts index e832b6ac1d..b2f0bcfbe0 100644 --- a/e2e/process-services/dynamic-table-date-picker.e2e.ts +++ b/e2e/process-services/dynamic-table-date-picker.e2e.ts @@ -26,7 +26,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; diff --git a/e2e/process-services/empty-process-list-component.e2e.ts b/e2e/process-services/empty-process-list-component.e2e.ts index 4d382b7440..a741cd0ecc 100644 --- a/e2e/process-services/empty-process-list-component.e2e.ts +++ b/e2e/process-services/empty-process-list-component.e2e.ts @@ -25,7 +25,7 @@ import { ProcessDetailsPage } from '../pages/adf/process-services/processDetails import { ProcessListPage } from '../pages/adf/process-services/processListPage'; import { StartProcessPage } from '../pages/adf/process-services/startProcessPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; diff --git a/e2e/process-services/form-component.e2e.ts b/e2e/process-services/form-component.e2e.ts index 85dde8fed7..c1147093c9 100644 --- a/e2e/process-services/form-component.e2e.ts +++ b/e2e/process-services/form-component.e2e.ts @@ -23,7 +23,7 @@ import { AmountWidget } from '../pages/adf/process-services/widgets/amountWidget import { NumberWidget } from '../pages/adf/process-services/widgets/numberWidget'; import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; describe('Form Component', () => { diff --git a/e2e/process-services/form-people-widget.e2e.ts b/e2e/process-services/form-people-widget.e2e.ts index 27e6b8fb9f..f80945ea6a 100644 --- a/e2e/process-services/form-people-widget.e2e.ts +++ b/e2e/process-services/form-people-widget.e2e.ts @@ -27,7 +27,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/form-widgets-component.e2e.ts b/e2e/process-services/form-widgets-component.e2e.ts index c201aed864..6b7fef4e94 100644 --- a/e2e/process-services/form-widgets-component.e2e.ts +++ b/e2e/process-services/form-widgets-component.e2e.ts @@ -28,7 +28,7 @@ import Task = require('../models/APS/Task'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; @@ -84,7 +84,7 @@ describe('Form widgets', () => { taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(newTask).addDescription('Description').addForm(app.formName).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(newTask); + taskPage.tasksListPage().checkContentIsDisplayed(newTask); taskPage.formFields().checkFormIsDisplayed(); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); }) diff --git a/e2e/process-services/pagination-processlist-addingProcesses.e2e.ts b/e2e/process-services/pagination-processlist-addingProcesses.e2e.ts index a17496d3fb..90fc71def3 100644 --- a/e2e/process-services/pagination-processlist-addingProcesses.e2e.ts +++ b/e2e/process-services/pagination-processlist-addingProcesses.e2e.ts @@ -24,7 +24,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/pagination-tasklist-addingTasks.e2e.ts b/e2e/process-services/pagination-tasklist-addingTasks.e2e.ts index 3d6b9aa77d..385bf8d31b 100644 --- a/e2e/process-services/pagination-tasklist-addingTasks.e2e.ts +++ b/e2e/process-services/pagination-tasklist-addingTasks.e2e.ts @@ -22,7 +22,7 @@ import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import CONSTANTS = require('../util/constants'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; @@ -80,7 +80,7 @@ describe('Items per page set to 15 and adding of tasks', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue + ' of ' + (nrOfTasks - 5)); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fifteenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fifteenValue); browser.controlFlow().execute(async () => { for (i; i < nrOfTasks; i++) { @@ -94,7 +94,7 @@ describe('Items per page set to 15 and adding of tasks', () => { expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfTasks + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); paginationPage.checkNextPageButtonIsDisabled(); paginationPage.checkPreviousPageButtonIsEnabled(); }); diff --git a/e2e/process-services/people-component.e2e.ts b/e2e/process-services/people-component.e2e.ts index 9fd5d76397..0da1fbf159 100644 --- a/e2e/process-services/people-component.e2e.ts +++ b/e2e/process-services/people-component.e2e.ts @@ -18,6 +18,7 @@ import { LoginPage } from '../pages/adf/loginPage'; import { TasksPage } from '../pages/adf/process-services/tasksPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ProcessServicesPage } from '../pages/adf/process-services/processServicesPage'; import CONSTANTS = require('../util/constants'); @@ -26,10 +27,11 @@ import { Tenant } from '../models/APS/tenant'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import fs = require('fs'); import path = require('path'); +import { browser } from 'protractor'; describe('People component', () => { @@ -39,6 +41,7 @@ describe('People component', () => { let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; let taskPage = new TasksPage(); let peopleTitle = 'People this task is shared with '; + const processServices = new ProcessServicesPage(); let tasks = ['no people involved task', 'remove people task', 'can not complete task', 'multiple users', 'completed filter']; @@ -68,7 +71,7 @@ describe('People component', () => { await this.alfrescoJsApi.activiti.appsApi.importAppDefinition(file); for (let i = 0; i < tasks.length; i++) { - this.alfrescoJsApi.activiti.taskApi.createNewTask({name: tasks[i]}); + await this.alfrescoJsApi.activiti.taskApi.createNewTask({name: tasks[i]}); } loginPage.loginToProcessServicesUsingUserModel(processUserModel); @@ -76,10 +79,17 @@ describe('People component', () => { done(); }); - it('[C279989] Should no people be involved when no user is typed', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + beforeEach(async (done) => { + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + await browser.get(TestConfig.adf.url + '/activiti'); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + done(); + }); + + it('[C279989] Should no people be involved when no user is typed', () => { + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton(); taskPage.taskDetails().clickAddInvolvedUserButton(); @@ -87,9 +97,8 @@ describe('People component', () => { }); it('[C279990] Should no people be involved when clicking on Cancel button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -100,9 +109,8 @@ describe('People component', () => { }); it('[C261029] Should People dialog be displayed when clicking on add people button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton(); expect(taskPage.taskDetails().getInvolvePeopleHeader()).toEqual('Add people and groups'); @@ -112,9 +120,8 @@ describe('People component', () => { }); it('[C279991] Should not be able to involve a user when is the creator of the task', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(processUserModel.firstName + ' ' + processUserModel.lastName) @@ -124,9 +131,8 @@ describe('People component', () => { }); it('[C261030] Should involved user be removed when clicking on remove button', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]).selectRowByContentName(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().selectRow(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -141,9 +147,8 @@ describe('People component', () => { }); it('[C280013] Should not be able to complete a task by a involved user', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[1]).selectRowByContentName(tasks[1]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[1]); + taskPage.tasksListPage().selectRow(tasks[1]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -157,16 +162,15 @@ describe('People component', () => { loginPage.loginToProcessServicesUsingUserModel(assigneeUserModel); navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[1]).selectRowByContentName(tasks[1]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[1]); + taskPage.tasksListPage().selectRow(tasks[1]); taskPage.completeTaskNoFormNotDisplayed(); }); it('[C261031] Should be able to involve multiple users to a task', () => { - loginPage.loginToProcessServicesUsingUserModel(processUserModel); - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[2]).selectRowByContentName(tasks[2]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[2]); + taskPage.tasksListPage().selectRow(tasks[2]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -195,9 +199,8 @@ describe('People component', () => { }); it('[C280014] Should involved user see the task in completed filters when the task is completed', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); - taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[3]).selectRowByContentName(tasks[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[3]); + taskPage.tasksListPage().selectRow(tasks[3]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -210,17 +213,18 @@ describe('People component', () => { taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(tasks[3]); + taskPage.tasksListPage().selectRow(tasks[3]); expect(taskPage.taskDetails().getInvolvedUserEmail(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName)) .toEqual(assigneeUserModel.email); loginPage.loginToProcessServicesUsingUserModel(assigneeUserModel); navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[3]).selectRowByContentName(tasks[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[3]); + taskPage.tasksListPage().selectRow(tasks[3]); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsNotDisplayed(tasks[3]); + taskPage.tasksListPage().checkContentIsNotDisplayed(tasks[3]); }); }); diff --git a/e2e/process-services/process-attachmentList-actionMenu.e2e.ts b/e2e/process-services/process-attachmentList-actionMenu.e2e.ts index aad4a7f061..0ef2d1bae0 100644 --- a/e2e/process-services/process-attachmentList-actionMenu.e2e.ts +++ b/e2e/process-services/process-attachmentList-actionMenu.e2e.ts @@ -28,7 +28,7 @@ import { Util } from '../util/util'; import path = require('path'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; import { FileModel } from '../models/ACS/fileModel'; diff --git a/e2e/process-services/process-filters-component.e2e.ts b/e2e/process-services/process-filters-component.e2e.ts index f3f5c8bc2a..67f0df957f 100644 --- a/e2e/process-services/process-filters-component.e2e.ts +++ b/e2e/process-services/process-filters-component.e2e.ts @@ -27,7 +27,7 @@ import { AppNavigationBarPage } from '../pages/adf/process-services/appNavigatio import { ProcessDetailsPage } from '../pages/adf/process-services/processDetailsPage'; import { ProcessListPage } from '../pages/adf/process-services/processListPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; diff --git a/e2e/process-services/processList-component.e2e.ts b/e2e/process-services/processList-component.e2e.ts index a18b45c6e1..670f12cc63 100644 --- a/e2e/process-services/processList-component.e2e.ts +++ b/e2e/process-services/processList-component.e2e.ts @@ -21,7 +21,7 @@ import { ProcessListDemoPage } from '../pages/adf/demo-shell/process-services/pr import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/processlist-pagination.e2e.ts b/e2e/process-services/processlist-pagination.e2e.ts index b92835b2b6..336d773e49 100644 --- a/e2e/process-services/processlist-pagination.e2e.ts +++ b/e2e/process-services/processlist-pagination.e2e.ts @@ -24,7 +24,7 @@ import { ProcessDetailsPage } from '../pages/adf/process-services/processDetails import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; @@ -105,12 +105,14 @@ describe('Process List - Pagination', function () { done(); }); - it('[C261042] Should display default pagination', function () { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); + beforeEach(async (done) => { + await navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); + done(); + }); + it('[C261042] Should display default pagination', function () { page = 1; totalPages = 1; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -128,7 +130,6 @@ describe('Process List - Pagination', function () { it('[C261043] Should be possible to Items per page to 15', function () { page = 1; totalPages = 2; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -170,7 +171,6 @@ describe('Process List - Pagination', function () { it('[C261044] Should be possible to Items per page to 10', function () { page = 1; totalPages = 2; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -212,7 +212,6 @@ describe('Process List - Pagination', function () { it('[C261047] Should be possible to Items per page to 20', function () { page = 1; totalPages = 1; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -242,7 +241,6 @@ describe('Process List - Pagination', function () { let showing; page = 1; totalPages = 4; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -317,7 +315,6 @@ describe('Process List - Pagination', function () { let showing; page = 1; totalPages = 2; - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processDetailsPage.checkProcessTitleIsDisplayed(); processFiltersPage.waitForTableBody(); @@ -368,7 +365,6 @@ describe('Process List - Pagination', function () { }); it('[C261048] Should be possible to sort processes by name', function () { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); @@ -388,7 +384,6 @@ describe('Process List - Pagination', function () { }); it('[C286260] Should keep sorting when changing \'Items per page\'', function () { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickProcessButton(); processFiltersPage.clickRunningFilterButton(); processFiltersPage.checkFilterIsHighlighted(processFilterRunning); processDetailsPage.checkProcessTitleIsDisplayed(); diff --git a/e2e/process-services/sort-tasklist-pagination.e2e.ts b/e2e/process-services/sort-tasklist-pagination.e2e.ts index ff750759d1..e5919a711a 100644 --- a/e2e/process-services/sort-tasklist-pagination.e2e.ts +++ b/e2e/process-services/sort-tasklist-pagination.e2e.ts @@ -26,7 +26,7 @@ import TestConfig = require('../test.config'); import resources = require('../util/resources'); import { Util } from '../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; diff --git a/e2e/process-services/standalone-task.e2e.ts b/e2e/process-services/standalone-task.e2e.ts index 80fa563849..0e77fd077e 100644 --- a/e2e/process-services/standalone-task.e2e.ts +++ b/e2e/process-services/standalone-task.e2e.ts @@ -29,7 +29,7 @@ import Task = require('../models/APS/Task'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import fs = require('fs'); import path = require('path'); @@ -75,7 +75,7 @@ describe('Start Task - Task App', () => { taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(tasks[0]).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); taskPage.taskDetails().noFormIsDisplayed(); taskPage.taskDetails().checkCompleteTaskButtonIsDisplayed().checkCompleteTaskButtonIsEnabled(); taskPage.taskDetails().checkAttachFormButtonIsDisplayed(); @@ -90,12 +90,12 @@ describe('Start Task - Task App', () => { taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(tasks[1]).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[1]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[1]); taskPage.formFields().noFormIsDisplayed(); taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(tasks[1]); + taskPage.tasksListPage().selectRow(tasks[1]); expect(taskPage.formFields().getCompletedTaskNoFormMessage()).toEqual('Task ' + tasks[1] + ' completed'); taskPage.formFields().noFormIsDisplayed(); @@ -108,7 +108,7 @@ describe('Start Task - Task App', () => { taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(tasks[2]).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[2]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[2]); taskPage.formFields().noFormIsDisplayed(); taskPage.formFields().clickOnAttachFormButton().selectForm(app.formName).clickOnAttachFormButton(); @@ -121,7 +121,7 @@ describe('Start Task - Task App', () => { taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(tasks[3]).addForm(app.formName).clickStartButton(); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[3]); expect(taskPage.taskDetails().getFormName()).toEqual(app.formName); browser.controlFlow().execute(async () => { @@ -130,7 +130,7 @@ describe('Start Task - Task App', () => { }); browser.refresh(); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[3]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[3]); taskPage.checkTaskTitle(tasks[3]); taskPage.formFields().noFormIsDisplayed(); diff --git a/e2e/process-services/start-process-component.e2e.ts b/e2e/process-services/start-process-component.e2e.ts index 84266f81be..715bfad82a 100644 --- a/e2e/process-services/start-process-component.e2e.ts +++ b/e2e/process-services/start-process-component.e2e.ts @@ -36,7 +36,7 @@ import { Tenant } from '../models/APS/tenant'; import { FileModel } from '../models/ACS/fileModel'; import dateFormat = require('dateformat'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import path = require('path'); describe('Start Process Component', () => { @@ -371,7 +371,7 @@ describe('Start Process Component', () => { processFiltersPage.clickRunningFilterButton(); processFiltersPage.selectFromProcessList('Active Task'); processDetailsPage.clickOnActiveTask(); - processDetailsPage.checkActiveTaskTitleIsDisplayed(app.task_name); + processDetailsPage.checkActiveTaskTitleIsDisplayed(); }); it('[C260457] Should display process in Completed when cancelled', () => { diff --git a/e2e/process-services/start-task-custom-app.e2e.ts b/e2e/process-services/start-task-custom-app.e2e.ts index 0446a90373..34ba464179 100644 --- a/e2e/process-services/start-task-custom-app.e2e.ts +++ b/e2e/process-services/start-task-custom-app.e2e.ts @@ -30,7 +30,7 @@ import { FileModel } from '../models/ACS/fileModel'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; @@ -99,7 +99,7 @@ describe('Start Task - Custom App', () => { .then(() => { taskPage .tasksListPage() - .getDataTable().checkContentIsDisplayed(tasks[0]); + .checkContentIsDisplayed(tasks[0]); taskPage .taskDetails() @@ -150,7 +150,7 @@ describe('Start Task - Custom App', () => { taskPage .tasksListPage() - .getDataTable().checkContentIsDisplayed(tasks[2]); + .checkContentIsDisplayed(tasks[2]); taskPage .formFields() @@ -176,7 +176,7 @@ describe('Start Task - Custom App', () => { .clickCancelButton(); taskPage.tasksListPage() - .getDataTable().checkContentIsNotDisplayed(tasks[3]); + .checkContentIsNotDisplayed(tasks[3]); expect(taskPage.filtersPage().getActiveFilter()).toEqual(CONSTANTS.TASK_FILTERS.MY_TASKS); }); @@ -193,7 +193,7 @@ describe('Start Task - Custom App', () => { taskPage .tasksListPage() - .getDataTable().checkContentIsDisplayed(tasks[4]); + .checkContentIsDisplayed(tasks[4]); expect(taskPage.formFields() .setFieldValue(by.id, formTextField, formFieldValue) @@ -206,7 +206,7 @@ describe('Start Task - Custom App', () => { taskPage .tasksListPage() - .getDataTable().checkContentIsDisplayed(tasks[4]); + .checkContentIsDisplayed(tasks[4]); taskPage .formFields() @@ -244,8 +244,8 @@ describe('Start Task - Custom App', () => { .goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); taskPage.tasksListPage() - .getDataTable().checkContentIsDisplayed(tasks[5]) - .selectRowByContentName(tasks[5]); + .checkContentIsDisplayed(tasks[5]); + taskPage.tasksListPage().selectRow(tasks[5]); taskPage.checkTaskTitle(tasks[5]); @@ -268,7 +268,7 @@ describe('Start Task - Custom App', () => { navigationBarPage.navigateToProcessServicesPage().goToApp(appModel.name).clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); taskPage.createNewTask().addName(showHeaderTask).clickStartButton(); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(showHeaderTask); + taskPage.tasksListPage().checkContentIsDisplayed(showHeaderTask); appNavigationBarPage.clickSettingsButton(); taskPage.taskDetails().appSettingsToggles().disableShowHeader(); diff --git a/e2e/process-services/start-task-task-app.e2e.ts b/e2e/process-services/start-task-task-app.e2e.ts index 844e57838f..1b12c915fd 100644 --- a/e2e/process-services/start-task-task-app.e2e.ts +++ b/e2e/process-services/start-task-task-app.e2e.ts @@ -31,7 +31,7 @@ import { FileModel } from '../models/ACS/fileModel'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { Util } from '../util/util'; import fs = require('fs'); @@ -96,7 +96,7 @@ describe('Start Task - Task App', () => { taskPage.createNewTask().addName(tasks[0]) .addForm(app.formName).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[0]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[0]); taskPage.taskDetails().clickInvolvePeopleButton() .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) .selectUserToInvolve(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) @@ -118,7 +118,7 @@ describe('Start Task - Task App', () => { taskPage.createNewTask().checkStartButtonIsDisabled().addName(tasks[3]) .checkStartButtonIsEnabled().clickCancelButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsNotDisplayed(tasks[3]); + taskPage.tasksListPage().checkContentIsNotDisplayed(tasks[3]); expect(taskPage.filtersPage().getActiveFilter()).toEqual(CONSTANTS.TASK_FILTERS.MY_TASKS); }); }); @@ -129,11 +129,11 @@ describe('Start Task - Task App', () => { taskPage.createNewTask() .addForm(app.formName).addName(tasks[4]).clickStartButton() .then(() => { - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[4]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[4]); expect(taskPage.formFields().setFieldValue(by.id, formTextField, formFieldValue) .getFieldValue(formTextField)).toEqual(formFieldValue); taskPage.formFields().refreshForm().checkFieldValue(by.id, formTextField, ''); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[4]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[4]); taskPage.formFields().setFieldValue(by.id, formTextField, formFieldValue) .checkFieldValue(by.id, formTextField, formFieldValue); taskPage.formFields().saveForm().checkFieldValue(by.id, formTextField, formFieldValue); @@ -149,7 +149,8 @@ describe('Start Task - Task App', () => { taskPage.tasksListPage().checkTaskListIsLoaded(); taskPage.tasksListPage().getDataTable().waitForTableBody(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(tasks[5]).selectRowByContentName(tasks[5]); + taskPage.tasksListPage().checkContentIsDisplayed(tasks[5]); + taskPage.tasksListPage().selectRow(tasks[5]); taskPage.checkTaskTitle(tasks[5]); expect(taskPage.taskDetails().getAssignee()).toEqual(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName); }); @@ -168,7 +169,7 @@ describe('Start Task - Task App', () => { it('[C260420] Should Information box be hidden when showHeaderContent property is set on false', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(showHeaderTask); + taskPage.tasksListPage().checkContentIsDisplayed(showHeaderTask); appNavigationBarPage.clickSettingsButton(); taskPage.taskDetails().appSettingsToggles().disableShowHeader(); diff --git a/e2e/process-services/task-attachmentList-actionMenu.e2e.ts b/e2e/process-services/task-attachmentList-actionMenu.e2e.ts index 847d50d7c3..fa99f0b788 100644 --- a/e2e/process-services/task-attachmentList-actionMenu.e2e.ts +++ b/e2e/process-services/task-attachmentList-actionMenu.e2e.ts @@ -32,7 +32,7 @@ import { Util } from '../util/util'; import path = require('path'); import fs = require('fs'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; import { FileModel } from '../models/ACS/fileModel'; @@ -132,7 +132,7 @@ describe('Attachment list action menu for tasks', () => { taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName.completed); + taskPage.tasksListPage().selectRow(taskName.completed); attachmentListPage.checkAttachFileButtonIsNotDisplayed(); attachmentListPage.viewFile(pngFile.name); @@ -141,7 +141,7 @@ describe('Attachment list action menu for tasks', () => { viewerPage.clickCloseButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName.completed); + taskPage.tasksListPage().selectRow(taskName.completed); attachmentListPage.downloadFile(pngFile.name); @@ -194,7 +194,7 @@ describe('Attachment list action menu for tasks', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName('SHARE KNOWLEDGE'); + taskPage.tasksListPage().selectRow('SHARE KNOWLEDGE'); attachmentListPage.checkFileIsAttached(pngFile.name); @@ -205,7 +205,7 @@ describe('Attachment list action menu for tasks', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName('SHARE KNOWLEDGE'); + taskPage.tasksListPage().selectRow('SHARE KNOWLEDGE'); attachmentListPage.checkEmptyAttachmentList(); }); diff --git a/e2e/process-services/task-audit.e2e.ts b/e2e/process-services/task-audit.e2e.ts index 5e83d78c77..1f6c50acfb 100644 --- a/e2e/process-services/task-audit.e2e.ts +++ b/e2e/process-services/task-audit.e2e.ts @@ -16,8 +16,8 @@ */ import { LoginPage } from '../pages/adf/loginPage'; -import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksPage } from '../pages/adf/process-services/tasksPage'; +import { ProcessServicesPage } from '../pages/adf/process-services/processServicesPage'; import CONSTANTS = require('../util/constants'); @@ -26,20 +26,21 @@ import { Tenant } from '../models/APS/tenant'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; import path = require('path'); import { Util } from '../util/util'; +import { browser } from 'protractor'; describe('Task Audit', () => { let loginPage = new LoginPage(); - let navigationBarPage = new NavigationBarPage(); let processUserModel; let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; let taskPage = new TasksPage(); + const processServices = new ProcessServicesPage(); let taskTaskApp = 'Audit task task app'; let taskCustomApp = 'Audit task custom app'; let taskCompleteCustomApp = 'Audit completed task custom app'; @@ -72,23 +73,28 @@ describe('Task Audit', () => { done(); }); + beforeEach(async (done) => { + await browser.get(TestConfig.adf.url + '/activiti'); + done(); + }); + it('[C260386] Should Audit file be downloaded when clicking on Task Audit log icon on a standalone running task', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskTaskApp); + taskPage.tasksListPage().checkContentIsDisplayed(taskTaskApp); taskPage.taskDetails().clickAuditLogButton(); expect(Util.fileExists(auditLogFile, 10)).toBe(true); }); it('[C260389] Should Audit file be downloaded when clicking on Task Audit log icon on a standalone completed task', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskTaskApp); + taskPage.tasksListPage().checkContentIsDisplayed(taskTaskApp); taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskTaskApp); + taskPage.tasksListPage().selectRow(taskTaskApp); expect(taskPage.formFields().getCompletedTaskNoFormMessage()).toEqual('Task ' + taskTaskApp + ' completed'); taskPage.taskDetails().clickAuditLogButton(); @@ -96,16 +102,16 @@ describe('Task Audit', () => { }); it('[C263944] Should Audit file be downloaded when clicking on Task Audit log icon on a custom app standalone completed task', () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.createNewTask().addName(taskCompleteCustomApp).clickStartButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskCompleteCustomApp); + taskPage.tasksListPage().checkContentIsDisplayed(taskCompleteCustomApp); taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskCompleteCustomApp); + taskPage.tasksListPage().selectRow(taskCompleteCustomApp); expect(taskPage.formFields().getCompletedTaskNoFormMessage()).toEqual('Task ' + taskCompleteCustomApp + ' completed'); taskPage.taskDetails().clickAuditLogButton(); @@ -113,12 +119,12 @@ describe('Task Audit', () => { }); it('[C263943] Should Audit file be downloaded when clicking on Task Audit log icon on a custom app standalone running task', () => { - navigationBarPage.navigateToProcessServicesPage().goToApp(appModel.name).clickTasksButton(); + processServices.goToApp(appModel.name).clickTasksButton(); taskPage.createNewTask().addName(taskCustomApp).clickStartButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskCustomApp); + taskPage.tasksListPage().checkContentIsDisplayed(taskCustomApp); taskPage.taskDetails().clickAuditLogButton(); expect(Util.fileExists(auditLogFile, 10)).toBe(true); diff --git a/e2e/process-services/task-details-form.e2e.ts b/e2e/process-services/task-details-form.e2e.ts index df7e863d5e..8bc686ff9d 100644 --- a/e2e/process-services/task-details-form.e2e.ts +++ b/e2e/process-services/task-details-form.e2e.ts @@ -28,7 +28,7 @@ import { FiltersPage } from '../pages/adf/process-services/filtersPage'; import { StandaloneTask } from '../models/APS/standaloneTask'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; describe('Task Details - Form', () => { @@ -101,7 +101,7 @@ describe('Task Details - Form', () => { }); it('[C280018] Should be able to change the form in a task', () => { - tasksListPage.getDataTable().selectRowByContentName(task.name); + tasksListPage.selectRow(task.name); taskDetailsPage.checkEditFormButtonIsDisplayed(); taskDetailsPage.clickEditFormButton(); @@ -135,7 +135,7 @@ describe('Task Details - Form', () => { }); it('[C280019] Should be able to remove the form form a task', () => { - tasksListPage.getDataTable().selectRowByContentName(task.name); + tasksListPage.selectRow(task.name); taskDetailsPage.checkEditFormButtonIsDisplayed(); taskDetailsPage.clickEditFormButton(); @@ -149,14 +149,14 @@ describe('Task Details - Form', () => { }); it('[C280557] Should display task details when selecting another task while the Attach Form dialog is displayed', () => { - tasksListPage.getDataTable().selectRowByContentName(task.name); + tasksListPage.selectRow(task.name); taskDetailsPage.checkEditFormButtonIsDisplayed(); taskDetailsPage.clickEditFormButton(); taskDetailsPage.checkRemoveAttachFormIsDisplayed(); - tasksListPage.getDataTable().selectRowByContentName(otherTask.name); + tasksListPage.selectRow(otherTask.name); taskDetailsPage.checkFormIsAttached(otherAttachedForm.name); }); }); diff --git a/e2e/process-services/task-details-no-form.e2e.ts b/e2e/process-services/task-details-no-form.e2e.ts index ec8d38e1b5..cb62537167 100644 --- a/e2e/process-services/task-details-no-form.e2e.ts +++ b/e2e/process-services/task-details-no-form.e2e.ts @@ -26,7 +26,7 @@ import { Tenant } from '../models/APS/tenant'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { AppsActions } from '../actions/APS/apps.actions'; @@ -70,8 +70,8 @@ describe('Task Details - No form', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(app.taskName); - taskPage.tasksListPage().getDataTable().selectRowByContentName(app.taskName); + taskPage.tasksListPage().checkContentIsDisplayed(app.taskName); + taskPage.tasksListPage().selectRow(app.taskName); taskPage.taskDetails().noFormIsDisplayed(); taskPage.taskDetails().checkCompleteTaskButtonIsDisplayed().checkCompleteTaskButtonIsEnabled(); taskPage.taskDetails().checkAttachFormButtonIsNotDisplayed(); diff --git a/e2e/process-services/task-details.e2e.ts b/e2e/process-services/task-details.e2e.ts index d79a5d97a8..ff00e21aef 100644 --- a/e2e/process-services/task-details.e2e.ts +++ b/e2e/process-services/task-details.e2e.ts @@ -17,25 +17,26 @@ import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UsersActions } from '../actions/users.actions'; import { Tenant } from '../models/APS/tenant'; import Task = require('../models/APS/Task'); import TaskModel = require('../models/APS/TaskModel'); import FormModel = require('../models/APS/FormModel'); import { AppsActions } from '../actions/APS/apps.actions'; +import { ProcessServicesPage } from '../pages/adf/process-services/processServicesPage'; import resources = require('../util/resources'); import CONSTANTS = require('../util/constants'); import dateFormat = require('dateformat'); import { LoginPage } from '../pages/adf/loginPage'; -import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksPage } from '../pages/adf/process-services/tasksPage'; import { browser } from 'protractor'; describe('Task Details component', () => { + const processServices = new ProcessServicesPage(); let processUserModel, appModel; let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; let tasks = ['Modifying task', 'Information box', 'No form', 'Not Created', 'Refreshing form', 'Assignee task', 'Attach File']; @@ -45,7 +46,6 @@ describe('Task Details component', () => { let loginPage = new LoginPage(); let taskPage = new TasksPage(); - let navigationBarPage = new NavigationBarPage(); beforeAll(async (done) => { let users = new UsersActions(); @@ -71,11 +71,19 @@ describe('Task Details component', () => { done(); }); + beforeEach(async (done) => { + await browser.get(TestConfig.adf.url + '/activiti'); + done(); + }); + it('[C260506] Should display task details for standalone task - Task App', async () => { - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.createNewTask().addName(tasks[1]).addDescription('Description') - .addForm(app.formName).clickStartButton(); + taskPage.createNewTask() + .addName(tasks[1]) + .addDescription('Description') + .addForm(app.formName) + .clickStartButton(); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); let allTasks = await browser.controlFlow().execute(async () => { @@ -83,24 +91,17 @@ describe('Task Details component', () => { }); let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskModel.getName()); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(taskModel.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); + expect(taskPage.taskDetails().getDescription()).toEqual(taskModel.getDescription()); expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : taskModel.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : taskModel.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(taskModel.getParentTaskName() === null ? CONSTANTS.TASK_DETAILS.NO_PARENT : taskModel.getParentTaskName()); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(taskModel.getParentTaskId() === null ? '' : taskModel.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(taskModel.getDuration() === null ? '' : taskModel.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(taskModel.getEndDate() === null ? '' : dateFormat(taskModel.getEndDate(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getCategory()).toEqual(CONSTANTS.TASK_DETAILS.NO_CATEGORY); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(''); + expect(taskPage.taskDetails().getDuration()).toEqual(''); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); let taskForm = await browser.controlFlow().execute(async () => { @@ -109,15 +110,17 @@ describe('Task Details component', () => { formModel = new FormModel(taskForm); - expect(taskPage.taskDetails().getFormName()) - .toEqual(formModel.getName() === null ? CONSTANTS.TASK_DETAILS.NO_FORM : formModel.getName()); + expect(taskPage.taskDetails().getFormName()).toEqual(formModel.getName()); }); it('[C263946] Should display task details for standalone task - Custom App', async () => { - navigationBarPage.navigateToProcessServicesPage().goToApp(appModel.name).clickTasksButton(); + processServices.goToApp(appModel.name).clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.createNewTask().addName(tasks[1]).addDescription('Description') - .addForm(app.formName).clickStartButton(); + taskPage.createNewTask() + .addName(tasks[1]) + .addDescription('Description') + .addForm(app.formName) + .clickStartButton(); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); let allTasks = await browser.controlFlow().execute(async () => { @@ -125,25 +128,18 @@ describe('Task Details component', () => { }); let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskModel.getName()); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(taskModel.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); + expect(taskPage.taskDetails().getDescription()).toEqual(taskModel.getDescription()); expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : taskModel.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : taskModel.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(taskModel.getParentTaskName() === null ? CONSTANTS.TASK_DETAILS.NO_PARENT : taskModel.getParentTaskName()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(taskModel.getDuration() === null ? '' : taskModel.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(taskModel.getEndDate() === null ? '' : dateFormat(taskModel.getEndDate(), TASK_DATA_FORMAT)); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(taskModel.getParentTaskId() === null ? '' : taskModel.getParentTaskId()); + expect(taskPage.taskDetails().getCategory()).toEqual(taskModel.getCategory()); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskPage.taskDetails().getDuration()).toEqual('' ); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(''); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); let taskForm = await browser.controlFlow().execute(async () => { @@ -152,8 +148,7 @@ describe('Task Details component', () => { formModel = new FormModel(taskForm); - expect(taskPage.taskDetails().getFormName()) - .toEqual(formModel.getName() === null ? CONSTANTS.TASK_DETAILS.NO_FORM : formModel.getName()); + expect(taskPage.taskDetails().getFormName()).toEqual(formModel.getName()); }); it('[C286706] Should display task details for task - Task App', async () => { @@ -161,7 +156,7 @@ describe('Task Details component', () => { await apps.startProcess(this.alfrescoJsApi, appModel); }); - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); @@ -172,24 +167,17 @@ describe('Task Details component', () => { let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskModel.getName()); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(taskModel.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); + expect(taskPage.taskDetails().getDescription()).toEqual(CONSTANTS.TASK_DETAILS.NO_DESCRIPTION); expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : taskModel.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : taskModel.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(appModel.definition.models[0].name); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(taskModel.getParentTaskId() === null ? '' : taskModel.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(taskModel.getDuration() === null ? '' : taskModel.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(taskModel.getEndDate() === null ? '' : dateFormat(taskModel.getEndDate(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getCategory()).toEqual(CONSTANTS.TASK_DETAILS.NO_CATEGORY); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(appModel.definition.models[0].name); + expect(taskPage.taskDetails().getDuration()).toEqual('' ); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(''); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); let taskForm = await browser.controlFlow().execute(async () => { @@ -207,7 +195,7 @@ describe('Task Details component', () => { await apps.startProcess(this.alfrescoJsApi, appModel); }); - navigationBarPage.navigateToProcessServicesPage().goToApp(appModel.name).clickTasksButton(); + processServices.goToApp(appModel.name).clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); @@ -218,24 +206,17 @@ describe('Task Details component', () => { let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskModel.getName()); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(taskModel.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); + expect(taskPage.taskDetails().getDescription()).toEqual(CONSTANTS.TASK_DETAILS.NO_DESCRIPTION); expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : taskModel.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : taskModel.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(appModel.definition.models[0].name); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(taskModel.getParentTaskId() === null ? '' : taskModel.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(taskModel.getDuration() === null ? '' : taskModel.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(taskModel.getEndDate() === null ? '' : dateFormat(taskModel.getEndDate(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getCategory()).toEqual(CONSTANTS.TASK_DETAILS.NO_CATEGORY); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(appModel.definition.models[0].name); + expect(taskPage.taskDetails().getDuration()).toEqual('' ); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(''); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); let taskForm = await browser.controlFlow().execute(async () => { @@ -255,39 +236,33 @@ describe('Task Details component', () => { await this.alfrescoJsApi.activiti.taskApi.createNewTask({'name': taskName}); }); - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskName).selectRowByContentName(taskName); + taskPage.tasksListPage().checkContentIsDisplayed(taskName); + taskPage.tasksListPage().selectRow(taskName); taskPage.clickOnAddChecklistButton().addName(checklistName).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(checklistName); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(checklistName).selectRowByContentName(checklistName); + taskPage.tasksListPage().checkContentIsDisplayed(checklistName); + taskPage.tasksListPage().selectRow(checklistName); let allTasks = await browser.controlFlow().execute(async () => { return this.alfrescoJsApi.activiti.taskApi.listTasks(new Task({ sort: 'created-desc' })); }); - let checklistTask = new TaskModel(allTasks.data[0]); let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(checklistTask.getName()); - expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(checklistTask.getCreated(), TASK_DATA_FORMAT)); - expect(taskPage.taskDetails().getId()).toEqual(checklistTask.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(checklistTask.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); - expect(taskPage.taskDetails().getAssignee()).toEqual(checklistTask.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(checklistTask.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : checklistTask.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(checklistTask.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : checklistTask.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(checklistTask.getParentTaskName() === null ? CONSTANTS.TASK_DETAILS.NO_PARENT : checklistTask.getParentTaskName()); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(checklistTask.getParentTaskId() === null ? '' : checklistTask.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(checklistTask.getDuration() === null ? '' : checklistTask.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(checklistTask.getEndDate() === null ? '' : dateFormat(checklistTask.getEndDate(), TASK_DATA_FORMAT)); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); + expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); + expect(taskPage.taskDetails().getDescription()).toEqual(CONSTANTS.TASK_DETAILS.NO_DESCRIPTION); + expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); + expect(taskPage.taskDetails().getCategory()).toEqual(CONSTANTS.TASK_DETAILS.NO_CATEGORY); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskPage.taskDetails().getDuration()).toEqual(''); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(taskModel.getParentTaskId()); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); }); @@ -298,7 +273,7 @@ describe('Task Details component', () => { await apps.startProcess(this.alfrescoJsApi, appModel); }); - navigationBarPage.navigateToProcessServicesPage().goToApp(appModel.name).clickTasksButton(); + processServices.goToApp(appModel.name).clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); expect(taskPage.taskDetails().getTitle()).toEqual('Activities'); @@ -306,32 +281,25 @@ describe('Task Details component', () => { taskPage.clickOnAddChecklistButton().addName(checklistName).clickCreateChecklistButton(); taskPage.checkChecklistIsDisplayed(checklistName); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(checklistName).selectRowByContentName(checklistName); + taskPage.tasksListPage().checkContentIsDisplayed(checklistName); + taskPage.tasksListPage().selectRow(checklistName); let allTasks = await browser.controlFlow().execute(async () => { return this.alfrescoJsApi.activiti.taskApi.listTasks(new Task({ sort: 'created-desc' })); }); - let checklistTask = new TaskModel(allTasks.data[0]); let taskModel = new TaskModel(allTasks.data[0]); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(checklistTask.getName()); - expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(checklistTask.getCreated(), TASK_DATA_FORMAT)); - expect(taskPage.taskDetails().getId()).toEqual(checklistTask.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(checklistTask.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : taskModel.getDescription()); - expect(taskPage.taskDetails().getAssignee()).toEqual(checklistTask.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(checklistTask.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : checklistTask.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(checklistTask.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : checklistTask.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(checklistTask.getParentTaskName() === null ? CONSTANTS.TASK_DETAILS.NO_PARENT : checklistTask.getParentTaskName()); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(checklistTask.getParentTaskId() === null ? '' : checklistTask.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(checklistTask.getDuration() === null ? '' : checklistTask.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(checklistTask.getEndDate() === null ? '' : dateFormat(checklistTask.getEndDate(), TASK_DATA_FORMAT)); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); + expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); + expect(taskPage.taskDetails().getDescription()).toEqual(CONSTANTS.TASK_DETAILS.NO_DESCRIPTION); + expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); + expect(taskPage.taskDetails().getCategory()).toEqual(taskModel.getCategory()); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskPage.taskDetails().getDuration()).toEqual(''); + expect(taskPage.taskDetails().getEndDate()).toEqual(''); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(taskModel.getParentTaskId()); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.RUNNING); }); @@ -341,37 +309,30 @@ describe('Task Details component', () => { return this.alfrescoJsApi.activiti.taskApi.createNewTask({'name': taskName}); }); - navigationBarPage.navigateToProcessServicesPage().goToTaskApp().clickTasksButton(); + processServices.goToTaskApp().clickTasksButton(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(taskName).selectRowByContentName(taskName); + taskPage.tasksListPage().checkContentIsDisplayed(taskName).selectRow('Name', taskName); taskPage.completeTaskNoForm(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - taskPage.tasksListPage().getDataTable().selectRowByContentName(taskName); + taskPage.tasksListPage().selectRow(taskName); let getTaskResponse = await browser.controlFlow().execute(async () => { return this.alfrescoJsApi.activiti.taskApi.getTask(taskId.id); }); - let completedTask = new TaskModel(getTaskResponse); - taskPage.tasksListPage().getDataTable().checkContentIsDisplayed(completedTask.getName()); - expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(completedTask.getCreated(), TASK_DATA_FORMAT)); - expect(taskPage.taskDetails().getId()).toEqual(completedTask.getId()); - expect(taskPage.taskDetails().getDescription()) - .toEqual(completedTask.getDescription() === null ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : completedTask.getDescription()); - expect(taskPage.taskDetails().getAssignee()).toEqual(completedTask.getAssignee().getEntireName()); - expect(taskPage.taskDetails().getCategory()) - .toEqual(completedTask.getCategory() === null ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : completedTask.getCategory()); - expect(taskPage.taskDetails().getDueDate()) - .toEqual(completedTask.getDueDate() === null ? CONSTANTS.TASK_DETAILS.NO_DATE : completedTask.getDueDate()); - expect(taskPage.taskDetails().getParentName()) - .toEqual(completedTask.getParentTaskName() === null ? CONSTANTS.TASK_DETAILS.NO_PARENT : completedTask.getParentTaskName()); - expect(taskPage.taskDetails().getParentTaskId()) - .toEqual(completedTask.getParentTaskId() === null ? '' : completedTask.getParentTaskId()); - expect(taskPage.taskDetails().getDuration()) - .toEqual(completedTask.getDuration() === null ? '' : completedTask.getDuration() + ' ms'); - expect(taskPage.taskDetails().getEndDate()) - .toEqual(completedTask.getEndDate() === null ? '' : dateFormat(completedTask.getEndDate(), TASK_DATA_FORMAT)); + let taskModel = new TaskModel(getTaskResponse); + taskPage.tasksListPage().checkContentIsDisplayed(taskModel.getName()); + expect(taskPage.taskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASK_DATA_FORMAT)); + expect(taskPage.taskDetails().getId()).toEqual(taskModel.getId()); + expect(taskPage.taskDetails().getDescription()).toEqual(CONSTANTS.TASK_DETAILS.NO_DESCRIPTION); + expect(taskPage.taskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); + expect(taskPage.taskDetails().getCategory()).toEqual(CONSTANTS.TASK_DETAILS.NO_CATEGORY); + expect(taskPage.taskDetails().getDueDate()).toEqual(CONSTANTS.TASK_DETAILS.NO_DATE); + expect(taskPage.taskDetails().getParentName()).toEqual(CONSTANTS.TASK_DETAILS.NO_PARENT); + expect(taskPage.taskDetails().getDuration()).toEqual(taskPage.taskDetails().getDuration()); + expect(taskPage.taskDetails().getEndDate()).toEqual(taskPage.taskDetails().getEndDate()); + expect(taskPage.taskDetails().getParentTaskId()).toEqual(''); expect(taskPage.taskDetails().getStatus()).toEqual(CONSTANTS.TASK_STATUS.COMPLETED); }); diff --git a/e2e/process-services/task-filters-component.e2e.ts b/e2e/process-services/task-filters-component.e2e.ts index 6740130fef..060873cd77 100644 --- a/e2e/process-services/task-filters-component.e2e.ts +++ b/e2e/process-services/task-filters-component.e2e.ts @@ -28,7 +28,7 @@ import { AppNavigationBarPage } from '../pages/adf/process-services/appNavigatio import { AppSettingsToggles } from '../pages/adf/process-services/dialog/appSettingsToggles'; import { TaskFiltersDemoPage } from '../pages/adf/demo-shell/process-services/taskFiltersDemoPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi, UserProcessInstanceFilterRepresentation } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; @@ -106,23 +106,23 @@ describe('Task', () => { it('[C260330] Should display Task Filter List when app is in Task Tab', () => { tasksPage.createNewTask().addName('Test').clickStartButton(); taskFiltersDemoPage.myTasksFilter().clickTaskFilter(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test'); + tasksListPage.checkContentIsDisplayed('Test'); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('My Tasks'); expect(taskDetailsPage.checkTaskDetailsDisplayed()).toBeDefined(); taskFiltersDemoPage.queuedTasksFilter().clickTaskFilter(); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('Queued Tasks'); - tasksListPage.getDataTable().checkContentIsNotDisplayed('Test'); + tasksListPage.checkContentIsNotDisplayed('Test'); expect(taskDetailsPage.checkTaskDetailsEmpty()).toBeDefined(); taskFiltersDemoPage.involvedTasksFilter().clickTaskFilter(); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('Involved Tasks'); - tasksListPage.getDataTable().checkContentIsDisplayed('Test'); + tasksListPage.checkContentIsDisplayed('Test'); expect(taskDetailsPage.checkTaskDetailsDisplayed()).toBeDefined(); taskFiltersDemoPage.completedTasksFilter().clickTaskFilter(); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('Completed Tasks'); - tasksListPage.getDataTable().checkContentIsNotDisplayed('Test'); + tasksListPage.checkContentIsNotDisplayed('Test'); expect(taskDetailsPage.checkTaskDetailsEmpty()).toBeDefined(); }); @@ -139,7 +139,7 @@ describe('Task', () => { tasksPage.createNewTask().addName('Test').clickStartButton(); taskFiltersDemoPage.myTasksFilter().clickTaskFilter(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test'); + tasksListPage.checkContentIsDisplayed('Test'); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('My Tasks'); expect(taskDetailsPage.checkTaskDetailsDisplayed()).toBeDefined(); @@ -150,7 +150,7 @@ describe('Task', () => { taskFiltersDemoPage.involvedTasksFilter().clickTaskFilter(); expect(taskFiltersDemoPage.checkActiveFilterActive()).toBe('Involved Tasks'); - tasksListPage.getDataTable().checkContentIsDisplayed('Test'); + tasksListPage.checkContentIsDisplayed('Test'); expect(taskDetailsPage.checkTaskDetailsDisplayed()).toBeDefined(); taskFiltersDemoPage.completedTasksFilter().clickTaskFilter(); @@ -167,9 +167,9 @@ describe('Task', () => { tasksPage.createNewTask().addName('Test3').clickStartButton(); tasksPage.createNewTask().addName('Test4').clickStartButton(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test4'); - tasksListPage.getDataTable().checkRowIsSelected('Test4'); - tasksListPage.getDataTable().checkContentIsDisplayed('Test3'); + tasksListPage.checkContentIsDisplayed('Test4'); + tasksListPage.checkRowIsSelected('Test4'); + tasksListPage.checkContentIsDisplayed('Test3'); taskDetailsPage.checkTaskDetailsDisplayed(); tasksPage.clickSortByNameAsc(); @@ -178,23 +178,23 @@ describe('Task', () => { expect(tasksListPage.getDataTable().contentInPosition(1)).toBe('Test4'); taskFiltersDemoPage.completedTasksFilter().clickTaskFilter(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test1'); - tasksListPage.getDataTable().checkContentIsDisplayed('Test2'); + tasksListPage.checkContentIsDisplayed('Test1'); + tasksListPage.checkContentIsDisplayed('Test2'); expect(tasksListPage.getDataTable().contentInPosition(1)).toBe('Test2'); tasksPage.clickSortByNameAsc(); expect(tasksListPage.getDataTable().contentInPosition(1)).toBe('Test1'); taskFiltersDemoPage.involvedTasksFilter().clickTaskFilter(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test3'); - tasksListPage.getDataTable().checkContentIsDisplayed('Test4'); + tasksListPage.checkContentIsDisplayed('Test3'); + tasksListPage.checkContentIsDisplayed('Test4'); }); it('[C277264] Should display task filter results when task filter is selected', () => { tasksPage.createNewTask().addName('Test').clickStartButton(); taskFiltersDemoPage.myTasksFilter().clickTaskFilter(); - tasksListPage.getDataTable().checkContentIsDisplayed('Test'); + tasksListPage.checkContentIsDisplayed('Test'); expect(taskDetailsPage.getTaskDetailsTitle()).toBe('Test'); }); }); @@ -253,7 +253,7 @@ describe('Task', () => { it('[C260350] Should display a new filter when a filter is added', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'New Task Filter'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -277,7 +277,7 @@ describe('Task', () => { it('[C286447] Should display the task filter icon when a custom filter is added', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'New Task Filter with icon'; newFilter.appId = appId; newFilter.icon = 'glyphicon-cloud'; @@ -317,7 +317,7 @@ describe('Task', () => { it('[C260353] Should display changes on a filter when this filter is edited', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'New Task Filter'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -334,7 +334,7 @@ describe('Task', () => { taskFiltersDemoPage.customTaskFilter('New Task Filter').checkTaskFilterIsDisplayed(); browser.controlFlow().execute(() => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Task Filter Edited'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -356,7 +356,7 @@ describe('Task', () => { it('[C286448] Should display changes on a task filter when this filter icon is edited', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Task Filter Edited icon'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -373,7 +373,7 @@ describe('Task', () => { taskFiltersDemoPage.customTaskFilter('Task Filter Edited icon').checkTaskFilterIsDisplayed(); browser.controlFlow().execute(() => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Task Filter Edited icon'; newFilter.appId = appId; newFilter.icon = 'glyphicon-cloud'; @@ -397,11 +397,11 @@ describe('Task', () => { it('[C260354] Should not display task filter when this filter is deleted', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'New Task Filter'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; - newFilter.filter = { sort: 'created-desc', state: 'completed', assignment: 'involved' }; + newFilter.filter = { sort: 'created-desc', state: 'completed', assignment: 'involved' }; let result = await this.alfrescoJsApi.activiti.userFiltersApi.createUserTaskFilter(newFilter); diff --git a/e2e/process-services/task-filters-sorting.e2e.ts b/e2e/process-services/task-filters-sorting.e2e.ts index fe8cab099c..5c8003d607 100644 --- a/e2e/process-services/task-filters-sorting.e2e.ts +++ b/e2e/process-services/task-filters-sorting.e2e.ts @@ -25,7 +25,7 @@ import { TasksListPage } from '../pages/adf/process-services/tasksListPage'; import { TaskDetailsPage } from '../pages/adf/process-services/taskDetailsPage'; import { TaskFiltersDemoPage } from '../pages/adf/demo-shell/process-services/taskFiltersDemoPage'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi, UserProcessInstanceFilterRepresentation } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; import { browser } from 'protractor'; @@ -100,13 +100,9 @@ describe('Task Filters Sorting', () => { }); - // afterAll(async(done) => { - // await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(tenantId); - // done(); - // }); it('[C277254] Should display tasks under new filter from newest to oldest when they are completed', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Newest first'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -129,7 +125,7 @@ describe('Task Filters Sorting', () => { it('[C277255] Should display tasks under new filter from oldest to newest when they are completed', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Newest last'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -151,7 +147,7 @@ describe('Task Filters Sorting', () => { it('[C277256] Should display tasks under new filter from closest due date to farthest when they are completed', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Due first'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -173,7 +169,7 @@ describe('Task Filters Sorting', () => { it('[C277257] Should display tasks under new filter from farthest due date to closest when they are completed', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Due last'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -195,7 +191,7 @@ describe('Task Filters Sorting', () => { it('[C277258] Should display tasks under new filter from newest to oldest when they are open ', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Newest first Open'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -217,7 +213,7 @@ describe('Task Filters Sorting', () => { it('[C277259] Should display tasks under new filter from oldest to newest when they are open', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Newest last Open'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -239,7 +235,7 @@ describe('Task Filters Sorting', () => { it('[C277260] Should display tasks under new filter from closest due date to farthest when they are open', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Due first Open'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; @@ -261,7 +257,7 @@ describe('Task Filters Sorting', () => { it('[C277261] Should display tasks under new filter from farthest due date to closest when they are open', () => { browser.controlFlow().execute(async () => { - let newFilter = new this.alfrescoJsApi.activiti.UserProcessInstanceFilterRepresentation(); + let newFilter: any = new UserProcessInstanceFilterRepresentation(); newFilter.name = 'Due last Open'; newFilter.appId = appId; newFilter.icon = 'glyphicon-filter'; diff --git a/e2e/process-services/task-list-pagination.e2e.ts b/e2e/process-services/task-list-pagination.e2e.ts index 5527bfbefe..4d79b24446 100644 --- a/e2e/process-services/task-list-pagination.e2e.ts +++ b/e2e/process-services/task-list-pagination.e2e.ts @@ -25,7 +25,7 @@ import CONSTANTS = require('../util/constants'); import TestConfig = require('../test.config'); import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; @@ -83,7 +83,7 @@ describe('Task List Pagination', () => { navigationBarPage.navigateToProcessServicesPage().goToTaskApp(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.default); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(nrOfTasks); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(nrOfTasks); paginationPage.checkNextPageButtonIsDisabled(); paginationPage.checkPreviousPageButtonIsDisabled(); paginationPage.selectItemsPerPage(itemsPerPage.twenty); @@ -97,22 +97,22 @@ describe('Task List Pagination', () => { paginationPage.selectItemsPerPage(itemsPerPage.five); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fiveValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); paginationPage.clickOnNextPage(); currentPage++; expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fiveValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); paginationPage.clickOnNextPage(); currentPage++; expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fiveValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); paginationPage.clickOnNextPage(); currentPage++; expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fiveValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); navigationBarPage.navigateToProcessServicesPage().goToTaskApp(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); @@ -125,11 +125,11 @@ describe('Task List Pagination', () => { paginationPage.selectItemsPerPage(itemsPerPage.ten); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.tenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); paginationPage.clickOnNextPage(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.twentyValue + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.tenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); navigationBarPage.navigateToProcessServicesPage().goToTaskApp(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); @@ -142,11 +142,11 @@ describe('Task List Pagination', () => { paginationPage.selectItemsPerPage(itemsPerPage.fifteen); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fifteenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fifteenValue); paginationPage.clickOnNextPage(); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.twentyValue + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.fiveValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); navigationBarPage.navigateToProcessServicesPage().goToTaskApp(); taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); @@ -165,7 +165,7 @@ describe('Task List Pagination', () => { expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.tenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); paginationPage.checkNextPageButtonIsEnabled(); paginationPage.checkPreviousPageButtonIsDisabled(); @@ -178,7 +178,7 @@ describe('Task List Pagination', () => { expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.tenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); paginationPage.checkNextPageButtonIsDisabled(); paginationPage.checkPreviousPageButtonIsEnabled(); @@ -191,7 +191,7 @@ describe('Task List Pagination', () => { expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); - expect(taskPage.tasksListPage().getDataTable().getNumberOfRows()).toBe(itemsPerPage.tenValue); + expect(taskPage.tasksListPage().getDataTable().numberOfRows()).toBe(itemsPerPage.tenValue); paginationPage.checkNextPageButtonIsEnabled(); paginationPage.checkPreviousPageButtonIsDisabled(); }); diff --git a/e2e/process-services/widgets/amount-widget.e2e.ts b/e2e/process-services/widgets/amount-widget.e2e.ts index 3a816596a4..877b6707a3 100644 --- a/e2e/process-services/widgets/amount-widget.e2e.ts +++ b/e2e/process-services/widgets/amount-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/attach-folder-widget.e2e.ts b/e2e/process-services/widgets/attach-folder-widget.e2e.ts index a0ea625a35..96bee87462 100644 --- a/e2e/process-services/widgets/attach-folder-widget.e2e.ts +++ b/e2e/process-services/widgets/attach-folder-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/checkbox-widget.e2e.ts b/e2e/process-services/widgets/checkbox-widget.e2e.ts index 3a64299dc8..210e578222 100644 --- a/e2e/process-services/widgets/checkbox-widget.e2e.ts +++ b/e2e/process-services/widgets/checkbox-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/date-time-widget.e2e.ts b/e2e/process-services/widgets/date-time-widget.e2e.ts index 8d9a0b30c5..5a98f527df 100644 --- a/e2e/process-services/widgets/date-time-widget.e2e.ts +++ b/e2e/process-services/widgets/date-time-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/date-widget.e2e.ts b/e2e/process-services/widgets/date-widget.e2e.ts index 8d65c13aa1..53f063f669 100644 --- a/e2e/process-services/widgets/date-widget.e2e.ts +++ b/e2e/process-services/widgets/date-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/document-template-widget.e2e.ts b/e2e/process-services/widgets/document-template-widget.e2e.ts index e6f91f8b75..4394594e57 100644 --- a/e2e/process-services/widgets/document-template-widget.e2e.ts +++ b/e2e/process-services/widgets/document-template-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/dropdown-widget.e2e.ts b/e2e/process-services/widgets/dropdown-widget.e2e.ts index 2933cc3e79..e7508c37f1 100644 --- a/e2e/process-services/widgets/dropdown-widget.e2e.ts +++ b/e2e/process-services/widgets/dropdown-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts index d7d9f0f2f8..f3b04f0809 100644 --- a/e2e/process-services/widgets/dynamic-table-widget.e2e.ts +++ b/e2e/process-services/widgets/dynamic-table-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/header-widget.e2e.ts b/e2e/process-services/widgets/header-widget.e2e.ts index 806b36b3e9..ce98f1bbbe 100644 --- a/e2e/process-services/widgets/header-widget.e2e.ts +++ b/e2e/process-services/widgets/header-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/hyperlink-widget.e2e.ts b/e2e/process-services/widgets/hyperlink-widget.e2e.ts index e86ad7d27e..cb0d6ccdbf 100644 --- a/e2e/process-services/widgets/hyperlink-widget.e2e.ts +++ b/e2e/process-services/widgets/hyperlink-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/multi-line-widget.e2e.ts b/e2e/process-services/widgets/multi-line-widget.e2e.ts index 03117a5717..e407db01a2 100644 --- a/e2e/process-services/widgets/multi-line-widget.e2e.ts +++ b/e2e/process-services/widgets/multi-line-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/number-widget.e2e.ts b/e2e/process-services/widgets/number-widget.e2e.ts index 22a29e555a..ebb05d3647 100644 --- a/e2e/process-services/widgets/number-widget.e2e.ts +++ b/e2e/process-services/widgets/number-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/people-widget.e2e.ts b/e2e/process-services/widgets/people-widget.e2e.ts index 9b58219b6c..0f9c4822e4 100644 --- a/e2e/process-services/widgets/people-widget.e2e.ts +++ b/e2e/process-services/widgets/people-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts index 79f07abb52..72dfceadfd 100644 --- a/e2e/process-services/widgets/radio-buttons-widget.e2e.ts +++ b/e2e/process-services/widgets/radio-buttons-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/process-services/widgets/text-widget.e2e.ts b/e2e/process-services/widgets/text-widget.e2e.ts index 2fa82b5555..e0bc6abdc3 100644 --- a/e2e/process-services/widgets/text-widget.e2e.ts +++ b/e2e/process-services/widgets/text-widget.e2e.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { AppsActions } from '../../actions/APS/apps.actions'; import { UsersActions } from '../../actions/users.actions'; import { browser } from 'protractor'; diff --git a/e2e/resources/adf/a_js_file.js b/e2e/resources/adf/a_js_file.js new file mode 100644 index 0000000000..09d1b2f0bc --- /dev/null +++ b/e2e/resources/adf/a_js_file.js @@ -0,0 +1 @@ +tiw tiw \ No newline at end of file diff --git a/e2e/resources/aps2/candidateuserapp .zip b/e2e/resources/aps2/candidateuserapp .zip new file mode 100644 index 0000000000..395cc1ab66 Binary files /dev/null and b/e2e/resources/aps2/candidateuserapp .zip differ diff --git a/e2e/resources/aps2/simple_app.zip b/e2e/resources/aps2/simple_app.zip new file mode 100644 index 0000000000..5648e87c20 Binary files /dev/null and b/e2e/resources/aps2/simple_app.zip differ diff --git a/e2e/search/components/search-checkList.e2e.ts b/e2e/search/components/search-checkList.e2e.ts index 73d1aa7259..d970c7d760 100644 --- a/e2e/search/components/search-checkList.e2e.ts +++ b/e2e/search/components/search-checkList.e2e.ts @@ -16,8 +16,8 @@ */ import { LoginPage } from '../../pages/adf/loginPage'; +import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; @@ -28,19 +28,19 @@ import TestConfig = require('../../test.config'); import { SearchConfiguration } from '../search.config'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; import { Util } from '../../util/util'; -describe('Search Radio Component', () => { +describe('Search Checklist Component', () => { const loginPage = new LoginPage(); const searchFiltersPage = new SearchFiltersPage(); - const contentList = new ContentListPage(); const configEditorPage = new ConfigEditorPage(); const navigationBarPage = new NavigationBarPage(); const searchDialog = new SearchDialog(); + const searchResults = new SearchResultsPage(); let acsUser = new AcsUserModel(); let uploadActions = new UploadActions(); @@ -54,7 +54,7 @@ describe('Search Radio Component', () => { let randomName = Util.generateRandomString(); let nodeNames = { document: `${randomName}.txt`, - folder: randomName + folder: `${randomName}Folder` }; let createdFile, createdFolder; @@ -79,7 +79,7 @@ describe('Search Radio Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - browser.get(TestConfig.adf.url + '/search;q=' + nodeNames.folder + ''); + browser.get(TestConfig.adf.url + '/search;q=' + randomName + ''); done(); }); @@ -106,29 +106,29 @@ describe('Search Radio Component', () => { searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsNotDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsNotDisplayed(nodeNames.document); searchFiltersPage.checkListFiltersPage().clickClearAllButton(); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.document); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.document); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.document); - contentList.checkContentIsNotDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsNotDisplayed(nodeNames.folder); }); describe('configuration change', () => { @@ -151,7 +151,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5); @@ -190,7 +190,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10); @@ -208,7 +208,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10); @@ -226,7 +226,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(9); @@ -250,7 +250,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5); @@ -276,7 +276,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5); @@ -319,19 +319,19 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsNotDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsNotDisplayed(nodeNames.document); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document); - contentList.checkContentIsNotDisplayed(nodeNames.folder); - contentList.checkContentIsNotDisplayed(nodeNames.document); + searchResults.checkContentIsNotDisplayed(nodeNames.folder); + searchResults.checkContentIsNotDisplayed(nodeNames.document); browser.refresh(); }); @@ -346,7 +346,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickCheckListFilter(); searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.folder); @@ -355,14 +355,14 @@ describe('Search Radio Component', () => { searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.custom); - contentList.checkContentIsNotDisplayed(nodeNames.folder); - contentList.checkContentIsNotDisplayed(nodeNames.document); + searchResults.checkContentIsNotDisplayed(nodeNames.folder); + searchResults.checkContentIsNotDisplayed(nodeNames.document); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document); searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); }); }); diff --git a/e2e/search/components/search-date-range.e2e.ts b/e2e/search/components/search-date-range.e2e.ts index cafdba6145..fd26c93720 100644 --- a/e2e/search/components/search-date-range.e2e.ts +++ b/e2e/search/components/search-date-range.e2e.ts @@ -17,7 +17,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { DatePickerPage } from '../../pages/adf/material/datePickerPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; @@ -27,7 +27,7 @@ import { SearchConfiguration } from '../search.config'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { browser } from 'protractor'; import { DateUtil } from '../../util/dateUtil'; @@ -41,7 +41,7 @@ describe('Search Date Range Filter', () => { let datePicker = new DatePickerPage(); let navigationBar = new NavigationBarPage(); let configEditor = new ConfigEditorPage(); - let dataTable = new DataTablePage(); + let dataTable = new DataTableComponentPage(); beforeAll(async (done) => { @@ -120,7 +120,7 @@ describe('Search Date Range Filter', () => { .selectTodayDate() .checkDatePickerIsNotDisplayed(); dateRangeFilter.getFromDate().then((date) => { - fromDate = DateUtil.formatDate('DD-MM-YY', date); + fromDate = DateUtil.formatDate('DD-MM-YY', DateUtil.parse(date, 'DD-MMM-YY')); }); dateRangeFilter.checkApplyButtonIsDisabled(); @@ -129,34 +129,26 @@ describe('Search Date Range Filter', () => { .selectTodayDate() .checkDatePickerIsNotDisplayed(); dateRangeFilter.getToDate().then((date) => { - toDate = DateUtil.formatDate('DD-MM-YY', date); + toDate = DateUtil.formatDate('DD-MM-YY', DateUtil.parse(date, 'DD-MMM-YY'), 1); }); dateRangeFilter.checkApplyButtonIsEnabled() .clickApplyButton(); searchResults.sortByCreated(true); - browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - let nodeCreation = new Date(node.entry.createdAt); - nodeCreation.setHours(0, 0, 0, 0); - await expect(nodeCreation.getTime() >= DateUtil.parse(fromDate).getTime()).toBe(true); - await expect(nodeCreation.getTime() <= DateUtil.parse(toDate).getTime()).toBe(true); - }); - }); - searchResults.sortByCreated(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - let nodeCreation = new Date(node.entry.createdAt); - nodeCreation.setHours(0, 0, 0, 0); - await expect(nodeCreation.getTime() >= DateUtil.parse(fromDate).getTime()).toBe(true); - await expect(nodeCreation.getTime() <= DateUtil.parse(toDate).getTime()).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Created'); + for (let currentResult of results) { + + currentResult.getAttribute('title').then(async (currentDate) => { + let currentDateFormatted = DateUtil.parse(currentDate, 'MMM DD, YYYY, h:mm:ss a'); + + await expect(currentDateFormatted <= DateUtil.parse(toDate, 'DD-MM-YY')).toBe(true); + await expect(currentDateFormatted >= DateUtil.parse(fromDate, 'DD-MM-YY')).toBe(true); + }); + + } }); }); diff --git a/e2e/search/components/search-number-range.e2e.ts b/e2e/search/components/search-number-range.e2e.ts index 4f67ae33d5..88f80a4705 100644 --- a/e2e/search/components/search-number-range.e2e.ts +++ b/e2e/search/components/search-number-range.e2e.ts @@ -17,7 +17,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; @@ -25,13 +25,14 @@ import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { FileModel } from '../../models/ACS/fileModel'; import { browser } from 'protractor'; import resources = require('../../util/resources'); import { SearchConfiguration } from '../search.config'; +import { DateUtil } from '../../util/dateUtil'; describe('Search Number Range Filter', () => { @@ -42,7 +43,7 @@ describe('Search Number Range Filter', () => { const searchResults = new SearchResultsPage(); const navigationBar = new NavigationBarPage(); const configEditor = new ConfigEditorPage(); - const dataTable = new DataTablePage(); + const dataTable = new DataTableComponentPage(); const acsUser = new AcsUserModel(); @@ -171,10 +172,16 @@ describe('Search Number Range Filter', () => { searchResults.sortBySize(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) <= toSize).toBe(true); + } + } catch (e) { + } + } }); }); @@ -196,10 +203,16 @@ describe('Search Number Range Filter', () => { searchResults.sortBySize(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) <= toSize).toBe(true); + } + } catch (e) { + } + } }); searchFilters.checkNameFilterIsDisplayed() @@ -208,63 +221,30 @@ describe('Search Number Range Filter', () => { searchResults.sortBySize(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); - let name = node.entry.name; - await expect(/z*/i.test(name)).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) <= toSize).toBe(true); + } + } catch (e) { + } + } }); - }); - - it('[C276950] Should be able to filter by size (slider) when size range filter is applied', () => { - let sizeSliderFilter = searchFilters.sizeSliderFilterPage(); - let toSize = 20; - let sliderSize = 18; - - searchFilters.checkSizeSliderFilterIsDisplayed() - .clickSizeSliderFilterHeader() - .checkSizeSliderFilterIsExpanded(); - sizeSliderFilter.checkSliderIsDisplayed().setValue(sliderSize); - - sizeRangeFilter.checkFromFieldIsDisplayed() - .putFromNumber(0) - .putToNumber(toSize); - expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); - - sizeRangeFilter.clickApplyButton(); - searchResults.sortBySize(false); - searchResults.tableIsLoaded(); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Display name'); + for (let currentResult of results) { + try { + let name = await currentResult.getAttribute('title'); + if (name && name.trim() !== '') { + await expect(/z*/i.test(name)).toBe(true); + } + } catch (e) { + } + } }); - - sizeRangeFilter.checkFromFieldIsDisplayed() - .putFromNumber(1); - expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); - - sizeRangeFilter.clickApplyButton(); - searchResults.sortBySize(true); - searchResults.tableIsLoaded(); - - browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes >= 1).toBe(true); - await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true); - }); - }); - - sizeRangeFilter.checkFromFieldIsDisplayed() - .putFromNumber(19); - expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); - - sizeRangeFilter.clickApplyButton(); - searchResults.checkNoResultMessageIsDisplayed(); }); it('[C276951] Should not display folders when Size range is applied', () => { @@ -297,11 +277,18 @@ describe('Search Number Range Filter', () => { searchResults.sortBySize(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes).toEqual(0); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(currentSize === '0').toBe(true); + } + } catch (e) { + } + } }); + }); it('[C277092] Should disable apply button when from field value equal/is bigger than to field value', () => { @@ -328,10 +315,17 @@ describe('Search Number Range Filter', () => { searchResults.sortBySize(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= 1).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) <= 1000).toBe(true); + } + } catch (e) { + } + } }); sizeRangeFilter.clickClearButton(); @@ -340,10 +334,17 @@ describe('Search Number Range Filter', () => { expect(sizeRangeFilter.getToNumber()).toEqual(''); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes >= 1).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) >= 1000).toBe(true); + } + } catch (e) { + } + } }); }); @@ -426,20 +427,18 @@ describe('Search Number Range Filter', () => { searchResults.sortByCreated(false); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect((node.entry.createdAt.getFullYear()) <= toYear).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Created'); + for (let currentResult of results) { + currentResult.getAttribute('title').then(async (currentDate) => { + let currentDateFormatted = DateUtil.parse(currentDate, 'MMM DD, YYYY, h:mm:ss a'); + + await expect(currentDateFormatted.getFullYear() <= toYear).toBe(true); + await expect(currentDateFormatted.getFullYear() >= fromYear).toBe(true); + }); + + } }); - searchResults.sortByCreated(true); - - browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect((node.entry.createdAt.getFullYear()) >= fromYear).toBe(true); - }); - }); }); it('[C277139] Should be able to set To field to be exclusive', () => { diff --git a/e2e/search/components/search-radio.e2e.ts b/e2e/search/components/search-radio.e2e.ts index 6c2598129d..52f69681c5 100644 --- a/e2e/search/components/search-radio.e2e.ts +++ b/e2e/search/components/search-radio.e2e.ts @@ -17,7 +17,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; -import { ContentListPage } from '../../pages/adf/dialog/contentListPage'; +import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; @@ -28,7 +28,7 @@ import TestConfig = require('../../test.config'); import { SearchConfiguration } from '../search.config'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { browser } from 'protractor'; import { Util } from '../../util/util'; @@ -37,10 +37,10 @@ describe('Search Radio Component', () => { const loginPage = new LoginPage(); const searchFiltersPage = new SearchFiltersPage(); - const contentList = new ContentListPage(); const configEditorPage = new ConfigEditorPage(); const navigationBarPage = new NavigationBarPage(); const searchDialog = new SearchDialog(); + const searchResults = new SearchResultsPage(); let acsUser = new AcsUserModel(); let uploadActions = new UploadActions(); @@ -56,7 +56,7 @@ describe('Search Radio Component', () => { let randomName = Util.generateRandomString(); let nodeNames = { document: `${randomName}.txt`, - folder: randomName + folder: `${randomName}Folder` }; let createdFile, createdFolder; @@ -84,7 +84,7 @@ describe('Search Radio Component', () => { loginPage.loginToContentServicesUsingUserModel(acsUser); - browser.get(TestConfig.adf.url + '/search;q=' + nodeNames.folder + ''); + browser.get(TestConfig.adf.url + '/search;q=' + randomName); done(); }); @@ -110,26 +110,26 @@ describe('Search Radio Component', () => { searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.none); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.folder); searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.folder); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsNotDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsNotDisplayed(nodeNames.document); searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.document); searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.document); - contentList.checkContentIsDisplayed(nodeNames.document); - contentList.checkContentIsNotDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsNotDisplayed(nodeNames.folder); searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.all); searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.all); - contentList.checkContentIsDisplayed(nodeNames.folder); - contentList.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); }); describe('configuration change', () => { @@ -158,7 +158,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10); @@ -174,7 +174,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10); @@ -190,7 +190,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(9); @@ -218,7 +218,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5); @@ -251,7 +251,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5); @@ -304,7 +304,7 @@ describe('Search Radio Component', () => { configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditorPage.clickSaveButton(); - searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(randomName); searchFiltersPage.clickTypeFilterHeader(); searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.none); @@ -316,8 +316,8 @@ describe('Search Radio Component', () => { searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.custom); - contentList.checkContentIsDisplayed(nodeNames.document); - contentList.checkContentIsNotDisplayed(nodeNames.folder); + searchResults.checkContentIsDisplayed(nodeNames.document); + searchResults.checkContentIsNotDisplayed(nodeNames.folder); }); }); diff --git a/e2e/search/components/search-slider.e2e.ts b/e2e/search/components/search-slider.e2e.ts index 5d3b19352b..1f31aa657c 100644 --- a/e2e/search/components/search-slider.e2e.ts +++ b/e2e/search/components/search-slider.e2e.ts @@ -17,7 +17,7 @@ import { LoginPage } from '../../pages/adf/loginPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; -import { DataTablePage } from '../../pages/adf/dataTablePage'; +import { DataTableComponentPage } from '../../pages/adf/dataTableComponentPage'; import { SearchResultsPage } from '../../pages/adf/searchResultsPage'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { ConfigEditorPage } from '../../pages/adf/configEditorPage'; @@ -25,7 +25,7 @@ import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { FileModel } from '../../models/ACS/fileModel'; @@ -42,7 +42,7 @@ describe('Search Number Range Filter', () => { const searchResults = new SearchResultsPage(); const navigationBar = new NavigationBarPage(); const configEditor = new ConfigEditorPage(); - const dataTable = new DataTablePage(); + const dataTable = new DataTableComponentPage(); const acsUser = new AcsUserModel(); @@ -123,10 +123,16 @@ describe('Search Number Range Filter', () => { .tableIsLoaded(); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes <= size).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) <= 5000).toBe(true); + } + } catch (e) { + } + } }); sizeSliderFilter.checkSliderIsDisplayed() @@ -136,10 +142,17 @@ describe('Search Number Range Filter', () => { .tableIsLoaded(); browser.controlFlow().execute(async () => { - let firstResult = await dataTable.getNodeIdFirstElement(); - await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { - await expect(node.entry.content.sizeInBytes >= size).toBe(true); - }); + let results = await dataTable.geCellElementDetail('Size'); + for (let currentResult of results) { + try { + + let currentSize = await currentResult.getAttribute('title'); + if (currentSize && currentSize.trim() !== '') { + await expect(parseInt(currentSize, 10) >= 5000).toBe(true); + } + } catch (e) { + } + } }); }); diff --git a/e2e/search/components/search-sorting-picker.e2e.ts b/e2e/search/components/search-sorting-picker.e2e.ts index 49cfb9a87b..54916e8d5b 100644 --- a/e2e/search/components/search-sorting-picker.e2e.ts +++ b/e2e/search/components/search-sorting-picker.e2e.ts @@ -26,7 +26,7 @@ import { NodeActions } from '../../actions/ACS/node.actions'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../../actions/ACS/upload.actions'; import { AcsUserModel } from '../../models/ACS/acsUserModel'; import { browser } from 'protractor'; @@ -159,6 +159,7 @@ describe('Search Sorting Picker', () => { configEditor.clickSearchConfiguration(); configEditor.clickClearButton(); jsonFile.sorting.options[0].ascending = false; + jsonFile.sorting.defaults[0] = { 'key': 'Size', 'label': 'Size', 'type': 'FIELD', 'field': 'content.size', 'ascending': true }; configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); configEditor.clickSaveButton(); @@ -176,89 +177,41 @@ describe('Search Sorting Picker', () => { it('[C277280] Should be able to sort the search results by "Name" ASC', () => { searchFilters.checkSearchFiltersIsDisplayed(); searchFilters.creatorCheckListFiltersPage().filterBy(`${acsUser.firstName} ${acsUser.lastName}`); - expect(searchResults.sortAndCheckListIsOrderedByName(true)).toBe(true); + searchResults.sortByName(true); + expect(searchResults.checkListIsOrderedByNameAsc()).toBe(true); }); it('[C277281] Should be able to sort the search results by "Name" DESC', () => { searchFilters.checkSearchFiltersIsDisplayed(); searchFilters.creatorCheckListFiltersPage().filterBy(`${acsUser.firstName} ${acsUser.lastName}`); - expect(searchResults.sortAndCheckListIsOrderedByName(false)).toBe(true); + searchResults.sortByName(false); + expect(searchResults.checkListIsOrderedByNameDesc()).toBe(true); }); it('[C277282] Should be able to sort the search results by "Author" ASC', () => { - expect(searchResults.sortAndCheckListIsOrderedByAuthor(this.alfrescoJsApi, true)).toBe(true); + searchResults.sortByAuthor(true); + expect(searchResults.checkListIsOrderedByAuthorAsc()).toBe(true); }); it('[C277283] Should be able to sort the search results by "Author" DESC', () => { - expect(searchResults.sortAndCheckListIsOrderedByAuthor(this.alfrescoJsApi, false)).toBe(true); - }); - - it('[C277284] Should be able to sort the search results by "Modifier" ASC', () => { - let searchConfiguration = new SearchConfiguration(); - jsonFile = searchConfiguration.getConfiguration(); - navigationBar.clickConfigEditorButton(); - configEditor.clickSearchConfiguration(); - configEditor.clickClearButton(); - jsonFile.sorting.options.push({ 'key': 'Modifier', 'label': 'Modifier', 'type': 'FIELD', 'field': 'cm:modifier', 'ascending': true }); - configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditor.clickSaveButton(); - - searchDialog.checkSearchIconIsVisible() - .clickOnSearchIcon() - .enterTextAndPressEnter(search); - - searchSortingPicker.checkSortingSelectorIsDisplayed() - .sortBy(true, 'Modifier'); - - browser.controlFlow().execute(async () => { - let idList = await contentServices.getElementsDisplayedId(); - let numberOfElements = await contentServices.numberOfResultsDisplayed(); - - let nodeList = await nodeActions.getNodesDisplayed(this.alfrescoJsApi, idList, numberOfElements); - let modifierList = []; - for (let i = 0; i < nodeList.length; i++) { - modifierList.push(nodeList[i].entry.modifiedByUser.id); - } - expect(contentServices.checkElementsSortedAsc(modifierList)).toBe(true); - }); - }); - - it('[C277285] Should be able to sort the search results by "Modifier" DESC', () => { - let searchConfiguration = new SearchConfiguration(); - jsonFile = searchConfiguration.getConfiguration(); - navigationBar.clickConfigEditorButton(); - configEditor.clickSearchConfiguration(); - configEditor.clickClearButton(); - jsonFile.sorting.options.push({ 'key': 'Modifier', 'label': 'Modifier', 'type': 'FIELD', 'field': 'cm:modifier', 'ascending': true }); - configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditor.clickSaveButton(); - - searchDialog.checkSearchIconIsVisible() - .clickOnSearchIcon() - .enterTextAndPressEnter(search); - - searchSortingPicker.checkSortingSelectorIsDisplayed() - .sortBy(false, 'Modifier'); - - browser.controlFlow().execute(async () => { - let idList = await contentServices.getElementsDisplayedId(); - let numberOfElements = await contentServices.numberOfResultsDisplayed(); - - let nodeList = await nodeActions.getNodesDisplayed(this.alfrescoJsApi, idList, numberOfElements); - let modifierList = []; - for (let i = 0; i < nodeList.length; i++) { - modifierList.push(nodeList[i].entry.modifiedByUser.id); - } - expect(contentServices.checkElementsSortedDesc(modifierList)).toBe(true); - }); + searchResults.sortByAuthor(false); + expect(searchResults.checkListIsOrderedByAuthorDesc()).toBe(true); }); it('[C277286] Should be able to sort the search results by "Created Date" ASC', () => { - expect(searchResults.sortAndCheckListIsOrderedByCreated(true)).toBe(true); + searchResults.sortByCreated(true); + browser.controlFlow().execute(async () => { + let results = await searchResults. dataTable.geCellElementDetail('Created'); + expect(contentServices.checkElementsDateSortedAsc(results)).toBe(true); + }); }); it('[C277287] Should be able to sort the search results by "Created Date" DESC', () => { - expect(searchResults.sortAndCheckListIsOrderedByCreated(false)).toBe(true); + searchResults.sortByCreated(false); + browser.controlFlow().execute(async () => { + let results = await searchResults. dataTable.geCellElementDetail('Created'); + expect(contentServices.checkElementsDateSortedDesc(results)).toBe(true); + }); }); it('[C277288] Should be able to sort the search results by "Modified Date" ASC', () => { @@ -287,37 +240,7 @@ describe('Search Sorting Picker', () => { for (let i = 0; i < nodeList.length; i++) { modifiedDateList.push(new Date(nodeList[i].entry.modifiedAt)); } - expect(contentServices.checkElementsSortedAsc(modifiedDateList)).toBe(true); - }); - }); - - it('[C277289] Should be able to sort the search results by "Modified Date" DESC', () => { - let searchConfiguration = new SearchConfiguration(); - jsonFile = searchConfiguration.getConfiguration(); - navigationBar.clickConfigEditorButton(); - configEditor.clickSearchConfiguration(); - configEditor.clickClearButton(); - jsonFile.sorting.options.push({ 'key': 'Modified Date', 'label': 'Modified Date', 'type': 'FIELD', 'field': 'cm:modified', 'ascending': true }); - configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); - configEditor.clickSaveButton(); - - searchDialog.checkSearchIconIsVisible() - .clickOnSearchIcon() - .enterTextAndPressEnter(search); - - searchSortingPicker.checkSortingSelectorIsDisplayed() - .sortBy(false, 'Modified Date'); - - browser.controlFlow().execute(async () => { - let idList = await contentServices.getElementsDisplayedId(); - let numberOfElements = await contentServices.numberOfResultsDisplayed(); - - let nodeList = await nodeActions.getNodesDisplayed(this.alfrescoJsApi, idList, numberOfElements); - let modifiedDateList = []; - for (let i = 0; i < nodeList.length; i++) { - modifiedDateList.push(new Date(nodeList[i].entry.modifiedAt)); - } - expect(contentServices.checkElementsSortedAsc(modifiedDateList)).toBe(false); + expect(contentServices.checkElementsDateSortedAsc(modifiedDateList)).toBe(true); }); }); diff --git a/e2e/search/components/search-text.e2e.ts b/e2e/search/components/search-text.e2e.ts index 6d969b9954..6b2b82eaab 100644 --- a/e2e/search/components/search-text.e2e.ts +++ b/e2e/search/components/search-text.e2e.ts @@ -22,7 +22,7 @@ import { FolderModel } from '../../models/ACS/folderModel'; import TestConfig = require('../../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { LoginPage } from '../../pages/adf/loginPage'; import { SearchDialog } from '../../pages/adf/dialog/searchDialog'; diff --git a/e2e/search/search-component.e2e.ts b/e2e/search/search-component.e2e.ts index eabf7e91f0..6b66e2af70 100644 --- a/e2e/search/search-component.e2e.ts +++ b/e2e/search/search-component.e2e.ts @@ -30,8 +30,11 @@ import { FolderModel } from '../models/ACS/folderModel'; import TestConfig = require('../test.config'); import { Util } from '../util/util'; -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ConfigEditorPage } from '../pages/adf/configEditorPage'; +import { SearchConfiguration } from './search.config'; describe('Search component - Search Bar', () => { @@ -51,6 +54,7 @@ describe('Search component - Search Bar', () => { let filePreviewPage = new FilePreviewPage(); let acsUser = new AcsUserModel(); + const uploadActions = new UploadActions(); let filename = Util.generateRandomString(16); let firstFolderName = Util.generateRandomString(16); @@ -72,8 +76,11 @@ describe('Search component - Search Bar', () => { 'name': thirdFolderName, 'shortName': thirdFolderName.substring(0, 8) }); + let term = 'Zoizo'; + + let fileHighlightUploaded; + beforeAll(async (done) => { - let uploadActions = new UploadActions(); this.alfrescoJsApi = new AlfrescoApi({ provider: 'ECM', @@ -89,6 +96,17 @@ describe('Search component - Search Bar', () => { let firstFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, firstFileModel.location, firstFileModel.name, '-my-'); Object.assign(firstFileModel, firstFileUploaded.entry); + fileHighlightUploaded = await this.alfrescoJsApi.nodes.addNode('-my-', { + 'name': Util.generateRandomString(16), + 'nodeType': 'cm:content', + 'properties': { + 'cm:title': term, + 'cm:description': 'Jadore les ' + term + } + }); + + filesToDelete.push(fileHighlightUploaded); + filesToDelete.push(firstFileUploaded); filesToDelete.push(await uploadActions.createFolder(this.alfrescoJsApi, firstFolderModel.name, '-my-')); filesToDelete.push(await uploadActions.createFolder(this.alfrescoJsApi, secondFolder.name, '-my-')); filesToDelete.push(await uploadActions.createFolder(this.alfrescoJsApi, thirdFolder.name, '-my-')); @@ -101,7 +119,6 @@ describe('Search component - Search Bar', () => { }); afterAll(async (done) => { - let uploadActions = new UploadActions(); filesToDelete.forEach(async (currentNode) => { await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, currentNode.entry.id); @@ -282,4 +299,34 @@ describe('Search component - Search Bar', () => { .enterTextAndPressEnter('%'); searchResultPage.tableIsLoaded(); }); + + describe('Highlight', () => { + + const navigationBar = new NavigationBarPage(); + const configEditor = new ConfigEditorPage(); + + let searchConfiguration = new SearchConfiguration().getConfiguration(); + + beforeAll(async () => { + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(searchConfiguration)); + configEditor.clickSaveButton(); + + searchDialog + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .checkSearchBarIsVisible() + .enterTextAndPressEnter(term); + }); + + it('[C299212] Should be able to configure the highlight option for search results', () => { + searchResultPage.getNodeHighlight(fileHighlightUploaded.entry.name).getText().then((text) => { + expect(text.includes(`¿${term}?`)).toBe(true); + expect(text.includes(`(${term})`)).toBe(true); + }); + }); + }); }); diff --git a/e2e/search/search-filters.e2e.ts b/e2e/search/search-filters.e2e.ts index 526317dd92..022bbd1d98 100644 --- a/e2e/search/search-filters.e2e.ts +++ b/e2e/search/search-filters.e2e.ts @@ -19,7 +19,7 @@ import { LoginPage } from '../pages/adf/loginPage'; import { SearchDialog } from '../pages/adf/dialog/searchDialog'; import { SearchFiltersPage } from '../pages/adf/searchFiltersPage'; import { PaginationPage } from '../pages/adf/paginationPage'; -import { ContentListPage } from '../pages/adf/dialog/contentListPage'; +import { DocumentListPage } from '../pages/adf/content-services/documentListPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { ConfigEditorPage } from '../pages/adf/configEditorPage'; import { SearchResultsPage } from '../pages/adf/searchResultsPage'; @@ -31,7 +31,7 @@ import TestConfig = require('../test.config'); import { Util } from '../util/util'; import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; import { browser } from 'protractor'; import { SearchConfiguration } from './search.config'; @@ -43,7 +43,7 @@ describe('Search Filters', () => { let searchFiltersPage = new SearchFiltersPage(); let uploadActions = new UploadActions(); let paginationPage = new PaginationPage(); - let contentList = new ContentListPage(); + let contentList = new DocumentListPage(); let navigationBar = new NavigationBarPage(); let configEditor = new ConfigEditorPage(); let searchResults = new SearchResultsPage(); @@ -51,6 +51,10 @@ describe('Search Filters', () => { let acsUser = new AcsUserModel(); let filename = Util.generateRandomString(16); + let fileNamePrefix = Util.generateRandomString(5); + let uniqueFileName1 = fileNamePrefix + Util.generateRandomString(5); + let uniqueFileName2 = fileNamePrefix + Util.generateRandomString(5); + let uniqueFileName3 = fileNamePrefix + Util.generateRandomString(5); let fileModel = new FileModel({ 'name': filename, 'shortName': filename.substring(0, 8) @@ -61,7 +65,22 @@ describe('Search Filters', () => { 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location }); - let fileUploaded, fileTypePng; + let txtFileModel1 = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location, + 'name': `${uniqueFileName1}.txt` + }); + + let jpgFileModel = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': `${uniqueFileName2}.jpg` + }); + + let txtFileModel2 = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location, + 'name': `${uniqueFileName3}.txt` + }); + + let fileUploaded, fileTypePng, fileTypeTxt1, fileTypeJpg, fileTypeTxt2; let filter = { type: 'TYPE-PNG Image' }; @@ -84,6 +103,12 @@ describe('Search Filters', () => { fileTypePng = await uploadActions.uploadFile(this.alfrescoJsApi, pngFileModel.location, pngFileModel.name, '-my-'); + fileTypeTxt1 = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileModel1.location, txtFileModel1.name, '-my-'); + + fileTypeJpg = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFileModel.location, jpgFileModel.name, '-my-'); + + fileTypeTxt2 = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileModel2.location, txtFileModel2.name, '-my-'); + loginPage.loginToContentServicesUsingUserModel(acsUser); await browser.driver.sleep(30000); // wait search index previous file/folder uploaded @@ -102,6 +127,9 @@ describe('Search Filters', () => { await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileUploaded.entry.id); await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileTypePng.entry.id); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileTypeTxt1.entry.id); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileTypeTxt2.entry.id); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileTypeJpg.entry.id); done(); }); @@ -149,7 +177,7 @@ describe('Search Filters', () => { let bucketNumberForFilter = searchFiltersPage.fileTypeCheckListFiltersPage().getBucketNumberOfFilterType(filter.type); - let resultFileNames = contentList.getAllRowsNameColumn(); + let resultFileNames = contentList.getAllRowsColumnValues('Display name'); expect(bucketNumberForFilter).not.toEqual('0'); @@ -207,4 +235,59 @@ describe('Search Filters', () => { expect(searchFiltersPage.isTypeFacetQueryGroupPresent()).toBe(false); expect(searchFiltersPage.isSizeFacetQueryGroupPresent()).toBe(false); }); + + it('[C297509] Should display search intervals under specified labels from config', () => { + browser.get(TestConfig.adf.url + '/search;q=*'); + + searchFiltersPage.checkFacetIntervalsByCreatedIsDisplayed() + .checkFacetIntervalsByCreatedIsExpanded() + .clickFacetIntervalsByCreatedFilterHeader() + .checkFacetIntervalsByCreatedIsCollapsed() + .clickFacetIntervalsByCreatedFilterHeader() + .checkFacetIntervalsByCreatedIsExpanded() + .checkFacetIntervalsByModifiedIsDisplayed() + .checkFacetIntervalsByModifiedIsExpanded() + .clickFacetIntervalsByModifiedFilterHeader() + .checkFacetIntervalsByModifiedIsCollapsed() + .clickFacetIntervalsByModifiedFilterHeader() + .checkFacetIntervalsByModifiedIsExpanded(); + }); + + it('[C299200] Should reset the filters facet with search query', () => { + searchDialog.enterTextAndPressEnter(fileTypeTxt1.entry.name); + + searchFiltersPage.checkSearchFiltersIsDisplayed(); + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(fileTypeTxt1.entry.name); + searchFiltersPage.checkFileTypeFacetLabelIsDisplayed('Plain Text (1)'); + searchFiltersPage.checkFileTypeFacetLabelIsNotDisplayed('JPEG Image'); + + searchDialog.enterTextAndPressEnter(fileNamePrefix); + searchFiltersPage.checkSearchFiltersIsDisplayed(); + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(fileTypeTxt1.entry.name); + searchResults.checkContentIsDisplayed(fileTypeTxt2.entry.name); + searchResults.checkContentIsDisplayed(fileTypeJpg.entry.name); + searchFiltersPage.checkFileTypeFacetLabelIsDisplayed('Plain Text (2)'); + searchFiltersPage.checkFileTypeFacetLabelIsDisplayed('JPEG Image (1)'); + + }); + + it('[C299124] Should be able to parse escaped empty spaced labels inside facetFields', () => { + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + jsonFile.facetFields.fields[0].label = 'My File Types'; + jsonFile.facetFields.fields[1].label = 'My File Sizes'; + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); + configEditor.clickSaveButton(); + + searchDialog.clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + searchResults.tableIsLoaded(); + searchFiltersPage.checkCustomFacetFieldLabelIsDisplayed('My File Types'); + searchFiltersPage.checkCustomFacetFieldLabelIsDisplayed('My File Sizes'); + }); + }); diff --git a/e2e/search/search-multiselect.e2e.ts b/e2e/search/search-multiselect.e2e.ts index a13e203528..daa2a5e70b 100644 --- a/e2e/search/search-multiselect.e2e.ts +++ b/e2e/search/search-multiselect.e2e.ts @@ -16,7 +16,7 @@ */ import TestConfig = require('../test.config'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { Util } from '../util/util'; import resources = require('../util/resources'); diff --git a/e2e/search/search-page-component.e2e.ts b/e2e/search/search-page-component.e2e.ts index 5178837194..3c19795c81 100644 --- a/e2e/search/search-page-component.e2e.ts +++ b/e2e/search/search-page-component.e2e.ts @@ -32,7 +32,7 @@ import TestConfig = require('../test.config'); import { Util } from '../util/util'; import resources = require('../util/resources'); -import AlfrescoApi = require('alfresco-js-api-node'); +import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { UploadActions } from '../actions/ACS/upload.actions'; describe('Search component - Search Page', () => { @@ -179,101 +179,6 @@ describe('Search component - Search Page', () => { searchResultPage.checkNoResultMessageIsDisplayed(); }); - describe('Sorting', () => { - - beforeEach(() => { - searchDialog - .clickOnSearchIcon() - .enterTextAndPressEnter(search.active.base); - }); - - afterEach(async (done) => { - await browser.refresh(); - done(); - }); - - it('[C272803] Should be able to sort results by name (Ascending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - searchResultPage.sortAndCheckListIsOrderedByName(true).then((result) => { - expect(result).toEqual(true); - }); - }); - - it('[C272804] Should be able to sort results by name (Descending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - searchResultPage.sortAndCheckListIsOrderedByName(false).then((result) => { - expect(result).toEqual(true); - }); - }); - - it('[C272805] Should be able to sort results by author (Ascending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - - searchResultPage.sortAndCheckListIsOrderedByAuthor(this.alfrescoJsApi, true).then((result) => { - expect(result).toEqual(true); - }); - }); - - it('[C272806] Should be able to sort results by author (Descending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - searchResultPage.sortAndCheckListIsOrderedByAuthor(this.alfrescoJsApi, false).then((result) => { - expect(result).toEqual(true); - }); - }); - - it('[C272807] Should be able to sort results by date (Ascending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - searchResultPage.sortAndCheckListIsOrderedByCreated(true).then((result) => { - expect(result).toEqual(true); - }); - }); - - it('[C260260] Should be able to sort results by date (Descending)', () => { - - searchResultPage.checkContentIsDisplayed(search.active.secondFile); - searchResultPage.sortAndCheckListIsOrderedByCreated(false).then((result) => { - expect(result).toEqual(true); - }); - }); - - }); - - it('[C260262] Should not be able to delete a file from search results without rights', () => { - searchDialog - .clickOnSearchIcon() - .enterTextAndPressEnter(search.no_permission.noPermFile); - - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); - searchResultPage.checkDeleteIsDisabled(search.no_permission.noPermFile); - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); - searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() - .enterTextAndPressEnter(search.no_permission.noPermFile); - searchResultPage.checkNoResultMessageIsNotDisplayed(); - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); - }); - - it('[C272808] Should not be able to delete a folder from search results without rights', () => { - searchDialog - .clickOnSearchIcon() - .enterTextAndPressEnter(search.no_permission.noPermFolder); - - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); - searchResultPage.checkDeleteIsDisabled(search.no_permission.noPermFolder); - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); - - searchDialog - .clickOnSearchIcon() - .enterTextAndPressEnter(search.no_permission.noPermFolder); - - searchResultPage.checkNoResultMessageIsNotDisplayed(); - searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); - }); - it('[C286675] Should display results when searching for all elements', () => { searchDialog .clickOnSearchIcon() diff --git a/e2e/search/search.config.ts b/e2e/search/search.config.ts index ece0100b6e..cbd5c7f368 100644 --- a/e2e/search/search.config.ts +++ b/e2e/search/search.config.ts @@ -22,6 +22,17 @@ export class SearchConfiguration { getConfiguration() { return { + 'app:fields': [ + 'cm:name', + 'cm:title', + 'cm:description', + 'ia:whatEvent', + 'ia:descriptionEvent', + 'lnk:title', + 'lnk:description', + 'TEXT', + 'TAG' + ], 'include': ['path', 'allowableOperations'], 'sorting': { 'options': [ @@ -169,7 +180,22 @@ export class SearchConfiguration { } } } - ] + ], + 'highlight': { + 'prefix': '¿', + 'postfix': '?', + 'mergeContiguous': true, + 'fields': [ + { + 'field': 'cm:title' + }, + { + 'field': 'description', + 'prefix': '(', + 'postfix': ')' + } + ] + } }; } } diff --git a/e2e/test.config.js b/e2e/test.config.js index 10c17cad6e..1c298d23c9 100644 --- a/e2e/test.config.js +++ b/e2e/test.config.js @@ -3,14 +3,15 @@ * @class config.test.config */ -var HOST = process.env.URL_HOST_ADF; +const HOST = process.env.URL_HOST_ADF; const HOST_BPM = process.env.URL_HOST_BPM_ADF; const HOST_SSO = process.env.URL_HOST_SSO_ADF; const HOST_IDENTITY = process.env.URL_HOST_IDENTITY; -var USERNAME = process.env.USERNAME_ADF; -var PASSWORD = process.env.PASSWORD_ADF; -var EMAIL = process.env.EMAIL_ADF; -var TIMEOUT = parseInt(process.env.TIMEOUT, 10); +const USERNAME = process.env.USERNAME_ADF; +const PASSWORD = process.env.PASSWORD_ADF; +const EMAIL = process.env.EMAIL_ADF; +const TIMEOUT = parseInt(process.env.TIMEOUT, 10); +const PROXY = process.env.PROXY_HOST_ADF; module.exports = { @@ -50,11 +51,39 @@ module.exports = { */ adminPassword: PASSWORD, - hostBPM: "http://" + HOST_BPM, + hostBPM: "http://" + ( HOST_BPM || PROXY || HOST), - hostSso: "http://" + HOST_SSO, + clientIdSso: "alfresco", - hostIdentity: "http://" + HOST_IDENTITY + hostSso: function () { + let baseUrl; + + if (HOST_SSO) { + baseUrl = HOST_SSO; + } else if (PROXY) { + baseUrl = PROXY; + } else { + baseUrl = HOST; + } + + return `http://${baseUrl}/auth/realms/alfresco`; + }(), + + hostIdentity: function () { + let baseUrl; + + if (HOST_IDENTITY) { + baseUrl = HOST_IDENTITY; + } else if (HOST_SSO) { + baseUrl = HOST_SSO; + } else if (PROXY) { + baseUrl = PROXY; + } else { + baseUrl = HOST; + } + + return `http://${baseUrl}/auth/admin/realms/alfresco`; + }() }, diff --git a/e2e/tsconfig.e2e.json b/e2e/tsconfig.e2e.json index 1d9e5edf09..113be44976 100644 --- a/e2e/tsconfig.e2e.json +++ b/e2e/tsconfig.e2e.json @@ -1,14 +1,44 @@ { "extends": "../tsconfig.json", "compilerOptions": { + "noEmit": true, "outDir": "../out-tsc/e2e", - "baseUrl": "./", + "baseUrl": ".", "module": "commonjs", "target": "es5", "types": [ "jasmine", "jasminewd2", "node" - ] - } + ], + "paths": { + "@alfresco/adf-extensions": [ + "../lib/extensions" + ], + "@alfresco/adf-core": [ + "../lib/core" + ], + "@alfresco/adf-content-services": [ + "../lib/content-services" + ], + "@alfresco/adf-process-services": [ + "../lib/process-services" + ], + "@alfresco/adf-insights": [ + "../lib/insights" + ], + "@alfresco/adf-process-services-cloud": [ + "../lib/process-services-cloud" + ], + "@alfresco/adf-testing": [ + "../lib/testing" + ] + } + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/e2e/util/constants.js b/e2e/util/constants.js index e4be3c8be0..70a14017b3 100644 --- a/e2e/util/constants.js +++ b/e2e/util/constants.js @@ -110,6 +110,13 @@ exports.APP_ICON = { USER: "person" }; +exports.ROLES = { + APS_USER: "APS_USER", + ACTIVITI_USER: "ACTIVITI_USER", + APS_ADMIN: "APS_ADMIN", + ACTIVITI_ADMIN: "ACTIVITI_ADMIN" +}; + exports.PROCESS_END_DATE = "No date"; exports.PROCESS_CATEGORY = "http://www.activiti.org/processdef"; diff --git a/e2e/util/resources.js b/e2e/util/resources.js index 963165d2b3..c1ec69a40d 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -323,6 +323,10 @@ exports.Files = { }, ADF_DOCUMENTS: { + JS: { + file_location: "/resources/adf/a_js_file.js", + file_name: "a_js_file.js" + }, PDF: { file_location: "/resources/adf/allFileTypes/a_file_supported.pdf", file_name: "a_file_supported.pdf", diff --git a/e2e/util/util.ts b/e2e/util/util.ts index 5ce69f68fd..ab25fc7ff7 100644 --- a/e2e/util/util.ts +++ b/e2e/util/util.ts @@ -16,7 +16,6 @@ */ import { browser, protractor } from 'protractor'; -import * as moment from 'moment'; import fs = require('fs'); import path = require('path'); import TestConfig = require('../test.config'); diff --git a/integration/base_ver_2_app/.angular-cli.json b/integration/base_ver_2_app/.angular-cli.json deleted file mode 100644 index 7257342f6e..0000000000 --- a/integration/base_ver_2_app/.angular-cli.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "myapp" - }, - "apps": [ - { - "name" : "dist", - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico", - "app.config.json", - "versions.json", - { - "glob": "**/*", - "input": "../resources", - "output": "./resources" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-core/prebuilt-themes", - "output": "./assets/prebuilt-themes" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-core/bundles/assets", - "output": "./assets/" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-insights/bundles/assets", - "output": "./assets/" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-process-services/bundles/assets", - "output": "./assets/" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-process-services-cloud/bundles/assets", - "output": "./assets/" - }, - { - "glob": "**/*", - "input": "../node_modules/@alfresco/adf-content-services/bundles/assets", - "output": "./assets/" - }, - { "glob": "pdf.worker.js", "input": "../node_modules/pdfjs-dist/build", "output": "./" } - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "custom-style.scss" - ], - "stylePreprocessorOptions": { - "includePaths": [ - "../node_modules/" - ] - }, - "scripts": [ - "../node_modules/pdfjs-dist/build/pdf.js", - "../node_modules/pdfjs-dist/web/pdf_viewer.js", - "../node_modules/raphael/raphael.min.js", - "../node_modules/moment/min/moment.min.js" - ], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json" - }, - { - "project": "src/tsconfig.spec.json" - }, - { - "project": "e2e/tsconfig.e2e.json" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "scss", - "component": { - }, - "serve": { - "proxyConfig": "proxy.conf.json", - "port": 4200 - } - } -} diff --git a/integration/base_ver_2_app/.editorconfig b/integration/base_ver_2_app/.editorconfig deleted file mode 100644 index 6e87a003da..0000000000 --- a/integration/base_ver_2_app/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Editor configuration, see http://editorconfig.org -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -max_line_length = off -trim_trailing_whitespace = false diff --git a/integration/base_ver_2_app/.npmignore b/integration/base_ver_2_app/.npmignore deleted file mode 100644 index 54bfd2001e..0000000000 --- a/integration/base_ver_2_app/.npmignore +++ /dev/null @@ -1,42 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc - -# dependencies -/node_modules - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -testem.log -/typings - -# e2e -/e2e/*.js -/e2e/*.map - -# System Files -.DS_Store -Thumbs.db diff --git a/integration/base_ver_2_app/.travis.yml b/integration/base_ver_2_app/.travis.yml deleted file mode 100644 index 959166f9aa..0000000000 --- a/integration/base_ver_2_app/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -dist: trusty -sudo: false - -language: node_js -node_js: - - "8" - -cache: - directories: - - ./node_modules - -install: - - npm install - -script: - # Use Chromium instead of Chrome. - - export CHROME_BIN=chromium-browser - - xvfb-run -a npm run test -- --single-run --no-progress --browser=ChromeNoSandbox - #- xvfb-run -a npm run e2e -- --no-progress --config=protractor-ci.conf.js diff --git a/integration/base_ver_2_app/LICENSE b/integration/base_ver_2_app/LICENSE deleted file mode 100644 index 7bdafc2812..0000000000 --- a/integration/base_ver_2_app/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Denys Vuika - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/integration/base_ver_2_app/README.md b/integration/base_ver_2_app/README.md deleted file mode 100644 index f5d5b7d9a1..0000000000 --- a/integration/base_ver_2_app/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# ADF/APS/ACS Application with Angular CLI - -Minimal ready-to-use Angular CLI project template pre-configured with ADF 2.0.0 components. - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.5.0 - -## Quick start - -```sh -npm install -npm start -``` - -## Supported ADF component libraries - -This project has all the existing ADF component libraries already pre-configured. - -The main focus of the project is: - -- ADF integration and setup -- Basic demonstration of working components - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -### Proxy settings - -The template provides certain proxy settings to allow running web application locally without CORS setup. -You can find details in the `proxy.conf.json` file. - -List of URLs being proxied: - -- `/alfresco` -> `http://0.0.0.0:8080` -- `/activiti-app` -> `http://0.0.0.0:9999` - -## Code scaffolding - -Run `ng generate component component-name -m app.module` to generate a new component. You can also use `ng generate directive|pipe|service|class|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). -Before running the tests make sure you are serving the app via `ng serve`. - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/integration/base_ver_2_app/e2e/app.e2e-spec.ts b/integration/base_ver_2_app/e2e/app.e2e-spec.ts deleted file mode 100644 index e6009d9ce4..0000000000 --- a/integration/base_ver_2_app/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AdfAppPage } from './app.po'; - -describe('adf-app App', () => { - let page: AdfAppPage; - - beforeEach(() => { - page = new AdfAppPage(); - }); - - it('should display toolbar', () => { - page.navigateTo(); - expect(page.getToolbar()).toBeDefined(); - }); -}); diff --git a/integration/base_ver_2_app/e2e/app.po.ts b/integration/base_ver_2_app/e2e/app.po.ts deleted file mode 100644 index 6e1bc9f987..0000000000 --- a/integration/base_ver_2_app/e2e/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AdfAppPage { - navigateTo() { - return browser.get('/'); - } - - getToolbar() { - return element(by.tagName('adf-toolbar')); - } -} diff --git a/integration/base_ver_2_app/e2e/tsconfig.e2e.json b/integration/base_ver_2_app/e2e/tsconfig.e2e.json deleted file mode 100644 index 1d9e5edf09..0000000000 --- a/integration/base_ver_2_app/e2e/tsconfig.e2e.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "baseUrl": "./", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/integration/base_ver_2_app/karma.conf.js b/integration/base_ver_2_app/karma.conf.js deleted file mode 100644 index f891ed06e4..0000000000 --- a/integration/base_ver_2_app/karma.conf.js +++ /dev/null @@ -1,58 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/0.13/config/configuration-file.html - -module.exports = function(config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular/cli'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular/cli/plugins/karma') - ], - files: [ - { pattern: './node_modules/hammerjs/hammer.js', watched: false }, - { pattern: './node_modules/@angular/material/prebuilt-themes/indigo-pink.css', watched: false }, - { pattern: './node_modules/@alfresco/adf-core/bundles/assets/adf-core/i18n/en.json', watched: false, served: true, included: false }, - { pattern: './node_modules/@alfresco/adf-content-services/bundles/assets/adf-content-services/i18n/en.json', watched: false, served: true, included: false }, - { pattern: './node_modules/@alfresco/adf-process-services/bundles/assets/adf-process-services/i18n/en.json', watched: false, served: true, included: false }, - { pattern: './node_modules/@alfresco/adf-process-services-cloud/bundles/assets/adf-process-services-cloud/i18n/en.json', watched: false, served: true, included: false } - ], - proxies: { - '/assets/adf-core/i18n/en.json': '/base/node_modules/@alfresco/adf-core/bundles/assets/adf-core/i18n/en.json', - '/assets/adf-content-services/i18n/en.json': '/base/node_modules/@alfresco/adf-content-services/bundles/assets/adf-content-services/i18n/en.json', - '/assets/adf-process-services/i18n/en.json': '/base/node_modules/@alfresco/adf-process-services/bundles/assets/adf-process-services/i18n/en.json', - '/assets/adf-process-services-cloud/i18n/en.json': '/base/node_modules/@alfresco/adf-process-services-cloud/bundles/assets/adf-process-services-cloud/i18n/en.json' - }, - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - reports: ['html', 'lcovonly'], - fixWebpackSourcePaths: true - }, - angularCli: { - environment: 'dev' - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - customLaunchers: { - ChromeNoSandbox: { - base: 'Chrome', - flags: ['--no-sandbox'] - } - }, - singleRun: false, - - captureTimeout: 180000, - browserDisconnectTimeout: 180000, - browserDisconnectTolerance: 3, - browserNoActivityTimeout: 300000 - }); -}; diff --git a/integration/base_ver_2_app/package-lock.json b/integration/base_ver_2_app/package-lock.json deleted file mode 100644 index 7120ca3df7..0000000000 --- a/integration/base_ver_2_app/package-lock.json +++ /dev/null @@ -1,11916 +0,0 @@ -{ - "name": "adf-cli-acs-aps-template", - "version": "2.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@alfresco/adf-content-services": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-2.0.0.tgz", - "integrity": "sha512-GuD5fyYzm7ZEs1+f7wzQxabGoVsFRIvLS5ZHkml6yQrUv01zjzTt85+zcpDhYiW4NY7F+2JgoyMN4+YXfop8XA==", - "requires": { - "@alfresco/adf-core": "2.0.0", - "@angular/animations": "5.0.0", - "@angular/cdk": "5.0.0-rc0", - "@angular/common": "5.0.0", - "@angular/compiler": "5.0.0", - "@angular/core": "5.0.0", - "@angular/flex-layout": "2.0.0-beta.10", - "@angular/forms": "5.0.0", - "@angular/http": "5.0.0", - "@angular/material": "5.0.0-rc0", - "@angular/material-moment-adapter": "5.1.1", - "@angular/platform-browser": "5.0.0", - "@angular/platform-browser-dynamic": "5.0.0", - "@angular/router": "5.0.0", - "@ngx-translate/core": "8.0.0", - "alfresco-js-api": "2.0.0", - "chart.js": "2.5.0", - "core-js": "2.4.1", - "hammerjs": "2.0.8", - "minimatch": "3.0.4", - "moment": "2.15.2", - "ng2-charts": "1.6.0", - "pdfjs-dist": "1.5.404", - "raphael": "2.2.7", - "reflect-metadata": "0.1.10", - "rxjs": "5.5.2", - "systemjs": "0.19.27", - "zone.js": "0.8.14" - }, - "dependencies": { - "@angular/animations": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.0.0.tgz", - "integrity": "sha1-ta0ZnGf5P3WVREd+/+ZnnhVJkfs=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cdk": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.0-rc0.tgz", - "integrity": "sha512-wZg/mzHisiTieVt7Q/YNPB+r07PHvjoAT3+0mwyIP7wuC00W8BJLPhTZd/tIM5q7Nd69kuA1HSx1qLkcmlCZkw==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.0.0.tgz", - "integrity": "sha1-+W1mpRe5ldG6mygwnxXC41lnWCU=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.0.0.tgz", - "integrity": "sha1-uf+/GMijnYt9rOxHMZOpDiTMK8k=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.0.0.tgz", - "integrity": "sha1-T5dqIl993fNJkvLK2CTJVDpG9Mg=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/flex-layout": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10.tgz", - "integrity": "sha512-Y4f+Gw8pjDBwb9IykSTGiYRfVyzLfzTxFvRzKuDYEGUFi2UG3zOmAr2OzkpA/+K4mE5zQ+hYkBJaJD+DXAd/6w==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/forms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.0.0.tgz", - "integrity": "sha1-x/3fo1OWdZrphSkgowzdqMQe0d4=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.0.0.tgz", - "integrity": "sha1-Byiivgz7sHhyfF64fUyF1T/smlE=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/material": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.0-rc0.tgz", - "integrity": "sha512-ZW9gy3c8l2NbFfX9DRYSW+i67pPoL9DZoMCb16STQlhdDfwwAWNpjGF0etXkXw30hDnRCMGVVJVU+45cNXJspA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.0.0.tgz", - "integrity": "sha1-xwOPfN6AcFtiAUiXIx4YLuyXb+0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.0.0.tgz", - "integrity": "sha1-iH4QbIsQOwQVz2FWpCXabYP0yJ0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/router": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.0.0.tgz", - "integrity": "sha1-/ktSGmc4QIvOMPk6U0mRQMk6T3Y=", - "requires": { - "tslib": "1.9.3" - } - }, - "@ngx-translate/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-8.0.0.tgz", - "integrity": "sha1-dR/WtRLYDzp0jS3o38lt/vopr+A=" - }, - "alfresco-js-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.0.0.tgz", - "integrity": "sha512-BQgHq10PCFBcRwCyqUp4GuvUh/acJxKc2GF59mT7uQ7xEPwDH0mkmXotFjuUVw1qAJYQVn/3YxO0ezxa6ph31A==", - "requires": { - "event-emitter": "0.3.4", - "superagent": "3.4.1" - } - }, - "moment": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", - "integrity": "sha1-G/3t9qbjRfMi/pVtXfW9CKjOhNw=" - }, - "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", - "requires": { - "symbol-observable": "1.2.0" - } - }, - "superagent": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.4.1.tgz", - "integrity": "sha1-S9EnQSJNDs5tn3V/HDvsvn8kwRU=", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "2.6.9", - "extend": "3.0.2", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } - } - } - }, - "@alfresco/adf-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-2.0.0.tgz", - "integrity": "sha512-BOBV6XbnrnnZ7/C2jk9kzSMQCzP301JmEHB8hraFHC0oKGIgozxLEXBcX448aX0yORllQaFS2b2Mmqe2U7i/Tg==", - "requires": { - "@angular/animations": "5.0.0", - "@angular/cdk": "5.0.0-rc0", - "@angular/common": "5.0.0", - "@angular/compiler": "5.0.0", - "@angular/core": "5.0.0", - "@angular/flex-layout": "2.0.0-beta.10", - "@angular/forms": "5.0.0", - "@angular/http": "5.0.0", - "@angular/material": "5.0.0-rc0", - "@angular/material-moment-adapter": "5.1.1", - "@angular/platform-browser": "5.0.0", - "@angular/platform-browser-dynamic": "5.0.0", - "@angular/router": "5.0.0", - "@ngx-translate/core": "8.0.0", - "alfresco-js-api": "2.0.0", - "chart.js": "2.5.0", - "core-js": "2.4.1", - "hammerjs": "2.0.8", - "minimatch": "3.0.4", - "moment": "2.15.2", - "ng2-charts": "1.6.0", - "pdfjs-dist": "1.5.404", - "raphael": "2.2.7", - "reflect-metadata": "0.1.10", - "rxjs": "5.5.2", - "systemjs": "0.19.27", - "zone.js": "0.8.14" - }, - "dependencies": { - "@angular/animations": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.0.0.tgz", - "integrity": "sha1-ta0ZnGf5P3WVREd+/+ZnnhVJkfs=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cdk": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.0-rc0.tgz", - "integrity": "sha512-wZg/mzHisiTieVt7Q/YNPB+r07PHvjoAT3+0mwyIP7wuC00W8BJLPhTZd/tIM5q7Nd69kuA1HSx1qLkcmlCZkw==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.0.0.tgz", - "integrity": "sha1-+W1mpRe5ldG6mygwnxXC41lnWCU=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.0.0.tgz", - "integrity": "sha1-uf+/GMijnYt9rOxHMZOpDiTMK8k=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.0.0.tgz", - "integrity": "sha1-T5dqIl993fNJkvLK2CTJVDpG9Mg=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/flex-layout": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10.tgz", - "integrity": "sha512-Y4f+Gw8pjDBwb9IykSTGiYRfVyzLfzTxFvRzKuDYEGUFi2UG3zOmAr2OzkpA/+K4mE5zQ+hYkBJaJD+DXAd/6w==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/forms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.0.0.tgz", - "integrity": "sha1-x/3fo1OWdZrphSkgowzdqMQe0d4=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.0.0.tgz", - "integrity": "sha1-Byiivgz7sHhyfF64fUyF1T/smlE=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/material": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.0-rc0.tgz", - "integrity": "sha512-ZW9gy3c8l2NbFfX9DRYSW+i67pPoL9DZoMCb16STQlhdDfwwAWNpjGF0etXkXw30hDnRCMGVVJVU+45cNXJspA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.0.0.tgz", - "integrity": "sha1-xwOPfN6AcFtiAUiXIx4YLuyXb+0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.0.0.tgz", - "integrity": "sha1-iH4QbIsQOwQVz2FWpCXabYP0yJ0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/router": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.0.0.tgz", - "integrity": "sha1-/ktSGmc4QIvOMPk6U0mRQMk6T3Y=", - "requires": { - "tslib": "1.9.3" - } - }, - "@ngx-translate/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-8.0.0.tgz", - "integrity": "sha1-dR/WtRLYDzp0jS3o38lt/vopr+A=" - }, - "alfresco-js-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.0.0.tgz", - "integrity": "sha512-BQgHq10PCFBcRwCyqUp4GuvUh/acJxKc2GF59mT7uQ7xEPwDH0mkmXotFjuUVw1qAJYQVn/3YxO0ezxa6ph31A==", - "requires": { - "event-emitter": "0.3.4", - "superagent": "3.4.1" - } - }, - "moment": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", - "integrity": "sha1-G/3t9qbjRfMi/pVtXfW9CKjOhNw=" - }, - "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", - "requires": { - "symbol-observable": "1.2.0" - } - }, - "superagent": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.4.1.tgz", - "integrity": "sha1-S9EnQSJNDs5tn3V/HDvsvn8kwRU=", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "2.6.9", - "extend": "3.0.2", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } - } - } - }, - "@alfresco/adf-insights": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-2.0.1.tgz", - "integrity": "sha512-gJs9weO7mJMU/DsUjWMHX0pGA5XwkXFpfWsgOP+g3U64hlwY7oWIkXtr6zjTmGnBwiNJNFT1e+5uHz6ED4Pbog==", - "requires": { - "@alfresco/adf-core": "2.0.0", - "@angular/animations": "5.0.0", - "@angular/cdk": "5.0.0-rc0", - "@angular/common": "5.0.0", - "@angular/compiler": "5.0.0", - "@angular/core": "5.0.0", - "@angular/flex-layout": "2.0.0-beta.10", - "@angular/forms": "5.0.0", - "@angular/http": "5.0.0", - "@angular/material": "5.0.0-rc0", - "@angular/material-moment-adapter": "5.1.1", - "@angular/platform-browser": "5.0.0", - "@angular/platform-browser-dynamic": "5.0.0", - "@angular/router": "5.0.0", - "@ngx-translate/core": "8.0.0", - "alfresco-js-api": "2.0.0", - "chart.js": "2.5.0", - "core-js": "2.4.1", - "hammerjs": "2.0.8", - "minimatch": "3.0.4", - "moment": "2.15.2", - "ng2-charts": "1.6.0", - "pdfjs-dist": "1.5.404", - "raphael": "2.2.7", - "reflect-metadata": "0.1.10", - "rxjs": "5.5.2", - "systemjs": "0.19.27", - "zone.js": "0.8.14" - }, - "dependencies": { - "@angular/animations": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.0.0.tgz", - "integrity": "sha1-ta0ZnGf5P3WVREd+/+ZnnhVJkfs=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cdk": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.0-rc0.tgz", - "integrity": "sha512-wZg/mzHisiTieVt7Q/YNPB+r07PHvjoAT3+0mwyIP7wuC00W8BJLPhTZd/tIM5q7Nd69kuA1HSx1qLkcmlCZkw==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.0.0.tgz", - "integrity": "sha1-+W1mpRe5ldG6mygwnxXC41lnWCU=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.0.0.tgz", - "integrity": "sha1-uf+/GMijnYt9rOxHMZOpDiTMK8k=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.0.0.tgz", - "integrity": "sha1-T5dqIl993fNJkvLK2CTJVDpG9Mg=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/flex-layout": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10.tgz", - "integrity": "sha512-Y4f+Gw8pjDBwb9IykSTGiYRfVyzLfzTxFvRzKuDYEGUFi2UG3zOmAr2OzkpA/+K4mE5zQ+hYkBJaJD+DXAd/6w==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/forms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.0.0.tgz", - "integrity": "sha1-x/3fo1OWdZrphSkgowzdqMQe0d4=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.0.0.tgz", - "integrity": "sha1-Byiivgz7sHhyfF64fUyF1T/smlE=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/material": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.0-rc0.tgz", - "integrity": "sha512-ZW9gy3c8l2NbFfX9DRYSW+i67pPoL9DZoMCb16STQlhdDfwwAWNpjGF0etXkXw30hDnRCMGVVJVU+45cNXJspA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.0.0.tgz", - "integrity": "sha1-xwOPfN6AcFtiAUiXIx4YLuyXb+0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.0.0.tgz", - "integrity": "sha1-iH4QbIsQOwQVz2FWpCXabYP0yJ0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/router": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.0.0.tgz", - "integrity": "sha1-/ktSGmc4QIvOMPk6U0mRQMk6T3Y=", - "requires": { - "tslib": "1.9.3" - } - }, - "@ngx-translate/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-8.0.0.tgz", - "integrity": "sha1-dR/WtRLYDzp0jS3o38lt/vopr+A=" - }, - "alfresco-js-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.0.0.tgz", - "integrity": "sha512-BQgHq10PCFBcRwCyqUp4GuvUh/acJxKc2GF59mT7uQ7xEPwDH0mkmXotFjuUVw1qAJYQVn/3YxO0ezxa6ph31A==", - "requires": { - "event-emitter": "0.3.4", - "superagent": "3.4.1" - } - }, - "moment": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", - "integrity": "sha1-G/3t9qbjRfMi/pVtXfW9CKjOhNw=" - }, - "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", - "requires": { - "symbol-observable": "1.2.0" - } - }, - "superagent": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.4.1.tgz", - "integrity": "sha1-S9EnQSJNDs5tn3V/HDvsvn8kwRU=", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "2.6.9", - "extend": "3.0.2", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } - } - } - }, - "@alfresco/adf-process-services": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-2.0.0.tgz", - "integrity": "sha512-nhx+xdrY+bBv47/W2XUoAkWJUFin6iPNSUzeFhAI2vDtYmupKfDtScKTIsjXREwjDZM8H5OJPzXz9hewprY1Mg==", - "requires": { - "@alfresco/adf-core": "2.0.0", - "@angular/animations": "5.0.0", - "@angular/cdk": "5.0.0-rc0", - "@angular/common": "5.0.0", - "@angular/compiler": "5.0.0", - "@angular/core": "5.0.0", - "@angular/flex-layout": "2.0.0-beta.10", - "@angular/forms": "5.0.0", - "@angular/http": "5.0.0", - "@angular/material": "5.0.0-rc0", - "@angular/material-moment-adapter": "5.1.1", - "@angular/platform-browser": "5.0.0", - "@angular/platform-browser-dynamic": "5.0.0", - "@angular/router": "5.0.0", - "@ngx-translate/core": "8.0.0", - "alfresco-js-api": "2.0.0", - "chart.js": "2.5.0", - "core-js": "2.4.1", - "hammerjs": "2.0.8", - "minimatch": "3.0.4", - "moment": "2.15.2", - "ng2-charts": "1.6.0", - "pdfjs-dist": "1.5.404", - "raphael": "2.2.7", - "reflect-metadata": "0.1.10", - "rxjs": "5.5.2", - "systemjs": "0.19.27", - "zone.js": "0.8.14" - }, - "dependencies": { - "@angular/animations": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.0.0.tgz", - "integrity": "sha1-ta0ZnGf5P3WVREd+/+ZnnhVJkfs=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cdk": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.0-rc0.tgz", - "integrity": "sha512-wZg/mzHisiTieVt7Q/YNPB+r07PHvjoAT3+0mwyIP7wuC00W8BJLPhTZd/tIM5q7Nd69kuA1HSx1qLkcmlCZkw==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.0.0.tgz", - "integrity": "sha1-+W1mpRe5ldG6mygwnxXC41lnWCU=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.0.0.tgz", - "integrity": "sha1-uf+/GMijnYt9rOxHMZOpDiTMK8k=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.0.0.tgz", - "integrity": "sha1-T5dqIl993fNJkvLK2CTJVDpG9Mg=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/flex-layout": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.10.tgz", - "integrity": "sha512-Y4f+Gw8pjDBwb9IykSTGiYRfVyzLfzTxFvRzKuDYEGUFi2UG3zOmAr2OzkpA/+K4mE5zQ+hYkBJaJD+DXAd/6w==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/forms": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.0.0.tgz", - "integrity": "sha1-x/3fo1OWdZrphSkgowzdqMQe0d4=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.0.0.tgz", - "integrity": "sha1-Byiivgz7sHhyfF64fUyF1T/smlE=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/material": { - "version": "5.0.0-rc0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.0-rc0.tgz", - "integrity": "sha512-ZW9gy3c8l2NbFfX9DRYSW+i67pPoL9DZoMCb16STQlhdDfwwAWNpjGF0etXkXw30hDnRCMGVVJVU+45cNXJspA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.0.0.tgz", - "integrity": "sha1-xwOPfN6AcFtiAUiXIx4YLuyXb+0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.0.0.tgz", - "integrity": "sha1-iH4QbIsQOwQVz2FWpCXabYP0yJ0=", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/router": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.0.0.tgz", - "integrity": "sha1-/ktSGmc4QIvOMPk6U0mRQMk6T3Y=", - "requires": { - "tslib": "1.9.3" - } - }, - "@ngx-translate/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-8.0.0.tgz", - "integrity": "sha1-dR/WtRLYDzp0jS3o38lt/vopr+A=" - }, - "alfresco-js-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.0.0.tgz", - "integrity": "sha512-BQgHq10PCFBcRwCyqUp4GuvUh/acJxKc2GF59mT7uQ7xEPwDH0mkmXotFjuUVw1qAJYQVn/3YxO0ezxa6ph31A==", - "requires": { - "event-emitter": "0.3.4", - "superagent": "3.4.1" - } - }, - "moment": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", - "integrity": "sha1-G/3t9qbjRfMi/pVtXfW9CKjOhNw=" - }, - "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", - "requires": { - "symbol-observable": "1.2.0" - } - }, - "superagent": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.4.1.tgz", - "integrity": "sha1-S9EnQSJNDs5tn3V/HDvsvn8kwRU=", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "2.6.9", - "extend": "3.0.2", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", - "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "source-map": "0.5.7", - "typescript": "2.6.2", - "webpack-sources": "1.1.0" - } - }, - "@angular-devkit/core": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.28.tgz", - "integrity": "sha512-rfGRVdpx080zZq9NGZ3RNG+cmoq/ZPaCzpM4dAbosEM46ficUkwr/JKjhjZUUoSyb9ItrT1lp9C33GfE/YpSVQ==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "chokidar": "1.7.0", - "rxjs": "5.5.11", - "source-map": "0.5.7" - }, - "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "@angular-devkit/schematics": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", - "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", - "dev": true, - "requires": { - "@ngtools/json-schema": "1.2.0", - "rxjs": "5.5.11" - }, - "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "@angular/animations": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.1.1.tgz", - "integrity": "sha512-PHLBWDnAzr5b5l52pk5ZYmv/6m0YUe2ICwu5dmbS0d8Kf5dXadMphAWCDbljMF+djGyZeFq2/dQ/t7ygYl3YuA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cdk": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.1.1.tgz", - "integrity": "sha512-V8kQmwf1PhtxiiE0cS1x9SW7/VFrJ7LcL9RqxUOMmJMl8kVR43dQBEeuVOOYJlGo9LAR5ctfemlJHwd9+PoHew==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/cli": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.4.tgz", - "integrity": "sha512-URdb1QtnQf+Ievy93wjq7gE81s25BkWUwJFPey+YkphBA3G1lbCAQPiEh2pntBwaIKavgEuCw+Sf2YZdgTVhDA==", - "dev": true, - "requires": { - "@angular-devkit/build-optimizer": "0.3.2", - "@angular-devkit/core": "0.3.2", - "@angular-devkit/schematics": "0.3.2", - "@ngtools/json-schema": "1.2.0", - "@ngtools/webpack": "1.10.2", - "@schematics/angular": "0.3.2", - "@schematics/package-update": "0.3.2", - "ajv": "6.5.2", - "autoprefixer": "7.2.6", - "cache-loader": "1.2.2", - "chalk": "2.2.2", - "circular-dependency-plugin": "4.4.0", - "clean-css": "4.2.0", - "common-tags": "1.8.0", - "copy-webpack-plugin": "4.4.3", - "core-object": "3.1.5", - "denodeify": "1.2.1", - "ember-cli-string-utils": "1.1.0", - "extract-text-webpack-plugin": "3.0.2", - "file-loader": "1.1.11", - "fs-extra": "4.0.3", - "glob": "7.1.2", - "html-webpack-plugin": "2.30.1", - "istanbul-instrumenter-loader": "3.0.1", - "karma-source-map-support": "1.3.0", - "less": "2.7.3", - "less-loader": "4.1.0", - "license-webpack-plugin": "1.4.0", - "loader-utils": "1.1.0", - "lodash": "4.17.10", - "memory-fs": "0.4.1", - "minimatch": "3.0.4", - "node-modules-path": "1.0.1", - "node-sass": "4.9.2", - "nopt": "4.0.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "postcss": "6.0.23", - "postcss-import": "11.1.0", - "postcss-loader": "2.1.6", - "postcss-url": "7.3.2", - "raw-loader": "0.5.1", - "resolve": "1.8.1", - "rxjs": "5.5.11", - "sass-loader": "6.0.7", - "semver": "5.5.0", - "silent-error": "1.1.0", - "source-map-support": "0.4.18", - "style-loader": "0.19.1", - "stylus": "0.54.5", - "stylus-loader": "3.0.2", - "uglifyjs-webpack-plugin": "1.2.7", - "url-loader": "0.6.2", - "webpack": "3.11.0", - "webpack-dev-middleware": "1.12.2", - "webpack-dev-server": "2.11.2", - "webpack-merge": "4.1.4", - "webpack-sources": "1.1.0", - "webpack-subresource-integrity": "1.0.4" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", - "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "chokidar": "1.7.0", - "rxjs": "5.5.11", - "source-map": "0.5.7" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - } - } - }, - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - }, - "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "@angular/common": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.1.1.tgz", - "integrity": "sha512-SFRzdDthoiKaMLuV+TAwjKXFWwTRFGuidlWC3BhUf8/HzNSePAdvfdQcqbEaE5buMn403OV105S9Tyx5tILQeA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.1.1.tgz", - "integrity": "sha512-k4J2kRiBjtjkDcDut2JVUpqQGLJWd8j3Don+swzZHuEklbLmsVRGM6u/fmH0K9TMwKHtC5Ycap8kj4bWXUYfwg==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/compiler-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.1.1.tgz", - "integrity": "sha512-X3n1V0fAsZzJDRLM2OPiOri8rrQ2ILFS0VDqPdHMa1HbpF0ZKe1Yyux2rhGSbS83a1Eanx6RqfDkrUalKEprbw==", - "dev": true, - "requires": { - "chokidar": "1.7.0", - "minimist": "1.2.0", - "reflect-metadata": "0.1.10", - "tsickle": "0.25.6" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "@angular/core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.1.1.tgz", - "integrity": "sha512-8HJ0lNM5Z+pf+JfOl5mAWgNfrdtnMhVcEGCEniJAQweKOfYCziuyB0ALkX/Q6jGmd2IshR36SarwCYEc5ttt/w==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/flex-layout": { - "version": "2.0.0-beta.12", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-2.0.0-beta.12.tgz", - "integrity": "sha512-QTOKZxehYTh8fj64V/pNVWNbfNtebSbssyMIXiGJuHTzfyF7GYdRmtjoR2pNpllycz3rE5NYX77EB140Y6BCnw==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/forms": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.1.1.tgz", - "integrity": "sha512-4iN/8N0DgnV82XIb/8PqlFIGrog8BHJlzQ9sdAlpT29biPFezFpqpsXkjLBouBc7oBFTgoyXMgWDj8IGRmwLGQ==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/http": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.1.1.tgz", - "integrity": "sha512-oeiLX00TaFlGS5Y4EAGnxxVitN8T9X8olhSC+XDDAAL3JHTAyh4dj7me8vNZk1VaqPFa9AXu4D34vu1Zsm0c1g==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/language-service": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.0.0.tgz", - "integrity": "sha1-bMu2n0dXJw3QTsWFfTdjSy8CxAw=", - "dev": true - }, - "@angular/material": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.1.1.tgz", - "integrity": "sha512-RC3xkbX35daNq4w+XBmm+Vgi16TJvLbSkw5xkdxCqLSysFx9ymwDOjUbLeHt2nJtvYWvnSjuVukdSAeaBknTFg==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/material-moment-adapter": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-5.1.1.tgz", - "integrity": "sha512-1wpISrZOHmcC2o0tmOHX2Lt726WFUZxQs0iYe3x2yHVuxoV2W8gy0unfPkSyaZQ9v68o9xQ3DQEhSByPhr0tZg==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.1.1.tgz", - "integrity": "sha512-QpkNXoO2pqURQJxXPhZo6RFeirKbr56O0SwoMpYfXGGN1qEIicoWZHobCUTp7/jvjx5Xjc7886Fvu/qJrE7wVA==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/platform-browser-dynamic": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.1.1.tgz", - "integrity": "sha512-xnin1eK5nF7EO4tYZvRlhT28DyhL3p4NKWsZQwfqyBwSF0T2mJ1vjhjCZVT0MmaOyt5D+0eUkHIhBDqeZyBMMQ==", - "requires": { - "tslib": "1.9.3" - } - }, - "@angular/router": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.1.1.tgz", - "integrity": "sha512-96mBZS1b1Dt7HFOGKh5zI/1U6F3zT4cdjIaBmcCKkbyKhs3WRAPXxxCkuCwr6lWmBeQt4iEvSdXiHQbD0iCG7Q==", - "requires": { - "tslib": "1.9.3" - } - }, - "@mat-datetimepicker/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-2.0.1.tgz", - "integrity": "sha1-4NsdtdTPe6Vrck7AQIF8totXdfI=", - "requires": { - "tslib": "1.9.3" - } - }, - "@mat-datetimepicker/moment": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@mat-datetimepicker/moment/-/moment-2.0.1.tgz", - "integrity": "sha1-Yr0WQ23j2ds9roFyEYNMMpqdhvA=", - "requires": { - "tslib": "1.9.3" - } - }, - "@ngtools/json-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", - "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", - "dev": true - }, - "@ngtools/webpack": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", - "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", - "dev": true, - "requires": { - "chalk": "2.2.2", - "enhanced-resolve": "3.4.1", - "loader-utils": "1.1.0", - "magic-string": "0.22.5", - "semver": "5.5.0", - "source-map": "0.5.7", - "tree-kill": "1.2.0", - "webpack-sources": "1.1.0" - } - }, - "@ngx-translate/core": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-10.0.2.tgz", - "integrity": "sha512-7nM3DrJaqKswwtJlbu2kuKNl+hE8Isr18sKsKvGGpSxQk+G0gO0reDlx2PhUNus7TJTkA1C59vU/JoN8hIvZ4g==", - "requires": { - "tslib": "1.9.3" - } - }, - "@schematics/angular": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", - "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", - "dev": true, - "requires": { - "typescript": "2.6.2" - } - }, - "@schematics/package-update": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", - "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", - "dev": true, - "requires": { - "rxjs": "5.5.11", - "semver": "5.5.0", - "semver-intersect": "1.3.1" - }, - "dependencies": { - "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "@types/jasmine": { - "version": "2.5.54", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", - "dev": true, - "requires": { - "@types/jasmine": "2.5.54" - } - }, - "@types/node": { - "version": "6.0.115", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.115.tgz", - "integrity": "sha512-PWA07jqflLli+PAk7VaJn0MVdTw96egk5B1FxwocV/tcc3RamNGbza1ZgS0OGUsTuAYCFCboL+IlG2bPazV2Nw==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "2.53.43", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "2.1.19", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.2", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "alfresco-js-api": { - "version": "2.5.0-d5acbab9993711f37b66351a6aaedf6fc72d1ce2", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.5.0-d5acbab9993711f37b66351a6aaedf6fc72d1ce2.tgz", - "integrity": "sha512-tcwfDzOHvgWchmpurmiRT6XwyojxZ02pr/fM+w36sU5sWyAlgsf2PNiOEzPaYCOC64FOOyNOK9XZOeQZkgs6Uw==", - "requires": { - "event-emitter": "0.3.4", - "jsrsasign": "8.0.12", - "superagent": "3.8.2" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.2" - }, - "dependencies": { - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true - } - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "app-root-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", - "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "2.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0" - } - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "autoprefixer": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", - "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", - "dev": true, - "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000874", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.23", - "postcss-value-parser": "3.3.0" - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "2.0.3" - } - }, - "blocking-proxy": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" - }, - "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000874", - "electron-to-chromium": "1.3.55" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "1.1.0", - "buffer-fill": "1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.3", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cache-loader": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", - "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "schema-utils": "0.4.5" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30000874", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000874.tgz", - "integrity": "sha512-29nr1EPiHwrJTAHHsEmTt2h+55L8j2GNFdAcYPlRy2NX6iFz7ZZiepVI7kP/QqlnHLq3KvfWpbmGa0d063U09w==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "chart.js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.5.0.tgz", - "integrity": "sha1-/m51Gok3afVucr7lrZEgfhxZKVc=", - "requires": { - "chartjs-color": "2.2.0", - "moment": "2.20.1" - } - }, - "chartjs-color": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.2.0.tgz", - "integrity": "sha1-hKL7dVeH7YXDndbdjHsdiEKbrq4=", - "requires": { - "chartjs-color-string": "0.5.0", - "color-convert": "0.5.3" - } - }, - "chartjs-color-string": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.5.0.tgz", - "integrity": "sha512-amWNvCOXlOUYxZVDSa0YOab5K/lmEhbFNKI55PWc4mlv28BDzA7zaoQTGxSBgJMHIW+hGX8YUrvw/FH4LyhwSQ==", - "requires": { - "color-name": "1.1.3" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.4", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "circular-dependency-plugin": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", - "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "classlist.js": { - "version": "1.1.20150312", - "resolved": "https://registry.npmjs.org/classlist.js/-/classlist.js-1.1.20150312.tgz", - "integrity": "sha1-HXCEL3Ai8I2awIbOaeWyUPLFd4k=" - }, - "clean-css": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.0.tgz", - "integrity": "sha1-Cp1iBAzdx5BMXtrum97KZC2bnBw=", - "dev": true, - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", - "dev": true, - "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codelyzer": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-3.2.2.tgz", - "integrity": "sha512-VNvW9gRThsqRarEnLioiILd0Pdk0yCq/7cVgYvqHpC+3CHqfnrJfmXjoana7vzWfSis+9pODXofjCWX+nlU9Gw==", - "dev": true, - "requires": { - "app-root-path": "2.1.0", - "css-selector-tokenizer": "0.7.0", - "cssauron": "1.4.0", - "semver-dsl": "1.0.1", - "source-map": "0.5.7", - "sprintf-js": "1.0.3" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", - "dev": true - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", - "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", - "dev": true, - "requires": { - "mime-db": "1.35.0" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, - "requires": { - "accepts": "1.3.5", - "bytes": "3.0.0", - "compressible": "2.0.14", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.2", - "vary": "1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", - "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "globby": "7.1.1", - "is-glob": "4.0.0", - "loader-utils": "1.1.0", - "minimatch": "3.0.4", - "p-limit": "1.3.0", - "serialize-javascript": "1.5.0" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" - }, - "core-object": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", - "dev": true, - "requires": { - "chalk": "2.2.2" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" - } - } - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "4.1.3", - "which": "1.3.1" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" - } - }, - "css-parse": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", - "dev": true - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "custom-event-polyfill": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-0.3.0.tgz", - "integrity": "sha1-mYB4Ob5i7bRGtkWDLg2A6tb6GIg=" - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "requires": { - "es5-ext": "0.10.45" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "dev": true, - "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "1.1.1" - } - }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", - "dev": true, - "requires": { - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.2", - "void-elements": "2.0.1" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.55", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.55.tgz", - "integrity": "sha1-8VDhCyC3fZ1Br8yjEu/gw7Gn/c4=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.5", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "ember-cli-string-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", - "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.19", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.45" - } - } - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.45" - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - } - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.45" - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - } - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.45" - } - } - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.45" - } - } - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eve-raphael": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", - "integrity": "sha1-F8dUt5K+7z+maE15z1pHxjxM2jA=" - }, - "event-emitter": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", - "integrity": "sha1-jWPd+0z+H647MsomXExyAiIIC7U=", - "requires": { - "d": "0.1.1", - "es5-ext": "0.10.45" - } - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, - "requires": { - "original": "1.0.1" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" - } - } - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - }, - "dependencies": { - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.4" - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.4", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", - "dev": true, - "requires": { - "async": "2.6.1", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.5.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.4.5" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "follow-redirects": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.2.tgz", - "integrity": "sha512-kssLorP/9acIdpQ2udQVTiCS5LQmdEz9mvdIfDcl1gYX2tPKFADHSyFdvJS040XdFsPzemWtgI3q8mFVCxtX8A==", - "dev": true, - "requires": { - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.19" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "1.0.0" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "optional": true, - "requires": { - "globule": "1.2.1" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "minimatch": "3.0.4" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.5", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.19", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.19.tgz", - "integrity": "sha512-Qr2JC9nsjK8oCrEmuB430ZIA8YWbF3D5LSjywD75FTuXmeqacwHgIM8wp3vHYzzPbklSjp53RdmDuzR4ub2HzA==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.16.0", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.6" - }, - "dependencies": { - "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - } - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.19", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "pretty-error": "2.1.1", - "toposort": "1.0.7" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.4.0" - } - }, - "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.5.2", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "1.17.0", - "is-glob": "3.1.0", - "lodash": "4.17.10", - "micromatch": "2.3.11" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.2" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "2.1.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true, - "optional": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", - "dev": true, - "requires": { - "meow": "3.7.0" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "intl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", - "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.4.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "1.0.1" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.3" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "1.2.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", - "dev": true, - "requires": { - "async": "2.6.1", - "compare-versions": "3.3.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.1", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.5", - "istanbul-reports": "1.3.0", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - } - }, - "istanbul-instrumenter-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", - "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", - "dev": true, - "requires": { - "convert-source-map": "1.5.1", - "istanbul-lib-instrument": "1.10.1", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.5.2" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", - "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", - "dev": true, - "requires": { - "append-transform": "1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", - "dev": true, - "requires": { - "handlebars": "4.0.11" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "jasmine": { - "version": "2.99.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", - "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.99.1" - }, - "dependencies": { - "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", - "dev": true - } - } - }, - "jasmine-core": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", - "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", - "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "js-base64": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", - "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "jsrsasign": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-8.0.12.tgz", - "integrity": "sha1-Iqu5ZW00owuVMENnIINeicLlwxY=" - }, - "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.6", - "core-js": "2.4.1", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.17.0", - "isbinaryfile": "3.0.3", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.6.0", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.2.0", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.2", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.3.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - } - } - }, - "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.1" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "1.8.1" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", - "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", - "dev": true, - "requires": { - "istanbul-api": "1.3.1", - "minimatch": "3.0.4" - } - }, - "karma-jasmine": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", - "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", - "dev": true - }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", - "dev": true, - "requires": { - "karma-jasmine": "1.1.2" - } - }, - "karma-source-map-support": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", - "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", - "dev": true, - "requires": { - "source-map-support": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } - } - } - }, - "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "requires": { - "errno": "0.1.7", - "graceful-fs": "4.1.11", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.7" - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "2.1.2", - "loader-utils": "1.1.0", - "pify": "3.0.0" - } - }, - "license-webpack-plugin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.4.0.tgz", - "integrity": "sha512-iwuNFMWbXS76WiQXJBTs8/7Tby4NQnY8AIkBMuJG5El79UT8zWrJQMfpW+KRXt4Y2Bs5uk+Myg/MO7ROSF8jzA==", - "dev": true, - "requires": { - "ejs": "2.6.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true, - "optional": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true, - "optional": true - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "0.2.3" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" - }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "requires": { - "mime-db": "1.35.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.3" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "moment-es6": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/moment-es6/-/moment-es6-1.0.0.tgz", - "integrity": "sha1-VS/PQF1iVlsKH+hObB5peseTMt8=", - "requires": { - "moment": "2.20.1" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "ng2-charts": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-1.6.0.tgz", - "integrity": "sha512-9w0WH69x5/nuqC1og2WaY39NbaBqTGIP1+5gZaH7/KPN6UEPonNg/pYnsIVklLj1DWPWXKa8+XXIJZ1jy5nLxg==", - "requires": { - "chart.js": "2.7.2" - }, - "dependencies": { - "chart.js": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.7.2.tgz", - "integrity": "sha512-90wl3V9xRZ8tnMvMlpcW+0Yg13BelsGS9P9t0ClaDxv/hdypHDr/YAGf+728m11P5ljwyB0ZHfPKCapZFqSqYA==", - "requires": { - "chartjs-color": "2.2.0", - "moment": "2.20.1" - } - } - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "1.1.4" - } - }, - "node-ensure": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz", - "integrity": "sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=" - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", - "dev": true - }, - "node-gyp": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", - "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true - } - } - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.4", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", - "dev": true - }, - "node-sass": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.2.tgz", - "integrity": "sha512-LdxoJLZutx0aQXHtWIYwJKMj+9pTjneTcLWJgzf2XbGu0q5pRNqW5QvFCEdm3mc5rJOdru/mzln5d0EZLacf6g==", - "dev": true, - "optional": true, - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.10.0", - "node-gyp": "3.7.0", - "npmlog": "4.1.2", - "request": "2.87.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.0", - "true-case-path": "1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "optional": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - } - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.4" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "dev": true, - "requires": { - "is-wsl": "1.1.0" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", - "dev": true, - "requires": { - "url-parse": "1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.3.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "2.3.2" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.2" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, - "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "pdfjs-dist": { - "version": "1.5.404", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-1.5.404.tgz", - "integrity": "sha1-hYXGUWquIU1ZCXXo+ys8PzrxTO8=", - "requires": { - "node-ensure": "0.0.0" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-import": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", - "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", - "dev": true, - "requires": { - "postcss": "6.0.23", - "postcss-value-parser": "3.3.0", - "read-cache": "1.0.0", - "resolve": "1.8.1" - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "4.0.0", - "import-cwd": "2.1.0" - } - }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.23", - "postcss-load-config": "2.0.0", - "schema-utils": "0.4.5" - } - }, - "postcss-url": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", - "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", - "dev": true, - "requires": { - "mime": "1.6.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "postcss": "6.0.23", - "xxhashjs": "0.2.2" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "2.0.6" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "protractor": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", - "dev": true, - "requires": { - "@types/node": "6.0.115", - "@types/q": "0.0.32", - "@types/selenium-webdriver": "2.53.43", - "blocking-proxy": "0.0.5", - "chalk": "1.1.3", - "glob": "7.1.2", - "jasmine": "2.99.0", - "jasminewd2": "2.2.0", - "optimist": "0.6.1", - "q": "1.4.1", - "saucelabs": "1.3.0", - "selenium-webdriver": "3.0.1", - "source-map-support": "0.4.18", - "webdriver-js-extender": "1.0.0", - "webdriver-manager": "12.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.87.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - } - } - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "3.6.0", - "inherits": "2.0.3", - "pump": "2.0.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raphael": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/raphael/-/raphael-2.2.7.tgz", - "integrity": "sha1-IxsZFB+NCGmG2PrOtm+LVi7iyBA=", - "requires": { - "eve-raphael": "0.5.0" - } - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.2", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.19" - } - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "1.2.0" - } - }, - "rxjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.0.0.tgz", - "integrity": "sha512-2MgLQr1zvks8+Kip4T6hcJdiBhV+SIvxguoWjhwtSpNPTp/5e09HJbgclCwR/nW0yWzhubM+6Q0prl8G5RuoBA==", - "requires": { - "tslib": "1.9.3" - } - }, - "rxjs-compat": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.1.0.tgz", - "integrity": "sha512-x5L1KQy1RqDRpPadN5iDOx71TV9Wqmlmu6OOEn3tFFgaTCB0/N+Lmby/rZHgJ6JEPzzt0nD9Zv+kS53E5JIR5g==" - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - } - }, - "sass-loader": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", - "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", - "dev": true, - "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "neo-async": "2.5.1", - "pify": "3.0.0" - } - }, - "saucelabs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", - "dev": true, - "requires": { - "https-proxy-agent": "1.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", - "dev": true, - "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "optional": true, - "requires": { - "js-base64": "2.4.8", - "source-map": "0.4.4" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selenium-webdriver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "rimraf": "2.6.2", - "tmp": "0.0.30", - "xml2js": "0.4.19" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } - } - }, - "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "5.5.0" - } - }, - "semver-intersect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", - "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", - "dev": true, - "requires": { - "semver": "5.5.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" - }, - "dependencies": { - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "1.3.5", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.19", - "parseurl": "1.3.2" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", - "dev": true, - "requires": { - "is-extendable": "0.1.1", - "kind-of": "5.1.0", - "mixin-object": "2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", - "dev": true, - "requires": { - "debug": "2.6.9" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.2" - } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.3" - }, - "dependencies": { - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": "0.7.0" - } - } - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "dev": true, - "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.2", - "select-hose": "2.0.0", - "spdy-transport": "2.1.0" - } - }, - "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", - "dev": true, - "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2", - "wbuf": "1.7.3" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, - "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", - "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.5.2" - } - } - } - }, - "stylus": { - "version": "0.54.5", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", - "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", - "dev": true, - "requires": { - "css-parse": "1.7.0", - "debug": "2.6.9", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" - }, - "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "stylus-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", - "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" - }, - "dependencies": { - "when": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", - "dev": true - } - } - }, - "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "3.1.0", - "extend": "3.0.2", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "systemjs": { - "version": "0.19.27", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.19.27.tgz", - "integrity": "sha1-8XQNVlzmQ3GsDecHKk0eVHG6e6I=", - "requires": { - "when": "3.7.8" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", - "dev": true - }, - "time-stamp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.1.tgz", - "integrity": "sha512-KUnkvOWC3C+pEbwE/0u3CcmNpGCDqkYGYZOphe1QFxApYQkJ5g195TDBjgZch/zG6chU1NcabLwnM7BCpWAzTQ==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - } - } - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", - "dev": true, - "optional": true, - "requires": { - "glob": "6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "chalk": "2.2.2", - "diff": "3.5.0", - "make-error": "1.3.4", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "3.1.1", - "yn": "2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tsickle": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.6.tgz", - "integrity": "sha1-tZXbFrI2chgk7u2ouyYjZbR+8zQ=", - "dev": true, - "requires": { - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.5.7", - "source-map-support": "0.4.18" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "tslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", - "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "colors": "1.1.2", - "commander": "2.16.0", - "diff": "3.5.0", - "glob": "7.1.2", - "minimatch": "3.0.4", - "resolve": "1.8.1", - "semver": "5.5.0", - "tslib": "1.9.3", - "tsutils": "2.29.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.19" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", - "dev": true - }, - "uglify-js": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.6.tgz", - "integrity": "sha512-O1D7L6WcOzS1qW2ehopEm4cWm5yA6bQBozlks8jO8ODxYCy4zv+bR/la4Lwp01tpkYGNonnpXvUpYtrvSu8Yzg==", - "dev": true, - "requires": { - "commander": "2.16.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", - "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - } - } - } - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "2.1.1" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", - "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "mime": "1.6.0", - "schema-utils": "0.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true, - "requires": { - "ajv": "5.5.2" - } - } - } - }, - "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", - "dev": true, - "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.3", - "tmp": "0.0.31" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "1.0.1" - } - }, - "web-animations-js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.1.tgz", - "integrity": "sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA=" - }, - "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", - "dev": true, - "requires": { - "@types/selenium-webdriver": "2.53.43", - "selenium-webdriver": "2.53.3" - }, - "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", - "dev": true - }, - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", - "dev": true - }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", - "dev": true, - "requires": { - "adm-zip": "0.4.4", - "rimraf": "2.6.2", - "tmp": "0.0.24", - "ws": "1.1.2", - "xml2js": "0.4.4" - } - }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", - "dev": true - }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", - "dev": true, - "requires": { - "sax": "0.6.1", - "xmlbuilder": "9.0.7" - } - } - } - }, - "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", - "dev": true, - "requires": { - "acorn": "5.7.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "async": "2.6.1", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.1" - } - }, - "webpack-dev-server": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "2.0.4", - "compression": "1.7.3", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.3", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "import-local": "1.0.0", - "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.0", - "loglevel": "1.6.1", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.3", - "serve-index": "1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "5.4.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "webpack-merge": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", - "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "webpack-subresource-integrity": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", - "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", - "dev": true, - "requires": { - "webpack-core": "0.6.9" - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": "0.4.13", - "websocket-extensions": "0.1.3" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "1.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "requires": { - "cuint": "0.2.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true, - "optional": true - } - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "optional": true - } - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - }, - "zone.js": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.14.tgz", - "integrity": "sha1-DE2ySxeCMidMy0P3jJnbfzZCts8=" - } - } -} diff --git a/integration/base_ver_2_app/package.json b/integration/base_ver_2_app/package.json deleted file mode 100644 index 8569b549c0..0000000000 --- a/integration/base_ver_2_app/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "adf-cli-acs-aps-template", - "version": "2.0.0", - "blueprint": "Process and Content Services", - "description": "ACS APS ADF Application with Angular CLI", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve --open", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e" - }, - "private": true, - "dependencies": { - "@alfresco/adf-content-services": "2.0.0", - "@alfresco/adf-core": "2.0.0", - "@alfresco/adf-insights": "2.0.1", - "@alfresco/adf-process-services": "2.0.0", - "@angular/animations": "5.1.1", - "@angular/cdk": "5.1.1", - "@angular/common": "5.1.1", - "@angular/compiler": "5.1.1", - "@angular/core": "5.1.1", - "@angular/flex-layout": "2.0.0-beta.12", - "@angular/forms": "5.1.1", - "@angular/http": "5.1.1", - "@angular/material": "5.1.1", - "@angular/material-moment-adapter": "5.1.1", - "@angular/platform-browser": "5.1.1", - "@angular/platform-browser-dynamic": "5.1.1", - "@angular/router": "5.1.1", - "@mat-datetimepicker/core": "^2.0.1", - "@mat-datetimepicker/moment": "^2.0.1", - "@ngx-translate/core": "10.0.2", - "alfresco-js-api": "^2.5.0-d5acbab9993711f37b66351a6aaedf6fc72d1ce2", - "chart.js": "2.5.0", - "classlist.js": "1.1.20150312", - "core-js": "2.4.1", - "custom-event-polyfill": "0.3.0", - "hammerjs": "2.0.8", - "intl": "1.2.5", - "minimatch": "3.0.4", - "moment": "2.20.1", - "moment-es6": "1.0.0", - "ng2-charts": "1.6.0", - "pdfjs-dist": "1.5.404", - "raphael": "2.2.7", - "reflect-metadata": "0.1.10", - "rxjs": "6.0.0", - "rxjs-compat": "6.1.0", - "web-animations-js": "2.3.1", - "zone.js": "0.8.14" - }, - "devDependencies": { - "@angular-devkit/core": "0.0.28", - "@angular/cli": "1.7.4", - "@angular/compiler-cli": "5.1.1", - "@angular/language-service": "5.0.0", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/node": "~6.0.60", - "codelyzer": "~3.2.0", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.1.2", - "rimraf": "^2.6.2", - "ts-node": "~3.2.0", - "tslint": "~5.7.0", - "typescript": "2.6.2" - } -} diff --git a/integration/base_ver_2_app/protractor-ci.conf.js b/integration/base_ver_2_app/protractor-ci.conf.js deleted file mode 100644 index d575c56720..0000000000 --- a/integration/base_ver_2_app/protractor-ci.conf.js +++ /dev/null @@ -1,10 +0,0 @@ -const config = require('./protractor.conf').config; - -config.capabilities = { - browserName: 'chrome', - chromeOptions: { - args: ['--no-sandbox'] - } -}; - -exports.config = config; diff --git a/integration/base_ver_2_app/protractor.conf.js b/integration/base_ver_2_app/protractor.conf.js deleted file mode 100644 index d8a99e3473..0000000000 --- a/integration/base_ver_2_app/protractor.conf.js +++ /dev/null @@ -1,29 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 40000, - getPageTimeout: 40000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/integration/base_ver_2_app/proxy.conf.json b/integration/base_ver_2_app/proxy.conf.json deleted file mode 100644 index 58325541be..0000000000 --- a/integration/base_ver_2_app/proxy.conf.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "/alfresco": { - "target": "http://localhost:8080", - "secure": false, - "changeOrigin": true - }, - "/activiti-app": { - "target": "http://localhost:9999", - "secure": false, - "changeOrigin": true - } -} diff --git a/integration/base_ver_2_app/src/app.config.json b/integration/base_ver_2_app/src/app.config.json deleted file mode 100644 index 2dc5c322c4..0000000000 --- a/integration/base_ver_2_app/src/app.config.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "ecmHost": "http://{hostname}{:port}", - "bpmHost": "http://{hostname}{:port}", - "application": { - "name": "Alfresco ADF Appplication" - }, - "languages": [ - { - "key": "en", - "label": "English" - }, - { - "key": "fr", - "label": "French" - }, - { - "key": "de", - "label": "German" - }, - { - "key": "it", - "label": "Italian" - }, - { - "key": "es", - "label": "Spanish" - }, - { - "key": "ja", - "label": "Japanese" - }, - { - "key": "nl", - "label": "Dutch" - }, - { - "key": "pt-BR", - "label": "Brazilian Portuguese" - }, - { - "key": "nb", - "label": "Norwegian" - }, - { - "key": "ru", - "label": "Russian" - }, - { - "key": "zh-CN", - "label": "Simplified Chinese" - } - ], - "logLevel" : "trace" -} diff --git a/integration/base_ver_2_app/src/app/adf.module.ts b/integration/base_ver_2_app/src/app/adf.module.ts deleted file mode 100644 index 59e70e7a66..0000000000 --- a/integration/base_ver_2_app/src/app/adf.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; - -// ADF modules -import { ContentModule } from '@alfresco/adf-content-services'; -import { ProcessModule } from '@alfresco/adf-process-services'; -import { CoreModule } from '@alfresco/adf-core'; - -export function modules() { - return [ - CoreModule, - ContentModule, - ProcessModule - ]; -} - -@NgModule({ - imports: modules(), - exports: modules() -}) -export class AdfModule {} diff --git a/integration/base_ver_2_app/src/app/app.component.html b/integration/base_ver_2_app/src/app/app.component.html deleted file mode 100644 index c578d2381a..0000000000 --- a/integration/base_ver_2_app/src/app/app.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - - ADF - - - Login - Apps - Documents - - - - - diff --git a/integration/base_ver_2_app/src/app/app.component.spec.ts b/integration/base_ver_2_app/src/app/app.component.spec.ts deleted file mode 100644 index cba6591526..0000000000 --- a/integration/base_ver_2_app/src/app/app.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { TestBed, async } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { AdfModule } from './adf.module'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - AdfModule - ], - declarations: [ - AppComponent - ], - }).compileComponents(); - })); - - it('should create the app', async(() => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - })); -}); diff --git a/integration/base_ver_2_app/src/app/app.component.ts b/integration/base_ver_2_app/src/app/app.component.ts deleted file mode 100644 index 8038e21fd2..0000000000 --- a/integration/base_ver_2_app/src/app/app.component.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component } from '@angular/core'; -import { TranslationService, AuthenticationService } from '@alfresco/adf-core'; -import { Router } from '@angular/router'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - - constructor(translationService: TranslationService, - private authService: AuthenticationService, - private router: Router) { - translationService.use('en'); - } - - logout() { - this.authService.logout().subscribe(() => { - this.router.navigate(['/login']); - }); - } - -} diff --git a/integration/base_ver_2_app/src/app/app.module.ts b/integration/base_ver_2_app/src/app/app.module.ts deleted file mode 100644 index 21f8f02c2d..0000000000 --- a/integration/base_ver_2_app/src/app/app.module.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// ADF modules -import { AdfModule } from './adf.module'; -import { AuthGuardBpm } from '@alfresco/adf-core'; -import { AuthGuardEcm } from '@alfresco/adf-core'; - -// Custom stencils -import { StencilsModule } from './stencils.module'; - -// App components -import { AppComponent } from './app.component'; -import { HomeComponent } from './home/home.component'; -import { LoginComponent } from './login/login.component'; -import { AppsComponent } from './apps/apps.component'; -import { TasksComponent } from './tasks/tasks.component'; -import { TaskDetailsComponent } from './task-details/task-details.component'; -import { DocumentlistComponent } from './documentlist/documentlist.component'; -import { StartProcessComponent } from './start-process/start-process.component'; - -const appRoutes: Routes = [ - { - path: '', - component: HomeComponent - }, - { - path: 'login', - component: LoginComponent - }, - { - path: 'apps', - component: AppsComponent, - canActivate: [ AuthGuardBpm ] - }, - { - path: 'apps/:appId/tasks', - component: TasksComponent, - canActivate: [ AuthGuardBpm ] - }, - { - path: 'apps/:appId/tasks/:taskId', - component: TaskDetailsComponent, - canActivate: [ AuthGuardBpm ] - }, - { - path: 'apps/:appId/start-process', - component: StartProcessComponent, - canActivate: [ AuthGuardBpm ] - }, - { - path: 'documentlist', - component: DocumentlistComponent, - canActivate: [ AuthGuardEcm ] - } -]; - -@NgModule({ - imports: [ - BrowserModule, - RouterModule.forRoot( - appRoutes // , - // { enableTracing: true } // <-- debugging purposes only - ), - - // ADF modules - AdfModule, - - StencilsModule - ], - declarations: [ - AppComponent, - AppsComponent, - HomeComponent, - LoginComponent, - TasksComponent, - TaskDetailsComponent, - DocumentlistComponent, - StartProcessComponent - ], - bootstrap: [AppComponent] -}) -export class AppModule { } diff --git a/integration/base_ver_2_app/src/app/apps/apps.component.css b/integration/base_ver_2_app/src/app/apps/apps.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/apps/apps.component.html b/integration/base_ver_2_app/src/app/apps/apps.component.html deleted file mode 100644 index e9f2d08ba5..0000000000 --- a/integration/base_ver_2_app/src/app/apps/apps.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/integration/base_ver_2_app/src/app/apps/apps.component.ts b/integration/base_ver_2_app/src/app/apps/apps.component.ts deleted file mode 100644 index b526f370b4..0000000000 --- a/integration/base_ver_2_app/src/app/apps/apps.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component } from '@angular/core'; -import { Router } from '@angular/router'; -import { AppDefinitionRepresentationModel } from '@alfresco/adf-process-services'; - -@Component({ - selector: 'app-apps', - templateUrl: './apps.component.html', - styleUrls: ['./apps.component.css'] -}) -export class AppsComponent { - - constructor(private router: Router) { } - - onAppClicked(app: AppDefinitionRepresentationModel) { - this.router.navigate(['/apps', app.id || 0, 'tasks']); - } - -} diff --git a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.css b/integration/base_ver_2_app/src/app/documentlist/documentlist.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.html b/integration/base_ver_2_app/src/app/documentlist/documentlist.component.html deleted file mode 100644 index 64863a1653..0000000000 --- a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.spec.ts b/integration/base_ver_2_app/src/app/documentlist/documentlist.component.spec.ts deleted file mode 100644 index b363977747..0000000000 --- a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Location } from '@angular/common'; -import { SpyLocation } from '@angular/common/testing'; - -import { AdfModule } from '../adf.module'; -import { DocumentlistComponent } from './documentlist.component'; - -describe('DocumentlistComponent', () => { - let component: DocumentlistComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - AdfModule - ], - declarations: [ DocumentlistComponent ], - providers: [ - { provide: Location, useClass: SpyLocation } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DocumentlistComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.ts b/integration/base_ver_2_app/src/app/documentlist/documentlist.component.ts deleted file mode 100644 index 34295235d9..0000000000 --- a/integration/base_ver_2_app/src/app/documentlist/documentlist.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { NotificationService } from '@alfresco/adf-core'; -import { DocumentListComponent } from '@alfresco/adf-content-services'; - -@Component({ - selector: 'app-documentlist', - templateUrl: './documentlist.component.html', - styleUrls: ['./documentlist.component.css'] -}) -export class DocumentlistComponent implements OnInit { - - showViewer: Boolean = false; - nodeId: String = null; - - @ViewChild(DocumentListComponent) - documentList: DocumentListComponent; - - constructor(private notificationService: NotificationService) { } - - ngOnInit() { - } - - uploadSuccess(event: any) { - this.notificationService.openSnackMessage('File uploaded'); - this.documentList.reload(); - } - - showPreview(event) { - this.showViewer = false; - if (event.value.entry.isFile) { - this.nodeId = event.value.entry.id; - this.showViewer = true; - } - } - - onGoBack(event: any) { - this.showViewer = false; - this.nodeId = null; - } - -} diff --git a/integration/base_ver_2_app/src/app/home/home.component.css b/integration/base_ver_2_app/src/app/home/home.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/home/home.component.html b/integration/base_ver_2_app/src/app/home/home.component.html deleted file mode 100644 index 7859f272f6..0000000000 --- a/integration/base_ver_2_app/src/app/home/home.component.html +++ /dev/null @@ -1 +0,0 @@ -

Please select a feature in the app menu

diff --git a/integration/base_ver_2_app/src/app/home/home.component.spec.ts b/integration/base_ver_2_app/src/app/home/home.component.spec.ts deleted file mode 100644 index 86774ae217..0000000000 --- a/integration/base_ver_2_app/src/app/home/home.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { HomeComponent } from './home.component'; - -describe('HomeComponent', () => { - let component: HomeComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ HomeComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(HomeComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/home/home.component.ts b/integration/base_ver_2_app/src/app/home/home.component.ts deleted file mode 100644 index 33fd77077e..0000000000 --- a/integration/base_ver_2_app/src/app/home/home.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-home', - templateUrl: './home.component.html', - styleUrls: ['./home.component.css'] -}) -export class HomeComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/integration/base_ver_2_app/src/app/login/login.component.css b/integration/base_ver_2_app/src/app/login/login.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/login/login.component.html b/integration/base_ver_2_app/src/app/login/login.component.html deleted file mode 100644 index 679611b729..0000000000 --- a/integration/base_ver_2_app/src/app/login/login.component.html +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/integration/base_ver_2_app/src/app/login/login.component.spec.ts b/integration/base_ver_2_app/src/app/login/login.component.spec.ts deleted file mode 100644 index c02862901b..0000000000 --- a/integration/base_ver_2_app/src/app/login/login.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { AdfModule } from '../adf.module'; -import { LoginComponent } from './login.component'; - -describe('LoginComponent', () => { - let component: LoginComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - AdfModule - ], - declarations: [ LoginComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(LoginComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/login/login.component.ts b/integration/base_ver_2_app/src/app/login/login.component.ts deleted file mode 100644 index cafd4f58a5..0000000000 --- a/integration/base_ver_2_app/src/app/login/login.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'] -}) -export class LoginComponent { - - constructor() { } - -} diff --git a/integration/base_ver_2_app/src/app/start-process/start-process.component.html b/integration/base_ver_2_app/src/app/start-process/start-process.component.html deleted file mode 100644 index 2ff16af907..0000000000 --- a/integration/base_ver_2_app/src/app/start-process/start-process.component.html +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/integration/base_ver_2_app/src/app/start-process/start-process.component.scss b/integration/base_ver_2_app/src/app/start-process/start-process.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/start-process/start-process.component.spec.ts b/integration/base_ver_2_app/src/app/start-process/start-process.component.spec.ts deleted file mode 100644 index ac99e84de9..0000000000 --- a/integration/base_ver_2_app/src/app/start-process/start-process.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { AdfModule } from '../adf.module'; -import { StartProcessComponent } from './start-process.component'; - -describe('StartProcessComponent', () => { - let component: StartProcessComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - AdfModule - ], - declarations: [ StartProcessComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(StartProcessComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/start-process/start-process.component.ts b/integration/base_ver_2_app/src/app/start-process/start-process.component.ts deleted file mode 100644 index 6c590d690d..0000000000 --- a/integration/base_ver_2_app/src/app/start-process/start-process.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ProcessInstance } from '@alfresco/adf-process-services'; - -@Component({ - selector: 'app-start-process', - templateUrl: './start-process.component.html', - styleUrls: ['./start-process.component.scss'] -}) -export class StartProcessComponent implements OnInit { - - appId: string = null; - - constructor(private router: Router, - private route: ActivatedRoute) { } - - ngOnInit() { - this.route.params.subscribe(params => { - if (params.appId && params.appId !== '0') { - this.appId = params.appId; - } else { - this.router.navigate(['/apps']); - } - }); - } - - onProcessStarted(process: ProcessInstance) { - this.router.navigate(['/apps', this.appId || 0, 'tasks']); - } - - onCancelStartProcess() { - this.router.navigate(['/apps', this.appId || 0, 'tasks']); - } -} diff --git a/integration/base_ver_2_app/src/app/stencils.module.ts b/integration/base_ver_2_app/src/app/stencils.module.ts deleted file mode 100644 index bb70ad99a0..0000000000 --- a/integration/base_ver_2_app/src/app/stencils.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* tslint:disable */ - -import { Component, NgModule } from '@angular/core'; -import { WidgetComponent } from '@alfresco/adf-core'; - -@Component({ - selector: 'custom-editor', - template: ` -
Look, I'm a custom editor!
- ` -}) -export class CustomEditorComponent extends WidgetComponent { - - constructor() { - super(); - } -} - -@Component({ - selector: 'custom-stencil-01', - template: `
ADF version of custom Activiti stencil
` -}) -export class CustomStencil01 extends WidgetComponent { - - constructor() { - super(); - } -} - -@NgModule({ - declarations: [ - CustomEditorComponent, - CustomStencil01 - ], - exports: [ - CustomEditorComponent, - CustomStencil01 - ], - entryComponents: [ - CustomEditorComponent, - CustomStencil01 - ] -}) -export class StencilsModule {} diff --git a/integration/base_ver_2_app/src/app/task-details/task-details.component.css b/integration/base_ver_2_app/src/app/task-details/task-details.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/task-details/task-details.component.html b/integration/base_ver_2_app/src/app/task-details/task-details.component.html deleted file mode 100644 index ac5c3edf5b..0000000000 --- a/integration/base_ver_2_app/src/app/task-details/task-details.component.html +++ /dev/null @@ -1,15 +0,0 @@ -

Task details

- - - - -
- - -
\ No newline at end of file diff --git a/integration/base_ver_2_app/src/app/task-details/task-details.component.spec.ts b/integration/base_ver_2_app/src/app/task-details/task-details.component.spec.ts deleted file mode 100644 index c26097a072..0000000000 --- a/integration/base_ver_2_app/src/app/task-details/task-details.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { AdfModule } from '../adf.module'; -import { TaskDetailsComponent } from './task-details.component'; - -describe('TaskDetailsComponent', () => { - let component: TaskDetailsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - AdfModule - ], - declarations: [ TaskDetailsComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TaskDetailsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/task-details/task-details.component.ts b/integration/base_ver_2_app/src/app/task-details/task-details.component.ts deleted file mode 100644 index 9af9c02ca0..0000000000 --- a/integration/base_ver_2_app/src/app/task-details/task-details.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { FormRenderingService } from '@alfresco/adf-core'; -import { CustomEditorComponent } from '../stencils.module'; - -@Component({ - selector: 'app-task-details', - templateUrl: './task-details.component.html', - styleUrls: ['./task-details.component.css'] -}) -export class TaskDetailsComponent implements OnInit { - - appId: string = null; - taskId: string = null; - fileShowed: any = null; - content: any = null; - contentName: any = null; - - constructor(private router: Router, - private route: ActivatedRoute, - formRenderingService: FormRenderingService) { - formRenderingService.setComponentTypeResolver('testole_01', () => CustomEditorComponent, true); - } - - ngOnInit() { - this.route.params.subscribe(params => { - if (params.appId && params.appId !== '0') { - this.appId = params.appId; - } - if (params.taskId) { - this.taskId = params.taskId; - } - }); - } - - onFormContentClick(content: any): void { - this.fileShowed = true; - this.content = content.contentBlob; - this.contentName = content.name; - } - -} diff --git a/integration/base_ver_2_app/src/app/tasks/tasks.component.css b/integration/base_ver_2_app/src/app/tasks/tasks.component.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/app/tasks/tasks.component.html b/integration/base_ver_2_app/src/app/tasks/tasks.component.html deleted file mode 100644 index 0ebbea928b..0000000000 --- a/integration/base_ver_2_app/src/app/tasks/tasks.component.html +++ /dev/null @@ -1,12 +0,0 @@ -

Tasks

- - - Start new process - - - - diff --git a/integration/base_ver_2_app/src/app/tasks/tasks.component.spec.ts b/integration/base_ver_2_app/src/app/tasks/tasks.component.spec.ts deleted file mode 100644 index 33bc600895..0000000000 --- a/integration/base_ver_2_app/src/app/tasks/tasks.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -import { AdfModule } from '../adf.module'; -import { TasksComponent } from './tasks.component'; - -describe('TasksComponent', () => { - let component: TasksComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - AdfModule - ], - declarations: [ TasksComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TasksComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/integration/base_ver_2_app/src/app/tasks/tasks.component.ts b/integration/base_ver_2_app/src/app/tasks/tasks.component.ts deleted file mode 100644 index 78cb3cbfb7..0000000000 --- a/integration/base_ver_2_app/src/app/tasks/tasks.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; - -@Component({ - selector: 'app-tasks', - templateUrl: './tasks.component.html', - styleUrls: ['./tasks.component.css'] -}) -export class TasksComponent implements OnInit { - - appId: string = null; - - constructor(private router: Router, - private route: ActivatedRoute) { } - - ngOnInit() { - this.route.params.subscribe(params => { - const applicationId = params['appId']; - if (applicationId && applicationId !== '0') { - this.appId = params['appId']; - } - }); - } - - onRowClick(taskId: string) { - if (taskId) { - this.router.navigate(['/apps', this.appId || 0, 'tasks', taskId]); - } - } - -} diff --git a/integration/base_ver_2_app/src/assets/.gitkeep b/integration/base_ver_2_app/src/assets/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/integration/base_ver_2_app/src/custom-style.scss b/integration/base_ver_2_app/src/custom-style.scss deleted file mode 100644 index 7443c5239a..0000000000 --- a/integration/base_ver_2_app/src/custom-style.scss +++ /dev/null @@ -1,33 +0,0 @@ -@import '~@alfresco/adf-core/prebuilt-themes/adf-blue-orange.css'; - - -@import '~@alfresco/adf-content-services/theming'; -@import '~@alfresco/adf-process-services/theming'; -@import '~@alfresco/adf-core/theming'; - -@import '~@angular/material/theming'; - -@include mat-core($alfresco-typography); - -$primary: mat-palette($alfresco-accent-orange); -$accent: mat-palette($alfresco-accent-purple); -$warn: mat-palette($alfresco-warn); -$theme: mat-light-theme($primary, $accent, $warn); - -@include angular-material-theme($theme); -@include adf-content-services-theme($theme); -@include adf-process-services-theme($theme); -@include adf-core-theme($theme); - -body, html { - margin: 0; - height: 100%; - overflow: hidden; - font-size: mat-font-size($alfresco-typography, body-1); - font-family: mat-font-family($alfresco-typography); - line-height: mat-line-height($alfresco-typography, body-1); -} - -body { - overflow: auto; -} diff --git a/integration/base_ver_2_app/src/environments/environment.prod.ts b/integration/base_ver_2_app/src/environments/environment.prod.ts deleted file mode 100644 index 3612073bc3..0000000000 --- a/integration/base_ver_2_app/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/integration/base_ver_2_app/src/environments/environment.ts b/integration/base_ver_2_app/src/environments/environment.ts deleted file mode 100644 index b7f639aeca..0000000000 --- a/integration/base_ver_2_app/src/environments/environment.ts +++ /dev/null @@ -1,8 +0,0 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. - -export const environment = { - production: false -}; diff --git a/integration/base_ver_2_app/src/favicon-96x96.png b/integration/base_ver_2_app/src/favicon-96x96.png deleted file mode 100644 index d342b10ee0..0000000000 Binary files a/integration/base_ver_2_app/src/favicon-96x96.png and /dev/null differ diff --git a/integration/base_ver_2_app/src/index.html b/integration/base_ver_2_app/src/index.html deleted file mode 100644 index a51c4c592e..0000000000 --- a/integration/base_ver_2_app/src/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - ACS APS ADF Application with Angular CLI - - - - - - - - - - - - diff --git a/integration/base_ver_2_app/src/main.ts b/integration/base_ver_2_app/src/main.ts deleted file mode 100644 index e4c32dc51b..0000000000 --- a/integration/base_ver_2_app/src/main.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; - -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; -import { PDFJSStatic } from 'pdfjs-dist'; - -declare global { - const PDFJS: PDFJSStatic; -} - -import 'hammerjs'; -import 'chart.js'; -import 'ng2-charts'; - -PDFJS.workerSrc = 'pdf.worker.js'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/integration/base_ver_2_app/src/polyfills.ts b/integration/base_ver_2_app/src/polyfills.ts deleted file mode 100644 index 7831e97b79..0000000000 --- a/integration/base_ver_2_app/src/polyfills.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** Evergreen browsers require these. **/ -import 'core-js/es6/reflect'; -import 'core-js/es7/reflect'; - - -/** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - **/ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - - -/*************************************************************************************************** - * Zone JS is required by Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ - -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 - */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. - */ -// import 'intl/locale-data/jsonp/en'; diff --git a/integration/base_ver_2_app/src/tsconfig.app.json b/integration/base_ver_2_app/src/tsconfig.app.json deleted file mode 100644 index 832b32f701..0000000000 --- a/integration/base_ver_2_app/src/tsconfig.app.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "module": "es2015", - "rootDir": "..", - "baseUrl": ".", - "skipLibCheck": false, - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ], - "angularCompilerOptions": { - "skipTemplateCodegen": false - } -} diff --git a/integration/base_ver_2_app/src/tsconfig.spec.json b/integration/base_ver_2_app/src/tsconfig.spec.json deleted file mode 100644 index 96a7fd62a8..0000000000 --- a/integration/base_ver_2_app/src/tsconfig.spec.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/spec", - "module": "es2015", - "rootDir": "..", - "baseUrl": ".", - "skipLibCheck": false, - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ], - "angularCompilerOptions": { - "skipTemplateCodegen": false - } -} diff --git a/integration/base_ver_2_app/src/typings.d.ts b/integration/base_ver_2_app/src/typings.d.ts deleted file mode 100644 index ef5c7bd620..0000000000 --- a/integration/base_ver_2_app/src/typings.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* SystemJS module definition */ -declare var module: NodeModule; -interface NodeModule { - id: string; -} diff --git a/integration/base_ver_2_app/tsconfig.json b/integration/base_ver_2_app/tsconfig.json deleted file mode 100644 index aa20b7c60c..0000000000 --- a/integration/base_ver_2_app/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compileOnSave": false, - "compilerOptions": { - "outDir": "./dist/out-tsc", - "baseUrl": "src", - "sourceMap": true, - "declaration": false, - "moduleResolution": "node", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "skipLibCheck": true, - "noUnusedLocals": false, - "target": "es5", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2016", - "dom" - ] - } -} diff --git a/integration/base_ver_2_app/tslint.json b/integration/base_ver_2_app/tslint.json deleted file mode 100644 index 0db5751c78..0000000000 --- a/integration/base_ver_2_app/tslint.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "typeof-compare": true, - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ], - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, - "no-input-rename": true, - "no-output-rename": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true, - "no-access-missing-member": true, - "templates-use-public": true, - "invoke-injectable": true - } -} diff --git a/lib/content-services/breadcrumb/breadcrumb.component.scss b/lib/content-services/breadcrumb/breadcrumb.component.scss index 4cadf88d60..576db39fef 100644 --- a/lib/content-services/breadcrumb/breadcrumb.component.scss +++ b/lib/content-services/breadcrumb/breadcrumb.component.scss @@ -89,9 +89,9 @@ letter-spacing: -0.2px; text-align: left; opacity: 0.6; - - flex: 0 10 auto; + flex: 0 1 auto; min-width: 35px; + margin-top: auto; text-overflow: ellipsis; &:hover, diff --git a/lib/content-services/content-metadata/components/content-metadata/content-metadata.component.html b/lib/content-services/content-metadata/components/content-metadata/content-metadata.component.html index 996ea9f747..e1c344b2c9 100644 --- a/lib/content-services/content-metadata/components/content-metadata/content-metadata.component.html +++ b/lib/content-services/content-metadata/components/content-metadata/content-metadata.component.html @@ -21,7 +21,7 @@