* [ADF-2914] support for number range patterns (#3282)

* support for number range patterns

* fix memory leak for tag actions

* [ADF-2824] Reviewed docs for core and content services (#3290)

* [ADF-2824] Reviewed card view docs

* [ADF-2824] Reviewed doc for core and content services

* [ADF-2824] Added class name exception to prop script

* [ADF-2843] added tooltip for create new folder and edit folder icons … (#3286)

* [ADF-2843] added tooltip for create new folder and edit folder icons from Content Service

* [ADF-2843] added translation for tooltip

* Update content-metadata.component.md

* [ADF_NOISSUE] Fix styling and sidenav layout fixes (#3291)

* Fix styling and sidenav layout fixes

* Revert packagr conflicting mods

* [ADF-2905] Added JSDocs for process services (#3292)

* [ADF-2905] Added JSDocs for process services

* [ADF-2905] Added missing return value in tasklist service

* [ADF-2916] number range form validator added (#3279)

* number range form validator added

* tests added

* [ADF-2626] added preserved state functionality for sidenav component (#3278)

* [ADF-2626] added preserved state functionality for sidenav component

* [ADF-2626] changed logic for preserving the sidenav component state

* [ADF-2626] added missing curly brace }

* [ADF-2626] small changes on logic based on pr comments

* [ADF-2843] added tooltip for create folder and edit folder icons from Content Services

* Revert "[ADF-2843] added tooltip for create folder and edit folder icons from Content Services"

This reverts commit d5a7abb65b5bbfd024b44aa7e331e688aa13eb60.

* [ADF-2626] changed casting

* [ADF-2626] updated documentation with event

* [ADF-2626] removed app-config pipe because it was not being used

* [ADF-2328] filtering support for facets and categories (#3293)

* filtering support for facets and categories

* fix tests

* update variable names

* [ADF-2973] Angular pipe to get application configuration settings (#3301)

* app config pipe

* update docs

* [ADF-2849] Search Date Range - Set the format of the date from config (#3288)

* format date chosen from the datePicker's calendar

* format date on focusout event

* fix tests & some code refactoring

* more validation messages

* unit tests

* fix typecast error

* move "dateFormat" to be part of the "date range" widget settings block

* fix error on Moment

"...Type 'moment.Moment' is not assignable to type 'moment.Moment'. Two different types with this name exist, but they are unrelated.
          Property 'isLocal' is missing in type 'Moment'..."

* moment - use old version

* change script - use recent version of moment

* Added the working-with-nodes-api-service tutorial. (#3295)

* [ADF-2826] added a check for duplicate permission add (#3265)

* [ADF-2556] first step to create add people or group to permissions

* [ADF-2556] creating a dialog with user results

* [ADF-2556]
integrated service for add and remove permission from node

* [ADF-2556] fixed behaviour and style for add user group

* [ADF-2556] added some refactoring for dialog service

* [ADF-2556] refactoring the dependencies of the components

* [ADF-2556] added some fix and a new key for dialog

* [ADF-2556] start adding test for node permission service

* [ADF-2556] added test for add permission panel component

* [ADf-2556] adding tests for new add permission component

* [ADF-2556] fixed tests and added documentation

* [ADF-2556] fixed documentation for add-node components

* [ADF-2556] added peer review changes

* [ADF-2826] added a check for duplicate permission add

* [ADF-2826] removed fdescribe

* [ADF-2826] applied peer review changes

* [ADF-2930] general purpose "Empty Page" component (#3296)

* empty content component

* fix selector name

* style fixes

* cleanup code

* docs for empty content

* update docs

* update docs

* use typography for icon

* layout fixes for Login (ported from ACA)

* fix aot crash

* fix tslint error and add and block if tslint give error in the pipeline

* [ADF-2892] Sidenav now prevents closing itself when ESC key is pressed (#3302)

* [ADF-2892] Sidenav now closes when clicking outside of it

* [ADF-2892] Sidevan now prevents closing itself when ESC key is pressed

* Fix for a technical bug, which prevents the proper usage of the expanded output event. (#3304)

* [ADF-NO-PRIVATE] renoved private property which breaks AOT (#3305)

* [ADF-2975] New input for File Upload Button component (#3299)

* new nodeType input

* unit tests

* content type fix

* remove package-lock.json files

* [ADF-2699] added localisation for time ago pipe (#3298)

* [ADF-2699] added localisation to the time-ago pipe

* [ADF-2699] added lang to time ago pipe

* [ADF-2699] added localisation for time ago pipe

* [ADF-2699] removed fdescribe

* [ADF-2699] removed comments

* [ADF-2699] removed useless default values

* fix css scope for search filter

* fix aot error

* fix ID show rancher script update

* Addition to the preparation of the environment. (#3306)

* Added the working-with-nodes-api-service tutorial.

* Added the 'Alfresco Example Content Application' paragraph to the 'Preparing the development environment' tutorial.

* [ADF-2843] added tooltips for all the buttons in toolbar (#3297)

* [ADF-2843] added tooltip for create new folder and edit folder icons from Content Service

* [ADF-2843] added translation for tooltip

* [ADF-2843] added tooltips for all the buttons in toolbar

* [ADF-2843] discard package-lock

* [ADF-2832] discard changes to package-lock

* [ADF-2843] discarded changes from package-lock

* [ADF-2843] added tooltip for list view button

* [ADF-2912] added group everyone as constant result for add permissions (#3266)

* [ADF-2556] first step to create add people or group to permissions

* [ADF-2556] creating a dialog with user results

* [ADF-2556]
integrated service for add and remove permission from node

* [ADF-2556] fixed behaviour and style for add user group

* [ADF-2556] added some refactoring for dialog service

* [ADF-2556] refactoring the dependencies of the components

* [ADF-2556] added some fix and a new key for dialog

* [ADF-2556] start adding test for node permission service

* [ADF-2556] added test for add permission panel component

* [ADf-2556] adding tests for new add permission component

* [ADF-2556] fixed tests and added documentation

* [ADF-2556] fixed documentation for add-node components

* [ADF-2556] added peer review changes

* [ADF-2912] added group everyone as constant result for add permissions

* [ADF-2912] readded jsdoc

* fix search filter styles (#3313)

* [ADF-2978] added a check when locally set permission is undefined (#3307)

* [ADF-2969] Moved doc tools to new tools folder (#3314)

* [ADF-2969] Moved doc tools to new tools folder

* [ADF-2969] Added files missing from schematic

* [ADF-2969] Added missing files to schematic

* [ADF-2813] set default sorting (#3311)

* [ADF-2891] decoupled search service love (#3312)

* Added the tutorial 'Creating your JavaScript application using alfresco-js-api'. (#3310)

* Added the working-with-nodes-api-service tutorial.

* Added the 'Alfresco Example Content Application' paragraph to the 'Preparing the development environment' tutorial.

* Added the tutorial 'Creating your JavaScript application using alfresco-js-api'.

* Added the image of the tutorial.

* Typo in 'creating-javascript-app-using-alfresco-js-api.md'

Typo in 'Prerequisites'.

* Typos in 'creating-javascript-app-using-alfresco-js-api.md'

Two small typos.

* Wrong sentence in 'creating-javascript-app-using-alfresco-js-api.md'

...into Angular applications, but it is "framework agnostic".

* Typo on 'creating-javascript-app-using-alfresco-js-api.md'.

...and Angular...

* [ADF-2888] UX doesn't respect the Sidenav specifiactions (#3303)

* [ADF-2771] Sidebar action menu component - UX review

* Add a input property to set the width of sidebar-action-menu.

* [ADF-2888]  UX doesn't respect the Sidenav specifiactions

* Add a input property to set the width of sidebar-action-menu.

* remove search configuration enforcement (#3315)

* [ADF-2986] try to pick the start value from local storage before the standard default (#3318)

* [ADF-2912] group everyone is always visible even for no search result (#3316)

* [ADF-2826] fixed wrong parsing for error message (#3317)

* [ADF-2739] Improved breadcrumb logic (#3287)

* [ADF-2739] Long names in breadcrumb fixed

* [ADF-2739] Updated styles

* [ADF-2739] Fixing @mixin for breadcrumb

* [ADF-2739] Waiting for changes in demo-shell

* [ADF-2739] Fixed @mixin

* [ADF-2739] Fixed issue related to breadcrumb position

* [ADF-2739] Improved ngOnChanges call for breadcrumb

* [ADF-2739] Fixed issues with lint

* [ADF-2739] Removed comment in dropdown breadcrumb component file

* [ADF-2739] Changed recalculateNodes method from public to protected

* pipeline-update (#3309)

* deploy PR script

* [ADF-2967] fixed create new task navigation (#3322)

* [ADF-2967] fixed create new task navigation

* [ADF-2967] removed extra variables

* [ADF-2967] removed unused methods

* [ADF-2961] support for protocol substition in app config files (#3324)

* support for protocol substition in app config files

* Update app-config.service.spec.ts

* Update app-config.service.spec.ts

* [ADF-2925] Required and invalid validators added (#3277)

* test added

* tests clean

* test added

* tslint clean

* test name changed

* update tests

* Added the tutorial 'Working with the Nodes API Service'. (#3319)

* [ADF-2979] Updated props script to avoid copying missing JSDocs (#3327)

* [ADF-2979] Updated tools to ignore blank JSDocs for inputs/outputs

* [ADF-2979] Bug fixes for handling missing tables, etc

* [ADF-2989] updated documentation with multiple node example (#3328)

* [ADF-2503] conditional visibility for content actions (#3325)

* conditional visibility for content actions

* fix typo

* workaround for "target: all"

* [ADF-2821] move module sidebar action menu (#3321)

* move module sidebar action menu

* fix core import test

* remove sidebar module

* skip error

* skiperror old versions

* [ADF-2995] Permissions - Consumer should be able to upload a new version for his file on a private site (#3326)

* check node permission instead of parent

* tests

* Fix sidenav action icons (#3331)

* Only the username form control should be emitted (#3333)

* about component (#3337)

* [ADF-2563] Improve versioning functionality (#3335)

* change input with textarea

* update file version use now the update content API

* provide way to test read only mode version list

* fix test

* test fix

* [ADF-2997] The meaning of the range fields is not clear (#3338)

* [ADF-2997] restrict 'to' field not to allow dates in the future

* [ADF-2997] more clear labels for start and end date fields

the translation team will decide what will be the best values for the date fields

* [ADF-3000] Update the documentation by adding the steps of date format custom configuration. (#3339)

* [ADF-3028] i18n support for title service (#3342)

* i18n support for title service

* cleanup tests

* update tests

* fixed constraint for viewer name width (#3343)

* (demo shell) login css fixes (#3344)

* [ADF-1997] override custom form widgets by default (#3346)

* override custom form widgets by default

* update tests

* [ADF-2979] Updated doc tools to avoid erasing MD docs with blank JSDocs in services (#3347)

* [ADF-2979] Update to ignore blank JSDocs for method signature

* [ADF-2979] Finished adding blank JSDoc check for services

* [ADF-2131] Search sorting (#3334)

* sorting configuration

* detect primary sorting and use with document list

* search results sorting

* docs update

* unit tests and code updates

* update code

* update code

* generic sorting picker, test updates

* ability to switch off client side sorting

* update docs for document list

* [ADF-2884] Task List - Custom apps display all tasks (#3329)

* [ADF-2884] Handled filterParam input change
Changed component selector

* [ADF-2884] Modified/Added tests

* [ADF-2884] Deprecated old selectors

* [ADF-2884] Added deprecated version

* [ADF-2884] Improved filter finding condition

* update project permissions change

* [ADF-2984] Show date invalid message on search date range picker (#3323)

* [ADF-2984] Show date invalid message on search date range picker

* [ADF-2984] test that required format is displayed when date input is invalid

* [ADF-2984] More space above buttons

* dummy commit

* restore deleted breadcrumb code

* [ADF-2753] New error component (#3336)

* [ADF-1938] Overflowing text in reports section fidex

* [ADF-1938] Long names in report section now fit

* [ADF-1938] Reverted changes in container widget

* [ADF-2753] New error component created

* [ADF-2753] Unit test for Error Content Component

* Deleting unused files

* Deleting unused files

* Deleting unused files

* [ADF-2753] Documentation added

* [ADF-2753] Fixed minor bugs

* [ADF-2753] Authentication not needed to view error

* add error handler

* tslint fix

* router app component

* remove unused import

* fix import modules

* limit to 404

* destroy fixture after any test

* misspelling error

* breadcrumb bug fixes (#3348)

* [ADF-2726] fixed save content for external repository (#3341)

* [ADF-2726] start fixing the show of files loaded from CS

* [ADF-2726] start fixing the show of files loaded from CS

* [ADF-2726] fixed save content for external repository|

* [ADF-2726] fixed save content for external repository|

* [ADF-2726] reeanabled and fixed the tests

* [ADF-2726] reeanabled and fixed the tests

* [ADF-2726] added tests for attach file widget and activiti alfresco service

* [ADF-2726] added tests for attach file widget and activiti alfresco service

* [ADF-2726] fixed test

* fix like test

* fix typo in the resource key (#3352)

* fix failing tests replace ajax with spy

* remove fdescribe

* [ADF-3040] Replaced doc template engine to fix whitespace issues (#3356)

* replace jasmine ajax with spy in rating tests

* fix breadcrumb align in object picker (#3353)

* fix no content node display (#3351)

* Broken links and missing images for two tutorials. (#3357)

* Broken links and missing images for two tutorials.

* Replaced .html with .md extensions

Replaced .html with .md extensions.

* Typo in Prerequi(si)tes

Typo in Prerequi(si)tes.

* [ADF-2988] fix logo change (#3362)

* [ADF-3055] fix bug with page size for facet fields (#3359)

* fix bug with page size for facet fields

* move page size to a constant

* move const inside the scope

* test fixes

* [ADF-2923] button type added (#3358)

* button type added

* remove unnecessary code

* [ADF-2608] added a fix to handle selection on slow connection problem (#3350)

* [ADF-2608] added a fix to handle selection on slow connection problem

* [ADF-2608] fixed test for datatable

* Added an import command to the 'Adding a new view' tutorial. (#3366)

* remove redundant logic (#3361)

* [ADF-2679] Reviewed latest tutorial content (#3371)

* [ADF-2679] Initial review of new tutorial content

* [ADF-2679] Reviewed the latest tutorials

* [ADF-2679] Initial review of new tutorial content

* [ADF-2679] Reviewed the latest tutorials

* [ADF-2832] Demo-shell, Fix Task filter dropdown menu alignment (#3294)

* [ADF-2832] changed height to auto for task filter dropdown header

* [ADF-2832] change selector with classes

* [ADF-2832] changed selector

* [ADF-2832] removed unnecessary css

* [ADF-2832] added class and changed selector

* [ADF-2832] added adf-prefix

* [ADF-2927] search filter enhancements (#3365)

* search filter enhancements

* reset button for facet queries

* update code and tests

* remove unused type

* restore code missing after rebase

* [ADF-2764] Updated doc files with latest script features (#3368)

* [ADF-2764] Updated doc files with latest script features

* [ADF-2764] Rebuilt full index instead of just content services index

* [ADF-2985] Demo shell - Provide an easy way to test the security issue (#3354)

* Provide an easy way to test the security issue

* use logService

* first part random test fix (#3376)

fixing random test executions first part

* fix form radio test

* [ADF-3065] TaskList component - Deprecate the processDefinitionKey (#3369)

* Deprecate the processDefinitionKey property.
remove unused tasklist code. It was needed with the old pagination component

* Remove nosense test

* Use adf version

* [ADF-2999] readded form validation icon (#3367)

* [ADF-2999] readded form validation icon

* [ADF-2999] fixed broken test

* Added the tutorial 'Basic theming'. (#3378)

* [ADF-2854] Fix demoshell task/process filter and routing (#3360)

* Fix demoshell task/process filter and routing

* Use the correct js api model

* Fix unit test

* search filter now remembers original user query (#3384)

* [ADF-2319] added a check for delete checklist button (#3382)

* [ADF-2238] removed created by property (#3380)

* [ADF-2238] removed created by property

* [ADF-2238] added a condition to avoid checklist delete for completed task

* Revert "[ADF-2238] added a condition to avoid checklist delete for completed task"

This reverts commit fc2227ea0491f14bdb5c4ef1dc8c01967780072c.

* bold font for checked boxes (#3381)

* [ADF-2774] fixed message bus, background and language dropdowns that were hidden by the toolbar (#3379)

* [ADF-2764] Applied new doc tool features to core library (#3383)

* [ADF-2824] Added and reviewed some content services docs (#3385)

* revert changes (#3387)

* Added the 'Content metadata component' tutorial. (#3386)

* update package settings and lock file (#3389)

* minor layout fix for search facet buttons

* [ADF-2857] fixed message for date and date time widget (#3370)

* [ADF-2764] Updated process services docs with latest features (#3390)

* [ADF-2977] made language change persistenr (#3373)

* [ADF-3041] TaskList Component - Empty State issue. (#3345)

* [DW-635] Empty State Component

* [DW-635] Empty State Component

* [DW-635] Empty state Issue

* [DW-635] Use empty state component and custom empty directive

* [ADF-3041] Documentation for TaskList Component - Empty State issue.

* [ADF-3088] move sorting picker to a separate module (#3396)

* move sorting picker to a separate module

* update translation mock

* [ADF-3087] Clarified section about adding/replacing keys in i18n guide (#3392)

* [ADF-3087] Clarified section about adding/replacing keys

* [ADF-3087] Corrected information in i18n and translation service docs

* [ADF-3068] ADF Sidenav/Toolbar - Ux background colour review (#3401)

* [ADF-2824] Reviewed docs for new components in 2.4 (#3400)

* [ADF-3042] Use the custom date adapter from adf-core on Search Date Range widget (#3394)

-fix localization
-fix tests
-show parse error

* [ADF-3053] breadcrumb fixes (#3406)

* translate breadcrumb root in demo shell

* optional "max items" feature and style fixes

* should not be restricted by default

* style updates

* toolbar and breadcrumb layout fixes

* breadcrumb demo and testing page

* full toolbar scenario

* fix translation issue with the dropdown and custom root

* a11y fixes

* fix issue with duplicate id, remove unused attribute

* [ADF-2627] Icons-only mode for Info Drawer (#3398)

* tab with icon

* docs

* test

* add option without login docker publish

* fix publish script

* move docker push outside login

* fix random test failing part 2 (#3395)

* fix random failing test core search/comment/auth/user

* fix node delete directive

* fix lint issues

* node restore fix

* fix comment test

* remove fdescribe

* fix tests and tslint

* fix upload test

* unsubscribe success event task test

* copy comment object during test

* use the data pipe performance improvement and standard usage

* uncomment random test

* fix comment date random failing test

* disposable unsubscribe

* fix start process

* remove fdescribe

* change start process test and remove commented code

* fix error event check double click

* clone object form test

* refactor date time test

* fix service mock

* fix test dropdown and context

* git hook lint

* fix language test

* unsubscribe documentlist event test

* fix disposable error

* fix console log service error document list

* unusbscribe search test

* clear input field

* remove wrong test

* [ADF-2754] People Widget - Refactoring style and logic (#3349)

* observable logic added

* tests added & bug fixed

* onkeyup removed

* isValidUser method removed

* tslint fix

* test added

* comments fixed

* check if input value is string

* remove console log err from document list test

* [ADF-3082] Task Filter - Custom Task filters don't work (#3402)

* [ADF-3082] Custom Task filters don't work.

* Added an sorting input to the datatable.
* Updated documentation for the recent changes.
* Added testcases for the recent changes.

* [ADF-3082] Custom Task filters don't work

* Added a sorting input to the datatable
* Added testcases to the recent changes.
* Updated doc for the recent changes.

* * Refactored task/process list dataSort.

* * Refactored process/task list datasort method

* remove console log error from version list and content node selector test stubbing necessary method

* [ADF-3041] - Task List Empty State Issue (#3408)

* fix demo shell gallery view switch (#3413)

* [ADF-2541] reset datatable selection when rows are changed from code (#3410)

* reset selection when rows are replaced from code

* code fixes

* unit test updates

* visualise selection count for testing purposes

* make row selection api public

* remove question mark from the event name

* remove pdfviewer thumbnail console log test error

* fix conflict link creation id (#3412)

*  [ADF-2753] Error Component throwing default error fixed (#3364)

* [ADF-1938] Overflowing text in reports section fidex

* [ADF-1938] Long names in report section now fit

* [ADF-1938] Reverted changes in container widget

* [ADF-2753] New error component created

* [ADF-2753] Unit test for Error Content Component

* Deleting unused files

* Deleting unused files

* Deleting unused files

* [ADF-2753] Documentation added

* [ADF-2753] Error Component throwing default error fixed

* [ADF-2753] White space removed

* [ADF-2753] Removed unnecessary files and updated trnaslation file

* [ADF-2753] Changed link for button in error component

* [ADF-2753] Updated doc file

* [ADF-2753] Removed fdescribe

* [ADF-2753] Improved code coverage

* fix error AppTitle service test log

* fix gallery view demo shell route

* [ADF-3095] ability to intercept, pause and resume upload process (#3416)

* prevent and resume upload process

* upload fixes and confirmation dialog demo

* ability to toggle the upload confirmation demo

* fix tests

* unit tests

* docs update

* remove deprecation

* fix test name

* [ADF-2698] Date and time Widget - UTC vs local time issue (#3393)

* [ADF-2698] Date and time Widget - UTC vs local time issue

* [ADF-2698] add unit test to check that the format for min and max values is correct

* [ADF-2698] test behavior

* [ADF-3102] added lazy loading for tab content to fix animations (#3418)

* [ADF-2764] Fixed union type display glitches in property tables (#3419)

* [ADF-2764] Test commit to fix handling of union types in Github docs

* [ADF-2764] Fixed union type error in component docs

* [ADF-2593] z-index fix for search bar (#3409)

* [ADF-2593]

* [ADF-2593] Removed unnecessary style attributes

* [ADF-3111] pagination is not showed when automation test are running (#3420)

* [ADF-3108] Search - facetQueries panel renders when not defined in configuration (#3417)

* show facetQueries based on configuration definition

* tests

* FacetQueries is defined

* [ADF-3039] Task List - Enanchement (#3404)

* * Created DataColumnSchemaAssembler component to get column schema from html and app.config.json
* Removed column related  method  from tasklist.

* * Removed data property from the tasklist component
* Using rows input property instead of data input property of the datatable

* *  Renamed  DataColumnSchemaAssembler to DataTableSchema
* Refactored DataTableSchema component

* * Changed schem property into an  input schemaColumns property  in dataTable component

* * Added selectFirstRow input property to select a first row of datatable
* Removed unnecessary method from tasklist component

* * Added test case for the recent changes
* Added mock object for the tasklist spec

* * Added testcases for recent changes in the datatable component

* * Updated datatable and tasklist document for the recent changes

* * Refactored process-service and task list component
* Updated datatable document.

* [ADF-3039] Task List - Enanchement
* Changed schemaColumn name to columns
* Updated datatable documentation.
*  data input Annotated  with @deprecated in the tasklist component

* * Added an sorting input to the datatable.
* Updated datatable and tasklist documentation
* Added method to get current sorting order.

* * After rebasing

* * Revert  sorting changes

* * After rebase

* * fixed conflicts

* * Fixed failing testcase after rebased.

* update toolbar docs (#3423)

* Add custom data holder for CardViewItems (#3422)

* [ADF-3115] a11y fixes (#3424)

* a11y fixes for search input

* a11y fixes for pagination

* a11y fixes for content actions

* [ADF-3118] translation support for notification service (snackbars) (#3427)

* translation support for snackbar

* unit tests

* [ADF-2438] fixed thumbnails height (#3407)

* [ADF-2438] calculate thumbnail height

* [ADF-2438] send height to parent element

* [ADF-2438] add width to css

* [ADF-2438] moved height and width logic to parent component

* [ADF-2438] added height and width logic to parent component

* [ADF-2438] fixed failing test

* demo translation for search radio

* [ADF-2710] removed default shared link creation at the opening (#3430)

* [ADF-2999] added a way to test the validation icon on demo shell (#3431)

* [ADF-2754] People component tests fixed and style improvement (#3414)

* tests fixed and style

* show people test fixed

* error message test fixed

* [ADF-3131] fix selection order for DT/DL (#3433)

* fix selection order for DT/DL

* remove fit

* [ADF-3066] ProcessList Component - Empty State issue. (#3434)

* [ADF-3093] Added style checking tool for en.json translation file (#3428)

* [ADF-3093] Started li18nt VS Code extension

* [ADF-3093] Started work on UI style lint tool for VSCode

* [ADF-3093] Added UI style rules up to sg0006

* [ADF-3093] Added remaining style rules

* [ADF-3093] Added docs and command line tool

* [ADF-3093] Removed Microsoft notices and updated licences to Apache-2.0

* [ADF-3133] Fixed inconsistency in doc example (#3436)

* [ADF-2753] Fixed routing and second button showing up (#3421)

* [ADF-1938] Overflowing text in reports section fidex

* [ADF-1938] Long names in report section now fit

* [ADF-1938] Reverted changes in container widget

* [ADF-2753] New error component created

* [ADF-2753] Unit test for Error Content Component

* Deleting unused files

* Deleting unused files

* Deleting unused files

* [ADF-2753] Documentation added

* [ADF-2753] Removed unnecessary files and updated trnaslation file

* []

* [ADF-2753] Fixed routing and second button showing up

* [ADF-2753] Fixed typo

* [ADF-2753] Fixed view loading before variables

* [ADF-2753] Missing whitespace

* [ADF-2753] Added test for route params

* [ADF-2753] Changed getData function name to getTranslations

* [ADF-fix date widget test] Fixing a randomly failing test (#3439)

* group uploaded files into single batch, IE fixes (#3438)

* [ADF-3067] App-list Empty State. (#3432)

* extend demo shell upload example to button

* [ADF-2764] Added new type linker features and applied them to core docs (#3442)

* [ADF-2764] Added basic support for composite and external types

* [ADF-2764] Added new type linker features and applied to core docs

* notification service demo and testing area (#3443)

* notification service demo and testing area

* fix typo

* fix viewer title style (#3445)

* [ADF-3132] TaskList empty state doesn't respect the specification (#3440)

* [ADF-3134] fix increasing search calls issue (#3444)

* [ADF-2764] Applied new type linker features to content services docs (#3446)

* [ADF-3062] dual api support for Favorites (#3447)

* dual api support for Favorites

* unit test

* ADF-2974] New Buttons Menu component version (#3429)

* [ADF-2974] Buttons injected from parent html component

* [ADF-2974] New version of buttons menu component

* [ADF-2974] Updated unit tests

* [ADF-2974] Updated documentation

* [ADF-2974] Removed unused variable

* [ADF-2974] Fixed failing test at analytics report parameters

* [ADF-2974] Removed fdescribe

* [ADF-2974] Moved mock inside testing file for buttons menu component

* extend breadcrumb testing page (demo shell)

* [ADF-3142] Added missing info about 'remember me' in login docs (#3448)

* [ADF-3120] fixed sorting for tasklist and process list (#3435)

* [ADF-3120] fixed sorting for tasklist and process list

* [ADF-3120] removed commented code

* [ADF-3120] fixing another randomly failing test

* [ADF-2764] Applied new type linker features to proc services docs (#3449)

* (demo shell) fix memory leak with search results

* [ADF-2795] SSO implicitflow (#3332)

* Enable OAUTH2

* Create SSO services

* SSO improvements

* Rollback sso login change

* Add SSO configuration from Setting component

* Refactoring

* Remove login ECM/BPM toggle and move use the userpreference instead of store

* fix host setting unit test

* Fix unit test missing instance

* use the Js api oauth

* add logout component and clean sso not used class

* fix dependencies cicle

* add translation settings

* fix style setting page

* clean

* JS APi should receive the oauth config from the userPreference and not from the config file

* change login if SSO is present

* missing spaces

* add sso test in login component

* add logout directive new properties test

* Improve host setting and remove library reference

* fix login test

* Remove unused code

* Fix authentication unit test

* fix authguard unit test

* fix csrf check login component

* fix unit test core and demo shell

* remove

* simple filtering for datatable (#3453)

* [ADF-3150] Moved all doc tool config settings to doctool.config.json (#3455)

* [ADF-3150] Moved undoc stoplist to doc config file

* [ADF-3150] Moved config to doctools.config.json and removed obsolete scripts

* fixes for memory leaks and multiple subscriptions (#3456)

* fix content action memory leaks

* memory leak fixes for demo shell

* [no-issue] error image resolver mimetype should not be part of datatable (#3415)

* move error image custom logic form datatable to documentlist

* change travis

* [fix-test-log] added optional function to data row interface

* [no-issue] fixed datatable tests

* [no-issue] fixing tests

* [ADF-2859] conditional evaluation of disabled state for content actions (#3450)

* react on [disabled] binding changes

* [disabled] binding updates for context menu items

* evaluating disabled state with a function

* unit test

* restore original description

* remove irrelevant test

* fix tests

* fix test

* remove not used events in demo shell host setting components

* [ADF-3156] App config default ALL (BPM and ECM) provider (#3460)

* Use as default provider ALL (BPM and ECM)

* Default host OAUTH

* removing wrong fdescribe (#3461)

* [ADF-3123] removed default choice for the first radio button (#3462)

* Fix host component (#3463)

* [ADF-2824] Doc review and minor changes to review checker tool (#3466)

* restore historical selection order (#3467)

* restore historical selection order

* fix test

* [ADF-2859] fixes for the conditional visibility and disabled states (#3465)

* fixes for the conditional visibility and disabled states

* update docs

* cleanup code

* remove unused code

* [LOC-61] i18n 2.4.0 (#3468)

* i18n 2.4.0

* missing part

* revert development config

* [ADF-3144] Error component displayed when closing file viewer in process tab (#3469)

* [ADF-3173] [Task List] - Empty list message is not translated (#3471)

* Added a missing translation keys.

* Fix dropdown panel in viewer toolbar  because of z-index (#3472)

* [ADF-3162] Setting component - Should be able to render the providers passed as input (#3464)

* Be able to change the available providers values

* Add deprecated tag

* add default providers

* Fix empty OAuth and selected providers
Improve the documentation

* Fix BPM guard to check SSO condition

* Add the oauthConfig again

* SSO or Basic otpion auth setting change

* fix host settings sso/basic
add login documentation

* remove test string

* fix auth guard test

* dispose upload emitter test events

* remove space

* exclude failing test

* Update ADF packages version 2.4.0-beta13 (#3475)

* [ADF-2824] Reviewed search docs for 2.4 (#3477)

* [ADF-2824] Moved search widget docs into separate pages

* [ADF-2824] Separated search widget page and added search filter service docs

* [ADF-2824] Updated new search docs with doc tools

* Remove unused field (#3480)

* Fix default SSO config not filled in (#3479)

* [ADF-3175] renabling upload on single target folder row (#3473)

* [ADF-3191] Not able to login only to BPM or ECM (#3478)

* disable random test

* host setting component reset JS-API

* reload api after user prefrence change

* remove replicate reset

* missing semicolon

* deprecate provider property

* remove trailing space

* check new value before to set

* [ADF-3198] Updated index files + minor doc updates (#3482)

* [ADF-3200] custom Extension filter - file with different extension is uploaded with drag and drop

* [ADF-3181] Auth Guard - redirect by string url (#3474)

* redirect by string url

* auth guard tests fix

* revise

* [ADF-3196] fixed task selection and double click (#3484)

* [ADF-3191] Fix userprefrence oauth2 (#3488)

* remove user preference setting save

* fix host setting test

* remove userPreferences test

* fix title service test

* remove unused imports

* restore input align

* fix service import in test tag rating

* [ADF-3210] Typo People Search (#3487)

* remove vscode changes

* [ADF-3196] [Task list / Process list] - The 'Task details' are not diplayed for the selected Task (#3483)

* [ADF-3196] [Task list / Process list] - The 'Task details' are not displayed for the selected Task

* * After rebase

* [ADF-3176] Fixed permissionsissue when editing metadata (#3476)

* [ADF-3217] reset previous search settings (#3490)

* reset previous search settings

* unit test

* remove fit

* [ADF-3196] fixed selection of first tasklist element (#3491)

* [ADF-3196] [Task list / Process list] - The 'Task details' are not displayed for the selected Task

* * After rebase

* [ADF-3196] fixed selection for fist element

* [ADF-3212] Upload version buttons wrapping fixed (#3492)

* Update ADF packages version 2.4.0-beta14 (#3493)

* demo shell host setting component login redirect after setting

* remove old auth test not  valid anymore

* fix translations (#3497)

* [ADF-3203] Fixed doc tools bugs from Linux run and added verbose option (#3496)

* [ADF-3912] Setting Component - Return as default BASIC authType (#3495)

* Return as default BASIC authType

* remove the commented line

* [ADF-3190] Fix rerendering issue with content-meta-data (#3494)

* Fix rerendering issue with content-meta-data

* Fix indentation

* [ADF-3198] Index and tutorial content review (#3500)

* [ADF-3198] Fixed glitches in doc index files and tools

* [ADF-3198] Reviewed new tutorial content and fixed index glitches

* [ADF-3198] Fixed host settings component brief description

* [ADF-3223] Restore message directive files fix (#3499)

* fix restore notification

* improve path specification property

* fix lint and document issues

* fix test

* remove unused import

* [ADF-3226] remove Double behaviour setting allow download and comment (#3502)

* fix restore notification

* improve path specification property

* fix lint and document issues

* fix test

* remove unused import

* remove double behavior allowComments and allowDonload can be set only thorough input property

* [ADF-3233] fixed demo shell filtering for files on drag&drop] (#3504)

* [ADF-3232] fixing retrieving for ecm user via site service (#3506)

* [ADF-3176] file content reload fixed (#3501)

* file content reload fixed

* refactoring & layout fix

* resolve indentation problems

* missing semicolon

* [ADF-3224] move ticket store logic in js-api (#3505)

* move ticket store logic in js-api

* remove space

* fix test

* fix tests

* [ADF-3212] Fixed permission issues when updating version (#3503)

* [ADF-3213] Fixed permission issues when updating version

* [ADF-3212] fixed test for PR

* allowableOperations include viewer get node

* update demo shell with metadata demo

* undo ADF-3176 changes

* fix login oauth cookie problem (#3508)

* fix login don't check the cookie in oauth2

* fix test

* check boolean storage

* fix provider check

* clean local storage before auth test

* fix missing pdf viewer update when scale is the same (#3510)

* [ADF-3239] Fixed deprecated property descriptions (#3509)

* [ADF-3239] Changed deprecated properties to include full description

* [ADF-3239] Updated deprecated properties of affected doc files

* [ADF-3239] Fixed badly formatted doc comment in tasklist

* [ADF-3229] people widget list reseted if empty input (#3507)

* list reseted when input is empty

* test added

* [ADF-3242] removed filter for string in example log component (#3511)

* [ADF-3242] removed filter for string in example log component

* [ADF-3242] added try catch for circular dependency objects

* [ADF-3242] added try catch and removed error message

* invalidate session in host setting internal component instead to logout

* remove unused import

* use i18n key for "Permission" label

* [ADF-3198] Final doc checks for release (#3513)

* [ADF-3198] Doc link check for release

* [ADF-3198] Updated main index doc page

* remove invalidation session because is concern of the js-api

* check 401 and redirect demo shell (#3516)

* [ADF-3248] fixed readonly status for people widget (#3512)

* [ADF-3248] fixed readonly status for people widget

* [ADF-3248] fixed test people widget

* [ADF-3248] added readonly test

* [ADF-3251] Authentication Service - Check if used loggedin based on the provider (#3515)

* check if loggedin based on the provider

* Fix unit tests

* remove 404 check in demo shell

* [ADF-3262] Remove avoidable css style from task/process list component (#3518)

* [ADF-3230] Changes to stop doc tools from updating files unnecessarily (#3519)

* [ADF-3230] Added basic change detector to doc tools

* [ADF-3230] Updates to type linker to fix before/after inconsistencies

* [ADF-3230] Fixed comparison error caused by adjacent text blocks

* [ADF-3230] Added basic change detector to doc tools

* [ADF-3230] Updates to type linker to fix before/after inconsistencies

* [ADF-3230] Fixed comparison error caused by adjacent text blocks

* [ADF-3230] Modified props tool to remove spaces from union types

* [ADF-3230] Made ToC tool before/after state consistent

* [ADF-3265] Updated index script to remove brief desc links (#3520)

* bump 2.4.0 version
This commit is contained in:
Eugenio Romano 2018-06-25 11:24:26 +01:00 committed by GitHub
parent c3db1c2ff8
commit f9658e2879
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1054 changed files with 70758 additions and 16578 deletions

View File

@ -6,8 +6,8 @@
"apps": [
{
"name": "dist",
"root": "src",
"outDir": "dist",
"root": "demo-shell/src",
"outDir": "demo-shell/dist",
"assets": [
"assets",
"favicon.ico",
@ -25,32 +25,32 @@
},
{
"glob": "**/*",
"input": "../node_modules/@alfresco/adf-core/prebuilt-themes",
"input": "../../node_modules/@alfresco/adf-core/prebuilt-themes",
"output": "./assets/prebuilt-themes"
},
{
"glob": "**/*",
"input": "../node_modules/@alfresco/adf-core/bundles/assets",
"input": "../../node_modules/@alfresco/adf-core/bundles/assets",
"output": "./assets/"
},
{
"glob": "**/*",
"input": "../node_modules/@alfresco/adf-insights/bundles/assets",
"input": "../../node_modules/@alfresco/adf-insights/bundles/assets",
"output": "./assets/"
},
{
"glob": "**/*",
"input": "../node_modules/@alfresco/adf-process-services/bundles/assets",
"input": "../../node_modules/@alfresco/adf-process-services/bundles/assets",
"output": "./assets/"
},
{
"glob": "**/*",
"input": "../node_modules/@alfresco/adf-content-services/bundles/assets",
"input": "../../node_modules/@alfresco/adf-content-services/bundles/assets",
"output": "./assets/"
},
{
"glob": "pdf.worker.js",
"input": "../node_modules/pdfjs-dist/build",
"input": "../../node_modules/pdfjs-dist/build",
"output": "./"
}
],
@ -67,14 +67,14 @@
],
"stylePreprocessorOptions": {
"includePaths": [
"../node_modules/"
"./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"
"../../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": {
@ -84,12 +84,27 @@
},
{
"name": "dev",
"root": "src",
"outDir": "dist",
"root": "demo-shell/src",
"outDir": "demo-shell/dist",
"assets": [
"assets",
"app.config.json",
"versions.json",
{
"glob": "**/*",
"input": "./assets",
"output": "./assets"
},
{
"glob": "app.config.json",
"input": "./",
"output": "./"
},
{
"glob": "versions.json",
"input": "./",
"output": "./"
},
{
"glob": "**/*",
"input": "../resources",
@ -102,12 +117,47 @@
},
{
"glob": "**/*",
"input": "../dist-dev-temp/",
"output": "./"
"input": "../../lib/dist/core/prebuilt-themes",
"output": "./assets/prebuilt-themes"
},
{
"glob": "**/*",
"input": "../../lib/core/assets",
"output": "./assets"
},
{
"glob": "**/*",
"input": "../../lib/process-services/assets",
"output": "./assets"
},
{
"glob": "**/*",
"input": "../../lib/content-services/assets",
"output": "./assets"
},
{
"glob": "**/*",
"input": "../../lib/core/i18n",
"output": "./assets/adf-core/i18n"
},
{
"glob": "**/*",
"input": "../../lib/content-services/i18n",
"output": "./assets/adf-content-services/i18n"
},
{
"glob": "**/*",
"input": "../../lib/process-services/i18n",
"output": "./assets/adf-process-services/i18n"
},
{
"glob": "**/*",
"input": "../../lib/insights/i18n",
"output": "./assets/adf-insights/i18n"
},
{
"glob": "pdf.worker.js",
"input": "../node_modules/pdfjs-dist/build",
"input": "../../node_modules/pdfjs-dist/build",
"output": "./"
}
],
@ -128,10 +178,10 @@
]
},
"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"
"../../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": {
@ -142,18 +192,18 @@
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
"config": "./demo-shell/protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json",
"project": "./demo-shell/src/tsconfig.app.json",
"exclude": "**/node_modules/**/*"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
"config": "./demo-shell/karma.conf.js"
}
},
"defaults": {

12
.dockerignore Normal file
View File

@ -0,0 +1,12 @@
.git
.github
.vscode
coverage
docs
e2e
node_modules
scripts
src
lib
integration
/demo-shell/config/

View File

@ -1,5 +1,4 @@
# http://editorconfig.org
# Editor configuration, see http://editorconfig.org
root = true
[*]
@ -15,5 +14,10 @@ indent_style = space
indent_size = 2
[*.md]
insert_final_newline = false
max_line_length = off
trim_trailing_whitespace = false
[resources/*.json]
indent_size = 2
max_line_length = off
trim_trailing_whitespace = false

1
.gitignore vendored
View File

@ -17,7 +17,6 @@ src/environments/
/demo-shell-ng2/ng2-components/
.happypack/
.history
package-lock.*
/ng2-components/ng2-alfresco-core/prebuilt-themes/
.ng_pkg_build/
/demo-shell/dist-dev-temp/

View File

@ -51,7 +51,7 @@ script:
fi
- if ([ "$MODULE" == "packaging" ]); then
(cd lib && npm run build || exit 1;);
(npm run build-lib || exit 1;);
fi
- if ([ "$MODULE" == "demo-shell" ]); then
@ -64,27 +64,30 @@ script:
jobs:
include:
- stage: Check build demo shell in production mode AND e2e
before_install:
- "export DISPLAY=:99.0"
- "sh -e /etc/init.d/xvfb start"
script: travis_wait 30 ./scripts/test-dist.sh
- stage: Check 2.0.0 Project Update
- stage: Demo shell prod && Demo shell e2e && Check ADF exports
script: ./scripts/test-dist.sh -n $TRAVIS_BUILD_NUMBER && (./scripts/pr-publish.sh -n $TRAVIS_BUILD_NUMBER -r $REPO_DOCKER -u $USERNAME_DOCKER -p $PASSWORD_DOCKER || exit 1)
- # Test Update version 2.0.0
script: ./scripts/test-e2e-bc.sh
- stage: Check ADF exports
script: cd lib && npm run test-export
- stage: Update Generator
- # Test expors
script: npm run test-export
- stage: Update Apps dependencies
- # Test Update generator-ng2-alfresco-app
if: tag =~ .*beta.*
script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n generator-ng2-alfresco-app
- stage: Update Content app
- # Test Update alfresco-content-app
if: tag =~ .*beta.*
script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-content-app
- stage: Update DW
- # Test Update adf-app-manager-ui
if: tag =~ .*beta.*
script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n adf-app-manager-ui
- stage: Update ng2-components
- # Test Update aalfresco-ng2-components
if: tag =~ .*beta.*
script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-ng2-components
- # Test Update alfresco-modeler-app
if: tag =~ .*beta.*
script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-modeler-app
- stage: Deploy PR
script: node ./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
# jobs:
# include:
@ -116,5 +119,4 @@ after_success:
cache:
directories:
- demo-shell/node_modules
- lib/node_modules
- node_modules

42
.vscode/settings.json vendored
View File

@ -1,25 +1,23 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/.DS_Store": true,
"**/coverage": true,
"**/.happypack": true
},
"editor.renderIndentGuides": true,
"markdownlint.config": {
"MD032": false,
"MD004": false,
"MD024": false,
"MD009": false,
"MD013": false,
"MD036": false,
"MD033" : false,
"MD031" : false
},
"cSpell.words": [
"webscript"
]
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/.DS_Store": true,
"**/coverage": true,
"**/.happypack": true
},
"editor.renderIndentGuides": true,
"markdownlint.config": {
"MD032": false,
"MD004": false,
"MD024": false,
"MD009": false,
"MD013": false,
"MD036": false,
"MD033": false,
"MD031": false
},
"cSpell.words": ["mincount", "webscript"]
}

View File

@ -1,4 +1,4 @@
### CORS solving strategies
# CORS solving strategies
The web client that we are building with the application development framework will be loaded from a different web server than the Alfresco Platform is running on.
So we need to tell the Alfresco server that any request that comes in from this custom web client should be allowed access

View File

@ -1,23 +0,0 @@
# Editor configuration, see http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.json]
indent_style = space
indent_size = 2
[*.md]
max_line_length = off
trim_trailing_whitespace = false
[resources/*.json]
indent_size = 2
max_line_length = off
trim_trailing_whitespace = false

View File

@ -57,3 +57,4 @@ app/**/*.d.ts
dist/
coverage/
!/e2e/protractor.conf.js

View File

@ -1,177 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

View File

@ -1,14 +0,0 @@
const cpx = require('cpx');
//Workaround for https://github.com/angular/angular-cli/issues/8783
//we copy before the files in dist-dev-temp in the demo shell and after we let the angular cli watch over them..double wathh necessary for dev mode
cpx.watch('../lib/core/prebuilt-themes/**/*.*', './dist-dev-temp/assets/prebuilt-themes')
cpx.watch('../lib/core/assets/**/*.*', './dist-dev-temp/assets/' )
cpx.watch('../lib/process-services/assets/**/*.*', './dist-dev-temp/assets/' )
cpx.watch('../lib/content-services/assets/**/*.*', './dist-dev-temp/assets/' )
cpx.watch('../lib/core/i18n/**/*.*', './dist-dev-temp//assets/adf-core/i18n' )
cpx.watch('../lib/process-services/i18n/**/*.*', './dist-dev-temp/assets/adf-process-services/i18n' )
cpx.watch('../lib/content-services/i18n/**/*.*', './dist-dev-temp/assets/adf-content-services/i18n' )
cpx.watch('../lib/insights/i18n/**/*.*', './dist-dev-temp//assets/adf-insights/i18n' )

View File

@ -1,42 +0,0 @@
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const path = require('path');
const extractScss = new ExtractTextPlugin('../lib/core/prebuilt-themes/[name].css');
module.exports = {
entry: {
'adf-blue-orange': '../lib/core/styles/prebuilt/adf-blue-orange.scss',
'adf-blue-purple': '../lib/core/styles/prebuilt/adf-blue-purple.scss',
'adf-cyan-orange': '../lib/core/styles/prebuilt/adf-cyan-orange.scss',
'adf-cyan-purple': '../lib/core/styles/prebuilt/adf-cyan-purple.scss',
'adf-green-purple': '../lib/core/styles/prebuilt/adf-green-purple.scss',
'adf-green-orange': '../lib/core/styles/prebuilt/adf-green-orange.scss',
'adf-pink-bluegrey': '../lib/core/styles/prebuilt/adf-pink-bluegrey.scss',
'adf-indigo-pink': '../lib/core/styles/prebuilt/adf-indigo-pink.scss',
'adf-purple-green': '../lib/core/styles/prebuilt/adf-purple-green.scss'
},
resolve: {
extensions: ['.ts', '.js'],
modules: [path.resolve(__dirname, '../node_modules')]
},
output: {
filename: '../dist/[name].js'
},
module: {
rules: [{
test: /\.scss$/,
use: extractScss.extract([{
loader: "raw-loader"
}, {
loader: "sass-loader"
}])
}]
},
plugins: [
extractScss
]
};

View File

@ -3,7 +3,7 @@
module.exports = function (config) {
config.set({
basePath: '',
basePath: './',
frameworks: ['jasmine', '@angular/cli'],
plugins: [
require('karma-jasmine'),

View File

@ -21,5 +21,9 @@ http {
location / {
try_files $uri $uri/ /index.html;
}
location ~ ^/[a-zA-Z0-9_-]+/ {
try_files $uri $uri/ /index.html;
}
}
}

View File

@ -1,29 +1,8 @@
{
"name": "Alfresco-ADF-Angular-Demo",
"description": "Demo shell for Alfresco Angular components",
"version": "2.3.1",
"version": "2.4.0",
"author": "Alfresco Software, Ltd.",
"scripts": {
"ng": "ng",
"prestart": "npm run validate-config",
"start": "npm run server-versions && rimraf dist && ng serve --host 0.0.0.0 --proxy-config proxy.conf.js --app dist --open",
"start:dev": " npm run lint && npm run server-versions && rimraf dist && npm run clean-lib-angular && concurrently \"ng serve --host 0.0.0.0 --disable-host-check --app dev --proxy-config proxy.conf.js --open\" \"npm run style:dev --watch\" \"npm run copy:dev\" ",
"start:dist": "npm run server-versions && rimraf dist && node --max_old_space_size=30000 node_modules/.bin/ng serve --prod --host 0.0.0.0 --disable-host-check --app dist --proxy-config proxy.conf.js -open",
"build": "npm run validate-config && npm run server-versions && rimraf dist && ng build --app dist",
"build:dev": "npm run validate-config && npm run lint && npm run style:dev && npm run server-versions && rimraf dist && ng build --app dev",
"build:dist": "npm run validate-config && npm run server-versions && rimraf dist && ng build --prod --app dist",
"style:dev": "npm run webpack -- --config config/webpack.style.js --progress --profile --bail",
"copy:dev": "node ./config/dev-copy-watch.js",
"test": " ng test --single-run",
"lint": "ng lint",
"e2e": "ng e2e",
"validate-config": "ajv validate -s ../lib/core/app-config/schema.json -d ./src/app.config.json --errors=text --verbose",
"server-versions": "rimraf ./src/versions.json && npm list --depth=0 --json=true --prod=true > ./src/versions.json || exit 0",
"clean": "rimraf dist node_modules typings",
"clean-lib-angular": "rimraf ../lib/node_modules/@angular",
"clean-lock": "rimraf package-lock.json",
"webpack": "node node_modules/webpack/bin/webpack.js"
},
"repository": {
"type": "git",
"url": "https://github.com/Alfresco/alfresco-ng2-components.git"
@ -32,96 +11,11 @@
"url": "https://github.com/Alfresco/alfresco-ng2-components/issues"
},
"license": "Apache-2.0",
"contributors": [
{
"name": "Denys Vuika",
"email": "denis.vuyka@gmail.com"
},
{
"name": "Mario Romano",
"email": "mario.romano83@gmail.com"
},
{
"name": "Will Abson",
"email": "will.abson@alfresco.com"
},
{
"name": "Eugenio Romano",
"email": "eugenio.romano@alfresco.com"
},
{
"name": "Maurizio Vitale",
"email": "maurizio.vitale@alfresco.com"
}
],
"keywords": [
"ng2",
"angular",
"angular2",
"alfresco"
],
"private": true,
"dependencies": {
"@alfresco/adf-content-services": "2.3.1",
"@alfresco/adf-core": "2.3.1",
"@alfresco/adf-insights": "2.3.1",
"@alfresco/adf-process-services": "2.3.1",
"@angular/animations": "5.1.1",
"@angular/cdk": "5.0.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.0.1",
"@angular/platform-browser": "5.1.1",
"@angular/platform-browser-dynamic": "5.1.1",
"@angular/router": "5.1.1",
"@mat-datetimepicker/core": "1.0.4",
"@mat-datetimepicker/moment": "1.0.4",
"@ngx-translate/core": "9.1.1",
"alfresco-js-api": "2.3.1",
"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": "2.0.265",
"raphael": "2.2.7",
"reflect-metadata": "0.1.10",
"rxjs": "5.5.2",
"web-animations-js": "2.3.1",
"zone.js": "0.8.14"
},
"devDependencies": {
"@angular/cli": "1.6.5",
"@angular/compiler-cli": "^5.2.0",
"@angular/language-service": "^5.2.0",
"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~6.0.60",
"ajv-cli": "^3.0.0",
"codelyzer": "4.1.0",
"concurrently": "^3.5.1",
"cpx": "^1.5.0",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.0",
"karma-chrome-launcher": "~2.2.0",
"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": "~4.1.0",
"tslint": "~5.9.1",
"typescript": "~2.5.3"
}
"private": true
}

View File

@ -21,7 +21,7 @@ exports.config = {
},
beforeLaunch: function() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
project: './demo-shell/e2e/tsconfig.e2e.json'
});
},
onPrepare() {

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Löschen zulassen",
"SHOW_COMMENTS": "Anmerkungen zu Versionen einblenden",
"ALLOW_DOWNLOAD": "Versions-Download zulassen"
"ALLOW_DOWNLOAD": "Versions-Download zulassen",
"READ_ONLY": "Schreibgeschützt"
},
"PERSONAL-FILES": "Persönliche Dateien",
"WARN-MULTIPLE-UPLOADS": "Warnung bei Mehrfach-Uploads anzeigen.",
"SEARCH": {
"RADIO": {
"NONE": "Keine",
"ALL": "Alle",
"FOLDER": "Ordner",
"DOCUMENT": "Dokument"
}
}
},
"title": "Willkommen",
@ -32,6 +43,7 @@
"APP_NAME": "ADF-Demoanwendung",
"HOME": "Startseite",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Breadcrumb",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Anmelden",
"CUSTOM_SOURCES": "Benutzerdefinierte Quellen",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Neuer Ordner",
"EDIT_FOLDER": "Ordner bearbeiten",
"DOWNLOAD": "Herunterladen",
"DELETE": "Löschen"
"DELETE": "Löschen",
"FAVORITES": "Zu Favoriten hinzufügen",
"SHARE": "Freigeben",
"THEME": "Farbschema auswählen",
"SHOW_VERSION": "Version anzeigen",
"HIDE_VERSION": "Version ausblenden",
"LISTVIEW": "Listenansichtsmodus"
},
"ACTIONS": {
"VERSIONS": "Versionen verwalten",

View File

@ -6,169 +6,199 @@
"PROPERTIES": "Properties",
"VERSIONS": "Versions"
},
"HOME": {
"TITLE": "Angular components for Alfresco",
"DOCUMENTATION": "Documentation"
},
"LOGOUT": {
"TITLE": "Logout Page",
"SUB_TITLE": "You are now logged out",
"LOGIN": "Login",
"HOME": "Home"
},
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Allow delete",
"SHOW_COMMENTS" : "Show comments on versions",
"ALLOW_DOWNLOAD" :"Enable version download"
"SHOW_COMMENTS": "Show comments on versions",
"ALLOW_DOWNLOAD": "Enable version download",
"READ_ONLY": "Read-only"
},
"PERSONAL-FILES": "Personal Files",
"WARN-MULTIPLE-UPLOADS": "Display warning for multiple uploads.",
"SEARCH": {
"RADIO": {
"NONE": "None",
"ALL": "All",
"FOLDER": "Folder",
"DOCUMENT": "Document"
}
}
},
"title": "Welcome",
"VERSION": {
"NO_PERMISSION": "You don't have permission to manage versions of this content",
"NO_PERMISSION_EVENT": "You don't have ${event.permission} permission to ${event.action} the ${event.type}",
"CHOOSE_FILE": "Select a file to see its versions",
"DIALOG": {
"CLOSE": "Close",
"TITLE": "Manage Versions"
}
},
"METADATA": {
"DIALOG": {
"CLOSE": "Close",
"TITLE": "Metadata"
}
},
"APP_LAYOUT": {
"APP_NAME": "ADF Demo Application",
"HOME": "Home",
"CONTENT_SERVICES": "Content Services",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Login",
"CUSTOM_SOURCES": "Custom Sources",
"DATATABLE": "Datatable",
"DATATABLE_LAZY": "Datatable (Lazy)",
"FORM": "Form",
"FORM_LIST": "Form List",
"FORM_LOADING": "Form Loading",
"UPLOADER": "Uploader",
"WEBSCRIPT": "Webscript",
"TAG": "Tag",
"TRASHCAN": "Trashcan",
"SOCIAL": "Social",
"SETTINGS": "Settings",
"OVERLAY_VIEWER": "Overlay Viewer",
"ABOUT": "About",
"SEARCH": "Extended Search",
"EXTENDED_SEARCH_QUERY_BODY": "Extended Search with Query Body",
"WORD_TO_SEARCH":"Search Word",
"SEARCH_CREATED_BY" : "Created By",
"SEARCH_SERVICE_APPROACH": "Check this to disable the input property and configure using the service"
},
"TRASHCAN" :{
"ACTIONS":{
"DELETE_PERMANENT":"Delete permanently",
"RESTORE":"Restore"
},
"EMPTY_STATE": {
"TITLE": "Trash is empty",
"FIRST_TEXT": "Items you delete are moved to the Trash.",
"SECOND_TEXT": "Empty Trash to permanently delete items."
}
},
"DOCUMENT_LIST": {
"MULTISELECT_CHECKBOXES" :"Multiselect (with checkboxes)",
"MULTIPLE_FILE_UPLOAD" :"Multiple File Upload",
"FOLDER_UPLOAD" :"Folder upload",
"CUSTOM_FILTER" :"Custom extensions filter",
"MAX_SIZE" : "Max size filter",
"ENABLE_VERSIONING" :"Enable versioning",
"DESCRIPTION_UPLOAD" : "Enable upload",
"ENABLE_INFINITE_SCROLL":"Enable Infinite Scrolling",
"MULTISELECT_DESCRIPTION" : "Use Cmd (Mac) or Ctrl (Windows) to toggle selection of multiple items",
"RECENT" : {
"EMPTY_STATE": {
"TITLE": "Recent Files list is empty"
},
"TITLE":"Recent Files"
},
"COLUMNS": {
"DISPLAY_NAME": "Display name",
"IS_LOCKED": "Lock",
"TAG": "Tag",
"CREATED_BY": "Created by",
"CREATED_ON": "Created on",
"CREATED": "Created",
"SIZE": "Size",
"DELETED_ON": "Deleted",
"DELETED_BY": "Deleted by"
},
"TOOLBAR": {
"CARDVIEW":"Card view mode",
"NEW_FOLDER":"New folder",
"EDIT_FOLDER":"Edit folder",
"DOWNLOAD":"Download",
"DELETE":"Delete"
},
"ACTIONS": {
"VERSIONS": "Manage versions",
"METADATA": "Info",
"DOWNLOAD": "Download",
"PERMISSION": "Permission",
"FOLDER": {
"COPY": "Copy",
"MOVE": "Move",
"DELETE": "Delete"
},
"DOCUMENT": {
"COPY": "Copy",
"MOVE": "Move",
"DELETE": "Delete",
"PROCESS_ACTION": "Start Process"
}
}
},
"DATATABLE" :{
"RESET_DEFAULT":"Reset to default",
"ADD_ROW":"Add row",
"REPLACE_ROWS":"Replace rows",
"REPLACE_COLUMNS":"Replace columns",
"LOAD_NODE":"Load Node",
"MULTISELECT":"Multiselect",
"MULTISELECT_DESCRIPTION":"Use Cmd (Mac) or Ctrl (Windows) to toggle selection of multiple items"
},
"ANALYTICS_REPORT": {
"NO_REPORT_MESSAGE": "No report selected. Choose a report from the list"
},
"PS-TAB": {
"TASKS-TAB": "Tasks",
"PROCESSES-TAB": "Process",
"REPORTS-TAB": "Reports",
"START-TASK": "Start task",
"START-PROCESS": "Start process",
"PROCESS-AUDIT-LOG": "Process Audit log",
"TASK-AUDIT-LOG": "Task Audit log"
},
"FORM-LIST": {
"STORE": "Store",
"RESTORE": "Restore"
},
"FORM-LOADING": {
"FORM_DATA" : "Form Data",
"FORM_DATA_MESSAGE": "Enter values to populate the form",
"TYPEAHEAD_PLACEHOLDER": "Typeahead",
"RADIO_PLACEHOLDER": "Radio Button",
"SELECT_PLACEHOLDER": "DropDown"
},
"LOGIN": {
"CONTENT_SERVICES": "Content Services",
"PROCESS_SERVICES": "Process Services",
"LOGIN_FOOTER": "Login footer"
},
"SEARCH": {
"RESULTS": "Search results",
"NO_RESULT": "No results found"
},
"SOCIAL": {
"LIKE":"Like component",
"RATING":"Rating component"
},
"TAG": {
"LIST":"List Tags Content Services",
"INSERT":"Insert Node ID",
"NODE_LIST":"Tag list By Node ID"
},
"DEMO_PERMISSION": {
"INHERIT_PERMISSION_BUTTON" :"Inherit Permission" ,
"INHERITED_PERMISSIONS_BUTTON" : "Permission Inherited"
"title": "Welcome",
"VERSION": {
"NO_PERMISSION": "You don't have permission to manage versions of this content",
"NO_PERMISSION_EVENT": "You don't have ${event.permission} permission to ${event.action} the ${event.type}",
"CHOOSE_FILE": "Select a file to see its versions",
"DIALOG": {
"CLOSE": "Close",
"TITLE": "Manage Versions"
}
},
"METADATA": {
"DIALOG": {
"CLOSE": "Close",
"TITLE": "Metadata"
}
},
"APP_LAYOUT": {
"APP_NAME": "ADF Demo Application",
"HOME": "Home",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Breadcrumb",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Login",
"CUSTOM_SOURCES": "Custom Sources",
"DATATABLE": "Datatable",
"DATATABLE_LAZY": "Datatable (Lazy)",
"FORM": "Form",
"FORM_LIST": "Form List",
"FORM_LOADING": "Form Loading",
"UPLOADER": "Uploader",
"WEBSCRIPT": "Webscript",
"TAG": "Tag",
"TRASHCAN": "Trashcan",
"SOCIAL": "Social",
"SETTINGS": "Settings",
"OVERLAY_VIEWER": "Overlay Viewer",
"ABOUT": "About",
"SEARCH": "Extended Search",
"NOTIFICATIONS": "Notifications",
"EXTENDED_SEARCH_QUERY_BODY": "Extended Search with Query Body",
"WORD_TO_SEARCH": "Search Word",
"SEARCH_CREATED_BY": "Created By",
"SEARCH_SERVICE_APPROACH": "Check this to disable the input property and configure using the service"
},
"TRASHCAN": {
"ACTIONS": {
"DELETE_PERMANENT": "Delete permanently",
"RESTORE": "Restore"
},
"EMPTY_STATE": {
"TITLE": "Trash is empty",
"FIRST_TEXT": "Items you delete are moved to the Trash.",
"SECOND_TEXT": "Empty Trash to permanently delete items."
}
},
"DOCUMENT_LIST": {
"MULTISELECT_CHECKBOXES": "Multiselect (with checkboxes)",
"THUMBNAILS" :"Enable Thumbnails",
"MULTIPLE_FILE_UPLOAD": "Multiple File Upload",
"FOLDER_UPLOAD": "Folder upload",
"CUSTOM_FILTER": "Custom extensions filter",
"MAX_SIZE": "Max size filter",
"ENABLE_VERSIONING": "Enable versioning",
"DESCRIPTION_UPLOAD": "Enable upload",
"ENABLE_INFINITE_SCROLL": "Enable Infinite Scrolling",
"MULTISELECT_DESCRIPTION": "Use Cmd (Mac) or Ctrl (Windows) to toggle selection of multiple items",
"RECENT": {
"EMPTY_STATE": {
"TITLE": "Recent Files list is empty"
},
"TITLE": "Recent Files"
},
"COLUMNS": {
"DISPLAY_NAME": "Display name",
"IS_LOCKED": "Lock",
"TAG": "Tag",
"CREATED_BY": "Created by",
"CREATED_ON": "Created on",
"CREATED": "Created",
"SIZE": "Size",
"DELETED_ON": "Deleted",
"DELETED_BY": "Deleted by"
},
"TOOLBAR": {
"CARDVIEW": "Card view mode",
"NEW_FOLDER": "New folder",
"EDIT_FOLDER": "Edit folder",
"DOWNLOAD": "Download",
"DELETE": "Delete",
"FAVORITES": "Add to favorites",
"SHARE": "Share",
"THEME": "Select a theme",
"SHOW_VERSION": "Show version",
"HIDE_VERSION": "Hide version",
"LISTVIEW": "List view mode"
},
"ACTIONS": {
"VERSIONS": "Manage versions",
"METADATA": "Info",
"DOWNLOAD": "Download",
"PERMISSION": "Permission",
"FOLDER": {
"COPY": "Copy",
"MOVE": "Move",
"DELETE": "Delete"
},
"DOCUMENT": {
"COPY": "Copy",
"MOVE": "Move",
"DELETE": "Delete",
"PROCESS_ACTION": "Start Process"
}
}
},
"DATATABLE": {
"RESET_DEFAULT": "Reset to default",
"ADD_ROW": "Add row",
"REPLACE_ROWS": "Replace rows",
"REPLACE_COLUMNS": "Replace columns",
"LOAD_NODE": "Load Node",
"MULTISELECT": "Multiselect",
"MULTISELECT_DESCRIPTION": "Use Cmd (Mac) or Ctrl (Windows) to toggle selection of multiple items"
},
"ANALYTICS_REPORT": {
"NO_REPORT_MESSAGE": "No report selected. Choose a report from the list"
},
"PS-TAB": {
"TASKS-TAB": "Tasks",
"PROCESSES-TAB": "Process",
"REPORTS-TAB": "Reports",
"START-TASK": "Start task",
"START-PROCESS": "Start process",
"PROCESS-AUDIT-LOG": "Process Audit log",
"TASK-AUDIT-LOG": "Task Audit log"
},
"FORM-LIST": {
"STORE": "Store",
"RESTORE": "Restore"
},
"FORM-LOADING": {
"FORM_DATA": "Form Data",
"FORM_DATA_MESSAGE": "Enter values to populate the form",
"TYPEAHEAD_PLACEHOLDER": "Typeahead",
"RADIO_PLACEHOLDER": "Radio Button",
"SELECT_PLACEHOLDER": "DropDown"
},
"LOGIN": {
"CONTENT_SERVICES": "Content Services",
"PROCESS_SERVICES": "Process Services",
"LOGIN_FOOTER": "Login footer"
},
"SEARCH": {
"RESULTS": "Search results",
"NO_RESULT": "No results found"
},
"SOCIAL": {
"LIKE": "Like component",
"RATING": "Rating component"
},
"TAG": {
"LIST": "List Tags Content Services",
"INSERT": "Insert Node ID",
"NODE_LIST": "Tag list By Node ID"
},
"DEMO_PERMISSION": {
"INHERIT_PERMISSION_BUTTON": "Inherit Permission",
"INHERITED_PERMISSIONS_BUTTON": "Permission Inherited"
}
}

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Permitir eliminar",
"SHOW_COMMENTS": "Mostrar comentarios en las versiones",
"ALLOW_DOWNLOAD": "Permitir descarga de la versión"
"ALLOW_DOWNLOAD": "Permitir descarga de la versión",
"READ_ONLY": "Solo lectura"
},
"PERSONAL-FILES": "Ficheros personales",
"WARN-MULTIPLE-UPLOADS": "Mostrar advertencia de múltiples cargas.",
"SEARCH": {
"RADIO": {
"NONE": "Ninguno",
"ALL": "Todos",
"FOLDER": "Carpeta",
"DOCUMENT": "Documento"
}
}
},
"title": "Bienvenido",
@ -32,6 +43,7 @@
"APP_NAME": "Aplicación ADF Demo",
"HOME": "Inicio",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Ruta de navegación",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Iniciar sesión",
"CUSTOM_SOURCES": "Fuentes personalizadas",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Nueva carpeta",
"EDIT_FOLDER": "Editar carpeta",
"DOWNLOAD": "Descargar",
"DELETE": "Eliminar"
"DELETE": "Eliminar",
"FAVORITES": "Añadir a Favoritos",
"SHARE": "Compartir",
"THEME": "Seleccionar un tema",
"SHOW_VERSION": "Mostrar versión",
"HIDE_VERSION": "Ocultar versión",
"LISTVIEW": "Modo de vista de lista"
},
"ACTIONS": {
"VERSIONS": "Gestionar versiones",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Autoriser la suppression",
"SHOW_COMMENTS": "Afficher les commentaires sur les versions",
"ALLOW_DOWNLOAD": "Autoriser le téléchargement de la version"
"ALLOW_DOWNLOAD": "Autoriser le téléchargement de la version",
"READ_ONLY": "Lecture seule"
},
"PERSONAL-FILES": "Fichiers personnels",
"WARN-MULTIPLE-UPLOADS": "Avertir en cas de téléchargements multiples.",
"SEARCH": {
"RADIO": {
"NONE": "Aucune",
"ALL": "Tout",
"FOLDER": "Dossier",
"DOCUMENT": "Document"
}
}
},
"title": "Bienvenue",
@ -32,6 +43,7 @@
"APP_NAME": "Application Démo ADF",
"HOME": "Accueil",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Fil d'Ariane",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Connexion",
"CUSTOM_SOURCES": "Sources personnalisées",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Nouveau Dossier",
"EDIT_FOLDER": "Modifier le dossier",
"DOWNLOAD": "Télécharger",
"DELETE": "Supprimer"
"DELETE": "Supprimer",
"FAVORITES": "Ajouter aux favoris",
"SHARE": "Partager",
"THEME": "Sélectionner un thème",
"SHOW_VERSION": "Afficher la version",
"HIDE_VERSION": "Masquer la version",
"LISTVIEW": "Mode Liste"
},
"ACTIONS": {
"VERSIONS": "Gérer les versions",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Consenti eliminazione",
"SHOW_COMMENTS": "Mostra commenti sulle versioni",
"ALLOW_DOWNLOAD": "Abilita download versioni"
"ALLOW_DOWNLOAD": "Abilita download versioni",
"READ_ONLY": "Sola lettura"
},
"PERSONAL-FILES": "File personali",
"WARN-MULTIPLE-UPLOADS": "Mostra avviso per caricamenti multipli.",
"SEARCH": {
"RADIO": {
"NONE": "Nessuno",
"ALL": "Tutti",
"FOLDER": "Cartella",
"DOCUMENT": "Documento"
}
}
},
"title": "Benvenuto",
@ -32,6 +43,7 @@
"APP_NAME": "Applicazione demo ADF",
"HOME": "Home",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Breadcrumb",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Login",
"CUSTOM_SOURCES": "Fonti personalizzate",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Nuova cartella",
"EDIT_FOLDER": "Modifica cartella",
"DOWNLOAD": "Download",
"DELETE": "Elimina"
"DELETE": "Elimina",
"FAVORITES": "Aggiungi ai preferiti",
"SHARE": "Condividi",
"THEME": "Seleziona un tema",
"SHOW_VERSION": "Mostra versione",
"HIDE_VERSION": "Nascondi versione",
"LISTVIEW": "Modalità vista elenco"
},
"ACTIONS": {
"VERSIONS": "Gestione versioni",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "削除を許可する",
"SHOW_COMMENTS": "バージョンに関するコメントを表示",
"ALLOW_DOWNLOAD": "バージョンのダウンロードを許可する"
"ALLOW_DOWNLOAD": "バージョンのダウンロードを許可する",
"READ_ONLY": "読取り専用"
},
"PERSONAL-FILES": "個人的なファイル",
"WARN-MULTIPLE-UPLOADS": "複数のアップロードの警告を表示します。",
"SEARCH": {
"RADIO": {
"NONE": "なし",
"ALL": "すべて",
"FOLDER": "フォルダ",
"DOCUMENT": "文書"
}
}
},
"title": "ようこそ",
@ -32,6 +43,7 @@
"APP_NAME": "ADF デモアプリケーション",
"HOME": "ホーム",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "階層リンク",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "ログイン",
"CUSTOM_SOURCES": "カスタムソース",
@ -97,7 +109,13 @@
"NEW_FOLDER": "新しいフォルダ",
"EDIT_FOLDER": "フォルダの編集",
"DOWNLOAD": "ダウンロード",
"DELETE": "削除"
"DELETE": "削除",
"FAVORITES": "[お気に入り] に追加",
"SHARE": "共有",
"THEME": "テーマを選択してください",
"SHOW_VERSION": "バージョンを表示する",
"HIDE_VERSION": "バージョンを隠す",
"LISTVIEW": "一覧表示モード"
},
"ACTIONS": {
"VERSIONS": "バージョンの管理",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Tillat sletting",
"SHOW_COMMENTS": "Vis kommentarer om versjoner",
"ALLOW_DOWNLOAD": "Tillat versjonsnedlasting"
"ALLOW_DOWNLOAD": "Tillat versjonsnedlasting",
"READ_ONLY": "Skrivebeskyttet"
},
"PERSONAL-FILES": "Personlige filer",
"WARN-MULTIPLE-UPLOADS": "Vis advarsel for flere opplastinger.",
"SEARCH": {
"RADIO": {
"NONE": "Ingen",
"ALL": "Alle",
"FOLDER": "Mappe",
"DOCUMENT": "Dokument"
}
}
},
"title": "Velkommen",
@ -32,6 +43,7 @@
"APP_NAME": "ADF-demoprogam",
"HOME": "Hjem",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Søkebane",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Logg på",
"CUSTOM_SOURCES": "Tilpassede kilder",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Ny mappe",
"EDIT_FOLDER": "Rediger mappe",
"DOWNLOAD": "Last ned",
"DELETE": "Slett"
"DELETE": "Slett",
"FAVORITES": "Legg til favoritter",
"SHARE": "Del",
"THEME": "Velg et tema",
"SHOW_VERSION": "Vis versjon",
"HIDE_VERSION": "Skjul versjon",
"LISTVIEW": "Listevisningsmodus"
},
"ACTIONS": {
"VERSIONS": "Administrer versjoner",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Verwijderen toestaan",
"SHOW_COMMENTS": "Opmerkingen over versies tonen",
"ALLOW_DOWNLOAD": "Downloaden van versies toestaan"
"ALLOW_DOWNLOAD": "Downloaden van versies toestaan",
"READ_ONLY": "Alleen-lezen"
},
"PERSONAL-FILES": "Persoonlijke bestanden",
"WARN-MULTIPLE-UPLOADS": "Waarschuwing weergeven bij meerdere uploads.",
"SEARCH": {
"RADIO": {
"NONE": "Geen",
"ALL": "Alle",
"FOLDER": "Map",
"DOCUMENT": "Document"
}
}
},
"title": "Welkom",
@ -32,6 +43,7 @@
"APP_NAME": "ADF-demotoepassing",
"HOME": "Home",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Navigatiepad",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Aanmelden",
"CUSTOM_SOURCES": "Aangepaste bronnen",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Nieuwe map",
"EDIT_FOLDER": "Map bewerken",
"DOWNLOAD": "Downloaden",
"DELETE": "Verwijderen"
"DELETE": "Verwijderen",
"FAVORITES": "Toevoegen aan favorieten",
"SHARE": "Delen",
"THEME": "Een thema selecteren",
"SHOW_VERSION": "Versie weergeven",
"HIDE_VERSION": "Versie verbergen",
"LISTVIEW": "Lijstweergavemodus"
},
"ACTIONS": {
"VERSIONS": "Versies beheren",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Permitir apagar",
"SHOW_COMMENTS": "Mostrar comentários em versões",
"ALLOW_DOWNLOAD": "Permitir download da versão"
"ALLOW_DOWNLOAD": "Permitir download da versão",
"READ_ONLY": "Somente leitura"
},
"PERSONAL-FILES": "Arquivos pessoais",
"WARN-MULTIPLE-UPLOADS": "Exibir alerta para vários uploads.",
"SEARCH": {
"RADIO": {
"NONE": "Nenhum",
"ALL": "Todos",
"FOLDER": "Pasta",
"DOCUMENT": "Documento"
}
}
},
"title": "Bem-vindo",
@ -32,6 +43,7 @@
"APP_NAME": "Aplicativo Demo ADF",
"HOME": "Página Inicial",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Trilha de navegação",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Login",
"CUSTOM_SOURCES": "Origens Personalizadas",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Nova Pasta",
"EDIT_FOLDER": "Editar pasta",
"DOWNLOAD": "Download",
"DELETE": "Excluir"
"DELETE": "Excluir",
"FAVORITES": "Adicionar aos favoritos",
"SHARE": "Compartilhar",
"THEME": "Selecionar um tema",
"SHOW_VERSION": "Mostrar versão",
"HIDE_VERSION": "Ocultar versão",
"LISTVIEW": "Modo de exibição em lista"
},
"ACTIONS": {
"VERSIONS": "Gerenciar versões",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "Разрешить удаление",
"SHOW_COMMENTS": "Показать комментарии к версиям",
"ALLOW_DOWNLOAD": "Разрешить загрузку версии"
"ALLOW_DOWNLOAD": "Разрешить загрузку версии",
"READ_ONLY": "Только чтение"
},
"PERSONAL-FILES": "Личные файлы",
"WARN-MULTIPLE-UPLOADS": "Показывать предупреждение для нескольких загрузок.",
"SEARCH": {
"RADIO": {
"NONE": "Нет",
"ALL": "Все",
"FOLDER": "Папка",
"DOCUMENT": "Документ"
}
}
},
"title": "Добро пожаловать",
@ -32,6 +43,7 @@
"APP_NAME": "Демонстрационное приложение ADF",
"HOME": "Домашняя",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "Иерархия",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "Войти",
"CUSTOM_SOURCES": "Пользовательские источники",
@ -97,7 +109,13 @@
"NEW_FOLDER": "Новая папка",
"EDIT_FOLDER": "Редактировать папку",
"DOWNLOAD": "Скачать",
"DELETE": "Удалить"
"DELETE": "Удалить",
"FAVORITES": "Добавить в избранное",
"SHARE": "Открыть доступ",
"THEME": "Выберите тему",
"SHOW_VERSION": "Показать версию",
"HIDE_VERSION": "Скрыть версию",
"LISTVIEW": "Режим просмотра списка"
},
"ACTIONS": {
"VERSIONS": "Управление версиями",

View File

@ -9,7 +9,18 @@
"ADF_VERSION_MANAGER": {
"ALLOW_DELETE": "允许删除",
"SHOW_COMMENTS": "显示有关版本的注释",
"ALLOW_DOWNLOAD": "允许版本下载"
"ALLOW_DOWNLOAD": "允许版本下载",
"READ_ONLY": "只读"
},
"PERSONAL-FILES": "个人文件",
"WARN-MULTIPLE-UPLOADS": "针对多个上传显示警告。",
"SEARCH": {
"RADIO": {
"NONE": "无",
"ALL": "全部",
"FOLDER": "文件夹",
"DOCUMENT": "文档"
}
}
},
"title": "欢迎使用",
@ -32,6 +43,7 @@
"APP_NAME": "ADF 演示应用程序",
"HOME": "主页",
"CONTENT_SERVICES": "Content Services",
"BREADCRUMB": "面包屑",
"PROCESS_SERVICES": "Process Services",
"LOGIN": "登录",
"CUSTOM_SOURCES": "自定义来源",
@ -97,7 +109,13 @@
"NEW_FOLDER": "新建文件夹",
"EDIT_FOLDER": "编辑文件夹",
"DOWNLOAD": "下载",
"DELETE": "删除"
"DELETE": "删除",
"FAVORITES": "添加到收藏夹",
"SHARE": "共享",
"THEME": "选择主题",
"SHOW_VERSION": "显示版本",
"HIDE_VERSION": "隐藏版本",
"LISTVIEW": "列表视图模式"
},
"ACTIONS": {
"VERSIONS": "管理版本",

View File

@ -2,9 +2,23 @@
"$schema": "../../lib/core/app-config/schema.json",
"ecmHost": "http://{hostname}:{port}",
"bpmHost": "http://{hostname}:{port}",
"loginRoute": "login",
"providers": "ALL",
"contextRootBpm": "activiti-app",
"authType" : "BASIC",
"oauth2": {
"host": "http://localhost:30081/auth/realms/myrealm",
"clientId": "activiti",
"scope": "openid",
"secret": "",
"implicitFlow": true,
"silentLogin": true,
"redirectUri": "/",
"redirectUriLogout": "/logout"
},
"application": {
"name": "Alfresco ADF Application"
"name": "Alfresco ADF Application",
"copyright": "© 2016 - 2018 Alfresco Software, Inc. All Rights Reserved."
},
"languages": [
{
@ -53,53 +67,50 @@
}
],
"search": {
"limits": {
"permissionEvaluationTime": null,
"permissionEvaluationCount": null
"include": ["path", "allowableOperations"],
"sorting": {
"options": [
{ "key": "name", "label": "Name", "type": "FIELD", "field": "cm:name", "ascending": true },
{ "key": "content.sizeInBytes", "label": "Size", "type": "FIELD", "field": "content.size", "ascending": true },
{ "key": "description", "label": "Description", "type": "FIELD", "field": "cm:description", "ascending": true }
],
"defaults": [
{ "key": "name", "type": "FIELD", "field": "cm:name", "ascending": true }
]
},
"filterQueries": [
{ "query": "TYPE:'cm:folder' OR TYPE:'cm:content'" },
{ "query": "NOT cm:creator:System" }
],
"facetFields": {
"facets": [
{ "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" }
"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" }
],
"facetQueries": {
"label": "My facet queries",
"pageSize": 5,
"queries": [
{ "query": "created:2018", "label": "Created This Year" },
{ "query": "content.mimetype", "label": "Type" },
{ "query": "content.size:[0 TO 10240]", "label": "Size: xtra small"},
{ "query": "content.size:[10240 TO 102400]", "label": "Size: small"},
{ "query": "content.size:[102400 TO 1048576]", "label": "Size: medium" },
{ "query": "content.size:[1048576 TO 16777216]", "label": "Size: large" },
{ "query": "content.size:[16777216 TO 134217728]", "label": "Size: xtra large" },
{ "query": "content.size:[134217728 TO MAX]", "label": "Size: XX large" }
]
},
"facetQueries": [
{ "query": "created:2018", "label": "Created This Year" },
{ "query": "content.mimetype", "label": "Type" },
{ "query": "content.size:[0 TO 10240]", "label": "Size: xtra small"},
{ "query": "content.size:[10240 TO 102400]", "label": "Size: small"},
{ "query": "content.size:[102400 TO 1048576]", "label": "Size: medium" },
{ "query": "content.size:[1048576 TO 16777216]", "label": "Size: large" },
{ "query": "content.size:[16777216 TO 134217728]", "label": "Size: xtra large" },
{ "query": "content.size:[134217728 TO MAX]", "label": "Size: XX large" }
],
"query": {
"categories": [
{
"id": "broken",
"name": "Broken Facet",
"enabled": false,
"expanded": false,
"component": {
"selector": "adf-search-text",
"settings": {
"field": "fieldname"
}
}
},
"categories": [
{
"id": "queryName",
"name": "Name",
"enabled": true,
"expanded": true,
"component": {
"selector": "adf-search-text",
"selector": "text",
"settings": {
"pattern": "cm:name:'(.*?)'",
"field": "cm:name",
@ -108,35 +119,15 @@
}
},
{
"id": "queryFields",
"name": "Fields",
"id": "checkList",
"name": "Check List",
"enabled": true,
"expanded": false,
"component": {
"selector": "adf-search-fields",
"selector": "check-list",
"settings": {
"field": null,
"pageSize": 5,
"operator": "OR",
"options": [
{ "name": "Name", "value": "name", "fields": ["name"], "default": true },
{ "name": "File Size", "value": "content.sizeInBytes", "fields": ["content"], "default": true },
{ "name": "Modified On", "value": "modifiedAt", "fields": ["modifiedAt"], "default": true },
{ "name": "Modified By", "value": "modifiedByUser.displayName", "fields": ["modifiedByUser"], "default": true }
]
}
}
},
{
"id": "queryType",
"name": "Type",
"enabled": true,
"expanded": false,
"component": {
"selector": "adf-search-radio",
"settings": {
"field": null,
"options": [
{ "name": "None", "value": "", "default": true },
{ "name": "All", "value": "TYPE:'cm:folder' OR TYPE:'cm:content'" },
{ "name": "Folder", "value": "TYPE:'cm:folder'" },
{ "name": "Document", "value": "TYPE:'cm:content'" }
]
@ -144,25 +135,63 @@
}
},
{
"id": "queryLocations",
"name": "Locations",
"id": "contentSize",
"name": "Content Size",
"enabled": true,
"expanded": false,
"component": {
"selector": "adf-search-scope-locations",
"selector": "slider",
"settings": {
"field": "cm:content.size",
"min": 0,
"max": 18,
"step": 1,
"thumbLabel": true
}
}
},
{
"id": "contentSizeRange",
"name": "Content Size (range)",
"enabled": true,
"component": {
"selector": "number-range",
"settings": {
"field": "cm:content.size",
"format": "[{FROM} TO {TO}]"
}
}
},
{
"id": "createdDateRange",
"name": "Created Date (range)",
"enabled": true,
"component": {
"selector": "date-range",
"settings": {
"field": "cm:created",
"dateFormat": "DD-MMM-YY"
}
}
},
{
"id": "queryType",
"name": "Type",
"enabled": true,
"component": {
"selector": "radio",
"settings": {
"field": null,
"pageSize": 5,
"options": [
{ "name": "Default", "value": "nodes", "default": true },
{ "name": "Nodes", "value": "nodes" },
{ "name": "Deleted Nodes", "value": "deleted-nodes" },
{ "name": "Versions", "value": "versions" }
{ "name": "APP.SEARCH.RADIO.NONE", "value": "", "default": true },
{ "name": "APP.SEARCH.RADIO.ALL", "value": "TYPE:'cm:folder' OR TYPE:'cm:content'" },
{ "name": "APP.SEARCH.RADIO.FOLDER", "value": "TYPE:'cm:folder'" },
{ "name": "APP.SEARCH.RADIO.DOCUMENT", "value": "TYPE:'cm:content'" }
]
}
}
}
]
}
]
},
"pagination": {
"size": 25,
@ -485,8 +514,8 @@
}
}
},
"adf-version-manager": {
"allowComments": true,
"allowDownload": true
"sideNav": {
"expandedSidenav": true,
"preserveState": true
}
}

View File

@ -1,3 +1,2 @@
<router-outlet></router-outlet>
<app-log></app-log>
<router-outlet name="overlay"></router-outlet>

View File

@ -1,43 +1,7 @@
.empty-list {
.adf-data-table {
height: 100%;
tr:hover, tr:focus {
cursor: default;
}
}
&__block {
display: flex;
flex-direction: column;
align-items: center;
p {
line-height: 0;
}
}
&__title {
font-size: 18px;
font-weight: 600;
}
&__subtitle {
font-size: 14px;
font-weight: 300;
}
&__block > mat-icon {
font-size: 52px;
height: 52px;
width: 52px;
}
}
router-outlet[name="overlay"] + * {
width: 100%;
height: 100%;
z-index: 999999;
z-index: 999;
position: absolute;
top: 0;
right: 0;
@ -53,7 +17,7 @@ router-outlet[name="overlay"] + * {
.adf-data-table-cell:first-child,
.adf-data-table-cell:nth-child(2) {
display: table-cell;
}
}
}
}
}

View File

@ -15,30 +15,35 @@
* limitations under the License.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { SettingsService, PageTitleService, StorageService, TranslationService } from '@alfresco/adf-core';
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
import { AuthenticationService, AlfrescoApiService, PageTitleService } from '@alfresco/adf-core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
encapsulation: ViewEncapsulation.None
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class AppComponent {
export class AppComponent implements OnInit {
constructor(private settingsService: SettingsService,
private storage: StorageService,
translationService: TranslationService,
pageTitleService: PageTitleService,
route: ActivatedRoute) {
this.setProvider();
pageTitleService.setTitle();
}
private setProvider() {
if (this.storage.hasItem(`providers`)) {
this.settingsService.setProviders(this.storage.getItem(`providers`));
constructor(private pageTitleService: PageTitleService,
private alfrescoApiService: AlfrescoApiService,
private authenticationService: AuthenticationService,
private router: Router) {
}
ngOnInit() {
this.pageTitleService.setTitle('title');
this.alfrescoApiService.getInstance().on('error', (error) => {
if (error.status === 401) {
if (!this.authenticationService.isLoggedIn()) {
this.router.navigate(['/login']);
}
}
});
}
}
}

View File

@ -6,11 +6,12 @@ import { ChartsModule } from 'ng2-charts';
import { HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppConfigService, TRANSLATION_PROVIDER } from '@alfresco/adf-core';
import { AppConfigService, TRANSLATION_PROVIDER, DebugAppConfigService } from '@alfresco/adf-core';
import { AppComponent } from './app.component';
import { AdfModule } from './adf.module';
import { MaterialModule } from './material.module';
import { LoginComponent } from './components/login/login.component';
import { LogoutComponent } from './components/logout/logout.component';
import { SettingsComponent } from './components/settings/settings.component';
import { AppLayoutComponent } from './components/app-layout/app-layout.component';
import { HomeComponent } from './components/home/home.component';
@ -42,7 +43,6 @@ import { MetadataDialogAdapterComponent } from './components/files/metadata-dial
import { BlobPreviewComponent } from './components/blob-preview/blob-preview.component';
import { ThemePickerModule } from './components/theme-picker/theme-picker';
import { DebugAppConfigService } from './services/debug-app-config.service';
import { routing } from './app.routes';
import { ReactiveFormsModule } from '@angular/forms';
@ -51,6 +51,8 @@ import { ProcessAttachmentsComponent } from './components/process-service/proces
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
import { PreviewService } from './services/preview.service';
import { BreadcrumbDemoComponent } from './components/breadcrumb-demo/breadcrumb-demo.component';
import { NotificationsComponent } from './components/notifications/notifications.component';
@NgModule({
imports: [
@ -69,6 +71,7 @@ import { PreviewService } from './services/preview.service';
declarations: [
AppComponent,
LoginComponent,
LogoutComponent,
SettingsComponent,
AppLayoutComponent,
HomeComponent,
@ -101,10 +104,12 @@ import { PreviewService } from './services/preview.service';
FormLoadingComponent,
DemoPermissionComponent,
FormLoadingComponent,
BlobPreviewComponent
BlobPreviewComponent,
BreadcrumbDemoComponent,
NotificationsComponent
],
providers: [
{ provide: AppConfigService, useClass: DebugAppConfigService },
{ provide: AppConfigService, useClass: DebugAppConfigService }, // not use this service in production
{
provide: TRANSLATION_PROVIDER,
multi: true,
@ -123,11 +128,7 @@ import { PreviewService } from './services/preview.service';
},
PreviewService
],
entryComponents: [
VersionManagerDialogAdapterComponent,
MetadataDialogAdapterComponent
],
entryComponents: [VersionManagerDialogAdapterComponent, MetadataDialogAdapterComponent],
bootstrap: [AppComponent]
})
export class AppModule {
}
export class AppModule {}

View File

@ -17,11 +17,12 @@
import { ModuleWithProviders } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard, AuthGuardBpm, AuthGuardEcm } from '@alfresco/adf-core';
import { AuthGuard, AuthGuardEcm, ErrorContentComponent, AuthGuardBpm } from '@alfresco/adf-core';
import { AppLayoutComponent } from './components/app-layout/app-layout.component';
import { LoginComponent } from './components/login/login.component';
import { SettingsComponent } from './components/settings/settings.component';
import { HomeComponent } from './components/home/home.component';
import { LogoutComponent } from './components/logout/logout.component';
import { AboutComponent } from './components/about/about.component';
import { ProcessServiceComponent } from './components/process-service/process-service.component';
import { ShowDiagramComponent } from './components/process-service/show-diagram.component';
@ -47,13 +48,31 @@ import { SharedLinkViewComponent } from './components/shared-link-view/shared-li
import { FormLoadingComponent } from './components/form/form-loading.component';
import { DemoPermissionComponent } from './components/permissions/demo-permissions.component';
import { BlobPreviewComponent } from './components/blob-preview/blob-preview.component';
import { BreadcrumbDemoComponent } from './components/breadcrumb-demo/breadcrumb-demo.component';
import { NotificationsComponent } from './components/notifications/notifications.component';
export const appRoutes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'logout', component: LogoutComponent },
{ path: 'settings', component: SettingsComponent },
{ path: 'files/:nodeId/view', component: FileViewComponent, canActivate: [ AuthGuardEcm ], outlet: 'overlay' },
{ path: 'preview/blob', component: BlobPreviewComponent, outlet: 'overlay', pathMatch: 'full' },
{ path: 'preview/s/:id', component: SharedLinkViewComponent },
{
path: 'breadcrumb',
component: BreadcrumbDemoComponent,
canActivate: [AuthGuardEcm]
},
{
path: 'notifications',
component: AppLayoutComponent ,
children: [
{
path: '',
component: NotificationsComponent
}
]
},
{
path: '',
component: AppLayoutComponent,
@ -125,17 +144,32 @@ export const appRoutes: Routes = [
component: ProcessServiceComponent,
canActivate: [AuthGuardBpm]
},
{
path: 'activiti/apps/:appId/tasks/:filterId',
component: ProcessServiceComponent,
canActivate: [AuthGuardBpm]
},
{
path: 'activiti/apps/:appId/processes',
component: ProcessServiceComponent,
canActivate: [AuthGuardBpm]
},
{
path: 'activiti/apps/:appId/processes/:filterId',
component: ProcessServiceComponent,
canActivate: [AuthGuardBpm]
},
{
path: 'activiti/apps/:appId/diagram/:processDefinitionId',
component: ShowDiagramComponent,
canActivate: [AuthGuardBpm]
},
// TODO: check if neeeded
{
path: 'activiti/apps/:appId/report',
component: ProcessServiceComponent,
canActivate: [AuthGuardBpm]
},
// TODO: check if needed
{
path: 'activiti/appId/:appId',
component: ProcessServiceComponent,
@ -185,9 +219,18 @@ export const appRoutes: Routes = [
{
path: 'datatable-lazy',
loadChildren: 'app/components/lazy-loading/lazy-loading.module#LazyLoadingModule'
},
{
path: 'error/:id',
component: ErrorContentComponent
},
{
path: '**',
redirectTo: 'error/404'
}
]
}
];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes, { initialNavigation: true });

View File

@ -1,49 +1 @@
<div class="about-container">
<h3>Server settings</h3>
<mat-list>
<small>The values below are taken from the AppConfigService </small>
<mat-list-item>
<h4 matLine> Alfresco Process Services URL: {{ bpmHost }}</h4>
</mat-list-item>
<mat-divider></mat-divider>
<mat-list-item>
<h4 matLine>Alfresco Content Services URL: {{ ecmHost }}</h4>
</mat-list-item>
</mat-list>
<h3>Product Versions</h3>
<div *ngIf="bpmVersion">
<h3>BPM</h3>
<label> Edition </label> {{ bpmVersion.edition }}
<p></p>
<label> Version </label> {{ bpmVersion.majorVersion }}.{{ bpmVersion.minorVersion }}.{{ bpmVersion.revisionVersion }}
</div>
<div *ngIf="ecmVersion">
<h3>ECM</h3>
<label> Edition </label> {{ ecmVersion.edition }}
<p></p>
<label> Version </label> {{ ecmVersion.version.display }}
<p></p>
<h4>License</h4>
<adf-datatable [data]="license"></adf-datatable>
<h4> Status</h4>
<adf-datatable [data]="status"></adf-datatable>
<h4>Modules</h4>
<adf-datatable [data]="modules"></adf-datatable>
</div>
<div *ngIf="githubUrlCommitAlpha">
<h3>Source code</h3>
<small>You are running the project based on the following commit:</small>
<div>
<a [href]="githubUrlCommitAlpha">{{githubUrlCommitAlpha}}</a>
</div>
</div>
<h3>Packages</h3>
<small>Current project is using the following ADF libraries:</small>
<adf-datatable [data]="data"></adf-datatable>
</div>
<adf-about></adf-about>

View File

@ -15,123 +15,12 @@
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
import { Http } from '@angular/http';
import {
AuthenticationService,
AppConfigService,
BpmProductVersionModel,
DiscoveryApiService,
EcmProductVersionModel,
ObjectDataTableAdapter
} from '@alfresco/adf-core';
import { Component } from '@angular/core';
@Component({
selector: 'app-about-page',
templateUrl: './about.component.html',
styleUrls: ['./about.component.css']
templateUrl: './about.component.html'
})
export class AboutComponent implements OnInit {
export class AboutComponent {
data: ObjectDataTableAdapter;
status: ObjectDataTableAdapter;
license: ObjectDataTableAdapter;
modules: ObjectDataTableAdapter;
githubUrlCommitAlpha = 'https://github.com/Alfresco/alfresco-ng2-components/commits/';
ecmHost = '';
bpmHost = '';
ecmVersion: EcmProductVersionModel = null;
bpmVersion: BpmProductVersionModel = null;
constructor(private http: Http,
private appConfig: AppConfigService,
private authService: AuthenticationService,
private discovery: DiscoveryApiService) {
}
ngOnInit() {
if (this.authService.isEcmLoggedIn()) {
this.discovery.getEcmProductInfo().subscribe((ecmVers) => {
this.ecmVersion = ecmVers;
this.modules = new ObjectDataTableAdapter(this.ecmVersion.modules, [
{type: 'text', key: 'id', title: 'ID', sortable: true},
{type: 'text', key: 'title', title: 'Title', sortable: true},
{type: 'text', key: 'version', title: 'Description', sortable: true},
{type: 'text', key: 'installDate', title: 'Install Date', sortable: true},
{type: 'text', key: 'installState', title: 'Install State', sortable: true},
{type: 'text', key: 'versionMin', title: 'Version Minor', sortable: true},
{type: 'text', key: 'versionMax', title: 'Version Max', sortable: true}
]);
this.status = new ObjectDataTableAdapter([this.ecmVersion.status], [
{type: 'text', key: 'isReadOnly', title: 'ReadOnly', sortable: true},
{type: 'text', key: 'isAuditEnabled', title: 'Is Audit Enable', sortable: true},
{type: 'text', key: 'isQuickShareEnabled', title: 'Is quick shared enable', sortable: true},
{type: 'text', key: 'isThumbnailGenerationEnabled', title: 'Thumbnail Generation', sortable: true}
]);
this.license = new ObjectDataTableAdapter([this.ecmVersion.license], [
{type: 'text', key: 'issuedAt', title: 'Issued At', sortable: true},
{type: 'text', key: 'expiresAt', title: 'Expires At', sortable: true},
{type: 'text', key: 'remainingDays', title: 'Remaining Days', sortable: true},
{type: 'text', key: 'holder', title: 'Holder', sortable: true},
{type: 'text', key: 'mode', title: 'Mode', sortable: true},
{type: 'text', key: 'isClusterEnabled', title: 'Is Cluster Enabled', sortable: true},
{type: 'text', key: 'isCryptodocEnabled', title: 'Is Cryptodoc Enable', sortable: true}
]);
});
}
if (this.authService.isBpmLoggedIn()) {
this.discovery.getBpmProductInfo().subscribe((bpmVers) => {
this.bpmVersion = bpmVers;
});
}
this.http.get('/versions.json').subscribe(response => {
const regexp = new RegExp('^(@alfresco)');
const alfrescoPackages = Object.keys(response.json().dependencies).filter((val) => {
return regexp.test(val);
});
const alfrescoPackagesTableRepresentation = [];
alfrescoPackages.forEach((val) => {
alfrescoPackagesTableRepresentation.push({
name: val,
version: response.json().dependencies[val].version
});
});
this.gitHubLinkCreation(alfrescoPackagesTableRepresentation);
this.data = new ObjectDataTableAdapter(alfrescoPackagesTableRepresentation, [
{type: 'text', key: 'name', title: 'Name', sortable: true},
{type: 'text', key: 'version', title: 'Version', sortable: true}
]);
});
this.ecmHost = this.appConfig.get<string>('ecmHost');
this.bpmHost = this.appConfig.get<string>('bpmHost');
}
private gitHubLinkCreation(alfrescoPackagesTableRepresentation): void {
const corePackage = alfrescoPackagesTableRepresentation.find((packageUp) => {
return packageUp.name === '@alfresco/adf-core';
});
if (corePackage) {
const commitIsh = corePackage.version.split('-');
if (commitIsh.length > 1) {
this.githubUrlCommitAlpha = this.githubUrlCommitAlpha + commitIsh[1];
} else {
this.githubUrlCommitAlpha = this.githubUrlCommitAlpha + corePackage.version;
}
}
}
}

View File

@ -1,4 +1,4 @@
<adf-sidenav-layout [sidenavMin]="70" [sidenavMax]="220" [stepOver]="780" [hideSidenav]="false" [expandedSidenav]="false">
<adf-sidenav-layout [sidenavMin]="70" [sidenavMax]="220" [stepOver]="780" [hideSidenav]="false"[expandedSidenav]= "expandedSidenav" (expanded)="setState($event)">
<adf-sidenav-layout-header>
<ng-template let-toggleMenu="toggleMenu">
@ -23,7 +23,7 @@
<button mat-icon-button [matMenuTriggerFor]="langMenu">
<mat-icon>language</mat-icon>
</button>
<mat-menu #langMenu="matMenu">
<mat-menu #langMenu="matMenu" class="adf-menu">
<adf-language-menu></adf-language-menu>
</mat-menu>
</mat-toolbar>
@ -37,7 +37,7 @@
<mat-icon matListIcon class="sidenav-menu-icon">{{link.icon}}</mat-icon>
<div class="sidenav-menu-label" *ngIf="!isMenuMinimized()">{{link.title | translate }}</div>
</a>
<a mat-list-item adf-logout class="adf-sidenav-link">
<a mat-list-item adf-logout [enabelRedirect]="enabelRedirect" redirectUri="/logout" class="adf-sidenav-link">
<mat-icon matListIcon class="sidenav-menu-icon">exit_to_app</mat-icon>
<div class="sidenav-menu-label" *ngIf="!isMenuMinimized()">Logout</div>
</a>
@ -51,4 +51,5 @@
</ng-template>
</adf-sidenav-layout-content>
</adf-sidenav-layout>
</adf-sidenav-layout>
<app-log></app-log>

View File

@ -1,106 +1,110 @@
@mixin adf-app-layout-theme($theme) {
$primary: map-get($theme, primary);
$background: map-get($theme, background);
$foreground: map-get($theme, foreground);
$minimumAppWidth: 320px;
$toolbarHeight: 64px;
$primary: map-get($theme, primary);
$background: map-get($theme, background);
$foreground: map-get($theme, foreground);
$minimumAppWidth: 320px;
$toolbarHeight: 64px;
@media screen and ($mat-xsmall) {
app-search-bar {
width: 150px;
}
}
@media screen and ($mat-xsmall) {
app-search-bar {
width: 150px;
}
}
@media screen and (max-width: 350px) {
app-search-bar {
width: 100px;
}
}
.adf-app-layout-toolbar {
z-index: 1001;
position: relative;
overflow: visible !important;
}
.adf-app-layout {
display: flex;
flex: 1;
min-width: $minimumAppWidth;
height: 100%;
.adf-nav-container {
display: block;
min-width: $minimumAppWidth;
height: 100%;
}
.adf-sidenav-linklist {
height: 100%;
overflow: auto;
padding-bottom: 8px;
box-sizing: border-box;
}
.adf-sidenav-link {
&.active {
color: mat-color($primary);
}
.sidenav-menu-icon {
margin-right: 20px;
font-size: 14px;
}
.sidenav-menu-label {
font-size: 14px;
white-space: nowrap;
}
}
.mat-nav-list .mat-list-item.adf-sidenav-link {
height: 40px;
}
&-user-profile {
margin-right: 10px;
}
&-menu-spacer {
flex: 1 1 auto;
}
&-toolbar {
height: $toolbarHeight;
line-height: $toolbarHeight;
overflow: hidden;
mat-toolbar-row {
height: $toolbarHeight;
align-items: stretch;
justify-content: space-between;
}
.adf-toolbar-link {
min-width: 0;
line-height: $toolbarHeight;
&.active {
background-color: rgba(0, 0, 0, .12);
app-search-bar {
width: 100px;
}
}
}
}
@media screen and ($mat-small) {
.adf-userinfo-name {
display: none;
.adf-app-layout-toolbar {
z-index: 998;
position: relative;
overflow: visible !important;
}
}
@media screen and ($mat-xsmall) {
}
.adf-menu {
padding-top: 55px;
}
.adf-app-layout {
display: flex;
flex: 1;
min-width: $minimumAppWidth;
height: 100%;
.adf-nav-container {
display: block;
min-width: $minimumAppWidth;
height: 100%;
}
.adf-sidenav-linklist {
height: 100%;
overflow: auto;
padding-bottom: 8px;
box-sizing: border-box;
}
.adf-sidenav-link {
&.active {
color: mat-color($primary);
}
.sidenav-menu-icon {
margin-right: 20px;
font-size: 14px;
}
.sidenav-menu-label {
font-size: 14px;
white-space: nowrap;
}
}
.mat-nav-list .mat-list-item.adf-sidenav-link {
height: 40px;
}
&-user-profile {
margin-right: 10px;
}
&-menu-spacer {
flex: 1 1 auto;
}
&-toolbar {
height: $toolbarHeight;
line-height: $toolbarHeight;
overflow: hidden;
mat-toolbar-row {
height: $toolbarHeight;
align-items: stretch;
justify-content: space-between;
}
.adf-toolbar-link {
min-width: 0;
line-height: $toolbarHeight;
&.active {
background-color: rgba(0, 0, 0, 0.12);
}
}
}
}
@media screen and ($mat-small) {
.adf-userinfo-name {
display: none;
}
.adf-menu {
padding-top: 0px;
}
}
@media screen and ($mat-xsmall) {}
}

View File

@ -15,7 +15,8 @@
* limitations under the License.
*/
import { Component, ViewEncapsulation } from '@angular/core';
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
import { UserPreferencesService, AppConfigService, AlfrescoApiService } from '@alfresco/adf-core';
@Component({
templateUrl: 'app-layout.component.html',
@ -25,11 +26,14 @@ import { Component, ViewEncapsulation } from '@angular/core';
},
encapsulation: ViewEncapsulation.None
})
export class AppLayoutComponent {
export class AppLayoutComponent implements OnInit {
links: Array<any> = [
{ href: '/home', icon: 'home', title: 'APP_LAYOUT.HOME' },
{ href: '/files', icon: 'folder_open', title: 'APP_LAYOUT.CONTENT_SERVICES' },
{ href: '/breadcrumb', icon: 'label', title: 'APP_LAYOUT.BREADCRUMB' },
{ href: '/notifications', icon: 'alarm', title: 'APP_LAYOUT.NOTIFICATIONS'},
{ href: '/activiti', icon: 'device_hub', title: 'APP_LAYOUT.PROCESS_SERVICES' },
{ href: '/login', icon: 'vpn_key', title: 'APP_LAYOUT.LOGIN' },
{ href: '/trashcan', icon: 'delete', title: 'APP_LAYOUT.TRASHCAN' },
@ -48,6 +52,30 @@ export class AppLayoutComponent {
{ href: '/about', icon: 'info_outline', title: 'APP_LAYOUT.ABOUT' }
];
constructor() {
expandedSidenav = false;
enabelRedirect = true;
ngOnInit() {
const expand = this.config.get<boolean>('sideNav.expandedSidenav');
const preserveState = this.config.get('sideNav.preserveState');
if (preserveState && expand) {
this.expandedSidenav = (this.userpreference.get('expandedSidenav', expand.toString()) === 'true');
} else if (expand) {
this.expandedSidenav = expand;
}
}
constructor(private userpreference: UserPreferencesService, private config: AppConfigService, private alfrescoApiService: AlfrescoApiService) {
if (this.alfrescoApiService.getInstance().isOauthConfiguration()) {
this.enabelRedirect = false;
}
}
setState(state) {
if (this.config.get('sideNav.preserveState')) {
this.userpreference.set('expandedSidenav', state);
}
}
}

View File

@ -0,0 +1,83 @@
<main>
<h1>Breadcrumb</h1>
<ul>
<li>Try creating and navigating long paths</li>
<li>Try resizing the browser width to ensure items are trimmed as expected</li>
</ul>
<h2>1. Standalone (fixed size)</h2>
<small>Component is used in the fixed-width layout</small>
<div class="breadcrumb-container-restricted">
<adf-breadcrumb root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</div>
<h2>2. Standalone (full width)</h2>
<small>Component fits the parent container width</small>
<div>
<adf-breadcrumb root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</div>
<h2>2.1 Standalone with Dropdown (full width)</h2>
<small>
Component fits the parent container width but is limited to 3 items to display at once.
It should automatically switch to the Dropdown mode if the path exceeds 3 nodes.
</small>
<div>
<adf-breadcrumb [maxItems]="3" root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</div>
<h2>3. Toolbar (standalone)</h2>
<small>Component used as a child of the Toolbar component</small>
<adf-toolbar>
<adf-breadcrumb root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</adf-toolbar>
<h2>4. Toolbar (title)</h2>
<small>Component is wrapped into the Toolbar Title component</small>
<adf-toolbar>
<adf-toolbar-title>
<adf-breadcrumb root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</adf-toolbar-title>
</adf-toolbar>
<h2>5. Toolbar with separators and buttons</h2>
<small>
Component is wrapped into the Toolbar Title component.
The toolbar also has separators and buttons that might provide impact on breadcrumb layout.
Buttons do nothing and are present for layout purposes.
</small>
<adf-toolbar class="full-content-toolbar">
<adf-toolbar-title fxFlex="0 1 auto">
<adf-breadcrumb root="APP.PERSONAL-FILES" [target]="documentList" [folderNode]="documentList.folderNode">
</adf-breadcrumb>
</adf-toolbar-title>
<adf-toolbar-divider fxFlex="0 0 auto"></adf-toolbar-divider>
<div fxFlex="0 0 auto">
<button mat-icon-button aria-label="Create a new folder button">
<mat-icon>create_new_folder</mat-icon>
</button>
<button mat-icon-button aria-label="Edit node button">
<mat-icon>create</mat-icon>
</button>
<button mat-icon-button aria-label="Delete node icon button">
<mat-icon>delete</mat-icon>
</button>
</div>
</adf-toolbar>
<div class="content">
<adf-document-list #documentList currentFolderId="-my-">
</adf-document-list>
</div>
</main>

View File

@ -0,0 +1,20 @@
.breadcrumb-container-restricted {
width: 800px;
max-width: 800px;
border: 1px solid lightgray;
}
.content {
margin: 10px 0;
}
.full-content-toolbar {
.adf-toolbar-title {
display: flex;
width: 100%;
.adf-breadcrumb {
width: 0;
}
}
}

View File

@ -18,24 +18,9 @@
import { Component } from '@angular/core';
@Component({
template: `
<adf-search-control [highlight]="true">
<adf-empty-search-result>
<span id="custom-no-result">{{customMessage}}</span>
</adf-empty-search-result>
</adf-search-control>
`
})
templateUrl: './breadcrumb-demo.component.html',
styleUrls: [`./breadcrumb-demo.component.scss`],
})
export class BreadcrumbDemoComponent {
export class SimpleSearchTestCustomEmptyComponent {
customMessage: string = '';
constructor() {
}
setCustomMessageForNoResult(message: string) {
this.customMessage = message;
}
}
}

View File

@ -1,30 +1,38 @@
<div class="p-10">
<adf-datatable
[data]="data"
[selectionMode]="selectionMode"
[multiselect]="multiselect"
[actions]="true"
rowStyleClass="custom-row-style"
(showRowActionsMenu)="onShowRowActionsMenu($event)"
(executeRowAction)="onExecuteRowAction($event)"
(row-click)="onRowClick($event)"
(row-dblclick)="onRowDblClick($event)">
<!-- HTML column definition demo -->
<!--
<data-columns>
<data-column type="image" key="icon" [sortable]="false"></data-column>
<data-column key="id" title="Id"></data-column>
<data-column key="createdOn" title="Created"></data-column>
<data-column key="name" title="Name" class="full-width name-column"></data-column>
<data-column key="createdBy.name" title="Created By"></data-column>
</data-columns>
-->
</adf-datatable>
<mat-form-field>
<input matInput placeholder="Name filter" [(ngModel)]="data.filterValue">
</mat-form-field>
<adf-datatable
#dataTable
[data]="data"
[selectionMode]="selectionMode"
[multiselect]="multiselect"
[actions]="true"
rowStyleClass="custom-row-style"
(showRowActionsMenu)="onShowRowActionsMenu($event)"
(executeRowAction)="onExecuteRowAction($event)"
(row-click)="onRowClick($event)"
(row-dblclick)="onRowDblClick($event)">
<!-- HTML column definition demo -->
<!--
<data-columns>
<data-column type="image" key="icon" [sortable]="false"></data-column>
<data-column key="id" title="Id"></data-column>
<data-column key="createdOn" title="Created"></data-column>
<data-column key="name" title="Name" class="full-width name-column"></data-column>
<data-column key="createdBy.name" title="Created By"></data-column>
</data-columns>
-->
</adf-datatable>
<div>
Selected items: {{ dataTable.selection?.length }}
</div>
<div class="p-10" data-automation-id="multiselect">
<div data-automation-id="multiselect">
<mat-checkbox [(ngModel)]="multiselect">{{ 'DATATABLE.MULTISELECT'| translate }}</mat-checkbox>
</div>
<div class="p-10">
<div>
<p>{{ 'DATATABLE.MULTISELECT_DESCRIPTION'| translate }}</p>
<mat-form-field>
<mat-select placeholder="Selection Mode" [(ngModel)]="selectionMode" name="food">
@ -34,10 +42,9 @@
</mat-select>
</mat-form-field>
</div>
<div class="p-10">
<div>
<button mat-raised-button (click)="reset()">{{ 'DATATABLE.RESET_DEFAULT'| translate }}</button>
<button mat-raised-button (click)="addRow()">{{ 'DATATABLE.ADD_ROW'| translate }}</button>
<button mat-raised-button (click)="replaceRows()">{{ 'DATATABLE.REPLACE_ROWS'| translate }}</button>
<button mat-raised-button (click)="replaceColumns()">{{ 'DATATABLE.REPLACE_COLUMNS'| translate }}</button>
<button mat-raised-button (click)="getRowForNode()">{{ 'DATATABLE.LOAD_NODE'| translate }}</button>
</div>

View File

@ -1,16 +0,0 @@
adf-datatable ::ng-deep .custom-row-style.alfresco-datatable__row:focus {
outline-offset: -1px;
outline-width: 1px;
outline-color: green;
outline-style: solid;
}
adf-datatable ::ng-deep .custom-row-style.alfresco-datatable__row--selected {
color: green;
}
adf-datatable ::ng-deep table {
max-width: 100%;
overflow: hidden;
white-space: normal !important;
}

View File

@ -16,19 +16,44 @@
*/
import { Component, Input } from '@angular/core';
import { AlfrescoApiService, LogService } from '@alfresco/adf-core';
import { LogService, DataColumn, DataRow } from '@alfresco/adf-core';
import { DataCellEvent, DataRowActionEvent, DataSorting, ObjectDataColumn, ObjectDataRow, ObjectDataTableAdapter } from '@alfresco/adf-core';
import { Observable } from 'rxjs/Observable';
export class FilteredDataAdapter extends ObjectDataTableAdapter {
filterValue = '';
filterKey = 'name';
getRows(): Array<DataRow> {
let rows = super.getRows();
const filter = (this.filterValue || '').trim().toLowerCase();
if (this.filterKey && filter) {
rows = rows.filter(row => {
const value = row.getValue(this.filterKey);
if (value !== undefined && value !== null) {
const stringValue: string = value.toString().trim().toLowerCase();
return stringValue.startsWith(filter);
}
return false;
});
}
return rows;
}
constructor(data?: any[], schema?: DataColumn[]) {
super(data, schema);
}
}
@Component({
selector: 'app-datatable',
templateUrl: './datatable.component.html',
styleUrls: ['./datatable.component.scss']
templateUrl: './datatable.component.html'
})
export class DataTableComponent {
multiselect = false;
data: ObjectDataTableAdapter;
data: FilteredDataAdapter;
@Input()
selectionMode = 'single';
@ -41,16 +66,16 @@ export class DataTableComponent {
private _imageUrl = 'http://placehold.it/140x100';
private _createdBy: any = {
name: 'Denys Vuika',
email: 'denys.vuika@alfresco.com'
name: 'Administrator',
email: 'admin@alfresco.com'
};
constructor(private apiService: AlfrescoApiService, private logService: LogService) {
constructor(private logService: LogService) {
this.reset();
}
reset() {
this.data = new ObjectDataTableAdapter(
this.data = new FilteredDataAdapter(
[
{
id: 1,
@ -174,33 +199,4 @@ export class DataTableComponent {
onRowDblClick(event) {
this.logService.log(event);
}
getRowForNode() {
const opts: any = {
includeSource: true,
include: ['path', 'properties', 'allowableOperations', 'permissions']
};
Observable.fromPromise(this.apiService.getInstance().nodes
.getNodeInfo('-my-', opts)).subscribe((data) => {
this.logService.log('FUnNy');
this.logService.log(data);
// let objects = new ObjectDataTableAdapter([
// {
// id: data.id,
// name: data.name,
// createdBy: data.createdByUser.displayName,
// createdOn: new Date(data.createdAt),
// icon: 'material-icons://face'
// }],
// [
// { type: 'image', key: 'icon', title: '', srTitle: 'Thumbnail' },
// { type: 'text', key: 'id', title: 'Id', sortable: true },
// { type: 'text', key: 'createdOn', title: 'Created On', sortable: true },
// { type: 'text', key: 'name', title: 'Name', cssClass: 'full-width name-column', sortable: true },
// { type: 'text', key: 'createdBy.name', title: 'Created By', sortable: true }
// ]);
// this.data = objects;
});
}
}

View File

@ -13,7 +13,8 @@
<adf-info-drawer-tab [label]="'APP.INFO_DRAWER.VERSIONS' | translate">
<mat-card>
<mat-card-content>
<adf-version-manager [node]="node" (uploadError)="uploadError($event)">
<adf-version-manager [node]="node"
(uploadError)="uploadError($event)">
</adf-version-manager>
</mat-card-content>
</mat-card>
@ -21,7 +22,7 @@
</adf-info-drawer>
</ng-template>
<adf-viewer [fileNodeId]="nodeId" [allowSidebar]="true" [sidebarTemplate]="sidebarTemplate">
<adf-viewer [nodeId]="nodeId" [allowSidebar]="true" [sidebarTemplate]="sidebarTemplate">
<adf-viewer-toolbar-actions>
<button mat-icon-button>

View File

@ -0,0 +1,3 @@
.adf-viewer__sidebar {
width: 380px !important;
}

View File

@ -15,24 +15,26 @@
* limitations under the License.
*/
import { Component, OnInit } from '@angular/core';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { AlfrescoApiService } from '@alfresco/adf-core';
import { MatSnackBar } from '@angular/material';
@Component({
selector: 'app-file-view',
templateUrl: 'file-view.component.html'
templateUrl: 'file-view.component.html',
styleUrls: ['file-view.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class FileViewComponent implements OnInit {
nodeId: string = null;
constructor(
private router: Router,
private route: ActivatedRoute,
private snackBar: MatSnackBar,
private apiService: AlfrescoApiService) {}
constructor(private router: Router,
private route: ActivatedRoute,
private snackBar: MatSnackBar,
private apiService: AlfrescoApiService) {
}
ngOnInit() {
@ -53,7 +55,7 @@ export class FileViewComponent implements OnInit {
});
}
uploadError(errorMessage: string) {
onUploadError(errorMessage: string) {
this.snackBar.open(errorMessage, '', { duration: 4000 });
}
}

View File

@ -8,6 +8,13 @@
</mat-select>
</mat-form-field>
</adf-toolbar-title>
<adf-toolbar-divider fxFlex="0 0 auto"></adf-toolbar-divider>
<button mat-icon-button
[disabled]="!hasSelection(customSourcesDocumentList.selection)"
title="{{ 'DOCUMENT_LIST.TOOLBAR.DOWNLOAD' | translate }}"
[adfNodeDownload]="customSourcesDocumentList.selection">
<mat-icon>get_app</mat-icon>
</button>
</adf-toolbar>
<adf-document-list
#customSourcesDocumentList

View File

@ -41,4 +41,8 @@ export class CustomSourcesComponent {
{ title: 'My', value: '-my-' },
{ title: 'Shared', value: '-shared-' }
];
hasSelection(selection: any[]): boolean {
return selection && selection.length > 0;
}
}

View File

@ -1,6 +1,6 @@
<div class="container">
<mat-accordion class="adf-container-recent">
<mat-accordion *ngIf="showRecentFiles" class="adf-container-recent">
<mat-expansion-panel hideToggle="true">
<mat-expansion-panel-header >
<mat-panel-title>
@ -28,17 +28,20 @@
</mat-expansion-panel>
</mat-accordion>
<div class="adf-site-container-style" id="site-container">
<div *ngIf="showSitePicker" class="adf-site-container-style" id="site-container">
<adf-sites-dropdown (change)="onSiteChange($event)" [hideMyFiles]="false" [relations]="'members'">
</adf-sites-dropdown>
</div>
<div class="document-list-container" fxLayout="row" fxLayoutAlign="start stretch" fxLayoutGap="16px">
<adf-upload-drag-area fxFlex="1 1 auto"
[disabled]="disableDragArea"
[parentId]="getDocumentListCurrentFolderId()"
[acceptedFilesType]="getFileFiltering()"
[rootFolderId]="getDocumentListCurrentFolderId()"
[versioning]="versioning"
[adf-node-permission]="'create'"
[adf-nodes]="disableDragArea ? getCurrentDocumentListNode() : []">
[adf-nodes]="disableDragArea ? getCurrentDocumentListNode() : []"
(beginUpload)="onBeginUpload($event)">
<div *ngIf="errorMessage" class="error-message">
<button (click)="resetError()" mat-icon-button>
<mat-icon>highlight_off</mat-icon>
@ -49,7 +52,7 @@
<adf-toolbar-title fxFlex="0 1 auto">
<adf-breadcrumb fxShow fxHide.lt-sm="true"
class="files-breadcrumb"
root="Personal Files"
root="APP.PERSONAL-FILES"
[target]="documentList"
[folderNode]="documentList.folderNode">
</adf-breadcrumb>
@ -67,28 +70,31 @@
mat-icon-button
title="{{ 'DOCUMENT_LIST.TOOLBAR.CARDVIEW' | translate }}"
(click)="toogleGalleryView()">
<mat-icon *ngIf="displayMode === 'list'" >view_comfy</mat-icon>
<mat-icon *ngIf="displayMode === 'gallery'">list</mat-icon>
<mat-icon *ngIf="displayMode === 'list'" matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.CARDVIEW' | translate }}">view_comfy</mat-icon>
<mat-icon *ngIf="displayMode === 'gallery'" matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.LISTVIEW' | translate }}">list</mat-icon>
</button>
<button
mat-icon-button
[disabled]="!canCreateContent(documentList.folderNode)"
title="{{ 'DOCUMENT_LIST.TOOLBAR.NEW_FOLDER' | translate }}"
(error)="openSnackMessage($event)"
[adf-create-folder]="getDocumentListCurrentFolderId()">
[adf-create-folder]="getDocumentListCurrentFolderId()"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.NEW_FOLDER' | translate }}">
<mat-icon>create_new_folder</mat-icon>
</button>
<button mat-icon-button
[disabled]="!canEditFolder(documentList.selection)"
title="{{ 'DOCUMENT_LIST.TOOLBAR.EDIT_FOLDER' | translate }}"
(error)="openSnackMessage($event)"
[adf-edit-folder]="documentList.selection[0]?.entry">
[adf-edit-folder]="documentList.selection[0]?.entry"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.EDIT_FOLDER' | translate }}">
<mat-icon>create</mat-icon>
</button>
<button mat-icon-button
[disabled]="!hasSelection(documentList.selection)"
title="{{ 'DOCUMENT_LIST.TOOLBAR.DOWNLOAD' | translate }}"
[adfNodeDownload]="documentList.selection">
[adfNodeDownload]="documentList.selection"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.DOWNLOAD' | translate }}">
<mat-icon>get_app</mat-icon>
</button>
<button mat-icon-button
@ -96,13 +102,15 @@
[adf-nodes]="documentList.selection"
title="{{ 'DOCUMENT_LIST.TOOLBAR.DELETE' | translate }}"
(delete)="onDeleteActionSuccess($event)"
[adf-delete]="documentList.selection">
[adf-delete]="documentList.selection"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.DELETE' | translate }}">
<mat-icon>delete</mat-icon>
</button>
<button mat-icon-button
[disabled]="!documentList.selection.length"
#favorite="adfFavorite"
[adf-node-favorite]="documentList.selection">
[adf-node-favorite]="documentList.selection"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.FAVORITES' | translate }}">
<mat-icon>
{{ favorite.hasFavorites() ? 'star' :'star_border' }}
</mat-icon>
@ -110,14 +118,15 @@
<button mat-icon-button
[disabled]="!documentList.selection.length"
[baseShareUrl]="baseShareUrl"
[adf-share]="documentList.selection[0]">
[adf-share]="documentList.selection[0]"
matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.SHARE' | translate }}">
<mat-icon>
share
</mat-icon>
</button>
</div>
<button fxFlex="1 0 auto" mat-icon-button [matMenuTriggerFor]="themePicker">
<button fxFlex="1 0 auto" mat-icon-button [matMenuTriggerFor]="themePicker" matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.THEME' | translate }}">
<mat-icon>format_color_fill</mat-icon>
</button>
@ -129,8 +138,8 @@
</mat-menu>
<button mat-icon-button (click)="showVersions = !showVersions" class="adf-show-versions-button">
<mat-icon *ngIf="!showVersions">chevron_left</mat-icon>
<mat-icon *ngIf="showVersions">chevron_right</mat-icon>
<mat-icon *ngIf="!showVersions" matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.SHOW_VERSION' | translate }}">chevron_left</mat-icon>
<mat-icon *ngIf="showVersions" matTooltip="{{ 'DOCUMENT_LIST.TOOLBAR.HIDE_VERSION' | translate }}">chevron_right</mat-icon>
</button>
<adf-toolbar-divider fxFlex="0 0 auto" fxHide fxShow.lt-sm="true"></adf-toolbar-divider>
@ -188,6 +197,10 @@
[display]="displayMode"
[node]="nodeResult"
[includeFields]="includeFields"
[sorting]="sorting"
[sortingMode]="sortingMode"
[showHeader]="showHeader"
[thumbnails]="thumbnails"
(error)="onNavigationError($event)"
(success)="resetError()"
(ready)="emitReadyEvent($event)"
@ -209,6 +222,7 @@
class="image-table-cell">
</data-column>
<data-column
*ngIf="showNameColumn"
key="name"
title="{{'DOCUMENT_LIST.COLUMNS.DISPLAY_NAME' | translate}}"
[formatTooltip]="getNodeNameTooltip"
@ -266,6 +280,25 @@
</data-columns>
<content-actions>
<!-- Conditional actions demo -->
<content-action
target="all"
title="Action for 'custom' node"
[disabled]="isCustomActionDisabled"
(execute)="runCustomAction($event)">
</content-action>
<content-action
icon="get_app"
title="Download this file now!"
handler="download"
[visible]="canDownloadNode">
</content-action>
<content-action
icon="get_app"
title="Never see this action again"
handler="download"
[visible]="false">
</content-action>
<!-- common actions -->
<content-action
icon="get_app"
@ -320,7 +353,7 @@
</content-action>
<content-action
icon="settings_input_component"
title="{{'DOCUMENT_LIST.ACTIONS.PERMISSION' | translate}}"
title="DOCUMENT_LIST.ACTIONS.PERMISSION"
permission="copy"
(error)="onContentActionError($event)"
(execute)="onPermissionRequested($event)">
@ -345,7 +378,7 @@
(prevPage)="onPrevPage($event)">
</adf-pagination>
<adf-infinite-pagination
*ngIf="infiniteScrolling"
[hidden]="!infiniteScrolling"
[target]="documentList"
[loading]="documentList.infiniteLoading">
{{ 'ADF-DOCUMENT-LIST.LAYOUT.LOAD_MORE' | translate }}
@ -353,29 +386,38 @@
</adf-upload-drag-area>
<adf-info-drawer-layout *ngIf="showVersions" class="adf-manage-versions-sidebar" fxFlex="0 0 auto">
<div info-drawer-content>
<ng-container *ngIf="hasOneFileSelected();else choose_document_template">
<ng-container *ngIf="userHasPermissionToManageVersions(); else no_permission_to_versions">
<adf-version-manager
[node]="documentList.selection[0].entry"
[showComments]="showVersionComments"
[allowDownload]="allowVersionDownload">
</adf-version-manager>
</ng-container>
</ng-container>
<ng-template #choose_document_template>
<div class="adf-manage-versions-empty">
<mat-icon class="adf-manage-versions-empty-icon">face</mat-icon>
{{'VERSION.CHOOSE_FILE' | translate}}
</div>
</ng-template>
<ng-template #no_permission_to_versions>
<div class="adf-manage-versions-no-permission">
<mat-icon class="adf-manage-versions-no-permission-icon">warning</mat-icon>
{{'VERSION.NO_PERMISSION' | translate}}
</div>
</ng-template>
<adf-info-drawer [title]="'Details'">
<adf-info-drawer-tab [label]="'Properties'">
<adf-content-metadata-card
[node]="documentList.selection[0].entry">
</adf-content-metadata-card>
</adf-info-drawer-tab>
<adf-info-drawer-tab [label]="'Versions'">
<ng-container *ngIf="hasOneFileSelected();else choose_document_template">
<ng-container *ngIf="userHasPermissionToManageVersions(); else no_permission_to_versions">
<adf-version-manager
[node]="documentList.selection[0].entry"
[showComments]="showVersionComments"
[allowDownload]="allowVersionDownload">
</adf-version-manager>
</ng-container>
</ng-container>
<ng-template #choose_document_template>
<div class="adf-manage-versions-empty">
<mat-icon class="adf-manage-versions-empty-icon">face</mat-icon>
{{'VERSION.CHOOSE_FILE' | translate}}
</div>
</ng-template>
<ng-template #no_permission_to_versions>
<div class="adf-manage-versions-no-permission">
<mat-icon class="adf-manage-versions-no-permission-icon">warning</mat-icon>
{{'VERSION.NO_PERMISSION' | translate}}
</div>
</ng-template>
</adf-info-drawer-tab>
</adf-info-drawer>
</div>
</adf-info-drawer-layout>
</div>
@ -390,7 +432,7 @@
</adf-start-process>
</div>
<div class="adf-content-service-settings">
<div *ngIf="showSettingsPanel" class="adf-content-service-settings">
<p>Current folder ID: {{ documentList.currentFolderId }}</p>
@ -404,6 +446,12 @@
</div>
<div class="container">
<section>
<mat-slide-toggle color="primary" [(ngModel)]="showNameColumn">
Show Name Column
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle [color]="'primary'" [(ngModel)]="multiselect">{{'DOCUMENT_LIST.MULTISELECT_CHECKBOXES' |
translate}}
@ -434,6 +482,12 @@
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle [color]="'primary'" (click)="toggleThumbnails()" >{{'DOCUMENT_LIST.THUMBNAILS' |
translate}}
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle [color]="'primary'" [(ngModel)]="versioning">
{{'DOCUMENT_LIST.ENABLE_VERSIONING' | translate}}
@ -441,7 +495,7 @@
</section>
<section>
<mat-slide-toggle color="primary" [(ngModel)]="infiniteScrolling">
<mat-slide-toggle color="primary" (click)="onInfiniteScrolling()">
{{'DOCUMENT_LIST.ENABLE_INFINITE_SCROLL' | translate}}
</mat-slide-toggle>
</section>
@ -458,6 +512,12 @@
</mat-slide-toggle>
</section>
<section>
<mat-slide-toggle color="primary" [(ngModel)]="warnOnMultipleUploads">
{{'APP.WARN-MULTIPLE-UPLOADS' | translate}}
</mat-slide-toggle>
</section>
<h5>Upload</h5>
<section *ngIf="acceptedFilesTypeShow">
<mat-form-field floatPlaceholder="float">
@ -487,7 +547,8 @@
[versioning]="versioning"
[adf-node-permission]="'create'"
[adf-nodes]="enableUpload ? getCurrentDocumentListNode() : []"
(permissionEvent)="handlePermissionError($event)">
(permissionEvent)="handlePermissionError($event)"
(beginUpload)="onBeginUpload($event)">
</adf-upload-button>
</div>
<div *ngIf="acceptedFilesTypeShow">

View File

@ -63,7 +63,7 @@
}
.adf-manage-versions-sidebar {
width: 300px !important;
width: 360px !important;
color: rgba(0, 0, 0, 0.87);
.adf-manage-versions-empty,
@ -79,25 +79,12 @@
}
}
& ::ng-deep .adf-info-drawer-layout-header {
display: none;
& .adf-info-drawer-layout-header {
display: none !important;
}
& ::ng-deep .adf-info-drawer-layout-content {
padding: 0;
.adf-version-upload,
.adf-new-version-file-upload {
width: 100%;
& .mat-raised-button {
width: 100%;
}
}
.adf-new-version-uploader-container {
padding: 8px 24px 16px 24px;
}
& .adf-info-drawer-layout-content {
padding: 10px !important;
}
}
@ -143,13 +130,13 @@
.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;
}
}
}
.adf-site-container-style {
@ -172,11 +159,11 @@
@media (max-device-width: 1024px) {
adf-document-list .adf-data-table {
.adf-data-table-cell:nth-child(4),
.adf-datatable-table-cell-header:nth-child(4) {
display: none;
}
}
}
}
}
}

View File

@ -25,13 +25,13 @@ import { MatDialog } from '@angular/material';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { MinimalNodeEntity, NodePaging, Pagination, MinimalNodeEntryEntity, SiteEntry } from 'alfresco-js-api';
import {
AuthenticationService, AppConfigService, ContentService, TranslationService,
AuthenticationService, AppConfigService, AppConfigValues, ContentService, TranslationService,
FileUploadEvent, FolderCreatedEvent, LogService, NotificationService,
UploadService, DataColumn, DataRow, UserPreferencesService,
PaginationComponent, FormValues, DisplayMode, UserPreferenceValues
PaginationComponent, FormValues, DisplayMode, UserPreferenceValues, InfinitePaginationComponent
} from '@alfresco/adf-core';
import { DocumentListComponent, PermissionStyleModel } from '@alfresco/adf-content-services';
import { DocumentListComponent, PermissionStyleModel, UploadFilesEvent, ConfirmDialogComponent } from '@alfresco/adf-content-services';
import { SelectAppsDialogComponent } from '@alfresco/adf-process-services';
@ -54,9 +54,9 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
showViewer = false;
showVersions = false;
displayMode = DisplayMode.List;
includeFields = ['isLocked', 'aspectNames'];
includeFields = ['isFavorite', 'isLocked', 'aspectNames'];
baseShareUrl = this.appConfig.get<string>('ecmHost') + '/preview/s/';
baseShareUrl = this.appConfig.get<string>(AppConfigValues.ECMHOST) + '/preview/s/';
toolbarColor = 'default';
@ -74,6 +74,24 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
processId;
@Input()
sorting = ['name', 'asc'];
@Input()
sortingMode = 'client';
@Input()
showRecentFiles = true;
@Input()
showSitePicker = true;
@Input()
showSettingsPanel = true;
@Input()
showHeader = true;
@Input()
selectionMode = 'multiple';
@ -119,6 +137,9 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
@Input()
disableDragArea = false;
@Input()
showNameColumn = true;
@Output()
documentListReady: EventEmitter<any> = new EventEmitter();
@ -146,10 +167,15 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
@ViewChild('standardPagination')
standardPagination: PaginationComponent;
@ViewChild(InfinitePaginationComponent)
infinitePaginationComponent: InfinitePaginationComponent;
permissionsStyle: PermissionStyleModel[] = [];
infiniteScrolling: boolean;
supportedPages: number[];
currentSiteid = '';
warnOnMultipleUploads = false;
thumbnails = false;
private onCreateFolder: Subscription;
private onEditFolder: Subscription;
@ -162,8 +188,8 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
private translateService: TranslationService,
private router: Router,
private logService: LogService,
private preference: UserPreferencesService,
private appConfig: AppConfigService,
private preference: UserPreferencesService,
private preview: PreviewService,
@Optional() private route: ActivatedRoute,
public authenticationService: AuthenticationService) {
@ -186,6 +212,11 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
return this.folderUpload;
}
toggleThumbnails() {
this.thumbnails = !this.thumbnails;
this.documentList.reload();
}
ngOnInit() {
if (!this.pagination) {
this.pagination = <Pagination>{
@ -200,7 +231,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
this.currentFolderId = params['id'];
}
if (params['mode']) {
if (params['mode'] && params['mode'] === DisplayMode.Gallery) {
this.displayMode = DisplayMode.Gallery;
}
});
@ -250,9 +281,9 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
}
}
onNavigationError(err: any) {
if (err) {
this.errorMessage = err.message || 'Navigation error';
onNavigationError(error: any) {
if (error) {
this.router.navigate(['/error', error.status]);
}
}
@ -282,7 +313,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
}
onFolderChange($event) {
this.router.navigate(['/files', $event.value.id]);
this.router.navigate(['/files', $event.value.id, 'display', this.displayMode]);
}
handlePermissionError(event: any) {
@ -346,9 +377,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
}
private reloadForInfiniteScrolling() {
if (this.infiniteScrolling) {
this.documentList.skipCount = 0;
}
this.documentList.reload();
}
@ -459,7 +487,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
this.turnedNextPage.emit(event);
}
loadNextBatch(event: Pagination) {
loadNextBatch(event: Pagination): void {
this.loadNext.emit(event);
}
@ -468,17 +496,63 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
}
toogleGalleryView(): void {
this.displayMode = this.displayMode === DisplayMode.List ? DisplayMode.Gallery : DisplayMode.List;
const url = this
.router
.createUrlTree(['/files', this.currentFolderId, 'display', this.displayMode])
.toString();
if (this.displayMode === DisplayMode.List) {
this.displayMode = DisplayMode.Gallery;
this.location.go(url);
} else {
this.displayMode = DisplayMode.List;
this.location.go(url);
this.location.go(url);
}
onInfiniteScrolling(): void {
this.infiniteScrolling = !this.infiniteScrolling;
this.infinitePaginationComponent.reset();
this.reloadForInfiniteScrolling();
}
canDownloadNode = (node: MinimalNodeEntity): boolean => {
if (node && node.entry && node.entry.name === 'custom') {
return true;
}
return false;
}
onBeginUpload(event: UploadFilesEvent) {
if (this.warnOnMultipleUploads && event) {
const files = event.files || [];
if (files.length > 1) {
event.pauseUpload();
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
data: {
title: 'Upload',
message: `Are you sure you want to upload ${files.length} file(s)?`
},
minWidth: '250px'
});
dialogRef.afterClosed().subscribe(result => {
if (result === true) {
event.resumeUpload();
}
});
}
}
}
isCustomActionDisabled = (node: MinimalNodeEntity): boolean => {
if (node && node.entry && node.entry.name === 'custom') {
return false;
}
return true;
}
runCustomAction(event) {
console.log(event);
}
getFileFiltering() {
return this.acceptedFilesTypeShow ? this.acceptedFilesType : '*';
}
}

View File

@ -1,7 +1,18 @@
<header mat-dialog-title>{{'VERSION.DIALOG.TITLE' | translate}}</header>
<section mat-dialog-content>
<section>
<mat-slide-toggle color="primary" [(ngModel)]="readOnly">
{{'APP.ADF_VERSION_MANAGER.READ_ONLY' | translate}}
</mat-slide-toggle>
</section>
<section mat-dialog-content *ngIf="!readOnly">
<adf-version-manager [node]="contentEntry" [allowDownload]="allowDownload" [showComments]="showComments" (uploadError)="uploadError($event)"></adf-version-manager>
</section>
<section mat-dialog-content *ngIf="readOnly">
<adf-version-list [node]="contentEntry" [showActions]="false" ></adf-version-list>
</section>
<footer mat-dialog-actions fxLayout="row" fxLayoutAlign="end center">
<button mat-button (click)="close()">{{'VERSION.DIALOG.CLOSE' | translate}}</button>
</footer>

View File

@ -30,6 +30,7 @@ export class VersionManagerDialogAdapterComponent {
showComments = true;
allowDownload = true;
readOnly = false;
constructor(@Inject(MAT_DIALOG_DATA) data: any,
private snackBar: MatSnackBar,

View File

@ -1,8 +1,13 @@
<adf-form-list [forms]="formList" (row-dblclick)="onRowDblClick($event)">
</adf-form-list>
<div class="form-container" *ngIf="!isEmptyForm()">
<adf-form #adfForm [form]="form" [data]="restoredData">
<adf-form #adfForm [form]="form" [data]="restoredData" [showValidationIcon]="showValidationIcon">
</adf-form>
</div>
<button mat-button (click)="store()" color="primary">{{'FORM-LIST.STORE' | translate }}</button>
<button mat-button (click)="restore()" color="primary">{{'FORM-LIST.RESTORE' | translate }}</button>
<section class="form-list-margin">
<mat-slide-toggle color="primary" [(ngModel)]="showValidationIcon">
Show Validation Icon
</mat-slide-toggle>
</section>

View File

@ -6,3 +6,7 @@
width: 80%;
height: 80%;
}
.form-list-margin {
margin-left: 26px;
}

View File

@ -36,6 +36,8 @@ export class FormListComponent {
storedData: any = {};
restoredData: any = {};
showValidationIcon = false;
constructor(private formService: FormService, private logService: LogService) {
// Prevent default outcome actions
formService.executeOutcome.subscribe(e => {

View File

@ -2,10 +2,10 @@
<div class="adf-home-section ad">
<div class="adf-home-headline">
<h1 class="mat-h1">ADF</h1>
<h2> Angular components for Alfresco</h2>
<h2>{{ 'APP.HOME.TITLE' | translate}}</h2>
</div>
<div class="adf-home-start">
<a mat-raised-button class="adf-home-docs-button adf-primary-color" href="https://github.com/Alfresco/alfresco-ng2-components/tree/master/docs">DOCS</a>
<a mat-raised-button class="adf-home-docs-button adf-primary-color" href="https://github.com/Alfresco/alfresco-ng2-components/tree/master/docs">{{ 'APP.HOME.DOCUMENTATION' | translate}}</a>
</div>
</div>
</header>

View File

@ -12,7 +12,7 @@
height: 20%;
width: 40%;
position: fixed;
top: 1em;
top: 4em;
right: 1em;
opacity: 0.9;
overflow: scroll;

View File

@ -32,11 +32,18 @@ export class LogComponent {
constructor(public logService: LogService) {
logService.onMessage.subscribe((message) => {
this.logs.push({ type: message.type, text: JSON.stringify(message.text) });
let contentMessage = '';
try {
contentMessage = JSON.stringify(message.text);
} catch (error) {
return;
}
this.logs.push({ type: message.type, text: contentMessage});
this.logsData = new ObjectDataTableAdapter(this.logs, [
{ type: 'text', key: 'type', title: 'Log level', sortable: true },
{ type: 'text', key: 'text', title: 'Message', sortable: false }
]);
});
}

View File

@ -1,24 +1,6 @@
<!--BPM, ECN AND CSRF TOGGLE-->
<div class="settings">
<p class="toggle">
<mat-slide-toggle
id="switch1"
[color]="'primary'"
(change)="toggleECM()"
[checked]="isECM">
{{ 'LOGIN.CONTENT_SERVICES'| translate }}
</mat-slide-toggle>
</p>
<p class="toggle">
<mat-slide-toggle
id="switch2"
[color]="'primary'"
(change)="toggleBPM()"
[checked]="isBPM">
{{ 'LOGIN.PROCESS_SERVICES'| translate }}
</mat-slide-toggle>
</p>
<p class="toggle">
<mat-slide-toggle
id="switch3"
@ -47,33 +29,15 @@
<adf-login
#alfrescologin
[providers]="providers"
[fieldsValidation]="customValidation"
[disableCsrf]="disableCsrf"
[showLoginActions]="showFooter"
[showRememberMe]="showFooter"
copyrightText="© 2016 Alfresco Software, Inc. All Rights Reserved. (customised text)"
(executeSubmit)="checkForm($event)"
copyrightText="{{ 'application.copyright' | adfAppConfig }}"
(success)="onLogin($event)"
(error)="onError($event)">
<div class="mobile-settings">
<p>
<mat-slide-toggle
id="switch1-mobile"
[color]="'primary'"
(change)="toggleECM()"
[checked]="isECM">
{{ 'LOGIN.CONTENT_SERVICES'| translate }}
</mat-slide-toggle>
</p>
<p>
<mat-slide-toggle
id="switch2-mobile"
[color]="'primary'"
(change)="toggleBPM()"
[checked]="isBPM">
{{ 'LOGIN.PROCESS_SERVICES'| translate }}
</mat-slide-toggle>
</p>
<p>
<mat-slide-toggle
id="switch3-mobile"

View File

@ -18,7 +18,7 @@
}
.toggle {
width: 190px;
width: auto;
margin: 5px;
padding: 5px;
}
@ -49,4 +49,4 @@
.settings ::ng-deep .mat-slide-toggle-thumb-container {
cursor: pointer;
}
}
}

View File

@ -18,7 +18,7 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import { Validators } from '@angular/forms';
import { Router } from '@angular/router';
import { LogService, StorageService } from '@alfresco/adf-core';
import { LogService } from '@alfresco/adf-core';
@Component({
selector: 'app-login',
@ -30,17 +30,13 @@ export class LoginComponent implements OnInit {
@ViewChild('alfrescologin')
alfrescologin: any;
providers = 'ECM';
customValidation: any;
disableCsrf = false;
isECM = true;
isBPM = false;
showFooter = true;
customMinLength = 2;
constructor(private router: Router,
private storage: StorageService,
private logService: LogService) {
this.customValidation = {
username: ['', Validators.compose([Validators.required, Validators.minLength(this.customMinLength)])],
@ -52,25 +48,6 @@ export class LoginComponent implements OnInit {
this.alfrescologin.addCustomValidationError('username', 'required', 'LOGIN.MESSAGES.USERNAME-REQUIRED');
this.alfrescologin.addCustomValidationError('username', 'minlength', 'LOGIN.MESSAGES.USERNAME-MIN', {minLength: this.customMinLength});
this.alfrescologin.addCustomValidationError('password', 'required', 'LOGIN.MESSAGES.PASSWORD-REQUIRED');
if (this.storage.hasItem('providers')) {
this.providers = this.storage.getItem('providers');
}
this.initProviders();
}
initProviders() {
if (this.providers === 'BPM') {
this.isECM = false;
this.isBPM = true;
} else if (this.providers === 'ECM') {
this.isECM = true;
this.isBPM = false;
} else if (this.providers === 'ALL') {
this.isECM = true;
this.isBPM = true;
}
}
onLogin($event) {
@ -81,16 +58,6 @@ export class LoginComponent implements OnInit {
this.logService.error($event);
}
toggleECM() {
this.isECM = !this.isECM;
this.storage.setItem('providers', this.updateProvider());
}
toggleBPM() {
this.isBPM = !this.isBPM;
this.storage.setItem('providers', this.updateProvider());
}
toggleCSRF() {
this.disableCsrf = !this.disableCsrf;
}
@ -99,23 +66,8 @@ export class LoginComponent implements OnInit {
this.showFooter = !this.showFooter;
}
updateProvider() {
if (this.isBPM && this.isECM) {
this.providers = 'ALL';
return this.providers;
}
if (this.isECM) {
this.providers = 'ECM';
return this.providers;
}
if (this.isBPM) {
this.providers = 'BPM';
return this.providers;
}
this.providers = '';
return this.providers;
checkForm(event: any) {
const values = event.values;
this.logService.log(values);
}
}

View File

@ -0,0 +1,17 @@
<header class="adf-logout-background">
<div class="adf-logout-section">
<div class="adf-logout-headline">
<h1>{{ 'APP.LOGOUT.TITLE' | translate}}</h1>
<h2>{{ 'APP.LOGOUT.SUB_TITLE' | translate}}</h2>
</div>
<div class="adf-logout-login">
<a mat-raised-button class="adf-logout-docs-button adf-primary-color"
href="/login">{{ 'APP.LOGOUT.LOGIN' | translate}}</a>
</div>
<div class="adf-logout-home">
<a mat-raised-button class="adf-logout-docs-button adf-primary-color"
href="/">{{ 'APP.LOGOUT.HOME' | translate}}</a>
</div>
</div>
</header>

View File

@ -0,0 +1,39 @@
:host {
display: flex;
justify-content: center;
align-items: center;
}
.adf-logout-header-background {
overflow: hidden;
}
.adf-logout-section {
text-align: center;
padding-top: 60px;
}
.adf-logout-headline {
h1 {
font-size: 56px;
font-weight: 300;
line-height: 56px;
margin: 15px 5px;
}
h2 {
font-size: 18px;
font-weight: 300;
line-height: 28px;
margin: 15px 0 25px 0;
}
}
.adf-logout-docs-button {
margin: 30px;
}
.adf-logout-login {
float: left;
}

View File

@ -0,0 +1,25 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component } from '@angular/core';
@Component({
selector: 'app-logout',
templateUrl: './logout.component.html',
styleUrls: ['./logout.component.scss']
})
export class LogoutComponent {}

View File

@ -0,0 +1,35 @@
<div class="main-content">
<h1>Notification Service</h1>
<ul>
<li>Try setting custom message with unicode characters, for example: <strong>I ♥️ ADF</strong></li>
<li>Try setting custom i18n resource key, for example: <strong>APP_LAYOUT.NOTIFICATIONS</strong></li>
<li>Try toggling the action button. Clicking the action within SnackBar should update the label under the toggle button.</li>
<li>All elements support <em>data-automation-id</em> attributes and can be automated.</li>
</ul>
<mat-form-field>
<input
matInput
placeholder="Message"
[(ngModel)]="message"
data-automation-id="notification-message">
</mat-form-field>
<button mat-icon-button (click)="send()">
<mat-icon>send</mat-icon>
</button>
<div>
<mat-slide-toggle
[(ngModel)]="withAction"
data-automation-id="notification-action-toggle">
With action
</mat-slide-toggle>
</div>
<div data-automation-id="notification-action-output">
{{ actionOutput }}
</div>
</div>

View File

@ -0,0 +1,3 @@
.main-content {
padding: 10px;
}

View File

@ -0,0 +1,47 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component } from '@angular/core';
import { NotificationService } from '@alfresco/adf-core';
@Component({
templateUrl: './notifications.component.html',
styleUrls: ['./notifications.component.scss']
})
export class NotificationsComponent {
message = 'I ♥️ ADF';
withAction = false;
actionOutput = '';
constructor(private notificationService: NotificationService) {}
send() {
this.actionOutput = '';
if (this.message) {
if (this.withAction) {
this.notificationService
.openSnackMessageAction(this.message, 'Some action')
.onAction()
.subscribe(() => this.actionOutput = 'Action clicked');
} else {
this.notificationService.openSnackMessage(this.message);
}
}
}
}

View File

@ -2,11 +2,17 @@
<button mat-raised-button
[color]="toggleStatus?'accent':'primary'"
adf-inherit-permission [nodeId]="nodeId"
(error)="showErrorMessage($event)"
(updated)="onUpdatedPermissions($event)">
{{ (toggleStatus?'DEMO_PERMISSION.INHERITED_PERMISSIONS_BUTTON':'DEMO_PERMISSION.INHERIT_PERMISSION_BUTTON') | translate}}</button>
<button mat-button color="primary" (click)="openAddPermissionDialog($event)">Add User or Group</button>
</div>
<div>
<adf-permission-list #permissionList [nodeId]="nodeId">
<adf-permission-list #permissionList
[nodeId]="nodeId"
(update)="reloadList()"
(error)="showErrorMessage($event)">
</adf-permission-list>
</div>

View File

@ -1,6 +1,6 @@
.inherit_permission_button {
padding-top: 20px;
display: flex;
justify-content: space-evenly;
justify-content: center;
padding-bottom: 20px;
}

View File

@ -17,9 +17,9 @@
import { Component, Optional, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, Params} from '@angular/router';
import { PermissionListComponent } from '@alfresco/adf-content-services';
import { PermissionListComponent, NodePermissionDialogService } from '@alfresco/adf-content-services';
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
import { NodesApiService } from '@alfresco/adf-core';
import { NodesApiService, NotificationService } from '@alfresco/adf-core';
@Component({
selector: 'app-permissions',
@ -35,7 +35,9 @@ export class DemoPermissionComponent implements OnInit {
toggleStatus = false;
constructor(@Optional() private route: ActivatedRoute,
private nodeService: NodesApiService) {
private nodeService: NodesApiService,
private nodePermissionDialogService: NodePermissionDialogService,
private notificationService: NotificationService) {
}
ngOnInit() {
@ -56,4 +58,24 @@ export class DemoPermissionComponent implements OnInit {
this.displayPermissionComponent.reload();
}
reloadList() {
this.displayPermissionComponent.reload();
}
openAddPermissionDialog(event: Event) {
this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe(() => {
this.displayPermissionComponent.reload();
},
(error) => {
this.showErrorMessage(error);
});
}
showErrorMessage(error) {
this.notificationService.openSnackMessage(
error,
4000
);
}
}

View File

@ -15,13 +15,14 @@
* limitations under the License.
*/
import { Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core';
import { Component, Input, OnChanges, OnInit, ViewChild, OnDestroy } from '@angular/core';
import { ProcessInstance, ProcessService ,
ProcessAttachmentListComponent, ProcessUploadService } from '@alfresco/adf-process-services';
import { UploadService } from '@alfresco/adf-core';
import { AlfrescoApiService } from '@alfresco/adf-core';
import { AppConfigService } from '@alfresco/adf-core';
import { PreviewService } from '../../services/preview.service';
import { Subscription } from 'rxjs/Subscription';
export function processUploadServiceFactory(api: AlfrescoApiService, config: AppConfigService) {
return new ProcessUploadService(api, config);
@ -40,7 +41,7 @@ export function processUploadServiceFactory(api: AlfrescoApiService, config: App
]
})
export class ProcessAttachmentsComponent implements OnInit, OnChanges {
export class ProcessAttachmentsComponent implements OnInit, OnChanges, OnDestroy {
@ViewChild('processAttachList')
processAttachList: ProcessAttachmentListComponent;
@ -50,6 +51,8 @@ export class ProcessAttachmentsComponent implements OnInit, OnChanges {
processInstance: ProcessInstance;
private subscriptions: Subscription[] = [];
constructor(
private uploadService: UploadService,
private processService: ProcessService,
@ -57,7 +60,11 @@ export class ProcessAttachmentsComponent implements OnInit, OnChanges {
) {}
ngOnInit() {
this.uploadService.fileUploadComplete.subscribe(value => this.onFileUploadComplete(value.data));
this.subscriptions.push(
this.uploadService.fileUploadComplete.subscribe(
value => this.onFileUploadComplete(value.data)
)
);
}
ngOnChanges() {
@ -69,6 +76,11 @@ export class ProcessAttachmentsComponent implements OnInit, OnChanges {
}
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
this.subscriptions = [];
}
onFileUploadComplete(content: any) {
this.processAttachList.add(content);
}

View File

@ -1,13 +1,14 @@
<mat-tab-group [(selectedIndex)]="activeTab" (selectedTabChange)="onTabChange($event)" data-automation-id="navigation-bar">
<mat-tab id="tasks-header" href="#tasks" label="{{'PS-TAB.TASKS-TAB' | translate}}">
<div class="page-content">
<div class="page-content" *ngIf="showTaskTab">
<div class="adf-grid" fxLayout="row" fxLayout.lt-lg="column" fxLayoutAlign="stretch">
<div class="adf-grid-item adf-tasks-menu" fxFlex.gt-md="225px">
<div class="adf-list-buttons">
<adf-sidebar-action-menu [expanded]="true" title="{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.CREATE' | translate}}">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.CREATE' | translate}}">
<mat-icon sidebar-menu-title-icon >arrow_drop_down</mat-icon>
<div sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-task" (click)="navigateStartTask()">
<mat-icon>assessment</mat-icon>
<span>{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.NEW_TASK' | translate}}</span>
</button>
</div>
@ -16,18 +17,18 @@
<adf-accordion>
<adf-accordion-group [heading]="'Tasks'" [isSelected]="true" [isOpen]="true"
[headingIcon]="'assignment'">
<adf-filters
[filterParam]="{name:'MY tasks'}"
<adf-task-filters
[filterParam]="filterSelected"
[appId]="appId"
[hasIcon]="false"
(filterClick)="onTaskFilterClick($event)"
(success)="onSuccessTaskFilterList($event)"
#activitifilter>
</adf-filters>
</adf-task-filters>
</adf-accordion-group>
</adf-accordion>
</div>
<div class="adf-grid-item adf-tasks-list" fxFlex.gt-md="335px" [ngClass.gt-md]="{'small-pagination': true}"
<div class="adf-grid-item adf-tasks-list" fxFlex.gt-md="380px" [ngClass.gt-md]="{'small-pagination': true}"
*ngIf="taskFilter && !isStartTaskMode()">
<adf-tasklist
[appId]="taskFilter?.appId"
@ -39,7 +40,6 @@
[assignment]="taskFilter?.filter?.assignment"
[state]="taskFilter?.filter?.state"
[sort]="taskFilter?.filter?.sort"
[data]="dataTasks"
[landingTaskId]="currentTaskId"
(rowClick)="onTaskRowClick($event)"
(success)="onSuccessTaskList($event)"
@ -104,14 +104,15 @@
</mat-tab>
<mat-tab id="processes-header" href="#processes"
label="{{'PS-TAB.PROCESSES-TAB' | translate}}">
<div class="page-content">
<div class="page-content" *ngIf="showProcessTab">
<div class="adf-grid" fxLayout="row" fxLayout.lt-lg="column" fxLayoutAlign="stretch">
<div class="adf-grid-item adf-processes-menu" fxFlex.gt-md="225px">
<div class="adf-list-buttons">
<adf-sidebar-action-menu [expanded]="true" title="{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.CREATE' | translate}}">
<adf-sidebar-action-menu [expanded]="true" [width]="205" title="{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.CREATE' | translate}}">
<mat-icon sidebar-menu-title-icon >arrow_drop_down</mat-icon>
<div sidebar-menu-options>
<button mat-menu-item data-automation-id="btn-start-process" (click)="navigateStartProcess()">
<mat-icon>assessment</mat-icon>
<span>{{'ADF_SIDEBAR_ACTION_MENU.BUTTON.NEW_PROCESS' | translate}}</span>
</button>
</div>
@ -130,7 +131,7 @@
</adf-accordion-group>
</adf-accordion>
</div>
<div class="adf-grid-item adf-processes-list adf-list" fxFlex.gt-md="335px" [ngClass.gt-md]="{'small-pagination': true}"
<div class="adf-grid-item adf-processes-list adf-list" fxFlex.gt-md="380px" [ngClass.gt-md]="{'small-pagination': true}"
*ngIf="processFilter && !isStartProcessMode()">
<adf-process-instance-list
#processList
@ -142,7 +143,6 @@
[page]="processPage"
[size]="paginationPageSize"
[sort]="processFilter?.filter?.sort"
[data]="dataProcesses"
(rowClick)="onProcessRowClick($event)"
(row-dblclick)="onProcessRowDblClick($event)"
(success)="onSuccessProcessList($event)">
@ -155,7 +155,7 @@
</adf-process-instance-list>
<adf-pagination
*ngIf="showProcessPagination"
*ngIf="processList"
[target]="processList"
(changePageSize)="onChangePageSize($event)"
[supportedPageSizes]="supportedPages"
@ -196,6 +196,7 @@
[appId]="appId"
[name]="defaultProcessName"
[processDefinitionName]="defaultProcessDefinitionName"
(formContentClicked)="onContentClick($event)"
(start)="onStartProcessInstance($event)"
(cancel)="onCancelProcessInstance()">
</adf-start-process>

View File

@ -29,7 +29,7 @@ import {
Output
} from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { ProcessInstanceFilterRepresentation, Pagination } from 'alfresco-js-api';
import { ProcessInstanceFilterRepresentation, Pagination, UserProcessInstanceFilterRepresentation } from 'alfresco-js-api';
import {
FORM_FIELD_VALIDATORS, FormEvent, FormFieldEvent, FormRenderingService, FormService,
DynamicTableRow, ValidateDynamicTableRowEvent, AppConfigService, PaginationComponent, UserPreferenceValues
@ -50,24 +50,23 @@ import {
TaskDetailsComponent,
TaskDetailsEvent,
TaskFiltersComponent,
TaskListComponent,
TaskListService
TaskListComponent
} from '@alfresco/adf-process-services';
import { LogService } from '@alfresco/adf-core';
import { AlfrescoApiService, UserPreferencesService } from '@alfresco/adf-core';
import {
DataSorting,
ObjectDataRow,
ObjectDataTableAdapter
} from '@alfresco/adf-core';
import { Subscription } from 'rxjs/Subscription';
import { /*CustomEditorComponent*/ CustomStencil01 } from './custom-editor/custom-editor.component';
import { DemoFieldValidator } from './demo-field-validator';
import { PreviewService } from '../../services/preview.service';
import { Location } from '@angular/common';
const currentProcessIdNew = '__NEW__';
const currentTaskIdNew = '__NEW__';
const TASK_ROUTE = 0;
const PROCESS_ROUTE = 1;
const REPORT_ROUTE = 2;
@Component({
selector: 'app-process-service',
templateUrl: './process-service.component.html',
@ -109,6 +108,8 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
@Input()
appId: number = null;
filterSelected: object = null;
@Output()
changePageSize: EventEmitter<Pagination> = new EventEmitter();
@ -135,36 +136,33 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
taskFilter: FilterRepresentationModel;
report: any;
processFilter: ProcessInstanceFilterRepresentation;
sub: Subscription;
processFilter: UserProcessInstanceFilterRepresentation;
blobFile: any;
flag = true;
dataTasks: ObjectDataTableAdapter;
dataProcesses: ObjectDataTableAdapter;
presetColoum = 'default';
showProcessPagination = false;
showTaskTab: boolean;
showProcessTab: boolean;
fieldValidators = [
...FORM_FIELD_VALIDATORS,
new DemoFieldValidator()
];
private subscriptions: Subscription[] = [];
constructor(private elementRef: ElementRef,
private route: ActivatedRoute,
private router: Router,
private taskListService: TaskListService,
private apiService: AlfrescoApiService,
private logService: LogService,
private appConfig: AppConfigService,
private preview: PreviewService,
formRenderingService: FormRenderingService,
formService: FormService,
private location: Location,
private preferenceService: UserPreferencesService) {
this.dataTasks = new ObjectDataTableAdapter();
this.dataTasks.setSorting(new DataSorting('created', 'desc'));
this.defaultProcessName = this.appConfig.get<string>('adf-start-process.name');
this.defaultProcessDefinitionName = this.appConfig.get<string>('adf-start-process.processDefinitionName');
@ -175,27 +173,26 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
// Uncomment this line to map 'custom_stencil_01' to local editor component
formRenderingService.setComponentTypeResolver('custom_stencil_01', () => CustomStencil01, true);
formService.formLoaded.subscribe((e: FormEvent) => {
this.logService.log(`Form loaded: ${e.form.id}`);
});
formService.formFieldValueChanged.subscribe((e: FormFieldEvent) => {
this.logService.log(`Field value changed. Form: ${e.form.id}, Field: ${e.field.id}, Value: ${e.field.value}`);
});
this.preferenceService.select(UserPreferenceValues.PaginationSize).subscribe((pageSize) => {
this.paginationPageSize = pageSize;
});
formService.validateDynamicTableRow.subscribe(
(validateDynamicTableRowEvent: ValidateDynamicTableRowEvent) => {
const row: DynamicTableRow = validateDynamicTableRowEvent.row;
if (row && row.value && row.value.name === 'admin') {
validateDynamicTableRowEvent.summary.isValid = false;
validateDynamicTableRowEvent.summary.message = 'Sorry, wrong value. You cannot use "admin".';
validateDynamicTableRowEvent.preventDefault();
this.subscriptions.push(
formService.formLoaded.subscribe((e: FormEvent) => {
this.logService.log(`Form loaded: ${e.form.id}`);
}),
formService.formFieldValueChanged.subscribe((e: FormFieldEvent) => {
this.logService.log(`Field value changed. Form: ${e.form.id}, Field: ${e.field.id}, Value: ${e.field.value}`);
}),
this.preferenceService.select(UserPreferenceValues.PaginationSize).subscribe((pageSize) => {
this.paginationPageSize = pageSize;
}),
formService.validateDynamicTableRow.subscribe(
(validateDynamicTableRowEvent: ValidateDynamicTableRowEvent) => {
const row: DynamicTableRow = validateDynamicTableRowEvent.row;
if (row && row.value && row.value.name === 'admin') {
validateDynamicTableRowEvent.summary.isValid = false;
validateDynamicTableRowEvent.summary.message = 'Sorry, wrong value. You cannot use "admin".';
validateDynamicTableRowEvent.preventDefault();
}
}
}
)
);
// Uncomment this block to see form event handling in action
@ -211,8 +208,13 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
if (this.router.url.includes('processes')) {
this.activeTab = this.tabs.processes;
}
this.sub = this.route.params.subscribe(params => {
this.showProcessTab = this.activeTab === this.tabs.processes;
this.showTaskTab = this.activeTab === this.tabs.tasks;
this.route.params.subscribe(params => {
const applicationId = params['appId'];
this.filterSelected = params['filterId'] ? { id: +params['filterId'] } : { index: 0 };
if (applicationId && applicationId !== '0') {
this.appId = params['appId'];
}
@ -227,8 +229,8 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
ngOnDestroy() {
this.sub.unsubscribe();
this.taskListService.tasksList$.subscribe();
this.subscriptions.forEach(subscription => subscription.unsubscribe());
this.subscriptions = [];
}
onTaskFilterClick(filter: FilterRepresentationModel): void {
@ -241,8 +243,16 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
onTabChange(event: any): void {
this.showProcessPagination = event.index === 1;
this.paginationPageSize = this.preferenceService.paginationSize;
const index = event.index;
if (index === TASK_ROUTE) {
this.showTaskTab = event.index === this.tabs.tasks;
this.relocateLocationToTask();
} else if (index === PROCESS_ROUTE) {
this.showProcessTab = event.index === this.tabs.processes;
this.relocateLocationToProcess();
} else if (index === REPORT_ROUTE) {
this.relocateLocationToReport();
}
}
onChangePageSize(event: Pagination): void {
@ -259,10 +269,12 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
applyTaskFilter(filter: FilterRepresentationModel) {
this.taskFilter = filter;
this.taskFilter = Object.assign({}, filter);
if (filter && this.taskList) {
this.taskList.hasCustomDataSource = false;
}
this.relocateLocationToTask();
}
onStartTaskSuccess(event: any): void {
@ -279,9 +291,10 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.currentTaskId = this.taskList.getCurrentId();
}
onProcessFilterClick(event: ProcessInstanceFilterRepresentation): void {
onProcessFilterClick(event: UserProcessInstanceFilterRepresentation): void {
this.processFilter = event;
this.resetProcessPaginationPage();
this.relocateLocationToProcess();
}
resetProcessPaginationPage() {
@ -293,7 +306,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
onSuccessProcessList(event: any): void {
this.showProcessPagination = true;
this.currentProcessInstanceId = this.processList.getCurrentId();
}
@ -329,19 +341,14 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
}
navigateStartProcess(): void {
this.resetProcessFilters();
this.reloadProcessFilters();
this.currentProcessInstanceId = currentProcessIdNew;
}
navigateStartTask(): void {
this.resetTaskFilters();
this.reloadTaskFilters();
this.currentTaskId = currentTaskIdNew;
}
onStartProcessInstance(instance: ProcessInstance): void {
this.showProcessPagination = false;
this.currentProcessInstanceId = instance.id;
this.activitiStartProcess.reset();
this.activitiprocessfilter.selectRunningFilter();
@ -367,14 +374,11 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
onFormCompleted(form): void {
this.currentTaskId = null;
this.taskPage = this.taskListPagination.current - 1;
if (this.taskList) {
this.taskList.reload();
} else {
this.navigateToProcess();
if (this.taskListPagination) {
this.taskPage = this.taskListPagination.current - 1;
}
if (this.processList) {
this.processList.reload();
if (!this.taskList) {
this.navigateToProcess();
}
}
@ -382,8 +386,24 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.router.navigate([`/activiti/apps/${this.appId}/processes/`]);
}
relocateLocationToProcess(): void {
this.location.go(`/activiti/apps/${this.appId || 0}/processes/${this.processFilter ? this.processFilter.id : 0}`);
}
relocateLocationToTask(): void {
this.location.go(`/activiti/apps/${this.appId || 0}/tasks/${this.taskFilter.id}`);
}
relocateLocationToReport(): void {
this.location.go(`/activiti/apps/${this.appId || 0}/report/`);
}
onContentClick(content: any): void {
this.preview.showBlob(content.name, content.contentBlob);
if (content.contentBlob) {
this.preview.showBlob(content.name, content.contentBlob);
} else {
this.preview.showResource(content.sourceId.split(';')[0]);
}
}
onAuditClick(event: any) {
@ -427,11 +447,11 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.activeTab = this.tabs.tasks;
const taskId = event.value.id;
const processTaskDataRow = new ObjectDataRow({
const processTaskDataRow: any = {
id: taskId,
name: event.value.name || 'No name',
created: event.value.created
});
};
this.activitifilter.selectFilter(null);
if (this.taskList) {
this.taskList.setCustomDataSource([processTaskDataRow]);
@ -440,14 +460,6 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit
this.currentTaskId = taskId;
}
private resetProcessFilters(): void {
this.processFilter = null;
}
private resetTaskFilters(): void {
this.taskFilter = null;
}
private reloadProcessFilters(): void {
this.activitiprocessfilter.selectFilter(this.activitiprocessfilter.getCurrentFilter());
}

View File

@ -15,10 +15,11 @@
* limitations under the License.
*/
import { Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core';
import { Component, Input, OnChanges, OnInit, ViewChild, OnDestroy } from '@angular/core';
import { TaskListService, TaskAttachmentListComponent, TaskDetailsModel, TaskUploadService } from '@alfresco/adf-process-services';
import { UploadService, AlfrescoApiService, AppConfigService } from '@alfresco/adf-core';
import { PreviewService } from '../../services/preview.service';
import { Subscription } from 'rxjs/Subscription';
export function taskUploadServiceFactory(api: AlfrescoApiService, config: AppConfigService) {
return new TaskUploadService(api, config);
@ -37,7 +38,7 @@ export function taskUploadServiceFactory(api: AlfrescoApiService, config: AppCon
]
})
export class TaskAttachmentsComponent implements OnInit, OnChanges {
export class TaskAttachmentsComponent implements OnInit, OnChanges, OnDestroy {
@ViewChild('taskAttachList')
taskAttachList: TaskAttachmentListComponent;
@ -47,13 +48,19 @@ export class TaskAttachmentsComponent implements OnInit, OnChanges {
taskDetails: any;
private subscriptions: Subscription[] = [];
constructor(
private uploadService: UploadService,
private activitiTaskList: TaskListService,
private preview: PreviewService) {}
ngOnInit() {
this.uploadService.fileUploadComplete.subscribe(value => this.onFileUploadComplete(value.data));
this.subscriptions.push(
this.uploadService.fileUploadComplete.subscribe(
value => this.onFileUploadComplete(value.data)
)
);
}
ngOnChanges() {
@ -65,6 +72,11 @@ export class TaskAttachmentsComponent implements OnInit, OnChanges {
}
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
this.subscriptions = [];
}
onFileUploadComplete(content: any) {
this.taskAttachList.add(content);
}

View File

@ -18,6 +18,7 @@
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { MinimalNodeEntity } from 'alfresco-js-api';
import { PreviewService } from '../../services/preview.service';
@Component({
selector: 'app-search-bar',
@ -26,7 +27,7 @@ import { MinimalNodeEntity } from 'alfresco-js-api';
})
export class SearchBarComponent {
constructor(public router: Router) {
constructor(public router: Router, private preview: PreviewService) {
}
/**
@ -43,7 +44,7 @@ export class SearchBarComponent {
onItemClicked(event: MinimalNodeEntity) {
if (event.entry.isFile) {
this.router.navigate(['/files', event.entry.id, 'view']);
this.preview.showResource(event.entry.id);
} else if (event.entry.isFolder) {
this.router.navigate(['/files', event.entry.id]);
}

View File

@ -3,7 +3,7 @@
[maxResults]="maxItems"
[skipResults]="skipCount"
(resultLoaded)="onSearchResultLoaded($event)"
#search>
#searchResult>
</adf-search>
<div class="adf-search-results__facets">
@ -14,17 +14,26 @@
<adf-search-filter #searchFilter></adf-search-filter>
<div class="adf-search-results__content">
<div class="adf-search-results__sorting">
<adf-search-sorting-picker></adf-search-sorting-picker>
</div>
<app-files-component
[currentFolderId]="null"
[nodeResult]="resultNodePageList"
[disableDragArea]="true"
[pagination]="pagination"
(changedPageSize)="onRefreshPagination($event)"
(changedPageNumber)="onRefreshPagination($event)"
(turnedNextPage)="onRefreshPagination($event)"
(loadNext)="onRefreshPagination($event)"
(turnedPreviousPage)="onRefreshPagination($event)"
(deleteElementSuccess)="onDeleteElementSuccess($event)">
[showHeader]="false"
[sorting]="sorting"
[sortingMode]="'server'"
[showRecentFiles]="false"
[showSitePicker]="false"
[showSettingsPanel]="false"
[currentFolderId]="null"
[nodeResult]="resultNodePageList"
[disableDragArea]="true"
[pagination]="pagination"
(changedPageSize)="onRefreshPagination($event)"
(changedPageNumber)="onRefreshPagination($event)"
(turnedNextPage)="onRefreshPagination($event)"
(loadNext)="onRefreshPagination($event)"
(turnedPreviousPage)="onRefreshPagination($event)"
(deleteElementSuccess)="onDeleteElementSuccess($event)">
</app-files-component>
</div>
</div>

View File

@ -14,6 +14,10 @@
&__content {
flex: 1;
}
&__sorting {
text-align: right;
}
}
div.search-results-container {

View File

@ -15,54 +15,78 @@
* limitations under the License.
*/
import { Component, OnInit, Optional, ViewChild } from '@angular/core';
import { Component, OnInit, Optional, ViewChild, OnDestroy } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { NodePaging, Pagination } from 'alfresco-js-api';
import { SearchComponent, SearchQueryBuilderService } from '@alfresco/adf-content-services';
import { UserPreferencesService } from '@alfresco/adf-core';
import { UserPreferencesService, SearchService, SearchConfigurationService } from '@alfresco/adf-core';
import { Subscription } from 'rxjs/Subscription';
@Component({
selector: 'app-search-result-component',
templateUrl: './search-result.component.html',
styleUrls: ['./search-result.component.scss']
styleUrls: ['./search-result.component.scss'],
providers: [SearchService, SearchQueryBuilderService]
})
export class SearchResultComponent implements OnInit {
export class SearchResultComponent implements OnInit, OnDestroy {
@ViewChild('search')
search: SearchComponent;
@ViewChild('searchResult')
searchResult: SearchComponent;
queryParamName = 'q';
searchedWord = '';
resultNodePageList: NodePaging;
pagination: Pagination;
maxItems: number;
skipCount = 0;
pagination: Pagination;
sorting = ['name', 'asc'];
private subscriptions: Subscription[] = [];
constructor(public router: Router,
private preferences: UserPreferencesService,
private queryBuilder: SearchQueryBuilderService,
private searchConfiguration: SearchConfigurationService,
@Optional() private route: ActivatedRoute) {
this.maxItems = this.preferences.paginationSize;
queryBuilder.paging = {
maxItems: this.maxItems,
maxItems: this.preferences.paginationSize,
skipCount: 0
};
}
ngOnInit() {
this.sorting = this.getSorting();
this.subscriptions.push(
this.queryBuilder.updated.subscribe(() => {
this.sorting = this.getSorting();
})
);
if (this.route) {
this.route.params.forEach((params: Params) => {
this.searchedWord = params.hasOwnProperty(this.queryParamName) ? params[this.queryParamName] : null;
this.queryBuilder.queryFragments['queryName'] = `cm:name:'${this.searchedWord}'`;
this.queryBuilder.update();
if (this.searchedWord) {
const queryBody = this.searchConfiguration.generateQueryBody(this.searchedWord, 0, 100);
this.queryBuilder.userQuery = queryBody.query.query;
this.queryBuilder.update();
}
});
}
this.maxItems = this.preferences.paginationSize;
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
this.subscriptions = [];
}
onSearchResultLoaded(nodePaging: NodePaging) {
this.resultNodePageList = nodePaging;
this.pagination = nodePaging.list.pagination;
this.pagination = {...nodePaging.list.pagination };
}
onRefreshPagination(pagination: Pagination) {
@ -77,6 +101,16 @@ export class SearchResultComponent implements OnInit {
}
onDeleteElementSuccess(element: any) {
this.search.reload();
this.searchResult.reload();
}
private getSorting(): string[] {
const primary = this.queryBuilder.getPrimarySorting();
if (primary) {
return [primary.key, primary.ascending ? 'asc' : 'desc'];
}
return ['name', 'asc'];
}
}

View File

@ -1 +1,2 @@
<adf-host-settings (error)="onError($event)"></adf-host-settings>
This component is only for internal use
<adf-host-settings (cancel)="onCancel()" (success)="onSuccess()" (error)="onError($event)"></adf-host-settings>

View File

@ -16,7 +16,8 @@
*/
import { Component } from '@angular/core';
import { LogService } from '@alfresco/adf-core';
import { LogService, } from '@alfresco/adf-core';
import { Router } from '@angular/router';
@Component({
selector: 'app-settings',
@ -24,10 +25,19 @@ import { LogService } from '@alfresco/adf-core';
})
export class SettingsComponent {
constructor(public logService: LogService) {
constructor(private router: Router,
public logService: LogService) {
}
onError(error: string) {
this.logService.log(error);
}
onCancel() {
this.router.navigate(['/login']);
}
onSuccess() {
this.router.navigate(['/login']);
}
}

View File

@ -2,7 +2,7 @@
<mat-icon>format_color_fill</mat-icon>
</button>
<mat-menu class="docs-theme-picker-menu" #themeMenu="matMenu" x-position="before">
<mat-menu class="docs-theme-picker-menu adf-menu" #themeMenu="matMenu" x-position="before">
<button *ngFor="let theme of themes" [attr.data-automation-id]="theme.name" mat-menu-item (click)="installTheme(theme)" >
<mat-icon mat-list-icon [matTooltip]="theme.name" class="docs-theme-chosen-icon" [style.color]="theme.accent"
[style.background]="theme.primary"

View File

@ -17,7 +17,7 @@
<button
mat-icon-button
(selection-node-restored)="refresh()"
(restore)="documentList.reload()"
(restore)="onRestore($event)"
[adf-restore]="documentList.selection"
*ngIf="documentList.selection.length"
title="{{ 'TRASHCAN.ACTIONS.RESTORE' | translate }}">
@ -29,7 +29,6 @@
<div class="inner-layout__content">
<adf-document-list #documentList
[attr.class]="documentList.isEmpty() ? 'empty-list' : ''"
currentFolderId="-trashcan-"
selectionMode="multiple"
[multiselect]="true"
@ -41,12 +40,12 @@
<empty-folder-content>
<ng-template>
<div class="empty-list__block">
<mat-icon>delete</mat-icon>
<p class="empty-list__title">{{ 'TRASHCAN.EMPTY_STATE.TITLE' | translate }}</p>
<p class="empty-list__text">{{ 'TRASHCAN.EMPTY_STATE.FIRST_TEXT' | translate }}</p>
<p class="empty-list__text">{{ 'TRASHCAN.EMPTY_STATE.SECOND_TEXT' | translate }}</p>
</div>
<adf-empty-content
icon="delete"
[title]="'TRASHCAN.EMPTY_STATE.TITLE'">
<p class="adf-empty-content__text">{{ 'TRASHCAN.EMPTY_STATE.FIRST_TEXT' | translate }}</p>
<p class="adf-empty-content__text">{{ 'TRASHCAN.EMPTY_STATE.SECOND_TEXT' | translate }}</p>
</adf-empty-content>
</ng-template>
</empty-folder-content>
@ -78,7 +77,7 @@
key="archivedAt"
title="DOCUMENT_LIST.COLUMNS.DELETED_ON">
<ng-template let-value="value">
<span title="{{ value | date:'medium' }}">{{ value | adfTimeAgo }}</span>
<span title="{{ value | date:'medium' }}">{{ value | adfTimeAgo: currentLocale }}</span>
</ng-template>
</data-column>

View File

@ -25,29 +25,57 @@
import { Component, ViewChild } from '@angular/core';
import { DocumentListComponent } from '@alfresco/adf-content-services';
import { UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
import { UserPreferencesService, UserPreferenceValues, RestoreMessageModel, NotificationService } from '@alfresco/adf-core';
import { Router } from '@angular/router';
import { PathInfoEntity } from 'alfresco-js-api';
@Component({
templateUrl: './trashcan.component.html',
styleUrls: ['trashcan.component.scss']
})
export class TrashcanComponent {
@ViewChild('documentList')
documentList: DocumentListComponent;
supportedPages = [];
currentLocale;
constructor(private preference: UserPreferencesService) {
this.preference.select(UserPreferenceValues.SupportedPageSizes)
.subscribe((pages) => {
this.supportedPages = pages;
});
constructor(
private preference: UserPreferencesService,
private router: Router,
private notificationService: NotificationService
) {
this.preference
.select(UserPreferenceValues.SupportedPageSizes)
.subscribe(pages => {
this.supportedPages = pages;
});
this.preference
.select(UserPreferenceValues.Locale)
.subscribe(locale => {
this.currentLocale = locale;
});
}
onRestore(restoreMessage: RestoreMessageModel) {
this.notificationService
.openSnackMessageAction(
restoreMessage.message,
restoreMessage.action
)
.onAction()
.subscribe(() => this.navigateLocation(restoreMessage.path));
this.documentList.reload();
}
private navigateLocation(path: PathInfoEntity) {
const parent = path.elements[path.elements.length - 1];
this.router.navigate(['files/', parent.id]);
}
refresh() {
this.documentList.reload();
this.documentList.resetSelection();
}
}

View File

@ -24,7 +24,6 @@ $theme: mat-light-theme($primary, $accent, $warn);
@include adf-login-component-theme($theme);
@include adf-process-service-component-theme($theme);
@include adf-content-services-theme($theme);
@include adf-process-services-theme($theme);
@include adf-insights-theme($theme);

View File

@ -18,7 +18,7 @@
* BROWSER POLYFILLS
*/
/** IE9, IE10 and IE11 requires all of the following 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';
@ -39,13 +39,12 @@ import 'classlist.js'; // Run `npm install --save classlist.js`.
/** IE10 and IE11 requires the following to support `@angular/animation`. */
import 'web-animations-js'; // Run `npm install --save web-animations-js`.
/** Evergreen browsers require these. **/
/** Evergreen browsers require these. */
import 'core-js/es6/reflect';
import 'core-js/es7/reflect';
import 'core-js/es6/array';
import 'core-js/es7/array';
/***************************************************************************************************
* Zone JS is required by Angular itself.
*/
@ -71,4 +70,3 @@ import 'intl/locale-data/jsonp/en';
* */
import 'custom-event-polyfill/custom-event-polyfill'; // Run `npm install --save custom-event-polyfill`.

View File

@ -1,32 +1,20 @@
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare var __karma__: any;
declare var require: any;
// Prevent Karma from running prematurely.
__karma__.loaded = function () {};
declare const require: any;
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
// Finally, start Karma to run the tests.
__karma__.start();

View File

@ -9,13 +9,13 @@
"types": [],
"paths": {
"alfresco-js-api": [
"../node_modules/alfresco-js-api/dist/alfresco-js-api.js"
"../../node_modules/alfresco-js-api/dist/alfresco-js-api.js"
],
"rxjs/*": [
"../node_modules/rxjs/*"
"../../node_modules/rxjs/*"
],
"@angular/*": [
"../node_modules/@angular/*"
"../../node_modules/@angular/*"
],
"@alfresco/adf-core": [
"../../lib/core"

View File

@ -2,7 +2,8 @@
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/spec",
"module": "es2015",
"module": "commonjs",
"target": "es5",
"rootDir": "..",
"baseUrl": ".",
"skipLibCheck": false,
@ -12,13 +13,13 @@
],
"paths": {
"alfresco-js-api": [
"../node_modules/alfresco-js-api/dist/alfresco-js-api.js"
"../../node_modules/alfresco-js-api/dist/alfresco-js-api.js"
],
"rxjs/*": [
"../node_modules/rxjs/*"
"../../node_modules/rxjs/*"
],
"@angular/*": [
"../node_modules/@angular/*"
"../../node_modules/@angular/*"
],
"@alfresco/adf-core": [
"../../lib/core"
@ -35,8 +36,22 @@
}
},
"exclude": [
"**/e2e/*.ts",
"**/*.e2e-spec.ts",
"**/*.po.ts",
"**/integration/*.*",
"**/lib/*.*",
"node_modules",
"tmp"
],
"include": [
"**/*.ts"
],
"angularCompilerOptions": {
"skipTemplateCodegen": false
}
},
"files": [
"test.ts",
"polyfills.ts"
]
}

View File

@ -1,4 +1,5 @@
{
"extends": "../tsconfig.json",
"compileOnSave": false,
"compilerOptions": {
"outDir": "./dist/out-tsc",

View File

@ -1,6 +1,7 @@
{
"rulesDirectory": [
"node_modules/codelyzer"
"../node_modules/codelyzer",
"../tools/tslint-rules/"
],
"rules": {
"arrow-return-shorthand": true,

View File

@ -15,6 +15,8 @@ that the component is complete and suitable for normal use. The other status lev
but is now obsolete and will probably be removed in a future version of ADF.
- **Experimental** ![](docassets/images/ExperimentalIcon.png) - The component is available for
experimentation but not fully complete and tested for production code.
- **Internal** ![](docassets/images/InternalIcon.png) - The component is available for
internal test use but not meant to be used in production
There is also a set of ADF tutorials that describe how to accomplish tasks step-by-step.
See the [Tutorials index](tutorials/README.md) for the full list.
@ -55,6 +57,8 @@ for more information about installing and using the source code.
| Name | Description | Source link |
| ---- | ----------- | ----------- |
| [About component](core/about.component.md) ![Experimental](docassets/images/ExperimentalIcon.png) | This component allow you to have a general overview of the version of ADF installed and the status of the Content service and Process service. | [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) |
| [Accordion group component](core/accordion-group.component.md) | Adds a collapsible panel to an accordion menu. | [Source](../lib/core/collapsable/accordion-group.component.ts) |
| [Accordion component](core/accordion.component.md) | Creates a collapsible accordion menu. | [Source](../lib/core/collapsable/accordion.component.ts) |
@ -73,9 +77,12 @@ for more information about installing and using the source code.
| [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) | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../lib/core/settings/host-settings.component.ts) |
| [Sidebar action menu component](core/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/sidebar/sidebar-action-menu.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) |
| [Sidebar action menu component](core/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/sidenav-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/sidenav-layout/components/sidenav-layout/sidenav-layout.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) |
@ -121,6 +128,7 @@ for more information about installing and using the source code.
| 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 an APS form field type string onto the corresponding form widget component type. | [Source](../lib/core/form/services/form-rendering.service.ts) |
@ -141,7 +149,7 @@ for more information about installing and using the source code.
| [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) |
| [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) |
| [Log service](core/log.service.md) | Provide a log functionality for your ADF application. | [Source](../lib/core/services/log.service.ts) |
| [Log service](core/log.service.md) | Provides log functionality. | [Source](../lib/core/services/log.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) |
@ -197,10 +205,20 @@ for more information about installing and using the source code.
| [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 which 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) |
@ -212,7 +230,7 @@ for more information about installing and using the source code.
| [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 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) |
@ -244,13 +262,21 @@ for more information about installing and using the source code.
| [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 service](content-services/node-permission.service.md) | Manages the role permissions for the content nodes | [Source](../lib/content-services/permission-manager/services/node-permission.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) |
| [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) |
<!--content-services end-->
## Other classes and interfaces
| Name | Description | Source link |
| ---- | ----------- | ----------- |
| [Search Widget interface](content-services/search-widget.interface.md) | Specifies required properties for Search filter component widgets. | [Source](../lib/content-services/search/search-widget.interface.ts) |
[(Back to Contents)](#contents)
## ADF Process Services

View File

@ -18,10 +18,20 @@ for more information about installing and using the source code.
| [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 which 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) |
@ -33,7 +43,7 @@ for more information about installing and using the source code.
| [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 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) |
@ -65,9 +75,17 @@ for more information about installing and using the source code.
| [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 service](node-permission.service.md) | Manages the role permissions for the content nodes | [Source](../../lib/content-services/permission-manager/services/node-permission.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) |
| [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) |
<!--content-services end-->
## Other classes and interfaces
| Name | Description | Source link |
| ---- | ----------- | ----------- |
| [Search Widget interface](search-widget.interface.md) | Specifies required properties for Search filter component widgets. | [Source](../../lib/content-services/search/search-widget.interface.ts) |

View File

@ -0,0 +1,55 @@
---
Added: v2.4.0
Status: Active
Last reviewed: 2018-05-03
---
# Add Permission Dialog Component
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)
## Basic Usage
```ts
import { NodePermissionDialogService } from '@alfresco/adf-content-services';
constructor(private nodePermissionDialogService: nodePermissionDialogService) {
}
this.nodePermissionDialogService.openAddPermissionDialog(this.nodeId).subscribe((selectedNodes) => {
//action for selected nodes
},
(error) => {
this.showErrorMessage(error);
});
```
## Details
This component extends the [Add permission panel component](../content-services/add-permission-panel.component.md)
to apply the chosen selection of permissions when they are accepted.
You can open the dialog with the [Node Permission Dialog Service](../content-services/node-permission-dialog.service.md). This returns Observables that
you can subscribe to for get the details of the node after the update.
Use the `updateNodePermissionByDialog` from the service to update node permissions, as shown in
the following example:
```ts
import { NodePermissionDialogService } from '@alfresco/adf-content-services';
constructor(private nodePermissionDialogService: nodePermissionDialogService) {
}
this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe((node) => {
//updated node
},
(error) => {
this.showErrorMessage(error);
});
```
## See also
- [Node permission dialog service](node-permission-dialog.service.md)
- [Add permission panel component](add-permission-panel.component.md)

View File

@ -0,0 +1,44 @@
---
Added: v2.4.0
Status: Active
Last reviewed: 2018-05-03
---
# Add Permission Panel Component
Searches for people or groups to add to the current node permissions.
![Add Permission Component](../docassets/images/add-permission-component.png)
## Basic Usage
```html
<adf-add-permission
[nodeId]="nodeId"
(success)="onSuccess($event)"
(error)="onError($event)">
</adf-add-permission>
```
## Class members
### Events
| Name | Type | Description |
| -- | -- | -- |
| select | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when a permission list item is selected. |
## Details
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
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)

View File

@ -0,0 +1,47 @@
---
Added: v2.4.0
Status: Active
Last reviewed: 2018-05-03
---
# Add Permission Component
Searches for people or groups to add to the current node permissions.
![Add Permission Component](../docassets/images/add-permission-component.png)
## Basic Usage
```html
<adf-add-permission
[nodeId]="nodeId"
(success)="onSuccess($event)"
(error)="onError($event)">
</adf-add-permission>
```
## Class members
### Properties
| Name | Type | Default value | Description |
| -- | -- | -- | -- |
| nodeId | `string` | | ID of the target node. |
### Events
| Name | Type | Description |
| -- | -- | -- |
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when an error occurs during the update. |
| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`MinimalNodeEntryEntity`](../content-services/document-library.model.md)`>` | Emitted when the node is updated successfully. |
## Details
This component extends the [Add permission panel component](../content-services/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.
## See also
- [Add permission panel component](../content-services/add-permission-panel.component.md)
- [Add permission dialog component](../content-services/add-permission-dialog.component.md)

View File

@ -1,7 +1,7 @@
---
Added: v2.0.0
Status: Active
Last reviewed: 2018-03-12
Last reviewed: 2018-06-08
---
# Breadcrumb Component
@ -19,24 +19,32 @@ Indicates the current position within a navigation hierarchy.
</adf-breadcrumb>
```
## Class members
### Properties
| Name | Type | Default value | Description |
| ---- | ---- | ------------- | ----------- |
| folderNode | `MinimalNodeEntryEntity` | `null` | Active node, builds UI based on folderNode.path.elements collection. |
| 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` | | (optional) Document List component to operate with. The list will update when the breadcrumb is clicked. |
| transform | `(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. |
| -- | -- | -- | -- |
| folderNode | [`MinimalNodeEntryEntity`](../content-services/document-library.model.md) | null | Active node, builds UI based on folderNode.path.elements collection. |
| 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. |
| 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
| Name | Type | Description |
| ---- | ---- | ----------- |
| navigate | `EventEmitter<PathElementEntity>` | Emitted when the user clicks on a breadcrumb. |
| -- | -- | -- |
| navigate | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`PathElementEntity`](../../lib/content-services/document-list/models/document-library.model.ts)`>` | Emitted when the user clicks on a breadcrumb. |
## Details
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).
### Using the transform function
The function supplied in the `transform` property lets you modify the Node object that the component
@ -45,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` 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
@ -84,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 breadcrumbTransfrom before/after screenshot](../docassets/images/breadcrumbTransform.png)
![Content Node Selector breadcrumbTransform before/after screenshot](../docassets/images/breadcrumbTransform.png)
## See also

View File

@ -1,7 +1,9 @@
---
Added: v2.0.0
Status: Active
Last reviewed: 2018-06-08
---
# Content Action component
Adds options to a Document List actions menu for a particular content type.
@ -12,12 +14,15 @@ Adds options to a Document List actions menu for a particular content type.
- [Basic Usage](#basic-usage)
- [Class members](#class-members)
- [Properties](#properties)
- [Events](#events)
- [Details](#details)
- [Examples](#examples)
- [Conditional visibility](#conditional-visibility)
- [Customizing built-in actions](#customizing-built-in-actions)
- [Error, Permission and Success callbacks](#error-permission-and-success-callbacks)
@ -76,31 +81,34 @@ export class MyView {
}
```
## Class members
### Properties
| Name | Type | Default value | Description |
| ---- | ---- | ------------- | ----------- |
| title | `string` | `'Action'` | The title of the action as shown in the menu. If the title is a translation key the translation will be automatically showed. |
| icon | `string` | | The name of the icon to display next to the menu command (can be left blank). |
| handler | `string` | | System actions. Can be "delete", "download", "copy" or "move". |
| target | `string` | [ContentActionTarget.All](https://github.com/Alfresco/alfresco-ng2-components/blob/development/lib/content-services/document-list/models/content-action.model.ts) | Type of item that the action applies to. Can be one of the values provided by the enum : **All**, **Folder**, **Document** |
| permission | `string` | | The permission type. |
| disableWithNoPermission | `boolean` | | Should this action be disabled in the menu if the user doesn't have permission for it? |
| disabled | `boolean` | `false` | Is the menu item disabled? |
| -- | -- | -- | -- |
| disableWithNoPermission | `boolean` | | Should this action be disabled in the menu if the user doesn't have permission for it? |
| disabled | `boolean \|Function` | false | Is the menu item disabled? |
| handler | `string` | | System actions. Can be "delete", "download", "copy" or "move". |
| icon | `string` | | The name of the icon to display next to the menu command (can be left blank). |
| permission | `string` | | The permission type. |
| target | `string` | [`ContentActionTarget`](../../lib/content-services/document-list/models/content-action.model.ts).All | Type of item that the action applies to. Can be "document" or "folder" |
| title | `string` | "Action" | The title of the action as shown in the menu. |
| visible | `boolean \| Function` | true | Visibility state (see examples). |
### Events
| Name | Type | Description |
| ---- | ---- | ----------- |
| execute | `EventEmitter<{}>` | Emitted when the user selects the action from the menu. |
| permissionEvent | `EventEmitter<{}>` | Emitted when a permission error occurs |
| error | `EventEmitter<{}>` | Emitted when an error occurs during the action. Applies to copy and move actions. |
| success | `EventEmitter<{}>` | Emitted when the action succeeds with the success string message. Applies to copy, move and delete actions. |
| -- | -- | -- |
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<Object>` | Emitted when an error occurs during the action. Applies to copy and move actions. |
| execute | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<Object>` | Emitted when the user selects the action from the menu. |
| permissionEvent | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<Object>` | Emitted when a permission error occurs |
| success | `EventEmitter<Object>` | Emitted when the action succeeds with the success string message. Applies to copy, move and delete actions. |
## Details
The document actions are rendered on a dropdown menu for each items of content. You can use the
`target` property to choose whether the action applies to folders , documents or both. (By default the actions arre applied to both)
`target` property to choose whether the action applies to folders, documents or both. (By default the actions are applied to both)
A number of built-in actions are defined to handle common use cases:
@ -116,11 +124,11 @@ 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` 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 (see the [Document Library model](document-library.model.md) page for more
information) which contains full details of the item that the action is operating on. 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:
type, and other details of the item just deleted:
```html
<content-actions>
@ -156,29 +164,28 @@ type and other details of the item just deleted:
### Examples
#### System handler
This action simply execute one of the built-in actions described above:
```html
<adf-document-list [contentActions]="true"...>
<content-actions>
<content-action
target="document"
title="Download"
handler="download">
</content-action>
</content-actions>
</adf-document-list>
```
```html
<adf-document-list [contentActions]="true"...>
<content-actions>
<content-action
target="document"
title="Download"
handler="download">
</content-action>
</content-actions>
</adf-document-list>
```
![Download document action](../docassets/images/document-action-download.png)
#### Custom handler
If you specify a custom handler it will be executed at any click of the action:
If you specify a custom handler it will be executed whenever the action is selected:
```html
<adf-document-list [contentActions]="true"...>
@ -193,7 +200,6 @@ If you specify a custom handler it will be executed at any click of the action:
</adf-document-list>
```
```ts
export class MyComponent {
@ -206,11 +212,11 @@ export class MyComponent {
#### System handler combined with custom handler
If you specify both system handler and your own custom handler with
`(execute)="myCustomActionAfterDelete($event)"`, your handler will run after a system handler completes
successfully. A system operation is considered successful if there are no permission or
network-related errors for the system request. You can avoid permission errors simply by disabling
an item for users who don't have permission to use it (set `disableWithNoPermission="true"`).
If you specify both a system handler and your own custom handler with
`(execute)="myCustomActionAfterDelete($event)"`, your handler will run after the system handler
completes successfully. A system operation is considered successful if there are no permission
or network-related errors for the system request. You can avoid permission errors simply
by disablingan item for users who don't have permission to use it (set `disableWithNoPermission="true"`).
```html
<adf-document-list ...>
@ -276,7 +282,6 @@ export class MyComponent {
![Delete show notification message](../docassets/images/content-action-notification-message.png)
#### Copy and move
These actions show the destination chooser dialog for copy and move actions. By default,
@ -317,6 +322,118 @@ allow the item being copied/moved to be the destination if it is itself a folder
</adf-document-list>
```
### Conditional visibility
The `<content-action>` component allows you to control visibility with the help of the `visible` property and supports the following scenarios:
- direct value of `boolean` type
- binding to a property of the `Function` type that evaluates condition and returns `boolean` value
#### Using direct boolean value
```html
<content-action
icon="get_app"
title="Never see this action again"
handler="download"
[visible]="false">
</content-action>
```
#### Using a property of the Function type
```html
<content-action
icon="get_app"
title="Download this file now!"
handler="download"
[visible]="canDownloadNode">
</content-action>
```
The code above relies on the `canDownloadNode` property (of `Function` type) declared in
your component class:
```ts
export class MyComponent {
canDownloadNode = (node: MinimalNodeEntity): boolean => {
if (node && node.entry && node.entry.name === 'For Sale.docx') {
return true;
}
return false;
}
}
```
The code above checks the node name and evaluates to `true` only if the corresponding
node is called "For Sale.docx".
Note that if you want to preserve `this` context within the evaluator function then
the property should be declared as a lambda function:
```ts
funcName = (parameters): boolean => {
// implementation
return true;
}
```
### Conditional disabled state
Similar to `visible` property, it is possible to control the `disabled` state with the following scenarios:
- direct value of `boolean` type
- binding to a property of the `Function` type that evaluates condition and returns `boolean` value
#### Using direct value of boolean type
```html
<content-action
target="all"
title="Action for 'custom' node"
[disabled]="true"
(execute)="runCustomAction($event)">
</content-action>
```
#### Using a property of the Function type
```html
<content-action
target="all"
title="Action for 'custom' node"
[disabled]="isCustomActionDisabled"
(execute)="runCustomAction($event)">
</content-action>
```
The code above relies on the `isCustomActionDisabled` property of a `Function` type declared at your component class level:
```ts
export class MyComponent {
isCustomActionDisabled = (node: MinimalNodeEntity): boolean => {
if (node && node.entry && node.entry.name === 'custom') {
return false;
}
return true;
}
}
```
Code above checks the node name, and evaluates to `true` only if corresponding node is called "custom".
Please note that if you want to preserve `this` context within the evaluator function,
its property should be declared as a lambda one:
```ts
funcName = (parameters): boolean => {
// implementation
return true;
}
```
### Customizing built-in actions
The built-in actions are defined in the [Document Actions service](document-actions.service.md) and
@ -335,13 +452,8 @@ Defining error, permission and success callbacks are pretty much the same as doi
![Copy/move document action](../docassets/images/document-action-copymove.png)
<!-- Don't edit the See also section. Edit seeAlsoGraph.json and run config/generateSeeAlso.js -->
<!-- seealso start -->
## See also
- [Document list component](document-list.component.md)
- [Document actions service](document-actions.service.md)
- [Folder actions service](folder-actions.service.md)
<!-- seealso end -->

View File

@ -24,13 +24,14 @@ Displays and edits metadata related to a node.
### Properties
| Name | Type | Default | Description |
| --- | --- | --- | --- |
| node | MinimalNodeEntryEntity | - | (**required**) The node entity to fetch metadata about |
| displayEmpty | boolean | false | Toggles whether to display empty values in the card view |
| readOnly | boolean | true | Toggles whether the edit button should be shown |
| multi | boolean | false | The multi parameter of the underlying material expansion panel |
| preset | string | "*" | Name of the metadata preset, which defines aspects and their properties |
| Name | Type | Default value | Description |
| -- | -- | -- | -- |
| 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 |
| node | [`MinimalNodeEntryEntity`](../content-services/document-library.model.md) | | (required) The node entity to fetch metadata about |
| preset | `string` | | Name of the metadata preset, which defines aspects and their properties |
## Details
@ -44,7 +45,7 @@ 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
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.
@ -89,7 +90,7 @@ just the `exif:exif` and `custom:aspect` aspects are whitelisted:
```
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:
an array of property names in place of the "\*" filter:
```json
...
@ -190,24 +191,25 @@ A more complex config is shown in the example below:
]
}
```
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-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|
| 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

Some files were not shown because too many files have changed in this diff Show More