1
0
mirror of https://github.com/mattermost/focalboard.git synced 2024-12-24 13:43:12 +02:00

Merge branch 'main' into gh-2147-url-property-improvement

This commit is contained in:
Mattermod 2022-02-01 17:25:34 +02:00 committed by GitHub
commit 5186372107
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 934 additions and 1709 deletions

View File

@ -31,3 +31,8 @@ If applicable, add screenshots to elaborate on the problem.
## Additional context
Add any other context about the problem here.
Also set the Severity using the *Sev/1*, *Sev/2* or *Sev/3* labels as best you can:
* Sev/1: Issue affects critical functionality without a workaround
* Sev/2: Issue affects major functionality with a difficult or non-obvious workaround
* Sev/3: Issue affects minor, non-critical functionality

View File

@ -0,0 +1,55 @@
name: Scorecards supply-chain security
on:
# Only the default branch is supported.
branch_protection_rule:
schedule:
- cron: '38 10 * * 2'
push:
branches: [ main ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecards analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
actions: read
contents: read
steps:
- name: "Checkout code"
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@c8416b0b2bf627c349ca92fc8e3de51a64b005cf # v1.0.2
with:
results_file: results.sarif
results_format: sarif
# Read-only PAT token. To create it,
# follow the steps in https://github.com/ossf/scorecard-action#pat-token-creation.
repo_token: ${{ secrets.SCORECARD_READ_TOKEN }}
# Publish the results to enable scorecard badges. For more details, see
# https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories, `publish_results` will automatically be set to `false`,
# regardless of the value entered here.
publish_results: true
# Upload the results as artifacts (optional).
- name: "Upload artifact"
uses: actions/upload-artifact@82c141cc518b40d92cc801eee768e7aafc9c2fa2 # v2.3.1
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@5f532563584d71fdef14ee64d17bafb34f751ce5 # v1.0.26
with:
sarif_file: results.sarif

View File

@ -4,12 +4,15 @@
![CodeQL](https://github.com/mattermost/focalboard/actions/workflows/codeql-analysis.yml/badge.svg)
![Dev Release](https://github.com/mattermost/focalboard/actions/workflows/dev-release.yml/badge.svg)
![Prod Release](https://github.com/mattermost/focalboard/actions/workflows/prod-release.yml/badge.svg)
<a href="https://translate.mattermost.com/engage/focalboard/">
<img src="https://translate.mattermost.com/widgets/focalboard/-/svg-badge.svg" alt="Translation status" />
</a>
Like what you see? :eyes: Give us a GitHub Star! :star:
[![Focalboard](website/site/static/img/hero.jpg)](https://www.focalboard.com)
[Focalboard](https://www.focalboard.com) is an open source, self-hosted project management tool that's an alternative to Trello, Notion, and Asana.
[Focalboard](https://www.focalboard.com) is an open source, multilingual, self-hosted project management tool that's an alternative to Trello, Notion, and Asana.
It helps define, organize, track and manage work across individuals and teams. Focalboard comes in two main editions:
@ -113,3 +116,7 @@ File bugs, suggest features, join our forum, learn more [here](https://github.co
## Contributing
Contribute code, bug reports, and ideas to the future of the Focalboard project. We welcome your input! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to get involved.
## Translating
Help translate Focalboard! The app is already translated into several languages. We welcome corrections and new language translations! You can add new languages or improve existing translations at [Weblate](https://translate.mattermost.com/engage/focalboard/).

View File

@ -3,8 +3,10 @@
## Docker
The Dockerfile gives a quick and easy way to pull the latest Focalboard server and deploy it locally.
Please note that if you wish to have persistence and mount a volume for the `/data` directory, the host directory must be owned by user `nobody`.
```
sudo chown -R nobody /home/user/focalboard-data
docker build -t focalboard .
docker run -it -v "/home/user/focalboard-data:/data" -p 80:8000 focalboard
```

View File

@ -8634,9 +8634,9 @@
"dev": true
},
"node_modules/nanoid": {
"version": "3.1.29",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz",
"integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
@ -19899,9 +19899,9 @@
"dev": true
},
"nanoid": {
"version": "3.1.29",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz",
"integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true
},
"natural-compare": {

View File

@ -1,7 +1,7 @@
# Asana importer
This node app converts an Asana json archive into a Focalboard archive. To use:
1. From the Asana Board Menu, select `Export / Print`, and `JSON`
1. From the Asana Board Menu (dropdown next to board title), select `Export / Print`, and `JSON`
2. Save it locally, e.g. to `asana.json`
3. Run `npm install` from within `focalboard/webapp`
4. Run `npm install` from within `focalboard/import/asana`

View File

@ -287,9 +287,9 @@
}
},
"node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@ -1879,9 +1879,9 @@
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {

View File

@ -2,7 +2,7 @@
This node app converts a Notion CSV and markdown export into a Focalboard archive. To use:
1. From a Notion Board, open the ... menu at the top right
2. Select `Export` and pick `Markdown & CSV` as the export format
2. Select `Export`, pick `Markdown & CSV` as the export format, select true to include subpages.
3. Save it locally, and unzip the folder e.g. to `notion-export`
4. Run `npm install` from within `focalboard/webapp`
5. Run `npm install` from within `focalboard/import/notion`

View File

@ -288,9 +288,9 @@
}
},
"node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@ -1916,9 +1916,9 @@
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {

View File

@ -287,9 +287,9 @@
}
},
"node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@ -1879,9 +1879,9 @@
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {

View File

@ -1,12 +1,13 @@
# Trello importer
This node app converts a Trello json archive into a Focalboard archive. To use:
1. From the Trello Board Menu, select `More`, then `Print and Export`, and `Export to JSON`
2. Save it locally, e.g. to `trello.json`
3. Run `npm install` from within `focalboard/webapp`
4. Run `npm install` from within `focalboard/import/trello`
5. Run `npx ts-node importTrello.ts -i <path-to-trello.json> -o archive.focalboard` (also from within `focalboard/import/trello`)
6. In Focalboard, click `Settings`, then `Import archive` and select `archive.focalboard`
1. From the Trello Board Menu, `...Show Menu` on right
2. Select `More`, then `Print and Export`, and `Export to JSON`
3. Save it locally, e.g. to `trello.json`
4. Run `npm install` from within `focalboard/webapp`
5. Run `npm install` from within `focalboard/import/trello`
6. Run `npx ts-node importTrello.ts -i <path-to-trello.json> -o archive.focalboard` (also from within `focalboard/import/trello`)
7. In Focalboard, click `Settings`, then `Import archive` and select `archive.focalboard`
## Import scope

View File

@ -287,9 +287,9 @@
}
},
"node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@ -1879,9 +1879,9 @@
"dev": true
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {

View File

@ -6,7 +6,7 @@
"": {
"dependencies": {
"core-js": "3.12.1",
"marked": ">=2.0.1",
"marked": ">=4.0.12",
"mattermost-redux": "5.33.1",
"react-intl": "^5.13.5",
"react-router-dom": "5.2.0"
@ -2561,11 +2561,6 @@
"node": ">= 8"
}
},
"node_modules/@react-native-community/netinfo": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-4.7.0.tgz",
"integrity": "sha512-a/sDB+AsLEUNmhAUlAaTYeXKyQdFGBUfatqKkX5jluBo2CB3OAuTHfm7rSjcaLB9EmG5iSq3fOTpync2E7EYTA=="
},
"node_modules/@sindresorhus/is": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
@ -3387,9 +3382,9 @@
}
},
"node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
@ -3589,11 +3584,6 @@
"dev": true,
"optional": true
},
"node_modules/async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -4670,7 +4660,6 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@ -6758,9 +6747,9 @@
}
},
"node_modules/eslint/node_modules/glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"dependencies": {
"is-glob": "^4.0.1"
@ -7075,15 +7064,6 @@
"node": ">=10"
}
},
"node_modules/execa/node_modules/is-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
"dev": true,
"engines": {
"node": ">=8"
}
},
"node_modules/executable": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
@ -7923,21 +7903,24 @@
}
},
"node_modules/gifsicle": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.2.0.tgz",
"integrity": "sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==",
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.3.0.tgz",
"integrity": "sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"execa": "^5.0.0",
"logalot": "^2.0.0"
"execa": "^5.0.0"
},
"bin": {
"gifsicle": "cli.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/imagemin/gisicle-bin?sponsor=1"
}
},
"node_modules/glob": {
@ -8218,9 +8201,9 @@
}
},
"node_modules/hosted-git-info": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"node_modules/html-encoding-sniffer": {
@ -10539,15 +10522,6 @@
"node": ">=6"
}
},
"node_modules/jest-junit/node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true,
"bin": {
"uuid": "bin/uuid"
}
},
"node_modules/jest-leak-detector": {
"version": "27.0.1",
"resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.1.tgz",
@ -11888,12 +11862,6 @@
"json5": "lib/cli.js"
}
},
"node_modules/json5/node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"node_modules/jsx-ast-utils": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz",
@ -12237,11 +12205,11 @@
}
},
"node_modules/marked": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/marked/-/marked-3.0.6.tgz",
"integrity": "sha512-a1hY8eqdP9JgmsaO0MYYhO9Li2nfY/5pAj+gWU5r41Lze6AV4Xty1cseLWDcOYimJnaVfQAomaA6NK+z2IyR+w==",
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
"integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
"bin": {
"marked": "bin/marked"
"marked": "bin/marked.js"
},
"engines": {
"node": ">= 12"
@ -12307,6 +12275,10 @@
"symbol-observable": "^1.2.0"
}
},
"node_modules/mattermost-redux/node_modules/redux-offline": {
"resolved": "node_modules/mattermost-redux/redux-offline@git+https:/github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df",
"link": true
},
"node_modules/mattermost-redux/node_modules/redux-persist": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.9.1.tgz",
@ -12317,6 +12289,7 @@
"lodash-es": "^4.17.4"
}
},
"node_modules/mattermost-redux/redux-offline@git+https:/github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df": {},
"node_modules/mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@ -12608,14 +12581,14 @@
"dev": true
},
"node_modules/mozjpeg": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.1.0.tgz",
"integrity": "sha512-A6nVpI33DVi04HxatRx3PZTeVAOP1AC/T/5kXEvP0U8F+J11mmFFDv46BM2j5/cEyzDDtK8ptHeBSphNMrQLqA==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.1.1.tgz",
"integrity": "sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"logalot": "^2.1.0"
"bin-wrapper": "^4.0.0"
},
"bin": {
"mozjpeg": "cli.js"
@ -13042,15 +13015,14 @@
}
},
"node_modules/optipng-bin": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.0.tgz",
"integrity": "sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.1.tgz",
"integrity": "sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"logalot": "^2.0.0"
"bin-wrapper": "^4.0.0"
},
"bin": {
"optipng": "cli.js"
@ -13287,9 +13259,9 @@
}
},
"node_modules/path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"node_modules/path-to-regexp": {
@ -13512,16 +13484,15 @@
}
},
"node_modules/pngquant-bin": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.0.tgz",
"integrity": "sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.1.tgz",
"integrity": "sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.1",
"execa": "^4.0.0",
"logalot": "^2.0.0"
"execa": "^4.0.0"
},
"bin": {
"pngquant": "cli.js"
@ -13668,9 +13639,9 @@
"dev": true
},
"node_modules/postcss/node_modules/nanoid": {
"version": "3.1.23",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
"integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
@ -14248,23 +14219,6 @@
"symbol-observable": "^1.2.0"
}
},
"node_modules/redux-offline": {
"resolved": "git+ssh://git@github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df",
"dependencies": {
"@react-native-community/netinfo": "^4.1.3",
"redux-persist": "^4.5.0"
}
},
"node_modules/redux-persist": {
"version": "4.10.2",
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.10.2.tgz",
"integrity": "sha512-U+e0ieMGC69Zr72929iJW40dEld7Mflh6mu0eJtVMLGfMq/aJqjxUM1hzyUWMR1VUyAEEdPHuQmeq5ti9krIgg==",
"dependencies": {
"json-stringify-safe": "^5.0.1",
"lodash": "^4.17.4",
"lodash-es": "^4.17.4"
}
},
"node_modules/redux-persist-node-storage": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/redux-persist-node-storage/-/redux-persist-node-storage-2.0.0.tgz",
@ -15072,9 +15026,9 @@
}
},
"node_modules/socketcluster-client": {
"version": "14.3.1",
"resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz",
"integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==",
"version": "14.3.2",
"resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz",
"integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==",
"dependencies": {
"buffer": "^5.2.1",
"clone": "2.1.1",
@ -15085,16 +15039,7 @@
"sc-errors": "^2.0.1",
"sc-formatter": "^3.0.1",
"uuid": "3.2.1",
"ws": "7.1.0"
}
},
"node_modules/socketcluster-client/node_modules/buffer": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
"integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
"dependencies": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
"ws": "^7.5.0"
}
},
"node_modules/socketcluster-client/node_modules/uuid": {
@ -15105,14 +15050,6 @@
"uuid": "bin/uuid"
}
},
"node_modules/socketcluster-client/node_modules/ws": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz",
"integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==",
"dependencies": {
"async-limiter": "^1.0.0"
}
},
"node_modules/sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
@ -15898,23 +15835,6 @@
"node": ">=8"
}
},
"node_modules/test-exclude/node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -15953,9 +15873,9 @@
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"node_modules/tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
"integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
"node_modules/to-buffer": {
@ -17009,12 +16929,23 @@
}
},
"node_modules/ws": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
"integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
"dev": true,
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
"integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
"engines": {
"node": ">=8.3.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/xml": {
@ -19421,11 +19352,6 @@
"fastq": "^1.6.0"
}
},
"@react-native-community/netinfo": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-4.7.0.tgz",
"integrity": "sha512-a/sDB+AsLEUNmhAUlAaTYeXKyQdFGBUfatqKkX5jluBo2CB3OAuTHfm7rSjcaLB9EmG5iSq3fOTpync2E7EYTA=="
},
"@sindresorhus/is": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
@ -20190,9 +20116,9 @@
}
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true
},
"ansi-styles": {
@ -20349,11 +20275,6 @@
"dev": true,
"optional": true
},
"async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -21250,7 +21171,6 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@ -22654,9 +22574,9 @@
"dev": true
},
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@ -23194,14 +23114,6 @@
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
},
"dependencies": {
"is-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
"dev": true
}
}
},
"executable": {
@ -23884,15 +23796,14 @@
}
},
"gifsicle": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.2.0.tgz",
"integrity": "sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==",
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.3.0.tgz",
"integrity": "sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==",
"dev": true,
"requires": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"execa": "^5.0.0",
"logalot": "^2.0.0"
"execa": "^5.0.0"
}
},
"glob": {
@ -24129,9 +24040,9 @@
}
},
"hosted-git-info": {
"version": "2.8.8",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"html-encoding-sniffer": {
@ -25979,12 +25890,6 @@
"requires": {
"ansi-regex": "^4.1.0"
}
},
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
}
}
},
@ -27076,14 +26981,6 @@
"dev": true,
"requires": {
"minimist": "^1.2.0"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
}
}
},
"jsx-ast-utils": {
@ -27354,9 +27251,9 @@
}
},
"marked": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/marked/-/marked-3.0.6.tgz",
"integrity": "sha512-a1hY8eqdP9JgmsaO0MYYhO9Li2nfY/5pAj+gWU5r41Lze6AV4Xty1cseLWDcOYimJnaVfQAomaA6NK+z2IyR+w=="
"version": "4.0.12",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
"integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ=="
},
"mattermost-redux": {
"version": "5.33.1",
@ -27412,6 +27309,9 @@
"symbol-observable": "^1.2.0"
}
},
"redux-offline": {
"version": "file:node_modules/mattermost-redux/redux-offline@git+https:/github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df"
},
"redux-persist": {
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.9.1.tgz",
@ -27662,14 +27562,13 @@
}
},
"mozjpeg": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.1.0.tgz",
"integrity": "sha512-A6nVpI33DVi04HxatRx3PZTeVAOP1AC/T/5kXEvP0U8F+J11mmFFDv46BM2j5/cEyzDDtK8ptHeBSphNMrQLqA==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.1.1.tgz",
"integrity": "sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==",
"dev": true,
"requires": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"logalot": "^2.1.0"
"bin-wrapper": "^4.0.0"
}
},
"ms": {
@ -28025,14 +27924,13 @@
}
},
"optipng-bin": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.0.tgz",
"integrity": "sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.1.tgz",
"integrity": "sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==",
"dev": true,
"requires": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.0",
"logalot": "^2.0.0"
"bin-wrapper": "^4.0.0"
}
},
"os-filter-obj": {
@ -28196,9 +28094,9 @@
"dev": true
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-to-regexp": {
@ -28373,15 +28271,14 @@
}
},
"pngquant-bin": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.0.tgz",
"integrity": "sha512-oXWAS9MQ9iiDAJRdAZ9KO1mC5UwhzKkJsmetiu0iqIjJuW7JsuLhmc4JdRm7uJkIWRzIAou/Vq2VcjfJwz30Ow==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.1.tgz",
"integrity": "sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==",
"dev": true,
"requires": {
"bin-build": "^3.0.0",
"bin-wrapper": "^4.0.1",
"execa": "^4.0.0",
"logalot": "^2.0.0"
"execa": "^4.0.0"
},
"dependencies": {
"execa": {
@ -28437,9 +28334,9 @@
},
"dependencies": {
"nanoid": {
"version": "3.1.23",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
"integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true
}
}
@ -28974,24 +28871,6 @@
"symbol-observable": "^1.2.0"
}
},
"redux-offline": {
"version": "git+ssh://git@github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df",
"from": "git+ssh://git@github.com/enahum/redux-offline.git#885024de96b6ec73650c340c8928066585c413df",
"requires": {
"@react-native-community/netinfo": "^4.1.3",
"redux-persist": "^4.5.0"
}
},
"redux-persist": {
"version": "4.10.2",
"resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-4.10.2.tgz",
"integrity": "sha512-U+e0ieMGC69Zr72929iJW40dEld7Mflh6mu0eJtVMLGfMq/aJqjxUM1hzyUWMR1VUyAEEdPHuQmeq5ti9krIgg==",
"requires": {
"json-stringify-safe": "^5.0.1",
"lodash": "^4.17.4",
"lodash-es": "^4.17.4"
}
},
"redux-persist-node-storage": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/redux-persist-node-storage/-/redux-persist-node-storage-2.0.0.tgz",
@ -29658,9 +29537,9 @@
}
},
"socketcluster-client": {
"version": "14.3.1",
"resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.1.tgz",
"integrity": "sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==",
"version": "14.3.2",
"resolved": "https://registry.npmjs.org/socketcluster-client/-/socketcluster-client-14.3.2.tgz",
"integrity": "sha512-xDtgW7Ss0ARlfhx53bJ5GY5THDdEOeJnT+/C9Rmrj/vnZr54xeiQfrCZJbcglwe732nK3V+uZq87IvrRl7Hn4g==",
"requires": {
"buffer": "^5.2.1",
"clone": "2.1.1",
@ -29671,30 +29550,13 @@
"sc-errors": "^2.0.1",
"sc-formatter": "^3.0.1",
"uuid": "3.2.1",
"ws": "7.1.0"
"ws": "^7.5.0"
},
"dependencies": {
"buffer": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
"integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
"requires": {
"base64-js": "^1.0.2",
"ieee754": "^1.1.4"
}
},
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
},
"ws": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz",
"integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==",
"requires": {
"async-limiter": "^1.0.0"
}
}
}
},
@ -30337,22 +30199,6 @@
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
"minimatch": "^3.0.4"
},
"dependencies": {
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
}
}
},
"text-table": {
@ -30390,9 +30236,9 @@
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
"integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
"to-buffer": {
@ -31230,10 +31076,10 @@
}
},
"ws": {
"version": "7.4.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz",
"integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==",
"dev": true
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
"integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
"requires": {}
},
"xml": {
"version": "1.0.1",

View File

@ -75,7 +75,7 @@
},
"dependencies": {
"core-js": "3.12.1",
"marked": ">=2.0.1",
"marked": ">=4.0.12",
"mattermost-redux": "5.33.1",
"react-intl": "^5.13.5",
"react-router-dom": "5.2.0"

View File

@ -20,6 +20,7 @@ import store from '../../../webapp/src/store'
import GlobalHeader from '../../../webapp/src/components/globalHeader/globalHeader'
import FocalboardIcon from '../../../webapp/src/widgets/icons/logo'
import {setMattermostTheme} from '../../../webapp/src/theme'
import {UserSettings} from '../../../webapp/src/userSettings'
import TelemetryClient, {TelemetryCategory, TelemetryActions} from '../../../webapp/src/telemetry/telemetryClient'
@ -139,6 +140,16 @@ export default class Plugin {
window.open(`${windowAny.frontendBaseURL}/workspace/${currentChannel}`, '_blank', 'noopener')
}
this.channelHeaderButtonId = registry.registerChannelHeaderButtonAction(<FocalboardIcon/>, goToFocalboardWorkspace, 'Boards', 'Boards')
const goToFocalboardTemplate = () => {
const currentChannel = mmStore.getState().entities.channels.currentChannelId
TelemetryClient.trackEvent(TelemetryCategory, TelemetryActions.ClickChannelIntro, {workspaceID: currentChannel})
UserSettings.lastBoardId = null
UserSettings.lastViewId = null
window.open(`${windowAny.frontendBaseURL}/workspace/${currentChannel}`, '_blank', 'noopener')
}
this.channelHeaderButtonId = registry.registerChannelIntroButtonAction(<FocalboardIcon/>, goToFocalboardTemplate, 'Boards')
this.registry.registerProduct('/boards', 'product-boards', 'Boards', '/boards/welcome', MainApp, HeaderComponent)
this.registry.registerPostWillRenderEmbedComponent((embed) => embed.type === 'boards', BoardsUnfurl, false)
} else {

View File

@ -3,6 +3,7 @@
export interface PluginRegistry {
registerPostTypeComponent(typeName: string, component: React.ElementType)
registerChannelHeaderButtonAction(icon: React.Element, action: () => void, dropdownText: string, tooltipText: string)
registerChannelIntroButtonAction(icon: React.Element, action: () => void, tooltipText: string)
registerCustomRoute(route: string, component: React.ElementType)
registerProductRoute(route: string, component: React.ElementType)
unregisterComponent(componentId: string)

View File

@ -1170,13 +1170,22 @@ func (a *API) handlePostSharing(w http.ResponseWriter, r *http.Request) {
auditRec.AddMeta("shareID", sharing.ID)
auditRec.AddMeta("enabled", sharing.Enabled)
// Stamp ModifiedBy
ctx := r.Context()
session := ctx.Value(sessionContextKey).(*model.Session)
userID := session.UserID
if userID == SingleUser {
userID = ""
}
if !a.app.GetClientConfig().EnablePublicSharedBoards {
a.logger.Info(
"Attempt to turn on sharing for board via API failed, sharing off in configuration.",
mlog.String("boardID", sharing.ID),
mlog.String("userID", userID))
a.errorResponse(w, r.URL.Path, http.StatusInternalServerError, "Turning on sharing for board failed, see log for details.", nil)
return
}
sharing.ModifiedBy = userID
err = a.app.UpsertSharing(*container, sharing)
@ -1320,6 +1329,7 @@ func (a *API) handleServeFile(w http.ResponseWriter, r *http.Request) {
// - application/json
// - image/jpg
// - image/png
// - image/gif
// parameters:
// - name: workspaceID
// in: path
@ -1370,6 +1380,10 @@ func (a *API) handleServeFile(w http.ResponseWriter, r *http.Request) {
contentType = "image/png"
}
if fileExtension == "gif" {
contentType = "image/gif"
}
w.Header().Set("Content-Type", contentType)
fileReader, err := a.app.GetFileReader(workspaceID, rootID, filename)

View File

@ -22,7 +22,7 @@ func TestSharing(t *testing.T) {
require.False(t, sharing.Enabled)
})
t.Run("POST sharing", func(t *testing.T) {
t.Run("POST sharing, config = false", func(t *testing.T) {
sharing := model.Sharing{
ID: rootID,
Token: token,
@ -30,17 +30,41 @@ func TestSharing(t *testing.T) {
UpdateAt: 1,
}
// it will fail with default config
success, resp := th.Client.PostSharing(sharing)
require.False(t, success)
require.Error(t, resp.Error)
t.Run("GET sharing", func(t *testing.T) {
sharing, resp := th.Client.GetSharing(rootID)
// Expect no error, but no Id returned
require.NoError(t, resp.Error)
require.NotNil(t, sharing)
require.Equal(t, "", sharing.ID)
})
})
t.Run("POST sharing, config = true", func(t *testing.T) {
th.Server.Config().EnablePublicSharedBoards = true
sharing := model.Sharing{
ID: rootID,
Token: token,
Enabled: true,
UpdateAt: 1,
}
// it will succeed with updated config
success, resp := th.Client.PostSharing(sharing)
require.True(t, success)
require.NoError(t, resp.Error)
})
t.Run("GET sharing", func(t *testing.T) {
sharing, resp := th.Client.GetSharing(rootID)
require.NoError(t, resp.Error)
require.NotNil(t, sharing)
require.Equal(t, sharing.ID, rootID)
require.True(t, sharing.Enabled)
require.Equal(t, sharing.Token, token)
t.Run("GET sharing", func(t *testing.T) {
sharing, resp := th.Client.GetSharing(rootID)
require.NoError(t, resp.Error)
require.NotNil(t, sharing)
require.Equal(t, sharing.ID, rootID)
require.True(t, sharing.Enabled)
require.Equal(t, sharing.Token, token)
})
})
}

View File

@ -129,7 +129,11 @@ func (n *notifier) notify() {
hint, err = n.store.GetNextNotificationHint(true)
if err != nil {
// try again later
if store.IsErrNotFound(err) {
// Expected when multiple nodes in a cluster try to process the same hint at the same time.
// This simply means the other node won. Returning here will simply try fetching another hint.
return
}
n.logger.Error("notify - error fetching next notification", mlog.Err(err))
return
}

View File

@ -195,7 +195,7 @@ func (s *SQLStore) getNextNotificationHint(db sq.BaseRunner, remove bool) (*mode
if rows == 0 {
// another node likely has grabbed this hint for processing concurrently; let that node handle it
// and we'll return an error here so we try again.
return nil, fmt.Errorf("cannot delete missing hint while getting next notification hint: %w", err)
return nil, store.NewErrNotFound(hint.BlockID)
}
}

View File

@ -260,7 +260,7 @@ func commandFromRequest(req *mmModel.WebSocketRequest) (*WebsocketCommand, error
func (pa *PluginAdapter) WebSocketMessageHasBeenPosted(webConnID, userID string, req *mmModel.WebSocketRequest) {
pac, ok := pa.GetListenerByWebConnID(webConnID)
if !ok {
pa.api.LogError("received a message for an unregistered webconn",
pa.api.LogDebug("received a message for an unregistered webconn",
"webConnID", webConnID,
"userID", userID,
"action", req.Action,

View File

@ -25,6 +25,7 @@
}
},
"rules": {
"max-lines": "off",
"no-unused-expressions": 0,
"babel/no-unused-expressions": [2, {"allowShortCircuit": true}],
"eol-last": ["error", "always"],

View File

@ -47,10 +47,10 @@
"KanbanCard.duplicate": "Duplicar",
"KanbanCard.untitled": "Sense títol",
"Mutator.duplicate-board": "duplicar tauler",
"Mutator.new-board-from-template": "nou tauler desde plantilla",
"Mutator.new-card-from-template": "nova targeta desde plantilla",
"Mutator.new-template-from-board": "nova plantilla desde tauler",
"Mutator.new-template-from-card": "nova plantilla desde targeta",
"Mutator.new-board-from-template": "nou tauler des de plantilla",
"Mutator.new-card-from-template": "nova targeta des de plantilla",
"Mutator.new-template-from-board": "nova plantilla des de tauler",
"Mutator.new-template-from-card": "nova plantilla des de targeta",
"PropertyMenu.Delete": "Eliminar",
"PropertyMenu.changeType": "Canviar el tipus de propietat",
"PropertyMenu.typeTitle": "Tipus",
@ -121,6 +121,7 @@
"View.DeleteView": "Eliminar vista",
"View.DuplicateView": "Duplicar vista",
"View.NewBoardTitle": "Vista de tauler",
"View.NewCalendarTitle": "Vista de calendari",
"View.NewGalleryTitle": "Vista de galeria",
"View.NewTableTitle": "Vista de tauler",
"View.Table": "Taula",

View File

@ -90,7 +90,7 @@
"DashboardPage.CenterPanel.ChangeChannels": "スイッチャーで簡単にチャンネルを変更できます",
"DashboardPage.CenterPanel.NoWorkspaces": "その言葉に一致するチャンネルは見つかりませんでした",
"DashboardPage.CenterPanel.NoWorkspacesDescription": "別の言葉で検索してみてください",
"DashboardPage.showEmpty": "空の表示",
"DashboardPage.showEmpty": "空のボードを表示",
"DashboardPage.title": "ダッシュボード",
"DeleteBoardDialog.confirm-cancel": "キャンセル",
"DeleteBoardDialog.confirm-delete": "削除",

View File

@ -63,10 +63,16 @@
"CardDetailProperty.property-deleted": "{PropertyName} успешно удалено!",
"CardDetailProperty.property-name-change-subtext": "тип из \"{oldPropType}\" в \"{newPropType}\"",
"CardDetailProperty.property-type-change-subtext": "название для \"{newPropName}\"",
"CardDialog.copiedLink": "Скопировано!",
"CardDialog.copyLink": "Копировать ссылку",
"CardDialog.editing-template": "Вы редактируете шаблон.",
"CardDialog.nocard": "Эта карточка не существует или недоступна.",
"ColorOption.selectColor": "Выберите цвет {color}",
"Comment.delete": "Удалить",
"CommentsList.send": "Отправить",
"ConfirmationDialog.cancel-action": "Отмена",
"ConfirmationDialog.confirm-action": "Подтвердить",
"ConfirmationDialog.delete-action": "Удалить",
"ContentBlock.Delete": "Удалить",
"ContentBlock.DeleteAction": "удалить",
"ContentBlock.addElement": "добавить {type}",
@ -81,19 +87,41 @@
"ContentBlock.moveDown": "Опустить",
"ContentBlock.moveUp": "Поднять",
"ContentBlock.text": "текст",
"DashboardPage.CenterPanel.ChangeChannels": "Используйте переключатель, чтобы легко сменить каналы",
"DashboardPage.CenterPanel.NoWorkspaces": "К сожалению, мы не смогли найти ни одного канала, соответствующего этому термину.",
"DashboardPage.CenterPanel.NoWorkspacesDescription": "Пожалуйста, попробуйте найти другой термин",
"DashboardPage.showEmpty": "Показать пустой",
"DashboardPage.title": "Панель управления",
"DeleteBoardDialog.confirm-cancel": "Отмена",
"DeleteBoardDialog.confirm-delete": "Удалить",
"DeleteBoardDialog.confirm-info": "Вы уверены, что хотите удалить доску \"{boardTitle}\"? Его удаление приведет к удалению всех карточек на доске.",
"DeleteBoardDialog.confirm-tite": "Подтвердить удаление доски",
"Dialog.closeDialog": "Закрыть диалог",
"EditableDayPicker.today": "Сегодня",
"EmptyCenterPanel.no-content": "Добавьте или выберите доску на боковой панели, чтобы начать работу.",
"EmptyCenterPanel.plugin.choose-a-template": "Выберите шаблон",
"EmptyCenterPanel.plugin.empty-board": "Начните с пустой доски",
"EmptyCenterPanel.plugin.end-message": "Вы можете изменить канал с помощью переключателя на боковой панели.",
"EmptyCenterPanel.plugin.new-template": "Новый шаблон",
"EmptyCenterPanel.plugin.no-content-description": "Добавьте доску на боковую панель, используя любой из указанных ниже шаблонов, или начните с нуля.{lineBreak} Участники \"{workspaceName}\" будут иметь доступ к созданным здесь доскам.",
"EmptyCenterPanel.plugin.no-content-or": "или",
"EmptyCenterPanel.plugin.no-content-title": "Создайте доску в {workspaceName}",
"Error.mobileweb": "Мобильная веб-поддержка в настоящее время находится на ранней стадии бета-тестирования. Могут присутствовать не все функции.",
"Error.websocket-closed": "Соединение через веб-сокет закрыто, соединение прервано. Если это не устраняется, проверьте конфигурацию сервера или веб-прокси.",
"Filter.includes": "содержит",
"Filter.is-empty": "пусто",
"Filter.is-not-empty": "не пусто",
"Filter.not-includes": "не содержит",
"FilterComponent.add-filter": "+ Добавить фильтр",
"FilterComponent.delete": "Удалить",
"GalleryCard.copiedLink": "Скопировано!",
"GalleryCard.copyLink": "Копировать ссылку",
"GalleryCard.delete": "Удалить",
"GalleryCard.duplicate": "Создать дубликат",
"General.BoardCount": "{count, plural, one {# Доска} other {# Доски}}",
"GroupBy.ungroup": "Разгруппировать",
"KanbanCard.copiedLink": "Скопировано!",
"KanbanCard.copyLink": "Копировать ссылку",
"KanbanCard.delete": "Удалить",
"KanbanCard.duplicate": "Создать дубликат",
"KanbanCard.untitled": "Без названия",
@ -104,6 +132,7 @@
"Mutator.new-template-from-card": "новый шаблон из карточки",
"PropertyMenu.Delete": "Удалить",
"PropertyMenu.changeType": "Изменить тип свойства",
"PropertyMenu.selectType": "Выберите тип свойства",
"PropertyMenu.typeTitle": "Тип",
"PropertyType.Checkbox": "Флажок",
"PropertyType.CreatedBy": "Создано пользователем",
@ -120,6 +149,7 @@
"PropertyType.URL": "URL",
"PropertyType.UpdatedBy": "Обновлено пользователем",
"PropertyType.UpdatedTime": "Время обновления",
"PropertyValueElement.empty": "Пустой",
"RegistrationLink.confirmRegenerateToken": "Это сделает недействительными ссылки, которые ранее были общими. Продолжить?",
"RegistrationLink.copiedLink": "Скопировано!",
"RegistrationLink.copyLink": "Скопировать ссылку",
@ -146,6 +176,7 @@
"Sidebar.import-archive": "Импорт архива",
"Sidebar.invite-users": "Пригласить пользователей",
"Sidebar.logout": "Выйти",
"Sidebar.no-more-workspaces": "Рабочих пространств больше нет",
"Sidebar.no-views-in-board": "Внутри нет страниц",
"Sidebar.random-icons": "Случайные иконки",
"Sidebar.select-a-template": "Выберите шаблон",
@ -167,16 +198,24 @@
"TableHeaderMenu.sort-ascending": "Сортировать по возрастанию",
"TableHeaderMenu.sort-descending": "Сортировать по убыванию",
"TableRow.open": "Открыть",
"TopBar.give-feedback": "Дать обратную связь",
"ValueSelector.noOptions": "Нет вариантов. Начните печатать, чтобы добавить первый!",
"ValueSelector.valueSelector": "Выбор значения",
"ValueSelectorLabel.openMenu": "Открыть меню",
"View.AddView": "Добавить вид",
"View.Board": "Доска",
"View.DeleteView": "Удалить вид",
"View.DuplicateView": "Создать дубликат вида",
"View.Gallery": "Галерея",
"View.NewBoardTitle": "Вид доски",
"View.NewCalendarTitle": "Просмотр календаря",
"View.NewGalleryTitle": "Представление \"галерея\"",
"View.NewTableTitle": "Вид таблицы",
"View.NewTemplateTitle": "Шаблон без названия",
"View.Table": "Таблица",
"ViewHeader.add-template": "Новый шаблон",
"ViewHeader.delete-template": "Удалить",
"ViewHeader.display-by": "Показать по: {property}",
"ViewHeader.edit-template": "Редактировать",
"ViewHeader.empty-card": "Очистить карточку",
"ViewHeader.export-board-archive": "Экспорт архива доски",
@ -190,6 +229,7 @@
"ViewHeader.search": "Поиск",
"ViewHeader.search-text": "Поиск текста",
"ViewHeader.select-a-template": "Выбрать шаблон",
"ViewHeader.set-default-template": "Установить по умолчанию",
"ViewHeader.share-board": "Расшарить доску",
"ViewHeader.sort": "Сортировать",
"ViewHeader.untitled": "Без названия",
@ -199,7 +239,13 @@
"ViewTitle.remove-icon": "Убрать иконку",
"ViewTitle.show-description": "Показать описание",
"ViewTitle.untitled-board": "Доска без названия",
"WelcomePage.Description": "Доски — это инструмент управления проектами, который помогает определять, организовывать, отслеживать и управлять работой между командами, используя знакомое представление доски Kanban.",
"WelcomePage.Explore.Button": "Исследовать",
"WelcomePage.Heading": "Добро пожаловать на Доски",
"Workspace.editing-board-template": "Вы редактируете шаблон доски.",
"calendar.month": "Месяц",
"calendar.today": "СЕГОДНЯ",
"calendar.week": "Неделя",
"default-properties.title": "Заголовок",
"error.no-workspace": "Возможно, срок вашей сессии истек, или вы не имеете доступа к этому рабочему пространству.",
"error.relogin": "Снова войдите в систему",

257
webapp/i18n/sk.json Normal file
View File

@ -0,0 +1,257 @@
{
"BoardComponent.add-a-group": "+ Pridaj skupinu",
"BoardComponent.delete": "Mazať",
"BoardComponent.hidden-columns": "Skryté stľpce",
"BoardComponent.hide": "Skryť",
"BoardComponent.new": "+ Nový",
"BoardComponent.no-property": "žiadna {property}",
"BoardComponent.no-property-title": "Položky s prázdnou {property} pôjdu tu. Tento stĺpec nemožno vymazať.",
"BoardComponent.show": "Ukáž",
"BoardPage.newVersion": "Nová verzia je dostupná, kliknite tu pre znovu načítanie.",
"BoardPage.syncFailed": "Nástenka môže byť vymazaná, alebo prístup odobraný.",
"BoardsUnfurl.Remainder": "+{remainder} viac",
"BoardsUnfurl.Updated": "Upravené {time}",
"Calculations.Options.average.displayName": "Priemer",
"Calculations.Options.average.label": "Priemer",
"Calculations.Options.count.displayName": "Počet",
"Calculations.Options.count.label": "Počet",
"Calculations.Options.countChecked.displayName": "Označené",
"Calculations.Options.countChecked.label": "Spočítaj označené",
"Calculations.Options.countUnchecked.displayName": "Neoznačené",
"Calculations.Options.countUnchecked.label": "Spočítaj neoznačené",
"Calculations.Options.countUniqueValue.displayName": "Unikátne",
"Calculations.Options.countUniqueValue.label": "Spočítaj unikátne hodnoty",
"Calculations.Options.countValue.displayName": "Hodnoty",
"Calculations.Options.countValue.label": "Spočítaj hodnoty",
"Calculations.Options.dateRange.displayName": "Rozsah",
"Calculations.Options.dateRange.label": "Rozsah",
"Calculations.Options.earliest.displayName": "Prvý",
"Calculations.Options.earliest.label": "Prvý",
"Calculations.Options.latest.displayName": "Posledný",
"Calculations.Options.latest.label": "Posledný",
"Calculations.Options.max.displayName": "Max",
"Calculations.Options.max.label": "Max",
"Calculations.Options.median.displayName": "Median",
"Calculations.Options.median.label": "Median",
"Calculations.Options.min.displayName": "Min",
"Calculations.Options.min.label": "Min",
"Calculations.Options.none.displayName": "Vypočítaj",
"Calculations.Options.none.label": "Nič",
"Calculations.Options.percentChecked.displayName": "Skontrolované",
"Calculations.Options.percentChecked.label": "Percent Skontrolovaných",
"Calculations.Options.percentUnchecked.displayName": "Neskontrolované",
"Calculations.Options.percentUnchecked.label": "Percent neskontrolovaných",
"Calculations.Options.range.displayName": "Rozsah",
"Calculations.Options.range.label": "Rozsah",
"Calculations.Options.sum.displayName": "Súčet",
"Calculations.Options.sum.label": "Súčet",
"CardDetail.Follow": "Sleduj",
"CardDetail.Following": "Sledujúce",
"CardDetail.add-content": "Pridaj obsah",
"CardDetail.add-icon": "Pridaj ikonu",
"CardDetail.add-property": "+ Pridaj vlastnosť",
"CardDetail.addCardText": "Pridaj text karty",
"CardDetail.moveContent": "presuň obsah karty",
"CardDetail.new-comment-placeholder": "Pridaj komentár ...",
"CardDetailProperty.confirm-delete-heading": "Potvrď vymazanie vlastnosti",
"CardDetailProperty.confirm-delete-subtext": "Skutočne chcete vymazať \"{propertyName}\"? Mazaním ju odstránite zo všetkých kariet na tabuli.",
"CardDetailProperty.confirm-property-name-change-subtext": "Skutočne chcete vymazať \"{propertyName}\" {customText}? Ovplyvní to hodnoty na {numOfCards} kartách na tabuli, a môže viesť k strate dát.",
"CardDetailProperty.confirm-property-type-change": "Potvrď zmenu typu vlastnosti!",
"CardDetailProperty.delete-action-button": "Odstrániť",
"CardDetailProperty.property-change-action-button": "Zmeniť vlastnosť",
"CardDetailProperty.property-changed": "Zmena vlastnosti úspešná!",
"CardDetailProperty.property-deleted": "Mazanie {propertyName} úspešné!",
"CardDetailProperty.property-name-change-subtext": "typ od \"{oldPropType}\" do \"{newPropType}\"",
"CardDetailProperty.property-type-change-subtext": "meno po \"{newPropName}\"",
"CardDialog.copiedLink": "Skopírované!",
"CardDialog.copyLink": "Kopíruj odkaz",
"CardDialog.editing-template": "Editujete template.",
"CardDialog.nocard": "Karta neexistuje alebo je neprístupná.",
"ColorOption.selectColor": "Vyber {color} farbu",
"Comment.delete": "Odstrániť",
"CommentsList.send": "Poslať",
"ConfirmationDialog.cancel-action": "Zrušiť",
"ConfirmationDialog.confirm-action": "Potvrdiť",
"ConfirmationDialog.delete-action": "Odstrániť",
"ContentBlock.Delete": "Odstrániť",
"ContentBlock.DeleteAction": "Odstrániť",
"ContentBlock.addElement": "pridaj {type}",
"ContentBlock.checkbox": "checkbox",
"ContentBlock.divider": "oddeľovač",
"ContentBlock.editCardCheckbox": "označený-checkbox",
"ContentBlock.editCardCheckboxText": "upraviť text karty",
"ContentBlock.editCardText": "upraviť text karty",
"ContentBlock.editText": "Upraviť text...",
"ContentBlock.image": "obrázok",
"ContentBlock.insertAbove": "vlož nad",
"ContentBlock.moveDown": "Presuň dole",
"ContentBlock.moveUp": "Presuň hore",
"ContentBlock.text": "text",
"DashboardPage.CenterPanel.ChangeChannels": "Na zmenu kanálov použite prepínač",
"DashboardPage.CenterPanel.NoWorkspaces": "Prepáčte, nenašli sa kanály s daným výrazom",
"DashboardPage.CenterPanel.NoWorkspacesDescription": "Skúste vyhľadať iný výraz",
"DashboardPage.showEmpty": "Zobraziť prázdne",
"DashboardPage.title": "Dashboard",
"DeleteBoardDialog.confirm-cancel": "Zrušiť",
"DeleteBoardDialog.confirm-delete": "Odstrániť",
"DeleteBoardDialog.confirm-info": "Naozaj chcete odstrániť nástenku “{boardTitle}”? Odstránením vymažete všetky karty na tabuli.",
"DeleteBoardDialog.confirm-tite": "Potvrďte odstránenie nástenky",
"Dialog.closeDialog": "Zavrieť dialog",
"EditableDayPicker.today": "Dnes",
"EmptyCenterPanel.no-content": "Začnite pridaním alebo výberom nástenky z bočného panela.",
"EmptyCenterPanel.plugin.choose-a-template": "Vybrať template",
"EmptyCenterPanel.plugin.empty-board": "Začnite s prázdnou nástenkou",
"EmptyCenterPanel.plugin.end-message": "Kanál môžete prepnúť prepínačom v bočnom paneli.",
"EmptyCenterPanel.plugin.new-template": "Nový template",
"EmptyCenterPanel.plugin.no-content-description": "Pridajte nástenku na bočný panel pomocou preddefinovaných šablón alebo si ju vytvorte sami.{lineBreak} Členovia \"{workspaceName}\" budú mať prístup k tu vytvoreným nástenkám.",
"EmptyCenterPanel.plugin.no-content-or": "alebo",
"EmptyCenterPanel.plugin.no-content-title": "Vytvorte nástenku v {workspaceName}",
"Error.mobileweb": "Mobile web support is currently in early beta. Not all functionality may be present.",
"Error.websocket-closed": "Websocket pripojenie zlyhalo - prerušené. Skontrolujte konfiguráciu servera ak problém pretrváva.",
"Filter.includes": "zahŕňa",
"Filter.is-empty": "je prázdny",
"Filter.is-not-empty": "nie je prázdny",
"Filter.not-includes": "nezahŕňa",
"FilterComponent.add-filter": "+ Pridaj filter",
"FilterComponent.delete": "Odstrániť",
"GalleryCard.copiedLink": "Skopírované!",
"GalleryCard.copyLink": "Skopírovať odkaz",
"GalleryCard.delete": "Odstrániť",
"GalleryCard.duplicate": "Duplikuj",
"General.BoardCount": "{count, plural, one {# Nástenka} other {# Nástenky}}",
"GroupBy.ungroup": "Zrušiť zoskupenie",
"KanbanCard.copiedLink": "Skopírované!",
"KanbanCard.copyLink": "Skopírovať odkaz",
"KanbanCard.delete": "Odstrániť",
"KanbanCard.duplicate": "Duplikuj",
"KanbanCard.untitled": "Nepomenované",
"Mutator.duplicate-board": "duplikuj nástenku",
"Mutator.new-board-from-template": "nová nástenka z template-u",
"Mutator.new-card-from-template": "nová karta z template-u",
"Mutator.new-template-from-board": "nový template z nástenky",
"Mutator.new-template-from-card": "nový template z karty",
"PropertyMenu.Delete": "Odstrániť",
"PropertyMenu.changeType": "Zmeniť vlastnosť",
"PropertyMenu.selectType": "Vybrať vlastnosť",
"PropertyMenu.typeTitle": "Typ",
"PropertyType.Checkbox": "Checkbox",
"PropertyType.CreatedBy": "Vytvoril",
"PropertyType.CreatedTime": "Vytvorené",
"PropertyType.Date": "Dátum",
"PropertyType.Email": "Email",
"PropertyType.File": "Súbor alebo médium",
"PropertyType.MultiSelect": "Viacnásobný výber",
"PropertyType.Number": "číslo",
"PropertyType.Person": "Osoba",
"PropertyType.Phone": "Telefón",
"PropertyType.Select": "Vyber",
"PropertyType.Text": "Text",
"PropertyType.URL": "URL",
"PropertyType.UpdatedBy": "Naposledy upravil",
"PropertyType.UpdatedTime": "Posledná úprava",
"PropertyValueElement.empty": "Prázdny",
"RegistrationLink.confirmRegenerateToken": "Toto zruší platnosť predtým zdieľaných odkazov. Pokračovať?",
"RegistrationLink.copiedLink": "Skopírované!",
"RegistrationLink.copyLink": "Skopírovať odkaz",
"RegistrationLink.description": "Zdieľajte tento odkaz pre vytvorenie účtu:",
"RegistrationLink.regenerateToken": "Obnoviť token",
"RegistrationLink.tokenRegenerated": "Registračný odkaz obnovený",
"ShareBoard.confirmRegenerateToken": "Toto zruší platnosť predtým zdieľaných odkazov. Pokračovať?",
"ShareBoard.copiedLink": "Skopírované!",
"ShareBoard.copyLink": "Skopírovať odkaz",
"ShareBoard.regenerateToken": "Obnoviť token",
"ShareBoard.share": "Zverejniť a zdieľať túto nástenku s každým, kto má odkaz",
"ShareBoard.tokenRegenrated": "Token obnovený",
"ShareBoard.unshare": "Ktokoľvek s odkazom môže zobraziť túto nástenku a všetky karty v nej.",
"Sidebar.about": "O Focalboard",
"Sidebar.add-board": "+ Pridať nástenku",
"Sidebar.add-template": "Nový template",
"Sidebar.changePassword": "Zmeniť heslo",
"Sidebar.delete-board": "Odstrániť nástenku",
"Sidebar.delete-template": "Odstrániť",
"Sidebar.duplicate-board": "Duplikuj nástenku",
"Sidebar.edit-template": "Upraviť",
"Sidebar.empty-board": "Prázdna nástenka",
"Sidebar.export-archive": "Export archívu",
"Sidebar.import-archive": "Import archívu",
"Sidebar.invite-users": "Pozvať užívateľa",
"Sidebar.logout": "Odhlásiť sa",
"Sidebar.no-more-workspaces": "Žiadne miesta",
"Sidebar.no-views-in-board": "Bez obsahu",
"Sidebar.random-icons": "Náhodné ikony",
"Sidebar.select-a-template": "vyber template",
"Sidebar.set-language": "Nastaviť jazyk",
"Sidebar.set-theme": "Nastaviť tému",
"Sidebar.settings": "nastavenia",
"Sidebar.template-from-board": "Nový template z nástenky",
"Sidebar.untitled": "Bez názvu",
"Sidebar.untitled-board": "(nástenka bez názvu)",
"Sidebar.untitled-view": "(náhľad bez názvu)",
"TableComponent.add-icon": "Pridať ikonu",
"TableComponent.name": "názov",
"TableComponent.plus-new": "+ Nový",
"TableHeaderMenu.delete": "Odstrániť",
"TableHeaderMenu.duplicate": "Duplikuj",
"TableHeaderMenu.hide": "Skryť",
"TableHeaderMenu.insert-left": "Vložiť vľavo",
"TableHeaderMenu.insert-right": "Vložiť vpravo",
"TableHeaderMenu.sort-ascending": "vzostupne",
"TableHeaderMenu.sort-descending": "zostupne",
"TableRow.open": "Otvoriť",
"TopBar.give-feedback": "Spätná väzba",
"ValueSelector.noOptions": "Žiadne možnosti. Pridajte prvú!",
"ValueSelector.valueSelector": "Výber hodnoty",
"ValueSelectorLabel.openMenu": "Otvor menu",
"View.AddView": "Pridaj pohľad",
"View.Board": "nástenka",
"View.DeleteView": "Odstrániť pohľad",
"View.DuplicateView": "Duplikuj pohľad",
"View.Gallery": "Galéria",
"View.NewBoardTitle": "Náhľad nástenky",
"View.NewCalendarTitle": "Kalendár",
"View.NewGalleryTitle": "Galéria",
"View.NewTableTitle": "Tabuľka",
"View.NewTemplateTitle": "template bez názvu",
"View.Table": "Tabuľka",
"ViewHeader.add-template": "Nový template",
"ViewHeader.delete-template": "Odstrániť",
"ViewHeader.display-by": "Zobraziť podľa: {property}",
"ViewHeader.edit-template": "Upraviť",
"ViewHeader.empty-card": "Prázdna karta",
"ViewHeader.export-board-archive": "Export archívu nástenky",
"ViewHeader.export-complete": "Export hotový!",
"ViewHeader.export-csv": "Export do CSV",
"ViewHeader.export-failed": "Export zlyhal!",
"ViewHeader.filter": "Filter",
"ViewHeader.group-by": "Zoskupiť podľa: {property}",
"ViewHeader.new": "Nový",
"ViewHeader.properties": "Vlastnosti",
"ViewHeader.search": "Hľadať",
"ViewHeader.search-text": "Hľadať text",
"ViewHeader.select-a-template": "vyber template",
"ViewHeader.set-default-template": "Nastaviť ako predvolenú",
"ViewHeader.share-board": "Zdieľať nástenku",
"ViewHeader.sort": "Triediť",
"ViewHeader.untitled": "Bez názvu",
"ViewTitle.hide-description": "Skryť popis",
"ViewTitle.pick-icon": "Vybrať ikonu",
"ViewTitle.random-icon": "Náhodne",
"ViewTitle.remove-icon": "Odstrániť ikonu",
"ViewTitle.show-description": "zobraziť popis",
"ViewTitle.untitled-board": "nástenka bez názvu",
"WelcomePage.Description": "Nástenky sú nástroj na riadenie projektov, ktorý pomáha definovať, organizovať, sledovať a riadiť prácu medzi tímami pomocou zobrazenia kanban",
"WelcomePage.Explore.Button": "Preskúmať",
"WelcomePage.Heading": "Vitajte",
"Workspace.editing-board-template": "Upravujete template nástenky.",
"calendar.month": "Mesiac",
"calendar.today": "Dnes",
"calendar.week": "Týždeň",
"default-properties.title": "Názov",
"error.no-workspace": "Platnosť vašej relácie vypršala alebo nemáte prístup.",
"error.relogin": "Prihlásiť sa znova",
"login.log-in-button": "Prihlásiť",
"login.log-in-title": "Prihlásiť",
"login.register-button": "alebo vytvoriť účet, ak žiadny nemáte",
"register.login-button": "alebo sa prihláste ak už máte účet",
"register.signup-title": "Zaregistrujte si účet"
}

View File

@ -45,8 +45,8 @@
"Calculations.Options.range.label": "Aralık",
"Calculations.Options.sum.displayName": "Toplam",
"Calculations.Options.sum.label": "Toplam",
"CardDetail.Follow": "İzle",
"CardDetail.Following": "İzleniyor",
"CardDetail.Follow": "Takip et",
"CardDetail.Following": "Takip ediliyor",
"CardDetail.add-content": "İçerik ekle",
"CardDetail.add-icon": "Simge ekle",
"CardDetail.add-property": "+ Alan ekle",

View File

@ -7,6 +7,14 @@
"BoardComponent.no-property": "无 {property}",
"BoardComponent.no-property-title": "{property} 属性为空的项目将转到此处。该列无法删除。",
"BoardComponent.show": "显示",
"BoardPage.newVersion": "Boards 的新版本已可用,点击这里重新加载。",
"BoardPage.syncFailed": "版面或许已被删除或访问授权已被撤销。",
"BoardsUnfurl.Remainder": "+{remainder} 更多",
"BoardsUnfurl.Updated": "于 {time} 更新",
"Calculations.Options.average.displayName": "平均",
"Calculations.Options.average.label": "平均",
"Calculations.Options.count.displayName": "计数",
"Calculations.Options.count.label": "计数",
"CardDetail.add-content": "新增内容",
"CardDetail.add-icon": "新增图标",
"CardDetail.add-property": "+ 新增属性",
@ -35,7 +43,7 @@
"ContentBlock.moveDown": "下移",
"ContentBlock.moveUp": "上移",
"ContentBlock.text": "文字",
"DashboardPage.title": "欢迎来到 Focalboard!",
"DashboardPage.title": "仪表板",
"Dialog.closeDialog": "关闭对话框",
"EditableDayPicker.today": "今天",
"EmptyCenterPanel.no-content": "从侧栏中添加或选择一个版面,即可开始使用。",
@ -85,7 +93,7 @@
"ShareBoard.copiedLink": "已复制!",
"ShareBoard.copyLink": "复制链接",
"ShareBoard.regenerateToken": "重新产生令牌",
"ShareBoard.share": "发布到网络上并将此版面共享给所有人",
"ShareBoard.share": "发布并将此版面与所有持有链接者共享",
"ShareBoard.tokenRegenrated": "已重新产生令牌",
"ShareBoard.unshare": "拥有链接的任何人都可查看此版面和卡片。",
"Sidebar.about": "关于 Focalboard",
@ -156,6 +164,9 @@
"ViewTitle.show-description": "显示描述",
"ViewTitle.untitled-board": "无标题版面",
"Workspace.editing-board-template": "您正在编辑版面模板。",
"calendar.month": "月",
"calendar.today": "今天",
"calendar.week": "周",
"default-properties.title": "标题",
"error.no-workspace": "您的会话可能已过期,或者您可能没有权限访问此工作空间。",
"error.relogin": "重新登录",

1625
webapp/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -43,7 +43,7 @@
"imagemin-svgo": "^8.0.0",
"imagemin-webp": "^6.0.0",
"lodash": "^4.17.21",
"marked": ">=2.0.1",
"marked": "^4.0.12",
"moment": "^2.29.1",
"nanoevents": "^5.1.13",
"react": "^17.0.2",
@ -91,7 +91,7 @@
"@types/draft-js": "^0.11.6",
"@types/emoji-mart": "^3.0.4",
"@types/jest": "^26.0.21",
"@types/marked": "^2.0.0",
"@types/marked": "^4.0.1",
"@types/nanoevents": "^1.0.0",
"@types/react": "^17.0.3",
"@types/react-dom": "^17.0.3",

View File

@ -56,7 +56,7 @@ contentRegistry.registerContentType({
block.fields.fileId = fileId || ''
resolve(block)
},
'.jpg,.jpeg,.png')
'.jpg,.jpeg,.png,.gif')
},
)

View File

@ -26,7 +26,7 @@
&:not(.subitem) {
&::before {
content: '';
background: var(--sidebar-text-active-border);
background: rgb(var(--sidebar-text-active-border-rgb));
width: 2px;
height: 100%;
position: absolute;

View File

@ -8,6 +8,7 @@ export const TelemetryCategory = 'boards'
export const TelemetryActions = {
ClickChannelHeader: 'clickChannelHeader',
ClickChannelIntro: 'channelIntro_boardLink',
ViewBoard: 'viewBoard',
CreateBoard: 'createBoard',
DuplicateBoard: 'duplicateBoard',

View File

@ -47,7 +47,7 @@ export const defaultTheme = {
buttonFg: '255, 255, 255',
sidebarBg: '30, 50, 92',
sidebarFg: '255, 255, 255',
sidebarTextActiveBorder: '#5d89ea',
sidebarTextActiveBorder: '93, 137, 243',
sidebarWhiteLogo: 'true',
link: '#0000ee',
@ -76,7 +76,7 @@ export const darkTheme = {
buttonFg: '255, 255, 255',
sidebarBg: '75, 73, 67',
sidebarFg: '255, 255, 255',
sidebarTextActiveBorder: '#66b9a7',
sidebarTextActiveBorder: '102, 185, 167',
sidebarWhiteLogo: 'true',
link: '#0090ff',
@ -105,7 +105,7 @@ export const lightTheme = {
buttonFg: '255, 255, 255',
sidebarBg: '247, 246, 243',
sidebarFg: '55, 53, 47',
sidebarTextActiveBorder: '#579eff',
sidebarTextActiveBorder: '87, 158, 255',
sidebarWhiteLogo: 'false',
}
@ -132,7 +132,7 @@ export function setTheme(theme: Theme | null): Theme {
document.documentElement.style.setProperty('--sidebar-bg-rgb', consolidatedTheme.sidebarBg)
document.documentElement.style.setProperty('--sidebar-text-rgb', consolidatedTheme.sidebarFg)
document.documentElement.style.setProperty('--link-color-rgb', consolidatedTheme.link)
document.documentElement.style.setProperty('--sidebar-text-active-border', consolidatedTheme.sidebarTextActiveBorder)
document.documentElement.style.setProperty('--sidebar-text-active-border-rgb', consolidatedTheme.sidebarTextActiveBorder)
}
document.documentElement.style.setProperty('--sidebar-white-logo', consolidatedTheme.sidebarWhiteLogo)
@ -183,7 +183,7 @@ export function setMattermostTheme(theme: any): Theme {
document.documentElement.style.setProperty('--sidebar-bg-rgb', color(theme.sidebarBg).rgb().array().join(', '))
document.documentElement.style.setProperty('--sidebar-text-rgb', color(theme.sidebarText).rgb().array().join(', '))
document.documentElement.style.setProperty('--link-color-rgb', theme.linkColor)
document.documentElement.style.setProperty('--sidebar-text-active-border', color(theme.sidebarTextActiveBorder).rgb().array().join(', '))
document.documentElement.style.setProperty('--sidebar-text-active-border-rgb', color(theme.sidebarTextActiveBorder).rgb().array().join(', '))
return setTheme({
...defaultTheme,

View File

@ -1,6 +1,6 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import marked from 'marked'
import {marked} from 'marked'
import {IntlShape} from 'react-intl'
import moment from 'moment'
@ -13,7 +13,7 @@ import {IAppWindow} from './types'
declare let window: IAppWindow
const imageURLForUser = (window as any).Components?.imageURLForUser
const imageURLForUser = typeof window === 'undefined' ? undefined : (window as any).Components?.imageURLForUser
const IconClass = 'octo-icon'
const OpenButtonClass = 'open-button'
const SpacerClass = 'octo-spacer'

View File

@ -5,9 +5,9 @@ section: "download"
weight: 2
---
Focalboard is installed with Mattermost v6.0, where it's called Boards. To access and use Boards, [install or upgrade to Mattermost v6.0 or later](https://mattermost.com/get-started/?utm_source=focalboard&utm_campaign=focalboard). Then, select the Product menu in the top left corner of Mattermost and choose **Boards**.
Focalboard is installed with Mattermost v6 and later, where it's called Boards. You can [install Mattermost as a self-hosted server](https://mattermost.com/deploy/?utm_source=focalboard&utm_campaign=focalboard) or [sign up for Mattermost Cloud](https://customers.mattermost.com/cloud/signup?utm_source=focalboard&utm_campaign=focalboard).
No additional server or web-proxy configuration is required.
## Mattermost Boards usage notes:
### Enable shared boards

View File

@ -7,4 +7,7 @@ weight: 1
If you are new to Focalboard, [Personal Desktop](desktop) is the fastest way to try it out.
You can also set up [Personal Server](ubuntu) on Ubuntu to use it with your team, and import boards from Personal Desktop.
To use it with your team, use [Mattermost Boards](../mattermost).
You can import boards from Personal Desktop to Mattermost Boards.
You can also set up the standalone Development or Personal Server on [Ubuntu](ubuntu) or with [Docker](docker).

View File

@ -11,13 +11,19 @@ Personal Desktop is a fully contained, standalone app meant for a single user, t
Download Focalboard from the [Mac App Store](https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8).
<a href="https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8"><img src="/img/mac-app-store.svg" style="max-height: 40px;" /></a>
#### Windows
Download Focalboard from the [Microsoft App Store](https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website).
<a href="https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website"><img src="/img/ms-app-store.svg" style="max-height: 40px;" /></a>
Or download `focalboard-win.zip` from the latest [release on GitHub](https://github.com/mattermost/focalboard/releases).
#### Linux Desktop
To install Personal Desktop for Linux:
To install Personal Desktop for Linux
1. Download `focalboard-linux.tar.gz` from the latest [release on GitHub](https://github.com/mattermost/focalboard/releases)
2. Unpack the .tar.gz archive
4. Open `focalboard-app` from within the `focalboard-app` folder

View File

@ -14,6 +14,7 @@ Follow these steps it up on an Ubuntu server. To upgrade an existing installatio
Popular hosted options include:
* [Digital Ocean](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04)
* [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
* [Linode](https://www.linode.com/docs/products/compute/)
## Install Focalboard
@ -37,6 +38,7 @@ sudo apt install nginx
You may need to adjust your firewall settings depending on the host, e.g.
* [Digital Ocean](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04)
* [EC2](https://docs.nginx.com/nginx/deployment-guides/amazon-web-services/ec2-instances-for-nginx/)
* [Linode](https://www.linode.com/docs/guides/how-to-install-nginx-ubuntu-18-04/)
### Configure NGINX

View File

@ -2,26 +2,26 @@
<div class="container-fluid">
<div class="homepage-intro__text text-left mt-4 mb-4">
<h2>
Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.
Focalboard is an open source, multilingual, self-hosted alternative to Trello, Notion, and Asana.
</h2>
<p>
It's a project management tool that helps define, organize, track and manage work across teams, using a familiar kanban board view. Focalboard comes in two main editions:
It's a project management tool that helps define, organize, track and manage work across teams, using familiar views like kanban boards, cards, calendars, and tables. Super customizable to fit your workflow.
</p>
<div class="text-left">
<ul >
<li><b><a href="download/personal-edition/desktop/">Focalboard Personal Desktop</a></b>: A stand-alone single-user desktop app for your todos and personal projects</li>
<li><b><a href="download/mattermost/">Mattermost Boards</a></b>: A cloud or self-hosted server for your team to plan and collaborate</li>
</ul>
</div>
<p>
<b>For Individuals</b>: Get <a href="download/personal-edition/desktop/">Personal Desktop</a>, a stand-alone single-user app for <a href="https://apps.apple.com/app/apple-store/id1556908618?pt=2114704&ct=website&mt=8">Mac</a>, <a href="https://www.microsoft.com/store/apps/9NLN2T0SX9VF?cid=website">Windows</a>, and <a href="http://localhost:1313/download/personal-edition/desktop/#linux-desktop">Linux</a>.
</p>
<p>
Focalboard can also be installed as a standalone <a href="download/personal-edition/ubuntu/">personal server</a> for development.
<b>For Teams</b>: Check out <a href="https://mattermost.com/boards/">Mattermost Boards</a> with integrated collaboration, for <a href="https://customers.mattermost.com/cloud/signup?utm_source=focalboard&utm_campaign=focalboard">cloud</a> or <a href="https://mattermost.com/deploy/?utm_source=focalboard&utm_campaign=focalboard">self-hosted</a>.
</p>
<p>
<b>For Developers</b>: Fork the source code on <a href="https://github.com/mattermost/focalboard">GitHub</a> and install <a href="download/personal-edition/ubuntu/">personal server</a> for development.
</p>
</div>
<p class="text-center">
<a href="download/personal-edition">
<img src="https://user-images.githubusercontent.com/46905241/121941290-ee355280-cd03-11eb-9b9f-f6f524e4103e.gif" style="width: 100%; max-width: 1200px" />
@ -30,11 +30,11 @@
<div class="homepage-intro__text">
<p>
We're currently in early-access beta, and are looking for feedback. So please <a href="download/personal-edition/">download it today</a> and <a href="https://docs.google.com/forms/d/e/1FAIpQLSdTq7M69Pdlz71CwucaSEG0FCK1M_WRvIbZbPr2imfT2QvUCQ/viewform?usp=sf_link" target="_blank" rel="noopener">let us know what you think</a>.
We welcome your feedback! So please <a href="download/personal-edition/">download it today</a> and <a href="https://docs.google.com/forms/d/e/1FAIpQLSdTq7M69Pdlz71CwucaSEG0FCK1M_WRvIbZbPr2imfT2QvUCQ/viewform?usp=sf_link" target="_blank" rel="noopener">let us know what you think</a>.
</p>
<p>
Focalboard is open source! <a href="https://github.com/mattermost/focalboard" target='_blank'>Check out the source code here</a>, and contribute to the future of this project.
Focalboard is open source! <a href="https://github.com/mattermost/focalboard" target='_blank'>Check out the source code here</a>, and <a href="/contribute/getting-started/">contribute</a> to the future of this project.
</p>
<p>

View File

@ -3440,7 +3440,7 @@ table>tbody>tr:nth-of-type(odd) {
transform: skew(0deg, -5deg);
background-image: linear-gradient(-135deg, #1ba4f7 0%, #4641ff 100%);
height: 100%;
min-height: 1500px;
min-height: 1700px;
left: 0;
position: absolute;
top: -15%;