mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2026-09-16 18:13:06 +00:00
Compare commits
74
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
079047702f | ||
|
|
85e46c7007 | ||
|
|
f2a0b3f826 | ||
|
|
425b4bab67 | ||
|
|
97f1136f96 | ||
|
|
9cd94f8e39 | ||
|
|
48391f2db5 | ||
|
|
b923e41b2f | ||
|
|
1e0c569f47 | ||
|
|
4e38d1d44c | ||
|
|
21a275a777 | ||
|
|
5ecc05a84f | ||
|
|
c52a63485b | ||
|
|
d4e0da26ac | ||
|
|
4d54d8512b | ||
|
|
a74338e21d | ||
|
|
31d293bdb2 | ||
|
|
d4714e2b01 | ||
|
|
f751370b60 | ||
|
|
49062ae19d | ||
|
|
ecd4fed2ac | ||
|
|
c7e6051b1a | ||
|
|
db0aafa5df | ||
|
|
1f5785aa8e | ||
|
|
be03d82668 | ||
|
|
d265172cee | ||
|
|
7aa07ef525 | ||
|
|
2ebee4c024 | ||
|
|
b563e283c1 | ||
|
|
f1bdbf63b0 | ||
|
|
1dd7d29bf2 | ||
|
|
0651dc25d5 | ||
|
|
ec145fb73c | ||
|
|
450a4a0a49 | ||
|
|
792011ed4d | ||
|
|
699474ff59 | ||
|
|
2bf97891d9 | ||
|
|
11cb2ea688 | ||
|
|
1d2cb2390b | ||
|
|
1218def6cd | ||
|
|
6a3623bd76 | ||
|
|
5438eef9db | ||
|
|
e96f5b3c48 | ||
|
|
6b09745d09 | ||
|
|
5e11ade63c | ||
|
|
ad5e7a7d9b | ||
|
|
4bd656cc48 | ||
|
|
6c94ebde4b | ||
|
|
54fd097fab | ||
|
|
9bed60befc | ||
|
|
c863da0c5d | ||
|
|
951b22e098 | ||
|
|
c7f28d54d6 | ||
|
|
d776c7c77d | ||
|
|
6dafcb4447 | ||
|
|
5d043e6987 | ||
|
|
57713dbe6e | ||
|
|
cfe5242fda | ||
|
|
5f574b0176 | ||
|
|
2de76607a6 | ||
|
|
c245e467e4 | ||
|
|
8b3b6ffbca | ||
|
|
16f42be08e | ||
|
|
056e4c1429 | ||
|
|
dcab68d78a | ||
|
|
4b6896ae3d | ||
|
|
f40107de33 | ||
|
|
c16417cbff | ||
|
|
27502d5d67 | ||
|
|
3126c869b5 | ||
|
|
1d782191ae | ||
|
|
1dc6045c85 | ||
|
|
a4072aca74 | ||
|
|
22b62804d5 |
@@ -9,18 +9,17 @@ inputs:
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Before install
|
||||
if: ${{ ! env.ACT }}
|
||||
shell: bash
|
||||
run: |
|
||||
pip install --user --quiet awscli
|
||||
|
||||
- name: base vars
|
||||
shell: bash
|
||||
run: |
|
||||
if [ -n "${GITHUB_BASE_REF:-}" ]; then
|
||||
BASE_HASH=$(git merge-base "origin/${GITHUB_BASE_REF}" HEAD 2>/dev/null || git rev-parse HEAD)
|
||||
else
|
||||
BASE_HASH=$(git rev-parse HEAD)
|
||||
fi
|
||||
{
|
||||
echo "GIT_HASH=$(git rev-parse HEAD)";
|
||||
echo "BASE_HASH=$(git merge-base origin/${GITHUB_BASE_REF} HEAD)";
|
||||
echo "BASE_HASH=${BASE_HASH}";
|
||||
echo "HEAD_HASH=HEAD";
|
||||
echo "HEAD_COMMIT_HASH=${GH_COMMIT}";
|
||||
echo "NX_CALCULATION_FLAGS=--all";
|
||||
@@ -31,10 +30,22 @@ runs:
|
||||
|
||||
- name: affected:* flag parser
|
||||
shell: bash
|
||||
if: ${{ contains(github.event.head_commit.message , '[affected:*]') }}
|
||||
env:
|
||||
EVENT_NAME: ${{ github.event_name }}
|
||||
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
run: |
|
||||
echo "Setting up CI to run with commit flag [affected:*] flag."
|
||||
echo "BREAK_ACTION=true" >> $GITHUB_ENV
|
||||
# Get commit message safely from git to avoid script injection
|
||||
# For PRs, use the PR head SHA; for other events use HEAD
|
||||
if [ "$EVENT_NAME" == "pull_request" ] && [ -n "$PR_HEAD_SHA" ]; then
|
||||
COMMIT_MSG=$(git log -1 --format=%B "$PR_HEAD_SHA" 2>/dev/null || echo "")
|
||||
else
|
||||
COMMIT_MSG=$(git log -1 --format=%B 2>/dev/null || echo "")
|
||||
fi
|
||||
|
||||
if echo "$COMMIT_MSG" | grep -qF "[affected:*]"; then
|
||||
echo "Setting up CI to run with commit flag [affected:*] flag."
|
||||
echo "BREAK_ACTION=true" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: PULL_REQUEST event
|
||||
if: ${{ env.BREAK_ACTION == false && github.event_name == 'pull_request' && !github.event.pull_request.merged }}
|
||||
@@ -49,13 +60,15 @@ runs:
|
||||
} >> $GITHUB_ENV
|
||||
|
||||
- name: RELEASE on master/develop patch branch
|
||||
if: ${{ env.BREAK_ACTION == false && github.event.pull_request.merged }}
|
||||
if: ${{ env.BREAK_ACTION == false && (github.event.pull_request.merged || github.event_name == 'push') }}
|
||||
shell: bash
|
||||
env:
|
||||
REF_NAME: ${{ github.ref_name }}
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" =~ ^master(-patch.*)?$ ]]; then
|
||||
if [[ "$REF_NAME" =~ ^master(-patch.*)?$ ]]; then
|
||||
# into master(-patch*)
|
||||
echo "Setting up CI flags for Push on master patch"
|
||||
elif [[ "${{ github.ref_name }}" =~ ^develop-patch.*$ ]]; then
|
||||
elif [[ "$REF_NAME" =~ ^develop-patch.*$ ]]; then
|
||||
# into develop-patch*
|
||||
echo "Setting up CI flags for Push develop patch"
|
||||
else
|
||||
|
||||
@@ -12,7 +12,7 @@ inputs:
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
name: Create git tag
|
||||
env:
|
||||
TAG_NAME: ${{ inputs.tagName }}
|
||||
|
||||
@@ -3,17 +3,33 @@ description: "Download build artifacts"
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: download and extract artifacts from s3
|
||||
shell: bash
|
||||
env:
|
||||
REMOTE_PATH: "alfresco-ng2-components/build-cache/${{ github.run_id }}"
|
||||
run: |
|
||||
packages=( dist nxcache node_modules )
|
||||
for i in "${packages[@]}"; do
|
||||
time aws s3 cp --no-progress s3://${S3_BUILD_BUCKET_SHORT_NAME}/${REMOTE_PATH}/$i.tar.gz $i.tar.gz
|
||||
du -h $i.tar.gz
|
||||
time tar xzf $i.tar.gz
|
||||
done
|
||||
- name: Restore dist from cache
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: dist
|
||||
key: dist-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
dist-${{ github.run_id }}-
|
||||
fail-on-cache-miss: true
|
||||
|
||||
- name: Restore nxcache from cache
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: nxcache
|
||||
key: nxcache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
nxcache-${{ github.run_id }}-
|
||||
fail-on-cache-miss: true
|
||||
|
||||
- name: Restore node_modules from cache
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: node_modules
|
||||
key: node-modules-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
restore-keys: |
|
||||
node-modules-${{ github.run_id }}-
|
||||
fail-on-cache-miss: true
|
||||
|
||||
- name: show files
|
||||
shell: bash
|
||||
run: |
|
||||
@@ -24,4 +40,4 @@ runs:
|
||||
echo "====NXCACHE===="
|
||||
find nxcache -maxdepth 1 -type d
|
||||
echo "====ADF===="
|
||||
find node_modules/@alfresco/ -maxdepth 1 -type d
|
||||
find node_modules/@alfresco/ -maxdepth 1 -type d
|
||||
|
||||
@@ -2,36 +2,44 @@ name: "set npm tag"
|
||||
description: "se NPM tag"
|
||||
|
||||
inputs:
|
||||
event_name:
|
||||
description: "override github.event_name"
|
||||
required: false
|
||||
default: ${{ github.event_name }}
|
||||
branch_name:
|
||||
description: "override GITHUB_REF_NAME"
|
||||
required: false
|
||||
default: $GITHUB_REF_NAME
|
||||
default: ${{ github.ref_name }}
|
||||
|
||||
outputs:
|
||||
npm-tag:
|
||||
description: "NPM tag"
|
||||
value: ${{ steps.set-npm-tag.outputs.npm-tag }}
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
||||
- name: set TAG_NPM
|
||||
id: set-npm-tag
|
||||
shell: bash
|
||||
env:
|
||||
BRANCH_NAME: ${{ inputs.branch_name }}
|
||||
run: |
|
||||
TAG_NPM="alpha"
|
||||
VERSION_IN_PACKAGE_JSON=$(node -p "require('./package.json')".version)
|
||||
echo "version in package.json=${VERSION_IN_PACKAGE_JSON}"
|
||||
if [[ ${{ inputs.branch_name }} =~ ^master(-patch.*)?$ ]]; then
|
||||
# Pre-release versions
|
||||
if [[ $VERSION_IN_PACKAGE_JSON =~ ^[0-9]*\.[0-9]*\.[0-9]*-A\.[0-9]*$ ]];
|
||||
then
|
||||
TAG_NPM=next
|
||||
# Stable major versions
|
||||
else
|
||||
TAG_NPM=latest
|
||||
fi
|
||||
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
||||
TAG_NPM="branch"
|
||||
else
|
||||
TAG_NPM="alpha"
|
||||
VERSION_IN_PACKAGE_JSON=$(node -p "require('./package.json')".version)
|
||||
echo "version in package.json=${VERSION_IN_PACKAGE_JSON}"
|
||||
if [[ $BRANCH_NAME =~ ^master(-patch.*)?$ ]]; then
|
||||
# Pre-release versions
|
||||
if [[ $VERSION_IN_PACKAGE_JSON =~ ^[0-9]*\.[0-9]*\.[0-9]*-A\.[0-9]*$ ]]; then
|
||||
TAG_NPM=next
|
||||
# Stable major versions
|
||||
else
|
||||
TAG_NPM=latest
|
||||
fi
|
||||
fi
|
||||
if [[ $BRANCH_NAME =~ ^develop(-patch.*)?$ ]]; then
|
||||
TAG_NPM=alpha
|
||||
fi
|
||||
fi
|
||||
if [[ ${{ inputs.branch_name }} =~ ^develop(-patch.*)?$ ]]; then
|
||||
TAG_NPM=alpha
|
||||
fi
|
||||
echo "TAG_NPM=${TAG_NPM}" >> $GITHUB_ENV
|
||||
echo "npm-tag=$TAG_NPM" >> $GITHUB_OUTPUT
|
||||
echo "Computed tag: $TAG_NPM"
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
name: 'Setup'
|
||||
description: 'Initialize cache, env var load'
|
||||
inputs:
|
||||
enable-cache:
|
||||
description: 'enable caching'
|
||||
cache-suffix:
|
||||
description: 'Suffix to make Nx cache key unique per job (e.g. matrix project name)'
|
||||
required: false
|
||||
type: boolean
|
||||
default: 'true'
|
||||
enable-node-modules-cache:
|
||||
description: 'enable caching for node modules'
|
||||
default: 'default'
|
||||
full-setup:
|
||||
description: 'Run git-latest-tag, npm-tag, and before-install (requires fetch-depth: 0). Set to false for matrix jobs that only need node/cache.'
|
||||
required: false
|
||||
type: boolean
|
||||
default: 'true'
|
||||
@@ -16,43 +15,48 @@ inputs:
|
||||
required: false
|
||||
type: boolean
|
||||
default: 'false'
|
||||
outputs:
|
||||
npm-tag:
|
||||
description: 'NPM tag'
|
||||
value: ${{ steps.set-npm-tag.outputs.npm-tag }}
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: install NPM
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
- name: Set consistent machine ID for Nx cache
|
||||
shell: bash
|
||||
run: echo "nx-github-actions" | sudo tee /etc/machine-id > /dev/null
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
cache-dependency-path: package-lock.json
|
||||
cache: 'npm'
|
||||
- name: get latest tag sha
|
||||
if: ${{ inputs.full-setup == 'true' }}
|
||||
id: tag-sha
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/git-latest-tag@c2278c8ec6744d3595478217e9736ebb47d501db # v8.23.3
|
||||
# CACHE
|
||||
- name: Node Modules cache
|
||||
id: node-modules-cache
|
||||
if: ${{ inputs.enable-node-modules-cache == 'true' }}
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
env:
|
||||
cache-name: node-modules-cache
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/git-latest-tag@98bcfbe06aafffdc0e9a790f352602316f82303b # v18.23.0
|
||||
- name: load "NPM TAG"
|
||||
if: ${{ inputs.full-setup == 'true' }}
|
||||
id: set-npm-tag
|
||||
uses: ./.github/actions/set-npm-tag
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: npm ci
|
||||
- name: Security audit
|
||||
shell: bash
|
||||
run: npm audit --audit-level=critical || true
|
||||
- name: Restore nx cache
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: |
|
||||
node_modules
|
||||
key: .npm-${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
|
||||
nxcache
|
||||
.nx
|
||||
dist
|
||||
key: ${{ runner.os }}-nxcache-${{ inputs.cache-suffix }}-${{ hashFiles('nx.json') }}-${{ github.sha }}
|
||||
restore-keys: |
|
||||
node_modules-${{ runner.os }}-build-${{ env.cache-name }}-
|
||||
node_modules-${{ runner.os }}-build-
|
||||
node_modules-${{ runner.os }}-
|
||||
- name: pip cache
|
||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||
if: ${{ inputs.enable-cache == 'true' }}
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-
|
||||
restore-keys: |
|
||||
${{ runner.os }}
|
||||
- name: load "NPM TAG"
|
||||
uses: ./.github/actions/set-npm-tag
|
||||
${{ runner.os }}-nxcache-${{ inputs.cache-suffix }}-${{ hashFiles('nx.json') }}-
|
||||
${{ runner.os }}-nxcache-${{ inputs.cache-suffix }}-
|
||||
- name: before install script
|
||||
if: ${{ inputs.full-setup == 'true' }}
|
||||
uses: ./.github/actions/before-install
|
||||
with:
|
||||
act: ${{ inputs.act }}
|
||||
|
||||
@@ -4,16 +4,22 @@ description: "Upload build artifacts"
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: tar and upload artifacts
|
||||
shell: bash
|
||||
env:
|
||||
REMOTE_PATH: "alfresco-ng2-components/build-cache/${{ github.run_id }}"
|
||||
run: |
|
||||
packages=( dist nxcache node_modules )
|
||||
for i in "${packages[@]}"; do
|
||||
time tar czf $i.tar.gz $i
|
||||
du -h $i.tar.gz
|
||||
time aws s3 cp --no-progress $i.tar.gz "s3://${S3_BUILD_BUCKET_SHORT_NAME}/${REMOTE_PATH}/$i.tar.gz"
|
||||
done
|
||||
- name: Save dist to cache
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: dist
|
||||
key: dist-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
|
||||
- name: Save nxcache to cache
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: nxcache
|
||||
key: nxcache-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
|
||||
- name: Save node_modules to cache
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: node_modules
|
||||
key: node-modules-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
# Override language selection by uncommenting this and choosing your languages
|
||||
with:
|
||||
languages: javascript
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -53,4 +53,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
name: "git-tag"
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
dry-run-flag:
|
||||
description: 'enable dry-run on artifact push'
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- master-patch-*
|
||||
env:
|
||||
BASE_REF: ${{ github.base_ref }}
|
||||
HEAD_REF: ${{ github.head_ref }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
GITHUB_BRANCH: ${{ github.ref_name }}
|
||||
GH_BUILD_DIR: ${{ github.workspace }}
|
||||
GH_COMMIT: ${{ github.sha }}
|
||||
BUILD_ID: ${{ github.run_id }}
|
||||
GH_RUN_NUMBER: ${{ github.run_attempt }}
|
||||
GH_BUILD_NUMBER: ${{ github.run_id }}
|
||||
JOB_ID: ${{ github.run_id }}
|
||||
LOG_LEVEL: "ERROR"
|
||||
S3_BUILD_BUCKET_SHORT_NAME: ${{ secrets.S3_BUILD_BUCKET_SHORT_NAME }}
|
||||
NODE_OPTIONS: "--max-old-space-size=5120"
|
||||
DOCKER_REPOSITORY_DOMAIN: ${{ secrets.DOCKER_REPOSITORY_DOMAIN }}
|
||||
DOCKER_REPOSITORY_USER: ${{ secrets.DOCKER_REPOSITORY_USER }}
|
||||
DOCKER_REPOSITORY_PASSWORD: ${{ secrets.DOCKER_REPOSITORY_PASSWORD }}
|
||||
DOCKER_REPOSITORY_STORYBOOK: "${{ secrets.DOCKER_REPOSITORY_DOMAIN }}/alfresco/storybook"
|
||||
NPM_REGISTRY_ADDRESS: ${{ secrets.NPM_REGISTRY_ADDRESS }}
|
||||
NPM_REGISTRY_TOKEN: ${{ secrets.NPM_REGISTRY_TOKEN }}
|
||||
BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
|
||||
REPO_OWNER: "Alfresco"
|
||||
REPO_NAME: "alfresco-ng2-components"
|
||||
STORYBOOK_DIR: "./dist/storybook/stories"
|
||||
BUILT_LIBS_DIR: "./dist/libs"
|
||||
NODE_MODULES_DIR: "./node_modules"
|
||||
REDIRECT_URI: /
|
||||
|
||||
jobs:
|
||||
|
||||
release:
|
||||
uses: ./.github/workflows/release.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
dry-run-flag: false
|
||||
|
||||
setup:
|
||||
needs: release
|
||||
timeout-minutes: 20
|
||||
name: "Release tag"
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GITHUB_TOKEN: $BOT_GITHUB_TOKEN
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- id: set-dryrun
|
||||
uses: ./.github/actions/enable-dryrun
|
||||
with:
|
||||
dry-run-flag: ${{ inputs.dry-run-flag }}
|
||||
- name: install NPM
|
||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
- name: "Release tag"
|
||||
run: |
|
||||
git fetch --all --quiet
|
||||
BRANCH=${GITHUB_REF##*/} ./scripts/github/release/git-tag.sh ${{ steps.set-dryrun.outputs.dryrun }}
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: Pull translations from Crowdin
|
||||
uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1
|
||||
uses: crowdin/github-action@9fd07c1c5b36b15f082d1d860dc399f16f849bd7 # v2.9.0
|
||||
with:
|
||||
upload_sources: false
|
||||
download_translations: true
|
||||
|
||||
@@ -84,10 +84,10 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Get branch name
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-branch-name@c2278c8ec6744d3595478217e9736ebb47d501db # v8.23.3
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-branch-name@691c1d16c90c88a92d2438a001acdefc0efa7d2a # v8.26.0
|
||||
|
||||
- name: Save commit message
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-commit-message@c2278c8ec6744d3595478217e9736ebb47d501db # v8.23.3
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-commit-message@691c1d16c90c88a92d2438a001acdefc0efa7d2a # v8.26.0
|
||||
|
||||
- name: ci:force flag parser
|
||||
shell: bash
|
||||
|
||||
@@ -9,6 +9,11 @@ on:
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
npm-tag:
|
||||
description: 'NPM tag to use for publishing'
|
||||
required: false
|
||||
type: string
|
||||
default: 'branch'
|
||||
|
||||
env:
|
||||
BASE_REF: ${{ github.base_ref }}
|
||||
@@ -46,7 +51,7 @@ jobs:
|
||||
- name: set TAG_NPM BRANCH
|
||||
shell: bash
|
||||
run: |
|
||||
TAG_NPM="branch"
|
||||
TAG_NPM=${{ inputs.npm-tag }}
|
||||
echo "Set TAG with name: ${TAG_NPM}"
|
||||
echo "TAG_NPM=${TAG_NPM}" >> $GITHUB_ENV
|
||||
- name: Checkout repository
|
||||
@@ -86,6 +91,7 @@ jobs:
|
||||
dry-run-flag: ${{ inputs.dry-run-flag }}
|
||||
- uses: ./.github/actions/download-node-modules-and-artifacts
|
||||
- name: Set libraries versions
|
||||
if: ${{ inputs.npm-tag == 'branch' }}
|
||||
run: |
|
||||
set -u;
|
||||
./scripts/update-version.sh -gnu || exit 1;
|
||||
+29
-203
@@ -1,237 +1,63 @@
|
||||
name: "release"
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
dry-run-flag:
|
||||
dry-run:
|
||||
description: 'enable dry-run on artifact push'
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
pull_request:
|
||||
types: [closed]
|
||||
branches:
|
||||
- develop
|
||||
- master
|
||||
- develop-patch*
|
||||
- master-patch*
|
||||
default: false
|
||||
|
||||
permissions:
|
||||
id-token: write # Required for OIDC
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: false
|
||||
|
||||
env:
|
||||
BASE_REF: ${{ github.base_ref }}
|
||||
HEAD_REF: ${{ github.head_ref }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
GITHUB_BRANCH: ${{ github.ref_name }}
|
||||
GH_BUILD_DIR: ${{ github.workspace }}
|
||||
GH_COMMIT: ${{ github.sha }}
|
||||
BUILD_ID: ${{ github.run_id }}
|
||||
GH_RUN_NUMBER: ${{ github.run_attempt }}
|
||||
GH_BUILD_NUMBER: ${{ github.run_id }}
|
||||
JOB_ID: ${{ github.run_id }}
|
||||
E2E_ADMIN_EMAIL_IDENTITY: ${{ secrets.E2E_ADMIN_EMAIL_IDENTITY }}
|
||||
E2E_ADMIN_PASSWORD_IDENTITY: ${{ secrets.E2E_ADMIN_PASSWORD_IDENTITY }}
|
||||
LOG_LEVEL: "ERROR"
|
||||
S3_BUILD_BUCKET_SHORT_NAME: ${{ secrets.S3_BUILD_BUCKET_SHORT_NAME }}
|
||||
NODE_OPTIONS: "--max-old-space-size=5120"
|
||||
DOCKER_REPOSITORY_DOMAIN: ${{ secrets.DOCKER_REPOSITORY_DOMAIN }}
|
||||
DOCKER_REPOSITORY_USER: ${{ secrets.DOCKER_REPOSITORY_USER }}
|
||||
DOCKER_REPOSITORY_PASSWORD: ${{ secrets.DOCKER_REPOSITORY_PASSWORD }}
|
||||
DOCKER_REPOSITORY_STORYBOOK: "${{ secrets.DOCKER_REPOSITORY_DOMAIN }}/alfresco/storybook"
|
||||
GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
|
||||
REPO_OWNER: "Alfresco"
|
||||
REPO_NAME: "alfresco-ng2-components"
|
||||
STORYBOOK_DIR: "./dist/storybook/stories"
|
||||
BUILT_LIBS_DIR: "./dist/libs"
|
||||
NODE_MODULES_DIR: "./node_modules"
|
||||
REDIRECT_URI: /
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
timeout-minutes: 20
|
||||
if: github.event.pull_request.merged == true || github.ref_name == 'master' || github.ref_name == 'master-patch-*'
|
||||
name: "Setup"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: ./.github/actions/setup
|
||||
with:
|
||||
enable-cache: false
|
||||
enable-node-modules-cache: false
|
||||
- name: install
|
||||
run: |
|
||||
npm ci
|
||||
npx nx run js-api:bundle
|
||||
npx nx run cli:bundle
|
||||
- uses: ./.github/actions/upload-node-modules-and-artifacts
|
||||
|
||||
release-storybook:
|
||||
needs: [setup]
|
||||
timeout-minutes: 15
|
||||
if: github.event.pull_request.merged == true || github.ref_name == 'master' || github.ref_name == 'master-patch-*'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- run: git fetch --all
|
||||
- id: set-dryrun
|
||||
uses: ./.github/actions/enable-dryrun
|
||||
with:
|
||||
dry-run-flag: ${{ inputs.dry-run-flag }}
|
||||
- uses: ./.github/actions/setup
|
||||
with:
|
||||
enable-cache: false
|
||||
enable-node-modules-cache: false
|
||||
act: ${{ inputs.dry-run-flag }}
|
||||
- uses: ./.github/actions/download-node-modules-and-artifacts
|
||||
- name: release Storybook docker
|
||||
run: |
|
||||
npx nx run stories:build-storybook --configuration ci
|
||||
. ./scripts/github/release/docker-tag.sh
|
||||
./scripts/github/release/release-storybook-docker.sh ${{ steps.set-dryrun.outputs.dryrun }}
|
||||
|
||||
release-npm:
|
||||
needs: [setup]
|
||||
outputs:
|
||||
release_version: ${{ steps.set-version.outputs.release_version }}
|
||||
timeout-minutes: 30
|
||||
if: github.event.pull_request.merged == true || github.ref_name == 'master' || github.ref_name == 'master-patch-*'
|
||||
timeout-minutes: 45
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
id-token: write # Required for OIDC
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: ./.github/actions/setup
|
||||
with:
|
||||
enable-cache: false
|
||||
enable-node-modules-cache: false
|
||||
- id: set-dryrun
|
||||
uses: ./.github/actions/enable-dryrun
|
||||
with:
|
||||
dry-run-flag: ${{ inputs.dry-run-flag }}
|
||||
- uses: ./.github/actions/download-node-modules-and-artifacts
|
||||
- name: Set libraries versions
|
||||
id: set-version
|
||||
run: |
|
||||
set -u;
|
||||
./scripts/github/build/bumpversion.sh
|
||||
- name: Set migrations
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
with:
|
||||
script: |
|
||||
const setMigrations = require('./scripts/github/release/set-migrations.js');
|
||||
setMigrations();
|
||||
- name: build libraries
|
||||
run: |
|
||||
npx nx run-many -t build --prod --skip-nx-cache
|
||||
npx nx run-many -t build-schematics
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
name: release libraries GH registry
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
registry-url: 'https://npm.pkg.github.com'
|
||||
scope: '@alfresco'
|
||||
- run: npx nx run-many -t npm-publish --tag=$TAG_NPM || exit 1
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.PAT_WRITE_PKG }}
|
||||
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||
cache: 'npm'
|
||||
|
||||
- name: install
|
||||
run: npm ci
|
||||
|
||||
- name: build libraries
|
||||
run: |
|
||||
npm run build:libs
|
||||
npm run build:schematics
|
||||
|
||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
name: release libraries Npm registry
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
registry-url: 'https://${{ vars.NPM_REGISTRY_ADDRESS }}'
|
||||
scope: '@alfresco'
|
||||
- run: npx nx run-many -t npm-publish --tag=$TAG_NPM || exit 1
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_REGISTRY_TOKEN }}
|
||||
|
||||
create-git-tag:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [setup, release-npm]
|
||||
name: Create github tag
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- uses: './.github/actions/create-git-tag'
|
||||
with:
|
||||
tagName: ${{ needs.release-npm.outputs.release_version }}
|
||||
- name: upgrade npm
|
||||
run: |
|
||||
npm install -g npm@11
|
||||
npm --version
|
||||
|
||||
propagate:
|
||||
needs: [release-npm]
|
||||
if: ${{ contains(toJson(github.event.pull_request.labels.*.name), 'hxp-upstream') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: HxP upstream invoke
|
||||
uses: the-actions-org/workflow-dispatch@3133c5d135c7dbe4be4f9793872b6ef331b53bc7 # v4.0.0
|
||||
with:
|
||||
repo: Alfresco/hxp-frontend-apps
|
||||
ref: develop
|
||||
workflow: upstream-adf.yml
|
||||
token: ${{ secrets.ALFRESCO_BUILD_GH_TOKEN }}
|
||||
wait-for-completion: false
|
||||
inputs: >
|
||||
{
|
||||
"tag_version": "alpha"
|
||||
}
|
||||
|
||||
npm-check-bundle:
|
||||
needs: [release-npm]
|
||||
timeout-minutes: 15
|
||||
if: github.event.pull_request.merged == true || github.ref_name == 'master' || github.ref_name == 'master-patch-*'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: ./.github/actions/npm-check-bundle
|
||||
|
||||
push-translation-keys-to-crowdin:
|
||||
name: Push translations keys to Crowdin
|
||||
if: ${{ github.ref == 'refs/heads/develop' }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: [setup]
|
||||
permissions:
|
||||
contents: read
|
||||
packages: read
|
||||
actions: read
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Push Source Files to Crowdin
|
||||
uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1
|
||||
with:
|
||||
upload_sources: true
|
||||
upload_sources_args: --delete-obsolete
|
||||
env:
|
||||
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TRANSLATIONS_TOKEN }}
|
||||
|
||||
finalize:
|
||||
if: always()
|
||||
runs-on: ubuntu-latest
|
||||
name: Final Results
|
||||
needs: [release-storybook, release-npm, npm-check-bundle]
|
||||
steps:
|
||||
- name: Check job execution status
|
||||
if: >-
|
||||
${{
|
||||
contains(needs.*.result, 'failure')
|
||||
|| contains(needs.*.result, 'cancelled')
|
||||
}}
|
||||
run: exit 1
|
||||
- run: npx nx run-many -t npm-publish --tag=branch ${{ inputs.dry-run && '--dry-run' || '' }}
|
||||
|
||||
@@ -15,7 +15,8 @@ Displays comments from users involved in a specified content and allows an invol
|
||||
```html
|
||||
<adf-node-comments
|
||||
[nodeId]="YOUR_NODE_ID"
|
||||
[readOnly]="YOUR_READ_ONLY_FLAG">
|
||||
[readOnly]="YOUR_READ_ONLY_FLAG"
|
||||
(commentAdded)="onCommentAdded($event)">
|
||||
</adf-node-comments>
|
||||
```
|
||||
|
||||
@@ -23,7 +24,13 @@ Displays comments from users involved in a specified content and allows an invol
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| nodeId | `string` | | nodeId of the document that has comments |
|
||||
| readOnly | `boolean` | | make the [comments component](../../core/components/comments.component.md) readOnly |
|
||||
| Name | Type | Default value | Description |
|
||||
| -------- | --------- | ------------- | ----------------------------------------------------------------------------------- |
|
||||
| nodeId | `string` | | nodeId of the document that has comments |
|
||||
| readOnly | `boolean` | | make the [comments component](../../core/components/comments.component.md) readOnly |
|
||||
|
||||
### Events
|
||||
|
||||
| Name | Type | Description |
|
||||
| ------------ | ------------------------------------------------------------------------ | ------------------------------------------------- |
|
||||
| commentAdded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)<CommentModel> | Emitted when a new comment is successfully added. |
|
||||
|
||||
@@ -15,7 +15,8 @@ Displays comments from users involved in a specified environment and allows an i
|
||||
```html
|
||||
<adf-comments
|
||||
[id]="YOUR_ID"
|
||||
[readOnly]="YOUR_READ_ONLY_FLAG">
|
||||
[readOnly]="YOUR_READ_ONLY_FLAG"
|
||||
(commentAdded)="onCommentAdded($event)">
|
||||
</adf-comments>
|
||||
```
|
||||
|
||||
@@ -23,13 +24,14 @@ Displays comments from users involved in a specified environment and allows an i
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| id | `string` | | The numeric ID of the task. |
|
||||
| readOnly | `boolean` | false | Are the comments read only? |
|
||||
| Name | Type | Default value | Description |
|
||||
| -------- | --------- | ------------- | --------------------------- |
|
||||
| id | `string` | | The numeric ID of the task. |
|
||||
| readOnly | `boolean` | false | Are the comments read only? |
|
||||
|
||||
### Events
|
||||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when an error occurs while displaying/adding a comment. |
|
||||
| Name | Type | Description |
|
||||
| ------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------- |
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when an error occurs while displaying/adding a comment. |
|
||||
| commentAdded | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<CommentModel>` | Emitted when a new comment is successfully added. |
|
||||
|
||||
@@ -55,3 +55,6 @@ The pages linked below contain the licenses for all third party dependencies of
|
||||
- [ADF 7.0.0-alpha.6](license-info-7.0.0-alpha.6.md)
|
||||
- [ADF 7.0.0-alpha.7](license-info-7.0.0-alpha.7.md)
|
||||
- [ADF 7.0.0](license-info-7.0.0.md)
|
||||
- [ADF 8.0.0](license-info-8.0.0.md)
|
||||
- [ADF 8.0.1](license-info-8.0.1.md)
|
||||
- [ADF 8.0.2](license-info-8.0.2.md)
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
Title: License info, alfresco-ng2-components 8.0.0
|
||||
---
|
||||
|
||||
# License information for alfresco-ng2-components 8.0.0
|
||||
|
||||
This page lists all third party libraries the project depends on.
|
||||
|
||||
## Libraries
|
||||
|
||||
| Name | Version | License |
|
||||
| --- | --- | --- |
|
||||
| [@angular/animations](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/cdk](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/common](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/compiler](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/core](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/forms](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material-date-fns-adapter](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/router](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@apollo/client](https://github.com/apollographql/apollo-client) | 3.13.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@cspell/eslint-plugin](https://github.com/streetsidesoftware/cspell) | 8.16.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@mat-datetimepicker/core](https://github.com/kuhnroyal/mat-datetimepicker) | 15.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| @ngx-translate/core | 16.0.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@nx/webpack](https://github.com/nrwl/nx) | 20.8.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc-jwks](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [apollo-angular](https://github.com/kamilkisiela/apollo-angular) | 10.0.3 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [chart.js](https://github.com/chartjs/Chart.js) | 4.4.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [cropperjs](https://github.com/fengyuanchen/cropperjs) | 1.6.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [date-fns](https://github.com/date-fns/date-fns) | 2.30.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [dotenv-expand](https://github.com/motdotla/dotenv-expand) | 11.0.7 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| dotenv-expand | 5.1.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| [event-emitter](https://github.com/medikoo/event-emitter) | 0.3.5 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [graphql-ws](https://github.com/enisdenjo/graphql-ws) | 6.0.5 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [material-icons](https://github.com/marella/material-icons) | 1.13.14 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [minimatch-browser](https://github.com/isaacs/minimatch) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [ng2-charts](https://github.com/valor-software/ng2-charts) | 4.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [node-fetch](https://github.com/node-fetch/node-fetch) | 3.3.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [pdfjs-dist](https://github.com/mozilla/pdf.js) | 5.1.91 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [raphael](https://github.com/DmitryBaranovskiy/raphael) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [rxjs](https://github.com/reactivex/rxjs) | 7.8.2 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [superagent](https://github.com/ladjs/superagent) | 9.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [ts-morph](https://github.com/dsherret/ts-morph) | 26.0.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [tslib](https://github.com/Microsoft/tslib) | 2.8.1 | [0BSD](http://landley.net/toybox/license.html) |
|
||||
| [zone.js](https://github.com/angular/angular) | 0.15.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
Title: License info, alfresco-ng2-components 8.0.1
|
||||
---
|
||||
|
||||
# License information for alfresco-ng2-components 8.0.1
|
||||
|
||||
This page lists all third party libraries the project depends on.
|
||||
|
||||
## Libraries
|
||||
|
||||
| Name | Version | License |
|
||||
| --- | --- | --- |
|
||||
| [@angular/animations](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/cdk](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/common](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/compiler](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/core](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/forms](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material-date-fns-adapter](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/router](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@apollo/client](https://github.com/apollographql/apollo-client) | 3.13.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@cspell/eslint-plugin](https://github.com/streetsidesoftware/cspell) | 8.16.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@mat-datetimepicker/core](https://github.com/kuhnroyal/mat-datetimepicker) | 15.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| @ngx-translate/core | 16.0.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@nx/webpack](https://github.com/nrwl/nx) | 20.8.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc-jwks](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [apollo-angular](https://github.com/kamilkisiela/apollo-angular) | 10.0.3 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [chart.js](https://github.com/chartjs/Chart.js) | 4.4.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [cropperjs](https://github.com/fengyuanchen/cropperjs) | 1.6.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [date-fns](https://github.com/date-fns/date-fns) | 2.30.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [dotenv-expand](https://github.com/motdotla/dotenv-expand) | 11.0.7 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| dotenv-expand | 5.1.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| [event-emitter](https://github.com/medikoo/event-emitter) | 0.3.5 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [material-icons](https://github.com/marella/material-icons) | 1.13.14 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [minimatch-browser](https://github.com/isaacs/minimatch) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [ng2-charts](https://github.com/valor-software/ng2-charts) | 4.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [node-fetch](https://github.com/node-fetch/node-fetch) | 3.3.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [pdfjs-dist](https://github.com/mozilla/pdf.js) | 5.1.91 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [raphael](https://github.com/DmitryBaranovskiy/raphael) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [rxjs](https://github.com/reactivex/rxjs) | 7.8.2 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [superagent](https://github.com/ladjs/superagent) | 9.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [ts-morph](https://github.com/dsherret/ts-morph) | 26.0.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [tslib](https://github.com/Microsoft/tslib) | 2.8.1 | [0BSD](http://landley.net/toybox/license.html) |
|
||||
| [zone.js](https://github.com/angular/angular) | 0.15.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
Title: License info, alfresco-ng2-components 8.0.2
|
||||
---
|
||||
|
||||
# License information for alfresco-ng2-components 8.0.2
|
||||
|
||||
This page lists all third party libraries the project depends on.
|
||||
|
||||
## Libraries
|
||||
|
||||
| Name | Version | License |
|
||||
| --- | --- | --- |
|
||||
| [@angular/animations](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/cdk](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/common](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/compiler](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/core](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/forms](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material-date-fns-adapter](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/material](https://github.com/angular/components) | 19.2.9 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/platform-browser](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@angular/router](https://github.com/angular/angular) | 19.2.6 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@apollo/client](https://github.com/apollographql/apollo-client) | 3.13.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@cspell/eslint-plugin](https://github.com/streetsidesoftware/cspell) | 8.16.1 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@mat-datetimepicker/core](https://github.com/kuhnroyal/mat-datetimepicker) | 15.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| @ngx-translate/core | 16.0.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [@nx/webpack](https://github.com/nrwl/nx) | 20.8.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc-jwks](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [angular-oauth2-oidc](https://github.com/manfredsteyer/angular-oauth2-oidc) | 17.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [apollo-angular](https://github.com/kamilkisiela/apollo-angular) | 10.0.3 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [chart.js](https://github.com/chartjs/Chart.js) | 4.4.4 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [cropperjs](https://github.com/fengyuanchen/cropperjs) | 1.6.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [date-fns](https://github.com/date-fns/date-fns) | 2.30.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [dotenv-expand](https://github.com/motdotla/dotenv-expand) | 11.0.7 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| dotenv-expand | 5.1.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) |
|
||||
| [event-emitter](https://github.com/medikoo/event-emitter) | 0.3.5 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [graphql-ws](https://github.com/enisdenjo/graphql-ws) | 6.0.5 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [material-icons](https://github.com/marella/material-icons) | 1.13.14 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [minimatch-browser](https://github.com/isaacs/minimatch) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [ng2-charts](https://github.com/valor-software/ng2-charts) | 4.1.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) |
|
||||
| [node-fetch](https://github.com/node-fetch/node-fetch) | 3.3.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [pdfjs-dist](https://github.com/mozilla/pdf.js) | 5.1.91 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [raphael](https://github.com/DmitryBaranovskiy/raphael) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [rxjs](https://github.com/reactivex/rxjs) | 7.8.2 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) |
|
||||
| [superagent](https://github.com/ladjs/superagent) | 9.0.2 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [ts-morph](https://github.com/dsherret/ts-morph) | 26.0.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
| [tslib](https://github.com/Microsoft/tslib) | 2.8.1 | [0BSD](http://landley.net/toybox/license.html) |
|
||||
| [zone.js](https://github.com/angular/angular) | 0.15.0 | [MIT](http://www.opensource.org/licenses/MIT) |
|
||||
|
||||
@@ -85,13 +85,11 @@ The template defined inside `empty-form` will be shown when no form definition i
|
||||
| fieldValidators | [`FormFieldValidator`](../../../lib/core/src/lib/form/components/widgets/core/form-field-validator.ts)`[]` | | [FormFieldValidator](../../../lib/core/src/lib/form/components/widgets/core/form-field-validator.ts) allow to override the form field validators provided. |
|
||||
| form | [`FormModel`](../../../lib/core/src/lib/form/components/widgets/core/form.model.ts) | | Underlying form model instance. |
|
||||
| formId | `string` | | Task id to fetch corresponding form and values. |
|
||||
| isNextTaskCheckboxChecked | `boolean` | false | Whether the `Open next task` checkbox is checked by default or not. |
|
||||
| nameNode | `string` | | Name to assign to the new node where the metadata are stored. |
|
||||
| path | `string` | | Path of the folder where the metadata will be stored. |
|
||||
| processInstanceId | `string` | | ProcessInstanceId id to fetch corresponding form and values. |
|
||||
| readOnly | `boolean` | false | Toggle readonly state of the form. Forces all form widgets to render as readonly if enabled. |
|
||||
| showCompleteButton | `boolean` | true | Toggle rendering of the `Complete` outcome button. |
|
||||
| showNextTaskCheckbox | `boolean` | false | Toggle rendering of the `Open next task` checkbox. |
|
||||
| showRefreshButton | `boolean` | true | Toggle rendering of the `Refresh` button. |
|
||||
| showSaveButton | `boolean` | true | Toggle rendering of the `Save` outcome button. |
|
||||
| showTitle | `boolean` | true | Toggle rendering of the form title. |
|
||||
|
||||
@@ -37,11 +37,9 @@ Starts a process.
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| appName | `string` | "" | (required) Name of the app. |
|
||||
| isNextTaskCheckboxChecked | `boolean` | false | Whether the `Open next task` checkbox is checked by default or not. |
|
||||
| maxNameLength | `number` | MAX_NAME_LENGTH | Maximum length of the process name. |
|
||||
| name | `string` | "" | Name of the process. |
|
||||
| processDefinitionName | `string` | | Name of the process definition. |
|
||||
| showNextTaskCheckbox | `boolean` | false | Toggle rendering of the `Open next task` checkbox. |
|
||||
| showSelectProcessDropdown | `boolean` | true | Show/hide the process dropdown list. |
|
||||
| showTitle | `boolean` | true | Show/hide title. |
|
||||
| values | [`TaskVariableCloud`](../../../lib/process-services-cloud/src/lib/form/models/task-variable-cloud.model.ts)`[]` | | Parameter to pass form field values in the start form if one is associated. |
|
||||
@@ -54,7 +52,6 @@ Starts a process.
|
||||
| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the starting process is cancelled |
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when an error occurs. |
|
||||
| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../../lib/core/src/lib/form/components/widgets/core/content-link.model.ts)`>` | Emitted when form content is clicked. |
|
||||
| nextTaskCheckboxCheckedChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`MatCheckboxChange`](https://material.angular.io/components/checkbox/api#MatCheckboxChange)`>` | Emitted when the `Open next task` checkbox was toggled. |
|
||||
| processDefinitionSelection | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`>` | Emitted when process definition selection changes. |
|
||||
| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the process is successfully started. |
|
||||
|
||||
|
||||
@@ -36,11 +36,9 @@ Save and Complete buttons get disabled when at least one of the form's inputs ar
|
||||
| Name | Type | Default value | Description |
|
||||
| ------------------------- | ------------------------------------- | ------------- | ------------------------------------------------------------------- |
|
||||
| appName | `string` | "" | App id to fetch corresponding form and values. |
|
||||
| isNextTaskCheckboxChecked | `boolean` | false | Whether the `Open next task` checkbox is checked by default or not. |
|
||||
| readOnly | `boolean` | false | Toggle readonly state of the task. |
|
||||
| showCancelButton | `boolean` | true | Toggle rendering of the `Cancel` button. |
|
||||
| showCompleteButton | `boolean` | true | Toggle rendering of the `Complete` button. |
|
||||
| showNextTaskCheckbox | `boolean` | false | Toggle rendering of the `Open next task` checkbox. |
|
||||
| showRefreshButton | `boolean` | false | Toggle rendering of the `Refresh` button. |
|
||||
| showTitle | `boolean` | true | Toggle rendering of the form title. |
|
||||
| showValidationIcon | `boolean` | true | Toggle rendering of the `Validation` icon. |
|
||||
@@ -57,7 +55,6 @@ Save and Complete buttons get disabled when at least one of the form's inputs ar
|
||||
| formCompleted | `EventEmitter<FormModel>` | Emitted when the form is submitted with the `Complete` outcome. |
|
||||
| formContentClicked | `EventEmitter<ContentLinkModel>` | Emitted when form content is clicked. |
|
||||
| formSaved | `EventEmitter<FormModel>` | Emitted when the form is saved. |
|
||||
| nextTaskCheckboxCheckedChanged | `EventEmitter<MatCheckboxChange>` | Emitted when the `Open next task` checkbox was toggled. |
|
||||
| onTaskLoaded | `EventEmitter<TaskDetailsCloudModel>` | Emitted when a task is loaded. |
|
||||
| taskClaimed | `EventEmitter<string>` | Emitted when the task is claimed. |
|
||||
| taskCompleted | `EventEmitter<string>` | Emitted when the task is completed. |
|
||||
|
||||
@@ -9,6 +9,9 @@ The first **General Availability** release was v2.0.0.
|
||||
|
||||
## General Availability
|
||||
|
||||
- [8.0.2](RelNote-8.0.2.md)
|
||||
- [8.0.1](RelNote-8.0.1.md)
|
||||
- [8.0.0](RelNote-8.0.0.md)
|
||||
- [7.0.0](RelNote-7.0.0.md)
|
||||
- [7.0.0-alpha.7](RelNote-7.0.0-alpha.7.md)
|
||||
- [7.0.0-alpha.6](RelNote-7.0.0-alpha.6.md)
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
---
|
||||
Title: Changelog for alfresco-ng2-components v8.0.0
|
||||
---
|
||||
|
||||
# Changelog
|
||||
|
||||
- [7aa07ef525](https://github.com/Alfresco/alfresco-ng2-components/commit/7aa07ef525) AAE-36614 new provideShell api (#11006)
|
||||
- [2ebee4c024](https://github.com/Alfresco/alfresco-ng2-components/commit/2ebee4c024) AAE-36615 new provideI18N api (#11007)
|
||||
- [b563e283c1](https://github.com/Alfresco/alfresco-ng2-components/commit/b563e283c1) [ACS-9789] Multiple styles issues for metadata sidebar (#11015)
|
||||
- [f1bdbf63b0](https://github.com/Alfresco/alfresco-ng2-components/commit/f1bdbf63b0) AAE-36368 Fixing labels and form-fields on content-ee and apa (#10982)
|
||||
- [0651dc25d5](https://github.com/Alfresco/alfresco-ng2-components/commit/0651dc25d5) [ACS-9790] Fix Tags and Categories content is missing during editing other panel (#11004)
|
||||
- [ec145fb73c](https://github.com/Alfresco/alfresco-ng2-components/commit/ec145fb73c) [ADF-5583] Update style to make version visible outside dialog (#11005)
|
||||
- [450a4a0a49](https://github.com/Alfresco/alfresco-ng2-components/commit/450a4a0a49) [ACS-9789] Multiple styles issues for metadata sidebar (#11002)
|
||||
- [11cb2ea688](https://github.com/Alfresco/alfresco-ng2-components/commit/11cb2ea688) AAE-36484 improved standalone support for Core (#10998)
|
||||
- [6a3623bd76](https://github.com/Alfresco/alfresco-ng2-components/commit/6a3623bd76) AAE-35676 Cleanup Open Next Task (#10952)
|
||||
- [5438eef9db](https://github.com/Alfresco/alfresco-ng2-components/commit/5438eef9db) AAE-36260 global test setup (#10970)
|
||||
- [e96f5b3c48](https://github.com/Alfresco/alfresco-ng2-components/commit/e96f5b3c48) [AAE-36397] ADF viewer image is no longer cropped (#10996)
|
||||
- [54fd097fab](https://github.com/Alfresco/alfresco-ng2-components/commit/54fd097fab) [ACS-9327] Add prohibited symbols validation for Categories dialog (#10985)
|
||||
- [9bed60befc](https://github.com/Alfresco/alfresco-ng2-components/commit/9bed60befc) AAE-30842 Fix rendering small devices again (#10986)
|
||||
- [c863da0c5d](https://github.com/Alfresco/alfresco-ng2-components/commit/c863da0c5d) [MNT-24459] Aspect list get all aspects when not all were fetched by first call (#10980)
|
||||
- [951b22e098](https://github.com/Alfresco/alfresco-ng2-components/commit/951b22e098) Angular 19 migration (#10795)
|
||||
- [c7f28d54d6](https://github.com/Alfresco/alfresco-ng2-components/commit/c7f28d54d6) [ADF-5581] Reset filterValue when navigating to a new folder to ensur… (#10978)
|
||||
- [d776c7c77d](https://github.com/Alfresco/alfresco-ng2-components/commit/d776c7c77d) AAE-35310 Displaying different text fields on an eform doesn't align vertically or horizontally (#10979)
|
||||
- [6dafcb4447](https://github.com/Alfresco/alfresco-ng2-components/commit/6dafcb4447) [ADF-5580] emit commentAdded event from adf-comments component (#10966)
|
||||
- [5d043e6987](https://github.com/Alfresco/alfresco-ng2-components/commit/5d043e6987) [PRODSEC-10305] Bump @nx/webpack & webpack-dev-server (#10976)
|
||||
- [57713dbe6e](https://github.com/Alfresco/alfresco-ng2-components/commit/57713dbe6e) [MNT-25175] configured scripts to execute are listed by node id and not by script name (#10969)
|
||||
- [8b3b6ffbca](https://github.com/Alfresco/alfresco-ng2-components/commit/8b3b6ffbca) AAE-36173 switch to TranslatePipe (#10968)
|
||||
- [16f42be08e](https://github.com/Alfresco/alfresco-ng2-components/commit/16f42be08e) AAE-35976 Adding auto required instead of manually handling styles manually (#10956)
|
||||
- [dcab68d78a](https://github.com/Alfresco/alfresco-ng2-components/commit/dcab68d78a) AAE-35632 Priority filter unit tests (#10965)
|
||||
- [f40107de33](https://github.com/Alfresco/alfresco-ng2-components/commit/f40107de33) AAE-34482 Modelling inconsistencies in mat form fields label alignments ii (#10929)
|
||||
- [c16417cbff](https://github.com/Alfresco/alfresco-ng2-components/commit/c16417cbff) [ACS-9250] Adjust viewer to display properly under parent without overlay mode (#10950)
|
||||
- [27502d5d67](https://github.com/Alfresco/alfresco-ng2-components/commit/27502d5d67) AAE-34902 Updating styles for input controls to maintain the ui consistency with studio hxp (#10900)
|
||||
- [a4072aca74](https://github.com/Alfresco/alfresco-ng2-components/commit/a4072aca74) AAE-35694 Update section-start-form with Sections in Row (#10947)
|
||||
- [22b62804d5](https://github.com/Alfresco/alfresco-ng2-components/commit/22b62804d5) AAE-35882 Studio modelling forms required dropdown has double asterisk (#10948)
|
||||
- [eda59a1de8](https://github.com/Alfresco/alfresco-ng2-components/commit/eda59a1de8) [ACS-8746] yellow warning color (#10883)
|
||||
- [3009fa6dec](https://github.com/Alfresco/alfresco-ng2-components/commit/3009fa6dec) AAE-35848 Fix dynamic viewer container scaling (#10932)
|
||||
- [8cfc8d32f2](https://github.com/Alfresco/alfresco-ng2-components/commit/8cfc8d32f2) AAE-35855 Security fixes (#10933)
|
||||
- [cdc7553915](https://github.com/Alfresco/alfresco-ng2-components/commit/cdc7553915) [MNT-24923] legal hold hold capabilities are not verified properly (#10930)
|
||||
- [f8a75d4af7](https://github.com/Alfresco/alfresco-ng2-components/commit/f8a75d4af7) Viewer renderer stop loading when subsequent renderer throws error (#10931)
|
||||
- [31c2cb2162](https://github.com/Alfresco/alfresco-ng2-components/commit/31c2cb2162) AAE-35728 Add aria label to viewer loading bars (#10927)
|
||||
- [2c4764f89e](https://github.com/Alfresco/alfresco-ng2-components/commit/2c4764f89e) Adds loading state accessibility (#10926)
|
||||
- [e2693f9304](https://github.com/Alfresco/alfresco-ng2-components/commit/e2693f9304) AAE-35668 Sending empty string instead of null after clearing value from numeric field (#10925)
|
||||
- [5d9acaec0d](https://github.com/Alfresco/alfresco-ng2-components/commit/5d9acaec0d) [AAE-35649] Viewer renderer wait until subsequent renderers will finish (#10924)
|
||||
- [0c147513cc](https://github.com/Alfresco/alfresco-ng2-components/commit/0c147513cc) AAE-35521 Refactor AuthenticationService unit tests (#10922)
|
||||
- [920b7d3585](https://github.com/Alfresco/alfresco-ng2-components/commit/920b7d3585) AAE-34641 Fix ViewerRenderComponent hanging when in a mat-tab (#10913)
|
||||
- [643b5f723a](https://github.com/Alfresco/alfresco-ng2-components/commit/643b5f723a) Revert "AAE-34641 Refactor viewer-render loading (#10868)" (#10912)
|
||||
- [a6ab5fcbdd](https://github.com/Alfresco/alfresco-ng2-components/commit/a6ab5fcbdd) [ACS-9696] fix failing upgrade rxjs from 7.8.1 to 7.8.2 (#10911)
|
||||
- [35970b4278](https://github.com/Alfresco/alfresco-ng2-components/commit/35970b4278) AAE-21284 Add migration guide for Angular 17 to 18 (#10910)
|
||||
- [379fbbb508](https://github.com/Alfresco/alfresco-ng2-components/commit/379fbbb508) [MNT-25043] Skip adding json as content type for FormData body requests (#10903)
|
||||
- [cdb65bf204](https://github.com/Alfresco/alfresco-ng2-components/commit/cdb65bf204) [ACS-9377] remove the join button for records management library for user s without permissions for that library (#10901)
|
||||
- [8cb7a1719f](https://github.com/Alfresco/alfresco-ng2-components/commit/8cb7a1719f) AAE-34656 Hide all counters in Workspace which do not provide value (#10896)
|
||||
- [1971980216](https://github.com/Alfresco/alfresco-ng2-components/commit/1971980216) [ACS-9619] Issues with trimming file's name in viewer (#10858)
|
||||
- [467a19f3ec](https://github.com/Alfresco/alfresco-ng2-components/commit/467a19f3ec) AAE-34959 Fix withCredentials can not be set by app.config.json (#10897)
|
||||
- [d1e48f9c33](https://github.com/Alfresco/alfresco-ng2-components/commit/d1e48f9c33) [ACS-9247] Extend library column context (#10894)
|
||||
- [79163cbae0](https://github.com/Alfresco/alfresco-ng2-components/commit/79163cbae0) AAE-34482 Fixing label and alignment issues in forms (#10898)
|
||||
- [06921783bf](https://github.com/Alfresco/alfresco-ng2-components/commit/06921783bf) AAE-33907 Adds input for 'Open next task' checkbox (#10823)
|
||||
- [1462560e6e](https://github.com/Alfresco/alfresco-ng2-components/commit/1462560e6e) AAE-35057 Change position of adf-cloud-form-content-card-fullscreen to relative (#10888)
|
||||
- [413fce8cb7](https://github.com/Alfresco/alfresco-ng2-components/commit/413fce8cb7) AAE-34641 Refactor viewer-render loading (#10868)
|
||||
- [f2fa458fe5](https://github.com/Alfresco/alfresco-ng2-components/commit/f2fa458fe5) AAE-33909 Ensure onProcessFinish event triggers when invoked from onFormLoaded event (#10867)
|
||||
- [e37ef279e4](https://github.com/Alfresco/alfresco-ng2-components/commit/e37ef279e4) AAE-32986 Add custom-form-widget process to simpleapp (#10881)
|
||||
- [2cc3ba4d6b](https://github.com/Alfresco/alfresco-ng2-components/commit/2cc3ba4d6b) [ACS-7706] create tags return promise tag paging instead of tag entry (#10869)
|
||||
- [3fea334468](https://github.com/Alfresco/alfresco-ng2-components/commit/3fea334468) [AAE-34479] added class for custom outcome button (#10882)
|
||||
- [b3900b96ed](https://github.com/Alfresco/alfresco-ng2-components/commit/b3900b96ed) AAE-34972 Test PR for adf link (#10861)
|
||||
- [2fd960bf5c](https://github.com/Alfresco/alfresco-ng2-components/commit/2fd960bf5c) AAE-34885 Form with tabs has incomplete frame in preview (#10880)
|
||||
- [8b47434c37](https://github.com/Alfresco/alfresco-ng2-components/commit/8b47434c37) AAE-33052 Deprecate custom theme (#10870)
|
||||
- [fe53c5d5a8](https://github.com/Alfresco/alfresco-ng2-components/commit/fe53c5d5a8) MNT-25095 Update the documentation (#10864)
|
||||
- [051b82684f](https://github.com/Alfresco/alfresco-ng2-components/commit/051b82684f) AAE-34959 Allow disabling withCredentials for the identity providers that disallow credentials (#10859)
|
||||
- [b4eee9d631](https://github.com/Alfresco/alfresco-ng2-components/commit/b4eee9d631) AAE-34675 Fix default selection required (#10860)
|
||||
- [3ad13d3e38](https://github.com/Alfresco/alfresco-ng2-components/commit/3ad13d3e38) AAE-34992 Improve crowdin update strategy (#10865)
|
||||
- [efd6e5b1b0](https://github.com/Alfresco/alfresco-ng2-components/commit/efd6e5b1b0) AAE-34826 Incorrect scale for rendered pdf documents (#10857)
|
||||
- [6257510056](https://github.com/Alfresco/alfresco-ng2-components/commit/6257510056) Ng18 migration (#10683)
|
||||
- [28137d8a09](https://github.com/Alfresco/alfresco-ng2-components/commit/28137d8a09) Revert "AAE-34641 Fix form loading when tab is changed (#10843)" (#10862)
|
||||
- [58a5732043](https://github.com/Alfresco/alfresco-ng2-components/commit/58a5732043) AAE-34888 fixing padding issues in form widgets (#10853)
|
||||
- [685bc387b5](https://github.com/Alfresco/alfresco-ng2-components/commit/685bc387b5) AAE-34641 Fix form loading when tab is changed (#10843)
|
||||
- [f0c90594ca](https://github.com/Alfresco/alfresco-ng2-components/commit/f0c90594ca) AAE-34731 Hide the open next task checkbox for the Start Process view (#10842)
|
||||
- [ec47d8eac8](https://github.com/Alfresco/alfresco-ng2-components/commit/ec47d8eac8) AAE-34869 fixing padding issue (#10850)
|
||||
- [f2845a36c6](https://github.com/Alfresco/alfresco-ng2-components/commit/f2845a36c6) [AAE-29434] Adding process with process variables to simpleapp (#10845)
|
||||
- [acf9e3e11c](https://github.com/Alfresco/alfresco-ng2-components/commit/acf9e3e11c) Improvement/aae 30909 enhance user experience with tab navigation within the form (#10844)
|
||||
- [adeb82c137](https://github.com/Alfresco/alfresco-ng2-components/commit/adeb82c137) AAE-34335 fix for styling discrepancies in form-widgets (#10841)
|
||||
- [48defa2b5f](https://github.com/Alfresco/alfresco-ng2-components/commit/48defa2b5f) AAE-34594 Remove redundant scroll bar from form renderer (#10840)
|
||||
- [9ee0e5ee3e](https://github.com/Alfresco/alfresco-ng2-components/commit/9ee0e5ee3e) AAE-19688 Persist feature flag overrides in session storage (#10832)
|
||||
- [0f1200b5a2](https://github.com/Alfresco/alfresco-ng2-components/commit/0f1200b5a2) AAE-34514 Disable next task checkbox for forms (#10824)
|
||||
- [997e82a6b0](https://github.com/Alfresco/alfresco-ng2-components/commit/997e82a6b0) AAE-34543 Remove unused mat-selectors (#10830)
|
||||
- [b1113c51a7](https://github.com/Alfresco/alfresco-ng2-components/commit/b1113c51a7) AAE-34493 Improved internal mat-selectors (#10829)
|
||||
- [dc35ef8a6f](https://github.com/Alfresco/alfresco-ng2-components/commit/dc35ef8a6f) AAE-34478 Hide Open next task checkbox on claim screen (#10822)
|
||||
- [cb220968cf](https://github.com/Alfresco/alfresco-ng2-components/commit/cb220968cf) [AAE-34481] Field error message has preserved space (#10820)
|
||||
- [50ad04aeb3](https://github.com/Alfresco/alfresco-ng2-components/commit/50ad04aeb3) [ACS-9564] Corrected models after change of Knowledge Retrieval answer structure (#10817)
|
||||
- [b1fca8dd4b](https://github.com/Alfresco/alfresco-ng2-components/commit/b1fca8dd4b) fix datetime picker theming (#10821)
|
||||
- [3d598cd0c2](https://github.com/Alfresco/alfresco-ng2-components/commit/3d598cd0c2) AAE-34470 Ignore content type of fetched pdfjs worker (#10818)
|
||||
- [7b67c7cf3a](https://github.com/Alfresco/alfresco-ng2-components/commit/7b67c7cf3a) AAE-34458 Cleanup deprecated styles, bug fixes (#10819)
|
||||
- [f34bbf59be](https://github.com/Alfresco/alfresco-ng2-components/commit/f34bbf59be) AAE-33589 Get task variables when preferences are updated (#10813)
|
||||
- [9575fe633b](https://github.com/Alfresco/alfresco-ng2-components/commit/9575fe633b) AAE-34439 Cleanup Styles (#10815)
|
||||
- [c6652f32b2](https://github.com/Alfresco/alfresco-ng2-components/commit/c6652f32b2) [ACS-959] [E2E] updated e2eapp v2 (#10816)
|
||||
- [d6317a7b87](https://github.com/Alfresco/alfresco-ng2-components/commit/d6317a7b87) [ACS-9227] Fixed interactive controls must not be nested issue in datatable.component.html (#10681)
|
||||
- [d829d8eefb](https://github.com/Alfresco/alfresco-ng2-components/commit/d829d8eefb) AAE-34390 Clean old theming files (#10800)
|
||||
- [4cfda763b6](https://github.com/Alfresco/alfresco-ng2-components/commit/4cfda763b6) Simulate a change to upstream adf (#10814)
|
||||
- [ff0885c265](https://github.com/Alfresco/alfresco-ng2-components/commit/ff0885c265) AAE-34328 Remove additional space in amount widget currency (#10812)
|
||||
- [068bcc89d3](https://github.com/Alfresco/alfresco-ng2-components/commit/068bcc89d3) Create a git tag for every release (#10811)
|
||||
- [69f92bcc61](https://github.com/Alfresco/alfresco-ng2-components/commit/69f92bcc61) [ACS-9565] Updated e2e application (#10810)
|
||||
- [d0b2915c88](https://github.com/Alfresco/alfresco-ng2-components/commit/d0b2915c88) Revert "AAE-29010 GH actions rerun after approval (#10772) (#10774)" (#10809)
|
||||
- [fdd4f6c081](https://github.com/Alfresco/alfresco-ng2-components/commit/fdd4f6c081) AAE-22975 update to the latest version of pdfjs-dist library (#10780)
|
||||
- [0dc45e95af](https://github.com/Alfresco/alfresco-ng2-components/commit/0dc45e95af) [MNT-24715] App with APS does not show display value of dynamic table (#10799)
|
||||
- [1f73f7fe40](https://github.com/Alfresco/alfresco-ng2-components/commit/1f73f7fe40) AAE-33955 Add placeholder for data table widget (preview) (#10796)
|
||||
- [6fb9474d46](https://github.com/Alfresco/alfresco-ng2-components/commit/6fb9474d46) [ACS-9552] Add obsolete task list filters migration (#10798)
|
||||
- [014fb9cfa8](https://github.com/Alfresco/alfresco-ng2-components/commit/014fb9cfa8) AAE-34100 Add group-with-sections process to simpleapp (#10791)
|
||||
- [a426338f94](https://github.com/Alfresco/alfresco-ng2-components/commit/a426338f94) [MNT-24950] Fix process file preview button state (#10790)
|
||||
- [c8f9bd21ea](https://github.com/Alfresco/alfresco-ng2-components/commit/c8f9bd21ea) [ACS-9454] Create upgrade guide for ADF 7.0.0 (#10779)
|
||||
- [baf0e4552e](https://github.com/Alfresco/alfresco-ng2-components/commit/baf0e4552e) AAE-34135 add confirmation (#10783)
|
||||
- [659805ab20](https://github.com/Alfresco/alfresco-ng2-components/commit/659805ab20) AAE-33090 Open Next Task Checkbox (#10757)
|
||||
- [f6c446498a](https://github.com/Alfresco/alfresco-ng2-components/commit/f6c446498a) AAE-29010 GH actions rerun after approval (#10772) (#10774)
|
||||
- [137088d4f6](https://github.com/Alfresco/alfresco-ng2-components/commit/137088d4f6) AAE-33939 Angular migration documentation (#10775)
|
||||
- [8eef4e6eec](https://github.com/Alfresco/alfresco-ng2-components/commit/8eef4e6eec) [ACS-9440] Language in lang attribute is not changed after changing language (#10776)
|
||||
- [82175bad80](https://github.com/Alfresco/alfresco-ng2-components/commit/82175bad80) [ACS-9435] Resolve a11y issues for 'Add use/group' dialog (#10773)
|
||||
- [cd63f67e0a](https://github.com/Alfresco/alfresco-ng2-components/commit/cd63f67e0a) [ACS-5184] Show progress spinner on file navigation (#10596)
|
||||
- [2d21340947](https://github.com/Alfresco/alfresco-ng2-components/commit/2d21340947) [AAE-33096] added rootProcessInstanceId to dynamic component (#10762)
|
||||
- [8e0ea373f0](https://github.com/Alfresco/alfresco-ng2-components/commit/8e0ea373f0) [ACS-9406] Add getContentRenditionTypePreview to process-content service (#10743)
|
||||
- [90f5951cd8](https://github.com/Alfresco/alfresco-ng2-components/commit/90f5951cd8) AAE-33449 HXPMNT-748 Hidden dropdown validation (#10760)
|
||||
- [555e6c027f](https://github.com/Alfresco/alfresco-ng2-components/commit/555e6c027f) AAE-33025 Updated process definition type to support constant values (#10751)
|
||||
- [142c6ae754](https://github.com/Alfresco/alfresco-ng2-components/commit/142c6ae754) AAE-33340 Async Form Enrichment - Spinner doesnt hide on process completion (#10749)
|
||||
- [abaf7df9c6](https://github.com/Alfresco/alfresco-ng2-components/commit/abaf7df9c6) AAE-33007 Display empty data table without error (#10744)
|
||||
- [9bbbc8193d](https://github.com/Alfresco/alfresco-ng2-components/commit/9bbbc8193d) AAE-33137 Asynchronous Form Enrichment does Not Populate Date Fields (#10746)
|
||||
- [eb2f543822](https://github.com/Alfresco/alfresco-ng2-components/commit/eb2f543822) upgrade guide (#10732)
|
||||
- [6703b8b7da](https://github.com/Alfresco/alfresco-ng2-components/commit/6703b8b7da) AAE-32763 Custom column visibility is not persistent after refresh (#10728)
|
||||
- [3475098f32](https://github.com/Alfresco/alfresco-ng2-components/commit/3475098f32) fix undefiend tooltip (#10731)
|
||||
- [083755b41a](https://github.com/Alfresco/alfresco-ng2-components/commit/083755b41a) [ACS-5190] document name text alignement and long name trim issue (#10715)
|
||||
- [015ce8a99e](https://github.com/Alfresco/alfresco-ng2-components/commit/015ce8a99e) [ACS-9375] Transparent background for hovered spinner (#10691)
|
||||
- [b643054a15](https://github.com/Alfresco/alfresco-ng2-components/commit/b643054a15) AAE-32999 Removed subscriptions-transport-ws feature flag (#10727)
|
||||
- [838b3e78b7](https://github.com/Alfresco/alfresco-ng2-components/commit/838b3e78b7) [ACS-9398] Add snackbar notifications for favorite node directive (#10714)
|
||||
- [e8d1328244](https://github.com/Alfresco/alfresco-ng2-components/commit/e8d1328244) Post-release version bump (#10726)
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
Title: Changelog for alfresco-ng2-components v8.0.1
|
||||
---
|
||||
|
||||
# Changelog
|
||||
[4c4dd195a45cdb8cd0218a68972b7a77242359ed](https://github.com/Alfresco/alfresco-ng2-components/commit/4c4dd195a45cdb8cd0218a68972b7a77242359ed)Remove unused webdriver-manager dependency to eliminate vulnerable form-data ~2.3.2 (#11060)
|
||||
[5e6e2b59495662c103b527e4cae5b019f5136f91](https://github.com/Alfresco/alfresco-ng2-components/commit/5e6e2b59495662c103b527e4cae5b019f5136f91) Bumps [form-data](https://github.com/form-data/form-data) from 3.0.1 to 3.0.4.
|
||||
[31bff2806b0db10d260855c61034db7d4b48d6e5](https://github.com/Alfresco/alfresco-ng2-components/commit/31bff2806b0db10d260855c61034db7d4b48d6e5) Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.4.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
Title: Changelog for alfresco-ng2-components v8.0.2
|
||||
---
|
||||
|
||||
# Changelog
|
||||
- [283b996063](git@github.com:Alfresco/alfresco-ng2-components/commit/283b996063) [MNT-25541] PDFs containing JP2 images (JPEG 2000) cannot be displayed in ADW viewer (#11618)
|
||||
@@ -52,3 +52,6 @@ The pages linked below contain the audit for all third party dependencies of ADF
|
||||
- [ADF 7.0.0-alpha.6](audit-info-7.0.0-alpha.6.md)
|
||||
- [ADF 7.0.0-alpha.7](audit-info-7.0.0-alpha.7.md)
|
||||
- [ADF 7.0.0](audit-info-7.0.0.md)
|
||||
- [ADF 8.0.0](audit-info-8.0.0.md)
|
||||
- [ADF 8.0.1](audit-info-8.0.1.md)
|
||||
- [ADF 8.0.2](audit-info-8.0.2.md)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
Title: Audit info, alfresco-ng2-components 8.0.0
|
||||
---
|
||||
|
||||
# Audit information for alfresco-ng2-components 8.0.0
|
||||
|
||||
This page lists the security audit of the dependencies this project depends on.
|
||||
|
||||
## Risks
|
||||
|
||||
- Critical risk: 0
|
||||
- High risk: 0
|
||||
- Moderate risk: 0
|
||||
- Low risk: 0
|
||||
|
||||
Dependencies analyzed:
|
||||
|
||||
## Libraries
|
||||
|
||||
| Severity | Module | Vulnerable versions |
|
||||
| --- | --- | --- |
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
Title: Audit info, alfresco-ng2-components 8.0.0
|
||||
---
|
||||
|
||||
# Audit information for alfresco-ng2-components 8.0.0
|
||||
|
||||
This page lists the security audit of the dependencies this project depends on.
|
||||
|
||||
## Risks
|
||||
|
||||
- Critical risk: 0
|
||||
- High risk: 0
|
||||
- Moderate risk: 0
|
||||
- Low risk: 0
|
||||
|
||||
Dependencies analyzed:
|
||||
|
||||
## Libraries
|
||||
|
||||
| Severity | Module | Vulnerable versions |
|
||||
| --- | --- | --- |
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
Title: Audit info, alfresco-ng2-components 8.0.2
|
||||
---
|
||||
|
||||
# Audit information for alfresco-ng2-components 8.0.2
|
||||
|
||||
This page lists the security audit of the dependencies this project depends on.
|
||||
|
||||
## Risks
|
||||
|
||||
- Critical risk: 1
|
||||
- High risk: 21
|
||||
- Moderate risk: 4
|
||||
- Low risk: 4
|
||||
|
||||
Dependencies analyzed:
|
||||
|
||||
## Libraries
|
||||
|
||||
| Severity | Module | Vulnerable versions |
|
||||
| --- | --- | --- |
|
||||
|high | @angular/animations | "19.0.0-next.0 - 19.2.17" |
|
||||
|high | @angular/common | "<=19.2.17" |
|
||||
|high | @angular/compiler | "19.0.0-next.0 - 19.2.17" |
|
||||
|high | @angular/core | "19.0.0-next.0 - 19.2.17" |
|
||||
|high | @angular/forms | "<=19.2.17" |
|
||||
|high | @angular/platform-browser | "<=19.2.17" |
|
||||
|high | @angular/platform-browser-dynamic | "<=19.2.17" |
|
||||
|high | @angular/router | "<=0.0.0-ROUTERPLACEHOLDER || 2.0.0-rc.0 - 19.2.17" |
|
||||
|high | @isaacs/brace-expansion | "5.0.0" |
|
||||
|high | @nx/devkit | "<=0.0.0-pr-34253-d811c6c || 18.4.0-canary.20240417-801a22b - 22.4.0-canary.20260121-1b12e1f" |
|
||||
|high | @nx/js | "<=0.0.0-pr-34253-d811c6c || 17.0.4 - 17.0.5 || 17.3.0-beta.1 - 22.4.0-canary.20260121-1b12e1f" |
|
||||
|high | @nx/webpack | "<=0.0.0-pr-34082-9d57132 || 18.4.0-canary.20240417-801a22b - 22.4.0-canary.20260121-1b12e1f" |
|
||||
|high | @nx/workspace | "<=0.0.0-pr-34253-d811c6c || 17.0.4 - 17.0.5 || 17.3.0-beta.1 - 22.4.0-canary.20260121-1b12e1f" |
|
||||
|moderate | ajv | "<6.14.0 || >=7.0.0-alpha.0 <8.18.0" |
|
||||
|high | axios | "1.0.0 - 1.13.4" |
|
||||
|high | body-parser | "<=1.20.3 || 2.0.0-beta.1 - 2.0.2" |
|
||||
|low | compression | "1.0.3 - 1.8.0" |
|
||||
|high | express | "2.5.8 - 2.5.11 || 3.2.1 - 3.2.3 || 4.0.0-rc1 - 4.21.2 || 5.0.0-alpha.1 - 5.0.1" |
|
||||
|critical | form-data | "4.0.0 - 4.0.3" |
|
||||
|high | glob | "10.2.0 - 10.4.5" |
|
||||
|moderate | js-yaml | "<3.14.2 || >=4.0.0 <4.1.1" |
|
||||
|moderate | lodash | "4.0.0 - 4.17.21" |
|
||||
|moderate | lodash-es | "4.0.0 - 4.17.22" |
|
||||
|high | minimatch | "<=3.1.2 || 5.0.0 - 5.1.6 || 9.0.0 - 9.0.5 || 10.0.0 - 10.2.0" |
|
||||
|high | node-forge | "<=1.3.1" |
|
||||
|high | nx | "<=0.0.0-pr-34253-d811c6c || 17.0.4 - 17.0.5 || 17.3.0-beta.1 - 22.4.0-canary.20260121-1b12e1f" |
|
||||
|low | on-headers | "<1.1.0" |
|
||||
|high | qs | "<=6.14.1" |
|
||||
|low | tmp | "<=0.2.3" |
|
||||
|low | webpack | "5.49.0 - 5.104.0" |
|
||||
|
||||
|
||||
Binary file not shown.
Generated
+119
-30
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "8.0.0",
|
||||
"version": "8.0.2",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "8.0.0",
|
||||
"version": "8.0.2",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@alfresco/js-api": ">=8.0.0-alpha.7",
|
||||
@@ -169,6 +169,19 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind-apply-helpers": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
||||
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
@@ -301,6 +314,20 @@
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/dunder-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/ejs": {
|
||||
"version": "3.1.10",
|
||||
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
|
||||
@@ -316,12 +343,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
|
||||
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
@@ -334,6 +359,33 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-object-atoms": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
|
||||
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-set-tostringtag": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
|
||||
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.6",
|
||||
"has-tostringtag": "^1.0.2",
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es5-ext": {
|
||||
"version": "0.10.64",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
|
||||
@@ -443,12 +495,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"es-set-tostringtag": "^2.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
@@ -486,15 +541,21 @@
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
||||
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"call-bind-apply-helpers": "^1.0.2",
|
||||
"es-define-property": "^1.0.1",
|
||||
"es-errors": "^1.3.0",
|
||||
"es-object-atoms": "^1.1.1",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
"get-proto": "^1.0.1",
|
||||
"gopd": "^1.2.0",
|
||||
"has-symbols": "^1.1.0",
|
||||
"hasown": "^2.0.2",
|
||||
"math-intrinsics": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
@@ -503,6 +564,19 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
|
||||
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"dunder-proto": "^1.0.1",
|
||||
"es-object-atoms": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "7.1.6",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
|
||||
@@ -523,11 +597,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
||||
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -568,10 +643,11 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
|
||||
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
@@ -579,10 +655,14 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
||||
"node_modules/has-tostringtag": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
|
||||
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"has-symbols": "^1.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
@@ -761,6 +841,15 @@
|
||||
"semver": "bin/semver"
|
||||
}
|
||||
},
|
||||
"node_modules/math-intrinsics": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
||||
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"description": "Alfresco ADF cli and utils",
|
||||
"version": "8.0.0",
|
||||
"version": "8.0.3",
|
||||
"author": "Hyland Software, Inc. and its affiliates",
|
||||
"bin": {
|
||||
"adf-cli": "bin/adf-cli",
|
||||
@@ -20,7 +20,7 @@
|
||||
"dist": "rm -rf ../../dist/libs/cli && npm run build && cp -R ./bin ../../dist/libs/cli && cp -R ./resources ../../dist/libs/cli && cp -R ./templates ../../dist/libs/cli && cp ./package.json ../../dist/libs/cli"
|
||||
},
|
||||
"dependencies": {
|
||||
"@alfresco/js-api": ">=8.0.0-alpha.7",
|
||||
"@alfresco/js-api": ">=9.0.2",
|
||||
"commander": "^6.2.1",
|
||||
"ejs": "^3.1.9",
|
||||
"license-checker": "^25.0.1",
|
||||
|
||||
@@ -10,7 +10,13 @@
|
||||
"createDefaultProgram": true
|
||||
},
|
||||
"rules": {
|
||||
"jsdoc/tag-lines": ["error", "any", {"startLines": 1}],
|
||||
"jsdoc/tag-lines": [
|
||||
"error",
|
||||
"any",
|
||||
{
|
||||
"startLines": 1
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/naming-convention": "warn",
|
||||
"@typescript-eslint/consistent-type-assertions": "warn",
|
||||
"@typescript-eslint/prefer-for-of": "warn",
|
||||
@@ -44,7 +50,6 @@
|
||||
"style": "kebab-case"
|
||||
}
|
||||
],
|
||||
"@angular-eslint/no-host-metadata-property": "off",
|
||||
"@angular-eslint/no-input-prefix": "error",
|
||||
"@typescript-eslint/consistent-type-definitions": "error",
|
||||
"@typescript-eslint/dot-notation": "off",
|
||||
@@ -75,7 +80,8 @@
|
||||
"rxjs/no-subject-unsubscribe": "error",
|
||||
"rxjs/no-subject-value": "error",
|
||||
"rxjs/no-unsafe-takeuntil": "error",
|
||||
"unicorn/filename-case": "error"
|
||||
"unicorn/filename-case": "error",
|
||||
"@angular-eslint/prefer-standalone": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@alfresco/adf-content-services",
|
||||
"description": "Alfresco ADF content services",
|
||||
"version": "8.0.0",
|
||||
"version": "8.0.3",
|
||||
"author": "Hyland Software, Inc. and its affiliates",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -21,9 +21,9 @@
|
||||
"@angular/platform-browser": ">=14.1.3",
|
||||
"@angular/platform-browser-dynamic": ">=14.1.3",
|
||||
"@angular/router": ">=14.1.3",
|
||||
"@alfresco/js-api": ">=9.0.0",
|
||||
"@ngx-translate/core": ">=14.0.0",
|
||||
"@alfresco/adf-core": ">=8.0.0"
|
||||
"@alfresco/js-api": ">=9.0.2",
|
||||
"@ngx-translate/core": ">=16.0.0",
|
||||
"@alfresco/adf-core": ">=8.0.2"
|
||||
},
|
||||
"keywords": [
|
||||
"content-services",
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { CoreTestingModule } from '@alfresco/adf-core';
|
||||
import { AgentService } from './agent.service';
|
||||
import { Agent, AgentPaging } from '@alfresco/js-api';
|
||||
|
||||
@@ -53,10 +52,6 @@ describe('AgentService', () => {
|
||||
let agentService: AgentService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [CoreTestingModule]
|
||||
});
|
||||
|
||||
agentService = TestBed.inject(AgentService);
|
||||
});
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-alfresco-icon',
|
||||
standalone: true,
|
||||
templateUrl: './alfresco-icon-component.svg'
|
||||
})
|
||||
export class AlfrescoIconComponent {}
|
||||
|
||||
@@ -132,7 +132,9 @@ describe('AspectListDialogComponent', () => {
|
||||
describe('Without passing node id', () => {
|
||||
beforeEach(() => {
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of(aspectListMock));
|
||||
spyOn(aspectListService, 'getAllAspects').and.returnValue(
|
||||
of({ standardAspectPaging: { list: { entries: aspectListMock } }, customAspectPaging: { list: { entries: customAspectListMock } } })
|
||||
);
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
@@ -247,9 +249,11 @@ describe('AspectListDialogComponent', () => {
|
||||
data.nodeId = 'fake-node-id';
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
nodeService = TestBed.inject(NodesApiService);
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of([...aspectListMock, ...customAspectListMock]));
|
||||
spyOn(aspectListService, 'getAllAspects').and.returnValue(
|
||||
of({ standardAspectPaging: { list: { entries: aspectListMock } }, customAspectPaging: { list: { entries: customAspectListMock } } })
|
||||
);
|
||||
spyOn(aspectListService, 'getVisibleAspects').and.returnValue(['frs:AspectOne']);
|
||||
spyOn(aspectListService, 'getCustomAspects').and.returnValue(of(customAspectListMock));
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of({ list: { entries: customAspectListMock } }));
|
||||
spyOn(nodeService, 'getNode').and.returnValue(
|
||||
of(new Node({ id: 'fake-node-id', aspectNames: ['frs:AspectOne', 'cst:customAspect'] })).pipe(delay(0))
|
||||
);
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { AspectListDialogComponentData } from './aspect-list-dialog-data.interface';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { AspectListComponent } from './aspect-list.component';
|
||||
import { AutoFocusDirective } from '../directives/auto-focus.directive';
|
||||
@@ -26,8 +26,7 @@ import { CommonModule } from '@angular/common';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-aspect-list-dialog',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatDialogModule, TranslateModule, MatButtonModule, AspectListComponent, AutoFocusDirective],
|
||||
imports: [CommonModule, MatDialogModule, TranslatePipe, MatButtonModule, AspectListComponent, AutoFocusDirective],
|
||||
templateUrl: './aspect-list-dialog.component.html',
|
||||
styleUrls: ['./aspect-list-dialog.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
|
||||
@@ -8,8 +8,7 @@
|
||||
(click)="onCheckBoxClick($event)"
|
||||
[aria-label]="getTitle(aspect)"
|
||||
(change)="onChange($event, aspect?.entry?.id)"/>
|
||||
<mat-expansion-panel
|
||||
[id]="'aspect-list-'+getId(aspect)"
|
||||
<mat-expansion-panel [id]="'aspect-list-'+getId(aspect)"
|
||||
class="adf-accordion-aspect-list-expansion-panel"
|
||||
(opened)="isPanelOpen[colIndex] = true"
|
||||
(afterCollapse)="isPanelOpen[colIndex] = false"
|
||||
|
||||
@@ -19,15 +19,16 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { NodesApiService } from '../common/services/nodes-api.service';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { AspectListComponent } from './aspect-list.component';
|
||||
import { AspectListService } from './services/aspect-list.service';
|
||||
import { AspectListService, CustomAspectsWhere, StandardAspectsWhere } from './services/aspect-list.service';
|
||||
import { EMPTY, of } from 'rxjs';
|
||||
import { AspectEntry } from '@alfresco/js-api';
|
||||
import { AspectEntry, Pagination } from '@alfresco/js-api';
|
||||
import { HarnessLoader } from '@angular/cdk/testing';
|
||||
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
|
||||
import { MatExpansionPanelHarness } from '@angular/material/expansion/testing';
|
||||
import { MatTableHarness } from '@angular/material/table/testing';
|
||||
import { MatCheckboxHarness } from '@angular/material/checkbox/testing';
|
||||
import { MatProgressSpinnerHarness } from '@angular/material/progress-spinner/testing';
|
||||
import { CustomAspectPaging } from './interfaces/custom-aspect-paging.interface';
|
||||
|
||||
const aspectListMock: AspectEntry[] = [
|
||||
{
|
||||
@@ -110,6 +111,11 @@ const customAspectListMock: AspectEntry[] = [
|
||||
}
|
||||
];
|
||||
|
||||
const allAspectsMock: CustomAspectPaging = {
|
||||
standardAspectPaging: { list: { entries: aspectListMock } },
|
||||
customAspectPaging: { list: { entries: customAspectListMock } }
|
||||
};
|
||||
|
||||
describe('AspectListComponent', () => {
|
||||
let loader: HarnessLoader;
|
||||
let component: AspectListComponent;
|
||||
@@ -122,17 +128,15 @@ describe('AspectListComponent', () => {
|
||||
imports: [ContentTestingModule, AspectListComponent],
|
||||
providers: [AspectListService]
|
||||
});
|
||||
|
||||
fixture = TestBed.createComponent(AspectListComponent);
|
||||
component = fixture.componentInstance;
|
||||
nodeService = TestBed.inject(NodesApiService);
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||
});
|
||||
|
||||
describe('Loading', () => {
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AspectListComponent);
|
||||
component = fixture.componentInstance;
|
||||
nodeService = TestBed.inject(NodesApiService);
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||
});
|
||||
|
||||
it('should show the loading spinner when result is loading', async () => {
|
||||
spyOn(nodeService, 'getNode').and.returnValue(EMPTY);
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(EMPTY);
|
||||
@@ -144,16 +148,11 @@ describe('AspectListComponent', () => {
|
||||
|
||||
describe('When passing a node id', () => {
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AspectListComponent);
|
||||
component = fixture.componentInstance;
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of([...aspectListMock, ...customAspectListMock]));
|
||||
spyOn(aspectListService, 'getCustomAspects').and.returnValue(of(customAspectListMock));
|
||||
spyOn(aspectListService, 'getAllAspects').and.returnValue(of(allAspectsMock));
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of({ list: { entries: customAspectListMock } }));
|
||||
spyOn(aspectListService, 'getVisibleAspects').and.returnValue(['frs:AspectOne']);
|
||||
nodeService = TestBed.inject(NodesApiService);
|
||||
spyOn(nodeService, 'getNode').and.returnValue(of({ id: 'fake-node-id', aspectNames: ['frs:AspectOne', 'stored:aspect'] } as any));
|
||||
component.nodeId = 'fake-node-id';
|
||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@@ -251,6 +250,13 @@ describe('AspectListComponent', () => {
|
||||
expect(component.valueChanged.emit).toHaveBeenCalledWith(['frs:AspectOne', 'frs:SecondAspect', ...storedAspect]);
|
||||
expect(component.updateCounter.emit).toHaveBeenCalledWith(2);
|
||||
});
|
||||
|
||||
it('should load aspects with 0 skip count as pagination by default', () => {
|
||||
expect(aspectListService.getAllAspects).toHaveBeenCalledWith(
|
||||
{ where: StandardAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 },
|
||||
{ where: CustomAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 }
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('with excluded aspects', () => {
|
||||
@@ -265,11 +271,7 @@ describe('AspectListComponent', () => {
|
||||
|
||||
describe('When no node id is passed', () => {
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AspectListComponent);
|
||||
component = fixture.componentInstance;
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
spyOn(aspectListService, 'getAspects').and.returnValue(of(aspectListMock));
|
||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||
spyOn(aspectListService, 'getAllAspects').and.returnValue(of(allAspectsMock));
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
@@ -289,5 +291,38 @@ describe('AspectListComponent', () => {
|
||||
expect(await loader.hasHarness(MatExpansionPanelHarness.with({ selector: '#aspect-list-FirstAspect' }))).toBeFalse();
|
||||
expect(await loader.hasHarness(MatExpansionPanelHarness.with({ selector: '#aspect-list-SecondAspect' }))).toBeFalse();
|
||||
});
|
||||
|
||||
it('should load aspects with 0 skip count as pagination by default', () => {
|
||||
fixture.detectChanges();
|
||||
expect(aspectListService.getAllAspects).toHaveBeenCalledWith(
|
||||
{ where: StandardAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 },
|
||||
{ where: CustomAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 }
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should load next batch of aspects if not all items were returned by first call', (done) => {
|
||||
fixture.detectChanges();
|
||||
const moreItemsPagination: Pagination = { count: 2, hasMoreItems: true };
|
||||
const allAspectsWithMoreItems: CustomAspectPaging = {
|
||||
standardAspectPaging: { list: { entries: aspectListMock, pagination: moreItemsPagination } },
|
||||
customAspectPaging: { list: { entries: customAspectListMock, pagination: moreItemsPagination } }
|
||||
};
|
||||
const getAspectsSpy = spyOn(aspectListService, 'getAllAspects').and.returnValues(of(allAspectsWithMoreItems), of(allAspectsMock));
|
||||
spyOn(aspectListService, 'getAspects').and.returnValues(
|
||||
of({ list: { entries: aspectListMock } }),
|
||||
of({ list: { entries: customAspectListMock } })
|
||||
);
|
||||
|
||||
component.aspects$.subscribe(() => {
|
||||
expect(getAspectsSpy.calls.argsFor(0)[0]).toEqual({ where: StandardAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 });
|
||||
expect(getAspectsSpy.calls.argsFor(0)[1]).toEqual({ where: CustomAspectsWhere, include: ['properties'], skipCount: 0, maxItems: 100 });
|
||||
expect(getAspectsSpy.calls.argsFor(1)[0]).toEqual({ where: StandardAspectsWhere, include: ['properties'], skipCount: 2, maxItems: 100 });
|
||||
expect(getAspectsSpy.calls.argsFor(1)[1]).toEqual({ where: CustomAspectsWhere, include: ['properties'], skipCount: 2, maxItems: 100 });
|
||||
done();
|
||||
});
|
||||
|
||||
component.ngOnInit();
|
||||
fixture.detectChanges();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,22 +17,21 @@
|
||||
|
||||
import { Component, DestroyRef, EventEmitter, inject, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { NodesApiService } from '../common/services/nodes-api.service';
|
||||
import { Observable, zip } from 'rxjs';
|
||||
import { concatMap, map, tap } from 'rxjs/operators';
|
||||
import { AspectListService } from './services/aspect-list.service';
|
||||
import { EMPTY, Observable, zip } from 'rxjs';
|
||||
import { concatMap, expand, map, reduce, take, tap } from 'rxjs/operators';
|
||||
import { AspectListService, CustomAspectsWhere, StandardAspectsWhere } from './services/aspect-list.service';
|
||||
import { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { AspectEntry } from '@alfresco/js-api';
|
||||
import { AspectEntry, ContentPagingQuery, ListAspectsOpts } from '@alfresco/js-api';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatExpansionModule } from '@angular/material/expansion';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-aspect-list',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatExpansionModule, MatCheckboxModule, MatTableModule, TranslateModule, MatProgressSpinnerModule],
|
||||
imports: [CommonModule, MatExpansionModule, MatCheckboxModule, MatTableModule, TranslatePipe, MatProgressSpinnerModule],
|
||||
templateUrl: './aspect-list.component.html',
|
||||
styleUrls: ['./aspect-list.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
@@ -64,6 +63,10 @@ export class AspectListComponent implements OnInit {
|
||||
|
||||
private readonly destroyRef = inject(DestroyRef);
|
||||
|
||||
private customAspectsLoaded = 0;
|
||||
private standardAspectsLoaded = 0;
|
||||
private hasMoreAspects = false;
|
||||
|
||||
constructor(private aspectListService: AspectListService, private nodeApiService: NodesApiService) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
@@ -71,8 +74,13 @@ export class AspectListComponent implements OnInit {
|
||||
if (this.nodeId) {
|
||||
const node$ = this.nodeApiService.getNode(this.nodeId);
|
||||
const customAspect$ = this.aspectListService
|
||||
.getCustomAspects(this.aspectListService.getVisibleAspects())
|
||||
.pipe(map((customAspects) => customAspects.flatMap((customAspect) => customAspect.entry.id)));
|
||||
.getAspects(this.aspectListService.getVisibleAspects(), {
|
||||
where: CustomAspectsWhere,
|
||||
include: ['properties'],
|
||||
skipCount: 0,
|
||||
maxItems: 100
|
||||
})
|
||||
.pipe(map((customAspects) => customAspects?.list?.entries.flatMap((customAspect) => customAspect.entry.id)));
|
||||
aspects$ = zip(node$, customAspect$).pipe(
|
||||
tap(([node, customAspects]) => {
|
||||
this.nodeAspects = node.aspectNames.filter(
|
||||
@@ -85,13 +93,19 @@ export class AspectListComponent implements OnInit {
|
||||
this.valueChanged.emit([...this.nodeAspects, ...this.notDisplayedAspects]);
|
||||
this.updateCounter.emit(this.nodeAspects.length);
|
||||
}),
|
||||
concatMap(() => this.aspectListService.getAspects()),
|
||||
concatMap(() => this.loadAspects({ skipCount: this.standardAspectsLoaded }, { skipCount: this.customAspectsLoaded })),
|
||||
takeUntilDestroyed(this.destroyRef)
|
||||
);
|
||||
} else {
|
||||
aspects$ = this.aspectListService.getAspects().pipe(takeUntilDestroyed(this.destroyRef));
|
||||
aspects$ = this.loadAspects({ skipCount: this.standardAspectsLoaded }, { skipCount: this.customAspectsLoaded });
|
||||
}
|
||||
this.aspects$ = aspects$.pipe(map((aspects) => aspects.filter((aspect) => !this.excludedAspects.includes(aspect.entry.id))));
|
||||
this.aspects$ = aspects$.pipe(
|
||||
expand(() =>
|
||||
this.hasMoreAspects ? this.loadAspects({ skipCount: this.standardAspectsLoaded }, { skipCount: this.customAspectsLoaded }) : EMPTY
|
||||
),
|
||||
map((aspects) => aspects.filter((aspect) => !this.excludedAspects.includes(aspect.entry.id))),
|
||||
reduce((acc, aspects) => [...acc, ...aspects])
|
||||
);
|
||||
}
|
||||
|
||||
onCheckBoxClick(event: Event) {
|
||||
@@ -142,4 +156,33 @@ export class AspectListComponent implements OnInit {
|
||||
this.hasEqualAspect = this.nodeAspects.every((aspect) => this.nodeAspectStatus.includes(aspect));
|
||||
}
|
||||
}
|
||||
|
||||
private loadAspects(standardAspectsPagination?: ContentPagingQuery, customAspectsPagination?: ContentPagingQuery): Observable<AspectEntry[]> {
|
||||
const standardAspectOpts: ListAspectsOpts = {
|
||||
where: StandardAspectsWhere,
|
||||
include: ['properties'],
|
||||
skipCount: standardAspectsPagination?.skipCount ?? 0,
|
||||
maxItems: 100
|
||||
};
|
||||
const customAspectOpts: ListAspectsOpts = {
|
||||
where: CustomAspectsWhere,
|
||||
include: ['properties'],
|
||||
skipCount: customAspectsPagination?.skipCount ?? 0,
|
||||
maxItems: 100
|
||||
};
|
||||
return this.aspectListService.getAllAspects(standardAspectOpts, customAspectOpts).pipe(
|
||||
take(1),
|
||||
tap((aspectsPaging) => {
|
||||
this.customAspectsLoaded += aspectsPaging.customAspectPaging?.list?.pagination?.count ?? 0;
|
||||
this.standardAspectsLoaded += aspectsPaging.standardAspectPaging?.list?.pagination?.count ?? 0;
|
||||
this.hasMoreAspects =
|
||||
aspectsPaging.customAspectPaging?.list?.pagination?.hasMoreItems ||
|
||||
aspectsPaging.standardAspectPaging?.list?.pagination?.hasMoreItems;
|
||||
}),
|
||||
map((aspectsPaging) => [
|
||||
...(aspectsPaging.standardAspectPaging?.list?.entries ?? []),
|
||||
...(aspectsPaging.customAspectPaging?.list?.entries ?? [])
|
||||
])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
||||
*
|
||||
* 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 { AspectPaging } from '@alfresco/js-api';
|
||||
|
||||
export interface CustomAspectPaging {
|
||||
standardAspectPaging: AspectPaging;
|
||||
customAspectPaging: AspectPaging;
|
||||
}
|
||||
@@ -22,5 +22,6 @@ export * from './services/node-aspect.service';
|
||||
export * from './services/dialog-aspect-list.service';
|
||||
|
||||
export * from './aspect-list-dialog-data.interface';
|
||||
export * from './interfaces/custom-aspect-paging.interface';
|
||||
|
||||
export * from './aspect-list.module';
|
||||
|
||||
@@ -16,96 +16,172 @@
|
||||
*/
|
||||
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { AspectListService } from './aspect-list.service';
|
||||
import { AspectPaging, AspectsApi, AspectEntry } from '@alfresco/js-api';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { AspectListService, CustomAspectsWhere, StandardAspectsWhere } from './aspect-list.service';
|
||||
import { AspectPaging, AspectsApi, AspectEntry, ListAspectsOpts } from '@alfresco/js-api';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { AlfrescoApiService } from '../../services';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { AppConfigService } from '@alfresco/adf-core';
|
||||
|
||||
const stdAspect1: AspectEntry = { entry: { id: 'std:standardAspectOne', description: 'Standard Aspect One', title: 'StandardAspectOne' } };
|
||||
const stdAspect2: AspectEntry = { entry: { id: 'std:standardAspectTwo', description: 'Standard Aspect Two', title: 'StandardAspectTwo' } };
|
||||
const stdAspect3: AspectEntry = { entry: { id: 'std:standardAspectThree', description: 'Standard Aspect Three', title: 'StandardAspectThree' } };
|
||||
const standardAspectPagingMock: AspectPaging = { list: { entries: [stdAspect1, stdAspect2, stdAspect3] } };
|
||||
|
||||
const cstAspect1: AspectEntry = { entry: { id: 'cst:customAspectOne', description: 'Custom Aspect One', title: 'CustomAspectOne' } };
|
||||
const cstAspect2: AspectEntry = { entry: { id: 'cst:customAspectTwo', description: 'Custom Aspect Two', title: 'CustomAspectTwo' } };
|
||||
const cstAspect3: AspectEntry = { entry: { id: 'cst:customAspectThree', description: 'Custom Aspect Three', title: 'CustomAspectThree' } };
|
||||
const customAspectPagingMock: AspectPaging = { list: { entries: [cstAspect1, cstAspect2, cstAspect3] } };
|
||||
|
||||
const aspectsOpts: ListAspectsOpts = {
|
||||
where: StandardAspectsWhere,
|
||||
include: ['properties'],
|
||||
skipCount: 0,
|
||||
maxItems: 100
|
||||
};
|
||||
|
||||
const customAspectsOpts: ListAspectsOpts = {
|
||||
where: CustomAspectsWhere,
|
||||
include: ['properties'],
|
||||
skipCount: 0,
|
||||
maxItems: 100
|
||||
};
|
||||
|
||||
let standardAspectPagingMock: AspectPaging;
|
||||
let customAspectPagingMock: AspectPaging;
|
||||
|
||||
describe('AspectListService', () => {
|
||||
let aspectListService: AspectListService;
|
||||
let apiService: AlfrescoApiService;
|
||||
let aspectsApi: AspectsApi;
|
||||
let appConfigService: AppConfigService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [HttpClientTestingModule]
|
||||
providers: [provideHttpClient(), provideHttpClientTesting()]
|
||||
});
|
||||
|
||||
aspectListService = TestBed.inject(AspectListService);
|
||||
appConfigService = TestBed.inject(AppConfigService);
|
||||
apiService = TestBed.inject(AlfrescoApiService);
|
||||
aspectsApi = new AspectsApi(apiService.getInstance());
|
||||
spyOnProperty(aspectListService, 'aspectsApi', 'get').and.returnValue(aspectsApi);
|
||||
standardAspectPagingMock = { list: { entries: [stdAspect1, stdAspect2, stdAspect3] } };
|
||||
customAspectPagingMock = { list: { entries: [cstAspect1, cstAspect2, cstAspect3] } };
|
||||
});
|
||||
|
||||
it('should get one standard aspect', (done) => {
|
||||
const visibleAspects = ['std:standardAspectOne'];
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(standardAspectPagingMock));
|
||||
aspectListService.getStandardAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([stdAspect1]);
|
||||
done();
|
||||
describe('When API returns error', () => {
|
||||
const visibleAspects: string[] = [];
|
||||
|
||||
beforeEach(() => {
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.reject(new Error('API error')));
|
||||
});
|
||||
|
||||
it('should return empty paging list for standard aspects when api returns error', (done) => {
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should return empty paging list for custom aspects when api returns error', (done) => {
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get two standard aspects', (done) => {
|
||||
const visibleAspects = ['std:standardAspectTwo', 'std:standardAspectThree'];
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(standardAspectPagingMock));
|
||||
aspectListService.getStandardAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([stdAspect2, stdAspect3]);
|
||||
done();
|
||||
describe('When aspects are returned', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(standardAspectPagingMock));
|
||||
});
|
||||
|
||||
it('should add custom pagination for aspects list request when provided', (done) => {
|
||||
const visibleAspects: string[] = [];
|
||||
const customPagination: ListAspectsOpts = { skipCount: 10, maxItems: 20 };
|
||||
aspectListService.getAspects(visibleAspects, customPagination).subscribe(() => {
|
||||
expect(aspectsApi.listAspects).toHaveBeenCalledWith(customPagination);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get one aspect', (done) => {
|
||||
const visibleAspects = ['std:standardAspectOne'];
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([stdAspect1]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get two aspects', (done) => {
|
||||
const visibleAspects = ['std:standardAspectTwo', 'std:standardAspectThree'];
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([stdAspect2, stdAspect3]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all aspects (visible aspects as undefined)', (done) => {
|
||||
const visibleAspects: string[] = undefined;
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([stdAspect1, stdAspect2, stdAspect3]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all aspects (visible aspects as empty array)', (done) => {
|
||||
const visibleAspects: string[] = [];
|
||||
aspectListService.getAspects(visibleAspects, aspectsOpts).subscribe((response) => {
|
||||
expect(response.list.entries).toEqual([stdAspect1, stdAspect2, stdAspect3]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get one custom aspect', (done) => {
|
||||
const visibleAspects = ['cst:customAspectTwo'];
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(customAspectPagingMock));
|
||||
aspectListService.getCustomAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([cstAspect2]);
|
||||
done();
|
||||
describe('getAllAspects', () => {
|
||||
beforeEach(() => {
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValues(Promise.resolve(standardAspectPagingMock), Promise.resolve(customAspectPagingMock));
|
||||
});
|
||||
|
||||
it('should get all aspects (standard and custom) when visible aspects are empty', (done) => {
|
||||
spyOn(appConfigService, 'get').and.returnValue(undefined);
|
||||
aspectListService.getAllAspects(aspectsOpts, customAspectsOpts).subscribe((aspects) => {
|
||||
expect(aspects.standardAspectPaging.list.entries).toEqual([stdAspect1, stdAspect2, stdAspect3]);
|
||||
expect(aspects.customAspectPaging.list.entries).toEqual([cstAspect1, cstAspect2, cstAspect3]);
|
||||
expect(aspectsApi.listAspects).toHaveBeenCalledTimes(2);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all aspects (standard and custom) filtered by visible aspects', (done) => {
|
||||
const visibleAspectConfig = {
|
||||
standard: ['std:standardAspectOne', 'std:standardAspectTwo'],
|
||||
custom: ['cst:customAspectOne']
|
||||
};
|
||||
spyOn(appConfigService, 'get').and.returnValue(visibleAspectConfig);
|
||||
aspectListService.getAllAspects(aspectsOpts, customAspectsOpts).subscribe((aspects) => {
|
||||
expect(aspects.standardAspectPaging.list.entries).toEqual([stdAspect1, stdAspect2]);
|
||||
expect(aspects.customAspectPaging.list.entries).toEqual([cstAspect1]);
|
||||
expect(aspectsApi.listAspects).toHaveBeenCalledTimes(2);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('should get two custom aspects', (done) => {
|
||||
const visibleAspects = ['cst:customAspectOne', 'cst:customAspectThree'];
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(customAspectPagingMock));
|
||||
aspectListService.getCustomAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([cstAspect1, cstAspect3]);
|
||||
done();
|
||||
describe('getVisibleAspects', () => {
|
||||
it('should return empty array when visible aspects are not provided in the config', () => {
|
||||
spyOn(appConfigService, 'get').and.returnValue(undefined);
|
||||
const visibleAspects = aspectListService.getVisibleAspects();
|
||||
expect(visibleAspects).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all custom aspects (visible aspects as undefined)', (done) => {
|
||||
const visibleAspects = undefined;
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(customAspectPagingMock));
|
||||
aspectListService.getCustomAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([cstAspect1, cstAspect2, cstAspect3]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all custom aspects (visible aspects as empty array)', (done) => {
|
||||
const visibleAspects = [];
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(customAspectPagingMock));
|
||||
aspectListService.getCustomAspects(visibleAspects).subscribe((response) => {
|
||||
expect(response).toEqual([cstAspect1, cstAspect2, cstAspect3]);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should get all custom aspects (visible aspects not supplied)', (done) => {
|
||||
spyOn(aspectsApi, 'listAspects').and.returnValue(Promise.resolve(customAspectPagingMock));
|
||||
aspectListService.getCustomAspects().subscribe((response) => {
|
||||
expect(response).toEqual([cstAspect1, cstAspect2, cstAspect3]);
|
||||
done();
|
||||
it('should return visible aspects from config when provided', () => {
|
||||
const visibleAspectConfig = {
|
||||
standard: ['std:standardAspectOne', 'std:standardAspectTwo'],
|
||||
custom: ['cst:customAspectOne']
|
||||
};
|
||||
spyOn(appConfigService, 'get').and.returnValue(visibleAspectConfig);
|
||||
const visibleAspects = aspectListService.getVisibleAspects();
|
||||
expect(visibleAspects).toEqual(['std:standardAspectOne', 'std:standardAspectTwo', 'cst:customAspectOne']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -20,7 +20,11 @@ import { AlfrescoApiService } from '../../services/alfresco-api.service';
|
||||
import { AppConfigService } from '@alfresco/adf-core';
|
||||
import { from, Observable, of, zip } from 'rxjs';
|
||||
import { catchError, map } from 'rxjs/operators';
|
||||
import { AspectEntry, AspectPaging, AspectsApi } from '@alfresco/js-api';
|
||||
import { AspectEntry, AspectPaging, AspectsApi, ListAspectsOpts } from '@alfresco/js-api';
|
||||
import { CustomAspectPaging } from '../interfaces/custom-aspect-paging.interface';
|
||||
|
||||
export const StandardAspectsWhere = `(modelId in ('cm:contentmodel', 'emailserver:emailserverModel', 'smf:smartFolder', 'app:applicationmodel' ))`;
|
||||
export const CustomAspectsWhere = `(not namespaceUri matches('http://www.alfresco.*'))`;
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
@@ -34,37 +38,24 @@ export class AspectListService {
|
||||
|
||||
constructor(private alfrescoApiService: AlfrescoApiService, private appConfigService: AppConfigService) {}
|
||||
|
||||
getAspects(): Observable<AspectEntry[]> {
|
||||
getAllAspects(standardOpts?: ListAspectsOpts, customOpts?: ListAspectsOpts): Observable<CustomAspectPaging> {
|
||||
const visibleAspectList = this.getVisibleAspects();
|
||||
const standardAspects$ = this.getStandardAspects(visibleAspectList);
|
||||
const customAspects$ = this.getCustomAspects(visibleAspectList);
|
||||
const standardAspects$ = this.getAspects(visibleAspectList, standardOpts);
|
||||
const customAspects$ = this.getAspects(visibleAspectList, customOpts);
|
||||
return zip(standardAspects$, customAspects$).pipe(
|
||||
map(([standardAspectList, customAspectList]) => [...standardAspectList, ...customAspectList])
|
||||
map(([standardAspectPaging, customAspectPaging]) => ({ standardAspectPaging, customAspectPaging }))
|
||||
);
|
||||
}
|
||||
|
||||
getStandardAspects(whiteList: string[]): Observable<AspectEntry[]> {
|
||||
const where = `(modelId in ('cm:contentmodel', 'emailserver:emailserverModel', 'smf:smartFolder', 'app:applicationmodel' ))`;
|
||||
const opts: any = {
|
||||
where,
|
||||
include: ['properties']
|
||||
};
|
||||
|
||||
getAspects(whiteList: string[], opts?: ListAspectsOpts): Observable<AspectPaging> {
|
||||
return from(this.aspectsApi.listAspects(opts)).pipe(
|
||||
map((result: AspectPaging) => this.filterAspectByConfig(whiteList, result?.list?.entries)),
|
||||
catchError(() => of([]))
|
||||
);
|
||||
}
|
||||
|
||||
getCustomAspects(whiteList?: string[]): Observable<AspectEntry[]> {
|
||||
const where = `(not namespaceUri matches('http://www.alfresco.*'))`;
|
||||
const opts: any = {
|
||||
where,
|
||||
include: ['properties']
|
||||
};
|
||||
return from(this.aspectsApi.listAspects(opts)).pipe(
|
||||
map((result: AspectPaging) => this.filterAspectByConfig(whiteList, result?.list?.entries)),
|
||||
catchError(() => of([]))
|
||||
map((result) => {
|
||||
if (result?.list?.entries) {
|
||||
result.list.entries = this.filterAspectByConfig(whiteList, result.list.entries);
|
||||
}
|
||||
return result;
|
||||
}),
|
||||
catchError(() => of({ list: { entries: [] } }))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,13 +21,12 @@ import { Node, PathElement } from '@alfresco/js-api';
|
||||
import { DocumentListComponent } from '../document-list/components/document-list.component';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-breadcrumb',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, TranslateModule, MatSelectModule],
|
||||
imports: [CommonModule, MatIconModule, TranslatePipe, MatSelectModule],
|
||||
templateUrl: './breadcrumb.component.html',
|
||||
styleUrls: ['./breadcrumb.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
@@ -21,12 +21,11 @@ import { PathElement, Node } from '@alfresco/js-api';
|
||||
import { BreadcrumbComponent } from './breadcrumb.component';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-dropdown-breadcrumb',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, MatSelectModule, TranslateModule],
|
||||
imports: [CommonModule, MatIconModule, MatSelectModule, TranslatePipe],
|
||||
templateUrl: './dropdown-breadcrumb.component.html',
|
||||
styleUrls: ['./dropdown-breadcrumb.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
placeholder="{{'CATEGORIES_MANAGEMENT.CATEGORIES_SEARCH_PLACEHOLDER' | translate }}"
|
||||
adf-auto-focus
|
||||
/>
|
||||
<mat-error *ngIf="categoryNameControl.invalid">{{ categoryNameErrorMessageKey | translate }}</mat-error>
|
||||
<mat-error *ngIf="categoryNameControl.invalid && categoryNameControl.touched">{{ categoryNameErrorMessageKey | translate }}</mat-error>
|
||||
</div>
|
||||
<div class="adf-categories-list" *ngIf="categories?.length > 0" [class.adf-categories-list-fixed]="!categoryNameControlVisible">
|
||||
<span
|
||||
|
||||
+24
-6
@@ -303,12 +303,6 @@ describe('CategoriesManagementComponent', () => {
|
||||
expect(component.categoryNameControl.hasValidator(Validators.required)).toBeFalse();
|
||||
});
|
||||
|
||||
it('should display validation error when searching for empty category', fakeAsync(() => {
|
||||
typeCategory(' ');
|
||||
|
||||
expect(getFirstError()).toBe('CATEGORIES_MANAGEMENT.ERRORS.EMPTY_CATEGORY');
|
||||
}));
|
||||
|
||||
it('should clear categories and hide category control when classifiable aspect is removed', () => {
|
||||
const controlVisibilityChangeSpy = spyOn(component.categoryNameControlVisibleChange, 'emit').and.callThrough();
|
||||
classifiableChangedSubject.next();
|
||||
@@ -523,6 +517,30 @@ describe('CategoriesManagementComponent', () => {
|
||||
|
||||
expect(getCreateCategoryLabel().hidden).toBeTrue();
|
||||
}));
|
||||
|
||||
it('should display validation error when prohibited symbol entered', fakeAsync(() => {
|
||||
typeCategory('category:name');
|
||||
component.categoryNameControl.markAsTouched();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getFirstError()).toBe('CATEGORIES_MANAGEMENT.ERRORS.SPECIAL_CHARACTERS');
|
||||
}));
|
||||
|
||||
it('should display validation error when dot placed in the end', fakeAsync(() => {
|
||||
typeCategory('category.');
|
||||
component.categoryNameControl.markAsTouched();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getFirstError()).toBe('CATEGORIES_MANAGEMENT.ERRORS.ENDS_WITH_DOT');
|
||||
}));
|
||||
|
||||
it('should not display validation error when dot used in positions other than the end', fakeAsync(() => {
|
||||
typeCategory('.category.name');
|
||||
component.categoryNameControl.markAsTouched();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(component.categoryNameControl.valid).toBeTrue();
|
||||
}));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+23
-5
@@ -35,7 +35,7 @@ import { debounce, first, map, tap } from 'rxjs/operators';
|
||||
import { CategoriesManagementMode } from './categories-management-mode';
|
||||
import { CategoryService } from '../services/category.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
@@ -49,14 +49,15 @@ interface CategoryNameControlErrors {
|
||||
duplicatedCategory?: boolean;
|
||||
emptyCategory?: boolean;
|
||||
required?: boolean;
|
||||
specialCharacters?: boolean;
|
||||
endsWithDot?: boolean;
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'adf-categories-management',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
AutoFocusDirective,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
@@ -74,14 +75,22 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
|
||||
['duplicatedExistingCategory', 'ALREADY_EXISTS'],
|
||||
['duplicatedCategory', 'DUPLICATED_CATEGORY'],
|
||||
['emptyCategory', 'EMPTY_CATEGORY'],
|
||||
['required', 'REQUIRED']
|
||||
['required', 'REQUIRED'],
|
||||
['specialCharacters', 'SPECIAL_CHARACTERS'],
|
||||
['endsWithDot', 'ENDS_WITH_DOT']
|
||||
]);
|
||||
|
||||
private existingCategoryLoaded$ = new Subject<void>();
|
||||
private cancelExistingCategoriesLoading$ = new Subject<void>();
|
||||
private _categoryNameControl = new FormControl<string>(
|
||||
'',
|
||||
[this.validateIfNotAlreadyAdded.bind(this), this.validateEmptyCategory, Validators.required],
|
||||
[
|
||||
this.validateIfNotAlreadyAdded.bind(this),
|
||||
this.validateEmptyCategory,
|
||||
this.validateSpecialCharacters,
|
||||
this.validateEndsWithDot,
|
||||
Validators.required
|
||||
],
|
||||
this.validateIfNotAlreadyCreated.bind(this)
|
||||
);
|
||||
private _existingCategories: Category[];
|
||||
@@ -359,6 +368,15 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
|
||||
return categoryNameControl.value.length && !categoryNameControl.value.trim() ? { emptyCategory: true } : null;
|
||||
}
|
||||
|
||||
private validateSpecialCharacters(categoryNameControl: FormControl<string>): CategoryNameControlErrors | null {
|
||||
const specialSymbolsRegex = /[:"\\|<>/?*]/;
|
||||
return categoryNameControl.value.length && specialSymbolsRegex.test(categoryNameControl.value) ? { specialCharacters: true } : null;
|
||||
}
|
||||
|
||||
private validateEndsWithDot(categoryNameControl: FormControl<string>): CategoryNameControlErrors | null {
|
||||
return categoryNameControl.value.trim().endsWith('.') ? { endsWithDot: true } : null;
|
||||
}
|
||||
|
||||
private setCategoryNameControlErrorMessageKey() {
|
||||
this._categoryNameErrorMessageKey = this.categoryNameControl.invalid
|
||||
? `CATEGORIES_MANAGEMENT.ERRORS.${this.nameErrorMessagesByErrors.get(
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { AppConfigService, NoopTranslateModule, UserPreferencesService } from '@alfresco/adf-core';
|
||||
import { AppConfigService, UserPreferencesService } from '@alfresco/adf-core';
|
||||
import {
|
||||
CategoryBody,
|
||||
CategoryEntry,
|
||||
@@ -44,10 +44,6 @@ describe('CategoryService', () => {
|
||||
const fakeCategoriesLinkBodies: CategoryLinkBody[] = [{ categoryId: fakeCategoryId }];
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule]
|
||||
});
|
||||
|
||||
categoryService = TestBed.inject(CategoryService);
|
||||
userPreferencesService = TestBed.inject(UserPreferencesService);
|
||||
});
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
*/
|
||||
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { CoreTestingModule, RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { EMPTY, firstValueFrom, of } from 'rxjs';
|
||||
import { JobIdBodyEntry, SizeDetails, SizeDetailsEntry } from '@alfresco/js-api';
|
||||
import { NodesApiService } from './nodes-api.service';
|
||||
@@ -46,7 +45,6 @@ describe('NodesApiService', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [HttpClientTestingModule, CoreTestingModule],
|
||||
providers: [
|
||||
NodesApiService,
|
||||
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },
|
||||
|
||||
+2
-3
@@ -27,12 +27,11 @@ import { MatCardModule } from '@angular/material/card';
|
||||
import { ContentMetadataComponent } from '../content-metadata/content-metadata.component';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-metadata-card',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatCardModule, ContentMetadataComponent, MatButtonModule, MatIconModule, TranslateModule],
|
||||
imports: [CommonModule, MatCardModule, ContentMetadataComponent, MatButtonModule, MatIconModule, TranslatePipe],
|
||||
templateUrl: './content-metadata-card.component.html',
|
||||
styleUrls: ['./content-metadata-card.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
+16
-16
@@ -19,30 +19,30 @@ import { CommonModule } from '@angular/common';
|
||||
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
||||
import { MatExpansionModule } from '@angular/material/expansion';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, MatExpansionModule, TranslateModule],
|
||||
imports: [CommonModule, MatIconModule, MatExpansionModule, TranslatePipe],
|
||||
selector: 'adf-content-metadata-header',
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
styles: [
|
||||
`
|
||||
adf-content-metadata-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
adf-content-metadata-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.adf-metadata-properties-title {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
padding-left: 12px;
|
||||
}
|
||||
`
|
||||
.adf-metadata-properties-title {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 700;
|
||||
font-size: 15px;
|
||||
padding-left: 12px;
|
||||
}
|
||||
`
|
||||
],
|
||||
template: `
|
||||
<ng-container>
|
||||
|
||||
+3
-3
@@ -98,7 +98,7 @@
|
||||
</div>
|
||||
</adf-content-metadata-header>
|
||||
</mat-expansion-panel-header>
|
||||
<div *ngIf="currentPanel.panelTitle === DefaultPanels.TAGS && !editing"
|
||||
<div *ngIf="currentPanel.panelTitle === DefaultPanels.TAGS && editedPanelTitle !== DefaultPanels.TAGS"
|
||||
class="adf-metadata-properties-tags">
|
||||
<adf-dynamic-chip-list [chips]="tagsToDisplay" [showDelete]="false" />
|
||||
</div>
|
||||
@@ -161,7 +161,7 @@
|
||||
</div>
|
||||
</adf-content-metadata-header>
|
||||
</mat-expansion-panel-header>
|
||||
<div *ngIf="currentPanel.panelTitle === DefaultPanels.CATEGORIES && !editing">
|
||||
<div *ngIf="currentPanel.panelTitle === DefaultPanels.CATEGORIES && editedPanelTitle !== DefaultPanels.CATEGORIES">
|
||||
<p *ngFor="let category of categories" class="adf-metadata-categories">{{ category.name }}</p>
|
||||
</div>
|
||||
<div *ngIf="showEmptyCategoryMessage" class="adf-metadata-no-item-added">
|
||||
@@ -241,7 +241,7 @@
|
||||
</div>
|
||||
</adf-content-metadata-header>
|
||||
</mat-expansion-panel-header>
|
||||
<div *ngIf="!showGroup(group) && group.editable && !editing" class="adf-metadata-no-item-added">
|
||||
<div *ngIf="!showGroup(group) && group.editable && editedPanelTitle !== group.title" class="adf-metadata-no-item-added">
|
||||
{{ 'METADATA.BASIC.NO_ITEMS_MESSAGE' | translate : { groupTitle: group.title | translate } }}
|
||||
</div>
|
||||
<adf-card-view
|
||||
|
||||
+72
-2
@@ -18,7 +18,14 @@
|
||||
import { Category, CategoryPaging, ClassesApi, Node, Tag, TagBody, TagEntry, TagPaging, TagPagingList } from '@alfresco/js-api';
|
||||
import { ContentMetadataComponent } from './content-metadata.component';
|
||||
import { ContentMetadataService } from '../../services/content-metadata.service';
|
||||
import { AppConfigService, CardViewBaseItemModel, CardViewComponent, NotificationService, UpdateNotification } from '@alfresco/adf-core';
|
||||
import {
|
||||
AppConfigService,
|
||||
CardViewBaseItemModel,
|
||||
CardViewComponent,
|
||||
NotificationService,
|
||||
UpdateNotification,
|
||||
UnitTestingUtils
|
||||
} from '@alfresco/adf-core';
|
||||
import { NodesApiService } from '../../../common/services/nodes-api.service';
|
||||
import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
|
||||
import { MatChipHarness } from '@angular/material/chips/testing';
|
||||
@@ -36,7 +43,7 @@ import { CategoryService } from '../../../category/services/category.service';
|
||||
import { CardViewContentUpdateService } from '../../../common/services/card-view-content-update.service';
|
||||
import { ComponentFixture, discardPeriodicTasks, fakeAsync, flush, TestBed, tick } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { SimpleChange } from '@angular/core';
|
||||
import { DebugElement, SimpleChange } from '@angular/core';
|
||||
|
||||
describe('ContentMetadataComponent', () => {
|
||||
let component: ContentMetadataComponent;
|
||||
@@ -48,6 +55,7 @@ describe('ContentMetadataComponent', () => {
|
||||
let folderNode: Node;
|
||||
let tagService: TagService;
|
||||
let categoryService: CategoryService;
|
||||
let testingUtils: UnitTestingUtils;
|
||||
let getClassSpy: jasmine.Spy;
|
||||
let notificationService: NotificationService;
|
||||
let getGroupedPropertiesSpy: jasmine.Spy;
|
||||
@@ -154,6 +162,8 @@ describe('ContentMetadataComponent', () => {
|
||||
|
||||
const queryDom = (properties = 'properties') => fixture.debugElement.query(By.css(`[data-automation-id="adf-metadata-group-${properties}"]`));
|
||||
|
||||
const getEmptyPanelMessage = (): DebugElement => testingUtils.getByCSS('.adf-metadata-no-item-added');
|
||||
|
||||
/**
|
||||
* Get metadata categories
|
||||
*
|
||||
@@ -196,6 +206,7 @@ describe('ContentMetadataComponent', () => {
|
||||
});
|
||||
fixture = TestBed.createComponent(ContentMetadataComponent);
|
||||
component = fixture.componentInstance;
|
||||
testingUtils = new UnitTestingUtils(fixture.debugElement);
|
||||
contentMetadataService = TestBed.inject(ContentMetadataService);
|
||||
updateService = TestBed.inject(CardViewContentUpdateService);
|
||||
nodesApiService = TestBed.inject(NodesApiService);
|
||||
@@ -1484,6 +1495,36 @@ describe('ContentMetadataComponent', () => {
|
||||
const noEditableTagsContainer = fixture.debugElement.query(By.css('div.adf-metadata-properties-tags'));
|
||||
expect(noEditableTagsContainer).toBeNull();
|
||||
});
|
||||
|
||||
it('should show existing tags when editing another panel and viewing tags panel', async () => {
|
||||
component.displayTags = true;
|
||||
component.readOnly = false;
|
||||
fixture.detectChanges();
|
||||
spyOn(tagService, 'getTagsByNodeId').and.returnValue(of(tagPaging));
|
||||
|
||||
component.ngOnChanges({
|
||||
node: new SimpleChange(undefined, node, false)
|
||||
});
|
||||
|
||||
toggleEditModeForGeneralInfo();
|
||||
expandTagsPanel();
|
||||
const tagElements = await findTagElements();
|
||||
expect(tagElements).toHaveSize(2);
|
||||
expect(component.showEmptyTagMessage).toBeFalse();
|
||||
});
|
||||
|
||||
it('should show empty tag message when editing another panel and viewing tags panel', () => {
|
||||
component.displayTags = true;
|
||||
component.readOnly = false;
|
||||
fixture.detectChanges();
|
||||
|
||||
toggleEditModeForGeneralInfo();
|
||||
expandTagsPanel();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getEmptyPanelMessage()).toBeTruthy();
|
||||
expect(component.showEmptyTagMessage).toBeTrue();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Tags creator', () => {
|
||||
@@ -1677,6 +1718,35 @@ describe('ContentMetadataComponent', () => {
|
||||
toggleEditModeForCategories();
|
||||
expect(getCategories().length).toBe(0);
|
||||
});
|
||||
|
||||
it('should show existing categories when editing another panel and viewing categories panel', async () => {
|
||||
component.displayCategories = true;
|
||||
component.readOnly = false;
|
||||
fixture.detectChanges();
|
||||
|
||||
component.ngOnChanges({
|
||||
node: new SimpleChange(undefined, node, false)
|
||||
});
|
||||
|
||||
toggleEditModeForGeneralInfo();
|
||||
expandCategoriesPanel();
|
||||
const categories = getCategories();
|
||||
expect(categories).toHaveSize(2);
|
||||
expect(component.showEmptyCategoryMessage).toBeFalse();
|
||||
});
|
||||
|
||||
it('should show empty categories message when editing another panel and viewing categories panel', () => {
|
||||
component.displayCategories = true;
|
||||
component.readOnly = false;
|
||||
fixture.detectChanges();
|
||||
|
||||
toggleEditModeForGeneralInfo();
|
||||
expandCategoriesPanel();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getEmptyPanelMessage()).toBeTruthy();
|
||||
expect(component.showEmptyCategoryMessage).toBeTrue();
|
||||
});
|
||||
});
|
||||
|
||||
describe('Categories management', () => {
|
||||
|
||||
+4
-5
@@ -49,7 +49,7 @@ import { DynamicExtensionComponent } from '@alfresco/adf-extensions';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { TagsCreatorComponent } from '../../../tag';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { ContentMetadataHeaderComponent } from './content-metadata-header.component';
|
||||
import { CategoriesManagementComponent } from '../../../category/categories-management/categories-management.component';
|
||||
|
||||
@@ -63,13 +63,12 @@ enum DefaultPanels {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-metadata',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatExpansionModule,
|
||||
ContentMetadataHeaderComponent,
|
||||
MatButtonModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
MatIconModule,
|
||||
MatChipsModule,
|
||||
CategoriesManagementComponent,
|
||||
@@ -342,11 +341,11 @@ export class ContentMetadataComponent implements OnChanges, OnInit {
|
||||
}
|
||||
|
||||
get showEmptyTagMessage(): boolean {
|
||||
return this.tags?.length === 0 && this.currentPanel.panelTitle === 'Tags' && !this.editing;
|
||||
return this.tags?.length === 0 && !this.isPanelEditing('Tags');
|
||||
}
|
||||
|
||||
get showEmptyCategoryMessage(): boolean {
|
||||
return this.categories?.length === 0 && this.currentPanel.panelTitle === 'Categories' && !this.editing;
|
||||
return this.categories?.length === 0 && !this.isPanelEditing('Categories');
|
||||
}
|
||||
|
||||
toggleGroupEditing(panelTitle: string, event?: MouseEvent) {
|
||||
|
||||
+2
-3
@@ -43,7 +43,7 @@ import { debounceTime } from 'rxjs/operators';
|
||||
import { ContentNodeSelectorPanelService } from './content-node-selector-panel.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { AutoFocusDirective } from '../../directives/auto-focus.directive';
|
||||
import { NodeCounterDirective } from '../../directives/node-counter.directive';
|
||||
@@ -62,11 +62,10 @@ export const defaultValidation = () => true;
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-node-selector-panel',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatFormFieldModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
MatInputModule,
|
||||
ReactiveFormsModule,
|
||||
AutoFocusDirective,
|
||||
|
||||
+3
-11
@@ -17,13 +17,7 @@
|
||||
|
||||
import { Component, DestroyRef, inject, Inject, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import {
|
||||
EmptyListComponent,
|
||||
NotificationService,
|
||||
ToolbarComponent,
|
||||
ToolbarTitleComponent,
|
||||
TranslationService
|
||||
} from '@alfresco/adf-core';
|
||||
import { EmptyListComponent, NotificationService, ToolbarComponent, ToolbarTitleComponent, TranslationService } from '@alfresco/adf-core';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { AllowableOperationsEnum } from '../common/models/allowable-operations.enum';
|
||||
import { ContentService } from '../common/services/content.service';
|
||||
@@ -34,7 +28,7 @@ import { NodeAction } from '../document-list/models/node-action.enum';
|
||||
import { OverlayContainer } from '@angular/cdk/overlay';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { DropdownBreadcrumbComponent } from '../breadcrumb/dropdown-breadcrumb.component';
|
||||
import { NodeCounterDirective } from '../directives/node-counter.directive';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
@@ -47,12 +41,11 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-node-selector',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
MatTabsModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
ToolbarTitleComponent,
|
||||
ToolbarComponent,
|
||||
DropdownBreadcrumbComponent,
|
||||
@@ -70,7 +63,6 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
export class ContentNodeSelectorComponent implements OnInit {
|
||||
|
||||
title: string;
|
||||
action: NodeAction;
|
||||
buttonActionName: string;
|
||||
|
||||
-1
@@ -20,7 +20,6 @@ import { DataRow } from '@alfresco/adf-core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-name-location-cell',
|
||||
standalone: true,
|
||||
template: `
|
||||
<div class="adf-name-location-cell-name adf-datatable-cell-value" [title]="name">{{ name }}</div>
|
||||
<div class="adf-name-location-cell-location adf-datatable-cell-value" [title]="path">{{ path }}</div>
|
||||
|
||||
+2
-3
@@ -20,7 +20,7 @@ import { InfiniteSelectScrollDirective, AuthenticationService } from '@alfresco/
|
||||
import { SitePaging, SiteEntry, Site } from '@alfresco/js-api';
|
||||
import { MatSelectChange, MatSelectModule } from '@angular/material/select';
|
||||
import { LiveAnnouncer } from '@angular/cdk/a11y';
|
||||
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
||||
import { TranslatePipe, TranslateService } from '@ngx-translate/core';
|
||||
import { SitesService } from '../../common/services/sites.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
@@ -35,8 +35,7 @@ export enum Relations {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-sites-dropdown',
|
||||
standalone: true,
|
||||
imports: [CommonModule, TranslateModule, MatFormFieldModule, MatSelectModule, InfiniteSelectScrollDirective],
|
||||
imports: [CommonModule, TranslatePipe, MatFormFieldModule, MatSelectModule, InfiniteSelectScrollDirective],
|
||||
templateUrl: './sites-dropdown.component.html',
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
host: { class: 'adf-sites-dropdown' }
|
||||
|
||||
@@ -27,7 +27,7 @@ import { ContentNodeShareSettings } from './content-node-share.settings';
|
||||
import { RenditionService } from '../common/services/rendition.service';
|
||||
import { add, endOfDay, format, isBefore } from 'date-fns';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||
@@ -41,10 +41,9 @@ interface SharedDialogFormProps {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-share-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
MatIconModule,
|
||||
MatDialogModule,
|
||||
ReactiveFormsModule,
|
||||
|
||||
@@ -25,7 +25,6 @@ import { NodeSharedDirective } from '@alfresco/adf-content-services';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-node-share-test-component',
|
||||
standalone: true,
|
||||
imports: [NodeSharedDirective],
|
||||
template: `
|
||||
<button
|
||||
|
||||
@@ -26,7 +26,6 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Directive({
|
||||
selector: '[adf-share]',
|
||||
standalone: true,
|
||||
exportAs: 'adfShare'
|
||||
})
|
||||
export class NodeSharedDirective implements OnChanges {
|
||||
@@ -42,7 +41,6 @@ export class NodeSharedDirective implements OnChanges {
|
||||
@Input()
|
||||
baseShareUrl: string;
|
||||
|
||||
|
||||
_nodesApi: NodesApi;
|
||||
get nodesApi(): NodesApi {
|
||||
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
|
||||
|
||||
@@ -21,15 +21,14 @@ import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/materia
|
||||
import { ContentTypeDialogComponentData } from './content-type-metadata.interface';
|
||||
import { ContentTypeService } from './content-type.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatExpansionModule } from '@angular/material/expansion';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-type-dialog',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatDialogModule, TranslateModule, MatExpansionModule, MatTableModule, MatButtonModule],
|
||||
imports: [CommonModule, MatDialogModule, TranslatePipe, MatExpansionModule, MatTableModule, MatButtonModule],
|
||||
templateUrl: './content-type-dialog.component.html',
|
||||
styleUrls: ['./content-type-dialog.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
|
||||
+2
-2
@@ -21,7 +21,7 @@ import { Subject } from 'rxjs';
|
||||
import { Category } from '@alfresco/js-api';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { AppConfigService, AppConfigServiceMock, NoopTranslateModule } from '@alfresco/adf-core';
|
||||
import { AppConfigService, AppConfigServiceMock } from '@alfresco/adf-core';
|
||||
|
||||
describe('CategorySelectorDialogComponent', () => {
|
||||
let fixture: ComponentFixture<CategorySelectorDialogComponent>;
|
||||
@@ -48,7 +48,7 @@ describe('CategorySelectorDialogComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, MatDialogModule, CategorySelectorDialogComponent],
|
||||
imports: [MatDialogModule, CategorySelectorDialogComponent],
|
||||
providers: [
|
||||
{ provide: AppConfigService, useClass: AppConfigServiceMock },
|
||||
{ provide: MatDialogRef, useValue: dialogRef },
|
||||
|
||||
@@ -21,7 +21,7 @@ import { Subject } from 'rxjs';
|
||||
import { Category } from '@alfresco/js-api';
|
||||
import { CategoriesManagementComponent, CategoriesManagementMode } from '../../category';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
export interface CategorySelectorDialogOptions {
|
||||
@@ -31,8 +31,7 @@ export interface CategorySelectorDialogOptions {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-category-selector-dialog',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatDialogModule, TranslateModule, CategoriesManagementComponent, MatButtonModule],
|
||||
imports: [CommonModule, MatDialogModule, TranslatePipe, CategoriesManagementComponent, MatButtonModule],
|
||||
templateUrl: './category-selector.dialog.html',
|
||||
styleUrls: ['./category-selector.dialog.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
|
||||
@@ -19,18 +19,19 @@ import { NgModule } from '@angular/core';
|
||||
import { FolderDialogComponent } from './folder/folder.dialog';
|
||||
import { NodeLockDialogComponent } from './node-lock/node-lock.dialog';
|
||||
import { LibraryDialogComponent } from './library/library.dialog';
|
||||
import { DownloadZipDialogModule } from './download-zip/download-zip.dialog.module';
|
||||
import { CategorySelectorDialogComponent } from './category-selector/category-selector.dialog';
|
||||
import { DownloadZipDialogComponent } from './download-zip/download-zip.dialog';
|
||||
|
||||
/** @deprecated use standalone component imports instead */
|
||||
export const CONTENT_DIALOG_DIRECTIVES = [
|
||||
DownloadZipDialogModule,
|
||||
DownloadZipDialogComponent,
|
||||
FolderDialogComponent,
|
||||
NodeLockDialogComponent,
|
||||
LibraryDialogComponent,
|
||||
CategorySelectorDialogComponent
|
||||
];
|
||||
|
||||
/** @deprecated use `..CONTENT_DIALOG_DIRECTIVES` or standalone component imports instead */
|
||||
/** @deprecated use standalone component imports instead */
|
||||
@NgModule({
|
||||
imports: [...CONTENT_DIALOG_DIRECTIVES],
|
||||
exports: [...CONTENT_DIALOG_DIRECTIVES]
|
||||
|
||||
@@ -17,15 +17,11 @@
|
||||
|
||||
import { NgModule } from '@angular/core';
|
||||
import { DownloadZipDialogComponent } from './download-zip.dialog';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
/** @deprecated use DownloadZipDialogComponent instead */
|
||||
@NgModule({
|
||||
declarations: [DownloadZipDialogComponent],
|
||||
imports: [CommonModule, MatDialogModule, MatProgressBarModule, MatButtonModule, TranslateModule],
|
||||
declarations: [],
|
||||
imports: [DownloadZipDialogComponent],
|
||||
exports: [DownloadZipDialogComponent]
|
||||
})
|
||||
export class DownloadZipDialogModule {}
|
||||
|
||||
@@ -21,8 +21,7 @@ import { DownloadZipDialogComponent } from './download-zip.dialog';
|
||||
import { DownloadZipService } from './services/download-zip.service';
|
||||
import { DownloadEntry, FileDownloadStatus } from '@alfresco/js-api';
|
||||
import { EMPTY, Observable, of } from 'rxjs';
|
||||
import { NoopTranslateModule, RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||
import { RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { AlfrescoApiService } from '../../services';
|
||||
import { AlfrescoApiServiceMock } from '../../mock';
|
||||
|
||||
@@ -41,9 +40,8 @@ describe('DownloadZipDialogComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, MatDialogModule, NoopAnimationsModule],
|
||||
imports: [MatDialogModule, DownloadZipDialogComponent],
|
||||
providers: [
|
||||
DownloadZipService,
|
||||
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },
|
||||
{ provide: MatDialogRef, useValue: dialogRef },
|
||||
{ provide: MAT_DIALOG_DATA, useValue: dataMock },
|
||||
|
||||
+4
-1
@@ -20,10 +20,13 @@ import { MatDialog } from '@angular/material/dialog';
|
||||
import { DownloadZipDialogComponent } from './download-zip.dialog';
|
||||
import { zipNode, downloadEntry } from './mock/download-zip-data.mock';
|
||||
import { FileDownloadStatus } from '@alfresco/js-api';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-download-zip-dialog-storybook',
|
||||
template: `<button mat-raised-button (click)="openDialog()">Open dialog</button>`
|
||||
template: `<button mat-raised-button (click)="openDialog()">Open dialog</button>`,
|
||||
standalone: true,
|
||||
imports: [MatButtonModule]
|
||||
})
|
||||
export class DownloadZipDialogStorybookComponent implements OnInit, OnChanges {
|
||||
@Input()
|
||||
|
||||
@@ -33,8 +33,7 @@ export default {
|
||||
title: 'Core/Dialog/Download ZIP Dialog',
|
||||
decorators: [
|
||||
moduleMetadata({
|
||||
declarations: [DownloadZipDialogStorybookComponent],
|
||||
imports: [MatButtonModule, MatDialogModule, HttpClientTestingModule],
|
||||
imports: [MatButtonModule, MatDialogModule, HttpClientTestingModule, DownloadZipDialogStorybookComponent],
|
||||
providers: [
|
||||
{
|
||||
provide: AlfrescoApiService,
|
||||
|
||||
@@ -16,14 +16,19 @@
|
||||
*/
|
||||
|
||||
import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule } from '@angular/material/dialog';
|
||||
import { NodesApiService } from '../../common/services/nodes-api.service';
|
||||
import { DownloadZipService } from './services/download-zip.service';
|
||||
import { ContentService } from '../../common/services/content.service';
|
||||
import { FileDownloadStatus } from '@alfresco/js-api';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-download-zip-dialog',
|
||||
standalone: true,
|
||||
imports: [TranslatePipe, MatProgressBarModule, MatDialogModule, MatButtonModule],
|
||||
templateUrl: './download-zip.dialog.html',
|
||||
styleUrls: ['./download-zip.dialog.scss'],
|
||||
host: { class: 'adf-download-zip-dialog' },
|
||||
|
||||
@@ -24,7 +24,7 @@ import { TranslationService } from '@alfresco/adf-core';
|
||||
import { NodesApiService } from '../../common/services/nodes-api.service';
|
||||
import { forbidEndingDot, forbidOnlySpaces, forbidSpecialCharacters } from './folder-name.validators';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
@@ -33,11 +33,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-folder-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
@@ -54,13 +53,13 @@ export class FolderDialogComponent implements OnInit {
|
||||
* Emitted when the edit/create folder give error for example a folder with same name already exist
|
||||
*/
|
||||
@Output()
|
||||
error: EventEmitter<any> = new EventEmitter<any>();
|
||||
error = new EventEmitter<any>();
|
||||
|
||||
/**
|
||||
* Emitted when the edit/create folder is successfully created/modified
|
||||
*/
|
||||
@Output()
|
||||
success: EventEmitter<Node> = new EventEmitter<Node>();
|
||||
success = new EventEmitter<Node>();
|
||||
|
||||
form: UntypedFormGroup;
|
||||
folder: Node = null;
|
||||
|
||||
@@ -32,7 +32,7 @@ import { NotificationService } from '@alfresco/adf-core';
|
||||
import { debounceTime, finalize, mergeMap } from 'rxjs/operators';
|
||||
import { SitesService } from '../../common/services/sites.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
@@ -43,11 +43,10 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-library-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
@@ -64,7 +63,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
export class LibraryDialogComponent implements OnInit {
|
||||
/** Emitted when an error occurs. */
|
||||
@Output()
|
||||
error: EventEmitter<any> = new EventEmitter<any>();
|
||||
error = new EventEmitter<any>();
|
||||
|
||||
/**
|
||||
* Emitted when the new library is created successfully. The
|
||||
@@ -72,7 +71,7 @@ export class LibraryDialogComponent implements OnInit {
|
||||
* newly-created library.
|
||||
*/
|
||||
@Output()
|
||||
success: EventEmitter<any> = new EventEmitter<any>();
|
||||
success = new EventEmitter<any>();
|
||||
|
||||
createTitle = 'LIBRARY.DIALOG.CREATE_TITLE';
|
||||
libraryTitleExists = false;
|
||||
|
||||
@@ -21,7 +21,7 @@ import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angu
|
||||
import { differenceInSeconds } from 'date-fns';
|
||||
import { NodeBodyLock, Node, NodeEntry, NodesApi } from '@alfresco/js-api';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatDatetimepickerModule } from '@mat-datetimepicker/core';
|
||||
@@ -31,10 +31,9 @@ import { AlfrescoApiService } from '../../services/alfresco-api.service';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-node-lock',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
MatDialogModule,
|
||||
ReactiveFormsModule,
|
||||
MatCheckboxModule,
|
||||
|
||||
@@ -19,10 +19,8 @@ import { Component } from '@angular/core';
|
||||
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
|
||||
import { AutoFocusDirective } from './auto-focus.directive';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NoopTranslateModule } from '@alfresco/adf-core';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [AutoFocusDirective],
|
||||
template: ` <div tabindex="0" adf-auto-focus>Test</div>`
|
||||
})
|
||||
@@ -33,7 +31,7 @@ describe('AutoFocusDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, AutoFocusDirective, AutoFocusTestComponent]
|
||||
imports: [AutoFocusDirective, AutoFocusTestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(AutoFocusTestComponent);
|
||||
});
|
||||
|
||||
@@ -24,7 +24,6 @@ import { NotificationService } from '@alfresco/adf-core';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [LibraryFavoriteDirective],
|
||||
selector: 'app-test-component',
|
||||
template: `<button #favoriteLibrary="favoriteLibrary" [adf-favorite-library]="selection">Favorite</button>`
|
||||
|
||||
@@ -19,10 +19,8 @@ import { Component } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { NodeCounterDirective, NodeCounterComponent } from './node-counter.directive';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NoopTranslateModule } from '@alfresco/adf-core';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeCounterDirective],
|
||||
template: `<div [adf-node-counter]="count"></div>`
|
||||
})
|
||||
@@ -35,7 +33,7 @@ describe('NodeCounterDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, NodeCounterDirective, NodeCounterComponent, TestComponent]
|
||||
imports: [NodeCounterDirective, NodeCounterComponent, TestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(TestComponent);
|
||||
fixture.detectChanges();
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
import { Directive, Input, Component, OnInit, OnChanges, ViewContainerRef } from '@angular/core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
|
||||
@Directive({
|
||||
standalone: true,
|
||||
@@ -45,7 +45,7 @@ export class NodeCounterDirective implements OnInit, OnChanges {
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [TranslateModule],
|
||||
imports: [TranslatePipe],
|
||||
selector: 'adf-node-counter',
|
||||
template: ` <div>{{ 'NODE_COUNTER.SELECTED_COUNT' | translate : { count: counter } }}</div> `
|
||||
})
|
||||
|
||||
@@ -19,12 +19,11 @@ import { Component, DebugElement, ViewChild } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NodeDeleteDirective } from './node-delete.directive';
|
||||
import { NoopTranslateModule, RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { RedirectAuthService } from '@alfresco/adf-core';
|
||||
import { EMPTY, of } from 'rxjs';
|
||||
import { CheckAllowableOperationDirective } from './check-allowable-operation.directive';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeDeleteDirective],
|
||||
template: `<div id="delete-component" [adf-delete]="selection" (delete)="onDelete()"></div>`
|
||||
})
|
||||
@@ -38,7 +37,6 @@ class TestComponent {
|
||||
}
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeDeleteDirective, CheckAllowableOperationDirective],
|
||||
template: `<div id="delete-component" [adf-check-allowable-operation]="'delete'" [adf-delete]="selection" (delete)="onDelete($event)"></div>`
|
||||
})
|
||||
@@ -52,7 +50,6 @@ class TestWithPermissionsComponent {
|
||||
}
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeDeleteDirective],
|
||||
template: ` delete permanent
|
||||
<div id="delete-permanent" [adf-delete]="selection" [permanent]="permanent" (delete)="onDelete($event)"></div>`
|
||||
@@ -83,7 +80,7 @@ describe('NodeDeleteDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, TestComponent, TestWithPermissionsComponent, TestDeletePermanentComponent],
|
||||
imports: [TestComponent, TestWithPermissionsComponent, TestDeletePermanentComponent],
|
||||
providers: [{ provide: RedirectAuthService, useValue: { onLogin: EMPTY, onTokenReceived: of() } }]
|
||||
});
|
||||
fixture = TestBed.createComponent(TestComponent);
|
||||
|
||||
@@ -26,7 +26,6 @@ import { AlfrescoApiService } from '../services/alfresco-api.service';
|
||||
import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeDownloadDirective],
|
||||
template: '<div [adfNodeDownload]="selection" [version]="version"></div>'
|
||||
})
|
||||
|
||||
@@ -19,18 +19,14 @@ import { TestBed, ComponentFixture, fakeAsync } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { Component, DebugElement } from '@angular/core';
|
||||
import { NodeLockDirective } from './node-lock.directive';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import type { Node } from '@alfresco/js-api';
|
||||
import { ContentNodeDialogService } from '../content-node-selector/content-node-dialog.service';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
|
||||
const fakeNode = {
|
||||
id: 'fake',
|
||||
isFile: true,
|
||||
isLocked: false
|
||||
} as Node;
|
||||
|
||||
@Component({
|
||||
template: '<div [adf-node-lock]="node"></div>'
|
||||
template: '<div [adf-node-lock]="node"></div>',
|
||||
standalone: true,
|
||||
imports: [NodeLockDirective]
|
||||
})
|
||||
class TestComponent {
|
||||
node = null;
|
||||
@@ -44,8 +40,7 @@ describe('NodeLock Directive', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
declarations: [TestComponent]
|
||||
imports: [ContentTestingModule, TestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(TestComponent);
|
||||
component = fixture.componentInstance;
|
||||
@@ -55,6 +50,13 @@ describe('NodeLock Directive', () => {
|
||||
|
||||
it('should call openLockNodeDialog method on click', () => {
|
||||
spyOn(contentNodeDialogService, 'openLockNodeDialog');
|
||||
|
||||
const fakeNode = {
|
||||
id: 'fake',
|
||||
isFile: true,
|
||||
isLocked: false
|
||||
} as Node;
|
||||
|
||||
component.node = fakeNode;
|
||||
|
||||
fixture.detectChanges();
|
||||
|
||||
@@ -19,11 +19,10 @@ import { Component, DebugElement } from '@angular/core';
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NodeRestoreDirective } from './node-restore.directive';
|
||||
import { NoopTranslateModule, TranslationService } from '@alfresco/adf-core';
|
||||
import { TranslationService } from '@alfresco/adf-core';
|
||||
import { TrashcanApi } from '@alfresco/js-api';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [NodeRestoreDirective],
|
||||
template: ` <div [adf-restore]="selection" (restore)="doneSpy()"></div>`
|
||||
})
|
||||
@@ -44,7 +43,7 @@ describe('NodeRestoreDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, TestComponent]
|
||||
imports: [TestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(TestComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
||||
+1
-2
@@ -23,8 +23,7 @@ import { DocumentListComponent } from './../document-list.component';
|
||||
|
||||
@Component({
|
||||
selector: 'content-actions',
|
||||
template: '',
|
||||
standalone: true
|
||||
template: ''
|
||||
})
|
||||
export class ContentActionListComponent {
|
||||
constructor(private documentList: DocumentListComponent) {}
|
||||
|
||||
-1
@@ -28,7 +28,6 @@ import { Subscription } from 'rxjs';
|
||||
|
||||
@Component({
|
||||
selector: 'content-action',
|
||||
standalone: true,
|
||||
template: '',
|
||||
providers: [DocumentActionsService, FolderActionsService]
|
||||
})
|
||||
|
||||
+40
-1
@@ -1023,6 +1023,46 @@ describe('DocumentList', () => {
|
||||
expect(documentList.currentFolderId).toBe('normal-folder');
|
||||
});
|
||||
|
||||
it('should reset filterValue and update currentFolderId when navigating with a string folder ID', () => {
|
||||
documentList.filterValue = { name: 'test' };
|
||||
|
||||
const result = documentList.navigateTo('folder-123');
|
||||
|
||||
expect(result).toBeTrue();
|
||||
expect(documentList.filterValue).toEqual({});
|
||||
expect(documentList.currentFolderId).toBe('folder-123');
|
||||
});
|
||||
|
||||
it('should reset filterValue and update currentFolderId when navigating with a Node', () => {
|
||||
const node = new Node({ id: 'node-456', isFolder: true });
|
||||
|
||||
spyOn(documentList, 'canNavigateFolder').and.returnValue(true);
|
||||
documentList.filterValue = { name: 'test' };
|
||||
|
||||
const result = documentList.navigateTo(node);
|
||||
|
||||
expect(result).toBeTrue();
|
||||
expect(documentList.filterValue).toEqual({});
|
||||
expect(documentList.currentFolderId).toBe('node-456');
|
||||
});
|
||||
|
||||
it('should update sorting and call reload when sorting is changed and preserve filterValue', () => {
|
||||
const reloadSpy = spyOn(documentList, 'reload').and.callThrough();
|
||||
documentList.sortingMode = 'server';
|
||||
documentList.filterValue = { name: 'abc' };
|
||||
documentList.currentFolderId = 'folder-789';
|
||||
|
||||
const event = new CustomEvent('sortingChanged', {
|
||||
detail: { sortingKey: 'name', direction: 'asc' }
|
||||
});
|
||||
|
||||
documentList.onSortingChanged(event);
|
||||
|
||||
expect(documentList.sorting).toEqual(['name', 'asc']);
|
||||
expect(reloadSpy).toHaveBeenCalled();
|
||||
expect(documentList.filterValue).toEqual({ name: 'abc' });
|
||||
});
|
||||
|
||||
it('should require valid node for file preview', () => {
|
||||
const file = new FileNode();
|
||||
file.entry = null;
|
||||
@@ -1925,7 +1965,6 @@ describe('DocumentList', () => {
|
||||
});
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [CommonModule, DocumentListComponent, CustomLoadingContentTemplateDirective],
|
||||
template: `
|
||||
<adf-document-list #customDocumentList>
|
||||
|
||||
@@ -82,7 +82,7 @@ import { FileAutoDownloadComponent } from './file-auto-download/file-auto-downlo
|
||||
import { NodeEntityEvent, NodeEntryEvent } from './node.event';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FilterHeaderComponent } from './filter-header/filter-header.component';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { AlfrescoApiService } from '../../services/alfresco-api.service';
|
||||
@@ -92,14 +92,13 @@ const BYTES_TO_MB_CONVERSION_VALUE = 1048576;
|
||||
|
||||
@Component({
|
||||
selector: 'adf-document-list',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
DataTableComponent,
|
||||
FilterHeaderComponent,
|
||||
NoContentTemplateDirective,
|
||||
EmptyListComponent,
|
||||
TranslateModule,
|
||||
TranslatePipe,
|
||||
NoPermissionTemplateDirective,
|
||||
MatIconModule,
|
||||
LoadingContentTemplateDirective,
|
||||
@@ -719,6 +718,7 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On
|
||||
if (typeof node === 'string') {
|
||||
this.resetNewFolderPagination();
|
||||
this.currentFolderId = node;
|
||||
this.filterValue = {};
|
||||
this.folderChange.emit(new NodeEntryEvent({ id: node } as Node));
|
||||
this.reload();
|
||||
return true;
|
||||
@@ -726,6 +726,7 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On
|
||||
if (this.canNavigateFolder(node)) {
|
||||
this.resetNewFolderPagination();
|
||||
this.currentFolderId = this.getNodeFolderDestinationId(node);
|
||||
this.filterValue = {};
|
||||
this.folderChange.emit(new NodeEntryEvent({ id: this.currentFolderId } as Node));
|
||||
this.reload();
|
||||
return true;
|
||||
|
||||
+1
-2
@@ -20,7 +20,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { FileAutoDownloadComponent } from './file-auto-download.component';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { NoopTranslateModule } from '@alfresco/adf-core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { NodeDownloadDirective } from '../../../directives/node-download.directive';
|
||||
|
||||
@@ -35,7 +34,7 @@ describe('FileAutoDownloadComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [NoopTranslateModule, MatDialogModule, MatButtonModule, NodeDownloadDirective, FileAutoDownloadComponent],
|
||||
imports: [MatDialogModule, MatButtonModule, NodeDownloadDirective, FileAutoDownloadComponent],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: mockDialog },
|
||||
{ provide: MAT_DIALOG_DATA, useValue: null }
|
||||
|
||||
+2
-3
@@ -19,14 +19,13 @@ import { Component, Inject } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
||||
import { NodeEntry } from '@alfresco/js-api';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { NodeDownloadDirective } from '../../../directives/node-download.directive';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-file-auto-download',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatDialogModule, TranslateModule, MatButtonModule, NodeDownloadDirective],
|
||||
imports: [CommonModule, MatDialogModule, TranslatePipe, MatButtonModule, NodeDownloadDirective],
|
||||
templateUrl: './file-auto-download.component.html'
|
||||
})
|
||||
export class FileAutoDownloadComponent {
|
||||
|
||||
-1
@@ -26,7 +26,6 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-filter-header',
|
||||
standalone: true,
|
||||
imports: [CommonModule, HeaderFilterTemplateDirective, SearchFilterContainerComponent],
|
||||
templateUrl: './filter-header.component.html'
|
||||
})
|
||||
|
||||
+3
-5
@@ -19,16 +19,14 @@ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, Inp
|
||||
import { NodeEntry, Site } from '@alfresco/js-api';
|
||||
import { ShareDataRow } from '../../data/share-data-row.model';
|
||||
import { NodesApiService } from '../../../common/services/nodes-api.service';
|
||||
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AsyncPipe } from '@angular/common';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-library-name-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, TranslateModule],
|
||||
imports: [AsyncPipe, TranslatePipe],
|
||||
template: `
|
||||
<span
|
||||
role="link"
|
||||
|
||||
+3
-4
@@ -20,14 +20,13 @@ import { BehaviorSubject } from 'rxjs';
|
||||
import { Site } from '@alfresco/js-api';
|
||||
import { ShareDataRow } from '../../data/share-data-row.model';
|
||||
import { NodesApiService } from '../../../common/services/nodes-api.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AsyncPipe } from '@angular/common';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-library-role-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, TranslateModule],
|
||||
imports: [AsyncPipe, TranslatePipe],
|
||||
template: `
|
||||
<span class="adf-datatable-cell-value" title="{{ displayText$ | async | translate }}">
|
||||
{{ displayText$ | async | translate }}
|
||||
|
||||
+3
-4
@@ -20,14 +20,13 @@ import { NodesApiService } from '../../../common/services/nodes-api.service';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { Site } from '@alfresco/js-api';
|
||||
import { ShareDataRow } from '../../data/share-data-row.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AsyncPipe } from '@angular/common';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-library-status-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, TranslateModule],
|
||||
imports: [AsyncPipe, TranslatePipe],
|
||||
template: `
|
||||
<span class="adf-datatable-cell-value" title="{{ displayText$ | async | translate }}">
|
||||
{{ displayText$ | async | translate }}
|
||||
|
||||
+3
-4
@@ -20,15 +20,14 @@ import { NodeEntry } from '@alfresco/js-api';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { NodesApiService } from '../../../common/services/nodes-api.service';
|
||||
import { ShareDataRow } from '../../data/share-data-row.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AsyncPipe } from '@angular/common';
|
||||
import { TranslatePipe } from '@ngx-translate/core';
|
||||
import { NodeNameTooltipPipe } from '../../../pipes/node-name-tooltip.pipe';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-name-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, TranslateModule, NodeNameTooltipPipe],
|
||||
imports: [AsyncPipe, TranslatePipe, NodeNameTooltipPipe],
|
||||
template: `
|
||||
<span
|
||||
role="link"
|
||||
|
||||
-1
@@ -23,7 +23,6 @@ import { NodeNameTooltipPipe } from '../../../pipes/node-name-tooltip.pipe';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-trashcan-name-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, NodeNameTooltipPipe],
|
||||
template: `
|
||||
<ng-container *ngIf="!isLibrary">
|
||||
|
||||
@@ -116,7 +116,8 @@ export class CustomResourcesService {
|
||||
'-TYPE:"fm:topic"',
|
||||
'-TYPE:"fm:post"',
|
||||
'-TYPE:"ia:calendarEvent"',
|
||||
'-TYPE:"lnk:link"'
|
||||
'-TYPE:"lnk:link"',
|
||||
'-ASPECT:"app:linked"'
|
||||
];
|
||||
|
||||
return new Observable((observer) => {
|
||||
|
||||
@@ -21,12 +21,14 @@ import { MatDialog } from '@angular/material/dialog';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { Subject, of } from 'rxjs';
|
||||
import { FolderEditDirective } from './folder-edit.directive';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import type { Node } from '@alfresco/js-api';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { ContentService } from '../common/services/content.service';
|
||||
|
||||
@Component({
|
||||
template: '<div [adf-edit-folder]="folder" (success)="success($event)" title="edit-title"></div>'
|
||||
template: '<div [adf-edit-folder]="folder" (success)="success($event)" title="edit-title"></div>',
|
||||
standalone: true,
|
||||
imports: [FolderEditDirective]
|
||||
})
|
||||
class TestComponent {
|
||||
folder = {};
|
||||
@@ -51,8 +53,7 @@ describe('FolderEditDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule, FolderEditDirective],
|
||||
declarations: [TestComponent]
|
||||
imports: [ContentTestingModule, TestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(TestComponent);
|
||||
element = fixture.debugElement.query(By.directive(FolderEditDirective));
|
||||
|
||||
@@ -26,8 +26,7 @@ import { ContentService } from '../common/services/content.service';
|
||||
const DIALOG_WIDTH: number = 400;
|
||||
|
||||
@Directive({
|
||||
selector: '[adf-edit-folder]',
|
||||
standalone: true
|
||||
selector: '[adf-edit-folder]'
|
||||
})
|
||||
export class FolderEditDirective {
|
||||
/** Folder node to edit. */
|
||||
|
||||
@@ -183,7 +183,9 @@
|
||||
"ALREADY_EXISTS": "Kategorie ist bereits vorhanden",
|
||||
"DUPLICATED_CATEGORY": "Kategorie wurde bereits hinzugefügt",
|
||||
"CREATE_CATEGORIES": "Fehler beim Erstellen von Kategorien",
|
||||
"EXISTING_CATEGORIES": "Einige Kategorien sind bereits vorhanden"
|
||||
"EXISTING_CATEGORIES": "Einige Kategorien sind bereits vorhanden",
|
||||
"SPECIAL_CHARACTERS": "Kategoriename darf keine unzulässigen Zeichen enthalten",
|
||||
"ENDS_WITH_DOT": "Kategoriename darf nicht mit einem Punkt enden"
|
||||
},
|
||||
"CATEGORIES_SEARCH_PLACEHOLDER": "Kategorien suchen"
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user