mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2026-09-16 18:13:06 +00:00
Compare commits
104
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0baf221ce9 | ||
|
|
5e6e2b5949 | ||
|
|
0b90affea4 | ||
|
|
45834e20f9 | ||
|
|
f67a7d0721 | ||
|
|
4dd8367878 | ||
|
|
b2246cb148 | ||
|
|
fb3a9ca2c2 | ||
|
|
f15014f295 | ||
|
|
b28479b92b | ||
|
|
89380f2905 | ||
|
|
e5fcfde2ec | ||
|
|
2e10d2c5c7 | ||
|
|
96281d32a1 | ||
|
|
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 | ||
|
|
eda59a1de8 | ||
|
|
6d5cda887d | ||
|
|
3009fa6dec | ||
|
|
441a6aab19 | ||
|
|
47c1f92ed5 | ||
|
|
402725d179 | ||
|
|
8cfc8d32f2 | ||
|
|
cdc7553915 | ||
|
|
7a568baf72 | ||
|
|
f8a75d4af7 | ||
|
|
31c2cb2162 | ||
|
|
2c4764f89e | ||
|
|
e2693f9304 | ||
|
|
5d9acaec0d | ||
|
|
0c7bf62097 | ||
|
|
84116ad2bf | ||
|
|
cd6c41305a | ||
|
|
0c147513cc | ||
|
|
ac14541c2e | ||
|
|
920b7d3585 | ||
|
|
643b5f723a | ||
|
|
a6ab5fcbdd | ||
|
|
35970b4278 | ||
|
|
6f8762f46e | ||
|
|
379fbbb508 | ||
|
|
342f165b41 | ||
|
|
ecba77dfa9 | ||
|
|
a5b55c5861 | ||
|
|
2347ca68c4 | ||
|
|
cdb65bf204 | ||
|
|
8cb7a1719f | ||
|
|
1971980216 | ||
|
|
467a19f3ec | ||
|
|
d1e48f9c33 | ||
|
|
79163cbae0 | ||
|
|
5bbb5c5716 | ||
|
|
0018cd7f8f | ||
|
|
06921783bf | ||
|
|
1462560e6e |
@@ -1 +0,0 @@
|
||||
dist
|
||||
@@ -1,21 +0,0 @@
|
||||
name: "print affected libs"
|
||||
description: "Retrive the affected libs based on the based and head input"
|
||||
inputs:
|
||||
base:
|
||||
description: 'the base sha'
|
||||
required: true
|
||||
type: string
|
||||
default: main
|
||||
head:
|
||||
description: 'the head sha'
|
||||
required: true
|
||||
type: string
|
||||
default: HEAD
|
||||
output:
|
||||
affected:
|
||||
description: 'the affected libs of the repo'
|
||||
affected_is_empty:
|
||||
description: 'true or false accondingly'
|
||||
runs:
|
||||
using: "node16"
|
||||
main: 'dist/index.js'
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-521
@@ -1,521 +0,0 @@
|
||||
{
|
||||
"name": "print-affected-libs",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "print-affected-libs",
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.10.0",
|
||||
"@actions/exec": "^1.1.1",
|
||||
"@actions/github": "^6.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vercel/ncc": "^0.36.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/core": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/exec": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
|
||||
"integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
|
||||
"dependencies": {
|
||||
"@actions/io": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/github": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz",
|
||||
"integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/http-client": "^2.2.0",
|
||||
"@octokit/core": "^5.0.1",
|
||||
"@octokit/plugin-paginate-rest": "^9.0.0",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/http-client": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
|
||||
"integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"tunnel": "^0.0.6",
|
||||
"undici": "^5.25.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@actions/io": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
|
||||
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="
|
||||
},
|
||||
"node_modules/@fastify/busboy": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
||||
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/auth-token": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
|
||||
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/core": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz",
|
||||
"integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/auth-token": "^4.0.0",
|
||||
"@octokit/graphql": "^7.1.0",
|
||||
"@octokit/request": "^8.3.1",
|
||||
"@octokit/request-error": "^5.1.0",
|
||||
"@octokit/types": "^13.0.0",
|
||||
"before-after-hook": "^2.2.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/endpoint": {
|
||||
"version": "9.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz",
|
||||
"integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.1.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/graphql": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz",
|
||||
"integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/request": "^8.3.0",
|
||||
"@octokit/types": "^13.0.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/openapi-types": {
|
||||
"version": "23.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
|
||||
"integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest": {
|
||||
"version": "9.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz",
|
||||
"integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^12.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@octokit/core": "5"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
|
||||
"version": "20.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
|
||||
"version": "12.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^20.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
||||
"version": "10.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
|
||||
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^12.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@octokit/core": "5"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
|
||||
"version": "20.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
|
||||
"version": "12.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^20.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request": {
|
||||
"version": "8.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz",
|
||||
"integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/endpoint": "^9.0.1",
|
||||
"@octokit/request-error": "^5.1.0",
|
||||
"@octokit/types": "^13.1.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request-error": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz",
|
||||
"integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.1.0",
|
||||
"deprecation": "^2.0.0",
|
||||
"once": "^1.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/types": {
|
||||
"version": "13.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
|
||||
"integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": "^23.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@vercel/ncc": {
|
||||
"version": "0.36.1",
|
||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz",
|
||||
"integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"ncc": "dist/ncc/cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/before-after-hook": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
|
||||
"integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/deprecation": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
|
||||
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
|
||||
"engines": {
|
||||
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
|
||||
}
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "5.29.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
|
||||
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fastify/busboy": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/universal-user-agent": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
|
||||
"integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||
"license": "ISC"
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@actions/core": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^2.0.1",
|
||||
"uuid": "^8.3.2"
|
||||
}
|
||||
},
|
||||
"@actions/exec": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
|
||||
"integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
|
||||
"requires": {
|
||||
"@actions/io": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"@actions/github": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz",
|
||||
"integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==",
|
||||
"requires": {
|
||||
"@actions/http-client": "^2.2.0",
|
||||
"@octokit/core": "^5.0.1",
|
||||
"@octokit/plugin-paginate-rest": "^9.0.0",
|
||||
"@octokit/plugin-rest-endpoint-methods": "^10.0.0"
|
||||
}
|
||||
},
|
||||
"@actions/http-client": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
|
||||
"integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
|
||||
"requires": {
|
||||
"tunnel": "^0.0.6",
|
||||
"undici": "^5.25.4"
|
||||
}
|
||||
},
|
||||
"@actions/io": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
|
||||
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="
|
||||
},
|
||||
"@fastify/busboy": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
||||
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="
|
||||
},
|
||||
"@octokit/auth-token": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
|
||||
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA=="
|
||||
},
|
||||
"@octokit/core": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz",
|
||||
"integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==",
|
||||
"requires": {
|
||||
"@octokit/auth-token": "^4.0.0",
|
||||
"@octokit/graphql": "^7.1.0",
|
||||
"@octokit/request": "^8.3.1",
|
||||
"@octokit/request-error": "^5.1.0",
|
||||
"@octokit/types": "^13.0.0",
|
||||
"before-after-hook": "^2.2.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/endpoint": {
|
||||
"version": "9.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz",
|
||||
"integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==",
|
||||
"requires": {
|
||||
"@octokit/types": "^13.1.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/graphql": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz",
|
||||
"integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==",
|
||||
"requires": {
|
||||
"@octokit/request": "^8.3.0",
|
||||
"@octokit/types": "^13.0.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/openapi-types": {
|
||||
"version": "23.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
|
||||
"integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g=="
|
||||
},
|
||||
"@octokit/plugin-paginate-rest": {
|
||||
"version": "9.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz",
|
||||
"integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==",
|
||||
"requires": {
|
||||
"@octokit/types": "^12.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": {
|
||||
"version": "20.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
|
||||
},
|
||||
"@octokit/types": {
|
||||
"version": "12.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||
"requires": {
|
||||
"@octokit/openapi-types": "^20.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@octokit/plugin-rest-endpoint-methods": {
|
||||
"version": "10.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
|
||||
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
|
||||
"requires": {
|
||||
"@octokit/types": "^12.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/openapi-types": {
|
||||
"version": "20.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
|
||||
},
|
||||
"@octokit/types": {
|
||||
"version": "12.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||
"requires": {
|
||||
"@octokit/openapi-types": "^20.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@octokit/request": {
|
||||
"version": "8.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz",
|
||||
"integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==",
|
||||
"requires": {
|
||||
"@octokit/endpoint": "^9.0.1",
|
||||
"@octokit/request-error": "^5.1.0",
|
||||
"@octokit/types": "^13.1.0",
|
||||
"universal-user-agent": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@octokit/request-error": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz",
|
||||
"integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==",
|
||||
"requires": {
|
||||
"@octokit/types": "^13.1.0",
|
||||
"deprecation": "^2.0.0",
|
||||
"once": "^1.4.0"
|
||||
}
|
||||
},
|
||||
"@octokit/types": {
|
||||
"version": "13.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
|
||||
"integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
|
||||
"requires": {
|
||||
"@octokit/openapi-types": "^23.0.1"
|
||||
}
|
||||
},
|
||||
"@vercel/ncc": {
|
||||
"version": "0.36.1",
|
||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz",
|
||||
"integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==",
|
||||
"dev": true
|
||||
},
|
||||
"before-after-hook": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
|
||||
"integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
|
||||
},
|
||||
"deprecation": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
|
||||
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"tunnel": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||
"integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
|
||||
},
|
||||
"undici": {
|
||||
"version": "5.29.0",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
|
||||
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
|
||||
"requires": {
|
||||
"@fastify/busboy": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"universal-user-agent": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
|
||||
"integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"name": "print-affected-libs",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "dist/index.js",
|
||||
"scripts": {
|
||||
"build": "ncc build src/index.js -o dist --source-map"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.10.0",
|
||||
"@actions/exec": "^1.1.1",
|
||||
"@actions/github": "^6.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vercel/ncc": "^0.36.1"
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
const core = require('@actions/core');
|
||||
const exec = require('@actions/exec');
|
||||
|
||||
async function run() {
|
||||
const base = core.getInput('base', {required: false }) || '5288597580';
|
||||
core.setOutput('affected_is_empty', 'true');
|
||||
|
||||
let affected = '';
|
||||
let myError = '';
|
||||
|
||||
const options = {};
|
||||
options.listeners = {
|
||||
stdout: (data) => {
|
||||
affected += data.toString()
|
||||
},
|
||||
stderr: (data) => {
|
||||
myError += data.toString();
|
||||
}
|
||||
};
|
||||
|
||||
await exec.exec(`npx nx print-affected --target=build --select=tasks.target.project --base=${base} --head=${head}`, [], options)
|
||||
|
||||
const affectedTrimmed = affected.trim();
|
||||
if (affectedTrimmed !== '') {
|
||||
core.setOutput('affected_is_empty', 'false');
|
||||
}
|
||||
core.notice(`Retriving affected libs: ${affectedTrimmed}`);
|
||||
|
||||
core.setOutput('affected', affectedTrimmed);
|
||||
}
|
||||
|
||||
run();
|
||||
@@ -26,7 +26,7 @@ runs:
|
||||
cache-dependency-path: package-lock.json
|
||||
- name: get latest tag sha
|
||||
id: tag-sha
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/git-latest-tag@95f68dc050fba62b3331d9b47bc659526cdfb343 # v8.21.1
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/git-latest-tag@20d21f43addae05442096a7e935dc2b321361501 # v8.27.0
|
||||
# CACHE
|
||||
- name: Node Modules cache
|
||||
id: node-modules-cache
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
name: Identify the slack group
|
||||
description: 'Identify the slack group area based on the affected'
|
||||
|
||||
inputs:
|
||||
affected:
|
||||
description: 'The name of the affected lib'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
outputs:
|
||||
groups:
|
||||
description: "the slack groups"
|
||||
value: ${{ steps.group.outputs.result }}
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
|
||||
steps:
|
||||
- name: Append group
|
||||
id: group
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
env:
|
||||
affectedLib: ${{ inputs.affected }}
|
||||
with:
|
||||
script: |
|
||||
const affectedLib = process.env.affectedLib;
|
||||
core.info(`Input ${affectedLib}`);
|
||||
|
||||
const slackGroups = new Set();
|
||||
const AlfrescoQAGroup = '@alfresco-testing-qa';
|
||||
const HxpQAGroup = '@hxp-studio-qa-group';
|
||||
|
||||
const libs = affectedLib.split(' ')
|
||||
|
||||
if (libs.includes('content-services') || libs.includes('process-services')) {
|
||||
slackGroups.add(AlfrescoQAGroup);
|
||||
}
|
||||
if (libs.includes('process-services-cloud')) {
|
||||
slackGroups.add(HxpQAGroup);
|
||||
}
|
||||
if (libs.includes('core')) {
|
||||
slackGroups.add(AlfrescoQAGroup);
|
||||
slackGroups.add(HxpQAGroup);
|
||||
}
|
||||
|
||||
const result = Array.from(slackGroups.values()).join(' ');
|
||||
core.info(`Result ${result}`);
|
||||
return result;
|
||||
|
||||
@@ -50,10 +50,6 @@ updates:
|
||||
directory: "/.github/actions/npm-check-bundle"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/.github/actions/print-affected-libs"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/.github/actions/set-npm-tag"
|
||||
schedule:
|
||||
@@ -62,10 +58,6 @@ updates:
|
||||
directory: "/.github/actions/setup"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/.github/actions/slack-group-area"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/.github/actions/upload-node-modules-and-artifacts"
|
||||
schedule:
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
|
||||
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@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
|
||||
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@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18
|
||||
uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: Pull translations from Crowdin
|
||||
uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0
|
||||
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@95f68dc050fba62b3331d9b47bc659526cdfb343 # v8.21.1
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-branch-name@20d21f43addae05442096a7e935dc2b321361501 # v8.27.0
|
||||
|
||||
- name: Save commit message
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-commit-message@95f68dc050fba62b3331d9b47bc659526cdfb343 # v8.21.1
|
||||
uses: Alfresco/alfresco-build-tools/.github/actions/get-commit-message@20d21f43addae05442096a7e935dc2b321361501 # v8.27.0
|
||||
|
||||
- name: ci:force flag parser
|
||||
shell: bash
|
||||
@@ -270,27 +270,10 @@ jobs:
|
||||
name: Final Results
|
||||
needs: [check-if-pr-is-approved, pre-checks, setup, unit-tests, lint, build-libs]
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- name: identify-slack-group
|
||||
id: groups
|
||||
if: ${{ github.event_name == 'schedule' }}
|
||||
uses: ./.github/actions/slack-group-area
|
||||
with:
|
||||
affected: ${{ steps.e2e-result.outputs.result }}
|
||||
- uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0
|
||||
name: Nofify QA failure
|
||||
if: ${{ github.event_name == 'schedule' && contains(needs.*.result, 'failure') }}
|
||||
env:
|
||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
|
||||
with:
|
||||
channel-id: 'C016SMNNL8L' #guild-channel
|
||||
slack-message: "🔴 Warning: The daily ADF cronjob failed\nWorkflow run : <https://github.com/Alfresco/alfresco-ng2-components/actions/runs/${{ github.run_id }}| here>\nDetails: ${{ steps.e2e-result.outputs.result }}\nArea: ${{ steps.groups.outputs.groups}}"
|
||||
- name: workflow failure
|
||||
- name: Check job execution status
|
||||
if: >-
|
||||
${{
|
||||
contains(needs.*.result, 'failure')
|
||||
|| contains(needs.*.result, 'cancelled')
|
||||
}}
|
||||
run: exit 1
|
||||
if: ${{ contains(needs.*.result, 'failure') }}
|
||||
- name: workflow canceled
|
||||
run: exit 1
|
||||
if: ${{ contains(needs.*.result, 'cancelled') }}
|
||||
- name: workflow success
|
||||
run: exit 0
|
||||
if: ${{ contains(needs.*.result, 'success') }}
|
||||
|
||||
@@ -215,7 +215,7 @@ jobs:
|
||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- name: Push Source Files to Crowdin
|
||||
uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0
|
||||
uses: crowdin/github-action@9fd07c1c5b36b15f082d1d860dc399f16f849bd7 # v2.9.0
|
||||
with:
|
||||
upload_sources: true
|
||||
upload_sources_args: --delete-obsolete
|
||||
@@ -228,12 +228,10 @@ jobs:
|
||||
name: Final Results
|
||||
needs: [release-storybook, release-npm, npm-check-bundle]
|
||||
steps:
|
||||
|
||||
- uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0
|
||||
name: Nofify FE eng-guild-front-end workflow failed
|
||||
if: ${{ contains(toJson(needs.*.result), 'failure') }}
|
||||
env:
|
||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
|
||||
with:
|
||||
channel-id: 'C016SMNNL8L' #eng-guild-front-end
|
||||
slack-message: "🔴 Warning: The release workflow of alfresco-ng2-components pipe failed\n Author username: ${{ github.event.pull_request.user.login }}\n Workflow run <https://github.com/Alfresco/alfresco-ng2-components/actions/runs/${{ github.run_id }}| here>\n>"
|
||||
- name: Check job execution status
|
||||
if: >-
|
||||
${{
|
||||
contains(needs.*.result, 'failure')
|
||||
|| contains(needs.*.result, 'cancelled')
|
||||
}}
|
||||
run: exit 1
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
# Migrating from Angular 17 to Angular 18
|
||||
|
||||
This guide describes how to migrate ADF from Angular version 17 to version 18. Follow these steps to ensure a smooth transition.
|
||||
|
||||
## 1. Update changed dependencies
|
||||
|
||||
Update the following packages in your `package.json`:
|
||||
|
||||
### dependencies
|
||||
|
||||
```json
|
||||
{
|
||||
"@angular/animations": "18.2.13",
|
||||
"@angular/cdk": "18.2.14",
|
||||
"@angular/common": "18.2.13",
|
||||
"@angular/compiler": "18.2.13",
|
||||
"@angular/core": "18.2.13",
|
||||
"@angular/forms": "18.2.13",
|
||||
"@angular/material": "18.2.14",
|
||||
"@angular/material-date-fns-adapter": "18.2.14",
|
||||
"@angular/platform-browser": "18.2.13",
|
||||
"@angular/platform-browser-dynamic": "18.2.13",
|
||||
"@angular/router": "18.2.13",
|
||||
"@apollo/client": "3.13.1",
|
||||
"@mat-datetimepicker/core": "14.0.0",
|
||||
"apollo-angular": "10.0.3",
|
||||
"minimatch-browser": "1.0.0",
|
||||
"node-fetch": "^3.3.2",
|
||||
"zone.js": "0.14.10"
|
||||
}
|
||||
```
|
||||
|
||||
### devDependencies
|
||||
|
||||
```json
|
||||
{
|
||||
"@angular-devkit/architect": "0.1802.13",
|
||||
"@angular-devkit/build-angular": "18.2.14",
|
||||
"@angular-devkit/core": "18.2.13",
|
||||
"@angular-devkit/schematics": "18.2.13",
|
||||
"@angular/compiler-cli": "18.2.13",
|
||||
"@nx/angular": "19.2.0",
|
||||
"@nx/js": "18.3.5",
|
||||
"@nx/workspace": "18.3.5",
|
||||
"@storybook/angular": "8.4.7",
|
||||
"ng-packagr": "18.2.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss": "8.4.41",
|
||||
"postcss-sass": "^0.5.0",
|
||||
"tsconfig-paths": "^4.1.1",
|
||||
"typescript": "5.5.4",
|
||||
"webpack-cli": "^5.1.4"
|
||||
}
|
||||
```
|
||||
|
||||
## 2. Material mixins update
|
||||
|
||||
Angular Material 18 introduced Material 3 mixins as new default. As we are still using Material 2, we need to ensure that we are still using the Material 2 version.
|
||||
|
||||
In order to use Material 2 mixins, you need to add a `m2-` prefix to the mixins in your stylesheets. For example:
|
||||
|
||||
```scss
|
||||
mat.define-typography-config()
|
||||
mat.get-color-from-palette()
|
||||
```
|
||||
|
||||
should be changed to:
|
||||
|
||||
```scss
|
||||
mat.m2-define-typography-config()
|
||||
mat.m2-get-color-from-palette()
|
||||
```
|
||||
|
||||
## 3. Fixing CI/CD issues
|
||||
|
||||
After running the migration script, you may need to manually fix some issues. Run common build targets to identify any problems.
|
||||
|
||||
```bash
|
||||
npx nx run-many --target=build --skip-nx-cache
|
||||
```
|
||||
|
||||
If blocked by linting issues, disable the linting rules in the affected files. You can re-enable them in the next step.
|
||||
|
||||
### Lint jobs
|
||||
|
||||
After getting the build to work, run the lint jobs. Re-enable previously disabled linting rules and fix any issues that arise.
|
||||
|
||||
```bash
|
||||
npx nx run-many --target=lint --skip-nx-cache
|
||||
```
|
||||
|
||||
### Unit tests
|
||||
|
||||
Run the unit tests and fix any problems that arise.
|
||||
|
||||
```bash
|
||||
npx nx run-many --target=test --skip-nx-cache
|
||||
```
|
||||
|
||||
## 4. Review Angular 18 breaking changes
|
||||
|
||||
Angular 18 is a minor update with no major breaking changes for most projects. However, always review the [Angular 18 changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) and [official update guide](https://angular.dev/update-guide?v=17.0-18.0).
|
||||
@@ -245,16 +245,17 @@ The Viewer supports dynamically-loaded viewer preview extensions, to know more a
|
||||
|
||||
You can define your own custom handler to override supported file formats or handle other file formats that are not yet supported by
|
||||
the component. Below is an example that shows how to use the `adf-viewer-extension`
|
||||
to handle 3D data files:
|
||||
to handle 3D data files. `contentLoaded` should be an `EventEmitter` that will emit as soon as the component responsible for rendering finishes.
|
||||
|
||||
```html
|
||||
<adf-alfresco-viewer [nodeId]="nodeId">
|
||||
<ng-template #viewerExtensions>
|
||||
<adf-viewer-extension [supportedExtensions]="['obj','3ds']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent" let-extension="extension">
|
||||
<ng-template let-urlFileContent="urlFileContent" let-extension="extension" let-markAsLoaded="markAsLoaded">
|
||||
<threed-viewer
|
||||
[urlFile]="urlFileContent"
|
||||
[extension]="extension">
|
||||
[extension]="extension"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</threed-viewer>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
@@ -270,17 +271,19 @@ You need to keep all instances of `adf-viewer-extension` inside `viewerExtension
|
||||
<adf-alfresco-viewer [nodeId]="nodeId">
|
||||
<ng-template #viewerExtensions>
|
||||
<adf-viewer-extension [supportedExtensions]="['xls','xlsx']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent">
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded">
|
||||
<my-custom-xls-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-xls-component>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
|
||||
<adf-viewer-extension [supportedExtensions]="['txt']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent" >
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded">
|
||||
<my-custom-txt-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-txt-component>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
|
||||
@@ -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. |
|
||||
|
||||
@@ -2,55 +2,432 @@
|
||||
Title: About Component
|
||||
Added: v3.5.0
|
||||
Status: Active
|
||||
Last reviewed: 2022-11-11
|
||||
Last reviewed: 2025-07-23
|
||||
---
|
||||
|
||||
# [About Component](../../../lib/core/src/lib/about/about.component.ts "Defined in about.component.ts")
|
||||
# About Component
|
||||
|
||||
Presentational component to display About information as a set of collapsible panels.
|
||||
A flexible presentational component that displays information in collapsible accordion panels. The About Component is ideal for organizing application information, settings, or any content that benefits from a collapsible interface structure.
|
||||
|
||||
## Overview
|
||||
|
||||
The About Component creates an accordion-style interface using Angular Material's expansion panels. Each panel can contain any content and can be conditionally displayed. This component is commonly used for:
|
||||
|
||||
- Application information and version details
|
||||
- Feature lists and documentation
|
||||
- Settings panels
|
||||
- Help and support sections
|
||||
- Plugin or extension information
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before using the About Component, ensure you have imported the necessary modules:
|
||||
|
||||
```typescript
|
||||
import { AboutComponent } from '@alfresco/adf-core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
@Component({
|
||||
selector: 'app-example',
|
||||
imports: [CommonModule, AboutComponent],
|
||||
template: `
|
||||
<!-- Your template here -->
|
||||
`
|
||||
})
|
||||
export class ExampleComponent {
|
||||
// Component logic
|
||||
}
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### AboutComponent
|
||||
|
||||
| Property | Type | Description |
|
||||
|----------|------|-------------|
|
||||
| `panels` | `QueryList<AboutPanelDirective>` | Content children representing the panels to display |
|
||||
|
||||
### AboutPanelDirective (adf-about-panel)
|
||||
|
||||
| Property | Type | Required | Default | Description |
|
||||
|----------|------|----------|---------|-------------|
|
||||
| `label` | `string` | Yes | - | The title text displayed in the panel header |
|
||||
| `automationId` | `string` | No | - | Data automation ID for testing purposes |
|
||||
|
||||
## Basic Usage
|
||||
|
||||
### Simple Panel Structure
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<adf-about-panel [label]="'Panel 1'">
|
||||
<adf-about-panel [label]="'Application Information'">
|
||||
<ng-template>
|
||||
<your-components></your-components>
|
||||
<div class="about-content">
|
||||
<h3>My Application</h3>
|
||||
<p>Version: 1.0.0</p>
|
||||
<p>Built with Angular and ADF</p>
|
||||
</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<adf-about-panel [label]="'Panel 2'">
|
||||
<adf-about-panel [label]="'Features'">
|
||||
<ng-template>
|
||||
<your-components></your-components>
|
||||
<ul>
|
||||
<li>Document management</li>
|
||||
<li>User authentication</li>
|
||||
<li>Process workflows</li>
|
||||
</ul>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
## Conditional Display
|
||||
|
||||
You can wire each panel with the `*ngIf` conditions:
|
||||
### Using Automation IDs for Testing
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<adf-about-panel *ngIf="devMode" [label]="'Panel 1'">
|
||||
<adf-about-panel
|
||||
[label]="'System Information'"
|
||||
automationId="system-info-panel">
|
||||
<ng-template>
|
||||
<your-components></your-components>
|
||||
<your-system-info-component></your-system-info-component>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
Where `devMode` is an example of an input property exposed by your component.
|
||||
## Advanced Usage
|
||||
|
||||
Observables are also supported:
|
||||
### Conditional Panel Display
|
||||
|
||||
You can control panel visibility using Angular's structural directives:
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<adf-about-panel *ngIf="extensions$ | async as extensions" [label]="'ABOUT.PLUGINS.TITLE' | translate">
|
||||
<!-- Show panel only in development mode -->
|
||||
<adf-about-panel
|
||||
*ngIf="isDevelopmentMode"
|
||||
[label]="'Debug Information'"
|
||||
automationId="debug-panel">
|
||||
<ng-template>
|
||||
<div class="debug-info">
|
||||
<h4>Debug Tools</h4>
|
||||
<button (click)="clearCache()">Clear Cache</button>
|
||||
<button (click)="showLogs()">View Logs</button>
|
||||
</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<!-- Always visible panel -->
|
||||
<adf-about-panel [label]="'General Information'">
|
||||
<ng-template>
|
||||
<app-general-info></app-general-info>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
### Working with Observables and Async Data
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<!-- Panel with async data -->
|
||||
<adf-about-panel
|
||||
*ngIf="extensions$ | async as extensions"
|
||||
[label]="'ABOUT.PLUGINS.TITLE' | translate"
|
||||
automationId="extensions-panel">
|
||||
<ng-template>
|
||||
<adf-about-extension-list [data]="extensions"></adf-about-extension-list>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<!-- Panel with multiple conditions -->
|
||||
<adf-about-panel
|
||||
*ngIf="userPermissions$ | async as permissions; else noPermissions"
|
||||
[label]="'User Permissions'"
|
||||
automationId="permissions-panel">
|
||||
<ng-template>
|
||||
<div *ngFor="let permission of permissions" class="permission-item">
|
||||
{{ permission.name }}: {{ permission.granted ? 'Granted' : 'Denied' }}
|
||||
</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<ng-template #noPermissions>
|
||||
<adf-about-panel [label]="'Permissions'">
|
||||
<ng-template>
|
||||
<p>Loading permissions...</p>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</ng-template>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
### Dynamic Panel Generation
|
||||
|
||||
```typescript
|
||||
// Component logic
|
||||
export class MyAboutComponent {
|
||||
isDevelopmentMode = environment.production === false;
|
||||
|
||||
extensions$ = this.extensionService.getExtensions();
|
||||
userPermissions$ = this.authService.getUserPermissions();
|
||||
|
||||
panels = [
|
||||
{
|
||||
label: 'System Info',
|
||||
content: 'system-info',
|
||||
show: true
|
||||
},
|
||||
{
|
||||
label: 'Debug Tools',
|
||||
content: 'debug-tools',
|
||||
show: this.isDevelopmentMode
|
||||
}
|
||||
];
|
||||
|
||||
clearCache(): void {
|
||||
// Clear cache implementation
|
||||
}
|
||||
|
||||
showLogs(): void {
|
||||
// Show logs implementation
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```html
|
||||
<!-- Template using dynamic panels -->
|
||||
<adf-about>
|
||||
<adf-about-panel
|
||||
*ngFor="let panel of panels"
|
||||
[label]="panel.label"
|
||||
[automationId]="panel.content + '-panel'"
|
||||
*ngIf="panel.show">
|
||||
<ng-template>
|
||||
<ng-container [ngSwitch]="panel.content">
|
||||
<app-system-info *ngSwitchCase="'system-info'"></app-system-info>
|
||||
<app-debug-tools *ngSwitchCase="'debug-tools'"></app-debug-tools>
|
||||
</ng-container>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
## Styling and Customization
|
||||
|
||||
### CSS Classes
|
||||
|
||||
The About Component uses these CSS classes that you can customize:
|
||||
|
||||
- `.adf-about-panel` - Main accordion container
|
||||
- `.adf-about-panel-header` - Panel header styling
|
||||
- `.adf-about-panel-header__title` - Panel title styling
|
||||
|
||||
### Custom Styling Example
|
||||
|
||||
```scss
|
||||
// Custom panel styling
|
||||
.adf-about-panel {
|
||||
.mat-expansion-panel {
|
||||
margin-bottom: 8px;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
|
||||
&:not(.mat-expanded) {
|
||||
.mat-expansion-panel-header {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.adf-about-panel-header__title {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
// Custom content styling
|
||||
.about-content {
|
||||
padding: 16px 0;
|
||||
|
||||
h3 {
|
||||
margin-top: 0;
|
||||
color: #1976d2;
|
||||
}
|
||||
|
||||
.permission-item {
|
||||
padding: 4px 0;
|
||||
border-bottom: 1px solid #eee;
|
||||
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Accessibility Features
|
||||
|
||||
The About Component inherits accessibility features from Angular Material's expansion panels:
|
||||
|
||||
- **Keyboard Navigation**: Use Tab to navigate between panels, Enter/Space to expand/collapse
|
||||
- **Screen Reader Support**: Panels are properly labeled and state changes are announced
|
||||
- **ARIA Attributes**: Proper ARIA attributes are automatically applied
|
||||
- **Focus Management**: Focus is managed correctly when panels are expanded/collapsed
|
||||
|
||||
### Enhancing Accessibility
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<adf-about-panel
|
||||
[label]="'System Information'"
|
||||
automationId="system-info-panel"
|
||||
role="region"
|
||||
[attr.aria-label]="'System information panel'">
|
||||
<ng-template>
|
||||
<div role="tabpanel" aria-live="polite">
|
||||
<h3 id="system-heading">Current System Status</h3>
|
||||
<p aria-describedby="system-heading">
|
||||
All systems are operational.
|
||||
</p>
|
||||
</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Testing Example
|
||||
|
||||
```typescript
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { AboutComponent } from '@alfresco/adf-core';
|
||||
import { DebugElement } from '@angular/core';
|
||||
import { By } from '@angular/platform-browser';
|
||||
|
||||
describe('AboutComponent', () => {
|
||||
let component: AboutComponent;
|
||||
let fixture: ComponentFixture<AboutComponent>;
|
||||
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
imports: [AboutComponent]
|
||||
}).compileComponents();
|
||||
|
||||
fixture = TestBed.createComponent(AboutComponent);
|
||||
component = fixture.componentInstance;
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should display panels with correct labels', () => {
|
||||
const panels = fixture.debugElement.queryAll(
|
||||
By.css('[data-automation-id="system-info-panel"]')
|
||||
);
|
||||
expect(panels.length).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### E2E Testing with Automation IDs
|
||||
|
||||
```typescript
|
||||
// Page object example
|
||||
export class AboutPage {
|
||||
async expandPanel(automationId: string): Promise<void> {
|
||||
const panel = element(by.css(`[data-automation-id="${automationId}"]`));
|
||||
const header = panel.element(by.css('.mat-expansion-panel-header'));
|
||||
await header.click();
|
||||
}
|
||||
|
||||
async isPanelExpanded(automationId: string): Promise<boolean> {
|
||||
const panel = element(by.css(`[data-automation-id="${automationId}"]`));
|
||||
const classes = await panel.getAttribute('class');
|
||||
return classes.includes('mat-expanded');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Use Descriptive Labels
|
||||
|
||||
```html
|
||||
<!-- Good: Descriptive and clear -->
|
||||
<adf-about-panel [label]="'Application Version Information'">
|
||||
|
||||
<!-- Avoid: Vague labels -->
|
||||
<adf-about-panel [label]="'Info'">
|
||||
```
|
||||
|
||||
### 2. Provide Automation IDs for Testing
|
||||
|
||||
```html
|
||||
<!-- Always include automation IDs for testing -->
|
||||
<adf-about-panel
|
||||
[label]="'User Settings'"
|
||||
automationId="user-settings-panel">
|
||||
```
|
||||
|
||||
### 3. Handle Loading States
|
||||
|
||||
```html
|
||||
<adf-about-panel
|
||||
*ngIf="data$ | async as data; else loadingPanel"
|
||||
[label]="'Dynamic Content'">
|
||||
<ng-template>
|
||||
<div>{{ data.content }}</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<ng-template #loadingPanel>
|
||||
<adf-about-panel [label]="'Loading...'">
|
||||
<ng-template>
|
||||
<mat-spinner diameter="20"></mat-spinner>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</ng-template>
|
||||
```
|
||||
|
||||
### 4. Organize Related Information
|
||||
|
||||
Group related information into logical panels to improve user experience and information architecture.
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Application Information Dashboard
|
||||
|
||||
```html
|
||||
<adf-about>
|
||||
<adf-about-panel [label]="'Application Details'" automationId="app-details">
|
||||
<ng-template>
|
||||
<div class="app-info">
|
||||
<h3>{{ appName }}</h3>
|
||||
<p>Version: {{ appVersion }}</p>
|
||||
<p>Build: {{ buildNumber }}</p>
|
||||
<p>Environment: {{ environment }}</p>
|
||||
</div>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
|
||||
<adf-about-panel [label]="'Dependencies'" automationId="dependencies">
|
||||
<ng-template>
|
||||
<ul>
|
||||
<li *ngFor="let dep of dependencies">
|
||||
{{ dep.name }}: {{ dep.version }}
|
||||
</li>
|
||||
</ul>
|
||||
</ng-template>
|
||||
</adf-about-panel>
|
||||
</adf-about>
|
||||
```
|
||||
|
||||
## See Also
|
||||
|
||||
- [Angular Material Expansion Panel](https://material.angular.io/components/expansion/overview)
|
||||
- [ADF Core Components](../README.md)
|
||||
- [Accessibility Guidelines](../../user-guide/accessibility.md)
|
||||
|
||||
@@ -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. |
|
||||
|
||||
@@ -206,22 +206,24 @@ The Viewer supports dynamically-loaded viewer preview extensions, to know more a
|
||||
#### Code extension mechanism
|
||||
|
||||
You can define your own custom handler to override supported file formats or handle other file formats that are not yet supported by
|
||||
the [Viewer render component](viewer.component.md). In order to do that first you need to define a template containing at least one `adf-viewer-extension`:
|
||||
the [Viewer render component](viewer.component.md). In order to do that first you need to define a template containing at least one `adf-viewer-extension`. `contentLoaded` should be an `EventEmitter` that will emit as soon as the component responsible for rendering finishes.
|
||||
|
||||
```html
|
||||
<ng-template #viewerExtensions>
|
||||
<adf-viewer-extension [supportedExtensions]="['xls','xlsx']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent">
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded">
|
||||
<my-custom-xls-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-xls-component>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
|
||||
<adf-viewer-render-extension [supportedExtensions]="['txt']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent" >
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded">
|
||||
<my-custom-txt-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-txt-component>
|
||||
</ng-template>
|
||||
</adf-viewer-render-extension>
|
||||
|
||||
@@ -215,16 +215,17 @@ The Viewer supports dynamically-loaded viewer preview extensions, to know more a
|
||||
|
||||
You can define your own custom handler to override supported file formats or handle other file formats that are not yet supported by
|
||||
the [Viewer component](viewer.component.md). Below is an example that shows how to use the `adf-viewer-extension`
|
||||
to handle 3D data files:
|
||||
to handle 3D data files. `contentLoaded` should be an `EventEmitter` that will emit as soon as the component responsible for rendering finishes.
|
||||
|
||||
```html
|
||||
<adf-viewer [urlFile]="urlFile">
|
||||
<ng-template #viewerExtensions>
|
||||
<adf-viewer-extension [supportedExtensions]="['obj','3ds']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent" let-extension="extension">
|
||||
<ng-template let-urlFileContent="urlFileContent" let-extension="extension" let-markAsLoaded="markAsLoaded">
|
||||
<threed-viewer
|
||||
[urlFile]="urlFileContent"
|
||||
[extension]="extension">
|
||||
[extension]="extension"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</threed-viewer>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
@@ -239,17 +240,19 @@ You need to keep all instances of `adf-viewer-extension` inside `viewerExtension
|
||||
<adf-viewer [urlFile]="urlFile">
|
||||
<ng-template #viewerExtensions>
|
||||
<adf-viewer-extension [supportedExtensions]="['xls','xlsx']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent">
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded">
|
||||
<my-custom-xls-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-xls-component>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
|
||||
<adf-viewer-extension [supportedExtensions]="['txt']" #extension>
|
||||
<ng-template let-urlFileContent="urlFileContent" >
|
||||
<ng-template let-urlFileContent="urlFileContent" let-markAsLoaded="markAsLoaded" >
|
||||
<my-custom-txt-component
|
||||
urlFileContent="urlFileContent">
|
||||
urlFileContent="urlFileContent"
|
||||
(contentLoaded)="markAsLoaded()">
|
||||
</my-custom-txt-component>
|
||||
</ng-template>
|
||||
</adf-viewer-extension>
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
Title: Authentication Service
|
||||
Added: v2.0.0
|
||||
Status: Active
|
||||
Last reviewed: 2019-03-19
|
||||
Last reviewed: 2025-06-12
|
||||
---
|
||||
|
||||
# [Authentication Service](../../../lib/core/src/lib/auth/services/authentication.service.ts "Defined in authentication.service.ts")
|
||||
# Authentication Service
|
||||
|
||||
Provides authentication to ACS and APS.
|
||||
|
||||
@@ -13,103 +13,57 @@ Provides authentication to ACS and APS.
|
||||
|
||||
### Methods
|
||||
|
||||
- **addTokenToHeader**(headersArg?: `HttpHeaders`): [`Observable`](http://reactivex.io/documentation/observable.html)`<HttpHeaders>`<br/>
|
||||
- **addTokenToHeader**(requestUrl: `string`, headersArg?: `HttpHeaders`): [`Observable`](http://reactivex.io/documentation/observable.html)`<HttpHeaders>`<br/>
|
||||
Adds the auth token to an HTTP header using the 'bearer' scheme.
|
||||
- _requestUrl:_ `string` - The URL of the request for which to set authentication headers.
|
||||
- _headersArg:_ `HttpHeaders` - (Optional) Header that will receive the token
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<HttpHeaders>` - The new header with the token added
|
||||
- **getBearerExcludedUrls**()<br/>
|
||||
Gets the set of URLs that the token bearer is excluded from.
|
||||
- **getBpmLoggedUser**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserRepresentation`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/activiti-rest-api/docs/UserRepresentation.md)`>`<br/>
|
||||
Gets information about the user currently logged into APS.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`UserRepresentation`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/activiti-rest-api/docs/UserRepresentation.md)`>` - User information
|
||||
- **getBpmUsername**(): `string`<br/>
|
||||
Gets the BPM username
|
||||
- **Returns** `string` - The BPM username
|
||||
- **getEcmUsername**(): `string`<br/>
|
||||
Gets the ECM username.
|
||||
- **Returns** `string` - The ECM username
|
||||
- **getRedirect**(): `string`<br/>
|
||||
Gets the URL to redirect to after login.
|
||||
- **Returns** `string` - The redirect URL
|
||||
- **getTicketBpm**(): `string|null`<br/>
|
||||
Gets the BPM ticket stored in the Storage.
|
||||
- **Returns** `string|null` - The ticket or `null` if none was found
|
||||
- **getTicketEcm**(): `string|null`<br/>
|
||||
Gets the ECM ticket stored in the Storage.
|
||||
- **Returns** `string|null` - The ticket or `null` if none was found
|
||||
- **getTicketEcmBase64**(): `string|null`<br/>
|
||||
Gets the BPM ticket from the Storage in Base 64 format.
|
||||
- **Returns** `string|null` - The ticket or `null` if none was found
|
||||
- **getToken**(): `string`<br/>
|
||||
Gets the auth token.
|
||||
- **Returns** `string` - Auth token string
|
||||
- **handleError**(error: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/>
|
||||
Prints an error message in the console browser
|
||||
- _error:_ `any` - Error message
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` - Object representing the error message
|
||||
- **getUsername**(): `string`<br/>
|
||||
Gets the username of the authenticated user.
|
||||
- **Returns** `string` - Username of the authenticated user
|
||||
- **getAuthHeaders**(requestUrl: `string`, headers: `HttpHeaders`): `HttpHeaders`<br/>
|
||||
Gets and sets the necessary authentication headers for a given request URL.
|
||||
- _requestUrl:_ `string` - The URL of the request for which to obtain authentication headers.
|
||||
- _headers:_ `HttpHeaders` - The existing HTTP headers to which authentication details might be added.
|
||||
- **Returns** `HttpHeaders` - The HTTP headers object, potentially updated with authentication tokens.
|
||||
- **isALLProvider**(): `boolean`<br/>
|
||||
Does the provider support both ECM and BPM?
|
||||
- **Returns** `boolean` - True if both are supported, false otherwise
|
||||
- **isAuthCodeFlow**(): `boolean`<br/>
|
||||
|
||||
- **Returns** `boolean` -
|
||||
|
||||
- **isBPMProvider**(): `boolean`<br/>
|
||||
Does the provider support BPM?
|
||||
- **Returns** `boolean` - True if supported, false otherwise
|
||||
- **isBpmLoggedIn**(): `boolean`<br/>
|
||||
Checks if the user is logged in on a BPM provider.
|
||||
- **Returns** `boolean` - True if logged in, false otherwise
|
||||
- **isECMProvider**(): `boolean`<br/>
|
||||
Does the provider support ECM?
|
||||
- **Returns** `boolean` - True if supported, false otherwise
|
||||
- **isEcmLoggedIn**(): `boolean`<br/>
|
||||
Checks if the user is logged in on an ECM provider.
|
||||
- **Returns** `boolean` - True if logged in, false otherwise
|
||||
- **isImplicitFlow**(): `boolean`<br/>
|
||||
|
||||
- **Returns** `boolean` -
|
||||
|
||||
- **isKerberosEnabled**(): `boolean`<br/>
|
||||
Does kerberos enabled?
|
||||
- **Returns** `boolean` - True if enabled, false otherwise
|
||||
- **isLoggedIn**(): `boolean`<br/>
|
||||
Checks if the user logged in.
|
||||
- **Returns** `boolean` - True if logged in, false otherwise
|
||||
- **isLoggedInWith**(provider: `string`): `boolean`<br/>
|
||||
|
||||
- _provider:_ `string` -
|
||||
- **Returns** `boolean` -
|
||||
|
||||
- **isOauth**(): `boolean`<br/>
|
||||
Does the provider support OAuth?
|
||||
- **Returns** `boolean` - True if supported, false otherwise
|
||||
- **isPublicUrl**(): `boolean`<br/>
|
||||
|
||||
- **Returns** `boolean` -
|
||||
|
||||
- **isRememberMeSet**(): `boolean`<br/>
|
||||
Checks whether the "remember me" cookie was set or not.
|
||||
- **Returns** `boolean` - True if set, false otherwise
|
||||
- **login**(username: `string`, password: `string`, rememberMe: `boolean` = `false`): [`Observable`](http://reactivex.io/documentation/observable.html)`<Function>`<br/>
|
||||
- **login**(username: `string`, password: `string`, rememberMe?: `boolean`): [`Observable`](http://reactivex.io/documentation/observable.html)`<{ type: string; ticket: any }>`<br/>
|
||||
Logs the user in.
|
||||
- _username:_ `string` - Username for the login
|
||||
- _password:_ `string` - Password for the login
|
||||
- _rememberMe:_ `boolean` - Stores the user's login details if true
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<Function>` - Object with auth type ("ECM", "BPM" or "ALL") and auth ticket
|
||||
- **logout**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/>
|
||||
Logs the user out.
|
||||
- _rememberMe:_ `boolean` - (Optional) Stores the user's login details if true
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<{ type: string; ticket: any }>` - An Observable that emits an object containing the authentication type (`type`) and the authentication ticket (`ticket`) upon successful login.
|
||||
- **logout**(): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/> Logs the user out.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` - Response event called when logout is complete
|
||||
- **reset**()<br/>
|
||||
|
||||
- **saveRememberMeCookie**(rememberMe: `boolean`)<br/>
|
||||
Saves the "remember me" cookie as either a long-life cookie or a session cookie.
|
||||
- _rememberMe:_ `boolean` - Enables a long-life cookie
|
||||
- **setRedirect**(url?: [`RedirectionModel`](../../../lib/core/src/lib/auth/models/redirection.model.ts))<br/>
|
||||
Sets the URL to redirect to after login.
|
||||
- _url:_ [`RedirectionModel`](../../../lib/core/src/lib/auth/models/redirection.model.ts) - (Optional) URL to redirect to
|
||||
- **ssoImplicitLogin**()<br/>
|
||||
Logs the user in with SSO
|
||||
- **reset**(): `void`<br/>Resets the authentication state of the service.
|
||||
- **on**(event: `string`, listener: `Function`): `void`<br/> Adds an event listener for the specified event.
|
||||
- **off**(event: `string`, listener?: `Function`): `void`<br/> Removes an event listener for the specified event.
|
||||
- **once**(event: `string`, listener: `Function`): `void`<br/> Adds a one-time event listener for the specified event.
|
||||
- **emit**(event: `string`, ...args: `any[]`): `void`<br/> Emits an event with optional arguments.
|
||||
- **onLogin**: [`Subject`](https://reactivex.io/documentation/subject)`<any>`<br/> Emitted when the user logs in successfully.
|
||||
- **onLogout**: [`Subject`](https://reactivex.io/documentation/subject)`<any>`<br/> Emitted when the user logs out.
|
||||
- **onTokenReceived**: [`Subject`](https://reactivex.io/documentation/subject)`<any>`<br/> Emitted when an authentication token is received.
|
||||
- **onError**: [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/> An Observable that emits an error object when an authentication-related error occurs.
|
||||
|
||||
## Details
|
||||
|
||||
|
||||
@@ -55,3 +55,4 @@ 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)
|
||||
|
||||
@@ -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) |
|
||||
|
||||
@@ -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,7 @@ The first **General Availability** release was v2.0.0.
|
||||
|
||||
## General Availability
|
||||
|
||||
- [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,164 @@
|
||||
---
|
||||
Title: Upgrading from ADF v7.0 to v8.0
|
||||
---
|
||||
|
||||
# Upgrading from ADF v7.0 to v8.0
|
||||
|
||||
This guide provides instructions for upgrading your v7.0.0 ADF projects to v8.0.0.
|
||||
|
||||
## Before you begin
|
||||
|
||||
Always perform upgrades on a "clean" project state. Back up your changes or create a full project backup before proceeding.
|
||||
|
||||
```shell
|
||||
# Recommended clean up
|
||||
nx reset && rm -rf .angular .nx dist node_modules nxcache tmp
|
||||
```
|
||||
|
||||
## Libraries
|
||||
|
||||
Update your dependencies to the versions introduced in the 8.0.0 release:
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": {
|
||||
"@alfresco/adf-core": "8.0.0",
|
||||
"@alfresco/adf-content-services": "8.0.0",
|
||||
"@alfresco/adf-process-services-cloud": "8.0.0",
|
||||
"@alfresco/adf-insights": "8.0.0",
|
||||
"@alfresco/adf-extensions": "8.0.0",
|
||||
"@alfresco/adf-cli": "8.0.0",
|
||||
"@alfresco/eslint-plugin-eslint-angular": "8.0.0",
|
||||
"@alfresco/adf-testing": "8.0.0",
|
||||
"@alfresco/js-api": "9.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Currently used Node version: 22.14.0.
|
||||
|
||||
### Breaking changes
|
||||
|
||||
Major version updates have been applied to the following core libraries:
|
||||
|
||||
- Angular: 19.2.6
|
||||
- Angular Material: 19.2.9
|
||||
- Typescript: 5.8.2
|
||||
|
||||
> Details on Angular update can be found in *Update Guide* from Angular documentation.
|
||||
|
||||
### Added libraries
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": {
|
||||
"node-fetch": "^3.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"webdriver-manager": "12.1.9"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Deleted libraries
|
||||
|
||||
```json
|
||||
{
|
||||
"devDependencies": {
|
||||
"mini-css-extract-plugin": "X.X.X",
|
||||
"css-loader": "X.X.X"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Reinstall your dependencies and perform an initial build:
|
||||
|
||||
```shell
|
||||
npm i
|
||||
npm run build
|
||||
```
|
||||
|
||||
Review your applications as some styles and classes of Angular Material components might have changed.
|
||||
|
||||
## Deprecations
|
||||
|
||||
The following table lists deprecated features and modules that will be removed in upcoming releases. Consider replacing them as soon as you update ADF to minimize future technical debt.
|
||||
|
||||
| Name | Notes |
|
||||
|-------------------------------|-----------------------------------------------------------------------------------------------|
|
||||
| Custom Theme | Refer to [Custom Theme documentation](../../lib/core/custom-theme/README.md) |
|
||||
| ShellModule | Refer to [Shell documentation](../../lib/core/shell/README.md) |
|
||||
| FormBaseModule | Use standalone components instead. |
|
||||
| CoreTestingModule | Use standalone components instead. |
|
||||
| ProcessServicesCloudModule | Refer to [ProcessServicesCloudModule replacement](#processservicescloudmodule-replacement) |
|
||||
|
||||
### ProcessServicesCloudModule replacement
|
||||
|
||||
To replace this module, import the standalone components directly or use the following provider API to replicate its behavior:
|
||||
|
||||
```typescript
|
||||
providers: [
|
||||
provideTranslations('adf-process-services-cloud', 'assets/adf-process-services-cloud'),
|
||||
provideCloudPreferences(),
|
||||
provideCloudFormRenderer(),
|
||||
{ provide: TASK_LIST_CLOUD_TOKEN, useClass: TaskListCloudService }
|
||||
]
|
||||
```
|
||||
|
||||
## New features and APIs
|
||||
|
||||
You can start using the new features and APIs introduced in the 8.0.0 release.
|
||||
|
||||
### XMLHttpRequest.withCredentials
|
||||
|
||||
Support for disabling the `withCredentials` property in `app.config.json` for identity providers that disallow credentials has been introduced. You can configure it as shown below:
|
||||
|
||||
```json
|
||||
{
|
||||
"auth": {
|
||||
"withCredentials": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### provideShell
|
||||
|
||||
The new provideShell API for providing the main application layout can replace the `withRoutes(routes: Routes | AppShellRoutesConfig)` method, as shown below.
|
||||
|
||||
```typescript
|
||||
import { provideShell } from '@alfresco/adf-core/shell';
|
||||
|
||||
provideShell(
|
||||
{
|
||||
routes: [],
|
||||
appService: AppService,
|
||||
authGuard: AuthGuard,
|
||||
navBar: {
|
||||
minWidth: 0,
|
||||
maxWidth: 100
|
||||
}
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
### provideI18N
|
||||
|
||||
The new `provideI18N` API for providing translation can replace `provideTranslations('app', 'assets')` method, as shown below.
|
||||
|
||||
```typescript
|
||||
import { provideI18N } from '@alfresco/adf-core';
|
||||
|
||||
provideI18N(
|
||||
{
|
||||
defaultLanguage: "en", // optional, defaults to "en"
|
||||
assets: [['en', '/assets/i18n/en.json'], ['fr', '/assets/i18n/fr.json']]
|
||||
}
|
||||
)
|
||||
```
|
||||
|
||||
## Final steps
|
||||
|
||||
After updating your code, thoroughly test your application to ensure everything works as expected.
|
||||
|
||||
If you encounter any issues during the upgrade process, refer to the Angular update guide or seek assistance from the ADF community.
|
||||
@@ -52,3 +52,4 @@ 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)
|
||||
|
||||
@@ -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 |
|
||||
| --- | --- | --- |
|
||||
|
||||
|
||||
Binary file not shown.
Generated
+13
-19
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "8.0.0",
|
||||
"version": "9.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "8.0.0",
|
||||
"version": "9.0.0",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@alfresco/js-api": ">=8.0.0-alpha.7",
|
||||
"@alfresco/js-api": ">=9.0.0",
|
||||
"commander": "^6.2.1",
|
||||
"ejs": "^3.1.9",
|
||||
"license-checker": "^25.0.1",
|
||||
"node-fetch": "^2.7.0",
|
||||
"rxjs": "^6.6.6",
|
||||
"rxjs": "7.8.2",
|
||||
"shelljs": "^0.8.3",
|
||||
"spdx-license-list": "^5.0.0"
|
||||
},
|
||||
@@ -30,9 +30,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@alfresco/js-api": {
|
||||
"version": "8.0.0-alpha.7-12984503308",
|
||||
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-8.0.0-alpha.7-12984503308.tgz",
|
||||
"integrity": "sha512-ua8YgR6BHO751wKclLCQeJEByLJbLl5xmfQqEDJyRlnMvDCk+v7a5e2ibF58meQkmstR+CkIXi5ZlW9YhBKtZg==",
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-9.0.0.tgz",
|
||||
"integrity": "sha512-tkVc3vCmbyp1cAJOtga/c5kApWmkj7lBmnJk0M+Jx/aek5mUQkXvDKlpPBoE0QR8UHKEKgB6HgwmaOMumYQVAw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"event-emitter": "^0.3.5",
|
||||
"superagent": "^9.0.1",
|
||||
@@ -1052,21 +1053,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rxjs": {
|
||||
"version": "6.6.7",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
|
||||
"integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
|
||||
"version": "7.8.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
|
||||
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"tslib": "^1.9.0"
|
||||
},
|
||||
"engines": {
|
||||
"npm": ">=2.0.0"
|
||||
"tslib": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/rxjs/node_modules/tslib": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"description": "Alfresco ADF cli and utils",
|
||||
"version": "8.0.0",
|
||||
"version": "9.0.0",
|
||||
"author": "Hyland Software, Inc. and its affiliates",
|
||||
"bin": {
|
||||
"adf-cli": "bin/adf-cli",
|
||||
@@ -20,12 +20,12 @@
|
||||
"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.0",
|
||||
"commander": "^6.2.1",
|
||||
"ejs": "^3.1.9",
|
||||
"license-checker": "^25.0.1",
|
||||
"node-fetch": "^2.7.0",
|
||||
"rxjs": "^6.6.6",
|
||||
"rxjs": "7.8.2",
|
||||
"shelljs": "^0.8.3",
|
||||
"spdx-license-list": "^5.0.0"
|
||||
},
|
||||
|
||||
@@ -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": "9.0.0",
|
||||
"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": ">=10.0.0",
|
||||
"@ngx-translate/core": ">=16.0.0",
|
||||
"@alfresco/adf-core": ">=9.0.0"
|
||||
},
|
||||
"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 {}
|
||||
|
||||
@@ -19,6 +19,7 @@ import { AlfrescoApiConfig } from '@alfresco/js-api';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { AppConfigService, AppConfigValues, StorageService } from '@alfresco/adf-core';
|
||||
import { AlfrescoApiService } from '../services/alfresco-api.service';
|
||||
import { SecurityOptionsLoaderService } from '../security-options-loader/security-options-loader.service';
|
||||
|
||||
/**
|
||||
* Create a factory to resolve an api service instance
|
||||
@@ -37,11 +38,12 @@ export class AlfrescoApiLoaderService {
|
||||
constructor(
|
||||
private readonly appConfig: AppConfigService,
|
||||
private readonly apiService: AlfrescoApiService,
|
||||
private readonly securityOptionsLoaderService: SecurityOptionsLoaderService,
|
||||
private storageService: StorageService
|
||||
) {}
|
||||
|
||||
async init(): Promise<any> {
|
||||
await this.appConfig.load();
|
||||
await this.appConfig.load(this.securityOptionsLoaderService.load);
|
||||
return this.initAngularAlfrescoApi();
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ?? [])
|
||||
])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+5
-8
@@ -15,12 +15,9 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RichTextEditorComponent } from './rich-text-editor.component';
|
||||
import { AspectPaging } from '@alfresco/js-api';
|
||||
|
||||
/** @deprecated use `RichTextEditorComponent` instead */
|
||||
@NgModule({
|
||||
imports: [RichTextEditorComponent],
|
||||
exports: [RichTextEditorComponent]
|
||||
})
|
||||
export class RichTextEditorModule {}
|
||||
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);
|
||||
});
|
||||
|
||||
@@ -156,7 +156,7 @@ describe('ContentService', () => {
|
||||
});
|
||||
|
||||
it('should take current logged user id if userId undefined ', () => {
|
||||
spyOn(authService, 'getEcmUsername').and.returnValue('user1');
|
||||
spyOn(authService, 'getUsername').and.returnValue('user1');
|
||||
const permissionNode = new Node({
|
||||
permissions: {
|
||||
inherited: [
|
||||
|
||||
@@ -84,7 +84,7 @@ export class ContentService {
|
||||
*/
|
||||
hasPermissions(node: Node, permission: PermissionsEnum | string, userId?: string): boolean {
|
||||
let hasPermissions = false;
|
||||
userId = userId ?? this.authService.getEcmUsername();
|
||||
userId = userId ?? this.authService.getUsername();
|
||||
|
||||
const permissions = [...(node.permissions?.locallySet || []), ...(node.permissions?.inherited || [])].filter(
|
||||
(currentPermission) => currentPermission.authorityId === userId
|
||||
|
||||
@@ -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
-2
@@ -274,7 +274,7 @@ describe('DropdownSitesComponent', () => {
|
||||
});
|
||||
|
||||
it('should show only sites which logged user is member of when member relation is set', async () => {
|
||||
spyOn(authService, 'getEcmUsername').and.returnValue('test');
|
||||
spyOn(authService, 'getUsername').and.returnValue('test');
|
||||
fixture.detectChanges();
|
||||
await fixture.whenStable();
|
||||
|
||||
@@ -295,7 +295,7 @@ describe('DropdownSitesComponent', () => {
|
||||
});
|
||||
|
||||
it('should show all the sites if no relation is set', async () => {
|
||||
spyOn(authService, 'getEcmUsername').and.returnValue('test');
|
||||
spyOn(authService, 'getUsername').and.returnValue('test');
|
||||
fixture.detectChanges();
|
||||
await fixture.whenStable();
|
||||
|
||||
|
||||
+3
-4
@@ -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' }
|
||||
@@ -182,7 +181,7 @@ export class DropdownSitesComponent implements OnInit {
|
||||
}
|
||||
|
||||
private filteredResultsByMember(sites: SitePaging): SitePaging {
|
||||
const loggedUserName = this.authService.getEcmUsername();
|
||||
const loggedUserName = this.authService.getUsername();
|
||||
sites.list.entries = sites.list.entries.filter((site) => this.isCurrentUserMember(site, loggedUserName));
|
||||
return sites;
|
||||
}
|
||||
|
||||
@@ -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 },
|
||||
@@ -94,7 +92,7 @@ describe('DownloadZipDialogComponent', () => {
|
||||
spyOn(downloadZipService, 'createDownload').and.callFake(
|
||||
() =>
|
||||
new Observable((observer) => {
|
||||
observer.next();
|
||||
observer.next(undefined);
|
||||
observer.complete();
|
||||
})
|
||||
);
|
||||
@@ -112,7 +110,7 @@ describe('DownloadZipDialogComponent', () => {
|
||||
const createDownloadSpy = spyOn(downloadZipService, 'createDownload').and.callFake(
|
||||
() =>
|
||||
new Observable((observer) => {
|
||||
observer.next();
|
||||
observer.next(undefined);
|
||||
observer.complete();
|
||||
})
|
||||
);
|
||||
@@ -125,7 +123,7 @@ describe('DownloadZipDialogComponent', () => {
|
||||
spyOn(downloadZipService, 'createDownload').and.callFake(
|
||||
() =>
|
||||
new Observable((observer) => {
|
||||
observer.next();
|
||||
observer.next(undefined);
|
||||
observer.complete();
|
||||
})
|
||||
);
|
||||
@@ -140,7 +138,7 @@ describe('DownloadZipDialogComponent', () => {
|
||||
spyOn(downloadZipService, 'createDownload').and.callFake(
|
||||
() =>
|
||||
new Observable((observer) => {
|
||||
observer.next();
|
||||
observer.next(undefined);
|
||||
observer.complete();
|
||||
})
|
||||
);
|
||||
|
||||
+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]
|
||||
})
|
||||
|
||||
+42
-3
@@ -646,7 +646,7 @@ describe('DocumentList', () => {
|
||||
title: 'FileAction'
|
||||
});
|
||||
|
||||
spyOn(authenticationService, 'getEcmUsername').and.returnValue('lockOwner');
|
||||
spyOn(authenticationService, 'getUsername').and.returnValue('lockOwner');
|
||||
|
||||
documentList.actions = [documentMenu];
|
||||
|
||||
@@ -677,7 +677,7 @@ describe('DocumentList', () => {
|
||||
title: 'FileAction'
|
||||
});
|
||||
|
||||
spyOn(authenticationService, 'getEcmUsername').and.returnValue('jerryTheKillerCow');
|
||||
spyOn(authenticationService, 'getUsername').and.returnValue('jerryTheKillerCow');
|
||||
|
||||
documentList.actions = [documentMenu];
|
||||
|
||||
@@ -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'
|
||||
})
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user