diff --git a/.github/workflows/dev-release.yml b/.github/workflows/dev-release.yml
index e12a7396b..a4d7e3e82 100644
--- a/.github/workflows/dev-release.yml
+++ b/.github/workflows/dev-release.yml
@@ -68,7 +68,7 @@ jobs:
path: ${{ github.workspace }}/linux/dist/focalboard-linux.tar.gz
macos:
- runs-on: macos-10.15
+ runs-on: macos-11
steps:
@@ -101,7 +101,7 @@ jobs:
- name: Build macOS
run: make mac-app
env:
- DEVELOPER_DIR: /Applications/Xcode_12.4.app/Contents/Developer
+ DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer
BUILD_NUMBER: ${{ github.run_id }}
- name: Upload macOS package
diff --git a/.github/workflows/prod-release.yml b/.github/workflows/prod-release.yml
index 293b7a8e0..1d9facabe 100644
--- a/.github/workflows/prod-release.yml
+++ b/.github/workflows/prod-release.yml
@@ -63,7 +63,7 @@ jobs:
path: ${{ github.workspace }}/linux/dist/focalboard-linux.tar.gz
macos:
- runs-on: macos-10.15
+ runs-on: macos-11
steps:
@@ -96,7 +96,7 @@ jobs:
- name: Build macOS
run: make mac-app
env:
- DEVELOPER_DIR: /Applications/Xcode_12.4.app/Contents/Developer
+ DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer
BUILD_NUMBER: ${{ github.run_id }}
- name: Upload macOS package
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8c90151b2..8df8e6072 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,33 +1,49 @@
# Code Contribution Guidelines
-Thank you for your interest in contributing! Please see the [Focalboard Contribution Guide](https://www.focalboard.com/contribute/getting-started/) which describes the process for making code contributions, and [join our Focalboard community channel](https://community.mattermost.com/core/channels/focalboard) to ask questions from community members and the core team.
+Thank you for your interest in contributing! Please see the [Focalboard Contribution Guide](https://mattermost.github.io/focalboard/) which describes the process for making code contributions, and [join our Focalboard community channel](https://community.mattermost.com/core/channels/focalboard) to ask questions from community members and the core team.
-When you submit a pull request, it goes through a [code review process outlined here](https://www.focalboard.com/contribute/getting-started/code-review/).
+When you submit a pull request, it goes through a [code review process outlined here](https://mattermost.github.io/focalboard/code-review).
# Updating Changelog
-After a noteable bug fix or an improvement you've submitted is merged, please consider making a pull request to the [CHANGELOG.md](https://github.com/mattermost/focalboard/blob/main/CHANGELOG.md) under the next release section.
+After a noteable bug fix or an improvement you've submitted is merged, please consider making a pull request to the [CHANGELOG.md](https://github.com/mattermost/focalboard/blob/main/CHANGELOG.md) under the next release section.
# Bug reports
Please file a [GitHub issue](https://github.com/mattermost/focalboard/issues) if anything isn't working the way you expect.
-# Documentation
+# Documentation
You can contribute to our documentation in the [Mattermost Boards documentation](https://docs.mattermost.com/guides/boards.html). Read more about how the contribution process works in the repo [README](https://github.com/mattermost/docs/blob/master/README.md). Visit the [Documentation Working Group channel](https://community.mattermost.com/core/channels/dwg-documentation-working-group) on our Community server if you have any questions!
# Contributors
-**Quality Assurance Contributors**: Correctly files verified bug reports.
+**Core Committers**: A core committer is a maintainer on the Focalboard project who has merge access to the repositories. They are responsible for reviewing pull requests, cultivating the developer community, and guiding the technical vision of Focalboard. If you have a question or need some help, these are the people to ask.
-- [chenilim](https://github.com/chenilim)
+- **Scott Bishel**
+ - @scott.bishel on [community.mattermost.com](https://community.mattermost.com/core/messages/@scott.bishel) and [@sbishel](https://github.com/sbishel) on GitHub
+- **Jesús Espino**
+ - @jesus.espino on [community.mattermost.com](https://community.mattermost.com/core/messages/@jesus.espino) and [@jespino](https://github.com/jespino) on GitHub
+- **Doug Lauder**
+ - @doug.lauder on [community.mattermost.com](https://community.mattermost.com/core/messages/@doug.lauder) and [@wiggin77](https://github.com/wiggin77) on GitHub
+- **Miguel de la Cruz**
+ - @miguel.delacruz on [community.mattermost.com](https://community.mattermost.com/core/messages/@miguel.delacruz) and [@mgdelacroix](https://github.com/mgdelacroix) on GitHub
+- **Harshil Sharma**
+ - @harshil.sharma on [community.mattermost.com](https://community.mattermost.com/core/messages/@harshil.sharma) and [@harshilsharma63](https://github.com/harshilsharma63) on GitHub
+- **Chen Lim**
+ - @chen-i.lim on [community.mattermost.com](https://community.mattermost.com/core/messages/@chen-i.lim) and [@chenilim](https://github.com/chenilim) on GitHub
+
+**Quality Assurance**: Checks quality of code and verifies bug fixes.
+
+- **Ogi Marušić**
+ - @ogi.marusic on [community.mattermost.com](https://community.mattermost.com/core/messages/@ogi.marusic) and [@ogi-m](https://github.com/ogi-m) on GitHub
**Community Organizers**: Responds with comments to Bug Reports, Issues, and Pull Requests with tags, edits and mentions to Core Committers and contributors.
-- [it33](https://github.com/it33)
+- **Winson Wu**
+ - @winson.wu on [community.mattermost.com](https://community.mattermost.com/core/messages/@winson.wu) and [@wuwinson](https://github.com/wuwinson) on GitHub
-**Core Committers**: Updates project. Approves and merges pull requests from contributors.
+**Documentation**: Verifies documentation changes, and updates documentation for new features.
-- [chenilim](https://github.com/chenilim)
-- [jespino](https://github.com/jespino)
-- [coreyhulen](https://github.com/coreyhulen)
+- **Justine Geffen**
+ - @justine.geffen on [community.mattermost.com](https://community.mattermost.com/core/messages/@justine.geffen) and [@justinegeffen ](https://github.com/justinegeffen) on GitHub
diff --git a/README.md b/README.md
index 1efd5928b..ca2800b8b 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ Download the latest server release from [GitHub releases](https://github.com/mat
## Building the server
-Most development can be done on the Personal Server edition. Please refer to the [Developer's Tips & Tricks](https://www.focalboard.com/contribute/getting-started/dev-tips/) for more detailed steps. Here's a summary:
+Most development can be done on the Personal Server edition. Please refer to the [Developer's Tips & Tricks](https://mattermost.github.io/focalboard/dev-tips) for more detailed steps. Here's a summary:
First, install basic dependencies:
* Go 1.15+
@@ -72,7 +72,7 @@ You can build standalone apps that package the server to run locally against SQL
* Mac:
* `make mac-app`
* run `mac/dist/Focalboard.app`
- * *Requires: macOS Catalina (10.15)+, Xcode 12+.*
+ * *Requires: macOS 11.3+, Xcode 13.2.1+*
* Linux:
* Install webgtk dependencies
* `sudo apt-get install libgtk-3-dev`
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 000000000..74ecfc801
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,3 @@
+title: Focalboard Developers
+google_analytics: UA-64458817-2
+theme: jekyll-theme-architect
\ No newline at end of file
diff --git a/website/site/content/contribute/getting-started/code-review.md b/docs/code-review.md
similarity index 79%
rename from website/site/content/contribute/getting-started/code-review.md
rename to docs/code-review.md
index 734d5696b..0931d11a4 100644
--- a/website/site/content/contribute/getting-started/code-review.md
+++ b/docs/code-review.md
@@ -1,19 +1,10 @@
----
-title: "Code Review"
-date: 2021-02-03T08:00:00-00:00
-weight: 5
-subsection: Getting Started
----
+# Code Review Checklist
-Currently, all changes to the product must be reviewed by a [core committer](/contribute/getting-started/core-committers/#core-committers).
+Currently, all changes to the product must be reviewed by a [core committer](core-committers.md).
-
+## If you are a community member seeking a review
-If you are a community member seeking a review
-----------------------------------------------
-
-1. Submit your pull request.
+1. Submit your pull request (PR).
* Follow the [contribution checklist](../contribution-checklist/).
2. Wait for a reviewer to be assigned.
* Product managers are on the lookout for new pull requests and usually handle this for you automatically.
@@ -23,16 +14,15 @@ If you are a community member seeking a review
3. [Wait for a review](#if-you-are-awaiting-a-review).
* Expect some interaction with at least one reviewer within 5 business days (weekdays, Monday through Friday, excluding [statutory holidays](https://docs.mattermost.com/process/working-at-mattermost.html#holidays)).
* Keep in mind that core committers are geographically distributed around the world and likely in a different time zone than your own.
- * If no interaction has occurred after 5 business days, please at-mention a reviewer with a comment on your PR.
+ * If no interaction has occurred after 5 business days, please [at-mention](https://github.blog/2011-03-23-mention-somebody-they-re-notified/) a reviewer with a comment on your pull request.
4. Make any necessary changes.
* If a reviewer requests changes, your pull request will disappear from their queue of reviews.
- * Once you've addressed the concerns, please at-mention the reviewer with a comment on your PR.
+ * Once you've addressed the concerns, please at-mention the reviewer with a comment on your pull request.
5. Wait for your code to be merged.
* Larger pull requests may require more time to review.
* Once all reviewers have approved your changes, they will handle merging your code.
-If you are awaiting a review
-----------------------------
+## If you are awaiting a review
1. Wait patiently for reviews to complete.
* Expect some interaction with each of your reviewers within 5 business days.
@@ -41,8 +31,7 @@ If you are awaiting a review
* If a reviewer requests changes, your pull request will disappear from their queue of reviews.
* Once you've addressed the concerns, assign them as a reviewer again to put your pull request back in their queue.
-If you are a core committer asked to give a review
---------------------------------------------------
+## If you are a core committer asked to give a review
1. Respond promptly to requested reviews.
* Assume the requested review is urgent and blocking unless explicitly stated otherwise.
diff --git a/website/site/content/contribute/getting-started/contribution-checklist.md b/docs/contribution-checklist.md
similarity index 57%
rename from website/site/content/contribute/getting-started/contribution-checklist.md
rename to docs/contribution-checklist.md
index fcf981a00..ac1d60dac 100644
--- a/website/site/content/contribute/getting-started/contribution-checklist.md
+++ b/docs/contribution-checklist.md
@@ -1,27 +1,16 @@
----
-title: "Contribution Checklist"
-date: 2021-02-03T08:00:00-00:00
-weight: 2
-subsection: Getting Started
----
+# Contribution Checklist
Thanks for your interest in contributing code!
-
-
-
-
Follow this checklist for submitting a pull request (PR):
1. You've signed the [Contributor License Agreement](http://www.mattermost.org/mattermost-contributor-agreement/), so you can be added to the Mattermost [Approved Contributor List](https://docs.google.com/spreadsheets/d/1NTCeG-iL_VS9bFqtmHSfwETo5f-8MQ7oMDE5IUYJi_Y/pubhtml?gid=0&single=true).
2. Your ticket is a Help Wanted GitHub issue for the project you're contributing to.
- - If not, follow the process [here](/contribute/getting-started/contributions-without-ticket).
+ - If not, follow the process [here](contributions-without-ticket.md).
3. Your code is thoroughly tested, including appropriate unit tests, and manual testing.
4. If applicable, user interface strings are included in the localization file ([en.json](https://github.com/mattermost/focalboard/blob/main/webapp/i18n/en.json))
- In the webapp folder, run `npm run i18n-extract` to generate the new/updated strings.
5. The PR is submitted against the `main` branch from your fork.
6. The PR title begins with the GitHub Ticket ID (e.g. `[GH-394]`) and the summary template is filled out.
-Once submitted, the automated build process must pass in order for the PR to be accepted. Any errors or failures need to be addressed in order for the PR to be accepted. Next, the PR goes through [code review](../code-review/). To learn about the review process for each project, read the `CONTRIBUTING.md` file of that GitHub repository.
-
-
+Once submitted, the automated build process must pass in order for the PR to be accepted. Any errors or failures need to be addressed in order for the PR to be accepted. Next, the PR goes through [code review](code-review.md). To learn about the review process for each project, read the [CONTRIBUTING.md](https://github.com/mattermost/focalboard/blob/main/CONTRIBUTING.md) file of that GitHub repository.
diff --git a/website/site/content/contribute/getting-started/contributions-without-ticket.md b/docs/contributions-without-ticket.md
similarity index 93%
rename from website/site/content/contribute/getting-started/contributions-without-ticket.md
rename to docs/contributions-without-ticket.md
index 9ee9e06f1..e61282b5c 100644
--- a/website/site/content/contribute/getting-started/contributions-without-ticket.md
+++ b/docs/contributions-without-ticket.md
@@ -1,9 +1,4 @@
----
-title: "Contributions Without Ticket"
-date: 2021-02-03T08:00:00-00:00
-weight: 3
-subsection: Getting Started
----
+# Contributions Without Ticket
Contributions for minor corrections and improvements without a corresponding `Help Wanted` ticket are welcome. For example, a pull request for a bug or incremental improvement, with less than 20 lines of code change, is usually accepted if the change to existing behaviour is minor.
diff --git a/docs/core-committers.md b/docs/core-committers.md
new file mode 100644
index 000000000..df5f8dea7
--- /dev/null
+++ b/docs/core-committers.md
@@ -0,0 +1,20 @@
+# Core Committers
+
+A core committer is a maintainer on the Focalboard project who has merge access to the repositories. They are responsible for reviewing pull requests, cultivating the developer community, and guiding the technical vision of Focalboard. If you have a question or need some help, these are the people to ask.
+
+## Core Committers
+
+Below is the list of core committers working on Focalboard:
+
+- **Scott Bishel**
+ - @scott.bishel on [community.mattermost.com](https://community.mattermost.com/core/messages/@scott.bishel) and [@sbishel](https://github.com/sbishel) on GitHub
+- **Jesús Espino**
+ - @jesus.espino on [community.mattermost.com](https://community.mattermost.com/core/messages/@jesus.espino) and [@jespino](https://github.com/jespino) on GitHub
+- **Doug Lauder**
+ - @doug.lauder on [community.mattermost.com](https://community.mattermost.com/core/messages/@doug.lauder) and [@wiggin77](https://github.com/wiggin77) on GitHub
+- **Miguel de la Cruz**
+ - @miguel.delacruz on [community.mattermost.com](https://community.mattermost.com/core/messages/@miguel.delacruz) and [@mgdelacroix](https://github.com/mgdelacroix) on GitHub
+- **Harshil Sharma**
+ - @harshil.sharma on [community.mattermost.com](https://community.mattermost.com/core/messages/@harshil.sharma) and [@harshilsharma63](https://github.com/harshilsharma63) on GitHub
+- **Chen Lim**
+ - @chen-i.lim on [community.mattermost.com](https://community.mattermost.com/core/messages/@chen-i.lim) and [@chenilim](https://github.com/chenilim) on GitHub
diff --git a/website/site/content/contribute/getting-started/dev-tips.md b/docs/dev-tips.md
similarity index 88%
rename from website/site/content/contribute/getting-started/dev-tips.md
rename to docs/dev-tips.md
index cd4038f52..d32d79a6f 100644
--- a/website/site/content/contribute/getting-started/dev-tips.md
+++ b/docs/dev-tips.md
@@ -1,11 +1,6 @@
----
-title: "Developer Tips & Tricks"
-date: 2021-02-03T00:08:00-00:00
-weight: 1
-subsection: Getting Started
----
+# Developer Tips and Tricks
-## Install pre-reqs
+## Installation prerequisites
Check that you have recent versions of the basic dependencies installed:
* [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
@@ -16,13 +11,14 @@ Check that you have recent versions of the basic dependencies installed:
On Windows:
* Install [Mingw64](https://chocolatey.org/packages/mingw) via [Chocolatey](https://chocolatey.org/)
-On Mac, to build the Mac app:
+On macOS, to build the Mac app:
* Install [Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12) (v12+)
* Install the Xcode commandline tools, via the IDE or run `xcode-select --install`
On Linux, to build the Linux app:
* `sudo apt-get install libgtk-3-dev`
* `sudo apt-get install libwebkit2gtk-4.0-dev`
+* `sudo apt-get install autoconf dh-autoreconf`
## Clone the project source code
@@ -42,7 +38,7 @@ Then open a browser to `http://localhost:8000` to access it. The port is configu
Once the server is running, you can rebuild just the webapp with `make webapp` (in a separate terminal window), then reload the browser.
-## VSCode Setup
+## VSCode setup
Here's a recommended dev-test loop using VSCode:
* Open a bash terminal window to the project folder
@@ -73,24 +69,22 @@ Debug the Go code in VSCode. This is set up automatically when you launch the se
To start, add a breakpoint to `handleGetBlocks()` in `server/api/api.go`, then refresh the browser to see how data is retrieved.
-## Localization / Internationalization / Translation
+## Localization/Internationalization/Translation
-We use `i18n` to localize the web app. Localized string generally use `intl.formatMessage`.
-
-When adding or modifying localized strings, run `npm run i18n-extract` in `webapp` to rebuild `webapp/i18n/en.json`.
+We use `i18n` to localize the web app. Localized string generally use `intl.formatMessage`. When adding or modifying localized strings, run `npm run i18n-extract` in `webapp` to rebuild `webapp/i18n/en.json`.
Translated strings are stored in other json files under `webapp/i18n`, e.g. `es.json` for Spanish.
## Database
-By default, data is stored in a sqlite datebase `focalboard.db`. You can view and edit this directly using `sqlite3 focalboard.db` from bash.
+By default, data is stored in a sqlite database `focalboard.db`. You can view and edit this directly using `sqlite3 focalboard.db` from bash.
## Unit tests
Before checking-in commits, run: `make ci`, which is simlar to the ci.yml workflow and includes:
* Server unit tests: `make server-test`
* Webapp eslint: `cd webapp; npm run check`
-* Webapp unit tests: `cd webapp; npm run test`
+* Webapp unit tests: `make webapp-test`
* Webapp UI tests: `cd webapp; npm run cypress:ci`
## Running into problems or have questions?
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..f83c9e28d
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,19 @@
+# Focalboard / Mattermost Boards Contributors Guide
+
+Welcome to the [Focalboard](https://www.focalboard.com) / [Mattermost Boards](https://mattermost.com/boards/?utm_source=focalboard) project!
+
+We're very glad you want to check it out and perhaps contribute code our repository in GitHub.
+
+Our goal is to make your experience as great as possible. Follow these simple steps to contribute:
+
+1. [Clone the project from GitHub](https://github.com/mattermost/focalboard) and follow the steps in the README to build. Read the [developer tips & tricks](dev-tips.md) to get started.
+
+2. Find [help wanted tickets in GitHub](https://github.com/mattermost/focalboard/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). Comment to let everyone know you’re working on it, and to allow a core contributor to assign the issue to you. If there’s no ticket for what you want to work on see [contributions without a ticket.](contributions-without-ticket.md).
+
+3. When your changes are ready, run through our [checklist for pull requests](contribution-checklist.md). Note that if it’s your first contribution, there is a standard [CLA](https://www.mattermost.org/mattermost-contributor-agreement/) to sign.
+
+## Just ask if you need help!
+
+You can find us on our [public Focalboard channel](https://community.mattermost.com/core/channels/focalboard) on the Mattermost community server. Also feel free to [file a bug](https://github.com/mattermost/focalboard/issues/new/choose) for any issues you run into, or [start a discussion](https://github.com/mattermost/focalboard/discussions).
+
+We're glad ❤️ you're here! Good luck and have fun!
diff --git a/import/README.md b/import/README.md
index 6905b42ab..a9f15658c 100644
--- a/import/README.md
+++ b/import/README.md
@@ -8,4 +8,4 @@ This subfolder contains scripts to import data from other systems. It is at an e
* Todoist
* Nextcloud Deck
-[Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+[Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/asana/README.md b/import/asana/README.md
index 86dc8a032..055f93d03 100644
--- a/import/asana/README.md
+++ b/import/asana/README.md
@@ -10,4 +10,4 @@ This node app converts an Asana json archive into a Focalboard archive. To use:
## Import scope
-Currently, the script imports all cards from a single board, including their section (column) membership, names, and notes. [Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+Currently, the script imports all cards from a single board, including their section (column) membership, names, and notes. [Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/asana/importAsana.ts b/import/asana/importAsana.ts
index 58ca3cca9..806c1f5f9 100644
--- a/import/asana/importAsana.ts
+++ b/import/asana/importAsana.ts
@@ -3,7 +3,7 @@
import * as fs from 'fs'
import minimist from 'minimist'
import {exit} from 'process'
-import {ArchiveUtils} from '../../webapp/src/blocks/archive'
+import {ArchiveUtils} from '../util/archive'
import {Block} from '../../webapp/src/blocks/block'
import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board'
import {createBoardView} from '../../webapp/src/blocks/boardView'
diff --git a/import/jira/README.md b/import/jira/README.md
index 6eb913a45..c50dc3cd8 100644
--- a/import/jira/README.md
+++ b/import/jira/README.md
@@ -20,4 +20,4 @@ The following aren't currently imported:
* Comments
* Embedded files
-[Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+[Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/jira/jiraImporter.ts b/import/jira/jiraImporter.ts
index e35d33cff..afca95171 100644
--- a/import/jira/jiraImporter.ts
+++ b/import/jira/jiraImporter.ts
@@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import * as fs from 'fs'
import {exit} from 'process'
-import {ArchiveUtils} from '../../webapp/src/blocks/archive'
+import {ArchiveUtils} from '../util/archive'
import {Block} from '../../webapp/src/blocks/block'
import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board'
import {createBoardView} from '../../webapp/src/blocks/boardView'
diff --git a/import/nextcloud-deck/README.md b/import/nextcloud-deck/README.md
index fa3442c32..283486a1a 100644
--- a/import/nextcloud-deck/README.md
+++ b/import/nextcloud-deck/README.md
@@ -11,6 +11,6 @@ This node app converts data from a Nextcloud Server with the [app Deck](https://
## Import scope
-Currently, the script imports all cards from a single board, including their stacks (column) membership, labels, names, descriptions, duedate and comments. [Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+Currently, the script imports all cards from a single board, including their stacks (column) membership, labels, names, descriptions, duedate and comments. [Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/notion/README.md b/import/notion/README.md
index 985bbe3e7..05148568e 100644
--- a/import/notion/README.md
+++ b/import/notion/README.md
@@ -15,4 +15,4 @@ Currently, the script imports all cards from a single board, including their pro
The Notion export format does not preserve property types, so the script currently imports all card properties as a Select type. You can change the type after importing into Focalboard.
-[Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+[Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/notion/importNotion.ts b/import/notion/importNotion.ts
index 4f48acbbf..10a71e887 100644
--- a/import/notion/importNotion.ts
+++ b/import/notion/importNotion.ts
@@ -3,7 +3,7 @@ import * as fs from 'fs'
import minimist from 'minimist'
import path from 'path'
import {exit} from 'process'
-import {ArchiveUtils} from '../../webapp/src/blocks/archive'
+import {ArchiveUtils} from '../util/archive'
import {Block} from '../../webapp/src/blocks/block'
import {IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board'
import {createBoardView} from '../../webapp/src/blocks/boardView'
diff --git a/import/todoist/importTodoist.ts b/import/todoist/importTodoist.ts
index bbbb338ce..a881b59bb 100644
--- a/import/todoist/importTodoist.ts
+++ b/import/todoist/importTodoist.ts
@@ -3,7 +3,7 @@
import * as fs from 'fs'
import minimist from 'minimist'
import {exit} from 'process'
-import {ArchiveUtils} from '../../webapp/src/blocks/archive'
+import {ArchiveUtils} from '../util/archive'
import {Block} from '../../webapp/src/blocks/block'
import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board'
import {createBoardView} from '../../webapp/src/blocks/boardView'
diff --git a/import/trello/README.md b/import/trello/README.md
index 14035274e..003604e12 100644
--- a/import/trello/README.md
+++ b/import/trello/README.md
@@ -11,6 +11,6 @@ This node app converts a Trello json archive into a Focalboard archive. To use:
## Import scope
-Currently, the script imports all cards from a single board, including their list (column) membership, names, and descriptions. [Contribute code](https://www.focalboard.com/contribute/getting-started/) to expand this.
+Currently, the script imports all cards from a single board, including their list (column) membership, names, and descriptions. [Contribute code](https://mattermost.github.io/focalboard/) to expand this.
diff --git a/import/trello/importTrello.ts b/import/trello/importTrello.ts
index 7157d0f9c..afa95cba3 100644
--- a/import/trello/importTrello.ts
+++ b/import/trello/importTrello.ts
@@ -3,7 +3,7 @@
import * as fs from 'fs'
import minimist from 'minimist'
import {exit} from 'process'
-import {ArchiveUtils} from '../../webapp/src/blocks/archive'
+import {ArchiveUtils} from '../util/archive'
import {Block} from '../../webapp/src/blocks/block'
import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board'
import {createBoardView} from '../../webapp/src/blocks/boardView'
diff --git a/import/util/archive.ts b/import/util/archive.ts
new file mode 100644
index 000000000..e4502d3f4
--- /dev/null
+++ b/import/util/archive.ts
@@ -0,0 +1,81 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+import {Block} from '../../webapp/src/blocks/block'
+
+interface ArchiveHeader {
+ version: number
+ date: number
+}
+
+interface ArchiveLine {
+ type: string,
+ data: unknown,
+}
+
+// This schema allows the expansion of additional line types in the future
+interface BlockArchiveLine extends ArchiveLine {
+ type: 'block',
+ data: Block
+}
+
+class ArchiveUtils {
+ static buildBlockArchive(blocks: readonly Block[]): string {
+ const header: ArchiveHeader = {
+ version: 1,
+ date: Date.now(),
+ }
+
+ const headerString = JSON.stringify(header)
+ let content = headerString + '\n'
+ for (const block of blocks) {
+ const line: BlockArchiveLine = {
+ type: 'block',
+ data: block,
+ }
+ const lineString = JSON.stringify(line)
+ content += lineString
+ content += '\n'
+ }
+
+ return content
+ }
+
+ static parseBlockArchive(contents: string): Block[] {
+ const blocks: Block[] = []
+ const allLineStrings = contents.split('\n')
+ if (allLineStrings.length >= 2) {
+ const headerString = allLineStrings[0]
+ const header = JSON.parse(headerString) as ArchiveHeader
+ if (header.date && header.version >= 1) {
+ const lineStrings = allLineStrings.slice(1)
+ let lineNum = 2
+ for (const lineString of lineStrings) {
+ if (!lineString) {
+ // Ignore empty lines, e.g. last line
+ continue
+ }
+ const line = JSON.parse(lineString) as ArchiveLine
+ if (!line || !line.type || !line.data) {
+ throw new Error(`ERROR parsing line ${lineNum}`)
+ }
+ switch (line.type) {
+ case 'block': {
+ const blockLine = line as BlockArchiveLine
+ const block = blockLine.data
+ blocks.push(block)
+ break
+ }
+ }
+
+ lineNum += 1
+ }
+ } else {
+ throw new Error('ERROR parsing header')
+ }
+ }
+
+ return blocks
+ }
+}
+
+export {ArchiveHeader, ArchiveLine, BlockArchiveLine, ArchiveUtils}
\ No newline at end of file
diff --git a/mac/Focalboard.xcodeproj/project.pbxproj b/mac/Focalboard.xcodeproj/project.pbxproj
index 4adf28c4e..8ad05f0a9 100644
--- a/mac/Focalboard.xcodeproj/project.pbxproj
+++ b/mac/Focalboard.xcodeproj/project.pbxproj
@@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */
8014951C261598D600A51700 /* PortUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8014951B261598D600A51700 /* PortUtils.swift */; };
804E57FC27441B6B008526F0 /* whatsnew.txt in Resources */ = {isa = PBXBuildFile; fileRef = 804E57FB27441B6B008526F0 /* whatsnew.txt */; };
+ 80672A8B27BAFEBA00257B8C /* DownloadHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80672A8A27BAFEBA00257B8C /* DownloadHandler.swift */; };
80D6DEBB252E13CB00AEED9E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DEBA252E13CB00AEED9E /* AppDelegate.swift */; };
80D6DEBD252E13CB00AEED9E /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D6DEBC252E13CB00AEED9E /* ViewController.swift */; };
80D6DEBF252E13CD00AEED9E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 80D6DEBE252E13CD00AEED9E /* Assets.xcassets */; };
@@ -42,6 +43,7 @@
/* Begin PBXFileReference section */
8014951B261598D600A51700 /* PortUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortUtils.swift; sourceTree = ""; };
804E57FB27441B6B008526F0 /* whatsnew.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = whatsnew.txt; sourceTree = ""; };
+ 80672A8A27BAFEBA00257B8C /* DownloadHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadHandler.swift; sourceTree = ""; };
80D6DEB7252E13CB00AEED9E /* Focalboard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Focalboard.app; sourceTree = BUILT_PRODUCTS_DIR; };
80D6DEBA252E13CB00AEED9E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
80D6DEBC252E13CB00AEED9E /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
@@ -116,6 +118,7 @@
80F8BF572624EB0C00FF3943 /* Globals.swift */,
8014951B261598D600A51700 /* PortUtils.swift */,
80D6DEBC252E13CB00AEED9E /* ViewController.swift */,
+ 80672A8A27BAFEBA00257B8C /* DownloadHandler.swift */,
80F174B62788C1A2000A9EEA /* CustomWKWebView.swift */,
80F8BF4F2624E1BB00FF3943 /* WhatsNewViewController.swift */,
804E57FB27441B6B008526F0 /* whatsnew.txt */,
@@ -303,6 +306,7 @@
80F8BF502624E1BB00FF3943 /* WhatsNewViewController.swift in Sources */,
80F174B72788C1A2000A9EEA /* CustomWKWebView.swift in Sources */,
80F8BF582624EB0C00FF3943 /* Globals.swift in Sources */,
+ 80672A8B27BAFEBA00257B8C /* DownloadHandler.swift in Sources */,
80D6DF18252F9BDE00AEED9E /* AutoSaveWindowController.swift in Sources */,
80D6DEBD252E13CB00AEED9E /* ViewController.swift in Sources */,
80D6DEBB252E13CB00AEED9E /* AppDelegate.swift in Sources */,
@@ -403,7 +407,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MACOSX_DEPLOYMENT_TARGET = 11.3;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -458,7 +462,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MACOSX_DEPLOYMENT_TARGET = 11.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
diff --git a/mac/Focalboard/DownloadHandler.swift b/mac/Focalboard/DownloadHandler.swift
new file mode 100644
index 000000000..7b5afe033
--- /dev/null
+++ b/mac/Focalboard/DownloadHandler.swift
@@ -0,0 +1,40 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+
+import Foundation
+import WebKit
+
+class DownloadHandler: NSObject, WKDownloadDelegate {
+ func download(_ download: WKDownload, decideDestinationUsing response: URLResponse, suggestedFilename: String, completionHandler: @escaping (URL?) -> Void) {
+ DispatchQueue.main.async {
+ // Let user select location of file
+ let savePanel = NSSavePanel()
+ savePanel.canCreateDirectories = true
+ savePanel.nameFieldStringValue = suggestedFilename
+ // BUGBUG: Specifying the allowedFileTypes causes Catalina to hang / error out
+ //savePanel.allowedFileTypes = [".boardsarchive"]
+ savePanel.begin { (result) in
+ if result.rawValue == NSApplication.ModalResponse.OK.rawValue,
+ let fileUrl = savePanel.url {
+ if (FileManager.default.fileExists(atPath: fileUrl.path)) {
+ // HACKHACK: WKWebView doesn't appear to overwrite files, so delete exsiting files first
+ do {
+ try FileManager.default.removeItem(at: fileUrl)
+ } catch {
+ let alert = NSAlert()
+ alert.messageText = "Unable to replace \(fileUrl.path)"
+ alert.addButton(withTitle: "OK")
+ alert.alertStyle = .warning
+ alert.runModal()
+ }
+ }
+ completionHandler(fileUrl)
+ }
+ }
+ }
+ }
+
+ func downloadDidFinish(_ download: WKDownload) {
+ NSLog("downloadDidFinish")
+ }
+}
diff --git a/mac/Focalboard/ViewController.swift b/mac/Focalboard/ViewController.swift
index a35685c3e..0c6f98c4c 100644
--- a/mac/Focalboard/ViewController.swift
+++ b/mac/Focalboard/ViewController.swift
@@ -12,6 +12,7 @@ class ViewController:
@IBOutlet var webView: CustomWKWebView!
private var didLoad = false
private var refreshWebViewOnLoad = true
+ private let downloadHandler = DownloadHandler()
override func viewDidLoad() {
super.viewDidLoad()
@@ -100,60 +101,6 @@ class ViewController:
webView.load(request)
}
- private func downloadJsonUrl(_ url: URL) {
- NSLog("downloadJsonUrl")
- let prefix = "data:text/json,"
- let urlString = url.absoluteString
- let encodedJson = String(urlString[urlString.index(urlString.startIndex, offsetBy: prefix.lengthOfBytes(using: .utf8))...])
- guard let json = encodedJson.removingPercentEncoding else {
- return
- }
-
- // Form file name
- let dateFormatter = DateFormatter()
- dateFormatter.dateFormat = "yyyy-M-d"
- let dateString = dateFormatter.string(from: Date())
- let filename = "archive-\(dateString).focalboard"
-
- // Save file
- let savePanel = NSSavePanel()
- savePanel.canCreateDirectories = true
- savePanel.nameFieldStringValue = filename
- // BUGBUG: Specifying the allowedFileTypes causes Catalina to hang / error out
- //savePanel.allowedFileTypes = [".focalboard"]
- savePanel.begin { (result) in
- if result.rawValue == NSApplication.ModalResponse.OK.rawValue,
- let fileUrl = savePanel.url {
- try? json.write(to: fileUrl, atomically: true, encoding: .utf8)
- }
- }
- }
-
- private func downloadCsvUrl(_ url: URL) {
- NSLog("downloadCsvUrl")
- let prefix = "data:text/csv;charset=utf-8,"
- let urlString = url.absoluteString
- let encodedContents = String(urlString[urlString.index(urlString.startIndex, offsetBy: prefix.lengthOfBytes(using: .utf8))...])
- guard let contents = encodedContents.removingPercentEncoding else {
- return
- }
-
- let filename = "data.csv"
-
- // Save file
- let savePanel = NSSavePanel()
- savePanel.canCreateDirectories = true
- savePanel.nameFieldStringValue = filename
- // BUGBUG: Specifying the allowedFileTypes causes Catalina to hang / error out
- //savePanel.allowedFileTypes = [".focalboard"]
- savePanel.begin { (result) in
- if result.rawValue == NSApplication.ModalResponse.OK.rawValue,
- let fileUrl = savePanel.url {
- try? contents.write(to: fileUrl, atomically: true, encoding: .utf8)
- }
- }
- }
-
func webView(_ webView: WKWebView, runOpenPanelWith parameters: WKOpenPanelParameters, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping ([URL]?) -> Void) {
NSLog("webView runOpenPanel")
let openPanel = NSOpenPanel()
@@ -169,22 +116,30 @@ class ViewController:
}
}
- func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
- if let url = navigationAction.request.url {
- // Intercept archive downloads, and present native UI
- if (url.absoluteString.hasPrefix("data:text/json,")) {
- decisionHandler(.cancel)
- downloadJsonUrl(url)
- return
- }
- if (url.absoluteString.hasPrefix("data:text/csv;charset=utf-8,")) {
- decisionHandler(.cancel)
- downloadCsvUrl(url)
- return
- }
- NSLog("decidePolicyFor navigationAction: \(url.absoluteString)")
+ // Handle downloads
+
+ func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {
+ if navigationAction.shouldPerformDownload {
+ decisionHandler(.download, preferences)
+ } else {
+ decisionHandler(.allow, preferences)
}
- decisionHandler(.allow)
+ }
+
+ func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
+ if navigationResponse.canShowMIMEType {
+ decisionHandler(.allow)
+ } else {
+ decisionHandler(.download)
+ }
+ }
+
+ func webView(_ webView: WKWebView, navigationAction: WKNavigationAction, didBecome download: WKDownload) {
+ download.delegate = downloadHandler
+ }
+
+ func webView(_ webView: WKWebView, navigationResponse: WKNavigationResponse, didBecome download: WKDownload) {
+ download.delegate = downloadHandler
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
diff --git a/mattermost-plugin/webapp/src/index.tsx b/mattermost-plugin/webapp/src/index.tsx
index a33d7fdf4..28735de61 100644
--- a/mattermost-plugin/webapp/src/index.tsx
+++ b/mattermost-plugin/webapp/src/index.tsx
@@ -172,7 +172,14 @@ export default class Plugin {
}
if (rudderKey !== '') {
- rudderAnalytics.load(rudderKey, rudderUrl)
+ const rudderCfg = {} as {setCookieDomain: string}
+ if (siteURL && siteURL !== '') {
+ try {
+ rudderCfg.setCookieDomain = new URL(siteURL).hostname
+ // eslint-disable-next-line no-empty
+ } catch (_) {}
+ }
+ rudderAnalytics.load(rudderKey, rudderUrl, rudderCfg)
rudderAnalytics.identify(config?.telemetryid, {}, TELEMETRY_OPTIONS)
diff --git a/server/swagger/README.md b/server/swagger/README.md
index 504df0d02..f349f1129 100644
--- a/server/swagger/README.md
+++ b/server/swagger/README.md
@@ -18,3 +18,27 @@ brew install openapi-generator
# Server API documentation
See the generated [server API documentation here](https://htmlpreview.github.io/?https://github.com/mattermost/focalboard/blob/main/server/swagger/docs/html/index.html).
+
+# Differences for Mattermost Boards
+
+The auto-generated Swagger API documentation is for Focalboard Personal Server. If you are calling the API on Mattermost Boards, the additional changes are:
+
+### API URLs endpoint
+
+The API endpoint is at `https://SERVERNAME/plugins/focalboard/api/`, e.g. `https://community.mattermost.com/plugins/focalboard/api/`.
+
+### Use the Mattermost auth token
+
+Refer to the [Mattermost API documentation here](https://api.mattermost.com/#tag/authentication) on how to obtain the auth token.
+
+Pass this token as a bearer token to the Boards APIs, e.g.
+
+```
+curl -i -H "X-Requested-With: XMLHttpRequest" -H 'Authorization: Bearer abcdefghijklmnopqrstuvwxyz' https://community.mattermost.com/plugins/focalboard/api/v1/workspaces
+```
+
+Note that the `X-Requested-With: XMLHttpRequest` header is required to pass the CSRF check.
+
+# We want to hear from you!
+
+If you are planning on using the Boards API, we would love to hear about what you'd like to do, and how we can improve the APIs in the future. [See here](https://github.com/mattermost/focalboard/discussions/2139) for more details on how to connect.
diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json
index af934a051..b260ef3ea 100644
--- a/webapp/i18n/en.json
+++ b/webapp/i18n/en.json
@@ -11,7 +11,7 @@
"BoardPage.syncFailed": "Board may be deleted or access revoked.",
"BoardTemplateSelector.add-template": "New template",
"BoardTemplateSelector.create-empty-board": "Create empty board",
- "BoardTemplateSelector.delete-template": "Delete template",
+ "BoardTemplateSelector.delete-template": "Delete",
"BoardTemplateSelector.description": "Choose a template to help you get started. Easily customize the template to fit your needs, or create an empty board to start from scratch.",
"BoardTemplateSelector.edit-template": "Edit",
"BoardTemplateSelector.plugin.no-content-description": "Add a board to the sidebar using any of the templates defined below or start from scratch.{lineBreak} Members of \"{workspaceName}\" will have access to boards created here.",
@@ -81,6 +81,7 @@
"CardDialog.delete-confirmation-dialog-heading": "Confirm card delete!",
"CardDialog.editing-template": "You're editing a template.",
"CardDialog.nocard": "This card doesn't exist or is inaccessible.",
+ "CenterPanel.Share": "Share",
"ColorOption.selectColor": "Select {color} Color",
"Comment.delete": "Delete",
"CommentsList.send": "Send",
@@ -161,9 +162,13 @@
"RegistrationLink.description": "Share this link for others to create accounts:",
"RegistrationLink.regenerateToken": "Regenerate token",
"RegistrationLink.tokenRegenerated": "Registration link regenerated",
+ "ShareBoard.PublishDescription": "Publish and share a “read only” link with everyone on the web",
+ "ShareBoard.PublishTitle": "Publish to the web",
+ "ShareBoard.Title": "Share Board",
"ShareBoard.confirmRegenerateToken": "This will invalidate previously shared links. Continue?",
"ShareBoard.copiedLink": "Copied!",
"ShareBoard.copyLink": "Copy link",
+ "ShareBoard.regenerate": "Regenerate token",
"ShareBoard.regenerateToken": "Regenerate token",
"ShareBoard.share": "Publish and share this board with anyone who has the link",
"ShareBoard.tokenRegenrated": "Token regenerated",
@@ -232,6 +237,7 @@
"ViewHeader.share-board": "Share board",
"ViewHeader.sort": "Sort",
"ViewHeader.untitled": "Untitled",
+ "ViewHeader.view-header-menu": "View header menu",
"ViewHeader.view-menu": "View menu",
"ViewTitle.hide-description": "hide description",
"ViewTitle.pick-icon": "Pick icon",
diff --git a/webapp/src/app.tsx b/webapp/src/app.tsx
index 794584fe3..2b1934eb1 100644
--- a/webapp/src/app.tsx
+++ b/webapp/src/app.tsx
@@ -42,7 +42,7 @@ declare let window: IAppWindow
const UUID_REGEX = new RegExp(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/)
-const App = React.memo((): JSX.Element => {
+const App = (): JSX.Element => {
const language = useAppSelector(getLanguage)
const loggedIn = useAppSelector(getLoggedIn)
const globalError = useAppSelector(getGlobalError)
@@ -277,6 +277,6 @@ const App = React.memo((): JSX.Element => {
)
-})
+}
-export default App
+export default React.memo(App)
diff --git a/webapp/src/blocks/board.ts b/webapp/src/blocks/board.ts
index 5decb9632..8eb844f4d 100644
--- a/webapp/src/blocks/board.ts
+++ b/webapp/src/blocks/board.ts
@@ -67,6 +67,7 @@ function createBoard(block?: Block): Board {
description: block?.fields.description || '',
icon: block?.fields.icon || '',
isTemplate: block?.fields.isTemplate || false,
+ templateVer: block?.fields.templateVer || 0,
columnCalculations: block?.fields.columnCalculations || [],
cardProperties,
},
diff --git a/webapp/src/components/__snapshots__/centerPanel.test.tsx.snap b/webapp/src/components/__snapshots__/centerPanel.test.tsx.snap
index 6eb6c21c6..7284ee18c 100644
--- a/webapp/src/components/__snapshots__/centerPanel.test.tsx.snap
+++ b/webapp/src/components/__snapshots__/centerPanel.test.tsx.snap
@@ -30,106 +30,110 @@ exports[`components/centerPanel return centerPanel and click on card to show car
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -139,6 +143,21 @@ exports[`components/centerPanel return centerPanel and click on card to show car
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -688,6 +711,21 @@ exports[`components/centerPanel return centerPanel and click on new card to edit
+
+
+
-
-
-
-
- i
-
-
-
-
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -1626,106 +1668,110 @@ exports[`components/centerPanel return centerPanel and press touch ctrl+d for on
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -1735,6 +1781,21 @@ exports[`components/centerPanel return centerPanel and press touch ctrl+d for on
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -2343,6 +2408,21 @@ exports[`components/centerPanel return centerPanel and press touch del for one c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -2951,6 +3035,21 @@ exports[`components/centerPanel return centerPanel and press touch esc for one c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -3559,6 +3662,21 @@ exports[`components/centerPanel return centerPanel and press touch esc for one c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -4167,6 +4289,21 @@ exports[`components/centerPanel return centerPanel and press touch esc for two c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -4775,6 +4916,21 @@ exports[`components/centerPanel return centerPanel and press touch esc for two c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -5383,6 +5543,21 @@ exports[`components/centerPanel return centerPanel and press touch esc for two c
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -5991,6 +6170,21 @@ exports[`components/centerPanel return centerPanel and select one card and click
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -6599,6 +6797,21 @@ exports[`components/centerPanel return centerPanel and select one card and click
+
+
+
-
-
-
-
-
-
- i
-
-
-
+
+
+
+ hide description
+
+
-
-
-
-
+
+ i
+
+
+
+
+
+
+
+
+
+
+
-
- description
+
+ description
+
-
+
@@ -7207,6 +7424,21 @@ exports[`components/centerPanel should match snapshot for Gallery 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ description
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No name
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
- i
-
+
+
+
+
+
+ i
+
+
+ card1
-
+
+
+
+
+
+
+
+`;
+
+exports[`components/centerPanel should match snapshot for Kanban, not shared 1`] = `
+
-
- )
-})
-
-export default ShareBoardComponent
diff --git a/webapp/src/components/sidebar/__snapshots__/sidebarSettingsMenu.test.tsx.snap b/webapp/src/components/sidebar/__snapshots__/sidebarSettingsMenu.test.tsx.snap
index 53c0da2b1..5c2fb9bba 100644
--- a/webapp/src/components/sidebar/__snapshots__/sidebarSettingsMenu.test.tsx.snap
+++ b/webapp/src/components/sidebar/__snapshots__/sidebarSettingsMenu.test.tsx.snap
@@ -259,7 +259,7 @@ exports[`components/sidebar/SidebarSettingsMenu imports menu open should match s
Random icons
)
-})
+}
const valueSelectorStyle = {
...getSelectBaseStyle(),
@@ -200,4 +200,4 @@ function ValueSelector(props: Props): JSX.Element {
)
}
-export default ValueSelector
+export default React.memo(ValueSelector)
diff --git a/website/site/config.toml b/website/site/config.toml
index f931b0615..e16fc1cd7 100644
--- a/website/site/config.toml
+++ b/website/site/config.toml
@@ -72,7 +72,7 @@ pygmentsStyle = "manni"
weight = 2
[[menu.postpend]]
- url = "/contribute/getting-started"
+ url = "https://mattermost.github.io/focalboard/"
name = "Contribute"
weight = 3
@@ -125,7 +125,7 @@ pygmentsStyle = "manni"
[[params.intro.item]]
title = "Contribute"
description = "Help build the future of productivity and submit code directly to the Focalboard open-source project."
- url = "contribute/getting-started"
+ url = "https://mattermost.github.io/focalboard/"
button = "Start Contributing"
icon = "/img/contribute-icon.svg"
draft = false
diff --git a/website/site/content/blog/2021-4-27-Mattermost-Focalboard-early-preview.md b/website/site/content/blog/2021-4-27-Mattermost-Focalboard-early-preview.md
index 61065fed2..ba70bda46 100644
--- a/website/site/content/blog/2021-4-27-Mattermost-Focalboard-early-preview.md
+++ b/website/site/content/blog/2021-4-27-Mattermost-Focalboard-early-preview.md
@@ -56,7 +56,7 @@ Please [get in touch](https://www.focalboard.com/feedback/)!
## Want to Contribute?
We’d love your help!
-Help shape the future of Focalboard by contributing ideas, bug reports, and code. Check out our [community page](https://www.focalboard.com/contribute/getting-started/) or [GitHub repo](https://github.com/mattermost/focalboard) to get started.
+Help shape the future of Focalboard by contributing ideas, bug reports, and code. Check out our [community page](https://mattermost.github.io/focalboard/) or [GitHub repo](https://github.com/mattermost/focalboard) to get started.
You can also browse GitHub tickets with a “[help wanted](https://github.com/mattermost/focalboard/issues?q=is%3Aissue+is%3Aopen+label%3A%22Up+for+grabs%22)” tag to see what projects are available.
diff --git a/website/site/content/blog/2021-5-13-Focalboard-the-road-to-v1.md b/website/site/content/blog/2021-5-13-Focalboard-the-road-to-v1.md
index 5173fc1ad..a6852d638 100644
--- a/website/site/content/blog/2021-5-13-Focalboard-the-road-to-v1.md
+++ b/website/site/content/blog/2021-5-13-Focalboard-the-road-to-v1.md
@@ -64,7 +64,7 @@ Continuing to get feedback from you, our community is vital to us. Focalboard (a
We’d love your help!
-Help shape the future of Focalboard by contributing ideas, bug reports, and code. Check out our [community page](https://www.focalboard.com/contribute/getting-started/) or [GitHub repo](https://github.com/mattermost/focalboard) to get started.
+Help shape the future of Focalboard by contributing ideas, bug reports, and code. Check out our [community page](https://mattermost.github.io/focalboard/) or [GitHub repo](https://github.com/mattermost/focalboard) to get started.
You can also browse GitHub tickets with a “[up for grabs](https://github.com/mattermost/focalboard/issues?q=is%3Aissue+is%3Aopen+label%3A%22Up+for+grabs%22)” tag to see what projects are available.
diff --git a/website/site/content/contribute/getting-started/_index.md b/website/site/content/contribute/getting-started/_index.md
deleted file mode 100644
index ab76d4178..000000000
--- a/website/site/content/contribute/getting-started/_index.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: "Getting Started"
-date: "2018-05-19T12:01:23-04:00"
-section: "contribute"
-weight: 1
----
-
-Welcome to the Focalboard project!
-
-We're very glad you want to check it out and perhaps contribute code our repository in GitHub.
-
-Our goal is to make your experience as great as possible. Follow these simple steps to contribute:
-
-{{< bignumber number="1" title="Set up your developer machine" content="[Clone the project from GitHub](https://github.com/mattermost/focalboard) and follow the steps in the README to build. Read the [developer tips & tricks](dev-tips) to get started." >}}
-
-{{< bignumber number="2" title="Select a ticket" content="Find [help wanted tickets in GitHub](https://github.com/mattermost/focalboard/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22). Comment to let everyone know you’re working on it. If there’s no ticket for what you want to work on see [contributions without a ticket.](/contribute/getting-started/contributions-without-ticket)" >}}
-
-{{< bignumber number="3" title="Start developing" content="When your changes are ready, run through our [checklist for pull requests](/contribute/getting-started/contribution-checklist). Note that if it’s your first contribution, there is a standard [CLA](https://www.mattermost.org/mattermost-contributor-agreement/) to sign." >}}
diff --git a/website/site/content/contribute/getting-started/core-committers.md b/website/site/content/contribute/getting-started/core-committers.md
deleted file mode 100644
index 5172aba5c..000000000
--- a/website/site/content/contribute/getting-started/core-committers.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: "Core Committers"
-date: 2021-02-03T08:00:00-00:00
-weight: 4
-subsection: Getting Started
----
-
-A core committer is a maintainer on the Focalboard project who has merge access to the repositories. They are responsible for reviewing pull requests, cultivating the developer community, and guiding the technical vision of Focalboard. If you have a question or need some help, these are the people to ask.
-
-Core Committers
----------------
-
-Below is the list of core committers working on Focalboard:
-
-- **Chen Lim**
- - @chen-i.lim on [community.mattermost.com](https://community.mattermost.com/core/messages/@chen-i.lim) and [@chenilim](https://github.com/chenilim) on GitHub
-- **Jesús Espino**
- - @jesus.espino on [community.mattermost.com](https://community.mattermost.com/core/messages/@jesus.espino) and [@jespino](https://github.com/jespino) on GitHub
-- **Corey Hulen**
- - @corey on [community.mattermost.com](https://community.mattermost.com/core/messages/@corey) and [@coreyhulen](https://github.com/coreyhulen) on GitHub
diff --git a/website/site/content/guide/user/_index.md b/website/site/content/guide/user/_index.md
index 54be42687..cce5309c5 100644
--- a/website/site/content/guide/user/_index.md
+++ b/website/site/content/guide/user/_index.md
@@ -7,7 +7,7 @@ weight: 2
This guide is an overview of the basic features to get you started. Focalboard is an open source project that is being updated continuously.
-[Let us know](/feedback/) if there's a feature you are looking for, or [connect with our vibrant community](/contribute/getting-started/) to help bring it to life.
+[Let us know](/feedback/) if there's a feature you are looking for, or [connect with our vibrant community](https://mattermost.github.io/focalboard/) to help bring it to life.
## Adding new Boards
diff --git a/website/site/layouts/partials/footer.html b/website/site/layouts/partials/footer.html
index e72788d7d..7b625047d 100755
--- a/website/site/layouts/partials/footer.html
+++ b/website/site/layouts/partials/footer.html
@@ -1,6 +1,6 @@