Compare commits
280 Commits
v1.5.4
...
release/wo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
139092d855 | ||
|
|
82232e8890 | ||
|
|
f5c35729ca | ||
|
|
fc1983869b | ||
|
|
081b5119f5 | ||
|
|
a22e5f7719 | ||
|
|
8ef118ad0f | ||
|
|
86945d5030 | ||
|
|
c63423c25a | ||
|
|
8db48106b9 | ||
|
|
6d201a1f13 | ||
|
|
5425536fc0 | ||
|
|
92acaa0011 | ||
|
|
a5b76991b8 | ||
|
|
33f5af41c8 | ||
|
|
f5223d90a0 | ||
|
|
4a51335a28 | ||
|
|
e5ffe95c17 | ||
|
|
3096b701b6 | ||
|
|
caf2e688f7 | ||
|
|
3269845cfd | ||
|
|
5349fcc707 | ||
|
|
0f095e9b69 | ||
|
|
3affa7b5ec | ||
|
|
4ec57d337b | ||
|
|
6fd83258a0 | ||
|
|
901b8f2506 | ||
|
|
80388d1a88 | ||
|
|
f90c9602b8 | ||
|
|
f861f9e5fc | ||
|
|
bbfb155802 | ||
|
|
10ab8c8688 | ||
|
|
24a6d088ca | ||
|
|
00d386dcaf | ||
|
|
b71f91c439 | ||
|
|
7aa35bb728 | ||
|
|
800412237d | ||
|
|
ca411c6168 | ||
|
|
d414ffe937 | ||
|
|
ad483f3613 | ||
|
|
8311a13275 | ||
|
|
e2a7063772 | ||
|
|
1dbf36ae07 | ||
|
|
29278a51e5 | ||
|
|
31e48ce404 | ||
|
|
404a7eb412 | ||
|
|
a85a6db368 | ||
|
|
9464337036 | ||
|
|
87676b49dd | ||
|
|
6248089d8b | ||
|
|
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',
|
||||
],
|
||||
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:
|
||||
- "< 16"
|
||||
- ">= 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]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
uses: actions/setup-node@v2.4.1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v1
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: composer
|
||||
|
||||
151
.github/workflows/appstore-build-publish.yml
vendored
Normal file
151
.github/workflows/appstore-build-publish.yml
vendored
Normal file
@@ -0,0 +1,151 @@
|
||||
# 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: Build and publish app release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
env:
|
||||
PHP_VERSION: 7.4
|
||||
|
||||
jobs:
|
||||
build_and_publish:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Only allowed to be run on nextcloud-releases repositories
|
||||
if: ${{ github.repository_owner == 'nextcloud-releases' }}
|
||||
|
||||
steps:
|
||||
- name: Check actor permission
|
||||
uses: skjnldsv/check-actor-permission@v2
|
||||
with:
|
||||
require: admin
|
||||
|
||||
- name: Set app env
|
||||
run: |
|
||||
# Split and keep last
|
||||
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
echo "APP_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
path: ${{ env.APP_NAME }}
|
||||
|
||||
- name: Get appinfo data
|
||||
id: appinfo
|
||||
uses: skjnldsv/xpath-action@master
|
||||
with:
|
||||
filename: ${{ env.APP_NAME }}/appinfo/info.xml
|
||||
expression: "//info//dependencies//nextcloud/@min-version"
|
||||
|
||||
- name: Read package.json node and npm engines version
|
||||
uses: skjnldsv/read-package-engines-version-actions@v1.1
|
||||
id: versions
|
||||
# Continue if no package.json
|
||||
continue-on-error: true
|
||||
with:
|
||||
path: ${{ env.APP_NAME }}
|
||||
fallbackNode: "^12"
|
||||
fallbackNpm: "^6"
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.npmVersion }}
|
||||
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
|
||||
|
||||
- name: Set up php ${{ env.PHP_VERSION }}
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ env.PHP_VERSION }}
|
||||
coverage: none
|
||||
|
||||
- name: Check composer.json
|
||||
id: check_composer
|
||||
uses: andstor/file-existence-action@v1
|
||||
with:
|
||||
files: "${{ env.APP_NAME }}/composer.json"
|
||||
|
||||
- name: Install composer dependencies
|
||||
if: steps.check_composer.outputs.files_exists == 'true'
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
composer install --no-dev
|
||||
|
||||
- name: Build ${{ env.APP_NAME }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
npm ci
|
||||
npm run build
|
||||
|
||||
- name: Install Krankerl
|
||||
run: |
|
||||
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.13.0/krankerl_0.13.0_amd64.deb
|
||||
sudo dpkg -i krankerl_0.13.0_amd64.deb
|
||||
|
||||
- name: Package ${{ env.APP_NAME }} ${{ env.APP_VERSION }}
|
||||
# Try krankerl, fallback to makefile
|
||||
run: |
|
||||
cd ${{ env.APP_NAME }}
|
||||
krankerl package || make appstore
|
||||
|
||||
- name: Checkout server ${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
|
||||
continue-on-error: true
|
||||
id: server-checkout
|
||||
run: |
|
||||
NCVERSION=${{ fromJSON(steps.appinfo.outputs.result).nextcloud.min-version }}
|
||||
wget --quiet https://download.nextcloud.com/server/releases/latest-$NCVERSION.zip
|
||||
unzip latest-$NCVERSION.zip
|
||||
|
||||
- name: Checkout server master fallback
|
||||
uses: actions/checkout@v2
|
||||
if: ${{ steps.server-checkout.outcome != 'success' }}
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
path: nextcloud
|
||||
|
||||
- name: Sign app
|
||||
run: |
|
||||
# Extracting release
|
||||
cd ${{ env.APP_NAME }}/build/artifacts
|
||||
tar -xvf ${{ env.APP_NAME }}.tar.gz
|
||||
cd ../../../
|
||||
# Setting up keys
|
||||
echo "${{ secrets.APP_PRIVATE_KEY }}" > ${{ env.APP_NAME }}.key
|
||||
wget --quiet "https://github.com/nextcloud/app-certificate-requests/raw/master/${{ env.APP_NAME }}/${{ env.APP_NAME }}.crt"
|
||||
# Signing
|
||||
php nextcloud/occ integrity:sign-app --privateKey=../${{ env.APP_NAME }}.key --certificate=../${{ env.APP_NAME }}.crt --path=../${{ env.APP_NAME }}/build/artifacts/${{ env.APP_NAME }}
|
||||
# Rebuilding archive
|
||||
cd ${{ env.APP_NAME }}/build/artifacts
|
||||
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:
|
||||
php-versions: ['7.4']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable22']
|
||||
server-versions: ['master']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
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
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@v2
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
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
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Set up php${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@v1
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
coverage: none
|
||||
@@ -31,9 +31,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@master
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@master
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: 7.4
|
||||
coverage: none
|
||||
@@ -50,9 +50,9 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Use node ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
uses: actions/setup-node@v2.4.1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
@@ -67,16 +67,16 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-versions: [14.x]
|
||||
node-version: [14.x]
|
||||
|
||||
name: stylelint node${{ matrix.node-versions }}
|
||||
name: stylelint node${{ matrix.node-version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v2.4.0
|
||||
|
||||
- name: Set up node ${{ matrix.node-versions }}
|
||||
uses: actions/setup-node@v1
|
||||
- name: Set up node ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v2.4.1
|
||||
with:
|
||||
node-versions: ${{ matrix.node-versions }}
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Set up npm7
|
||||
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]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
uses: actions/setup-node@v2.4.1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v1
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: composer
|
||||
|
||||
4
.github/workflows/nodejs.yml
vendored
4
.github/workflows/nodejs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2.4.0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
uses: actions/setup-node@v2.4.1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
|
||||
8
.github/workflows/phpunit.yml
vendored
8
.github/workflows/phpunit.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
matrix:
|
||||
php-versions: ['7.3', '7.4']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable22']
|
||||
server-versions: ['master']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
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
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@v2
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
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
|
||||
strategy:
|
||||
matrix:
|
||||
ocp-version: [ 'dev-stable22' ]
|
||||
ocp-version: [ 'dev-master' ]
|
||||
name: Nextcloud ${{ matrix.ocp-version }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@master
|
||||
uses: actions/checkout@v2.4.0
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@master
|
||||
uses: shivammathur/setup-php@2.16.0
|
||||
with:
|
||||
php-version: 7.4
|
||||
tools: composer:v1
|
||||
|
||||
120
CHANGELOG.md
120
CHANGELOG.md
@@ -1,74 +1,38 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## 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
|
||||
## 1.6.0-beta1
|
||||
|
||||
### Added
|
||||
|
||||
* Nextcloud 22 compatibility
|
||||
* [#3105](https://github.com/nextcloud/deck/pull/3105) Compatibility with Cirlces changes in 22
|
||||
* [#3147](https://github.com/nextcloud/deck/pull/3147) Add card button to the dashboard widget @jakobroehrl
|
||||
* [#2854](https://github.com/nextcloud/deck/pull/2854) Add card button in card overview @jakobroehrl
|
||||
* [#3078](https://github.com/nextcloud/deck/pull/3078) Show on shared boards unassigned cards to all users @jakobroehrl
|
||||
- #3177 Use async import for vue component on collections entrypoint @juliushaertl
|
||||
- #2791 Open description links in new tab @fm-sys
|
||||
- #3344 Improve combined search @eneiluj
|
||||
- #3362 Improve search performance @eneiluj
|
||||
- #2710 Due date shortcuts in the datepicker @jakobroehrl
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#2935](https://github.com/nextcloud/deck/pull/2935) Rich object string parameters for notifications @nickvergessen
|
||||
* [#2950](https://github.com/nextcloud/deck/pull/2950) Remove notification on unshare and add type hints
|
||||
* [#2983](https://github.com/nextcloud/deck/pull/2983) Fix codemirror description width
|
||||
* [#2989](https://github.com/nextcloud/deck/pull/2989) Fix unified comments search with postgres
|
||||
* [#3005](https://github.com/nextcloud/deck/pull/3005) Do not query the lookupserver when looking for sharees
|
||||
* [#3011](https://github.com/nextcloud/deck/pull/3011) L10n: Spelling unification @Valdnet
|
||||
* [#3014](https://github.com/nextcloud/deck/pull/3014) Proper error handling when fetching comments fails
|
||||
* [#3016](https://github.com/nextcloud/deck/pull/3016) Allow searching for filters without a query to match all that have a given filter set
|
||||
* [#3021](https://github.com/nextcloud/deck/pull/3021) L10n: Add word "Card" @Valdnet
|
||||
* [#3025](https://github.com/nextcloud/deck/pull/3025) Show comment counter and highlight if unread comments are available
|
||||
* [#3036](https://github.com/nextcloud/deck/pull/3036) Add link to migration tool for Trello @maxammann
|
||||
* [#3037](https://github.com/nextcloud/deck/pull/3037) Catch any error during circle detail fetching
|
||||
* [#3038](https://github.com/nextcloud/deck/pull/3038) Get attachment from the user node instead of the share source
|
||||
* [#3092](https://github.com/nextcloud/deck/pull/3092) Refactor update to have proper order of optional parameters
|
||||
* [#3113](https://github.com/nextcloud/deck/pull/3113) Use new viewer syntax with destructuring object @azul
|
||||
* [#3142](https://github.com/nextcloud/deck/pull/3142) Always pass user id in share provider
|
||||
* [#3152](https://github.com/nextcloud/deck/pull/3152) Only offer stack creation in emptycontent with proper permissions
|
||||
* [#3165](https://github.com/nextcloud/deck/pull/3165) Always log generic exceptions
|
||||
* [#3168](https://github.com/nextcloud/deck/pull/3168) Reduce duplicate queries when fetching user boards an permissions
|
||||
|
||||
- #3161 Reduce duplicate queries when fetching user boards an permissions @juliushaertl
|
||||
- #3151 Always log generic exceptions @juliushaertl
|
||||
- #3217 Move circle checks to a unified service and improve member checks @juliushaertl
|
||||
- #3225 Check for null value to avoid TypeError in the group manager @juliushaertl
|
||||
- #3263 Defer obtaining the user session in the config service @juliushaertl
|
||||
- #3294 Fix print style issues @weeman1337
|
||||
- #3299 Return false instead of throwing when getting calendar setting @juliushaertl
|
||||
- #3298 Delete file shares through attachments API @juliushaertl
|
||||
- #3343 Fix search pagination cursor @eneiluj
|
||||
- #3326 add autofocus on board edit @weeman1337
|
||||
- #3323 Extend drag-and-drop zone in card sidebar @old-green-frog
|
||||
- #3364 Fix optional parameter order @juliushaertl
|
||||
- #3324 Fix menu button position in card modal @valerydmitrieva
|
||||
- #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
|
||||
@@ -105,15 +69,15 @@ All notable changes to this project will be documented in this file.
|
||||
## 1.3.0-beta2
|
||||
|
||||
### Fixed
|
||||
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck
|
||||
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
* [#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
|
||||
* [#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
|
||||
* [#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
|
||||
@@ -222,31 +186,31 @@ All notable changes to this project will be documented in this file.
|
||||
### Fixed
|
||||
|
||||
|
||||
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues
|
||||
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments
|
||||
* [#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 @juliushaertl
|
||||
|
||||
## 1.0.4 - 2020-06-26
|
||||
|
||||
### 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
|
||||
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change
|
||||
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar
|
||||
* [#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 @juliushaertl
|
||||
|
||||
|
||||
## 1.0.3 - 2020-06-19
|
||||
|
||||
### Fixed
|
||||
|
||||
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule
|
||||
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes
|
||||
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues
|
||||
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API
|
||||
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card
|
||||
* [#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 @juliushaertl
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key
|
||||
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling
|
||||
* [#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 @juliushaertl
|
||||
* [#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
|
||||
|
||||
|
||||
@@ -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
|
||||
- [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
|
||||
|
||||
This app is supposed to work on the two latest Nextcloud versions.
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.5.4</version>
|
||||
<version>1.7.0-alpha1</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Deck</namespace>
|
||||
@@ -34,8 +34,8 @@
|
||||
<php min-version="7.3"/>
|
||||
<database min-version="9.4">pgsql</database>
|
||||
<database>sqlite</database>
|
||||
<database min-version="5.5">mysql</database>
|
||||
<nextcloud min-version="22" max-version="22"/>
|
||||
<database min-version="8.0">mysql</database>
|
||||
<nextcloud min-version="24" max-version="24"/>
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||
|
||||
330
composer.lock
generated
330
composer.lock
generated
@@ -65,27 +65,27 @@
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "amphp/amp",
|
||||
"version": "v2.5.2",
|
||||
"version": "v2.6.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/amphp/amp.git",
|
||||
"reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9"
|
||||
"reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/amphp/amp/zipball/efca2b32a7580087adb8aabbff6be1dc1bb924a9",
|
||||
"reference": "efca2b32a7580087adb8aabbff6be1dc1bb924a9",
|
||||
"url": "https://api.github.com/repos/amphp/amp/zipball/c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae",
|
||||
"reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7"
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"amphp/php-cs-fixer-config": "dev-master",
|
||||
"amphp/phpunit-util": "^1",
|
||||
"ext-json": "*",
|
||||
"jetbrains/phpstorm-stubs": "^2019.3",
|
||||
"phpunit/phpunit": "^6.0.9 | ^7",
|
||||
"phpunit/phpunit": "^7 | ^8 | ^9",
|
||||
"psalm/phar": "^3.11@dev",
|
||||
"react/promise": "^2"
|
||||
},
|
||||
@@ -142,7 +142,7 @@
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/amphp",
|
||||
"issues": "https://github.com/amphp/amp/issues",
|
||||
"source": "https://github.com/amphp/amp/tree/v2.5.2"
|
||||
"source": "https://github.com/amphp/amp/tree/v2.6.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -150,7 +150,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-01-10T17:06:37+00:00"
|
||||
"time": "2021-09-23T18:43:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "amphp/byte-stream",
|
||||
@@ -271,16 +271,16 @@
|
||||
},
|
||||
{
|
||||
"name": "composer/package-versions-deprecated",
|
||||
"version": "1.11.99.2",
|
||||
"version": "1.11.99.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/package-versions-deprecated.git",
|
||||
"reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c"
|
||||
"reference": "b174585d1fe49ceed21928a945138948cb394600"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c",
|
||||
"reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c",
|
||||
"url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600",
|
||||
"reference": "b174585d1fe49ceed21928a945138948cb394600",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -324,7 +324,7 @@
|
||||
"description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/package-versions-deprecated/issues",
|
||||
"source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2"
|
||||
"source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -340,20 +340,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-24T07:46:03+00:00"
|
||||
"time": "2021-09-13T08:41:34+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/semver",
|
||||
"version": "3.2.5",
|
||||
"version": "3.2.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/composer/semver.git",
|
||||
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9"
|
||||
"reference": "83e511e247de329283478496f7a1e114c9517506"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9",
|
||||
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9",
|
||||
"url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506",
|
||||
"reference": "83e511e247de329283478496f7a1e114c9517506",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -405,7 +405,7 @@
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/composer",
|
||||
"issues": "https://github.com/composer/semver/issues",
|
||||
"source": "https://github.com/composer/semver/tree/3.2.5"
|
||||
"source": "https://github.com/composer/semver/tree/3.2.6"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -421,7 +421,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-24T12:41:47+00:00"
|
||||
"time": "2021-10-25T11:34:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "composer/xdebug-handler",
|
||||
@@ -750,20 +750,20 @@
|
||||
},
|
||||
{
|
||||
"name": "felixfbecker/advanced-json-rpc",
|
||||
"version": "v3.2.0",
|
||||
"version": "v3.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
|
||||
"reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e"
|
||||
"reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/06f0b06043c7438959dbdeed8bb3f699a19be22e",
|
||||
"reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e",
|
||||
"url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
|
||||
"reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"netresearch/jsonmapper": "^1.0 || ^2.0",
|
||||
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
|
||||
"php": "^7.1 || ^8.0",
|
||||
"phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
|
||||
},
|
||||
@@ -789,9 +789,9 @@
|
||||
"description": "A more advanced JSONRPC implementation",
|
||||
"support": {
|
||||
"issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
|
||||
"source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.0"
|
||||
"source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
|
||||
},
|
||||
"time": "2021-01-10T17:48:47+00:00"
|
||||
"time": "2021-06-11T22:34:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "felixfbecker/language-server-protocol",
|
||||
@@ -1012,16 +1012,16 @@
|
||||
},
|
||||
{
|
||||
"name": "netresearch/jsonmapper",
|
||||
"version": "v2.1.0",
|
||||
"version": "v4.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cweiske/jsonmapper.git",
|
||||
"reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e"
|
||||
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e",
|
||||
"reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e",
|
||||
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
|
||||
"reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1029,10 +1029,10 @@
|
||||
"ext-pcre": "*",
|
||||
"ext-reflection": "*",
|
||||
"ext-spl": "*",
|
||||
"php": ">=5.6"
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0",
|
||||
"phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
|
||||
"squizlabs/php_codesniffer": "~3.5"
|
||||
},
|
||||
"type": "library",
|
||||
@@ -1057,9 +1057,9 @@
|
||||
"support": {
|
||||
"email": "cweiske@cweiske.de",
|
||||
"issues": "https://github.com/cweiske/jsonmapper/issues",
|
||||
"source": "https://github.com/cweiske/jsonmapper/tree/master"
|
||||
"source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0"
|
||||
},
|
||||
"time": "2020-04-16T18:48:43+00:00"
|
||||
"time": "2020-12-01T19:48:11+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nextcloud/coding-standard",
|
||||
@@ -1104,16 +1104,16 @@
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v4.10.5",
|
||||
"version": "v4.13.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "4432ba399e47c66624bc73c8c0f811e5c109576f"
|
||||
"reference": "50953a2691a922aa1769461637869a0a2faa3f53"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f",
|
||||
"reference": "4432ba399e47c66624bc73c8c0f811e5c109576f",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53",
|
||||
"reference": "50953a2691a922aa1769461637869a0a2faa3f53",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1154,9 +1154,9 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5"
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0"
|
||||
},
|
||||
"time": "2021-05-03T19:11:20+00:00"
|
||||
"time": "2021-09-20T12:20:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "openlss/lib-array2xml",
|
||||
@@ -1213,16 +1213,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phar-io/manifest",
|
||||
"version": "2.0.1",
|
||||
"version": "2.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phar-io/manifest.git",
|
||||
"reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
|
||||
"reference": "97803eca37d319dfa7826cc2437fc020857acb53"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
|
||||
"reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
|
||||
"url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
|
||||
"reference": "97803eca37d319dfa7826cc2437fc020857acb53",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1267,9 +1267,9 @@
|
||||
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
|
||||
"support": {
|
||||
"issues": "https://github.com/phar-io/manifest/issues",
|
||||
"source": "https://github.com/phar-io/manifest/tree/master"
|
||||
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
|
||||
},
|
||||
"time": "2020-06-27T14:33:11+00:00"
|
||||
"time": "2021-07-20T11:28:43+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/version",
|
||||
@@ -1379,16 +1379,16 @@
|
||||
},
|
||||
{
|
||||
"name": "php-parallel-lint/php-parallel-lint",
|
||||
"version": "v1.3.0",
|
||||
"version": "v1.3.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
|
||||
"reference": "772a954e5f119f6f5871d015b23eabed8cbdadfb"
|
||||
"reference": "761f3806e30239b5fcd90a0a45d41dc2138de192"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/772a954e5f119f6f5871d015b23eabed8cbdadfb",
|
||||
"reference": "772a954e5f119f6f5871d015b23eabed8cbdadfb",
|
||||
"url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/761f3806e30239b5fcd90a0a45d41dc2138de192",
|
||||
"reference": "761f3806e30239b5fcd90a0a45d41dc2138de192",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1402,7 +1402,7 @@
|
||||
"require-dev": {
|
||||
"nette/tester": "^1.3 || ^2.0",
|
||||
"php-parallel-lint/php-console-highlighter": "~0.3",
|
||||
"squizlabs/php_codesniffer": "^3.5"
|
||||
"squizlabs/php_codesniffer": "^3.6"
|
||||
},
|
||||
"suggest": {
|
||||
"php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
|
||||
@@ -1430,9 +1430,9 @@
|
||||
"homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
|
||||
"support": {
|
||||
"issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
|
||||
"source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.0"
|
||||
"source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.1"
|
||||
},
|
||||
"time": "2021-04-07T14:42:48+00:00"
|
||||
"time": "2021-08-13T05:35:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-common",
|
||||
@@ -1489,16 +1489,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-docblock",
|
||||
"version": "5.2.2",
|
||||
"version": "5.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
|
||||
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
|
||||
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
|
||||
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1509,7 +1509,8 @@
|
||||
"webmozart/assert": "^1.9.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "~1.3.2"
|
||||
"mockery/mockery": "~1.3.2",
|
||||
"psalm/phar": "^4.8"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@@ -1539,22 +1540,22 @@
|
||||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
|
||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
|
||||
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
|
||||
},
|
||||
"time": "2020-09-03T19:13:55+00:00"
|
||||
"time": "2021-10-19T17:43:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/type-resolver",
|
||||
"version": "1.4.0",
|
||||
"version": "1.5.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
||||
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
|
||||
"reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
|
||||
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae",
|
||||
"reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1562,7 +1563,8 @@
|
||||
"phpdocumentor/reflection-common": "^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-tokenizer": "*"
|
||||
"ext-tokenizer": "*",
|
||||
"psalm/phar": "^4.8"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
@@ -1588,39 +1590,39 @@
|
||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1"
|
||||
},
|
||||
"time": "2020-09-17T18:55:26+00:00"
|
||||
"time": "2021-10-02T14:08:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
"version": "1.13.0",
|
||||
"version": "1.14.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpspec/prophecy.git",
|
||||
"reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
|
||||
"reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
|
||||
"reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
|
||||
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
|
||||
"reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.2",
|
||||
"php": "^7.2 || ~8.0, <8.1",
|
||||
"php": "^7.2 || ~8.0, <8.2",
|
||||
"phpdocumentor/reflection-docblock": "^5.2",
|
||||
"sebastian/comparator": "^3.0 || ^4.0",
|
||||
"sebastian/recursion-context": "^3.0 || ^4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpspec/phpspec": "^6.0",
|
||||
"phpspec/phpspec": "^6.0 || ^7.0",
|
||||
"phpunit/phpunit": "^8.0 || ^9.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.11.x-dev"
|
||||
"dev-master": "1.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -1655,29 +1657,29 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/phpspec/prophecy/issues",
|
||||
"source": "https://github.com/phpspec/prophecy/tree/1.13.0"
|
||||
"source": "https://github.com/phpspec/prophecy/tree/1.14.0"
|
||||
},
|
||||
"time": "2021-03-17T13:42:18+00:00"
|
||||
"time": "2021-09-10T09:02:12+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "9.2.6",
|
||||
"version": "9.2.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "f6293e1b30a2354e8428e004689671b83871edde"
|
||||
"reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde",
|
||||
"reference": "f6293e1b30a2354e8428e004689671b83871edde",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218",
|
||||
"reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"nikic/php-parser": "^4.10.2",
|
||||
"nikic/php-parser": "^4.12.0",
|
||||
"php": ">=7.3",
|
||||
"phpunit/php-file-iterator": "^3.0.3",
|
||||
"phpunit/php-text-template": "^2.0.2",
|
||||
@@ -1726,7 +1728,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6"
|
||||
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1734,7 +1736,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-03-28T07:26:59+00:00"
|
||||
"time": "2021-09-17T05:39:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
@@ -1979,16 +1981,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "9.5.5",
|
||||
"version": "9.5.10",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "89ff45ea9d70e35522fb6654a2ebc221158de276"
|
||||
"reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/89ff45ea9d70e35522fb6654a2ebc221158de276",
|
||||
"reference": "89ff45ea9d70e35522fb6654a2ebc221158de276",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a",
|
||||
"reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2000,11 +2002,11 @@
|
||||
"ext-xml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"myclabs/deep-copy": "^1.10.1",
|
||||
"phar-io/manifest": "^2.0.1",
|
||||
"phar-io/manifest": "^2.0.3",
|
||||
"phar-io/version": "^3.0.2",
|
||||
"php": ">=7.3",
|
||||
"phpspec/prophecy": "^1.12.1",
|
||||
"phpunit/php-code-coverage": "^9.2.3",
|
||||
"phpunit/php-code-coverage": "^9.2.7",
|
||||
"phpunit/php-file-iterator": "^3.0.5",
|
||||
"phpunit/php-invoker": "^3.1.1",
|
||||
"phpunit/php-text-template": "^2.0.3",
|
||||
@@ -2018,7 +2020,7 @@
|
||||
"sebastian/global-state": "^5.0.1",
|
||||
"sebastian/object-enumerator": "^4.0.3",
|
||||
"sebastian/resource-operations": "^3.0.3",
|
||||
"sebastian/type": "^2.3.2",
|
||||
"sebastian/type": "^2.3.4",
|
||||
"sebastian/version": "^3.0.2"
|
||||
},
|
||||
"require-dev": {
|
||||
@@ -2066,7 +2068,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.5"
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -2078,7 +2080,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-06-05T04:49:07+00:00"
|
||||
"time": "2021-09-25T07:38:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/container",
|
||||
@@ -3360,16 +3362,16 @@
|
||||
},
|
||||
{
|
||||
"name": "sebastian/type",
|
||||
"version": "2.3.2",
|
||||
"version": "2.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/type.git",
|
||||
"reference": "0d1c587401514d17e8f9258a27e23527cb1b06c1"
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0d1c587401514d17e8f9258a27e23527cb1b06c1",
|
||||
"reference": "0d1c587401514d17e8f9258a27e23527cb1b06c1",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3404,7 +3406,7 @@
|
||||
"homepage": "https://github.com/sebastianbergmann/type",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/type/issues",
|
||||
"source": "https://github.com/sebastianbergmann/type/tree/2.3.2"
|
||||
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3412,7 +3414,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-06-04T13:02:07+00:00"
|
||||
"time": "2021-06-15T12:49:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/version",
|
||||
@@ -3469,16 +3471,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v5.3.0",
|
||||
"version": "v5.3.10",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "058553870f7809087fa80fa734704a21b9bcaeb2"
|
||||
"reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2",
|
||||
"reference": "058553870f7809087fa80fa734704a21b9bcaeb2",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
|
||||
"reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3486,11 +3488,12 @@
|
||||
"symfony/deprecation-contracts": "^2.1",
|
||||
"symfony/polyfill-mbstring": "~1.0",
|
||||
"symfony/polyfill-php73": "^1.8",
|
||||
"symfony/polyfill-php80": "^1.15",
|
||||
"symfony/polyfill-php80": "^1.16",
|
||||
"symfony/service-contracts": "^1.1|^2",
|
||||
"symfony/string": "^5.1"
|
||||
},
|
||||
"conflict": {
|
||||
"psr/log": ">=3",
|
||||
"symfony/dependency-injection": "<4.4",
|
||||
"symfony/dotenv": "<5.1",
|
||||
"symfony/event-dispatcher": "<4.4",
|
||||
@@ -3498,10 +3501,10 @@
|
||||
"symfony/process": "<4.4"
|
||||
},
|
||||
"provide": {
|
||||
"psr/log-implementation": "1.0"
|
||||
"psr/log-implementation": "1.0|2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/log": "~1.0",
|
||||
"psr/log": "^1|^2",
|
||||
"symfony/config": "^4.4|^5.0",
|
||||
"symfony/dependency-injection": "^4.4|^5.0",
|
||||
"symfony/event-dispatcher": "^4.4|^5.0",
|
||||
@@ -3547,7 +3550,7 @@
|
||||
"terminal"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/console/tree/v5.3.0"
|
||||
"source": "https://github.com/symfony/console/tree/v5.3.10"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3563,7 +3566,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-26T17:43:10+00:00"
|
||||
"time": "2021-10-26T09:30:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/deprecation-contracts",
|
||||
@@ -3634,21 +3637,22 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v4.4.19",
|
||||
"version": "v4.4.34",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "c352647244bd376bf7d31efbd5401f13f50dad0c"
|
||||
"reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c",
|
||||
"reference": "c352647244bd376bf7d31efbd5401f13f50dad0c",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8",
|
||||
"reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1.3",
|
||||
"symfony/event-dispatcher-contracts": "^1.1"
|
||||
"symfony/event-dispatcher-contracts": "^1.1",
|
||||
"symfony/polyfill-php80": "^1.16"
|
||||
},
|
||||
"conflict": {
|
||||
"symfony/dependency-injection": "<3.4"
|
||||
@@ -3658,7 +3662,7 @@
|
||||
"symfony/event-dispatcher-implementation": "1.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"psr/log": "~1.0",
|
||||
"psr/log": "^1|^2|^3",
|
||||
"symfony/config": "^3.4|^4.0|^5.0",
|
||||
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
|
||||
"symfony/error-handler": "~3.4|~4.4",
|
||||
@@ -3697,7 +3701,7 @@
|
||||
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v4.4.19"
|
||||
"source": "https://github.com/symfony/event-dispatcher/tree/v4.4.34"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3713,20 +3717,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-01-27T09:09:26+00:00"
|
||||
"time": "2021-11-15T14:42:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher-contracts",
|
||||
"version": "v1.1.9",
|
||||
"version": "v1.1.11",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
|
||||
"reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7"
|
||||
"reference": "01e9a4efac0ee33a05dfdf93b346f62e7d0e998c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7",
|
||||
"reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/01e9a4efac0ee33a05dfdf93b346f62e7d0e998c",
|
||||
"reference": "01e9a4efac0ee33a05dfdf93b346f62e7d0e998c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3739,7 +3743,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.1-dev"
|
||||
"dev-main": "1.1-dev"
|
||||
},
|
||||
"thanks": {
|
||||
"name": "symfony/contracts",
|
||||
@@ -3776,7 +3780,7 @@
|
||||
"standards"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9"
|
||||
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.11"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -3792,7 +3796,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-07-06T13:19:58+00:00"
|
||||
"time": "2021-03-23T15:25:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
@@ -4067,16 +4071,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-grapheme",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.23.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
|
||||
"reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab"
|
||||
"reference": "16880ba9c5ebe3642d1995ab866db29270b36535"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab",
|
||||
"reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535",
|
||||
"reference": "16880ba9c5ebe3642d1995ab866db29270b36535",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4128,7 +4132,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0"
|
||||
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4144,7 +4148,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-27T09:17:38+00:00"
|
||||
"time": "2021-05-27T12:26:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
@@ -4232,16 +4236,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.23.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
"reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1"
|
||||
"reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
|
||||
"reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
|
||||
"reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4292,7 +4296,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0"
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4308,7 +4312,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-27T09:27:20+00:00"
|
||||
"time": "2021-05-27T12:26:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php70",
|
||||
@@ -4535,16 +4539,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php80",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.23.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
||||
"reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0"
|
||||
"reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0",
|
||||
"reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
|
||||
"reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4598,7 +4602,7 @@
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0"
|
||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4614,7 +4618,7 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-02-19T12:13:01+00:00"
|
||||
"time": "2021-07-28T13:41:28+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
@@ -4821,16 +4825,16 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/string",
|
||||
"version": "v5.3.0",
|
||||
"version": "v5.3.10",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/string.git",
|
||||
"reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b"
|
||||
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b",
|
||||
"reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b",
|
||||
"url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
|
||||
"reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4884,7 +4888,7 @@
|
||||
"utf8"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/string/tree/v5.3.0"
|
||||
"source": "https://github.com/symfony/string/tree/v5.3.10"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4900,20 +4904,20 @@
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-26T17:43:10+00:00"
|
||||
"time": "2021-10-27T18:21:46+00:00"
|
||||
},
|
||||
{
|
||||
"name": "theseer/tokenizer",
|
||||
"version": "1.2.0",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/theseer/tokenizer.git",
|
||||
"reference": "75a63c33a8577608444246075ea0af0d052e452a"
|
||||
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
|
||||
"reference": "75a63c33a8577608444246075ea0af0d052e452a",
|
||||
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
|
||||
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4942,7 +4946,7 @@
|
||||
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
||||
"support": {
|
||||
"issues": "https://github.com/theseer/tokenizer/issues",
|
||||
"source": "https://github.com/theseer/tokenizer/tree/master"
|
||||
"source": "https://github.com/theseer/tokenizer/tree/1.2.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4950,20 +4954,20 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-07-12T23:59:07+00:00"
|
||||
"time": "2021-07-28T10:34:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vimeo/psalm",
|
||||
"version": "4.7.3",
|
||||
"version": "4.11.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vimeo/psalm.git",
|
||||
"reference": "38c452ae584467e939d55377aaf83b5a26f19dd1"
|
||||
"reference": "6fba5eb554f9507b72932f9c75533d8af593688d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/38c452ae584467e939d55377aaf83b5a26f19dd1",
|
||||
"reference": "38c452ae584467e939d55377aaf83b5a26f19dd1",
|
||||
"url": "https://api.github.com/repos/vimeo/psalm/zipball/6fba5eb554f9507b72932f9c75533d8af593688d",
|
||||
"reference": "6fba5eb554f9507b72932f9c75533d8af593688d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -4973,6 +4977,7 @@
|
||||
"composer/semver": "^1.4 || ^2.0 || ^3.0",
|
||||
"composer/xdebug-handler": "^1.1 || ^2.0",
|
||||
"dnoegel/php-xdg-base-dir": "^0.1.1",
|
||||
"ext-ctype": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
@@ -4982,7 +4987,7 @@
|
||||
"felixfbecker/advanced-json-rpc": "^3.0.3",
|
||||
"felixfbecker/language-server-protocol": "^1.5",
|
||||
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
|
||||
"nikic/php-parser": "^4.10.5",
|
||||
"nikic/php-parser": "^4.13",
|
||||
"openlss/lib-array2xml": "^1.0",
|
||||
"php": "^7.1|^8",
|
||||
"sebastian/diff": "^3.0 || ^4.0",
|
||||
@@ -5001,11 +5006,10 @@
|
||||
"phpmyadmin/sql-parser": "5.1.0||dev-master",
|
||||
"phpspec/prophecy": ">=1.9.0",
|
||||
"phpunit/phpunit": "^9.0",
|
||||
"psalm/plugin-phpunit": "^0.13",
|
||||
"psalm/plugin-phpunit": "^0.16",
|
||||
"slevomat/coding-standard": "^7.0",
|
||||
"squizlabs/php_codesniffer": "^3.5",
|
||||
"symfony/process": "^4.3",
|
||||
"weirdan/phpunit-appveyor-reporter": "^1.0.0",
|
||||
"symfony/process": "^4.3 || ^5.0",
|
||||
"weirdan/prophecy-shim": "^1.0 || ^2.0"
|
||||
},
|
||||
"suggest": {
|
||||
@@ -5053,9 +5057,9 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/vimeo/psalm/issues",
|
||||
"source": "https://github.com/vimeo/psalm/tree/4.7.3"
|
||||
"source": "https://github.com/vimeo/psalm/tree/4.11.2"
|
||||
},
|
||||
"time": "2021-05-24T04:09:51+00:00"
|
||||
"time": "2021-10-26T17:28:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Чакащо споделяне",
|
||||
"Add this attachment" : "Добавете този прикачен файл",
|
||||
"Show in Files" : "Показване във файлове",
|
||||
"Download" : "Изтегляне",
|
||||
"Remove attachment" : "Премахване на прикачен файл",
|
||||
"Delete Attachment" : "Изтриване на прикачен файл",
|
||||
"Restore Attachment" : "Възстановяване на прикачен файл",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Чакащо споделяне",
|
||||
"Add this attachment" : "Добавете този прикачен файл",
|
||||
"Show in Files" : "Показване във файлове",
|
||||
"Download" : "Изтегляне",
|
||||
"Remove attachment" : "Премахване на прикачен файл",
|
||||
"Delete Attachment" : "Изтриване на прикачен файл",
|
||||
"Restore Attachment" : "Възстановяване на прикачен файл",
|
||||
|
||||
40
l10n/ca.js
40
l10n/ca.js
@@ -70,9 +70,15 @@ OC.L10N.register(
|
||||
"Upcoming cards" : "Pròximes targetes",
|
||||
"Personal" : "Personal",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
|
||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
|
||||
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
|
||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
|
||||
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
|
||||
"{user} has shared {deck-board} with you." : "{user} us ha compartit {board}.",
|
||||
"Card comments" : "Comentaris de la targeta",
|
||||
"%s on %s" : "%s a %s",
|
||||
"No data was provided to create an attachment." : "No s’ha proporcionat cap dada per crear un fitxer adjunt.",
|
||||
"Finished" : "Acabat",
|
||||
"To review" : "Per revisar",
|
||||
@@ -94,6 +100,9 @@ OC.L10N.register(
|
||||
"Could not write file to disk" : "No s’ha pogut escriure el fitxer al disc",
|
||||
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
|
||||
"Card not found" : "No s'ha trobat la targeta",
|
||||
"Path is already shared with this card" : "Aquesta ruta ja ha estat compartida amb aquesta targeta",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "La data no és vàlida, el format de la data ha de ser YYYY-MM-DD",
|
||||
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
|
||||
"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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
|
||||
"Card details" : "Detalls de la targeta",
|
||||
@@ -101,9 +110,16 @@ OC.L10N.register(
|
||||
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
|
||||
"Search by board title" : "Cerca per títol del tauler",
|
||||
"Select board" : "Selecciona un tauler",
|
||||
"Create a new card" : "Crea una nova targeta",
|
||||
"Select a board" : "Selecciona un tauler",
|
||||
"Select a list" : "Seleccioneu una llista",
|
||||
"Card title" : "Títol de la targeta",
|
||||
"Cancel" : "Cancel·la",
|
||||
"Creating the new card …" : "Creant la nova targeta",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "La targeta \"{card}\" s'ha afegit a \"{board}\"",
|
||||
"Open card" : "Obre la targeta",
|
||||
"Close" : "Tanca",
|
||||
"Create card" : "Crea una targeta",
|
||||
"Select a card" : "Selecciona una targeta",
|
||||
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
|
||||
"Link to card" : "Enllaç a la targeta",
|
||||
@@ -167,9 +183,16 @@ OC.L10N.register(
|
||||
"title and color value must be provided" : "s’ha de proporcionar el valor del títol i del color",
|
||||
"Board name" : "Nom del taulell",
|
||||
"Members" : "Membres",
|
||||
"Upload new files" : "Puja nous fitxers",
|
||||
"Share from Files" : "Comparteix des de Fitxers",
|
||||
"Pending share" : "Compartició pendent",
|
||||
"Add this attachment" : "Afegeix aquest adjunt",
|
||||
"Show in Files" : "Mostra a Fitxers",
|
||||
"Remove attachment" : "Treu l'adjunt",
|
||||
"Delete Attachment" : "Suprimeix l’adjunt",
|
||||
"Restore Attachment" : "Restaura l'adjunt",
|
||||
"File to share" : "Fitxer a compartir",
|
||||
"Invalid path selected" : "S'ha seleccionat una ruta invàlida",
|
||||
"Open in sidebar view" : "Obre a la vista de la barra lateral",
|
||||
"Open in bigger view" : "Obre a la vista més gran",
|
||||
"Attachments" : "Adjunts",
|
||||
@@ -178,6 +201,7 @@ OC.L10N.register(
|
||||
"Created" : "Creat",
|
||||
"The title cannot be empty." : "El títol no pot estar buit",
|
||||
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
|
||||
"Failed to load comments" : "No s'han pogut carregar els comentaris",
|
||||
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
|
||||
"Assign to users" : "Assigna als usuaris",
|
||||
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
|
||||
@@ -188,10 +212,13 @@ OC.L10N.register(
|
||||
"Select Date" : "Selecciona la data",
|
||||
"Today" : "Avui",
|
||||
"Tomorrow" : "Demà",
|
||||
"Next week" : "Setmana següent",
|
||||
"Next month" : "Mes següent",
|
||||
"Save" : "Desa",
|
||||
"The comment cannot be empty." : "El comentari no pot estar buit.",
|
||||
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
|
||||
"In reply to" : "En resposta a",
|
||||
"Cancel reply" : "Cancel·la la resposta",
|
||||
"Reply" : "Respon",
|
||||
"Update" : "Actualitza",
|
||||
"Description" : "Descripció",
|
||||
@@ -204,6 +231,7 @@ OC.L10N.register(
|
||||
"Write a description …" : "Escriviu una descripció...",
|
||||
"Choose attachment" : "Triar adjunt",
|
||||
"(group)" : "(grup)",
|
||||
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
|
||||
"Assign to me" : "Assigna'm a mi",
|
||||
"Unassign myself" : "Desasignar a mi mateix",
|
||||
"Move card" : "Mou la targeta",
|
||||
@@ -220,7 +248,7 @@ OC.L10N.register(
|
||||
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
|
||||
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
|
||||
"Board details" : "Detalls de la junta",
|
||||
"Board details" : "Detalls del tauler",
|
||||
"Edit board" : "Edita el tauler",
|
||||
"Clone board" : "Clonar tauler",
|
||||
"Unarchive board" : "Desarxiva el tauler",
|
||||
@@ -241,12 +269,20 @@ OC.L10N.register(
|
||||
"Loading filtered view" : "S'està carregant la visualització filtrada",
|
||||
"This week" : "Aquesta setmana",
|
||||
"No due" : "Sense venciment",
|
||||
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
|
||||
"No results found" : "No s'han trobat resultats",
|
||||
"No upcoming cards" : "No hi ha pròximes targetes",
|
||||
"upcoming cards" : "pròximes targetes",
|
||||
"Link to a board" : "Enllaça a un tauler",
|
||||
"Link to a card" : "Enllaç una targeta",
|
||||
"Create a card" : "Crea una targeta",
|
||||
"Message from {author} in {conversationName}" : "Missatge de {author} a {conversationName}",
|
||||
"Something went wrong" : "Alguna cosa ha anat malament",
|
||||
"Failed to upload {name}" : "No s'ha pogut pujar {name}",
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
|
||||
"Error creating the share" : "S'ha produït un error en crear la compartició",
|
||||
"Share with a Deck card" : "Compartir amb una targeta de Deck",
|
||||
"Share {file} with a Deck card" : "Compartir {file} amb una targeta de Deck",
|
||||
"Share" : "Compartir"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
40
l10n/ca.json
40
l10n/ca.json
@@ -68,9 +68,15 @@
|
||||
"Upcoming cards" : "Pròximes targetes",
|
||||
"Personal" : "Personal",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
|
||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
|
||||
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
|
||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
|
||||
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
|
||||
"{user} has shared {deck-board} with you." : "{user} us ha compartit {board}.",
|
||||
"Card comments" : "Comentaris de la targeta",
|
||||
"%s on %s" : "%s a %s",
|
||||
"No data was provided to create an attachment." : "No s’ha proporcionat cap dada per crear un fitxer adjunt.",
|
||||
"Finished" : "Acabat",
|
||||
"To review" : "Per revisar",
|
||||
@@ -92,6 +98,9 @@
|
||||
"Could not write file to disk" : "No s’ha pogut escriure el fitxer al disc",
|
||||
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
|
||||
"Card not found" : "No s'ha trobat la targeta",
|
||||
"Path is already shared with this card" : "Aquesta ruta ja ha estat compartida amb aquesta targeta",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "La data no és vàlida, el format de la data ha de ser YYYY-MM-DD",
|
||||
"Personal planning and team project organization" : "Planificació personal i organització de projectes en equip",
|
||||
"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" : "Tauler és una eina d'organització a l'estil kanban dirigida a la planificació personal i a l'organització de projectes per equips integrada a Nextcloud.\n\n\n- 📥 Afegiu les tasques en targetes i poseu-les en ordre\n- 📄 Apunteu notes addicionals en markdown\n- 🔖 Assigneu etiquetes per una organització encara millor\n- 👥 Compartiu amb el vostre equip, família o amics\n- 📎 Adjunteu fitxers i encasteu-los en la descripció en markdown\n- 💬 Debateu amb el vostre equip fent servir comentaris\n- ⚡ Mantingueu el seguiment de canvis al flux d'activitat\n- 🚀 Tingueu el vostre projecte organitzat",
|
||||
"Card details" : "Detalls de la targeta",
|
||||
@@ -99,9 +108,16 @@
|
||||
"Select the board to link to a project" : "Selecciona el tauler per enllaçar a un projecte",
|
||||
"Search by board title" : "Cerca per títol del tauler",
|
||||
"Select board" : "Selecciona un tauler",
|
||||
"Create a new card" : "Crea una nova targeta",
|
||||
"Select a board" : "Selecciona un tauler",
|
||||
"Select a list" : "Seleccioneu una llista",
|
||||
"Card title" : "Títol de la targeta",
|
||||
"Cancel" : "Cancel·la",
|
||||
"Creating the new card …" : "Creant la nova targeta",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "La targeta \"{card}\" s'ha afegit a \"{board}\"",
|
||||
"Open card" : "Obre la targeta",
|
||||
"Close" : "Tanca",
|
||||
"Create card" : "Crea una targeta",
|
||||
"Select a card" : "Selecciona una targeta",
|
||||
"Select the card to link to a project" : "Selecciona la targeta per enllaçar a un projecte",
|
||||
"Link to card" : "Enllaç a la targeta",
|
||||
@@ -165,9 +181,16 @@
|
||||
"title and color value must be provided" : "s’ha de proporcionar el valor del títol i del color",
|
||||
"Board name" : "Nom del taulell",
|
||||
"Members" : "Membres",
|
||||
"Upload new files" : "Puja nous fitxers",
|
||||
"Share from Files" : "Comparteix des de Fitxers",
|
||||
"Pending share" : "Compartició pendent",
|
||||
"Add this attachment" : "Afegeix aquest adjunt",
|
||||
"Show in Files" : "Mostra a Fitxers",
|
||||
"Remove attachment" : "Treu l'adjunt",
|
||||
"Delete Attachment" : "Suprimeix l’adjunt",
|
||||
"Restore Attachment" : "Restaura l'adjunt",
|
||||
"File to share" : "Fitxer a compartir",
|
||||
"Invalid path selected" : "S'ha seleccionat una ruta invàlida",
|
||||
"Open in sidebar view" : "Obre a la vista de la barra lateral",
|
||||
"Open in bigger view" : "Obre a la vista més gran",
|
||||
"Attachments" : "Adjunts",
|
||||
@@ -176,6 +199,7 @@
|
||||
"Created" : "Creat",
|
||||
"The title cannot be empty." : "El títol no pot estar buit",
|
||||
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
|
||||
"Failed to load comments" : "No s'han pogut carregar els comentaris",
|
||||
"Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
|
||||
"Assign to users" : "Assigna als usuaris",
|
||||
"Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
|
||||
@@ -186,10 +210,13 @@
|
||||
"Select Date" : "Selecciona la data",
|
||||
"Today" : "Avui",
|
||||
"Tomorrow" : "Demà",
|
||||
"Next week" : "Setmana següent",
|
||||
"Next month" : "Mes següent",
|
||||
"Save" : "Desa",
|
||||
"The comment cannot be empty." : "El comentari no pot estar buit.",
|
||||
"The comment cannot be longer than 1000 characters." : "El comentari no pot ser més llarg que 1000 caràcters.",
|
||||
"In reply to" : "En resposta a",
|
||||
"Cancel reply" : "Cancel·la la resposta",
|
||||
"Reply" : "Respon",
|
||||
"Update" : "Actualitza",
|
||||
"Description" : "Descripció",
|
||||
@@ -202,6 +229,7 @@
|
||||
"Write a description …" : "Escriviu una descripció...",
|
||||
"Choose attachment" : "Triar adjunt",
|
||||
"(group)" : "(grup)",
|
||||
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
|
||||
"Assign to me" : "Assigna'm a mi",
|
||||
"Unassign myself" : "Desasignar a mi mateix",
|
||||
"Move card" : "Mou la targeta",
|
||||
@@ -218,7 +246,7 @@
|
||||
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
|
||||
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
|
||||
"Board details" : "Detalls de la junta",
|
||||
"Board details" : "Detalls del tauler",
|
||||
"Edit board" : "Edita el tauler",
|
||||
"Clone board" : "Clonar tauler",
|
||||
"Unarchive board" : "Desarxiva el tauler",
|
||||
@@ -239,12 +267,20 @@
|
||||
"Loading filtered view" : "S'està carregant la visualització filtrada",
|
||||
"This week" : "Aquesta setmana",
|
||||
"No due" : "Sense venciment",
|
||||
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
|
||||
"No results found" : "No s'han trobat resultats",
|
||||
"No upcoming cards" : "No hi ha pròximes targetes",
|
||||
"upcoming cards" : "pròximes targetes",
|
||||
"Link to a board" : "Enllaça a un tauler",
|
||||
"Link to a card" : "Enllaç una targeta",
|
||||
"Create a card" : "Crea una targeta",
|
||||
"Message from {author} in {conversationName}" : "Missatge de {author} a {conversationName}",
|
||||
"Something went wrong" : "Alguna cosa ha anat malament",
|
||||
"Failed to upload {name}" : "No s'ha pogut pujar {name}",
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}"
|
||||
"Maximum file size of {size} exceeded" : "S'ha superat la mida màxima per fitxer de {size}",
|
||||
"Error creating the share" : "S'ha produït un error en crear la compartició",
|
||||
"Share with a Deck card" : "Compartir amb una targeta de Deck",
|
||||
"Share {file} with a Deck card" : "Compartir {file} amb una targeta de Deck",
|
||||
"Share" : "Compartir"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -85,7 +85,7 @@ OC.L10N.register(
|
||||
"Action needed" : "Nutná akce",
|
||||
"Later" : "Později",
|
||||
"copy" : "kopie",
|
||||
"To do" : "Udělat",
|
||||
"To do" : "Zbývá udělat",
|
||||
"Doing" : "Provádí se",
|
||||
"Done" : "Hotovo",
|
||||
"Example Task 3" : "Třetí úkol pro ukázku",
|
||||
@@ -101,7 +101,7 @@ OC.L10N.register(
|
||||
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
|
||||
"Card not found" : "Karta nebyla nalezena",
|
||||
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
|
||||
"Path is already shared with this card" : "Popis umístění už je touto kartou sdíleno",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum – je třeba, aby formát data byl RRRR-MM-DD",
|
||||
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
|
||||
"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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Čekající sdílení",
|
||||
"Add this attachment" : "Přidat tuto přílohu",
|
||||
"Show in Files" : "Zobrazit v Souborech",
|
||||
"Download" : "Stáhnout",
|
||||
"Remove attachment" : "Odebrat přílohu",
|
||||
"Delete Attachment" : "Smazat přílohu",
|
||||
"Restore Attachment" : "Obnovit přílohu",
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
"Action needed" : "Nutná akce",
|
||||
"Later" : "Později",
|
||||
"copy" : "kopie",
|
||||
"To do" : "Udělat",
|
||||
"To do" : "Zbývá udělat",
|
||||
"Doing" : "Provádí se",
|
||||
"Done" : "Hotovo",
|
||||
"Example Task 3" : "Třetí úkol pro ukázku",
|
||||
@@ -99,7 +99,7 @@
|
||||
"A PHP extension stopped the file upload" : "PHP rozšíření zastavilo nahrávání souboru.",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "Nebyl nahrán žádný soubor nebo jeho velikost přesáhla %s",
|
||||
"Card not found" : "Karta nebyla nalezena",
|
||||
"Path is already shared with this card" : "Cesta je již s touto kartou sdílena",
|
||||
"Path is already shared with this card" : "Popis umístění už je touto kartou sdíleno",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Neplatné datum – je třeba, aby formát data byl RRRR-MM-DD",
|
||||
"Personal planning and team project organization" : "Osobní plánování a organizování týmového projektu",
|
||||
"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 je nástroj cílený na osobní nebo projektové plánování týmů v Kanban stylu, vestavěný v Nextcloud.\n\n\n- 📥 Zadávejte a uspořádávejte své úkoly do karet\n- 📄 Zapisujte si dodatečné poznámky \n- 🔖 Přiřazujte štítky pro ještě lepší organizaci\n- 👥 Sdílejte se svým týmem, přáteli nebo rodinou\n- 🚀 Dostaňte svůj projekt pod kontrolu",
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Čekající sdílení",
|
||||
"Add this attachment" : "Přidat tuto přílohu",
|
||||
"Show in Files" : "Zobrazit v Souborech",
|
||||
"Download" : "Stáhnout",
|
||||
"Remove attachment" : "Odebrat přílohu",
|
||||
"Delete Attachment" : "Smazat přílohu",
|
||||
"Restore Attachment" : "Obnovit přílohu",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Ausstehende Freigabe",
|
||||
"Add this attachment" : "Diesen Anhang anhängen",
|
||||
"Show in Files" : "In Dateien anzeigen",
|
||||
"Download" : "Herunterladen",
|
||||
"Remove attachment" : "Anhang entfernen",
|
||||
"Delete Attachment" : "Anhang löschen",
|
||||
"Restore Attachment" : "Anhang wiederherstellen",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Ausstehende Freigabe",
|
||||
"Add this attachment" : "Diesen Anhang anhängen",
|
||||
"Show in Files" : "In Dateien anzeigen",
|
||||
"Download" : "Herunterladen",
|
||||
"Remove attachment" : "Anhang entfernen",
|
||||
"Delete Attachment" : "Anhang löschen",
|
||||
"Restore Attachment" : "Anhang wiederherstellen",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Ausstehende Freigabe",
|
||||
"Add this attachment" : "Diesen Anhang anhängen",
|
||||
"Show in Files" : "In Dateien anzeigen",
|
||||
"Download" : "Herunterladen",
|
||||
"Remove attachment" : "Anhang entfernen",
|
||||
"Delete Attachment" : "Anhang löschen",
|
||||
"Restore Attachment" : "Anhang wiederherstellen",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Ausstehende Freigabe",
|
||||
"Add this attachment" : "Diesen Anhang anhängen",
|
||||
"Show in Files" : "In Dateien anzeigen",
|
||||
"Download" : "Herunterladen",
|
||||
"Remove attachment" : "Anhang entfernen",
|
||||
"Delete Attachment" : "Anhang löschen",
|
||||
"Restore Attachment" : "Anhang wiederherstellen",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Pendiente de compartir",
|
||||
"Add this attachment" : "Añadir este adjunto",
|
||||
"Show in Files" : "Mostrar en Archivos",
|
||||
"Download" : "Descargar",
|
||||
"Remove attachment" : "Quitar adjunto",
|
||||
"Delete Attachment" : "Borrar adjunto",
|
||||
"Restore Attachment" : "Restaurar Adjunto",
|
||||
@@ -212,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Seleccione la fecha",
|
||||
"Today" : "Hoy",
|
||||
"Tomorrow" : "Mañana",
|
||||
"Next week" : "Semana siguiente",
|
||||
"Next month" : "Mes siguiente",
|
||||
"Save" : "Guardar",
|
||||
"The comment cannot be empty." : "El comentario no puede estar vacío.",
|
||||
"The comment cannot be longer than 1000 characters." : "El comentario no puede tener más de 1000 caracteres.",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Pendiente de compartir",
|
||||
"Add this attachment" : "Añadir este adjunto",
|
||||
"Show in Files" : "Mostrar en Archivos",
|
||||
"Download" : "Descargar",
|
||||
"Remove attachment" : "Quitar adjunto",
|
||||
"Delete Attachment" : "Borrar adjunto",
|
||||
"Restore Attachment" : "Restaurar Adjunto",
|
||||
@@ -210,6 +211,8 @@
|
||||
"Select Date" : "Seleccione la fecha",
|
||||
"Today" : "Hoy",
|
||||
"Tomorrow" : "Mañana",
|
||||
"Next week" : "Semana siguiente",
|
||||
"Next month" : "Mes siguiente",
|
||||
"Save" : "Guardar",
|
||||
"The comment cannot be empty." : "El comentario no puede estar vacío.",
|
||||
"The comment cannot be longer than 1000 characters." : "El comentario no puede tener más de 1000 caracteres.",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Partekatzeko zain",
|
||||
"Add this attachment" : "Gehitu eranskin hau",
|
||||
"Show in Files" : "Erakutsi fitxategietan",
|
||||
"Download" : "Deskargatu",
|
||||
"Remove attachment" : "Kendu eranskina",
|
||||
"Delete Attachment" : "Ezabatu eranskina",
|
||||
"Restore Attachment" : "Berezarri eranskina",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Partekatzeko zain",
|
||||
"Add this attachment" : "Gehitu eranskin hau",
|
||||
"Show in Files" : "Erakutsi fitxategietan",
|
||||
"Download" : "Deskargatu",
|
||||
"Remove attachment" : "Kendu eranskina",
|
||||
"Delete Attachment" : "Ezabatu eranskina",
|
||||
"Restore Attachment" : "Berezarri eranskina",
|
||||
|
||||
@@ -184,6 +184,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Valitse päivä",
|
||||
"Today" : "Tänään",
|
||||
"Tomorrow" : "Huomenna",
|
||||
"Next week" : "Seuraava viikko",
|
||||
"Next month" : "Seuraava kuukausi",
|
||||
"Save" : "Tallenna",
|
||||
"The comment cannot be empty." : "Kommentti ei voi olla tyhjä.",
|
||||
"The comment cannot be longer than 1000 characters." : "Kommentin on oltava alle 1000 merkkiä pitkä.",
|
||||
|
||||
@@ -182,6 +182,8 @@
|
||||
"Select Date" : "Valitse päivä",
|
||||
"Today" : "Tänään",
|
||||
"Tomorrow" : "Huomenna",
|
||||
"Next week" : "Seuraava viikko",
|
||||
"Next month" : "Seuraava kuukausi",
|
||||
"Save" : "Tallenna",
|
||||
"The comment cannot be empty." : "Kommentti ei voi olla tyhjä.",
|
||||
"The comment cannot be longer than 1000 characters." : "Kommentin on oltava alle 1000 merkkiä pitkä.",
|
||||
|
||||
@@ -185,8 +185,11 @@ OC.L10N.register(
|
||||
"Members" : "Membres",
|
||||
"Upload new files" : "Téléverser de nouveaux fichiers",
|
||||
"Share from Files" : "Partager vos fichiers déjà stockés",
|
||||
"Pending share" : "Partage en attente",
|
||||
"Add this attachment" : "Ajouter cette pièce jointe",
|
||||
"Show in Files" : "Afficher dans Fichiers",
|
||||
"Download" : "Télécharger",
|
||||
"Remove attachment" : "Supprimer la pièce jointe",
|
||||
"Delete Attachment" : "Supprimer la pièce jointe",
|
||||
"Restore Attachment" : "Restaurer la pièce jointe",
|
||||
"File to share" : "Fichier à partager",
|
||||
@@ -210,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Sélectionnez une date",
|
||||
"Today" : "Aujourd'hui",
|
||||
"Tomorrow" : "Demain",
|
||||
"Next week" : "Semaine suivante",
|
||||
"Next month" : "Mois suivant",
|
||||
"Save" : "Enregistrer",
|
||||
"The comment cannot be empty." : "Un commentaire ne peut pas être vide.",
|
||||
"The comment cannot be longer than 1000 characters." : "Un commentaire est limité à 1 000 caractères.",
|
||||
|
||||
@@ -183,8 +183,11 @@
|
||||
"Members" : "Membres",
|
||||
"Upload new files" : "Téléverser de nouveaux fichiers",
|
||||
"Share from Files" : "Partager vos fichiers déjà stockés",
|
||||
"Pending share" : "Partage en attente",
|
||||
"Add this attachment" : "Ajouter cette pièce jointe",
|
||||
"Show in Files" : "Afficher dans Fichiers",
|
||||
"Download" : "Télécharger",
|
||||
"Remove attachment" : "Supprimer la pièce jointe",
|
||||
"Delete Attachment" : "Supprimer la pièce jointe",
|
||||
"Restore Attachment" : "Restaurer la pièce jointe",
|
||||
"File to share" : "Fichier à partager",
|
||||
@@ -208,6 +211,8 @@
|
||||
"Select Date" : "Sélectionnez une date",
|
||||
"Today" : "Aujourd'hui",
|
||||
"Tomorrow" : "Demain",
|
||||
"Next week" : "Semaine suivante",
|
||||
"Next month" : "Mois suivant",
|
||||
"Save" : "Enregistrer",
|
||||
"The comment cannot be empty." : "Un commentaire ne peut pas être vide.",
|
||||
"The comment cannot be longer than 1000 characters." : "Un commentaire est limité à 1 000 caractères.",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Függőben lévő megosztás",
|
||||
"Add this attachment" : "E melléklet hozzáadása",
|
||||
"Show in Files" : "Megjelenítés a Fájlokban",
|
||||
"Download" : "Letöltés",
|
||||
"Remove attachment" : "Melléklet eltávolítása",
|
||||
"Delete Attachment" : "Melléklet törlése",
|
||||
"Restore Attachment" : "Melléklet visszaállítása",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Függőben lévő megosztás",
|
||||
"Add this attachment" : "E melléklet hozzáadása",
|
||||
"Show in Files" : "Megjelenítés a Fájlokban",
|
||||
"Download" : "Letöltés",
|
||||
"Remove attachment" : "Melléklet eltávolítása",
|
||||
"Delete Attachment" : "Melléklet törlése",
|
||||
"Restore Attachment" : "Melléklet visszaállítása",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Condivisione in attesa",
|
||||
"Add this attachment" : "Aggiungi questo allegato",
|
||||
"Show in Files" : "Mostra in File",
|
||||
"Download" : "Scarica",
|
||||
"Remove attachment" : "Rimuovi allegato",
|
||||
"Delete Attachment" : "Elimina allegato",
|
||||
"Restore Attachment" : "Ripristina allegato",
|
||||
@@ -212,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Seleziona data",
|
||||
"Today" : "Oggi",
|
||||
"Tomorrow" : "Domani",
|
||||
"Next week" : "Settimana successiva",
|
||||
"Next month" : "Mese successivo",
|
||||
"Save" : "Salva",
|
||||
"The comment cannot be empty." : "Il commento non può essere vuoto.",
|
||||
"The comment cannot be longer than 1000 characters." : "Il commento non può essere più lungo di 1000 caratteri.",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Condivisione in attesa",
|
||||
"Add this attachment" : "Aggiungi questo allegato",
|
||||
"Show in Files" : "Mostra in File",
|
||||
"Download" : "Scarica",
|
||||
"Remove attachment" : "Rimuovi allegato",
|
||||
"Delete Attachment" : "Elimina allegato",
|
||||
"Restore Attachment" : "Ripristina allegato",
|
||||
@@ -210,6 +211,8 @@
|
||||
"Select Date" : "Seleziona data",
|
||||
"Today" : "Oggi",
|
||||
"Tomorrow" : "Domani",
|
||||
"Next week" : "Settimana successiva",
|
||||
"Next month" : "Mese successivo",
|
||||
"Save" : "Salva",
|
||||
"The comment cannot be empty." : "Il commento non può essere vuoto.",
|
||||
"The comment cannot be longer than 1000 characters." : "Il commento non può essere più lungo di 1000 caratteri.",
|
||||
|
||||
@@ -101,9 +101,16 @@ OC.L10N.register(
|
||||
"Select the board to link to a project" : "Pasirinkite lentą, kurią susieti su projektu",
|
||||
"Search by board title" : "Ieškoti pagal lentos pavadinimą",
|
||||
"Select board" : "Pasirinkti lentą",
|
||||
"Create a new card" : "Sukurti naują kortelę",
|
||||
"Select a board" : "Pasirinkite lentą",
|
||||
"Select a list" : "Pasirinkite sąrašą",
|
||||
"Card title" : "Kortelės pavadinimas",
|
||||
"Cancel" : "Atsisakyti",
|
||||
"Creating the new card …" : "Kuriama nauja kortelė…",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "Kortelė „{card}“ buvo pridėta į lentą „{board}“",
|
||||
"Open card" : "Atverti kortelę",
|
||||
"Close" : "Užverti",
|
||||
"Create card" : "Sukurti kortelę",
|
||||
"Select a card" : "Pasirinkti kortelę",
|
||||
"Select the card to link to a project" : "Pasirinkite kortelę, kurią susieti su projektu",
|
||||
"Link to card" : "Susieti su kortele",
|
||||
@@ -113,6 +120,7 @@ OC.L10N.register(
|
||||
"Overwrite file" : "Perrašyti failą",
|
||||
"Keep existing file" : "Palikti esamą failą",
|
||||
"This board is read only" : "Ši lenta yra tik skaitymui",
|
||||
"Drop your files to upload" : "Tempkite failus, norėdami juos išsiųsti",
|
||||
"Add card" : "Pridėti kortelę",
|
||||
"Archived cards" : "Archyvuotos kortelės",
|
||||
"Add list" : "Pridėti sąrašą",
|
||||
@@ -151,6 +159,7 @@ OC.L10N.register(
|
||||
"Can share" : "Can share",
|
||||
"Can manage" : "Gali tvarkyti",
|
||||
"Delete" : "Ištrinti",
|
||||
"Failed to create share with {displayName}" : "Nepavyko sukurti viešinio su {displayName}",
|
||||
"Add a new list" : "Pridėti naują sąrašą",
|
||||
"Archive all cards" : "Archyvuoti visas korteles",
|
||||
"Delete list" : "Ištrinti sąrašą",
|
||||
@@ -163,9 +172,15 @@ OC.L10N.register(
|
||||
"title and color value must be provided" : "privalo būti pateiktos pavadinimo ir spalvos reikšmės",
|
||||
"Board name" : "Lentos pavadinimas",
|
||||
"Members" : "Nariai",
|
||||
"Upload new files" : "Išsiųsti naujus failus",
|
||||
"Share from Files" : "Bendrinti iš failų",
|
||||
"Add this attachment" : "Pridėti šį priedą",
|
||||
"Show in Files" : "Rodyti failuose",
|
||||
"Download" : "Atsisiųsti",
|
||||
"Remove attachment" : "Šalinti priedą",
|
||||
"Delete Attachment" : "Ištrinti priedą",
|
||||
"Restore Attachment" : "Atkurti priedą",
|
||||
"File to share" : "Failas, kurį bendrinti",
|
||||
"Invalid path selected" : "Pasirinktas neteisingas kelias",
|
||||
"Open in sidebar view" : "Atverti šoninės juostos rodinyje",
|
||||
"Open in bigger view" : "Atverti didesniame rodinyje",
|
||||
@@ -173,7 +188,9 @@ OC.L10N.register(
|
||||
"Comments" : "Komentarai",
|
||||
"Modified" : "Pakeistas",
|
||||
"Created" : "Sukurta",
|
||||
"The title cannot be empty." : "Pavadinimas negali būti tuščias.",
|
||||
"No comments yet. Begin the discussion!" : "Kol kas komentarų nėra. Pradėkite diskusiją!",
|
||||
"Failed to load comments" : "Nepavyko įkelti komentarų",
|
||||
"Assign a tag to this card…" : "Priskirti šiai kortelei žymę…",
|
||||
"Assign to users" : "Priskirti naudotojams",
|
||||
"Assign to users/groups/circles" : "Priskirti naudotojams/grupėms/ratams",
|
||||
@@ -199,6 +216,7 @@ OC.L10N.register(
|
||||
"Write a description …" : "Parašykite aprašą…",
|
||||
"Choose attachment" : "Pasirinkite priedą",
|
||||
"(group)" : "(grupė)",
|
||||
"{count} comments, {unread} unread" : "Komentarų: {count}, neskaityta: {unread}",
|
||||
"Assign to me" : "Priskirti sau",
|
||||
"Move card" : "Perkelti kortelę",
|
||||
"Unarchive card" : "Išarchyvuoti kortelę",
|
||||
@@ -210,6 +228,7 @@ OC.L10N.register(
|
||||
"All boards" : "Visos lentos",
|
||||
"Archived boards" : "Archyvuotos lentos",
|
||||
"Shared with you" : "Bendrinama su jumis",
|
||||
"Use bigger card view" : "Naudoti didesnį kortelių rodinį",
|
||||
"Show boards in calendar/tasks" : "Rodyti darbus kalendoriuje/užduotyse",
|
||||
"Board details" : "Išsamiau apie lentą",
|
||||
"Edit board" : "Taisyti lentą",
|
||||
@@ -230,8 +249,10 @@ OC.L10N.register(
|
||||
"Delete the board?" : "Ištrinti lentą?",
|
||||
"This week" : "Šią savaitę",
|
||||
"No due" : "Be galutinio termino",
|
||||
"No results found" : "Nerasta jokių rezultatų",
|
||||
"Link to a board" : "Susieti su lenta",
|
||||
"Link to a card" : "Susieti su kortele",
|
||||
"Create a card" : "Sukurti kortelę",
|
||||
"Something went wrong" : "Kažkas nutiko",
|
||||
"Maximum file size of {size} exceeded" : "Viršytas maksimalus {size} failo dydis",
|
||||
"Error creating the share" : "Klaida kuriant viešinį",
|
||||
|
||||
@@ -99,9 +99,16 @@
|
||||
"Select the board to link to a project" : "Pasirinkite lentą, kurią susieti su projektu",
|
||||
"Search by board title" : "Ieškoti pagal lentos pavadinimą",
|
||||
"Select board" : "Pasirinkti lentą",
|
||||
"Create a new card" : "Sukurti naują kortelę",
|
||||
"Select a board" : "Pasirinkite lentą",
|
||||
"Select a list" : "Pasirinkite sąrašą",
|
||||
"Card title" : "Kortelės pavadinimas",
|
||||
"Cancel" : "Atsisakyti",
|
||||
"Creating the new card …" : "Kuriama nauja kortelė…",
|
||||
"Card \"{card}\" was added to \"{board}\"" : "Kortelė „{card}“ buvo pridėta į lentą „{board}“",
|
||||
"Open card" : "Atverti kortelę",
|
||||
"Close" : "Užverti",
|
||||
"Create card" : "Sukurti kortelę",
|
||||
"Select a card" : "Pasirinkti kortelę",
|
||||
"Select the card to link to a project" : "Pasirinkite kortelę, kurią susieti su projektu",
|
||||
"Link to card" : "Susieti su kortele",
|
||||
@@ -111,6 +118,7 @@
|
||||
"Overwrite file" : "Perrašyti failą",
|
||||
"Keep existing file" : "Palikti esamą failą",
|
||||
"This board is read only" : "Ši lenta yra tik skaitymui",
|
||||
"Drop your files to upload" : "Tempkite failus, norėdami juos išsiųsti",
|
||||
"Add card" : "Pridėti kortelę",
|
||||
"Archived cards" : "Archyvuotos kortelės",
|
||||
"Add list" : "Pridėti sąrašą",
|
||||
@@ -149,6 +157,7 @@
|
||||
"Can share" : "Can share",
|
||||
"Can manage" : "Gali tvarkyti",
|
||||
"Delete" : "Ištrinti",
|
||||
"Failed to create share with {displayName}" : "Nepavyko sukurti viešinio su {displayName}",
|
||||
"Add a new list" : "Pridėti naują sąrašą",
|
||||
"Archive all cards" : "Archyvuoti visas korteles",
|
||||
"Delete list" : "Ištrinti sąrašą",
|
||||
@@ -161,9 +170,15 @@
|
||||
"title and color value must be provided" : "privalo būti pateiktos pavadinimo ir spalvos reikšmės",
|
||||
"Board name" : "Lentos pavadinimas",
|
||||
"Members" : "Nariai",
|
||||
"Upload new files" : "Išsiųsti naujus failus",
|
||||
"Share from Files" : "Bendrinti iš failų",
|
||||
"Add this attachment" : "Pridėti šį priedą",
|
||||
"Show in Files" : "Rodyti failuose",
|
||||
"Download" : "Atsisiųsti",
|
||||
"Remove attachment" : "Šalinti priedą",
|
||||
"Delete Attachment" : "Ištrinti priedą",
|
||||
"Restore Attachment" : "Atkurti priedą",
|
||||
"File to share" : "Failas, kurį bendrinti",
|
||||
"Invalid path selected" : "Pasirinktas neteisingas kelias",
|
||||
"Open in sidebar view" : "Atverti šoninės juostos rodinyje",
|
||||
"Open in bigger view" : "Atverti didesniame rodinyje",
|
||||
@@ -171,7 +186,9 @@
|
||||
"Comments" : "Komentarai",
|
||||
"Modified" : "Pakeistas",
|
||||
"Created" : "Sukurta",
|
||||
"The title cannot be empty." : "Pavadinimas negali būti tuščias.",
|
||||
"No comments yet. Begin the discussion!" : "Kol kas komentarų nėra. Pradėkite diskusiją!",
|
||||
"Failed to load comments" : "Nepavyko įkelti komentarų",
|
||||
"Assign a tag to this card…" : "Priskirti šiai kortelei žymę…",
|
||||
"Assign to users" : "Priskirti naudotojams",
|
||||
"Assign to users/groups/circles" : "Priskirti naudotojams/grupėms/ratams",
|
||||
@@ -197,6 +214,7 @@
|
||||
"Write a description …" : "Parašykite aprašą…",
|
||||
"Choose attachment" : "Pasirinkite priedą",
|
||||
"(group)" : "(grupė)",
|
||||
"{count} comments, {unread} unread" : "Komentarų: {count}, neskaityta: {unread}",
|
||||
"Assign to me" : "Priskirti sau",
|
||||
"Move card" : "Perkelti kortelę",
|
||||
"Unarchive card" : "Išarchyvuoti kortelę",
|
||||
@@ -208,6 +226,7 @@
|
||||
"All boards" : "Visos lentos",
|
||||
"Archived boards" : "Archyvuotos lentos",
|
||||
"Shared with you" : "Bendrinama su jumis",
|
||||
"Use bigger card view" : "Naudoti didesnį kortelių rodinį",
|
||||
"Show boards in calendar/tasks" : "Rodyti darbus kalendoriuje/užduotyse",
|
||||
"Board details" : "Išsamiau apie lentą",
|
||||
"Edit board" : "Taisyti lentą",
|
||||
@@ -228,8 +247,10 @@
|
||||
"Delete the board?" : "Ištrinti lentą?",
|
||||
"This week" : "Šią savaitę",
|
||||
"No due" : "Be galutinio termino",
|
||||
"No results found" : "Nerasta jokių rezultatų",
|
||||
"Link to a board" : "Susieti su lenta",
|
||||
"Link to a card" : "Susieti su kortele",
|
||||
"Create a card" : "Sukurti kortelę",
|
||||
"Something went wrong" : "Kažkas nutiko",
|
||||
"Maximum file size of {size} exceeded" : "Viršytas maksimalus {size} failo dydis",
|
||||
"Error creating the share" : "Klaida kuriant viešinį",
|
||||
|
||||
@@ -135,7 +135,7 @@ OC.L10N.register(
|
||||
"Add list" : "Lijst toevoegen",
|
||||
"List name" : "Lijstnaam",
|
||||
"Apply filter" : "Filter toepassen",
|
||||
"Filter by tag" : "Filter op label",
|
||||
"Filter by tag" : "Filteren op label",
|
||||
"Filter by assigned user" : "Filter op toegewezen gebruiker",
|
||||
"Unassigned" : "Niet-toegewezen",
|
||||
"Filter by due date" : "Filter op vervaldatum",
|
||||
@@ -185,8 +185,10 @@ OC.L10N.register(
|
||||
"Members" : "Leden",
|
||||
"Upload new files" : "Uploaden nieuwe bestanden",
|
||||
"Share from Files" : "Delen vanuit Bestanden",
|
||||
"Pending share" : "Share in afwachting",
|
||||
"Add this attachment" : "Voeg deze bijlage toe",
|
||||
"Show in Files" : "Tonen in Bestanden",
|
||||
"Download" : "Download",
|
||||
"Remove attachment" : "Bijlage verwijderen",
|
||||
"Delete Attachment" : "Verwijderen bijlage",
|
||||
"Restore Attachment" : "Herstellen bijlage",
|
||||
@@ -211,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Selecteer datum",
|
||||
"Today" : "Vandaag",
|
||||
"Tomorrow" : "Morgen",
|
||||
"Next week" : "Volgende week",
|
||||
"Next month" : "Volgende maand",
|
||||
"Save" : "Opslaan",
|
||||
"The comment cannot be empty." : "De reactie kan niet leeg zijn.",
|
||||
"The comment cannot be longer than 1000 characters." : "De reactie kan niet langer dan 1000 tekens zijn.",
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
"Add list" : "Lijst toevoegen",
|
||||
"List name" : "Lijstnaam",
|
||||
"Apply filter" : "Filter toepassen",
|
||||
"Filter by tag" : "Filter op label",
|
||||
"Filter by tag" : "Filteren op label",
|
||||
"Filter by assigned user" : "Filter op toegewezen gebruiker",
|
||||
"Unassigned" : "Niet-toegewezen",
|
||||
"Filter by due date" : "Filter op vervaldatum",
|
||||
@@ -183,8 +183,10 @@
|
||||
"Members" : "Leden",
|
||||
"Upload new files" : "Uploaden nieuwe bestanden",
|
||||
"Share from Files" : "Delen vanuit Bestanden",
|
||||
"Pending share" : "Share in afwachting",
|
||||
"Add this attachment" : "Voeg deze bijlage toe",
|
||||
"Show in Files" : "Tonen in Bestanden",
|
||||
"Download" : "Download",
|
||||
"Remove attachment" : "Bijlage verwijderen",
|
||||
"Delete Attachment" : "Verwijderen bijlage",
|
||||
"Restore Attachment" : "Herstellen bijlage",
|
||||
@@ -209,6 +211,8 @@
|
||||
"Select Date" : "Selecteer datum",
|
||||
"Today" : "Vandaag",
|
||||
"Tomorrow" : "Morgen",
|
||||
"Next week" : "Volgende week",
|
||||
"Next month" : "Volgende maand",
|
||||
"Save" : "Opslaan",
|
||||
"The comment cannot be empty." : "De reactie kan niet leeg zijn.",
|
||||
"The comment cannot be longer than 1000 characters." : "De reactie kan niet langer dan 1000 tekens zijn.",
|
||||
|
||||
@@ -19,6 +19,8 @@ OC.L10N.register(
|
||||
"Upload new files" : "Enviar fichièrs novèls",
|
||||
"Today" : "Uèi",
|
||||
"Tomorrow" : "Deman",
|
||||
"Next week" : "Setmana seguenta",
|
||||
"Next month" : "Mes seguent",
|
||||
"Save" : "Salvar",
|
||||
"Cancel reply" : "Anullar la responsa",
|
||||
"Reply" : "Respondre",
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
"Upload new files" : "Enviar fichièrs novèls",
|
||||
"Today" : "Uèi",
|
||||
"Tomorrow" : "Deman",
|
||||
"Next week" : "Setmana seguenta",
|
||||
"Next month" : "Mes seguent",
|
||||
"Save" : "Salvar",
|
||||
"Cancel reply" : "Anullar la responsa",
|
||||
"Reply" : "Respondre",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Oczekujące udostępnienie",
|
||||
"Add this attachment" : "Dodaj ten załącznik",
|
||||
"Show in Files" : "Pokaż w Plikach",
|
||||
"Download" : "Pobierz",
|
||||
"Remove attachment" : "Usuń załącznik",
|
||||
"Delete Attachment" : "Usuń załącznik",
|
||||
"Restore Attachment" : "Przywróć załącznik",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Oczekujące udostępnienie",
|
||||
"Add this attachment" : "Dodaj ten załącznik",
|
||||
"Show in Files" : "Pokaż w Plikach",
|
||||
"Download" : "Pobierz",
|
||||
"Remove attachment" : "Usuń załącznik",
|
||||
"Delete Attachment" : "Usuń załącznik",
|
||||
"Restore Attachment" : "Przywróć załącznik",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Compartilhamento pendente",
|
||||
"Add this attachment" : "Adicionar este anexo",
|
||||
"Show in Files" : "Mostrar em Arquivos",
|
||||
"Download" : "Baixar",
|
||||
"Remove attachment" : "Remover anexo",
|
||||
"Delete Attachment" : "Excluir Anexo",
|
||||
"Restore Attachment" : "Restaurar Anexo",
|
||||
@@ -212,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Selecionar Data",
|
||||
"Today" : "Hoje",
|
||||
"Tomorrow" : "Amanhã",
|
||||
"Next week" : "Próxima semana",
|
||||
"Next month" : "Próximo mês",
|
||||
"Save" : "Salvar",
|
||||
"The comment cannot be empty." : "O comentário não pode zer vazio.",
|
||||
"The comment cannot be longer than 1000 characters." : "O comentário não pode ter mais que 1000 caracteres.",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Compartilhamento pendente",
|
||||
"Add this attachment" : "Adicionar este anexo",
|
||||
"Show in Files" : "Mostrar em Arquivos",
|
||||
"Download" : "Baixar",
|
||||
"Remove attachment" : "Remover anexo",
|
||||
"Delete Attachment" : "Excluir Anexo",
|
||||
"Restore Attachment" : "Restaurar Anexo",
|
||||
@@ -210,6 +211,8 @@
|
||||
"Select Date" : "Selecionar Data",
|
||||
"Today" : "Hoje",
|
||||
"Tomorrow" : "Amanhã",
|
||||
"Next week" : "Próxima semana",
|
||||
"Next month" : "Próximo mês",
|
||||
"Save" : "Salvar",
|
||||
"The comment cannot be empty." : "O comentário não pode zer vazio.",
|
||||
"The comment cannot be longer than 1000 characters." : "O comentário não pode ter mais que 1000 caracteres.",
|
||||
|
||||
@@ -187,6 +187,7 @@ OC.L10N.register(
|
||||
"Share from Files" : "Опубликовать из приложения «Файлы»",
|
||||
"Add this attachment" : "Добавить это вложение",
|
||||
"Show in Files" : "Показать в приложении «Файлы»",
|
||||
"Remove attachment" : "Убрать вложение",
|
||||
"Delete Attachment" : "Удалить вложение",
|
||||
"Restore Attachment" : "Восстановить вложение",
|
||||
"File to share" : "Файл для публикации",
|
||||
@@ -210,6 +211,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Выберите дату",
|
||||
"Today" : "Сегодня",
|
||||
"Tomorrow" : "Завтра",
|
||||
"Next week" : "Следующая неделя",
|
||||
"Next month" : "Следующий месяц",
|
||||
"Save" : "Сохранить",
|
||||
"The comment cannot be empty." : "Комментарий не может быть пустым.",
|
||||
"The comment cannot be longer than 1000 characters." : "Комментарий не может быть длиннее 1 000 символов.",
|
||||
|
||||
@@ -185,6 +185,7 @@
|
||||
"Share from Files" : "Опубликовать из приложения «Файлы»",
|
||||
"Add this attachment" : "Добавить это вложение",
|
||||
"Show in Files" : "Показать в приложении «Файлы»",
|
||||
"Remove attachment" : "Убрать вложение",
|
||||
"Delete Attachment" : "Удалить вложение",
|
||||
"Restore Attachment" : "Восстановить вложение",
|
||||
"File to share" : "Файл для публикации",
|
||||
@@ -208,6 +209,8 @@
|
||||
"Select Date" : "Выберите дату",
|
||||
"Today" : "Сегодня",
|
||||
"Tomorrow" : "Завтра",
|
||||
"Next week" : "Следующая неделя",
|
||||
"Next month" : "Следующий месяц",
|
||||
"Save" : "Сохранить",
|
||||
"The comment cannot be empty." : "Комментарий не может быть пустым.",
|
||||
"The comment cannot be longer than 1000 characters." : "Комментарий не может быть длиннее 1 000 символов.",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Čakajúce zdeľanie",
|
||||
"Add this attachment" : "Pridať túto prílohu",
|
||||
"Show in Files" : "Zobraziť v Súboroch",
|
||||
"Download" : "Sťahovanie",
|
||||
"Remove attachment" : "Odstrániť prílohu",
|
||||
"Delete Attachment" : "Odstrániť prílohu",
|
||||
"Restore Attachment" : "Obnoviť prílohu",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Čakajúce zdeľanie",
|
||||
"Add this attachment" : "Pridať túto prílohu",
|
||||
"Show in Files" : "Zobraziť v Súboroch",
|
||||
"Download" : "Sťahovanie",
|
||||
"Remove attachment" : "Odstrániť prílohu",
|
||||
"Delete Attachment" : "Odstrániť prílohu",
|
||||
"Restore Attachment" : "Obnoviť prílohu",
|
||||
|
||||
@@ -181,12 +181,13 @@ OC.L10N.register(
|
||||
"Edit" : "Uredi",
|
||||
"Add a new tag" : "Dodaj novo oznako",
|
||||
"title and color value must be provided" : "navedena morata biti podatka naslova in barve",
|
||||
"Board name" : "Ime zbirke",
|
||||
"Board name" : "Ime zbirke",
|
||||
"Members" : "Člani",
|
||||
"Upload new files" : "Pošlji nove datoteke",
|
||||
"Share from Files" : "Poveži iz oblaka",
|
||||
"Add this attachment" : "Dodaj prilogo",
|
||||
"Show in Files" : "Poveži iz oblaka",
|
||||
"Download" : "Prejmi",
|
||||
"Remove attachment" : "Odstrani prilogo",
|
||||
"Delete Attachment" : "Izbriši prilogo",
|
||||
"Restore Attachment" : "Obnovi prilogo",
|
||||
@@ -211,6 +212,8 @@ OC.L10N.register(
|
||||
"Select Date" : "Izbor datuma",
|
||||
"Today" : "Danes",
|
||||
"Tomorrow" : "Jutri",
|
||||
"Next week" : "Naslednji teden",
|
||||
"Next month" : "Naslednji mesec",
|
||||
"Save" : "Shrani",
|
||||
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
||||
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
||||
|
||||
@@ -179,12 +179,13 @@
|
||||
"Edit" : "Uredi",
|
||||
"Add a new tag" : "Dodaj novo oznako",
|
||||
"title and color value must be provided" : "navedena morata biti podatka naslova in barve",
|
||||
"Board name" : "Ime zbirke",
|
||||
"Board name" : "Ime zbirke",
|
||||
"Members" : "Člani",
|
||||
"Upload new files" : "Pošlji nove datoteke",
|
||||
"Share from Files" : "Poveži iz oblaka",
|
||||
"Add this attachment" : "Dodaj prilogo",
|
||||
"Show in Files" : "Poveži iz oblaka",
|
||||
"Download" : "Prejmi",
|
||||
"Remove attachment" : "Odstrani prilogo",
|
||||
"Delete Attachment" : "Izbriši prilogo",
|
||||
"Restore Attachment" : "Obnovi prilogo",
|
||||
@@ -209,6 +210,8 @@
|
||||
"Select Date" : "Izbor datuma",
|
||||
"Today" : "Danes",
|
||||
"Tomorrow" : "Jutri",
|
||||
"Next week" : "Naslednji teden",
|
||||
"Next month" : "Naslednji mesec",
|
||||
"Save" : "Shrani",
|
||||
"The comment cannot be empty." : "Polje opombe ne sme biti prazno.",
|
||||
"The comment cannot be longer than 1000 characters." : "Opomba ne sme biti daljša od 1000 znakov.",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "Bekleyen paylaşım",
|
||||
"Add this attachment" : "Bu dosyayı ekle",
|
||||
"Show in Files" : "Dosyalarda görüntüle",
|
||||
"Download" : "İndir",
|
||||
"Remove attachment" : "Ek dosyayı sil",
|
||||
"Delete Attachment" : "Ek dosyasını sil",
|
||||
"Restore Attachment" : "Ek dosyasını geri yükle",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "Bekleyen paylaşım",
|
||||
"Add this attachment" : "Bu dosyayı ekle",
|
||||
"Show in Files" : "Dosyalarda görüntüle",
|
||||
"Download" : "İndir",
|
||||
"Remove attachment" : "Ek dosyayı sil",
|
||||
"Delete Attachment" : "Ek dosyasını sil",
|
||||
"Restore Attachment" : "Ek dosyasını geri yükle",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "待分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "在文件中显示",
|
||||
"Download" : "下载",
|
||||
"Remove attachment" : "删除附件",
|
||||
"Delete Attachment" : "删除附件",
|
||||
"Restore Attachment" : "恢复附件",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "待分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "在文件中显示",
|
||||
"Download" : "下载",
|
||||
"Remove attachment" : "删除附件",
|
||||
"Delete Attachment" : "删除附件",
|
||||
"Restore Attachment" : "恢复附件",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "等待分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "顯示在檔案中",
|
||||
"Download" : "下載",
|
||||
"Remove attachment" : "移除附件",
|
||||
"Delete Attachment" : "刪除附件",
|
||||
"Restore Attachment" : "恢復附件",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "等待分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "顯示在檔案中",
|
||||
"Download" : "下載",
|
||||
"Remove attachment" : "移除附件",
|
||||
"Delete Attachment" : "刪除附件",
|
||||
"Restore Attachment" : "恢復附件",
|
||||
|
||||
@@ -188,6 +188,7 @@ OC.L10N.register(
|
||||
"Pending share" : "待分享",
|
||||
"Add this attachment" : "新增此附件",
|
||||
"Show in Files" : "在「檔案」中顯示",
|
||||
"Download" : "下載",
|
||||
"Remove attachment" : "移除附件",
|
||||
"Delete Attachment" : "刪除附件",
|
||||
"Restore Attachment" : "還原附件",
|
||||
@@ -212,6 +213,8 @@ OC.L10N.register(
|
||||
"Select Date" : "選擇日期",
|
||||
"Today" : "今天",
|
||||
"Tomorrow" : "明天",
|
||||
"Next week" : "下週",
|
||||
"Next month" : "下個月",
|
||||
"Save" : "儲存",
|
||||
"The comment cannot be empty." : "留言不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "留言不能多於 1000 個字元。",
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
"Pending share" : "待分享",
|
||||
"Add this attachment" : "新增此附件",
|
||||
"Show in Files" : "在「檔案」中顯示",
|
||||
"Download" : "下載",
|
||||
"Remove attachment" : "移除附件",
|
||||
"Delete Attachment" : "刪除附件",
|
||||
"Restore Attachment" : "還原附件",
|
||||
@@ -210,6 +211,8 @@
|
||||
"Select Date" : "選擇日期",
|
||||
"Today" : "今天",
|
||||
"Tomorrow" : "明天",
|
||||
"Next week" : "下週",
|
||||
"Next month" : "下個月",
|
||||
"Save" : "儲存",
|
||||
"The comment cannot be empty." : "留言不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "留言不能多於 1000 個字元。",
|
||||
|
||||
@@ -100,6 +100,9 @@ class ResourceProvider implements IProvider {
|
||||
if ($board->getOwner() === $user->getUID()) {
|
||||
return true;
|
||||
}
|
||||
if ($board->getAcl() === null) {
|
||||
return false;
|
||||
}
|
||||
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
||||
}
|
||||
|
||||
|
||||
@@ -127,6 +127,9 @@ class ResourceProviderCard implements IProvider {
|
||||
if ($board->getOwner() === $user->getUID()) {
|
||||
return true;
|
||||
}
|
||||
if ($board->getAcl() === null) {
|
||||
return false;
|
||||
}
|
||||
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
|
||||
}
|
||||
|
||||
|
||||
@@ -28,8 +28,10 @@ class Board extends RelationalEntity {
|
||||
protected $owner;
|
||||
protected $color;
|
||||
protected $archived = false;
|
||||
protected $labels = [];
|
||||
protected $acl = [];
|
||||
/** @var Label[]|null */
|
||||
protected $labels = null;
|
||||
/** @var Acl[]|null */
|
||||
protected $acl = null;
|
||||
protected $permissions = [];
|
||||
protected $users = [];
|
||||
protected $shared;
|
||||
@@ -61,6 +63,10 @@ class Board extends RelationalEntity {
|
||||
if ($this->shared === -1) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -68,21 +74,27 @@ class Board extends RelationalEntity {
|
||||
* @param Label[] $labels
|
||||
*/
|
||||
public function setLabels($labels) {
|
||||
foreach ($labels as $l) {
|
||||
$this->labels[] = $l;
|
||||
}
|
||||
$this->labels = $labels;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Acl[] $acl
|
||||
*/
|
||||
public function setAcl($acl) {
|
||||
foreach ($acl as $a) {
|
||||
$this->acl[] = $a;
|
||||
}
|
||||
$this->acl = $acl;
|
||||
}
|
||||
|
||||
public function getETag() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,12 +25,14 @@ namespace OCA\Deck\Db;
|
||||
|
||||
use OC\Cache\CappedMemoryCache;
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IGroupManager;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
private $labelMapper;
|
||||
private $aclMapper;
|
||||
private $stackMapper;
|
||||
@@ -40,7 +42,10 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
|
||||
private $circlesEnabled;
|
||||
|
||||
/** @var CappedMemoryCache */
|
||||
private $userBoardCache;
|
||||
/** @var CappedMemoryCache */
|
||||
private $boardCache;
|
||||
|
||||
public function __construct(
|
||||
IDBConnection $db,
|
||||
@@ -60,7 +65,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
$this->logger = $logger;
|
||||
|
||||
$this->userBoardCache = new CappedMemoryCache();
|
||||
|
||||
$this->boardCache = new CappedMemoryCache();
|
||||
|
||||
$this->circlesEnabled = \OC::$server->getAppManager()->isEnabledForUser('circles');
|
||||
}
|
||||
@@ -70,40 +75,52 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @param $id
|
||||
* @param bool $withLabels
|
||||
* @param bool $withAcl
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
* @return Board
|
||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
||||
* @throws DoesNotExistException
|
||||
*/
|
||||
public function find($id, $withLabels = false, $withAcl = false) {
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
|
||||
'WHERE `id` = ?';
|
||||
$board = $this->findEntity($sql, [$id]);
|
||||
public function find($id, $withLabels = false, $withAcl = false): Board {
|
||||
if (!isset($this->boardCache[$id])) {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$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
|
||||
if ($withLabels) {
|
||||
if ($withLabels && $this->boardCache[$id]->getLabels() === null) {
|
||||
$labels = $this->labelMapper->findAll($id);
|
||||
$board->setLabels($labels);
|
||||
$this->boardCache[$id]->setLabels($labels);
|
||||
}
|
||||
|
||||
// Add acl
|
||||
if ($withAcl) {
|
||||
if ($withAcl && $this->boardCache[$id]->getAcl() === null) {
|
||||
$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 {
|
||||
$useCache = ($since === -1 && $includeArchived === true);
|
||||
public function findAllForUser(string $userId, ?int $since = null, bool $includeArchived = true, ?int $before = null,
|
||||
?string $term = null): array {
|
||||
$useCache = ($since === -1 && $includeArchived === true && $before === null && $term === null);
|
||||
if (!isset($this->userBoardCache[$userId]) || !$useCache) {
|
||||
$groups = $this->groupManager->getUserGroupIds(
|
||||
$this->userManager->get($userId)
|
||||
);
|
||||
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived);
|
||||
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived);
|
||||
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
|
||||
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived, $before, $term);
|
||||
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived, $before, $term);
|
||||
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived, $before, $term);
|
||||
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
|
||||
foreach ($allBoards as $board) {
|
||||
$this->boardCache[$board->getId()] = $board;
|
||||
}
|
||||
if ($useCache) {
|
||||
$this->userBoardCache[$userId] = $allBoards;
|
||||
}
|
||||
@@ -120,19 +137,91 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @param null $offset
|
||||
* @return array
|
||||
*/
|
||||
public function findAllByUser($userId, $limit = null, $offset = null, $since = -1, $includeArchived = true) {
|
||||
// FIXME: One moving to QBMapper we should allow filtering the boards probably by method chaining for additional where clauses
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
|
||||
public function findAllByUser(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null,
|
||||
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
|
||||
// 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) {
|
||||
$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 ' .
|
||||
'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'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 ($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(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) {
|
||||
$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 */
|
||||
foreach ($entries as $entry) {
|
||||
$acl = $this->aclMapper->findAll($entry->id);
|
||||
@@ -141,9 +230,19 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function findAllByOwner(string $userId, int $limit = null, int $offset = null) {
|
||||
$sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE owner = ?';
|
||||
return $this->findEntities($sql, [$userId], $limit, $offset);
|
||||
public function findAllByOwner(string $userId, ?int $limit = null, ?int $offset = null) {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,23 +254,57 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @param null $offset
|
||||
* @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) {
|
||||
return [];
|
||||
}
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$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++) {
|
||||
$sql .= 'acl.participant = ? ';
|
||||
if (count($groups) > 1 && $i < count($groups) - 1) {
|
||||
$sql .= ' OR ';
|
||||
}
|
||||
$or->add(
|
||||
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($groups[$i], IQueryBuilder::PARAM_STR))
|
||||
);
|
||||
}
|
||||
$sql .= ')';
|
||||
$qb->andWhere($or);
|
||||
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 */
|
||||
foreach ($entries as $entry) {
|
||||
$acl = $this->aclMapper->findAll($entry->id);
|
||||
@@ -180,7 +313,8 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
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) {
|
||||
if (!$this->circlesEnabled) {
|
||||
return [];
|
||||
}
|
||||
@@ -191,19 +325,52 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
return [];
|
||||
}
|
||||
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$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++) {
|
||||
$sql .= 'acl.participant = ? ';
|
||||
if (count($circles) > 1 && $i < count($circles) - 1) {
|
||||
$sql .= ' OR ';
|
||||
}
|
||||
$or->add(
|
||||
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($circles[$i], IQueryBuilder::PARAM_STR))
|
||||
);
|
||||
}
|
||||
$sql .= ')';
|
||||
$qb->andWhere($or);
|
||||
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 */
|
||||
foreach ($entries as $entry) {
|
||||
$acl = $this->aclMapper->findAll($entry->id);
|
||||
@@ -212,21 +379,26 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function findAll() {
|
||||
$sql = 'SELECT id from *PREFIX*deck_boards;';
|
||||
return $this->findEntities($sql);
|
||||
public function findAll(): array {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id')
|
||||
->from('deck_boards');
|
||||
return $this->findEntities($qb);
|
||||
}
|
||||
|
||||
public function findToDelete() {
|
||||
// add buffer of 5 min
|
||||
$timeLimit = time() - (60 * 5);
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
|
||||
'WHERE `deleted_at` > 0 AND `deleted_at` < ?';
|
||||
return $this->findEntities($sql, [$timeLimit]);
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||
->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 */
|
||||
\OCP\AppFramework\Db\Entity $entity) {
|
||||
\OCP\AppFramework\Db\Entity $entity): \OCP\AppFramework\Db\Entity {
|
||||
// delete acl
|
||||
$acl = $this->aclMapper->findAll($entity->getId());
|
||||
foreach ($acl as $item) {
|
||||
|
||||
@@ -30,6 +30,8 @@ use OCA\Deck\Search\Query\SearchQuery;
|
||||
use OCP\AppFramework\Db\Entity;
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\ICache;
|
||||
use OCP\ICacheFactory;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\IUser;
|
||||
@@ -46,6 +48,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
private $groupManager;
|
||||
/** @var IManager */
|
||||
private $notificationManager;
|
||||
/** @var ICache */
|
||||
private $cache;
|
||||
private $databaseType;
|
||||
private $database4ByteSupport;
|
||||
|
||||
@@ -55,6 +59,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
IManager $notificationManager,
|
||||
ICacheFactory $cacheFactory,
|
||||
$databaseType = 'sqlite3',
|
||||
$database4ByteSupport = true
|
||||
) {
|
||||
@@ -63,6 +68,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
$this->userManager = $userManager;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->notificationManager = $notificationManager;
|
||||
$this->cache = $cacheFactory->createDistributed('deck-cardMapper');
|
||||
$this->databaseType = $databaseType;
|
||||
$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());
|
||||
$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 {
|
||||
@@ -107,6 +115,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
} 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);
|
||||
}
|
||||
|
||||
@@ -479,8 +491,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
}
|
||||
return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function searchRaw($boardIds, $term, $limit = null, $offset = null) {
|
||||
$qb = $this->queryCardsByBoards($boardIds)
|
||||
@@ -506,9 +518,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
}
|
||||
|
||||
public function delete(Entity $entity): Entity {
|
||||
// delete assigned labels
|
||||
$this->labelMapper->deleteLabelAssignmentsForCard($entity->getId());
|
||||
// delete card
|
||||
$this->cache->remove('findBoardId:' . $entity->getId());
|
||||
return parent::delete($entity);
|
||||
}
|
||||
|
||||
@@ -547,11 +558,22 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
}
|
||||
|
||||
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 = ?))';
|
||||
$stmt = $this->db->prepare($sql);
|
||||
$stmt->bindParam(1, $id, \PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
return $stmt->fetchColumn() ?? null;
|
||||
$result = $this->cache->get('findBoardId:' . $id);
|
||||
if ($result === null) {
|
||||
try {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$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) {
|
||||
|
||||
@@ -139,6 +139,6 @@ class DeckProvider implements IProvider {
|
||||
$cardTimestamps = array_map(function (Card $card) {
|
||||
return $card->getLastModified();
|
||||
}, $cards);
|
||||
return (min($boardTimestamps) ?: '') . '|' . (min($cardTimestamps) ?: '');
|
||||
return (count($boardTimestamps) > 0 ? min($boardTimestamps) : '') . '|' . (count($cardTimestamps) > 0 ? min($cardTimestamps) : '');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,8 +118,9 @@ class BoardService {
|
||||
/**
|
||||
* Get all boards that are shared with a user, their groups or circles
|
||||
*/
|
||||
public function getUserBoards(int $since = -1, bool $includeArchived = true): array {
|
||||
return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived);
|
||||
public function getUserBoards(?int $since = null, bool $includeArchived = true, ?int $before = null,
|
||||
?string $term = null): array {
|
||||
return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived, $before, $term);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -178,9 +179,11 @@ class BoardService {
|
||||
/** @var Board $board */
|
||||
$board = $this->boardMapper->find($boardId, true, true);
|
||||
$this->boardMapper->mapOwner($board);
|
||||
foreach ($board->getAcl() as &$acl) {
|
||||
if ($acl !== null) {
|
||||
$this->boardMapper->mapAcl($acl);
|
||||
if ($board->getAcl() !== null) {
|
||||
foreach ($board->getAcl() as $acl) {
|
||||
if ($acl !== null) {
|
||||
$this->boardMapper->mapAcl($acl);
|
||||
}
|
||||
}
|
||||
}
|
||||
$permissions = $this->permissionService->matchPermissions($board);
|
||||
|
||||
@@ -59,7 +59,7 @@ class FullTextSearchService {
|
||||
|
||||
/** @var CardMapper */
|
||||
private $cardMapper;
|
||||
|
||||
|
||||
public function __construct(
|
||||
BoardMapper $boardMapper, StackMapper $stackMapper, CardMapper $cardMapper
|
||||
) {
|
||||
@@ -187,6 +187,6 @@ class FullTextSearchService {
|
||||
* @return Board[]
|
||||
*/
|
||||
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) {
|
||||
$owner = $this->userIsBoardOwner($board->getId());
|
||||
$acls = $board->getAcl();
|
||||
$acls = $board->getAcl() ?? [];
|
||||
return [
|
||||
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
|
||||
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
|
||||
@@ -155,7 +155,7 @@ class PermissionService {
|
||||
}
|
||||
|
||||
try {
|
||||
$acls = $this->getBoard($boardId)->getAcl();
|
||||
$acls = $this->getBoard($boardId)->getAcl() ?? [];
|
||||
$result = $this->userCan($acls, $permission, $userId);
|
||||
if ($result) {
|
||||
return true;
|
||||
|
||||
@@ -90,25 +90,19 @@ class SearchService {
|
||||
}
|
||||
|
||||
public function searchBoards(string $term, ?int $limit, ?int $cursor): array {
|
||||
$boards = $this->boardService->getUserBoards();
|
||||
// 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
|
||||
);
|
||||
});
|
||||
$boards = $this->boardService->getUserBoards(null, true, $cursor, mb_strtolower($term));
|
||||
|
||||
// sort the boards, recently modified first
|
||||
usort($filteredBoards, function ($boardA, $boardB) {
|
||||
usort($boards, function ($boardA, $boardB) {
|
||||
$ta = $boardA->getLastModified();
|
||||
$tb = $boardB->getLastModified();
|
||||
return $ta === $tb
|
||||
? 0
|
||||
: ($ta > $tb ? -1 : 1);
|
||||
});
|
||||
|
||||
// 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 {
|
||||
|
||||
10781
package-lock.json
generated
10781
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
45
package.json
45
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "deck",
|
||||
"description": "",
|
||||
"version": "1.5.4",
|
||||
"version": "1.7.0-beta1",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Julius Härtl",
|
||||
@@ -29,24 +29,25 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.14.6",
|
||||
"@babel/runtime": "^7.16.3",
|
||||
"@juliushaertl/vue-richtext": "^1.0.1",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.6.0",
|
||||
"@nextcloud/axios": "^1.8.0",
|
||||
"@nextcloud/dialogs": "^3.1.2",
|
||||
"@nextcloud/event-bus": "^2.0.0",
|
||||
"@nextcloud/files": "^2.0.0",
|
||||
"@nextcloud/initial-state": "^1.2.0",
|
||||
"@nextcloud/event-bus": "^2.1.1",
|
||||
"@nextcloud/files": "^2.1.0",
|
||||
"@nextcloud/initial-state": "^1.2.1",
|
||||
"@nextcloud/l10n": "^1.4.1",
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/router": "^2.0.0",
|
||||
"@nextcloud/vue": "^3.10.1",
|
||||
"@nextcloud/vue": "^4.2.0",
|
||||
"@nextcloud/vue-dashboard": "^2.0.1",
|
||||
"blueimp-md5": "^2.18.0",
|
||||
"dompurify": "^2.2.9",
|
||||
"blueimp-md5": "^2.19.0",
|
||||
"dompurify": "^2.3.4",
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it": "^12.0.6",
|
||||
"markdown-it": "^12.2.0",
|
||||
"markdown-it-task-lists": "^2.1.1",
|
||||
"markdown-it-link-attributes": "^3.0.0",
|
||||
"moment": "^2.29.1",
|
||||
"nextcloud-vue-collections": "^0.9.0",
|
||||
"p-queue": "^6.6.2",
|
||||
@@ -54,9 +55,9 @@
|
||||
"vue": "^2.6.14",
|
||||
"vue-at": "^2.5.0-beta.2",
|
||||
"vue-click-outside": "^1.1.0",
|
||||
"vue-easymde": "^1.4.0",
|
||||
"vue-easymde": "^2.0.0",
|
||||
"vue-infinite-loading": "^2.4.5",
|
||||
"vue-router": "^3.5.1",
|
||||
"vue-router": "^3.5.3",
|
||||
"vue-smooth-dnd": "^0.8.1",
|
||||
"vuex": "^3.6.2",
|
||||
"vuex-router-sync": "^5.0.0"
|
||||
@@ -65,18 +66,18 @@
|
||||
"extends @nextcloud/browserslist-config"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=14.0.0",
|
||||
"npm": ">=7.0.0"
|
||||
"node": "^14.0.0",
|
||||
"npm": "^7.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nextcloud/babel-config": "^1.0.0-beta.1",
|
||||
"@nextcloud/browserslist-config": "^2.1.0",
|
||||
"@nextcloud/eslint-config": "^5.1.0",
|
||||
"@nextcloud/babel-config": "^1.0.0",
|
||||
"@nextcloud/browserslist-config": "^2.2.0",
|
||||
"@nextcloud/eslint-config": "^6.1.1",
|
||||
"@nextcloud/stylelint-config": "^1.0.0-beta.0",
|
||||
"@nextcloud/webpack-vue-config": "^4.0.3",
|
||||
"@relative-ci/agent": "^2.0.0",
|
||||
"@vue/test-utils": "^1.2.1",
|
||||
"jest": "^27.0.4",
|
||||
"@nextcloud/webpack-vue-config": "^4.1.4",
|
||||
"@relative-ci/agent": "^3.0.0",
|
||||
"@vue/test-utils": "^1.3.0",
|
||||
"jest": "^27.3.1",
|
||||
"jest-serializer-vue": "^2.0.2",
|
||||
"vue-jest": "^3.0.7"
|
||||
},
|
||||
@@ -96,4 +97,4 @@
|
||||
"<rootDir>/node_modules/jest-serializer-vue"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
10
src/App.vue
10
src/App.vue
@@ -59,6 +59,11 @@ export default {
|
||||
Content,
|
||||
AppContent,
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
boardApi,
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
addButton: {
|
||||
@@ -112,11 +117,6 @@ export default {
|
||||
this.$router.push({ name: 'board' })
|
||||
},
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
boardApi,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@@ -76,110 +76,108 @@
|
||||
<ActionButton v-else icon="icon-filter" />
|
||||
</Actions>
|
||||
|
||||
<template>
|
||||
<div v-if="filterVisible" class="filter">
|
||||
<h3>{{ t('deck', 'Filter by tag') }}</h3>
|
||||
<div v-for="label in labelsSorted" :key="label.id" class="filter--item">
|
||||
<input
|
||||
:id="label.id"
|
||||
v-model="filter.tags"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
:value="label.id"
|
||||
@change="setFilter">
|
||||
<label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label>
|
||||
</div>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by assigned user') }}</h3>
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="unassigned"
|
||||
v-model="filter.unassigned"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
value="unassigned"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="unassigned">{{ t('deck', 'Unassigned') }}</label>
|
||||
</div>
|
||||
<div v-for="user in board.users" :key="user.uid" class="filter--item">
|
||||
<input
|
||||
:id="user.uid"
|
||||
v-model="filter.users"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
:value="user.uid"
|
||||
@change="setFilter">
|
||||
<label :for="user.uid"><Avatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
|
||||
</div>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by due date') }}</h3>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="overdue"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="overdue"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="overdue">{{ t('deck', 'Overdue') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueToday"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueToday"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueToday">{{ t('deck', 'Next 24 hours') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueWeek"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueWeek"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueWeek">{{ t('deck', 'Next 7 days') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueMonth"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueMonth"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueMonth">{{ t('deck', 'Next 30 days') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="noDue"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="noDue"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="noDue">{{ t('deck', 'No due date') }}</label>
|
||||
</div>
|
||||
|
||||
<Button :disabled="!isFilterActive" @click="clearFilter">
|
||||
{{ t('deck', 'Clear filter') }}
|
||||
</Button>
|
||||
<div v-if="filterVisible" class="filter">
|
||||
<h3>{{ t('deck', 'Filter by tag') }}</h3>
|
||||
<div v-for="label in labelsSorted" :key="label.id" class="filter--item">
|
||||
<input
|
||||
:id="label.id"
|
||||
v-model="filter.tags"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
:value="label.id"
|
||||
@change="setFilter">
|
||||
<label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by assigned user') }}</h3>
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="unassigned"
|
||||
v-model="filter.unassigned"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
value="unassigned"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="unassigned">{{ t('deck', 'Unassigned') }}</label>
|
||||
</div>
|
||||
<div v-for="user in board.users" :key="user.uid" class="filter--item">
|
||||
<input
|
||||
:id="user.uid"
|
||||
v-model="filter.users"
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
:value="user.uid"
|
||||
@change="setFilter">
|
||||
<label :for="user.uid"><Avatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
|
||||
</div>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by due date') }}</h3>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="overdue"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="overdue"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="overdue">{{ t('deck', 'Overdue') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueToday"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueToday"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueToday">{{ t('deck', 'Next 24 hours') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueWeek"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueWeek"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueWeek">{{ t('deck', 'Next 7 days') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="dueMonth"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="dueMonth"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="dueMonth">{{ t('deck', 'Next 30 days') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input
|
||||
id="noDue"
|
||||
v-model="filter.due"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="noDue"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="noDue">{{ t('deck', 'No due date') }}</label>
|
||||
</div>
|
||||
|
||||
<Button :disabled="!isFilterActive" @click="clearFilter">
|
||||
{{ t('deck', 'Clear filter') }}
|
||||
</Button>
|
||||
</div>
|
||||
</Popover>
|
||||
|
||||
<Actions>
|
||||
|
||||
@@ -43,24 +43,22 @@
|
||||
|
||||
<li v-if="addLabel" class="editing">
|
||||
<!-- New Tag -->
|
||||
<template>
|
||||
<form class="label-form" @submit.prevent="clickAddLabel">
|
||||
<ColorPicker class="color-picker-wrapper" :value="'#' + addLabelObj.color" @input="updateColor">
|
||||
<div :style="{ backgroundColor: '#' + addLabelObj.color }" class="color0 icon-colorpicker" />
|
||||
</ColorPicker>
|
||||
<input v-model="addLabelObj.title" type="text">
|
||||
<input v-tooltip="{content: missingDataLabel, show: !addLabelObjValidated, trigger: 'manual' }"
|
||||
:disabled="!addLabelObjValidated"
|
||||
type="submit"
|
||||
value=""
|
||||
class="icon-confirm">
|
||||
<Actions>
|
||||
<ActionButton icon="icon-close" @click="addLabel=false">
|
||||
{{ t('deck', 'Cancel') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
</form>
|
||||
</template>
|
||||
<form class="label-form" @submit.prevent="clickAddLabel">
|
||||
<ColorPicker class="color-picker-wrapper" :value="'#' + addLabelObj.color" @input="updateColor">
|
||||
<div :style="{ backgroundColor: '#' + addLabelObj.color }" class="color0 icon-colorpicker" />
|
||||
</ColorPicker>
|
||||
<input v-model="addLabelObj.title" type="text">
|
||||
<input v-tooltip="{content: missingDataLabel, show: !addLabelObjValidated, trigger: 'manual' }"
|
||||
:disabled="!addLabelObjValidated"
|
||||
type="submit"
|
||||
value=""
|
||||
class="icon-confirm">
|
||||
<Actions>
|
||||
<ActionButton icon="icon-close" @click="addLabel=false">
|
||||
{{ t('deck', 'Cancel') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
</form>
|
||||
</li>
|
||||
<button v-if="canManage && !isArchived" @click="clickShowAddLabel()">
|
||||
<span class="icon-add" />{{ t('deck', 'Add a new tag') }}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
<template>
|
||||
<AttachmentDragAndDrop :card-id="cardId" class="drop-upload--sidebar">
|
||||
<div class="button-group" v-if="!isReadOnly">
|
||||
<div v-if="!isReadOnly" class="button-group">
|
||||
<button class="icon-upload" @click="uploadNewFile()">
|
||||
{{ t('deck', 'Upload new files') }}
|
||||
</button>
|
||||
@@ -71,7 +71,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<Actions v-if="selectable">
|
||||
<ActionButton icon="icon-confirm" @click="$emit('selectAttachment', attachment)">
|
||||
<ActionButton icon="icon-confirm" @click="$emit('select-attachment', attachment)">
|
||||
{{ t('deck', 'Add this attachment') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
@@ -79,14 +79,20 @@
|
||||
<ActionLink v-if="attachment.extendedData.fileid" icon="icon-folder" :href="internalLink(attachment)">
|
||||
{{ t('deck', 'Show in Files') }}
|
||||
</ActionLink>
|
||||
<ActionLink v-if="attachment.extendedData.fileid"
|
||||
icon="icon-download"
|
||||
:href="downloadLink(attachment)"
|
||||
download>
|
||||
{{ t('deck', 'Download') }}
|
||||
</ActionLink>
|
||||
<ActionButton v-if="attachment.extendedData.fileid && !isReadOnly" icon="icon-delete" @click="unshareAttachment(attachment)">
|
||||
{{ t('deck', 'Remove attachment') }}
|
||||
</ActionButton>
|
||||
|
||||
<ActionButton v-if="!attachment.extendedData.fileid && attachment.deletedAt === 0" icon="icon-delete" @click="$emit('deleteAttachment', attachment)">
|
||||
<ActionButton v-if="!attachment.extendedData.fileid && attachment.deletedAt === 0" icon="icon-delete" @click="$emit('delete-attachment', attachment)">
|
||||
{{ t('deck', 'Delete Attachment') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-else-if="!attachment.extendedData.fileid" icon="icon-history" @click="$emit('restoreAttachment', attachment)">
|
||||
<ActionButton v-else-if="!attachment.extendedData.fileid" icon="icon-history" @click="$emit('restore-attachment', attachment)">
|
||||
{{ t('deck', 'Restore Attachment') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
@@ -101,7 +107,8 @@ import { Actions, ActionButton, ActionLink } from '@nextcloud/vue'
|
||||
import AttachmentDragAndDrop from '../AttachmentDragAndDrop'
|
||||
import relativeDate from '../../mixins/relativeDate'
|
||||
import { formatFileSize } from '@nextcloud/files'
|
||||
import { generateUrl, generateOcsUrl } from '@nextcloud/router'
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
import { generateUrl, generateOcsUrl, generateRemoteUrl } from '@nextcloud/router'
|
||||
import { mapState } from 'vuex'
|
||||
import { loadState } from '@nextcloud/initial-state'
|
||||
import attachmentUpload from '../../mixins/attachmentUpload'
|
||||
@@ -174,6 +181,9 @@ export default {
|
||||
internalLink() {
|
||||
return (attachment) => generateUrl('/f/' + attachment.extendedData.fileid)
|
||||
},
|
||||
downloadLink() {
|
||||
return (attachment) => generateRemoteUrl(`dav/files/${getCurrentUser().uid}/${attachment.extendedData.path}`)
|
||||
},
|
||||
formattedFileSize() {
|
||||
return (filesize) => formatFileSize(filesize)
|
||||
},
|
||||
@@ -212,7 +222,7 @@ export default {
|
||||
},
|
||||
shareFromFiles() {
|
||||
picker.pick()
|
||||
.then(async(path) => {
|
||||
.then(async (path) => {
|
||||
console.debug(`path ${path} selected for sharing`)
|
||||
if (!path.startsWith('/')) {
|
||||
throw new Error(t('files', 'Invalid path selected'))
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
<AttachmentList
|
||||
:card-id="card.id"
|
||||
:removable="true"
|
||||
@deleteAttachment="deleteAttachment"
|
||||
@restoreAttachment="restoreAttachment" />
|
||||
@delete-attachment="deleteAttachment"
|
||||
@restore-attachment="restoreAttachment" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
:lang="lang"
|
||||
:formatter="format"
|
||||
:disabled="saving || !canEdit"
|
||||
:shortcuts="shortcuts"
|
||||
confirm />
|
||||
<Actions v-if="canEdit">
|
||||
<ActionButton v-if="copiedCard.duedate" icon="icon-delete" @click="removeDue()">
|
||||
@@ -176,6 +177,48 @@ export default {
|
||||
stringify: this.stringify,
|
||||
parse: this.parse,
|
||||
},
|
||||
shortcuts: [
|
||||
{
|
||||
text: t('deck', 'Today'),
|
||||
onClick() {
|
||||
const date = new Date()
|
||||
date.setDate(date.getDate())
|
||||
date.setHours(23)
|
||||
date.setMinutes(59)
|
||||
return date
|
||||
},
|
||||
},
|
||||
{
|
||||
text: t('deck', 'Tomorrow'),
|
||||
onClick() {
|
||||
const date = new Date()
|
||||
date.setDate(date.getDate() + 1)
|
||||
date.setHours(23)
|
||||
date.setMinutes(59)
|
||||
return date
|
||||
},
|
||||
},
|
||||
{
|
||||
text: t('deck', 'Next week'),
|
||||
onClick() {
|
||||
const date = new Date()
|
||||
date.setDate(date.getDate() + 7)
|
||||
date.setHours(23)
|
||||
date.setMinutes(59)
|
||||
return date
|
||||
},
|
||||
},
|
||||
{
|
||||
text: t('deck', 'Next month'),
|
||||
onClick() {
|
||||
const date = new Date()
|
||||
date.setDate(date.getDate() + 30)
|
||||
date.setHours(23)
|
||||
date.setMinutes(59)
|
||||
return date
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -316,6 +359,14 @@ export default {
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
|
||||
.section-wrapper::v-deep .mx-datepicker-main.mx-datepicker-popup {
|
||||
left: 0 !important;
|
||||
}
|
||||
|
||||
.section-wrapper::v-deep .mx-datepicker-main.mx-datepicker-popup.mx-datepicker-sidebar {
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
.section-wrapper {
|
||||
display: flex;
|
||||
max-width: 100%;
|
||||
|
||||
@@ -19,47 +19,45 @@
|
||||
</div>
|
||||
</div>
|
||||
<li v-else class="comment">
|
||||
<template>
|
||||
<div class="comment--header">
|
||||
<Avatar :user="comment.actorId" />
|
||||
<span class="has-tooltip username">
|
||||
{{ comment.actorDisplayName }}
|
||||
</span>
|
||||
<Actions v-show="!edit" :force-menu="true">
|
||||
<ActionButton icon="icon-reply" :close-after-click="true" @click="replyTo()">
|
||||
{{ t('deck', 'Reply') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="canEdit"
|
||||
icon="icon-rename"
|
||||
:close-after-click="true"
|
||||
@click="showUpdateForm()">
|
||||
{{ t('deck', 'Update') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="canEdit"
|
||||
icon="icon-delete"
|
||||
:close-after-click="true"
|
||||
@click="deleteComment()">
|
||||
{{ t('deck', 'Delete') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
<Actions v-if="edit">
|
||||
<ActionButton icon="icon-close" @click="hideUpdateForm" />
|
||||
</Actions>
|
||||
<div class="spacer" />
|
||||
<div class="timestamp">
|
||||
{{ relativeDate(comment.creationDateTime) }}
|
||||
</div>
|
||||
<div class="comment--header">
|
||||
<Avatar :user="comment.actorId" />
|
||||
<span class="has-tooltip username">
|
||||
{{ comment.actorDisplayName }}
|
||||
</span>
|
||||
<Actions v-show="!edit" :force-menu="true">
|
||||
<ActionButton icon="icon-reply" :close-after-click="true" @click="replyTo()">
|
||||
{{ t('deck', 'Reply') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="canEdit"
|
||||
icon="icon-rename"
|
||||
:close-after-click="true"
|
||||
@click="showUpdateForm()">
|
||||
{{ t('deck', 'Update') }}
|
||||
</ActionButton>
|
||||
<ActionButton v-if="canEdit"
|
||||
icon="icon-delete"
|
||||
:close-after-click="true"
|
||||
@click="deleteComment()">
|
||||
{{ t('deck', 'Delete') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
<Actions v-if="edit">
|
||||
<ActionButton icon="icon-close" @click="hideUpdateForm" />
|
||||
</Actions>
|
||||
<div class="spacer" />
|
||||
<div class="timestamp">
|
||||
{{ relativeDate(comment.creationDateTime) }}
|
||||
</div>
|
||||
<CommentItem v-if="comment.replyTo" :reply="true" :comment="comment.replyTo" />
|
||||
<div v-show="!edit" ref="richTextElement">
|
||||
<RichText
|
||||
class="comment--content"
|
||||
:text="richText(comment)"
|
||||
:arguments="richArgs(comment)"
|
||||
:autolink="true" />
|
||||
</div>
|
||||
<CommentForm v-if="edit" v-model="commentMsg" @submit="updateComment" />
|
||||
</template>
|
||||
</div>
|
||||
<CommentItem v-if="comment.replyTo" :reply="true" :comment="comment.replyTo" />
|
||||
<div v-show="!edit" ref="richTextElement">
|
||||
<RichText
|
||||
class="comment--content"
|
||||
:text="richText(comment)"
|
||||
:arguments="richArgs(comment)"
|
||||
:autolink="true" />
|
||||
</div>
|
||||
<CommentForm v-if="edit" v-model="commentMsg" @submit="updateComment" />
|
||||
</li>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
ref="markdownEditor"
|
||||
v-model="description"
|
||||
:configs="mdeConfig"
|
||||
@input="updateDescription"
|
||||
@update:modelValue="updateDescription"
|
||||
@blur="saveDescription" />
|
||||
|
||||
<Modal v-if="modalShow" :title="t('deck', 'Choose attachment')" @close="modalShow=false">
|
||||
@@ -66,7 +66,7 @@
|
||||
<AttachmentList
|
||||
:card-id="card.id"
|
||||
:selectable="true"
|
||||
@selectAttachment="addAttachment" />
|
||||
@select-attachment="addAttachment" />
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
@@ -75,6 +75,7 @@
|
||||
<script>
|
||||
import MarkdownIt from 'markdown-it'
|
||||
import MarkdownItTaskLists from 'markdown-it-task-lists'
|
||||
import MarkdownItLinkAttributes from 'markdown-it-link-attributes'
|
||||
import AttachmentList from './AttachmentList'
|
||||
import { Actions, ActionButton, Modal } from '@nextcloud/vue'
|
||||
import { formatFileSize } from '@nextcloud/files'
|
||||
@@ -86,6 +87,13 @@ const markdownIt = new MarkdownIt({
|
||||
})
|
||||
markdownIt.use(MarkdownItTaskLists, { enabled: true, label: true, labelAfter: true })
|
||||
|
||||
markdownIt.use(MarkdownItLinkAttributes, {
|
||||
attrs: {
|
||||
target: '_blank',
|
||||
rel: 'noreferrer noopener',
|
||||
},
|
||||
})
|
||||
|
||||
export default {
|
||||
name: 'Description',
|
||||
components: {
|
||||
@@ -223,7 +231,7 @@ export default {
|
||||
updateDescription() {
|
||||
this.descriptionLastEdit = Date.now()
|
||||
clearTimeout(this.descriptionSaveTimeout)
|
||||
this.descriptionSaveTimeout = setTimeout(async() => {
|
||||
this.descriptionSaveTimeout = setTimeout(async () => {
|
||||
await this.saveDescription()
|
||||
}, 2500)
|
||||
},
|
||||
|
||||
@@ -53,6 +53,19 @@
|
||||
<PopoverMenu :menu="popover" />
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<div class="avatar-print-list">
|
||||
<div v-for="user in avatarUsers" :key="user.id" class="avatar-print-list-item">
|
||||
<Avatar
|
||||
class="avatar-print-list-avatar"
|
||||
:user="user.participant.uid"
|
||||
:display-name="user.participant.displayname"
|
||||
:disable-menu="true"
|
||||
:is-no-user="user.type !== 0"
|
||||
:size="24" />
|
||||
{{ user.participant.displayname }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -116,6 +129,15 @@ export default {
|
||||
}),
|
||||
]
|
||||
},
|
||||
avatarUsers() {
|
||||
if (!this.users) {
|
||||
return []
|
||||
}
|
||||
|
||||
return this.users.filter((user) => {
|
||||
return [0, 1, 7].includes(user.type)
|
||||
})
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
togglePopover() {
|
||||
@@ -176,4 +198,26 @@ export default {
|
||||
display: block;
|
||||
margin: 40px -6px;
|
||||
}
|
||||
|
||||
.avatar-print-list {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.avatar-list {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.avatar-print-list-item {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.avatar-print-list {
|
||||
display: block;
|
||||
padding-top: 5px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<AvatarList :users="card.assignedUsers" />
|
||||
|
||||
<CardMenu :card="card" />
|
||||
<CardMenu class="card-menu" :card="card" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
@@ -150,4 +150,15 @@ export default {
|
||||
.fade-enter, .fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.badges {
|
||||
align-items: flex-start;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
.card-menu {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<template>
|
||||
<div v-if="card" class="duedate">
|
||||
<transition name="zoom">
|
||||
<div v-if="card.duedate" :class="dueIcon">
|
||||
<div v-if="card.duedate" :class="dueIcon" :title="absoluteDate">
|
||||
<span>{{ relativeDate }}</span>
|
||||
</div>
|
||||
</transition>
|
||||
@@ -62,14 +62,14 @@ export default {
|
||||
}
|
||||
return moment(this.card.duedate).fromNow()
|
||||
},
|
||||
dueDateTooltip() {
|
||||
return moment(this.card.duedate).format('LLLL')
|
||||
absoluteDate() {
|
||||
return moment(this.card.duedate).format('L')
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" coped>
|
||||
<style lang="scss" scoped>
|
||||
.icon.due {
|
||||
background-position: 4px center;
|
||||
border-radius: 3px;
|
||||
@@ -105,6 +105,7 @@ export default {
|
||||
padding: 3px 4px;
|
||||
}
|
||||
|
||||
&::before,
|
||||
span {
|
||||
margin-left: 20px;
|
||||
white-space: nowrap;
|
||||
@@ -112,4 +113,18 @@ export default {
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
.icon.due {
|
||||
background-color: transparent !important;
|
||||
|
||||
span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: attr(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
<script>
|
||||
import { ColorPicker, ActionButton, Actions, AppNavigationItem } from '@nextcloud/vue'
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
function randomColor() {
|
||||
let randomHexColor = ((1 << 24) * Math.random() | 0).toString(16)
|
||||
while (randomHexColor.length < 6) {
|
||||
|
||||
@@ -125,7 +125,10 @@
|
||||
<div :style="{ backgroundColor: getColor }" class="color0 icon-colorpicker app-navigation-entry-bullet" />
|
||||
</ColorPicker>
|
||||
<form @submit.prevent.stop="applyEdit">
|
||||
<input v-model="editTitle" type="text" required>
|
||||
<input v-model="editTitle"
|
||||
v-focus
|
||||
type="text"
|
||||
required>
|
||||
<input type="submit" value="" class="icon-confirm">
|
||||
<Actions><ActionButton icon="icon-close" @click.stop.prevent="cancelEdit" /></Actions>
|
||||
</form>
|
||||
|
||||
@@ -63,10 +63,15 @@ import { Actions, ActionButton } from '@nextcloud/vue'
|
||||
|
||||
const createCancelToken = () => axios.CancelToken.source()
|
||||
|
||||
/**
|
||||
* @param root0
|
||||
* @param root0.query
|
||||
* @param root0.cursor
|
||||
*/
|
||||
function search({ query, cursor }) {
|
||||
const cancelToken = createCancelToken()
|
||||
|
||||
const request = async() => axios.get(generateOcsUrl('apps/deck/api/v1.0/search'), {
|
||||
const request = async () => axios.get(generateOcsUrl('apps/deck/api/v1.0/search'), {
|
||||
cancelToken: cancelToken.token,
|
||||
params: {
|
||||
term: query,
|
||||
|
||||
@@ -21,6 +21,11 @@ ul {
|
||||
|
||||
ul {
|
||||
list-style-type: disc;
|
||||
|
||||
.task-list-item {
|
||||
margin-left: -20px;
|
||||
list-style-type: none;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
@@ -67,7 +72,7 @@ img {
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
margin: 0px 10px 0px 0px;
|
||||
margin: 0px 3px 0px 0px;
|
||||
line-height: 10px;
|
||||
font-size: 10px;
|
||||
display: inline-block;
|
||||
|
||||
@@ -25,9 +25,8 @@ const buildSelector = (selector, propsData = {}) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const container = document.createElement('div')
|
||||
document.getElementById('body-user').append(container)
|
||||
const View = Vue.extend(selector)
|
||||
const ComponentVM = new View({
|
||||
propsData,
|
||||
const ComponentVM = new Vue({
|
||||
render: (h) => h(selector, propsData),
|
||||
}).$mount(container)
|
||||
ComponentVM.$root.$on('close', () => {
|
||||
ComponentVM.$el.remove()
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
|
||||
import Vue from 'vue'
|
||||
|
||||
import BoardSelector from './BoardSelector'
|
||||
import CardSelector from './CardSelector'
|
||||
import './../css/collections.css'
|
||||
import FileSharingPicker from './views/FileSharingPicker'
|
||||
import { buildSelector } from './helpers/selector'
|
||||
@@ -45,13 +43,19 @@ window.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
|
||||
window.OCP.Collaboration.registerType('deck', {
|
||||
action: () => buildSelector(BoardSelector),
|
||||
action: () => {
|
||||
const BoardSelector = () => import('./BoardSelector')
|
||||
buildSelector(BoardSelector)
|
||||
},
|
||||
typeString: t('deck', 'Link to a board'),
|
||||
typeIconClass: 'icon-deck',
|
||||
})
|
||||
|
||||
window.OCP.Collaboration.registerType('deck-card', {
|
||||
action: () => buildSelector(CardSelector),
|
||||
action: () => {
|
||||
const CardSelector = () => import('./CardSelector')
|
||||
buildSelector(CardSelector)
|
||||
},
|
||||
typeString: t('deck', 'Link to a card'),
|
||||
typeIconClass: 'icon-deck',
|
||||
})
|
||||
|
||||
@@ -109,7 +109,7 @@ if (!window.OCA.Deck) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} CardRichObject
|
||||
* @typedef {object} CardRichObject
|
||||
* @property {string} id
|
||||
* @property {string} name
|
||||
* @property {string} boardname
|
||||
@@ -124,13 +124,14 @@ if (!window.OCA.Deck) {
|
||||
|
||||
/**
|
||||
* Frontend message API for adding actions to talk messages.
|
||||
*
|
||||
* @param {*} Object the wrapping object.
|
||||
* @param {String} label the action label.
|
||||
* @param {string} label the action label.
|
||||
* @param {registerActionCallback} callback the callback function. This function will receive
|
||||
* the card as a parameter and be triggered by a click on the
|
||||
* action. The card parameter will be of the format of a rich object string
|
||||
* type "deck-card"
|
||||
* @param {String} icon the action label. E.g. "icon-reply"
|
||||
* @param {string} icon the action label. E.g. "icon-reply"
|
||||
*/
|
||||
window.OCA.Deck.registerCardAction = ({ label, callback, icon }) => {
|
||||
const cardAction = {
|
||||
|
||||
@@ -47,7 +47,7 @@ export default {
|
||||
bodyFormData.append('cardId', this.cardId)
|
||||
bodyFormData.append('type', type)
|
||||
bodyFormData.append('file', file)
|
||||
await queue.add(async() => {
|
||||
await queue.add(async () => {
|
||||
try {
|
||||
await this.$store.dispatch('createAttachment', {
|
||||
cardId: this.cardId,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**
|
||||
/*
|
||||
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
/**
|
||||
* Board model
|
||||
*
|
||||
* @typedef {Object} Board
|
||||
* @property {String} title
|
||||
* @typedef {object} Board
|
||||
* @property {string} title
|
||||
* @property {boolean} archived
|
||||
* @property {number} shared 1 (shared) or 0 (not shared)
|
||||
*/
|
||||
@@ -32,8 +32,8 @@
|
||||
/**
|
||||
* Stack model
|
||||
*
|
||||
* @typedef {Object} Stack
|
||||
* @property {String} title
|
||||
* @typedef {object} Stack
|
||||
* @property {string} title
|
||||
* @property {number} boardId
|
||||
* @property {number} order
|
||||
*/
|
||||
@@ -41,15 +41,15 @@
|
||||
/**
|
||||
* Card model
|
||||
*
|
||||
* @typedef {Object} Card
|
||||
* @property {String} title
|
||||
* @typedef {object} Card
|
||||
* @property {string} title
|
||||
* @property {boolean} archived
|
||||
* @property {number} order
|
||||
*/
|
||||
/**
|
||||
* Label model
|
||||
*
|
||||
* @typedef {Object} Label
|
||||
* @property {String} title
|
||||
* @property {String} color
|
||||
* @typedef {object} Label
|
||||
* @property {string} title
|
||||
* @property {string} color
|
||||
*/
|
||||
|
||||
@@ -38,7 +38,7 @@ export class BoardApi {
|
||||
* Updates a board.
|
||||
*
|
||||
* @param {Board} board the board object to update
|
||||
* @returns {Promise}
|
||||
* @return {Promise}
|
||||
*/
|
||||
updateBoard(board) {
|
||||
return axios.put(this.url(`/boards/${board.id}`), board)
|
||||
@@ -57,13 +57,13 @@ export class BoardApi {
|
||||
|
||||
/**
|
||||
* Creates a new board.
|
||||
* @typedef {Object} BoardCreateObject
|
||||
*
|
||||
* @typedef {object} BoardCreateObject
|
||||
* @property {string} title
|
||||
* @property {string} color
|
||||
*
|
||||
* @param {BoardCreateObject} boardData The board data to send.
|
||||
* color the hexadecimal color value formated /[0-9A-F]{6}/i
|
||||
* @returns {Promise}
|
||||
* @return {Promise}
|
||||
*/
|
||||
createBoard(boardData) {
|
||||
return axios.post(this.url('/boards'), boardData)
|
||||
|
||||
@@ -78,7 +78,7 @@ export class StackApi {
|
||||
|
||||
/**
|
||||
* @param {Stack} stack stack object to create
|
||||
* @returns {Promise}
|
||||
* @return {Promise}
|
||||
*/
|
||||
createStack(stack) {
|
||||
return axios.post(this.url('/stacks'), stack)
|
||||
|
||||
@@ -353,6 +353,7 @@ export default new Vuex.Store({
|
||||
},
|
||||
|
||||
/**
|
||||
* @param commit.commit
|
||||
* @param commit
|
||||
* @param state
|
||||
* @param {Board} board
|
||||
@@ -366,6 +367,7 @@ export default new Vuex.Store({
|
||||
})
|
||||
},
|
||||
/**
|
||||
* @param commit.commit
|
||||
* @param commit
|
||||
* @param state
|
||||
* @param {Board} board
|
||||
@@ -381,9 +383,10 @@ export default new Vuex.Store({
|
||||
/**
|
||||
* Updates a board API side.
|
||||
*
|
||||
* @param commit.commit
|
||||
* @param commit
|
||||
* @param board The board to update.
|
||||
* @returns {Promise<void>}
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
async updateBoard({ commit }, board) {
|
||||
const storedBoard = await apiClient.updateBoard(board)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user