Compare commits
392 Commits
backport/3
...
private/ju
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
20bd75cca5 | ||
|
|
078848b101 | ||
|
|
9fb6db4c31 | ||
|
|
47b71f93c8 | ||
|
|
c3b610bc38 | ||
|
|
2d7edbf2f2 | ||
|
|
26f1288440 | ||
|
|
55f52d5d68 | ||
|
|
e8ed6fb89e | ||
|
|
36e8a88588 | ||
|
|
aa7dfbd749 | ||
|
|
cec655c1fa | ||
|
|
228457e387 | ||
|
|
66f985a9fb | ||
|
|
54706cfe8d | ||
|
|
48bf117339 | ||
|
|
d585e14240 | ||
|
|
6a790154c2 | ||
|
|
33913be41f | ||
|
|
393e08519d | ||
|
|
dfcf096caa | ||
|
|
4859456588 | ||
|
|
366df500e6 | ||
|
|
7c6cdfd498 | ||
|
|
29fb2e63ad | ||
|
|
e021d400f3 | ||
|
|
139a8a0fb7 | ||
|
|
43e91b9082 | ||
|
|
316f5fb25a | ||
|
|
008b41a2ad | ||
|
|
e5e836101c | ||
|
|
dd261fec6c | ||
|
|
5214377341 | ||
|
|
ad4174f6bd | ||
|
|
976e68e40c | ||
|
|
9c33cdf3d3 | ||
|
|
d5eea830a5 | ||
|
|
c8e94c2de4 | ||
|
|
f838d91304 | ||
|
|
f4c615252b | ||
|
|
f084193daf | ||
|
|
20b9b1e1e9 | ||
|
|
eae7fd88d8 | ||
|
|
983247b9e8 | ||
|
|
afbd6ce1b0 | ||
|
|
31311f1123 | ||
|
|
7a3fb009d6 | ||
|
|
a7974d32ee | ||
|
|
558ac704f5 | ||
|
|
0c98a04699 | ||
|
|
4f9b71dcad | ||
|
|
b2367314fc | ||
|
|
c04e5c1681 | ||
|
|
541eeb0b06 | ||
|
|
1bd62d7fa2 | ||
|
|
03a9915dd5 | ||
|
|
b6cce55325 | ||
|
|
47345e10f1 | ||
|
|
39784dc940 | ||
|
|
1cdea9dba0 | ||
|
|
49591d6699 | ||
|
|
101e15c1b7 | ||
|
|
4d9743f8d3 | ||
|
|
51433ac4a9 | ||
|
|
2cde9ac16c | ||
|
|
fb2a38e684 | ||
|
|
ff4f33264b | ||
|
|
879e936728 | ||
|
|
c47bfd21eb | ||
|
|
c59b6f8882 | ||
|
|
4dabc22f27 | ||
|
|
490cfb2396 | ||
|
|
f840bbba11 | ||
|
|
cffcd4fd66 | ||
|
|
a3336cb0a0 | ||
|
|
379f1144b3 | ||
|
|
eb69512b5f | ||
|
|
f46c31f120 | ||
|
|
b75fb76c08 | ||
|
|
3d925fb145 | ||
|
|
7786c86f47 | ||
|
|
7f3a318fc5 | ||
|
|
525a14c428 | ||
|
|
48ec97386c | ||
|
|
26c76fbb46 | ||
|
|
c95c96fb40 | ||
|
|
981fc8e16f | ||
|
|
b7f3c2d140 | ||
|
|
b01d472745 | ||
|
|
05dbf67531 | ||
|
|
a8c22482f6 | ||
|
|
c0886cfc7a | ||
|
|
7c68414435 | ||
|
|
da745f9306 | ||
|
|
16413735d2 | ||
|
|
e70e7128c0 | ||
|
|
36a9d2e95c | ||
|
|
ce85b4378f | ||
|
|
d52697823d | ||
|
|
53d462b3da | ||
|
|
fc9fa5dc25 | ||
|
|
eb8a321637 | ||
|
|
ce77725ef0 | ||
|
|
a88e028793 | ||
|
|
0655ab8d59 | ||
|
|
2c5b8c5fba | ||
|
|
1057dc7039 | ||
|
|
8274d090c3 | ||
|
|
c213727180 | ||
|
|
a5565d192d | ||
|
|
d25c8f6945 | ||
|
|
e31ff9f247 | ||
|
|
2d8bb1e654 | ||
|
|
18babccfe1 | ||
|
|
4646499917 | ||
|
|
da9c18b4cb | ||
|
|
94134fc7d6 | ||
|
|
113cc5c578 | ||
|
|
0d12c2a4ec | ||
|
|
3d1ed51ea9 | ||
|
|
31152d9763 | ||
|
|
044afef32d | ||
|
|
1e35c7b836 | ||
|
|
0a43156a91 | ||
|
|
fd9ad30e3e | ||
|
|
c5fc9f6833 | ||
|
|
298d72c651 | ||
|
|
64e231630f | ||
|
|
314fdc43ad | ||
|
|
6962187497 | ||
|
|
0f9fdbd82a | ||
|
|
c6f8b22837 | ||
|
|
a3cdd5e19d | ||
|
|
239bb5e4cb | ||
|
|
2a121536de | ||
|
|
1f645a3059 | ||
|
|
92efa7f5ec | ||
|
|
70664c1853 | ||
|
|
8ac2bbbbbc | ||
|
|
7560619939 | ||
|
|
7ce68f74c4 | ||
|
|
fa493ddd9a | ||
|
|
d4c9147419 | ||
|
|
21b81ff56c | ||
|
|
4645c5077d | ||
|
|
9a7bcafa6c | ||
|
|
53ebe480cf | ||
|
|
e4db5e4d28 | ||
|
|
2b8dee5081 | ||
|
|
a8d41797ef | ||
|
|
bc9fe51036 | ||
|
|
d16799948f | ||
|
|
764dd947d4 | ||
|
|
ea35f64d2a | ||
|
|
a2205db748 | ||
|
|
a80d87a3e9 | ||
|
|
12ed617a56 | ||
|
|
ffccbf73fd | ||
|
|
8514e91edc | ||
|
|
8926363092 | ||
|
|
2be4fff781 | ||
|
|
8f52667d2c | ||
|
|
ec43071adb | ||
|
|
d3d4269245 | ||
|
|
ff7a813052 | ||
|
|
51d6b9e352 | ||
|
|
df90c81272 | ||
|
|
af03e61142 | ||
|
|
6234632ae9 | ||
|
|
393c88e592 | ||
|
|
92db5f3deb | ||
|
|
1169818a3d | ||
|
|
dd32544e5e | ||
|
|
095c80e993 | ||
|
|
0daf7021ec | ||
|
|
3f0f4315fc | ||
|
|
4b5aabd433 | ||
|
|
0ce431e7a6 | ||
|
|
83fc4323f4 | ||
|
|
100bc30d9b | ||
|
|
4044953df0 | ||
|
|
be5ca006d6 | ||
|
|
c89e971059 | ||
|
|
e85a754756 | ||
|
|
70dfa9e7d2 | ||
|
|
aab0d5eecc | ||
|
|
87005ce981 | ||
|
|
0425a3c39c | ||
|
|
e2674f45fc | ||
|
|
1f43dbb3fc | ||
|
|
1469756d93 | ||
|
|
8bba4d09ac | ||
|
|
a4a0f17891 | ||
|
|
5b0e0cc7bb | ||
|
|
b3364f4460 | ||
|
|
9ca7a0a077 | ||
|
|
37b05250cc | ||
|
|
45c254698b | ||
|
|
6f56989fa7 | ||
|
|
96a5fbf0d4 | ||
|
|
f051114b3e | ||
|
|
48c28690b2 | ||
|
|
2cbef172d4 | ||
|
|
2a60428133 | ||
|
|
15f790ee31 | ||
|
|
d8ff4ed7a9 | ||
|
|
7718dbb17d | ||
|
|
fa1b675a54 | ||
|
|
a2c7531dba | ||
|
|
c72714fa70 | ||
|
|
da109ca720 | ||
|
|
0fcbe2cb47 | ||
|
|
86fd1fbc0f | ||
|
|
dd0a22ba04 | ||
|
|
7425d00ba5 | ||
|
|
ca04efb736 | ||
|
|
ce595bdd9d | ||
|
|
c706fb7536 | ||
|
|
b533d11c13 | ||
|
|
ede6a05dec | ||
|
|
3651f6b6cb | ||
|
|
92b0b24bb2 | ||
|
|
65613b1c96 | ||
|
|
52ca67f22c | ||
|
|
5d39a38b6f | ||
|
|
c2373ac244 | ||
|
|
38ff93bf14 | ||
|
|
77f57a926b | ||
|
|
d61d9f015c | ||
|
|
d519b60195 | ||
|
|
144bc6a217 | ||
|
|
11aa39253f | ||
|
|
67b9e91dde | ||
|
|
24aeae8367 | ||
|
|
db114ea587 | ||
|
|
21d5aa1ab5 | ||
|
|
fce9fe4bd9 | ||
|
|
ab6477c5d3 | ||
|
|
d95a420a76 | ||
|
|
500c73605b | ||
|
|
0bcb0d29d7 | ||
|
|
b3a04624e5 | ||
|
|
f5f3622a79 | ||
|
|
b9023d14f9 | ||
|
|
8b102ddb66 | ||
|
|
b118dc0e5e | ||
|
|
8dcddc1e73 | ||
|
|
9dbfeac56a | ||
|
|
a3e31f8c2d | ||
|
|
259d9b325e | ||
|
|
6551ba2210 | ||
|
|
e11bea04e6 | ||
|
|
6ab433fd86 | ||
|
|
4343639ff0 | ||
|
|
2f3c359034 | ||
|
|
963e927aae | ||
|
|
0783fde14b | ||
|
|
52e7d73f10 | ||
|
|
89da9273dd | ||
|
|
e119d05556 | ||
|
|
567439f0b4 | ||
|
|
96725f5a28 | ||
|
|
43699ec3d7 | ||
|
|
d9bd7fbb1f | ||
|
|
bf3ec30b5a | ||
|
|
a3557ba875 | ||
|
|
c6f3e5bb9d | ||
|
|
c011c53f73 | ||
|
|
6335f50dfb | ||
|
|
136a5ab078 | ||
|
|
0ed7c4d02f | ||
|
|
a4bc6b9029 | ||
|
|
6caa7bcfcb | ||
|
|
b9758a7ae8 | ||
|
|
021aa698d9 | ||
|
|
643302be5e | ||
|
|
d3c8cb0285 | ||
|
|
6bbe91acfd | ||
|
|
13dcacc3bb | ||
|
|
e27e8d2ff6 | ||
|
|
3345e9b36d | ||
|
|
108cbfaf33 | ||
|
|
07017b4a19 | ||
|
|
81f64e7b19 | ||
|
|
b8e0eb3a97 | ||
|
|
63b68a59e3 | ||
|
|
f55c3b294e | ||
|
|
d68c3768b4 | ||
|
|
f067057df7 | ||
|
|
bad3f5c89e | ||
|
|
c5e7f473cb | ||
|
|
9f93e88164 | ||
|
|
0077852d4a | ||
|
|
28b10682f5 | ||
|
|
c3f46db990 | ||
|
|
82bc8a66fd | ||
|
|
e3b6627a23 | ||
|
|
315ea4b991 | ||
|
|
07fcfb3078 | ||
|
|
5f3d5e800d | ||
|
|
7b0579625e | ||
|
|
4f0d5b1f37 | ||
|
|
dc07b34d52 | ||
|
|
540aba5ecd | ||
|
|
c3a1cdd6b3 | ||
|
|
0537af0323 | ||
|
|
d3e36f6f0c | ||
|
|
0818274451 | ||
|
|
3c4b8b6ce3 | ||
|
|
098f5863f8 | ||
|
|
00f4bc188e | ||
|
|
6a80f6c8f6 | ||
|
|
26e7b3a868 | ||
|
|
556930cf93 | ||
|
|
42009b233a | ||
|
|
9f3a1e6cda | ||
|
|
544e4d99ee | ||
|
|
97c83fad8d | ||
|
|
95a811362d | ||
|
|
4dc4603d2d | ||
|
|
443e383f2a | ||
|
|
d98c2bc926 | ||
|
|
cb9fc6c9a2 | ||
|
|
f2052702b5 | ||
|
|
3e68801774 | ||
|
|
ff17167719 | ||
|
|
7a15853f77 | ||
|
|
82dbd800d6 | ||
|
|
53e29ad124 | ||
|
|
2b1f3623d0 | ||
|
|
ee7020886e | ||
|
|
ac9665298f | ||
|
|
fe67cd42f9 | ||
|
|
acc0b4cd0c | ||
|
|
0025bb2c52 | ||
|
|
7ab042d1a8 | ||
|
|
c02ad2d851 | ||
|
|
6012f0887d | ||
|
|
17065190ab | ||
|
|
77046f378f | ||
|
|
2bf3aa0e8e | ||
|
|
68da328343 | ||
|
|
bc0dd7118c | ||
|
|
dbf9519326 | ||
|
|
47cbe7bea7 | ||
|
|
5d5424d2a4 | ||
|
|
2cc24dcd60 | ||
|
|
49ed6f9beb | ||
|
|
ec069d5e0d | ||
|
|
9b8df3c157 | ||
|
|
e399e5bd46 | ||
|
|
9aab543604 | ||
|
|
80b8e3ad5c | ||
|
|
499bef97fb | ||
|
|
b6e4f0993a | ||
|
|
53c31ba221 | ||
|
|
849d3adb09 | ||
|
|
9d90e0f3e2 | ||
|
|
a22b223244 | ||
|
|
c3468125f9 | ||
|
|
9e7cff9839 | ||
|
|
13d2b98da4 | ||
|
|
4b327a53c1 | ||
|
|
d441ba4f3d | ||
|
|
9140efef29 | ||
|
|
7119137a75 | ||
|
|
b7cbfa03a5 | ||
|
|
3ee19abfc1 | ||
|
|
25262b648f | ||
|
|
bf746e4c92 | ||
|
|
eec7f5ff21 | ||
|
|
34f1a80caa | ||
|
|
ae2aa8caff | ||
|
|
bb2703526e | ||
|
|
dc85757d1b | ||
|
|
62f3fce3ea | ||
|
|
f353caad7f | ||
|
|
92ace35f79 | ||
|
|
185f4684ca | ||
|
|
e5036fcbbb | ||
|
|
113f5e1bf7 | ||
|
|
05d0f228aa | ||
|
|
256c7cb873 | ||
|
|
117d8fe6ba | ||
|
|
0ba63ca548 | ||
|
|
ba08bd25a7 | ||
|
|
ee0b5a6150 | ||
|
|
a81a1761b5 | ||
|
|
0fc220baef | ||
|
|
06de1a7e85 | ||
|
|
d56acf99af | ||
|
|
01d8f2815d |
@@ -3,6 +3,10 @@ module.exports = {
|
|||||||
'@nextcloud',
|
'@nextcloud',
|
||||||
],
|
],
|
||||||
rules: {
|
rules: {
|
||||||
'valid-jsdoc': ['off'],
|
'jsdoc/require-param-description': ['off'],
|
||||||
|
'jsdoc/require-param-type': ['off'],
|
||||||
|
'jsdoc/check-param-names': ['off'],
|
||||||
|
'jsdoc/no-undefined-types': ['off'],
|
||||||
|
'jsdoc/require-property-description' : ['off']
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
10
.github/dependabot.yml
vendored
10
.github/dependabot.yml
vendored
@@ -39,3 +39,13 @@ updates:
|
|||||||
versions:
|
versions:
|
||||||
- "< 16"
|
- "< 16"
|
||||||
- ">= 15.a"
|
- ">= 15.a"
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
day: saturday
|
||||||
|
time: "03:00"
|
||||||
|
timezone: Europe/Paris
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
reviewers:
|
||||||
|
- juliushaertl
|
||||||
|
|||||||
25
.github/stale.yml
vendored
25
.github/stale.yml
vendored
@@ -1,25 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 60
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 7
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- "1. to develop"
|
|
||||||
- "2. developing"
|
|
||||||
- "3. to review"
|
|
||||||
- "discussion"
|
|
||||||
- "bounty"
|
|
||||||
- "bug"
|
|
||||||
- "enhancement"
|
|
||||||
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 30
|
|
||||||
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
6
.github/workflows/appbuild.yml
vendored
6
.github/workflows/appbuild.yml
vendored
@@ -12,15 +12,15 @@ jobs:
|
|||||||
node-version: [14.x]
|
node-version: [14.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v2.4.0
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2.4.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
run: npm i -g npm@7
|
run: npm i -g npm@7
|
||||||
- name: Setup PHP
|
- name: Setup PHP
|
||||||
uses: shivammathur/setup-php@v1
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: '7.4'
|
php-version: '7.4'
|
||||||
tools: composer
|
tools: composer
|
||||||
|
|||||||
21
.github/workflows/appstore-build-publish.yml
vendored
21
.github/workflows/appstore-build-publish.yml
vendored
@@ -6,6 +6,7 @@
|
|||||||
name: Build and publish app release
|
name: Build and publish app release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
pull_request:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
|
||||||
@@ -16,8 +17,6 @@ jobs:
|
|||||||
build_and_publish:
|
build_and_publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
# Only allowed to be run on nextcloud-releases repositories
|
|
||||||
if: ${{ github.repository_owner == 'nextcloud-releases' }}
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check actor permission
|
- name: Check actor permission
|
||||||
@@ -131,21 +130,3 @@ jobs:
|
|||||||
# Rebuilding archive
|
# Rebuilding archive
|
||||||
cd ${{ env.APP_NAME }}/build/artifacts
|
cd ${{ env.APP_NAME }}/build/artifacts
|
||||||
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Attach tarball to github release
|
|
||||||
uses: svenstaro/upload-release-action@v2
|
|
||||||
id: attach_to_release
|
|
||||||
with:
|
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
file: ${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}.tar.gz
|
|
||||||
asset_name: ${{ env.APP_NAME }}-${{ env.APP_VERSION }}.tar.gz
|
|
||||||
tag: ${{ github.ref }}
|
|
||||||
overwrite: true
|
|
||||||
|
|
||||||
- name: Upload app to Nextcloud appstore
|
|
||||||
uses: nextcloud-releases/nextcloud-appstore-push-action@v1
|
|
||||||
with:
|
|
||||||
app_name: ${{ env.APP_NAME }}
|
|
||||||
appstore_token: ${{ secrets.APPSTORE_TOKEN }}
|
|
||||||
download_url: ${{ steps.attach_to_release.outputs.browser_download_url }}
|
|
||||||
app_private_key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
||||||
|
|||||||
46
.github/workflows/command-rebase.yml
vendored
Normal file
46
.github/workflows/command-rebase.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# This workflow is provided via the organization template repository
|
||||||
|
#
|
||||||
|
# https://github.com/nextcloud/.github
|
||||||
|
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||||
|
|
||||||
|
name: Rebase command
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: created
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rebase:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# On pull requests and if the comment starts with `/rebase`
|
||||||
|
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Add reaction on start
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
repository: ${{ github.event.repository.full_name }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reaction-type: "+1"
|
||||||
|
|
||||||
|
- name: Checkout the latest code
|
||||||
|
uses: actions/checkout@v2.4.0
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
|
||||||
|
- name: Automatic Rebase
|
||||||
|
uses: cirrus-actions/rebase@1.5
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
|
||||||
|
- name: Add reaction on failure
|
||||||
|
uses: peter-evans/create-or-update-comment@v1
|
||||||
|
if: failure()
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
|
repository: ${{ github.event.repository.full_name }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reaction-type: "-1"
|
||||||
29
.github/workflows/dependabot-approve-merge.yml
vendored
Normal file
29
.github/workflows/dependabot-approve-merge.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# This workflow is provided via the organization template repository
|
||||||
|
#
|
||||||
|
# https://github.com/nextcloud/.github
|
||||||
|
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||||
|
|
||||||
|
name: Dependabot
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- stable*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-approve-merge:
|
||||||
|
if: github.actor == 'dependabot[bot]'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# Github actions bot approve
|
||||||
|
- uses: hmarr/auto-approve-action@v2
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Nextcloud bot approve and merge request
|
||||||
|
- uses: ahmadnassri/action-dependabot-auto-merge@v2
|
||||||
|
with:
|
||||||
|
target: patch
|
||||||
|
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}
|
||||||
20
.github/workflows/fixup.yml
vendored
Normal file
20
.github/workflows/fixup.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# This workflow is provided via the organization template repository
|
||||||
|
#
|
||||||
|
# https://github.com/nextcloud/.github
|
||||||
|
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||||
|
|
||||||
|
name: Pull request checks
|
||||||
|
|
||||||
|
on: pull_request
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
commit-message-check:
|
||||||
|
name: Block fixup and squash commits
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Run check
|
||||||
|
uses: xt0rted/block-autosquash-commits-action@v2
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
8
.github/workflows/integration.yml
vendored
8
.github/workflows/integration.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
php-versions: ['7.4']
|
php-versions: ['7.4']
|
||||||
databases: ['sqlite', 'mysql', 'pgsql']
|
databases: ['sqlite', 'mysql', 'pgsql']
|
||||||
server-versions: ['stable22']
|
server-versions: ['stable23']
|
||||||
|
|
||||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout server
|
- name: Checkout server
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.4.0
|
||||||
with:
|
with:
|
||||||
repository: nextcloud/server
|
repository: nextcloud/server
|
||||||
ref: ${{ matrix.server-versions }}
|
ref: ${{ matrix.server-versions }}
|
||||||
@@ -56,12 +56,12 @@ jobs:
|
|||||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||||
|
|
||||||
- name: Checkout app
|
- name: Checkout app
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.4.0
|
||||||
with:
|
with:
|
||||||
path: apps/${{ env.APP_NAME }}
|
path: apps/${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
tools: phpunit
|
tools: phpunit
|
||||||
|
|||||||
24
.github/workflows/lint.yml
vendored
24
.github/workflows/lint.yml
vendored
@@ -17,9 +17,9 @@ jobs:
|
|||||||
|
|
||||||
name: php${{ matrix.php-versions }} lint
|
name: php${{ matrix.php-versions }} lint
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2.4.0
|
||||||
- name: Set up php${{ matrix.php-versions }}
|
- name: Set up php${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@v1
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
coverage: none
|
coverage: none
|
||||||
@@ -31,9 +31,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@master
|
uses: actions/checkout@v2.4.0
|
||||||
- name: Set up php
|
- name: Set up php
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
coverage: none
|
coverage: none
|
||||||
@@ -50,9 +50,9 @@ jobs:
|
|||||||
node-version: [14.x]
|
node-version: [14.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2.4.0
|
||||||
- name: Use node ${{ matrix.node-version }}
|
- name: Use node ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2.4.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
@@ -67,16 +67,16 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-versions: [14.x]
|
node-version: [14.x]
|
||||||
|
|
||||||
name: stylelint node${{ matrix.node-versions }}
|
name: stylelint node${{ matrix.node-version }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2.4.0
|
||||||
|
|
||||||
- name: Set up node ${{ matrix.node-versions }}
|
- name: Set up node ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2.4.1
|
||||||
with:
|
with:
|
||||||
node-versions: ${{ matrix.node-versions }}
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
run: npm i -g npm@7
|
run: npm i -g npm@7
|
||||||
|
|||||||
6
.github/workflows/nightly.yml
vendored
6
.github/workflows/nightly.yml
vendored
@@ -17,15 +17,15 @@ jobs:
|
|||||||
node-version: [14.x]
|
node-version: [14.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v2.4.0
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2.4.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
run: npm i -g npm@7
|
run: npm i -g npm@7
|
||||||
- name: Setup PHP
|
- name: Setup PHP
|
||||||
uses: shivammathur/setup-php@v1
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: '7.4'
|
php-version: '7.4'
|
||||||
tools: composer
|
tools: composer
|
||||||
|
|||||||
4
.github/workflows/nodejs.yml
vendored
4
.github/workflows/nodejs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
|||||||
node-version: [14.x]
|
node-version: [14.x]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v2.4.0
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2.4.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
|
|||||||
8
.github/workflows/phpunit.yml
vendored
8
.github/workflows/phpunit.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
php-versions: ['7.3', '7.4']
|
php-versions: ['7.3', '7.4']
|
||||||
databases: ['sqlite', 'mysql', 'pgsql']
|
databases: ['sqlite', 'mysql', 'pgsql']
|
||||||
server-versions: ['stable22']
|
server-versions: ['stable23']
|
||||||
|
|
||||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout server
|
- name: Checkout server
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.4.0
|
||||||
with:
|
with:
|
||||||
repository: nextcloud/server
|
repository: nextcloud/server
|
||||||
ref: ${{ matrix.server-versions }}
|
ref: ${{ matrix.server-versions }}
|
||||||
@@ -57,12 +57,12 @@ jobs:
|
|||||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||||
|
|
||||||
- name: Checkout app
|
- name: Checkout app
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.4.0
|
||||||
with:
|
with:
|
||||||
path: apps/${{ env.APP_NAME }}
|
path: apps/${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
tools: phpunit
|
tools: phpunit
|
||||||
|
|||||||
6
.github/workflows/static-analysis.yml
vendored
6
.github/workflows/static-analysis.yml
vendored
@@ -12,13 +12,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ocp-version: [ 'dev-stable22' ]
|
ocp-version: [ 'dev-stable23' ]
|
||||||
name: Nextcloud ${{ matrix.ocp-version }}
|
name: Nextcloud ${{ matrix.ocp-version }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@master
|
uses: actions/checkout@v2.4.0
|
||||||
- name: Set up php
|
- name: Set up php
|
||||||
uses: shivammathur/setup-php@master
|
uses: shivammathur/setup-php@2.15.0
|
||||||
with:
|
with:
|
||||||
php-version: 7.4
|
php-version: 7.4
|
||||||
tools: composer:v1
|
tools: composer:v1
|
||||||
|
|||||||
176
CHANGELOG.md
176
CHANGELOG.md
@@ -1,115 +1,81 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 1.5.7
|
## 1.6.2
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Transfer ownership @juliushaertl [#3665](https://github.com/nextcloud/deck/pull/3665)
|
- Transfer ownership @juliushaertl [#3664](https://github.com/nextcloud/deck/pull/3664)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fix: Check all circle shares for permissions [#3721](https://github.com/nextcloud/deck/pull/3721)
|
- 🐛 Fix missing files sidebar [#3641](https://github.com/nextcloud/deck/pull/3641)
|
||||||
- Add a missing translation - not found in transifex [#3707](https://github.com/nextcloud/deck/pull/3707)
|
- Add a missing translation - not found in transifex [#3706](https://github.com/nextcloud/deck/pull/3706)
|
||||||
- 🐛 Fix missing files sidebar [#3642](https://github.com/nextcloud/deck/pull/3642)
|
- Fix: Check all circle shares for permissions [#3717](https://github.com/nextcloud/deck/pull/3717)
|
||||||
- [stable23] Use explicit cast to make use of index [#3731](https://github.com/nextcloud/deck/pull/3731)
|
- Sort boards non case sensitive [#3663](https://github.com/nextcloud/deck/pull/3663)
|
||||||
- Fix hidden attachment icon on archived cards [#3735](https://github.com/nextcloud/deck/pull/3735)
|
- Use explicit cast to make use of index @juliushaertl [#3497](https://github.com/nextcloud/deck/pull/3497)
|
||||||
- [stable23] Sort boards non case sensitive [#3739](https://github.com/nextcloud/deck/pull/3739)
|
- Fix paramter replacements when creating deck cards from talk messages @juliushaertl [#3741](https://github.com/nextcloud/deck/pull/3741)
|
||||||
- add autofocus on board edit #3326 @juliushaertl [#3743](https://github.com/nextcloud/deck/pull/3743)
|
- Fix hidden attachment icon on archived cards [#3734](https://github.com/nextcloud/deck/pull/3734)
|
||||||
- Fix paramter replacements when creating deck cards from talk messages @juliushaertl [#3742](https://github.com/nextcloud/deck/pull/3742)
|
- Fix text selection in dark mode and modal view [#3766](https://github.com/nextcloud/deck/pull/3766)
|
||||||
- Fix text selection in dark mode and modal view [#3767](https://github.com/nextcloud/deck/pull/3767)
|
|
||||||
|
|
||||||
### Other
|
### Other
|
||||||
|
|
||||||
- Properly check for the stack AND setting board permissions [#3714](https://github.com/nextcloud/deck/pull/3714)
|
- Properly check for the stack AND setting board permissions [#3713](https://github.com/nextcloud/deck/pull/3713)
|
||||||
- Add missing indices [#3756](https://github.com/nextcloud/deck/pull/3756)
|
- Add missing indices [#3755](https://github.com/nextcloud/deck/pull/3755)
|
||||||
|
|
||||||
|
## 1.6.1
|
||||||
## 1.5.6
|
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Allow to download an attachment without navigating to the files app [#3441](https://api.github.com/repos/nextcloud/deck/pulls/3441)
|
- Exclude deleted boards in the selection for target [#3523](https://api.github.com/repos/nextcloud/deck/pulls/3523)
|
||||||
- Fix CalDAV blocking and modernize circles API usage [#3527](https://api.github.com/repos/nextcloud/deck/pulls/3527)
|
- CardApiController: Fix order of optional parameters [#3520](https://api.github.com/repos/nextcloud/deck/pulls/3520)
|
||||||
- CardApiController: Fix order of optional parameters [#3521](https://api.github.com/repos/nextcloud/deck/pulls/3521)
|
- Fix cursor generation if no results are found [#3462](https://api.github.com/repos/nextcloud/deck/pulls/3462)
|
||||||
- Fix cursor generation if no results are found [#3460](https://api.github.com/repos/nextcloud/deck/pulls/3460)
|
- Fix CalDAV blocking and modernize circles API usage [#3526](https://api.github.com/repos/nextcloud/deck/pulls/3526)
|
||||||
- Exclude deleted boards in the selection for target [#3524](https://api.github.com/repos/nextcloud/deck/pulls/3524)
|
- Fix overview card listing [#3463](https://api.github.com/repos/nextcloud/deck/pulls/3463)
|
||||||
- Generate fixed link for activity emails [#3627](https://api.github.com/repos/nextcloud/deck/pulls/3627)
|
- Generate fixed link for activity emails [#3626](https://api.github.com/repos/nextcloud/deck/pulls/3626)
|
||||||
- Make insert attachment buttom easy to click [#3615](https://api.github.com/repos/nextcloud/deck/pulls/3615)
|
- return the selector for collections [#3618](https://api.github.com/repos/nextcloud/deck/pulls/3618)
|
||||||
- Fix confusion between stackId and boardId in StackService [#3544](https://api.github.com/repos/nextcloud/deck/pulls/3544)
|
- Fix confusion between stackId and boardId in StackService [#3543](https://api.github.com/repos/nextcloud/deck/pulls/3543)
|
||||||
|
- Fix talk integration [#3537](https://api.github.com/repos/nextcloud/deck/pulls/3537)
|
||||||
|
- Make insert attachment buttom easy to click [#3614](https://api.github.com/repos/nextcloud/deck/pulls/3614)
|
||||||
|
|
||||||
## 1.5.5
|
## 1.6.0
|
||||||
|
|
||||||
- Fix release asset build
|
|
||||||
|
|
||||||
## 1.5.4
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- #3378 Fix menu button position in card modal
|
|
||||||
- #3392 Use displayname instead of uid for mentions (reopened against master)
|
|
||||||
- #3361 Improve combined search @eneiluj
|
|
||||||
- #3381 Extend drag-and-drop zone in card sidebar @Artem4590
|
|
||||||
- #3366 Fix optional parameter order
|
|
||||||
- #3407 Keep exceptions http response generic
|
|
||||||
|
|
||||||
|
|
||||||
## 1.5.3
|
|
||||||
|
|
||||||
### Fied
|
|
||||||
|
|
||||||
- #3317 Additional check for stacks
|
|
||||||
|
|
||||||
|
|
||||||
## 1.5.2
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- #3300 Fix print style issues
|
|
||||||
- #3303 Delete file shares through attachments API
|
|
||||||
- #3306 Return false instead of throwing when getting calendar setting
|
|
||||||
|
|
||||||
## 1.5.1 - 2021-09-03
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- #3224 Move circle checks to a unified service and improve member checks
|
|
||||||
- #3231 Check for null value to avoid TypeError in the group manager
|
|
||||||
- #3264 Defer obtaining the user session in the config service
|
|
||||||
|
|
||||||
|
|
||||||
## 1.5.0 - 2021-07-09
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
* Nextcloud 22 compatibility
|
- #3449 Cache most frequent queries
|
||||||
* [#3105](https://github.com/nextcloud/deck/pull/3105) Compatibility with Cirlces changes in 22
|
- #3177 Use async import for vue component on collections entrypoint @juliushaertl
|
||||||
* [#3147](https://github.com/nextcloud/deck/pull/3147) Add card button to the dashboard widget @jakobroehrl
|
- #2791 Open description links in new tab @fm-sys
|
||||||
* [#2854](https://github.com/nextcloud/deck/pull/2854) Add card button in card overview @jakobroehrl
|
- #3344 Improve combined search @eneiluj
|
||||||
* [#3078](https://github.com/nextcloud/deck/pull/3078) Show on shared boards unassigned cards to all users @jakobroehrl
|
- #3362 Improve search performance @eneiluj
|
||||||
|
- #2710 Due date shortcuts in the datepicker @jakobroehrl
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
* [#2935](https://github.com/nextcloud/deck/pull/2935) Rich object string parameters for notifications @nickvergessen
|
- #3446 Switch to QBMapper in BoardMapper
|
||||||
* [#2950](https://github.com/nextcloud/deck/pull/2950) Remove notification on unshare and add type hints
|
- #3433 Fix event name for updating the description
|
||||||
* [#2983](https://github.com/nextcloud/deck/pull/2983) Fix codemirror description width
|
- #3463 Fix overview card listing
|
||||||
* [#2989](https://github.com/nextcloud/deck/pull/2989) Fix unified comments search with postgres
|
- #3440 Allow to download an attachment without navigating to the files app
|
||||||
* [#3005](https://github.com/nextcloud/deck/pull/3005) Do not query the lookupserver when looking for sharees
|
- #3462 Fix cursor generation if no results are found
|
||||||
* [#3011](https://github.com/nextcloud/deck/pull/3011) L10n: Spelling unification @Valdnet
|
- #3161 Reduce duplicate queries when fetching user boards an permissions @juliushaertl
|
||||||
* [#3014](https://github.com/nextcloud/deck/pull/3014) Proper error handling when fetching comments fails
|
- #3151 Always log generic exceptions @juliushaertl
|
||||||
* [#3016](https://github.com/nextcloud/deck/pull/3016) Allow searching for filters without a query to match all that have a given filter set
|
- #3217 Move circle checks to a unified service and improve member checks @juliushaertl
|
||||||
* [#3021](https://github.com/nextcloud/deck/pull/3021) L10n: Add word "Card" @Valdnet
|
- #3225 Check for null value to avoid TypeError in the group manager @juliushaertl
|
||||||
* [#3025](https://github.com/nextcloud/deck/pull/3025) Show comment counter and highlight if unread comments are available
|
- #3263 Defer obtaining the user session in the config service @juliushaertl
|
||||||
* [#3036](https://github.com/nextcloud/deck/pull/3036) Add link to migration tool for Trello @maxammann
|
- #3294 Fix print style issues @weeman1337
|
||||||
* [#3037](https://github.com/nextcloud/deck/pull/3037) Catch any error during circle detail fetching
|
- #3299 Return false instead of throwing when getting calendar setting @juliushaertl
|
||||||
* [#3038](https://github.com/nextcloud/deck/pull/3038) Get attachment from the user node instead of the share source
|
- #3298 Delete file shares through attachments API @juliushaertl
|
||||||
* [#3092](https://github.com/nextcloud/deck/pull/3092) Refactor update to have proper order of optional parameters
|
- #3343 Fix search pagination cursor @eneiluj
|
||||||
* [#3113](https://github.com/nextcloud/deck/pull/3113) Use new viewer syntax with destructuring object @azul
|
- #3326 add autofocus on board edit @weeman1337
|
||||||
* [#3142](https://github.com/nextcloud/deck/pull/3142) Always pass user id in share provider
|
- #3323 Extend drag-and-drop zone in card sidebar @old-green-frog
|
||||||
* [#3152](https://github.com/nextcloud/deck/pull/3152) Only offer stack creation in emptycontent with proper permissions
|
- #3364 Fix optional parameter order @juliushaertl
|
||||||
* [#3165](https://github.com/nextcloud/deck/pull/3165) Always log generic exceptions
|
- #3324 Fix menu button position in card modal @valerydmitrieva
|
||||||
* [#3168](https://github.com/nextcloud/deck/pull/3168) Reduce duplicate queries when fetching user boards an permissions
|
- #3391 Use displayname instead of uid for mentions (reopened against master) @kffl
|
||||||
|
- #3316 Additional check for stacks @juliushaertl
|
||||||
|
- #3357 Revert "Fix search pagination cursor" @juliushaertl
|
||||||
|
- #3327 Do not show both bullets and checkboxes for checklists @Themanwhosmellslikesugar
|
||||||
|
- #3375 Show absolute dates when printing @weeman1337
|
||||||
|
- #3376 Print assignee names @weeman1337
|
||||||
|
- #3384 Keep exceptions http response generic @juliushaertl
|
||||||
|
|
||||||
|
|
||||||
## 1.4.0 - 2021-04-13
|
## 1.4.0 - 2021-04-13
|
||||||
@@ -146,15 +112,15 @@ All notable changes to this project will be documented in this file.
|
|||||||
## 1.3.0-beta2
|
## 1.3.0-beta2
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck
|
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck @juliushaertl
|
||||||
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop
|
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop @juliushaertl
|
||||||
* [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet
|
* [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet
|
||||||
* [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g
|
* [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g
|
||||||
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly
|
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly @juliushaertl
|
||||||
* [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81
|
* [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81
|
||||||
* [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen
|
* [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen
|
||||||
* [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen
|
* [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen
|
||||||
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron
|
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron @juliushaertl
|
||||||
|
|
||||||
|
|
||||||
## 1.2.2 - 2020-11-24
|
## 1.2.2 - 2020-11-24
|
||||||
@@ -263,31 +229,31 @@ All notable changes to this project will be documented in this file.
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|
||||||
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues
|
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues @juliushaertl
|
||||||
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments
|
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments @juliushaertl
|
||||||
|
|
||||||
## 1.0.4 - 2020-06-26
|
## 1.0.4 - 2020-06-26
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes
|
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes @juliushaertl
|
||||||
* [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox
|
* [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox
|
||||||
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change
|
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change @juliushaertl
|
||||||
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar
|
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar @juliushaertl
|
||||||
|
|
||||||
|
|
||||||
## 1.0.3 - 2020-06-19
|
## 1.0.3 - 2020-06-19
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule
|
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule @juliushaertl
|
||||||
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes
|
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes @juliushaertl
|
||||||
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues
|
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues @juliushaertl
|
||||||
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API
|
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API @juliushaertl
|
||||||
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card
|
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card @juliushaertl
|
||||||
* [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018
|
* [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018
|
||||||
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key
|
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key @juliushaertl
|
||||||
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling
|
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling @juliushaertl
|
||||||
* [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco
|
* [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco
|
||||||
* [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP
|
* [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ Deck is a kanban style organization tool aimed at personal planning and project
|
|||||||
|
|
||||||
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello
|
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello
|
||||||
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
|
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
|
||||||
|
- [A-deck](https://github.com/leoossa/A-deck) - Chrome Extension that allows to create new card in selected stack based on current tab
|
||||||
|
-
|
||||||
## Installation/Update
|
## Installation/Update
|
||||||
|
|
||||||
This app is supposed to work on the two latest Nextcloud versions.
|
This app is supposed to work on the two latest Nextcloud versions.
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
- 🚀 Get your project organized
|
- 🚀 Get your project organized
|
||||||
|
|
||||||
</description>
|
</description>
|
||||||
<version>1.5.7</version>
|
<version>1.6.2</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author>Julius Härtl</author>
|
<author>Julius Härtl</author>
|
||||||
<namespace>Deck</namespace>
|
<namespace>Deck</namespace>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
<database min-version="9.4">pgsql</database>
|
<database min-version="9.4">pgsql</database>
|
||||||
<database>sqlite</database>
|
<database>sqlite</database>
|
||||||
<database min-version="5.5">mysql</database>
|
<database min-version="5.5">mysql</database>
|
||||||
<nextcloud min-version="22" max-version="22"/>
|
<nextcloud min-version="23" max-version="23"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<background-jobs>
|
<background-jobs>
|
||||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||||
|
|||||||
@@ -8,11 +8,6 @@
|
|||||||
"email": "jus@bitgrid.net"
|
"email": "jus@bitgrid.net"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"config": {
|
|
||||||
"platform": {
|
|
||||||
"php": "7.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require": {
|
"require": {
|
||||||
"cogpowered/finediff": "0.3.*"
|
"cogpowered/finediff": "0.3.*"
|
||||||
},
|
},
|
||||||
@@ -26,6 +21,9 @@
|
|||||||
"php-parallel-lint/php-parallel-lint": "^1.2"
|
"php-parallel-lint/php-parallel-lint": "^1.2"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
"platform": {
|
||||||
|
"php": "7.3"
|
||||||
|
},
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"classmap-authoritative": true
|
"classmap-authoritative": true
|
||||||
},
|
},
|
||||||
|
|||||||
5
composer.lock
generated
5
composer.lock
generated
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "a984e9e37aadc6504b0f9ddbd6604835",
|
"content-hash": "bd041cd124789c31ce51141042fb8721",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "cogpowered/finediff",
|
"name": "cogpowered/finediff",
|
||||||
@@ -5253,5 +5253,8 @@
|
|||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": [],
|
"platform": [],
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
|
"platform-overrides": {
|
||||||
|
"php": "7.3"
|
||||||
|
},
|
||||||
"plugin-api-version": "2.2.0"
|
"plugin-api-version": "2.2.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Archivované karty",
|
"Archived cards" : "Archivované karty",
|
||||||
"Add list" : "Přidat seznam",
|
"Add list" : "Přidat seznam",
|
||||||
"List name" : "Název seznamu",
|
"List name" : "Název seznamu",
|
||||||
|
"Active filters" : "Zapnuté filtry",
|
||||||
"Apply filter" : "Uplatnit filtr",
|
"Apply filter" : "Uplatnit filtr",
|
||||||
"Filter by tag" : "Filtrovat podle příznaků",
|
"Filter by tag" : "Filtrovat podle příznaků",
|
||||||
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
|
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Archivované karty",
|
"Archived cards" : "Archivované karty",
|
||||||
"Add list" : "Přidat seznam",
|
"Add list" : "Přidat seznam",
|
||||||
"List name" : "Název seznamu",
|
"List name" : "Název seznamu",
|
||||||
|
"Active filters" : "Zapnuté filtry",
|
||||||
"Apply filter" : "Uplatnit filtr",
|
"Apply filter" : "Uplatnit filtr",
|
||||||
"Filter by tag" : "Filtrovat podle příznaků",
|
"Filter by tag" : "Filtrovat podle příznaků",
|
||||||
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
|
"Filter by assigned user" : "Filtrovat podle uživatele, který je úkolem pověřen",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Archivierte Karten",
|
"Archived cards" : "Archivierte Karten",
|
||||||
"Add list" : "Liste hinzufügen",
|
"Add list" : "Liste hinzufügen",
|
||||||
"List name" : "Listenname",
|
"List name" : "Listenname",
|
||||||
|
"Active filters" : "Aktive Filter",
|
||||||
"Apply filter" : "Filter anwenden",
|
"Apply filter" : "Filter anwenden",
|
||||||
"Filter by tag" : "Nach Schlagwort filtern",
|
"Filter by tag" : "Nach Schlagwort filtern",
|
||||||
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Archivierte Karten",
|
"Archived cards" : "Archivierte Karten",
|
||||||
"Add list" : "Liste hinzufügen",
|
"Add list" : "Liste hinzufügen",
|
||||||
"List name" : "Listenname",
|
"List name" : "Listenname",
|
||||||
|
"Active filters" : "Aktive Filter",
|
||||||
"Apply filter" : "Filter anwenden",
|
"Apply filter" : "Filter anwenden",
|
||||||
"Filter by tag" : "Nach Schlagwort filtern",
|
"Filter by tag" : "Nach Schlagwort filtern",
|
||||||
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Archivierte Karten",
|
"Archived cards" : "Archivierte Karten",
|
||||||
"Add list" : "Liste hinzufügen",
|
"Add list" : "Liste hinzufügen",
|
||||||
"List name" : "Listenname",
|
"List name" : "Listenname",
|
||||||
|
"Active filters" : "Aktive Filter",
|
||||||
"Apply filter" : "Filter anwenden",
|
"Apply filter" : "Filter anwenden",
|
||||||
"Filter by tag" : "Nach Schlagwort filtern",
|
"Filter by tag" : "Nach Schlagwort filtern",
|
||||||
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Archivierte Karten",
|
"Archived cards" : "Archivierte Karten",
|
||||||
"Add list" : "Liste hinzufügen",
|
"Add list" : "Liste hinzufügen",
|
||||||
"List name" : "Listenname",
|
"List name" : "Listenname",
|
||||||
|
"Active filters" : "Aktive Filter",
|
||||||
"Apply filter" : "Filter anwenden",
|
"Apply filter" : "Filter anwenden",
|
||||||
"Filter by tag" : "Nach Schlagwort filtern",
|
"Filter by tag" : "Nach Schlagwort filtern",
|
||||||
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
"Filter by assigned user" : "Nach zugewiesenem Benutzer filtern",
|
||||||
|
|||||||
15
l10n/es.js
15
l10n/es.js
@@ -100,10 +100,12 @@ OC.L10N.register(
|
|||||||
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
|
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
|
||||||
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
|
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
|
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
|
||||||
|
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentario tiene más de %s caracteres.\nAñadido como adjunto a la tarjeta con el nombre %s.\nAccesible en la URL: %s.",
|
||||||
"Card not found" : "Tarjeta no encontrada",
|
"Card not found" : "Tarjeta no encontrada",
|
||||||
"Path is already shared with this card" : "La ruta ya se ha compartido con esta tarjeta",
|
"Path is already shared with this card" : "La ruta ya se ha compartido con esta tarjeta",
|
||||||
"Invalid date, date format must be YYYY-MM-DD" : "Fecha no válida, el formato de las fechas debe ser AAAA-MM-DD",
|
"Invalid date, date format must be YYYY-MM-DD" : "Fecha no válida, el formato de las fechas debe ser AAAA-MM-DD",
|
||||||
"Personal planning and team project organization" : "Planificación personal y organización de proyecto de equipo",
|
"Personal planning and team project organization" : "Planificación personal y organización de proyecto de equipo",
|
||||||
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
||||||
"Card details" : "Detalles de la tarjeta",
|
"Card details" : "Detalles de la tarjeta",
|
||||||
"Add board" : "Añadir tablero",
|
"Add board" : "Añadir tablero",
|
||||||
"Select the board to link to a project" : "Selecciona el tablero que enlazar a un proyecto",
|
"Select the board to link to a project" : "Selecciona el tablero que enlazar a un proyecto",
|
||||||
@@ -133,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Tarjetas archivadas",
|
"Archived cards" : "Tarjetas archivadas",
|
||||||
"Add list" : "Agregar lista",
|
"Add list" : "Agregar lista",
|
||||||
"List name" : "Nombre de la lista",
|
"List name" : "Nombre de la lista",
|
||||||
|
"Active filters" : "Filtros activos",
|
||||||
"Apply filter" : "Aplicar filtro",
|
"Apply filter" : "Aplicar filtro",
|
||||||
"Filter by tag" : "Filtrar por etiqueta",
|
"Filter by tag" : "Filtrar por etiqueta",
|
||||||
"Filter by assigned user" : "Filtrar por usuario asignado",
|
"Filter by assigned user" : "Filtrar por usuario asignado",
|
||||||
@@ -171,7 +174,11 @@ OC.L10N.register(
|
|||||||
"Owner" : "Propietario",
|
"Owner" : "Propietario",
|
||||||
"Delete" : "Eliminar",
|
"Delete" : "Eliminar",
|
||||||
"Failed to create share with {displayName}" : "Fallo al crear el recurso compartido denominado {displayName}",
|
"Failed to create share with {displayName}" : "Fallo al crear el recurso compartido denominado {displayName}",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?",
|
||||||
|
"Transfer the board." : "Transfiere el tablero.",
|
||||||
"Transfer" : "Transferir",
|
"Transfer" : "Transferir",
|
||||||
|
"The board has been transferred to {user}" : "El tablero ha sido transferido a {usuario}",
|
||||||
|
"Failed to transfer the board to {user}" : "Failed to transfer the board to {user}",
|
||||||
"Add a new list" : "Añadir una lista nueva",
|
"Add a new list" : "Añadir una lista nueva",
|
||||||
"Archive all cards" : "Archivar todas las tarjetas",
|
"Archive all cards" : "Archivar todas las tarjetas",
|
||||||
"Delete list" : "Eliminar lista",
|
"Delete list" : "Eliminar lista",
|
||||||
@@ -287,6 +294,10 @@ OC.L10N.register(
|
|||||||
"Share {file} with a Deck card" : "Compartir {file} con una tarjeta de Deck",
|
"Share {file} with a Deck card" : "Compartir {file} con una tarjeta de Deck",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
||||||
"This week" : "Esta semana"
|
"Are you sure you want to transfer the board {title} for {user} ?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?",
|
||||||
|
"Transfer the board for {user} successfully" : "Transferir el tablero para {usuario} con éxito",
|
||||||
|
"Failed to transfer the board for {user}" : "No se ha podido transferir el tablero para {usuario}",
|
||||||
|
"This week" : "Esta semana",
|
||||||
|
"Are you sure you want to transfer the board {title} for {user}?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
15
l10n/es.json
15
l10n/es.json
@@ -98,10 +98,12 @@
|
|||||||
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
|
"Could not write file to disk" : "No se ha podido escribir el archivo al disco",
|
||||||
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
|
"A PHP extension stopped the file upload" : "Una extensión de PHP ha detenido la subida del archivo",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
|
"No file uploaded or file size exceeds maximum of %s" : "No se ha subido ningún archivo, o el tamaño del archivo excede el máximo de %s",
|
||||||
|
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentario tiene más de %s caracteres.\nAñadido como adjunto a la tarjeta con el nombre %s.\nAccesible en la URL: %s.",
|
||||||
"Card not found" : "Tarjeta no encontrada",
|
"Card not found" : "Tarjeta no encontrada",
|
||||||
"Path is already shared with this card" : "La ruta ya se ha compartido con esta tarjeta",
|
"Path is already shared with this card" : "La ruta ya se ha compartido con esta tarjeta",
|
||||||
"Invalid date, date format must be YYYY-MM-DD" : "Fecha no válida, el formato de las fechas debe ser AAAA-MM-DD",
|
"Invalid date, date format must be YYYY-MM-DD" : "Fecha no válida, el formato de las fechas debe ser AAAA-MM-DD",
|
||||||
"Personal planning and team project organization" : "Planificación personal y organización de proyecto de equipo",
|
"Personal planning and team project organization" : "Planificación personal y organización de proyecto de equipo",
|
||||||
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
||||||
"Card details" : "Detalles de la tarjeta",
|
"Card details" : "Detalles de la tarjeta",
|
||||||
"Add board" : "Añadir tablero",
|
"Add board" : "Añadir tablero",
|
||||||
"Select the board to link to a project" : "Selecciona el tablero que enlazar a un proyecto",
|
"Select the board to link to a project" : "Selecciona el tablero que enlazar a un proyecto",
|
||||||
@@ -131,6 +133,7 @@
|
|||||||
"Archived cards" : "Tarjetas archivadas",
|
"Archived cards" : "Tarjetas archivadas",
|
||||||
"Add list" : "Agregar lista",
|
"Add list" : "Agregar lista",
|
||||||
"List name" : "Nombre de la lista",
|
"List name" : "Nombre de la lista",
|
||||||
|
"Active filters" : "Filtros activos",
|
||||||
"Apply filter" : "Aplicar filtro",
|
"Apply filter" : "Aplicar filtro",
|
||||||
"Filter by tag" : "Filtrar por etiqueta",
|
"Filter by tag" : "Filtrar por etiqueta",
|
||||||
"Filter by assigned user" : "Filtrar por usuario asignado",
|
"Filter by assigned user" : "Filtrar por usuario asignado",
|
||||||
@@ -169,7 +172,11 @@
|
|||||||
"Owner" : "Propietario",
|
"Owner" : "Propietario",
|
||||||
"Delete" : "Eliminar",
|
"Delete" : "Eliminar",
|
||||||
"Failed to create share with {displayName}" : "Fallo al crear el recurso compartido denominado {displayName}",
|
"Failed to create share with {displayName}" : "Fallo al crear el recurso compartido denominado {displayName}",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?",
|
||||||
|
"Transfer the board." : "Transfiere el tablero.",
|
||||||
"Transfer" : "Transferir",
|
"Transfer" : "Transferir",
|
||||||
|
"The board has been transferred to {user}" : "El tablero ha sido transferido a {usuario}",
|
||||||
|
"Failed to transfer the board to {user}" : "Failed to transfer the board to {user}",
|
||||||
"Add a new list" : "Añadir una lista nueva",
|
"Add a new list" : "Añadir una lista nueva",
|
||||||
"Archive all cards" : "Archivar todas las tarjetas",
|
"Archive all cards" : "Archivar todas las tarjetas",
|
||||||
"Delete list" : "Eliminar lista",
|
"Delete list" : "Eliminar lista",
|
||||||
@@ -285,6 +292,10 @@
|
|||||||
"Share {file} with a Deck card" : "Compartir {file} con una tarjeta de Deck",
|
"Share {file} with a Deck card" : "Compartir {file} con una tarjeta de Deck",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck es una herramienta de organización de estilo kanban dirigida a la planificación personal y la organización de proyectos para equipos integrados con Nextcloud.\n\n\n- 📥 Agrega tus tareas a las tarjetas y ordénalas.\n- 📄 Escriba notas adicionales\n- 🔖 Asignar etiquetas para una organización mejor\n- 👥 Comparte con tu equipo, amigos o familia.\n- 📎 Adjuntar archivos e incrustarlos en su descripción\n- 💬 Discuta con su equipo usando comentarios.\n- ⚡ Mantenga un registro de los cambios en el flujo de actividad\n- 🚀 Organiza tu proyecto",
|
||||||
"This week" : "Esta semana"
|
"Are you sure you want to transfer the board {title} for {user} ?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?",
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
"Transfer the board for {user} successfully" : "Transferir el tablero para {usuario} con éxito",
|
||||||
|
"Failed to transfer the board for {user}" : "No se ha podido transferir el tablero para {usuario}",
|
||||||
|
"This week" : "Esta semana",
|
||||||
|
"Are you sure you want to transfer the board {title} for {user}?" : "¿Estás seguro de que quieres transferir el tablero {título} a {usuario}?"
|
||||||
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -60,4 +60,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -57,5 +57,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -57,4 +57,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -54,5 +54,5 @@
|
|||||||
"An error occurred" : "Ocurrió un error",
|
"An error occurred" : "Ocurrió un error",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -64,4 +64,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -61,5 +61,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -67,4 +67,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -64,5 +64,5 @@
|
|||||||
"An error occurred" : "Ha ocurrido un error",
|
"An error occurred" : "Ha ocurrido un error",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -61,4 +61,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -58,5 +58,5 @@
|
|||||||
"An error occurred" : "Se presentó un error",
|
"An error occurred" : "Se presentó un error",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -63,4 +63,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=2; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -60,5 +60,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=2; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -56,5 +56,5 @@
|
|||||||
"Delete board" : "Borrar tableros",
|
"Delete board" : "Borrar tableros",
|
||||||
"Share" : "Compartir",
|
"Share" : "Compartir",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Artxibatutako txartelak",
|
"Archived cards" : "Artxibatutako txartelak",
|
||||||
"Add list" : "Gehitu zerrenda",
|
"Add list" : "Gehitu zerrenda",
|
||||||
"List name" : "Zerrendaren izena",
|
"List name" : "Zerrendaren izena",
|
||||||
|
"Active filters" : "Iragazki aktiboak",
|
||||||
"Apply filter" : "Ezarri iragazkia",
|
"Apply filter" : "Ezarri iragazkia",
|
||||||
"Filter by tag" : "Iragazi etiketaz",
|
"Filter by tag" : "Iragazi etiketaz",
|
||||||
"Filter by assigned user" : "Iragazi esleitutako erabiltzailez",
|
"Filter by assigned user" : "Iragazi esleitutako erabiltzailez",
|
||||||
@@ -173,8 +174,11 @@ OC.L10N.register(
|
|||||||
"Owner" : "Jabea",
|
"Owner" : "Jabea",
|
||||||
"Delete" : "Ezabatu",
|
"Delete" : "Ezabatu",
|
||||||
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "Ziur {title} taula {user}-(a)ri transferitu nahi diozula?",
|
||||||
"Transfer the board." : "Transferitu panela.",
|
"Transfer the board." : "Transferitu panela.",
|
||||||
"Transfer" : "Transferitu",
|
"Transfer" : "Transferitu",
|
||||||
|
"The board has been transferred to {user}" : "Arbela {user}-(a)ri transferitu zaio",
|
||||||
|
"Failed to transfer the board to {user}" : "Ezin izan zaio transferitu arbela {use}-(a)ri",
|
||||||
"Add a new list" : "Gehitu zerrenda berria",
|
"Add a new list" : "Gehitu zerrenda berria",
|
||||||
"Archive all cards" : "Artxibatu txartel guztiak",
|
"Archive all cards" : "Artxibatu txartel guztiak",
|
||||||
"Delete list" : "Zerrenda ezabatu",
|
"Delete list" : "Zerrenda ezabatu",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Artxibatutako txartelak",
|
"Archived cards" : "Artxibatutako txartelak",
|
||||||
"Add list" : "Gehitu zerrenda",
|
"Add list" : "Gehitu zerrenda",
|
||||||
"List name" : "Zerrendaren izena",
|
"List name" : "Zerrendaren izena",
|
||||||
|
"Active filters" : "Iragazki aktiboak",
|
||||||
"Apply filter" : "Ezarri iragazkia",
|
"Apply filter" : "Ezarri iragazkia",
|
||||||
"Filter by tag" : "Iragazi etiketaz",
|
"Filter by tag" : "Iragazi etiketaz",
|
||||||
"Filter by assigned user" : "Iragazi esleitutako erabiltzailez",
|
"Filter by assigned user" : "Iragazi esleitutako erabiltzailez",
|
||||||
@@ -171,8 +172,11 @@
|
|||||||
"Owner" : "Jabea",
|
"Owner" : "Jabea",
|
||||||
"Delete" : "Ezabatu",
|
"Delete" : "Ezabatu",
|
||||||
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
"Failed to create share with {displayName}" : "Ezin izan da {displayName}-(r)ekin partekatzea sortu",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "Ziur {title} taula {user}-(a)ri transferitu nahi diozula?",
|
||||||
"Transfer the board." : "Transferitu panela.",
|
"Transfer the board." : "Transferitu panela.",
|
||||||
"Transfer" : "Transferitu",
|
"Transfer" : "Transferitu",
|
||||||
|
"The board has been transferred to {user}" : "Arbela {user}-(a)ri transferitu zaio",
|
||||||
|
"Failed to transfer the board to {user}" : "Ezin izan zaio transferitu arbela {use}-(a)ri",
|
||||||
"Add a new list" : "Gehitu zerrenda berria",
|
"Add a new list" : "Gehitu zerrenda berria",
|
||||||
"Archive all cards" : "Artxibatu txartel guztiak",
|
"Archive all cards" : "Artxibatu txartel guztiak",
|
||||||
"Delete list" : "Zerrenda ezabatu",
|
"Delete list" : "Zerrenda ezabatu",
|
||||||
|
|||||||
24
l10n/fa.js
24
l10n/fa.js
@@ -73,7 +73,7 @@ OC.L10N.register(
|
|||||||
"The card {deck-card} on {deck-board} has reached its due date." : "برگه {deck-card} در {deck-board} به تاریخ سررسید خود رسیده است.",
|
"The card {deck-card} on {deck-board} has reached its due date." : "برگه {deck-card} در {deck-board} به تاریخ سررسید خود رسیده است.",
|
||||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} از شما در نظری در {deck-card} نام برده است.",
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} از شما در نظری در {deck-card} نام برده است.",
|
||||||
"{user} has shared {deck-board} with you." : "{user} {deck-board} را با شما به اشتراک گذاشته است.",
|
"{user} has shared {deck-board} with you." : "{user} {deck-board} را با شما به اشتراک گذاشته است.",
|
||||||
"Card comments" : "برگهٔ نظر",
|
"Card comments" : "دیدگاههای برگه",
|
||||||
"No data was provided to create an attachment." : "هیچ داده ای برای ایجاد پیوست ارائه نشد.",
|
"No data was provided to create an attachment." : "هیچ داده ای برای ایجاد پیوست ارائه نشد.",
|
||||||
"Finished" : "تمام شده",
|
"Finished" : "تمام شده",
|
||||||
"To review" : "برای بازبینی",
|
"To review" : "برای بازبینی",
|
||||||
@@ -101,20 +101,20 @@ OC.L10N.register(
|
|||||||
"Personal planning and team project organization" : "برنامهریزی شخصی و سازماندهی کار گروهی",
|
"Personal planning and team project organization" : "برنامهریزی شخصی و سازماندهی کار گروهی",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "برگهدان یک ابزار سازماندهی سبک کانبان است که هدف آن برنامهریزی شخصی و سازماندهی پروژه برای گروههای مرتبط با Nextcloud است.\n\n\n- 📥 وظایف خود را به برگهها اضافه کنید و آنها را مرتب کنید\n- 📄 یادداشتهای اضافی را در Markdown یادداشت کنید\n- 🔖 برچسبهایی را برای سازماندهی بهتر اختصاص دهید\n- 👥 با گروه، دوستان یا خانوادهٔ خود به اشتراک بگذارید\n- 📎 فایلها را ضمیمه کنید و آنها را در توضیحات Markdown خود قرار دهید\n- 💬 با استفاده از نظرات با تیم خود بحث کنید\n- ⚡ تغییرات در جریان فعالیت را پیگیری کنید\n- 🚀 پروژه خود را سازماندهی کنید",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "برگهدان یک ابزار سازماندهی سبک کانبان است که هدف آن برنامهریزی شخصی و سازماندهی پروژه برای گروههای مرتبط با Nextcloud است.\n\n\n- 📥 وظایف خود را به برگهها اضافه کنید و آنها را مرتب کنید\n- 📄 یادداشتهای اضافی را در Markdown یادداشت کنید\n- 🔖 برچسبهایی را برای سازماندهی بهتر اختصاص دهید\n- 👥 با گروه، دوستان یا خانوادهٔ خود به اشتراک بگذارید\n- 📎 فایلها را ضمیمه کنید و آنها را در توضیحات Markdown خود قرار دهید\n- 💬 با استفاده از نظرات با تیم خود بحث کنید\n- ⚡ تغییرات در جریان فعالیت را پیگیری کنید\n- 🚀 پروژه خود را سازماندهی کنید",
|
||||||
"Card details" : "جزئیات برگه",
|
"Card details" : "جزئیات برگه",
|
||||||
"Add board" : "تخته را اضافه کنید",
|
"Add board" : "افزودن تخته",
|
||||||
"Select the board to link to a project" : "تختهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
"Select the board to link to a project" : "تختهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
||||||
"Search by board title" : "جستجو بر اساس عنوان تخته",
|
"Search by board title" : "جستجو بر اساس عنوان تخته",
|
||||||
"Select board" : "انتخاب تخته",
|
"Select board" : "انتخاب تخته",
|
||||||
"Create a new card" : "برگهٔ جدید بسازید",
|
"Create a new card" : "یک برگهٔ جدید بسازید",
|
||||||
"Select a board" : "انتخاب یک تخته",
|
"Select a board" : "انتخاب یک تخته",
|
||||||
"Select a list" : "یک فهرست برگزینید",
|
"Select a list" : "یک فهرست برگزینید",
|
||||||
"Card title" : "عنوان برگه",
|
"Card title" : "عنوان برگه",
|
||||||
"Cancel" : "لغو",
|
"Cancel" : "لغو",
|
||||||
"Creating the new card …" : "ساختن برگهٔ جدید",
|
"Creating the new card …" : "ساختن برگهٔ جدید ...",
|
||||||
"Card \"{card}\" was added to \"{board}\"" : "برگه \"{card}\" به \"{board}\" اضافه شد",
|
"Card \"{card}\" was added to \"{board}\"" : "برگه \"{card}\" به \"{board}\" اضافه شد",
|
||||||
"Open card" : "برگهٔ گشوده",
|
"Open card" : "بازکردن برگه",
|
||||||
"Close" : "بسته",
|
"Close" : "بسته",
|
||||||
"Create card" : "برگه بسازید",
|
"Create card" : "ایجاد برگه",
|
||||||
"Select a card" : "انتخاب یک برگه",
|
"Select a card" : "انتخاب یک برگه",
|
||||||
"Select the card to link to a project" : "برگهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
"Select the card to link to a project" : "برگهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
||||||
"Link to card" : "پیوند به برگه",
|
"Link to card" : "پیوند به برگه",
|
||||||
@@ -200,10 +200,10 @@ OC.L10N.register(
|
|||||||
"The title cannot be empty." : "عنوان نمیتواند خالی باشد.",
|
"The title cannot be empty." : "عنوان نمیتواند خالی باشد.",
|
||||||
"No comments yet. Begin the discussion!" : "هنوز نظری وجود ندارد. بحثی را آغاز کنید!",
|
"No comments yet. Begin the discussion!" : "هنوز نظری وجود ندارد. بحثی را آغاز کنید!",
|
||||||
"Failed to load comments" : "نظرات بارگیری نشد",
|
"Failed to load comments" : "نظرات بارگیری نشد",
|
||||||
"Assign a tag to this card…" : "یک برچسب به این کارت اختصاص دهید…",
|
"Assign a tag to this card…" : "یک برچسب به این برگه اختصاص دهید…",
|
||||||
"Assign to users" : "به کاربران اختصاص دهید",
|
"Assign to users" : "به کاربران اختصاص دهید",
|
||||||
"Assign to users/groups/circles" : "به کاربران/ گروهها/ حلقهها اختصاص دهید",
|
"Assign to users/groups/circles" : "به کاربران/ گروهها/ حلقهها اختصاص دهید",
|
||||||
"Assign a user to this card…" : "اختصاص یک کاربر به این کارت…",
|
"Assign a user to this card…" : "اختصاص یک کاربر به این برگه…",
|
||||||
"Due date" : "موعد مقرر",
|
"Due date" : "موعد مقرر",
|
||||||
"Set a due date" : "تاریخ سررسید را تعیین کنید",
|
"Set a due date" : "تاریخ سررسید را تعیین کنید",
|
||||||
"Remove due date" : "تاریخ سررسید را حذف کنید",
|
"Remove due date" : "تاریخ سررسید را حذف کنید",
|
||||||
@@ -232,11 +232,11 @@ OC.L10N.register(
|
|||||||
"{count} comments, {unread} unread" : "{count} نظر، { خوانده نشده} خوانده نشده",
|
"{count} comments, {unread} unread" : "{count} نظر، { خوانده نشده} خوانده نشده",
|
||||||
"Assign to me" : "به من اختصاص دهید",
|
"Assign to me" : "به من اختصاص دهید",
|
||||||
"Unassign myself" : "واگذاری به خودم را لغو میکنم",
|
"Unassign myself" : "واگذاری به خودم را لغو میکنم",
|
||||||
"Move card" : "انتقال کارت",
|
"Move card" : "انتقال برگه",
|
||||||
"Unarchive card" : "برگه را از بایگانی خارج کنید",
|
"Unarchive card" : "برگه را از بایگانی خارج کنید",
|
||||||
"Archive card" : "کارت بایگانی",
|
"Archive card" : "بایگانی برگه",
|
||||||
"Delete card" : "حذف کارت",
|
"Delete card" : "حذف برگه",
|
||||||
"Move card to another board" : "انتقال کارت به تختهای دیگر",
|
"Move card to another board" : "انتقال برگه به تختهای دیگر",
|
||||||
"List is empty" : "فهرست خالی است",
|
"List is empty" : "فهرست خالی است",
|
||||||
"Card deleted" : "برگه پاک شد",
|
"Card deleted" : "برگه پاک شد",
|
||||||
"seconds ago" : "ثانیههایی پیش",
|
"seconds ago" : "ثانیههایی پیش",
|
||||||
|
|||||||
24
l10n/fa.json
24
l10n/fa.json
@@ -71,7 +71,7 @@
|
|||||||
"The card {deck-card} on {deck-board} has reached its due date." : "برگه {deck-card} در {deck-board} به تاریخ سررسید خود رسیده است.",
|
"The card {deck-card} on {deck-board} has reached its due date." : "برگه {deck-card} در {deck-board} به تاریخ سررسید خود رسیده است.",
|
||||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} از شما در نظری در {deck-card} نام برده است.",
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} از شما در نظری در {deck-card} نام برده است.",
|
||||||
"{user} has shared {deck-board} with you." : "{user} {deck-board} را با شما به اشتراک گذاشته است.",
|
"{user} has shared {deck-board} with you." : "{user} {deck-board} را با شما به اشتراک گذاشته است.",
|
||||||
"Card comments" : "برگهٔ نظر",
|
"Card comments" : "دیدگاههای برگه",
|
||||||
"No data was provided to create an attachment." : "هیچ داده ای برای ایجاد پیوست ارائه نشد.",
|
"No data was provided to create an attachment." : "هیچ داده ای برای ایجاد پیوست ارائه نشد.",
|
||||||
"Finished" : "تمام شده",
|
"Finished" : "تمام شده",
|
||||||
"To review" : "برای بازبینی",
|
"To review" : "برای بازبینی",
|
||||||
@@ -99,20 +99,20 @@
|
|||||||
"Personal planning and team project organization" : "برنامهریزی شخصی و سازماندهی کار گروهی",
|
"Personal planning and team project organization" : "برنامهریزی شخصی و سازماندهی کار گروهی",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "برگهدان یک ابزار سازماندهی سبک کانبان است که هدف آن برنامهریزی شخصی و سازماندهی پروژه برای گروههای مرتبط با Nextcloud است.\n\n\n- 📥 وظایف خود را به برگهها اضافه کنید و آنها را مرتب کنید\n- 📄 یادداشتهای اضافی را در Markdown یادداشت کنید\n- 🔖 برچسبهایی را برای سازماندهی بهتر اختصاص دهید\n- 👥 با گروه، دوستان یا خانوادهٔ خود به اشتراک بگذارید\n- 📎 فایلها را ضمیمه کنید و آنها را در توضیحات Markdown خود قرار دهید\n- 💬 با استفاده از نظرات با تیم خود بحث کنید\n- ⚡ تغییرات در جریان فعالیت را پیگیری کنید\n- 🚀 پروژه خود را سازماندهی کنید",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "برگهدان یک ابزار سازماندهی سبک کانبان است که هدف آن برنامهریزی شخصی و سازماندهی پروژه برای گروههای مرتبط با Nextcloud است.\n\n\n- 📥 وظایف خود را به برگهها اضافه کنید و آنها را مرتب کنید\n- 📄 یادداشتهای اضافی را در Markdown یادداشت کنید\n- 🔖 برچسبهایی را برای سازماندهی بهتر اختصاص دهید\n- 👥 با گروه، دوستان یا خانوادهٔ خود به اشتراک بگذارید\n- 📎 فایلها را ضمیمه کنید و آنها را در توضیحات Markdown خود قرار دهید\n- 💬 با استفاده از نظرات با تیم خود بحث کنید\n- ⚡ تغییرات در جریان فعالیت را پیگیری کنید\n- 🚀 پروژه خود را سازماندهی کنید",
|
||||||
"Card details" : "جزئیات برگه",
|
"Card details" : "جزئیات برگه",
|
||||||
"Add board" : "تخته را اضافه کنید",
|
"Add board" : "افزودن تخته",
|
||||||
"Select the board to link to a project" : "تختهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
"Select the board to link to a project" : "تختهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
||||||
"Search by board title" : "جستجو بر اساس عنوان تخته",
|
"Search by board title" : "جستجو بر اساس عنوان تخته",
|
||||||
"Select board" : "انتخاب تخته",
|
"Select board" : "انتخاب تخته",
|
||||||
"Create a new card" : "برگهٔ جدید بسازید",
|
"Create a new card" : "یک برگهٔ جدید بسازید",
|
||||||
"Select a board" : "انتخاب یک تخته",
|
"Select a board" : "انتخاب یک تخته",
|
||||||
"Select a list" : "یک فهرست برگزینید",
|
"Select a list" : "یک فهرست برگزینید",
|
||||||
"Card title" : "عنوان برگه",
|
"Card title" : "عنوان برگه",
|
||||||
"Cancel" : "لغو",
|
"Cancel" : "لغو",
|
||||||
"Creating the new card …" : "ساختن برگهٔ جدید",
|
"Creating the new card …" : "ساختن برگهٔ جدید ...",
|
||||||
"Card \"{card}\" was added to \"{board}\"" : "برگه \"{card}\" به \"{board}\" اضافه شد",
|
"Card \"{card}\" was added to \"{board}\"" : "برگه \"{card}\" به \"{board}\" اضافه شد",
|
||||||
"Open card" : "برگهٔ گشوده",
|
"Open card" : "بازکردن برگه",
|
||||||
"Close" : "بسته",
|
"Close" : "بسته",
|
||||||
"Create card" : "برگه بسازید",
|
"Create card" : "ایجاد برگه",
|
||||||
"Select a card" : "انتخاب یک برگه",
|
"Select a card" : "انتخاب یک برگه",
|
||||||
"Select the card to link to a project" : "برگهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
"Select the card to link to a project" : "برگهای را برای ایجاد پیوند با یک پروژه انتخاب کنید",
|
||||||
"Link to card" : "پیوند به برگه",
|
"Link to card" : "پیوند به برگه",
|
||||||
@@ -198,10 +198,10 @@
|
|||||||
"The title cannot be empty." : "عنوان نمیتواند خالی باشد.",
|
"The title cannot be empty." : "عنوان نمیتواند خالی باشد.",
|
||||||
"No comments yet. Begin the discussion!" : "هنوز نظری وجود ندارد. بحثی را آغاز کنید!",
|
"No comments yet. Begin the discussion!" : "هنوز نظری وجود ندارد. بحثی را آغاز کنید!",
|
||||||
"Failed to load comments" : "نظرات بارگیری نشد",
|
"Failed to load comments" : "نظرات بارگیری نشد",
|
||||||
"Assign a tag to this card…" : "یک برچسب به این کارت اختصاص دهید…",
|
"Assign a tag to this card…" : "یک برچسب به این برگه اختصاص دهید…",
|
||||||
"Assign to users" : "به کاربران اختصاص دهید",
|
"Assign to users" : "به کاربران اختصاص دهید",
|
||||||
"Assign to users/groups/circles" : "به کاربران/ گروهها/ حلقهها اختصاص دهید",
|
"Assign to users/groups/circles" : "به کاربران/ گروهها/ حلقهها اختصاص دهید",
|
||||||
"Assign a user to this card…" : "اختصاص یک کاربر به این کارت…",
|
"Assign a user to this card…" : "اختصاص یک کاربر به این برگه…",
|
||||||
"Due date" : "موعد مقرر",
|
"Due date" : "موعد مقرر",
|
||||||
"Set a due date" : "تاریخ سررسید را تعیین کنید",
|
"Set a due date" : "تاریخ سررسید را تعیین کنید",
|
||||||
"Remove due date" : "تاریخ سررسید را حذف کنید",
|
"Remove due date" : "تاریخ سررسید را حذف کنید",
|
||||||
@@ -230,11 +230,11 @@
|
|||||||
"{count} comments, {unread} unread" : "{count} نظر، { خوانده نشده} خوانده نشده",
|
"{count} comments, {unread} unread" : "{count} نظر، { خوانده نشده} خوانده نشده",
|
||||||
"Assign to me" : "به من اختصاص دهید",
|
"Assign to me" : "به من اختصاص دهید",
|
||||||
"Unassign myself" : "واگذاری به خودم را لغو میکنم",
|
"Unassign myself" : "واگذاری به خودم را لغو میکنم",
|
||||||
"Move card" : "انتقال کارت",
|
"Move card" : "انتقال برگه",
|
||||||
"Unarchive card" : "برگه را از بایگانی خارج کنید",
|
"Unarchive card" : "برگه را از بایگانی خارج کنید",
|
||||||
"Archive card" : "کارت بایگانی",
|
"Archive card" : "بایگانی برگه",
|
||||||
"Delete card" : "حذف کارت",
|
"Delete card" : "حذف برگه",
|
||||||
"Move card to another board" : "انتقال کارت به تختهای دیگر",
|
"Move card to another board" : "انتقال برگه به تختهای دیگر",
|
||||||
"List is empty" : "فهرست خالی است",
|
"List is empty" : "فهرست خالی است",
|
||||||
"Card deleted" : "برگه پاک شد",
|
"Card deleted" : "برگه پاک شد",
|
||||||
"seconds ago" : "ثانیههایی پیش",
|
"seconds ago" : "ثانیههایی پیش",
|
||||||
|
|||||||
@@ -291,4 +291,4 @@ OC.L10N.register(
|
|||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 📎 Attachez des fichiers et utilisez les dans vos descriptions en Markdown\n- 💬 Échangez avec votre équipe grâce aux commentaires\n- ⚡ Gardez un œil sur les modifications dans le flux d'activité\n- 🚀 Organisez vos projets",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 📎 Attachez des fichiers et utilisez les dans vos descriptions en Markdown\n- 💬 Échangez avec votre équipe grâce aux commentaires\n- ⚡ Gardez un œil sur les modifications dans le flux d'activité\n- 🚀 Organisez vos projets",
|
||||||
"This week" : "Cette semaine"
|
"This week" : "Cette semaine"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n > 1);");
|
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -288,5 +288,5 @@
|
|||||||
"Share" : "Partager",
|
"Share" : "Partager",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 📎 Attachez des fichiers et utilisez les dans vos descriptions en Markdown\n- 💬 Échangez avec votre équipe grâce aux commentaires\n- ⚡ Gardez un œil sur les modifications dans le flux d'activité\n- 🚀 Organisez vos projets",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck est un outil d'organisation de style kanban destiné à la planification personnelle et à l'organisation de projets pour les équipes intégrées à Nextcloud.\n\n\n- 📥 Ajoutez vos tâches à des cartes et organisez-les\n- 📄 Écrivez des notes supplémentaires en Markdown\n- 🔖 Affectez des étiquettes pour une organisation encore meilleure\n- 👥 Partagez avec votre équipe, vos amis ou votre famille\n- 📎 Attachez des fichiers et utilisez les dans vos descriptions en Markdown\n- 💬 Échangez avec votre équipe grâce aux commentaires\n- ⚡ Gardez un œil sur les modifications dans le flux d'activité\n- 🚀 Organisez vos projets",
|
||||||
"This week" : "Cette semaine"
|
"This week" : "Cette semaine"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Archivált kártyák",
|
"Archived cards" : "Archivált kártyák",
|
||||||
"Add list" : "Lista hozzáadása",
|
"Add list" : "Lista hozzáadása",
|
||||||
"List name" : "Listanév",
|
"List name" : "Listanév",
|
||||||
|
"Active filters" : "Aktív szűrők",
|
||||||
"Apply filter" : "Szűrő alkalmazása",
|
"Apply filter" : "Szűrő alkalmazása",
|
||||||
"Filter by tag" : "Szűrés címke szerint",
|
"Filter by tag" : "Szűrés címke szerint",
|
||||||
"Filter by assigned user" : "Szűrés hozzárendelt felhasználó szerint",
|
"Filter by assigned user" : "Szűrés hozzárendelt felhasználó szerint",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Archivált kártyák",
|
"Archived cards" : "Archivált kártyák",
|
||||||
"Add list" : "Lista hozzáadása",
|
"Add list" : "Lista hozzáadása",
|
||||||
"List name" : "Listanév",
|
"List name" : "Listanév",
|
||||||
|
"Active filters" : "Aktív szűrők",
|
||||||
"Apply filter" : "Szűrő alkalmazása",
|
"Apply filter" : "Szűrő alkalmazása",
|
||||||
"Filter by tag" : "Szűrés címke szerint",
|
"Filter by tag" : "Szűrés címke szerint",
|
||||||
"Filter by assigned user" : "Szűrés hozzárendelt felhasználó szerint",
|
"Filter by assigned user" : "Szűrés hozzárendelt felhasználó szerint",
|
||||||
|
|||||||
@@ -291,4 +291,4 @@ OC.L10N.register(
|
|||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck è uno strumento di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrato con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e tienile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Condividi con la tua squadra, amici o famiglia\n- 📎 Allega file e integrali nella tua descrizione markdown\n- 💬 Discuti con la tua squadra utilizzando i commenti\n- ⚡ Tieni traccia dei cambiamenti nel flusso delle attività\n- 🚀 Organizza il tuo progetto",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck è uno strumento di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrato con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e tienile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Condividi con la tua squadra, amici o famiglia\n- 📎 Allega file e integrali nella tua descrizione markdown\n- 💬 Discuti con la tua squadra utilizzando i commenti\n- ⚡ Tieni traccia dei cambiamenti nel flusso delle attività\n- 🚀 Organizza il tuo progetto",
|
||||||
"This week" : "Questa settimana"
|
"This week" : "Questa settimana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -288,5 +288,5 @@
|
|||||||
"Share" : "Condividi",
|
"Share" : "Condividi",
|
||||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck è uno strumento di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrato con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e tienile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Condividi con la tua squadra, amici o famiglia\n- 📎 Allega file e integrali nella tua descrizione markdown\n- 💬 Discuti con la tua squadra utilizzando i commenti\n- ⚡ Tieni traccia dei cambiamenti nel flusso delle attività\n- 🚀 Organizza il tuo progetto",
|
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck è uno strumento di organizzazione in stile kanban destinato alla pianificazione personale e all'organizzazione di progetti per squadre integrato con Nextcloud.\n\n\n- 📥 Aggiungi le tue attività alle schede e tienile in ordine\n- 📄 Scrivi note aggiuntive in markdown\n- 🔖 Assegna etichette per un'organizzazione ancora migliore\n- 👥 Condividi con la tua squadra, amici o famiglia\n- 📎 Allega file e integrali nella tua descrizione markdown\n- 💬 Discuti con la tua squadra utilizzando i commenti\n- ⚡ Tieni traccia dei cambiamenti nel flusso delle attività\n- 🚀 Organizza il tuo progetto",
|
||||||
"This week" : "Questa settimana"
|
"This week" : "Questa settimana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@ OC.L10N.register(
|
|||||||
"deck",
|
"deck",
|
||||||
{
|
{
|
||||||
"Personal" : "ផ្ទាល់ខ្លួន",
|
"Personal" : "ផ្ទាល់ខ្លួន",
|
||||||
|
"copy" : "ចម្លង",
|
||||||
"Done" : "Done",
|
"Done" : "Done",
|
||||||
"Cancel" : "បោះបង់",
|
"Cancel" : "បោះបង់",
|
||||||
"Close" : "បិទ",
|
"Close" : "បិទ",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{ "translations": {
|
{ "translations": {
|
||||||
"Personal" : "ផ្ទាល់ខ្លួន",
|
"Personal" : "ផ្ទាល់ខ្លួន",
|
||||||
|
"copy" : "ចម្លង",
|
||||||
"Done" : "Done",
|
"Done" : "Done",
|
||||||
"Cancel" : "បោះបង់",
|
"Cancel" : "បោះបង់",
|
||||||
"Close" : "បិទ",
|
"Close" : "បិទ",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Zarchiwizowane karty",
|
"Archived cards" : "Zarchiwizowane karty",
|
||||||
"Add list" : "Dodaj listę",
|
"Add list" : "Dodaj listę",
|
||||||
"List name" : "Nazwa listy",
|
"List name" : "Nazwa listy",
|
||||||
|
"Active filters" : "Aktywne filtry",
|
||||||
"Apply filter" : "Zastosuj filtr",
|
"Apply filter" : "Zastosuj filtr",
|
||||||
"Filter by tag" : "Filtruj według etykiety",
|
"Filter by tag" : "Filtruj według etykiety",
|
||||||
"Filter by assigned user" : "Filtruj według przydzielonego użytkownika",
|
"Filter by assigned user" : "Filtruj według przydzielonego użytkownika",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Zarchiwizowane karty",
|
"Archived cards" : "Zarchiwizowane karty",
|
||||||
"Add list" : "Dodaj listę",
|
"Add list" : "Dodaj listę",
|
||||||
"List name" : "Nazwa listy",
|
"List name" : "Nazwa listy",
|
||||||
|
"Active filters" : "Aktywne filtry",
|
||||||
"Apply filter" : "Zastosuj filtr",
|
"Apply filter" : "Zastosuj filtr",
|
||||||
"Filter by tag" : "Filtruj według etykiety",
|
"Filter by tag" : "Filtruj według etykiety",
|
||||||
"Filter by assigned user" : "Filtruj według przydzielonego użytkownika",
|
"Filter by assigned user" : "Filtruj według przydzielonego użytkownika",
|
||||||
|
|||||||
@@ -299,4 +299,4 @@ OC.L10N.register(
|
|||||||
"This week" : "Esta semana",
|
"This week" : "Esta semana",
|
||||||
"Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
|
"Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n > 1);");
|
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -296,5 +296,5 @@
|
|||||||
"Failed to transfer the board for {user}" : "Falha ao transferir a reunião para {user}",
|
"Failed to transfer the board for {user}" : "Falha ao transferir a reunião para {user}",
|
||||||
"This week" : "Esta semana",
|
"This week" : "Esta semana",
|
||||||
"Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
|
"Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -158,4 +158,4 @@ OC.L10N.register(
|
|||||||
"Share" : "Partilhar",
|
"Share" : "Partilhar",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},
|
},
|
||||||
"nplurals=2; plural=(n != 1);");
|
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||||
|
|||||||
@@ -155,5 +155,5 @@
|
|||||||
"An error occurred" : "Ocorreu um erro",
|
"An error occurred" : "Ocorreu um erro",
|
||||||
"Share" : "Partilhar",
|
"Share" : "Partilhar",
|
||||||
"This week" : "Esta semana"
|
"This week" : "Esta semana"
|
||||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||||
}
|
}
|
||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "Arşivlenmiş kartlar",
|
"Archived cards" : "Arşivlenmiş kartlar",
|
||||||
"Add list" : "Liste ekle",
|
"Add list" : "Liste ekle",
|
||||||
"List name" : "Liste adı",
|
"List name" : "Liste adı",
|
||||||
|
"Active filters" : "Etkin süzgeçler",
|
||||||
"Apply filter" : "Süzgeci uygula",
|
"Apply filter" : "Süzgeci uygula",
|
||||||
"Filter by tag" : "Etikete göre süz",
|
"Filter by tag" : "Etikete göre süz",
|
||||||
"Filter by assigned user" : "Atanmış kullanıcıya göre süz",
|
"Filter by assigned user" : "Atanmış kullanıcıya göre süz",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "Arşivlenmiş kartlar",
|
"Archived cards" : "Arşivlenmiş kartlar",
|
||||||
"Add list" : "Liste ekle",
|
"Add list" : "Liste ekle",
|
||||||
"List name" : "Liste adı",
|
"List name" : "Liste adı",
|
||||||
|
"Active filters" : "Etkin süzgeçler",
|
||||||
"Apply filter" : "Süzgeci uygula",
|
"Apply filter" : "Süzgeci uygula",
|
||||||
"Filter by tag" : "Etikete göre süz",
|
"Filter by tag" : "Etikete göre süz",
|
||||||
"Filter by assigned user" : "Atanmış kullanıcıya göre süz",
|
"Filter by assigned user" : "Atanmış kullanıcıya göre süz",
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ OC.L10N.register(
|
|||||||
"Next month" : "Наступний місяць",
|
"Next month" : "Наступний місяць",
|
||||||
"Save" : "Зберегти",
|
"Save" : "Зберегти",
|
||||||
"In reply to" : "У відповідь",
|
"In reply to" : "У відповідь",
|
||||||
|
"Cancel reply" : "Скасувати відповідь",
|
||||||
"Reply" : "Відповісти",
|
"Reply" : "Відповісти",
|
||||||
"Update" : "Оновлення",
|
"Update" : "Оновлення",
|
||||||
"Description" : "Опис",
|
"Description" : "Опис",
|
||||||
|
|||||||
@@ -122,6 +122,7 @@
|
|||||||
"Next month" : "Наступний місяць",
|
"Next month" : "Наступний місяць",
|
||||||
"Save" : "Зберегти",
|
"Save" : "Зберегти",
|
||||||
"In reply to" : "У відповідь",
|
"In reply to" : "У відповідь",
|
||||||
|
"Cancel reply" : "Скасувати відповідь",
|
||||||
"Reply" : "Відповісти",
|
"Reply" : "Відповісти",
|
||||||
"Update" : "Оновлення",
|
"Update" : "Оновлення",
|
||||||
"Description" : "Опис",
|
"Description" : "Опис",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "已存檔卡片",
|
"Archived cards" : "已存檔卡片",
|
||||||
"Add list" : "添加清單",
|
"Add list" : "添加清單",
|
||||||
"List name" : "清單名稱",
|
"List name" : "清單名稱",
|
||||||
|
"Active filters" : "有效的過濾器",
|
||||||
"Apply filter" : "應用過濾器",
|
"Apply filter" : "應用過濾器",
|
||||||
"Filter by tag" : "以標籤過濾",
|
"Filter by tag" : "以標籤過濾",
|
||||||
"Filter by assigned user" : "以指派用戶過濾",
|
"Filter by assigned user" : "以指派用戶過濾",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "已存檔卡片",
|
"Archived cards" : "已存檔卡片",
|
||||||
"Add list" : "添加清單",
|
"Add list" : "添加清單",
|
||||||
"List name" : "清單名稱",
|
"List name" : "清單名稱",
|
||||||
|
"Active filters" : "有效的過濾器",
|
||||||
"Apply filter" : "應用過濾器",
|
"Apply filter" : "應用過濾器",
|
||||||
"Filter by tag" : "以標籤過濾",
|
"Filter by tag" : "以標籤過濾",
|
||||||
"Filter by assigned user" : "以指派用戶過濾",
|
"Filter by assigned user" : "以指派用戶過濾",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ OC.L10N.register(
|
|||||||
"Archived cards" : "已封存的卡片",
|
"Archived cards" : "已封存的卡片",
|
||||||
"Add list" : "新增列表",
|
"Add list" : "新增列表",
|
||||||
"List name" : "列表名稱",
|
"List name" : "列表名稱",
|
||||||
|
"Active filters" : "作用中的過濾條件",
|
||||||
"Apply filter" : "套用過濾條件",
|
"Apply filter" : "套用過濾條件",
|
||||||
"Filter by tag" : "按標籤過濾",
|
"Filter by tag" : "按標籤過濾",
|
||||||
"Filter by assigned user" : "按被分配的使用者過濾",
|
"Filter by assigned user" : "按被分配的使用者過濾",
|
||||||
|
|||||||
@@ -133,6 +133,7 @@
|
|||||||
"Archived cards" : "已封存的卡片",
|
"Archived cards" : "已封存的卡片",
|
||||||
"Add list" : "新增列表",
|
"Add list" : "新增列表",
|
||||||
"List name" : "列表名稱",
|
"List name" : "列表名稱",
|
||||||
|
"Active filters" : "作用中的過濾條件",
|
||||||
"Apply filter" : "套用過濾條件",
|
"Apply filter" : "套用過濾條件",
|
||||||
"Filter by tag" : "按標籤過濾",
|
"Filter by tag" : "按標籤過濾",
|
||||||
"Filter by assigned user" : "按被分配的使用者過濾",
|
"Filter by assigned user" : "按被分配的使用者過濾",
|
||||||
|
|||||||
52
lib/Cache/AttachmentCacheHelper.php
Normal file
52
lib/Cache/AttachmentCacheHelper.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net>
|
||||||
|
*
|
||||||
|
* @author Julius Härtl <jus@bitgrid.net>
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
|
||||||
|
namespace OCA\Deck\Cache;
|
||||||
|
|
||||||
|
use OCP\ICache;
|
||||||
|
use OCP\ICacheFactory;
|
||||||
|
|
||||||
|
class AttachmentCacheHelper {
|
||||||
|
/** @var ICache */
|
||||||
|
private $cache;
|
||||||
|
|
||||||
|
public function __construct(ICacheFactory $cacheFactory) {
|
||||||
|
$this->cache = $cacheFactory->createDistributed('deck-attachments');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAttachmentCount(int $cardId): ?int {
|
||||||
|
return $this->cache->get('count-' . $cardId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAttachmentCount(int $cardId, int $count): void {
|
||||||
|
$this->cache->set('count-' . $cardId, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function clearAttachmentCount(int $cardId): void {
|
||||||
|
$this->cache->remove('count-' . $cardId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -100,6 +100,9 @@ class ResourceProvider implements IProvider {
|
|||||||
if ($board->getOwner() === $user->getUID()) {
|
if ($board->getOwner() === $user->getUID()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if ($board->getAcl() === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ class ResourceProviderCard implements IProvider {
|
|||||||
if ($board->getOwner() === $user->getUID()) {
|
if ($board->getOwner() === $user->getUID()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if ($board->getAcl() === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,13 +67,13 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
$row = $cursor->fetch(PDO::FETCH_ASSOC);
|
$row = $cursor->fetch(PDO::FETCH_ASSOC);
|
||||||
if ($row === false) {
|
if ($row === false) {
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
throw new DoesNotExistException('Did expect one result but found none when executing' . $qb);
|
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL());
|
||||||
}
|
}
|
||||||
|
|
||||||
$row2 = $cursor->fetch();
|
$row2 = $cursor->fetch();
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
if ($row2 !== false) {
|
if ($row2 !== false) {
|
||||||
throw new MultipleObjectsReturnedException('Did not expect more than one result when executing' . $qb);
|
throw new MultipleObjectsReturnedException('Did not expect more than one result when executing query: ' . $qb->getSQL());
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->mapRowToEntity($row);
|
return $this->mapRowToEntity($row);
|
||||||
@@ -89,7 +89,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
$row = $cursor->fetch(PDO::FETCH_ASSOC);
|
$row = $cursor->fetch(PDO::FETCH_ASSOC);
|
||||||
if ($row === false) {
|
if ($row === false) {
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
throw new DoesNotExistException('Did expect one result but found none when executing' . $qb);
|
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL());
|
||||||
}
|
}
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
return $this->mapRowToEntity($row);
|
return $this->mapRowToEntity($row);
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ class Board extends RelationalEntity {
|
|||||||
protected $owner;
|
protected $owner;
|
||||||
protected $color;
|
protected $color;
|
||||||
protected $archived = false;
|
protected $archived = false;
|
||||||
protected $labels = [];
|
/** @var Label[]|null */
|
||||||
protected $acl = [];
|
protected $labels = null;
|
||||||
|
/** @var Acl[]|null */
|
||||||
|
protected $acl = null;
|
||||||
protected $permissions = [];
|
protected $permissions = [];
|
||||||
protected $users = [];
|
protected $users = [];
|
||||||
protected $shared;
|
protected $shared;
|
||||||
@@ -61,6 +63,10 @@ class Board extends RelationalEntity {
|
|||||||
if ($this->shared === -1) {
|
if ($this->shared === -1) {
|
||||||
unset($json['shared']);
|
unset($json['shared']);
|
||||||
}
|
}
|
||||||
|
// FIXME: Ideally the API responses should follow the internal data structure and return null if the labels/acls have not been fetched from the db
|
||||||
|
// however this would be a breaking change for consumers of the API
|
||||||
|
$json['acl'] = $this->acl ?? [];
|
||||||
|
$json['labels'] = $this->labels ?? [];
|
||||||
return $json;
|
return $json;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,21 +74,27 @@ class Board extends RelationalEntity {
|
|||||||
* @param Label[] $labels
|
* @param Label[] $labels
|
||||||
*/
|
*/
|
||||||
public function setLabels($labels) {
|
public function setLabels($labels) {
|
||||||
foreach ($labels as $l) {
|
$this->labels = $labels;
|
||||||
$this->labels[] = $l;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Acl[] $acl
|
* @param Acl[] $acl
|
||||||
*/
|
*/
|
||||||
public function setAcl($acl) {
|
public function setAcl($acl) {
|
||||||
foreach ($acl as $a) {
|
$this->acl = $acl;
|
||||||
$this->acl[] = $a;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getETag() {
|
public function getETag() {
|
||||||
return md5((string)$this->getLastModified());
|
return md5((string)$this->getLastModified());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @returns Acl[]|null */
|
||||||
|
public function getAcl(): ?array {
|
||||||
|
return $this->acl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @returns Label[]|null */
|
||||||
|
public function getLabels(): ?array {
|
||||||
|
return $this->labels;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,13 +26,14 @@ namespace OCA\Deck\Db;
|
|||||||
use OC\Cache\CappedMemoryCache;
|
use OC\Cache\CappedMemoryCache;
|
||||||
use OCA\Deck\Service\CirclesService;
|
use OCA\Deck\Service\CirclesService;
|
||||||
use OCP\AppFramework\Db\DoesNotExistException;
|
use OCP\AppFramework\Db\DoesNotExistException;
|
||||||
|
use OCP\AppFramework\Db\QBMapper;
|
||||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
use OCP\IGroupManager;
|
use OCP\IGroupManager;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
class BoardMapper extends DeckMapper implements IPermissionMapper {
|
class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||||
private $labelMapper;
|
private $labelMapper;
|
||||||
private $aclMapper;
|
private $aclMapper;
|
||||||
private $stackMapper;
|
private $stackMapper;
|
||||||
@@ -43,6 +44,8 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
|
|
||||||
/** @var CappedMemoryCache */
|
/** @var CappedMemoryCache */
|
||||||
private $userBoardCache;
|
private $userBoardCache;
|
||||||
|
/** @var CappedMemoryCache */
|
||||||
|
private $boardCache;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
IDBConnection $db,
|
IDBConnection $db,
|
||||||
@@ -64,6 +67,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
|
|
||||||
$this->userBoardCache = new CappedMemoryCache();
|
$this->userBoardCache = new CappedMemoryCache();
|
||||||
|
$this->boardCache = new CappedMemoryCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -71,40 +75,52 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
* @param $id
|
* @param $id
|
||||||
* @param bool $withLabels
|
* @param bool $withLabels
|
||||||
* @param bool $withAcl
|
* @param bool $withAcl
|
||||||
* @return \OCP\AppFramework\Db\Entity
|
* @return Board
|
||||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
||||||
* @throws DoesNotExistException
|
* @throws DoesNotExistException
|
||||||
*/
|
*/
|
||||||
public function find($id, $withLabels = false, $withAcl = false) {
|
public function find($id, $withLabels = false, $withAcl = false): Board {
|
||||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
|
if (!isset($this->boardCache[$id])) {
|
||||||
'WHERE `id` = ?';
|
$qb = $this->db->getQueryBuilder();
|
||||||
$board = $this->findEntity($sql, [$id]);
|
$qb->select('*')
|
||||||
|
->from('deck_boards')
|
||||||
|
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
|
||||||
|
->orderBy('id');
|
||||||
|
$this->boardCache[$id] = $this->findEntity($qb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME is this necessary? it was NOT done with the old mapper
|
||||||
|
// $this->mapOwner($board);
|
||||||
|
|
||||||
// Add labels
|
// Add labels
|
||||||
if ($withLabels) {
|
if ($withLabels && $this->boardCache[$id]->getLabels() === null) {
|
||||||
$labels = $this->labelMapper->findAll($id);
|
$labels = $this->labelMapper->findAll($id);
|
||||||
$board->setLabels($labels);
|
$this->boardCache[$id]->setLabels($labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add acl
|
// Add acl
|
||||||
if ($withAcl) {
|
if ($withAcl && $this->boardCache[$id]->getAcl() === null) {
|
||||||
$acl = $this->aclMapper->findAll($id);
|
$acl = $this->aclMapper->findAll($id);
|
||||||
$board->setAcl($acl);
|
$this->boardCache[$id]->setAcl($acl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $board;
|
return $this->boardCache[$id];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAllForUser(string $userId, int $since = -1, $includeArchived = true): array {
|
public function findAllForUser(string $userId, ?int $since = null, bool $includeArchived = true, ?int $before = null,
|
||||||
$useCache = ($since === -1 && $includeArchived === true);
|
?string $term = null): array {
|
||||||
|
$useCache = ($since === -1 && $includeArchived === true && $before === null && $term === null);
|
||||||
if (!isset($this->userBoardCache[$userId]) || !$useCache) {
|
if (!isset($this->userBoardCache[$userId]) || !$useCache) {
|
||||||
$groups = $this->groupManager->getUserGroupIds(
|
$groups = $this->groupManager->getUserGroupIds(
|
||||||
$this->userManager->get($userId)
|
$this->userManager->get($userId)
|
||||||
);
|
);
|
||||||
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived);
|
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived, $before, $term);
|
||||||
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived);
|
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived, $before, $term);
|
||||||
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
|
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived, $before, $term);
|
||||||
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
|
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
|
||||||
|
foreach ($allBoards as $board) {
|
||||||
|
$this->boardCache[$board->getId()] = $board;
|
||||||
|
}
|
||||||
if ($useCache) {
|
if ($useCache) {
|
||||||
$this->userBoardCache[$userId] = $allBoards;
|
$this->userBoardCache[$userId] = $allBoards;
|
||||||
}
|
}
|
||||||
@@ -121,19 +137,91 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
* @param null $offset
|
* @param null $offset
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function findAllByUser($userId, $limit = null, $offset = null, $since = -1, $includeArchived = true) {
|
public function findAllByUser(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null,
|
||||||
// FIXME: One moving to QBMapper we should allow filtering the boards probably by method chaining for additional where clauses
|
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
|
||||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
|
// FIXME this used to be a UNION to get boards owned by $userId and the user shares in one single query
|
||||||
|
// Is it possible with the query builder?
|
||||||
|
$qb = $this->db->getQueryBuilder();
|
||||||
|
$qb->select('id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||||
|
// this does not work in MySQL/PostgreSQL
|
||||||
|
//->selectAlias('0', 'shared')
|
||||||
|
->from('deck_boards', 'b')
|
||||||
|
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
|
||||||
if (!$includeArchived) {
|
if (!$includeArchived) {
|
||||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
|
||||||
|
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
|
||||||
}
|
}
|
||||||
$sql .= ' UNION ' .
|
if ($since !== null) {
|
||||||
'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
|
||||||
'JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=? AND boards.owner != ? AND last_modified > ?';
|
}
|
||||||
|
if ($before !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($term !== null) {
|
||||||
|
$qb->andWhere(
|
||||||
|
$qb->expr()->iLike(
|
||||||
|
'title',
|
||||||
|
$qb->createNamedParameter(
|
||||||
|
'%' . $this->db->escapeLikeParameter($term) . '%',
|
||||||
|
IQueryBuilder::PARAM_STR
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$qb->orderBy('b.id');
|
||||||
|
if ($limit !== null) {
|
||||||
|
$qb->setMaxResults($limit);
|
||||||
|
}
|
||||||
|
if ($offset !== null) {
|
||||||
|
$qb->setFirstResult($offset);
|
||||||
|
}
|
||||||
|
$entries = $this->findEntities($qb);
|
||||||
|
foreach ($entries as $entry) {
|
||||||
|
$entry->setShared(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// shared with user
|
||||||
|
$qb->resetQueryParts();
|
||||||
|
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||||
|
//->selectAlias('1', 'shared')
|
||||||
|
->from('deck_boards', 'b')
|
||||||
|
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||||
|
->where($qb->expr()->eq('acl.participant', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
|
||||||
|
->andWhere($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_USER, IQueryBuilder::PARAM_INT)))
|
||||||
|
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
|
||||||
if (!$includeArchived) {
|
if (!$includeArchived) {
|
||||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
|
||||||
|
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
|
||||||
}
|
}
|
||||||
$entries = $this->findEntities($sql, [$userId, $since, $userId, Acl::PERMISSION_TYPE_USER, $userId, $since], $limit, $offset);
|
if ($since !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($before !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($term !== null) {
|
||||||
|
$qb->andWhere(
|
||||||
|
$qb->expr()->iLike(
|
||||||
|
'title',
|
||||||
|
$qb->createNamedParameter(
|
||||||
|
'%' . $this->db->escapeLikeParameter($term) . '%',
|
||||||
|
IQueryBuilder::PARAM_STR
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$qb->orderBy('b.id');
|
||||||
|
if ($limit !== null) {
|
||||||
|
$qb->setMaxResults($limit);
|
||||||
|
}
|
||||||
|
if ($offset !== null) {
|
||||||
|
$qb->setFirstResult($offset);
|
||||||
|
}
|
||||||
|
$sharedEntries = $this->findEntities($qb);
|
||||||
|
foreach ($sharedEntries as $entry) {
|
||||||
|
$entry->setShared(1);
|
||||||
|
}
|
||||||
|
$entries = array_merge($entries, $sharedEntries);
|
||||||
/* @var Board $entry */
|
/* @var Board $entry */
|
||||||
foreach ($entries as $entry) {
|
foreach ($entries as $entry) {
|
||||||
$acl = $this->aclMapper->findAll($entry->id);
|
$acl = $this->aclMapper->findAll($entry->id);
|
||||||
@@ -142,9 +230,19 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
return $entries;
|
return $entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAllByOwner(string $userId, int $limit = null, int $offset = null) {
|
public function findAllByOwner(string $userId, ?int $limit = null, ?int $offset = null) {
|
||||||
$sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE owner = ?';
|
$qb = $this->db->getQueryBuilder();
|
||||||
return $this->findEntities($sql, [$userId], $limit, $offset);
|
$qb->select('*')
|
||||||
|
->from('deck_boards')
|
||||||
|
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
|
||||||
|
->orderBy('id');
|
||||||
|
if ($limit !== null) {
|
||||||
|
$qb->setMaxResults($limit);
|
||||||
|
}
|
||||||
|
if ($offset !== null) {
|
||||||
|
$qb->setFirstResult($offset);
|
||||||
|
}
|
||||||
|
return $this->findEntities($qb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,23 +254,57 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
* @param null $offset
|
* @param null $offset
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function findAllByGroups($userId, $groups, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
|
public function findAllByGroups(string $userId, array $groups, ?int $limit = null, ?int $offset = null, ?int $since = null,
|
||||||
|
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
|
||||||
if (count($groups) <= 0) {
|
if (count($groups) <= 0) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
$qb = $this->db->getQueryBuilder();
|
||||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||||
|
//->selectAlias('2', 'shared')
|
||||||
|
->from('deck_boards', 'b')
|
||||||
|
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||||
|
->where($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_GROUP, IQueryBuilder::PARAM_INT)))
|
||||||
|
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
|
||||||
|
$or = $qb->expr()->orx();
|
||||||
for ($i = 0, $iMax = count($groups); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($groups); $i < $iMax; $i++) {
|
||||||
$sql .= 'acl.participant = ? ';
|
$or->add(
|
||||||
if (count($groups) > 1 && $i < count($groups) - 1) {
|
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($groups[$i], IQueryBuilder::PARAM_STR))
|
||||||
$sql .= ' OR ';
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$sql .= ')';
|
$qb->andWhere($or);
|
||||||
if (!$includeArchived) {
|
if (!$includeArchived) {
|
||||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
|
||||||
|
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($since !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($before !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($term !== null) {
|
||||||
|
$qb->andWhere(
|
||||||
|
$qb->expr()->iLike(
|
||||||
|
'title',
|
||||||
|
$qb->createNamedParameter(
|
||||||
|
'%' . $this->db->escapeLikeParameter($term) . '%',
|
||||||
|
IQueryBuilder::PARAM_STR
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$qb->orderBy('b.id');
|
||||||
|
if ($limit !== null) {
|
||||||
|
$qb->setMaxResults($limit);
|
||||||
|
}
|
||||||
|
if ($offset !== null) {
|
||||||
|
$qb->setFirstResult($offset);
|
||||||
|
}
|
||||||
|
$entries = $this->findEntities($qb);
|
||||||
|
foreach ($entries as $entry) {
|
||||||
|
$entry->setShared(2);
|
||||||
}
|
}
|
||||||
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_GROUP], $groups), $limit, $offset);
|
|
||||||
/* @var Board $entry */
|
/* @var Board $entry */
|
||||||
foreach ($entries as $entry) {
|
foreach ($entries as $entry) {
|
||||||
$acl = $this->aclMapper->findAll($entry->id);
|
$acl = $this->aclMapper->findAll($entry->id);
|
||||||
@@ -181,25 +313,59 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
return $entries;
|
return $entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAllByCircles($userId, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
|
public function findAllByCircles(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null,
|
||||||
|
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
|
||||||
$circles = $this->circlesService->getUserCircles($userId);
|
$circles = $this->circlesService->getUserCircles($userId);
|
||||||
if (count($circles) === 0) {
|
if (count($circles) === 0) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
$qb = $this->db->getQueryBuilder();
|
||||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||||
|
//->selectAlias('2', 'shared')
|
||||||
|
->from('deck_boards', 'b')
|
||||||
|
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||||
|
->where($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)))
|
||||||
|
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
|
||||||
|
$or = $qb->expr()->orx();
|
||||||
for ($i = 0, $iMax = count($circles); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($circles); $i < $iMax; $i++) {
|
||||||
$sql .= 'acl.participant = ? ';
|
$or->add(
|
||||||
if (count($circles) > 1 && $i < count($circles) - 1) {
|
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($circles[$i], IQueryBuilder::PARAM_STR))
|
||||||
$sql .= ' OR ';
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$sql .= ')';
|
$qb->andWhere($or);
|
||||||
if (!$includeArchived) {
|
if (!$includeArchived) {
|
||||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
|
||||||
|
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($since !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($before !== null) {
|
||||||
|
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
|
||||||
|
}
|
||||||
|
if ($term !== null) {
|
||||||
|
$qb->andWhere(
|
||||||
|
$qb->expr()->iLike(
|
||||||
|
'title',
|
||||||
|
$qb->createNamedParameter(
|
||||||
|
'%' . $this->db->escapeLikeParameter($term) . '%',
|
||||||
|
IQueryBuilder::PARAM_STR
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$qb->orderBy('b.id');
|
||||||
|
if ($limit !== null) {
|
||||||
|
$qb->setMaxResults($limit);
|
||||||
|
}
|
||||||
|
if ($offset !== null) {
|
||||||
|
$qb->setFirstResult($offset);
|
||||||
|
}
|
||||||
|
$entries = $this->findEntities($qb);
|
||||||
|
foreach ($entries as $entry) {
|
||||||
|
$entry->setShared(2);
|
||||||
}
|
}
|
||||||
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_CIRCLE], $circles), $limit, $offset);
|
|
||||||
/* @var Board $entry */
|
/* @var Board $entry */
|
||||||
foreach ($entries as $entry) {
|
foreach ($entries as $entry) {
|
||||||
$acl = $this->aclMapper->findAll($entry->id);
|
$acl = $this->aclMapper->findAll($entry->id);
|
||||||
@@ -208,21 +374,26 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
return $entries;
|
return $entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findAll() {
|
public function findAll(): array {
|
||||||
$sql = 'SELECT id from *PREFIX*deck_boards;';
|
$qb = $this->db->getQueryBuilder();
|
||||||
return $this->findEntities($sql);
|
$qb->select('id')
|
||||||
|
->from('deck_boards');
|
||||||
|
return $this->findEntities($qb);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findToDelete() {
|
public function findToDelete() {
|
||||||
// add buffer of 5 min
|
// add buffer of 5 min
|
||||||
$timeLimit = time() - (60 * 5);
|
$timeLimit = time() - (60 * 5);
|
||||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
|
$qb = $this->db->getQueryBuilder();
|
||||||
'WHERE `deleted_at` > 0 AND `deleted_at` < ?';
|
$qb->select('id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||||
return $this->findEntities($sql, [$timeLimit]);
|
->from('deck_boards')
|
||||||
|
->where($qb->expr()->gt('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
|
||||||
|
->andWhere($qb->expr()->lt('deleted_at', $qb->createNamedParameter($timeLimit, IQueryBuilder::PARAM_INT)));
|
||||||
|
return $this->findEntities($qb);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete(/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */
|
public function delete(/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */
|
||||||
\OCP\AppFramework\Db\Entity $entity) {
|
\OCP\AppFramework\Db\Entity $entity): \OCP\AppFramework\Db\Entity {
|
||||||
// delete acl
|
// delete acl
|
||||||
$acl = $this->aclMapper->findAll($entity->getId());
|
$acl = $this->aclMapper->findAll($entity->getId());
|
||||||
foreach ($acl as $item) {
|
foreach ($acl as $item) {
|
||||||
@@ -323,6 +494,11 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
* Reset cache for a given board or a given user
|
* Reset cache for a given board or a given user
|
||||||
*/
|
*/
|
||||||
public function flushCache(?int $boardId = null, ?string $userId = null) {
|
public function flushCache(?int $boardId = null, ?string $userId = null) {
|
||||||
|
if ($boardId) {
|
||||||
|
unset($this->boardCache[$boardId]);
|
||||||
|
} else {
|
||||||
|
$this->boardCache = null;
|
||||||
|
}
|
||||||
if ($userId) {
|
if ($userId) {
|
||||||
unset($this->userBoardCache[$userId]);
|
unset($this->userBoardCache[$userId]);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ use OCA\Deck\Search\Query\SearchQuery;
|
|||||||
use OCP\AppFramework\Db\Entity;
|
use OCP\AppFramework\Db\Entity;
|
||||||
use OCP\AppFramework\Db\QBMapper;
|
use OCP\AppFramework\Db\QBMapper;
|
||||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
|
use OCP\ICache;
|
||||||
|
use OCP\ICacheFactory;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
use OCP\IGroupManager;
|
use OCP\IGroupManager;
|
||||||
use OCP\IUser;
|
use OCP\IUser;
|
||||||
@@ -46,6 +48,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
private $groupManager;
|
private $groupManager;
|
||||||
/** @var IManager */
|
/** @var IManager */
|
||||||
private $notificationManager;
|
private $notificationManager;
|
||||||
|
/** @var ICache */
|
||||||
|
private $cache;
|
||||||
private $databaseType;
|
private $databaseType;
|
||||||
private $database4ByteSupport;
|
private $database4ByteSupport;
|
||||||
|
|
||||||
@@ -55,6 +59,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
IUserManager $userManager,
|
IUserManager $userManager,
|
||||||
IGroupManager $groupManager,
|
IGroupManager $groupManager,
|
||||||
IManager $notificationManager,
|
IManager $notificationManager,
|
||||||
|
ICacheFactory $cacheFactory,
|
||||||
$databaseType = 'sqlite3',
|
$databaseType = 'sqlite3',
|
||||||
$database4ByteSupport = true
|
$database4ByteSupport = true
|
||||||
) {
|
) {
|
||||||
@@ -63,6 +68,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
$this->userManager = $userManager;
|
$this->userManager = $userManager;
|
||||||
$this->groupManager = $groupManager;
|
$this->groupManager = $groupManager;
|
||||||
$this->notificationManager = $notificationManager;
|
$this->notificationManager = $notificationManager;
|
||||||
|
$this->cache = $cacheFactory->createDistributed('deck-cardMapper');
|
||||||
$this->databaseType = $databaseType;
|
$this->databaseType = $databaseType;
|
||||||
$this->database4ByteSupport = $database4ByteSupport;
|
$this->database4ByteSupport = $database4ByteSupport;
|
||||||
}
|
}
|
||||||
@@ -75,7 +81,9 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
$description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription());
|
$description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription());
|
||||||
$entity->setDescription($description);
|
$entity->setDescription($description);
|
||||||
}
|
}
|
||||||
return parent::insert($entity);
|
$entity = parent::insert($entity);
|
||||||
|
$this->cache->remove('findBoardId:' . $entity->getId());
|
||||||
|
return $entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function update(Entity $entity, $updateModified = true): Entity {
|
public function update(Entity $entity, $updateModified = true): Entity {
|
||||||
@@ -107,6 +115,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Invalidate cache when the card may be moved to a different board
|
||||||
|
if (isset($updatedFields['stackId'])) {
|
||||||
|
$this->cache->remove('findBoardId:' . $entity->getId());
|
||||||
|
}
|
||||||
return parent::update($entity);
|
return parent::update($entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,9 +518,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function delete(Entity $entity): Entity {
|
public function delete(Entity $entity): Entity {
|
||||||
// delete assigned labels
|
|
||||||
$this->labelMapper->deleteLabelAssignmentsForCard($entity->getId());
|
$this->labelMapper->deleteLabelAssignmentsForCard($entity->getId());
|
||||||
// delete card
|
$this->cache->remove('findBoardId:' . $entity->getId());
|
||||||
return parent::delete($entity);
|
return parent::delete($entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,11 +558,22 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function findBoardId($id): ?int {
|
public function findBoardId($id): ?int {
|
||||||
$sql = 'SELECT id FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id IN (SELECT stack_id FROM `*PREFIX*deck_cards` WHERE id = ?))';
|
$result = $this->cache->get('findBoardId:' . $id);
|
||||||
$stmt = $this->db->prepare($sql);
|
if ($result === null) {
|
||||||
$stmt->bindParam(1, $id, \PDO::PARAM_INT);
|
try {
|
||||||
$stmt->execute();
|
$qb = $this->db->getQueryBuilder();
|
||||||
return $stmt->fetchColumn() ?? null;
|
$qb->select('board_id')
|
||||||
|
->from('deck_stacks', 's')
|
||||||
|
->innerJoin('s', 'deck_cards', 'c', 'c.stack_id = s.id')
|
||||||
|
->where($qb->expr()->eq('c.id', $qb->createNamedParameter($id)));
|
||||||
|
$queryResult = $qb->executeQuery();
|
||||||
|
$result = $queryResult->fetchOne();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$result = false;
|
||||||
|
}
|
||||||
|
$this->cache->set('findBoardId:' . $id, $result);
|
||||||
|
}
|
||||||
|
return $result !== false ? $result : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mapOwner(Card &$card) {
|
public function mapOwner(Card &$card) {
|
||||||
|
|||||||
@@ -34,11 +34,10 @@ use OCA\Deck\Db\ChangeHelper;
|
|||||||
use OCA\Deck\InvalidAttachmentType;
|
use OCA\Deck\InvalidAttachmentType;
|
||||||
use OCA\Deck\NoPermissionException;
|
use OCA\Deck\NoPermissionException;
|
||||||
use OCA\Deck\NotFoundException;
|
use OCA\Deck\NotFoundException;
|
||||||
|
use OCA\Deck\Cache\AttachmentCacheHelper;
|
||||||
use OCA\Deck\StatusException;
|
use OCA\Deck\StatusException;
|
||||||
use OCP\AppFramework\Db\IMapperException;
|
use OCP\AppFramework\Db\IMapperException;
|
||||||
use OCP\AppFramework\Http\Response;
|
use OCP\AppFramework\Http\Response;
|
||||||
use OCP\ICache;
|
|
||||||
use OCP\ICacheFactory;
|
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
|
|
||||||
class AttachmentService {
|
class AttachmentService {
|
||||||
@@ -49,9 +48,10 @@ class AttachmentService {
|
|||||||
|
|
||||||
/** @var IAttachmentService[] */
|
/** @var IAttachmentService[] */
|
||||||
private $services = [];
|
private $services = [];
|
||||||
|
/** @var Application */
|
||||||
private $application;
|
private $application;
|
||||||
/** @var ICache */
|
/** @var AttachmentCacheHelper */
|
||||||
private $cache;
|
private $attachmentCacheHelper;
|
||||||
/** @var IL10N */
|
/** @var IL10N */
|
||||||
private $l10n;
|
private $l10n;
|
||||||
/** @var ActivityManager */
|
/** @var ActivityManager */
|
||||||
@@ -59,13 +59,13 @@ class AttachmentService {
|
|||||||
/** @var ChangeHelper */
|
/** @var ChangeHelper */
|
||||||
private $changeHelper;
|
private $changeHelper;
|
||||||
|
|
||||||
public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, ChangeHelper $changeHelper, PermissionService $permissionService, Application $application, ICacheFactory $cacheFactory, $userId, IL10N $l10n, ActivityManager $activityManager) {
|
public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, ChangeHelper $changeHelper, PermissionService $permissionService, Application $application, AttachmentCacheHelper $attachmentCacheHelper, $userId, IL10N $l10n, ActivityManager $activityManager) {
|
||||||
$this->attachmentMapper = $attachmentMapper;
|
$this->attachmentMapper = $attachmentMapper;
|
||||||
$this->cardMapper = $cardMapper;
|
$this->cardMapper = $cardMapper;
|
||||||
$this->permissionService = $permissionService;
|
$this->permissionService = $permissionService;
|
||||||
$this->userId = $userId;
|
$this->userId = $userId;
|
||||||
$this->application = $application;
|
$this->application = $application;
|
||||||
$this->cache = $cacheFactory->createDistributed('deck-card-attachments-');
|
$this->attachmentCacheHelper = $attachmentCacheHelper;
|
||||||
$this->l10n = $l10n;
|
$this->l10n = $l10n;
|
||||||
$this->activityManager = $activityManager;
|
$this->activityManager = $activityManager;
|
||||||
$this->changeHelper = $changeHelper;
|
$this->changeHelper = $changeHelper;
|
||||||
@@ -139,14 +139,16 @@ class AttachmentService {
|
|||||||
* @param $cardId
|
* @param $cardId
|
||||||
* @return int|mixed
|
* @return int|mixed
|
||||||
* @throws BadRequestException
|
* @throws BadRequestException
|
||||||
|
* @throws InvalidAttachmentType
|
||||||
|
* @throws \OCP\DB\Exception
|
||||||
*/
|
*/
|
||||||
public function count($cardId) {
|
public function count($cardId) {
|
||||||
if (is_numeric($cardId) === false) {
|
if (is_numeric($cardId) === false) {
|
||||||
throw new BadRequestException('card id must be a number');
|
throw new BadRequestException('card id must be a number');
|
||||||
}
|
}
|
||||||
|
|
||||||
$count = $this->cache->get('card-' . $cardId);
|
$count = $this->attachmentCacheHelper->getAttachmentCount((int)$cardId);
|
||||||
if (!$count) {
|
if ($count === null) {
|
||||||
$count = count($this->attachmentMapper->findAll($cardId));
|
$count = count($this->attachmentMapper->findAll($cardId));
|
||||||
|
|
||||||
foreach (array_keys($this->services) as $attachmentType) {
|
foreach (array_keys($this->services) as $attachmentType) {
|
||||||
@@ -156,7 +158,7 @@ class AttachmentService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->cache->set('card-' . $cardId, $count);
|
$this->attachmentCacheHelper->setAttachmentCount((int)$cardId, $count);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $count;
|
return $count;
|
||||||
@@ -186,7 +188,7 @@ class AttachmentService {
|
|||||||
|
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
|
||||||
|
|
||||||
$this->cache->clear('card-' . $cardId);
|
$this->attachmentCacheHelper->clearAttachmentCount((int)$cardId);
|
||||||
$attachment = new Attachment();
|
$attachment = new Attachment();
|
||||||
$attachment->setCardId($cardId);
|
$attachment->setCardId($cardId);
|
||||||
$attachment->setType($type);
|
$attachment->setType($type);
|
||||||
@@ -298,7 +300,7 @@ class AttachmentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $attachment->getCardId(), Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->cardMapper, $attachment->getCardId(), Acl::PERMISSION_EDIT);
|
||||||
$this->cache->clear('card-' . $attachment->getCardId());
|
$this->attachmentCacheHelper->clearAttachmentCount($cardId);
|
||||||
|
|
||||||
$attachment->setData($data);
|
$attachment->setData($data);
|
||||||
try {
|
try {
|
||||||
@@ -356,7 +358,7 @@ class AttachmentService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->cache->clear('card-' . $attachment->getCardId());
|
$this->attachmentCacheHelper->clearAttachmentCount($cardId);
|
||||||
$this->changeHelper->cardChanged($attachment->getCardId());
|
$this->changeHelper->cardChanged($attachment->getCardId());
|
||||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $attachment, ActivityManager::SUBJECT_ATTACHMENT_DELETE);
|
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $attachment, ActivityManager::SUBJECT_ATTACHMENT_DELETE);
|
||||||
return $attachment;
|
return $attachment;
|
||||||
@@ -370,7 +372,7 @@ class AttachmentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $attachment->getCardId(), Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->cardMapper, $attachment->getCardId(), Acl::PERMISSION_EDIT);
|
||||||
$this->cache->clear('card-' . $attachment->getCardId());
|
$this->attachmentCacheHelper->clearAttachmentCount($cardId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$service = $this->getService($attachment->getType());
|
$service = $this->getService($attachment->getType());
|
||||||
|
|||||||
@@ -127,8 +127,9 @@ class BoardService {
|
|||||||
/**
|
/**
|
||||||
* Get all boards that are shared with a user, their groups or circles
|
* Get all boards that are shared with a user, their groups or circles
|
||||||
*/
|
*/
|
||||||
public function getUserBoards(int $since = -1, bool $includeArchived = true): array {
|
public function getUserBoards(?int $since = null, bool $includeArchived = true, ?int $before = null,
|
||||||
return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived);
|
?string $term = null): array {
|
||||||
|
return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived, $before, $term);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -187,9 +188,11 @@ class BoardService {
|
|||||||
/** @var Board $board */
|
/** @var Board $board */
|
||||||
$board = $this->boardMapper->find($boardId, true, true);
|
$board = $this->boardMapper->find($boardId, true, true);
|
||||||
$this->boardMapper->mapOwner($board);
|
$this->boardMapper->mapOwner($board);
|
||||||
foreach ($board->getAcl() as &$acl) {
|
if ($board->getAcl() !== null) {
|
||||||
if ($acl !== null) {
|
foreach ($board->getAcl() as $acl) {
|
||||||
$this->boardMapper->mapAcl($acl);
|
if ($acl !== null) {
|
||||||
|
$this->boardMapper->mapAcl($acl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$permissions = $this->permissionService->matchPermissions($board);
|
$permissions = $this->permissionService->matchPermissions($board);
|
||||||
|
|||||||
@@ -96,7 +96,8 @@ class ConfigService {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$defaultState = (bool)$this->config->getUserValue($this->getUserId(), Application::APP_ID, 'calendar', true);
|
$appConfigState = $this->config->getAppValue(Application::APP_ID, 'calendar', 'yes') === 'yes';
|
||||||
|
$defaultState = (bool)$this->config->getUserValue($this->getUserId(), Application::APP_ID, 'calendar', $appConfigState);
|
||||||
if ($boardId === null) {
|
if ($boardId === null) {
|
||||||
return $defaultState;
|
return $defaultState;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,6 +187,6 @@ class FullTextSearchService {
|
|||||||
* @return Board[]
|
* @return Board[]
|
||||||
*/
|
*/
|
||||||
private function getBoardsFromUser(string $userId): array {
|
private function getBoardsFromUser(string $userId): array {
|
||||||
return $this->boardMapper->findAllByUser($userId, null, null, -1);
|
return $this->boardMapper->findAllByUser($userId, null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ class PermissionService {
|
|||||||
*/
|
*/
|
||||||
public function matchPermissions(Board $board) {
|
public function matchPermissions(Board $board) {
|
||||||
$owner = $this->userIsBoardOwner($board->getId());
|
$owner = $this->userIsBoardOwner($board->getId());
|
||||||
$acls = $board->getAcl();
|
$acls = $board->getAcl() ?? [];
|
||||||
return [
|
return [
|
||||||
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
|
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
|
||||||
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
|
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
|
||||||
@@ -155,7 +155,7 @@ class PermissionService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$acls = $this->getBoard($boardId)->getAcl();
|
$acls = $this->getBoard($boardId)->getAcl() ?? [];
|
||||||
$result = $this->userCan($acls, $permission, $userId);
|
$result = $this->userCan($acls, $permission, $userId);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -90,25 +90,19 @@ class SearchService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function searchBoards(string $term, ?int $limit, ?int $cursor): array {
|
public function searchBoards(string $term, ?int $limit, ?int $cursor): array {
|
||||||
$boards = $this->boardService->getUserBoards();
|
$boards = $this->boardService->getUserBoards(null, true, $cursor, mb_strtolower($term));
|
||||||
// get boards that have a lastmodified date which is lower than the cursor
|
|
||||||
// and which match the search term
|
|
||||||
$filteredBoards = array_filter($boards, static function (Board $board) use ($term, $cursor) {
|
|
||||||
return (
|
|
||||||
($cursor === null || $board->getLastModified() < $cursor)
|
|
||||||
&& mb_stripos(mb_strtolower($board->getTitle()), mb_strtolower($term)) > -1
|
|
||||||
);
|
|
||||||
});
|
|
||||||
// sort the boards, recently modified first
|
// sort the boards, recently modified first
|
||||||
usort($filteredBoards, function ($boardA, $boardB) {
|
usort($boards, function ($boardA, $boardB) {
|
||||||
$ta = $boardA->getLastModified();
|
$ta = $boardA->getLastModified();
|
||||||
$tb = $boardB->getLastModified();
|
$tb = $boardB->getLastModified();
|
||||||
return $ta === $tb
|
return $ta === $tb
|
||||||
? 0
|
? 0
|
||||||
: ($ta > $tb ? -1 : 1);
|
: ($ta > $tb ? -1 : 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
// limit the number of results
|
// limit the number of results
|
||||||
return array_slice($filteredBoards, 0, $limit);
|
return array_slice($boards, 0, $limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function searchComments(string $term, ?int $limit = null, ?int $cursor = null): array {
|
public function searchComments(string $term, ?int $limit = null, ?int $cursor = null): array {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user