mirror of
https://github.com/mattermost/focalboard.git
synced 2024-12-21 13:38:56 +02:00
Merge branch 'main' into fix-board_deletion_not_found_error
This commit is contained in:
commit
c40df7458d
15
README.md
15
README.md
@ -1,5 +1,14 @@
|
|||||||
# :warning: Announcement: PLEASE READ :warning:
|
# :warning: Announcements
|
||||||
Focalboard will transition to being fully community supported as of **September 15th, 2023**. This Focalboard repository will remain open indefinitely; however, Mattermost won’t be adding any new enhancements, and will only address Sev-1 level bugs until September 15th, 2023.
|
|
||||||
|
Effective September 15th, 2023, the Focalboard plugin will no longer be bundled with Mattermost and will transition to being fully community supported.
|
||||||
|
|
||||||
|
Self-hosted Mattermost instances may continue to use the Focalboard plugin without interruption; however, Mattermost developers will not be adding any new enhancements or bug fixes beyond September 15th, 2023. This Focalboard repository will remain open indefinitely for contributions from the open source community.
|
||||||
|
|
||||||
|
The reason behind these changes is to focus Mattermost developer resources on improving the platform’s performance and core features to ensure Mattermost continues being resilient, stable, and best-in-breed for critical operations.
|
||||||
|
|
||||||
|
You can [learn more about these changes in our forum](https://forum.mattermost.com/t/upcoming-product-changes-to-boards-and-various-plugins/16669).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Focalboard
|
# Focalboard
|
||||||
|
|
||||||
@ -129,7 +138,7 @@ Before checking in commits, run `make ci`, which is similar to the `.gitlab-ci.y
|
|||||||
|
|
||||||
### Translating
|
### 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/).
|
Help translate Focalboard! The plugin is already translated into several languages. We welcome corrections and new language translations submitted against the [appropriate language JSON file](https://github.com/mattermost/focalboard/tree/main/webapp/i18n) in this repository.
|
||||||
|
|
||||||
### Staying informed
|
### Staying informed
|
||||||
|
|
||||||
|
55
docs/board-metrics.md
Normal file
55
docs/board-metrics.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Board metrics
|
||||||
|
|
||||||
|
When you view a board in table or board view, you can use calculations to answer basic metric questions without needing to create complex reports. Hover over the bottom of a column to display the **Calculate** feature, then select the arrow to open the menu options.
|
||||||
|
|
||||||
|
You can use calculations to quickly see:
|
||||||
|
|
||||||
|
- How many story points are planned for a release.
|
||||||
|
- How many tasks have been assigned or not assigned.
|
||||||
|
- How long has the oldest bug been sitting in the backlog.
|
||||||
|
- The count of cards where particular properties are empty (useful to make sure important info isn’t missing).
|
||||||
|
- The sum of estimated developer days for features (to make sure your team isn’t overloaded).
|
||||||
|
- The range of estimated dates (to make sure your milestones all line up).
|
||||||
|
|
||||||
|
The calculation options are:
|
||||||
|
|
||||||
|
* **Count**: Counts the total number of rows in table view or total number of cards in a column in Board view. Applies to any property type.
|
||||||
|
* **Count Empty**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Counts the total number of empty rows per column selected.
|
||||||
|
- Board View: Counts the total number of empty values per property specified within the same column.
|
||||||
|
|
||||||
|
* **Count Not Empty**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Counts the total number of rows with non-empty cells per column selected.
|
||||||
|
- Board View: Counts the total number of non-empty values per property specified within the same column.
|
||||||
|
|
||||||
|
* **Percent Empty**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Percentage of empty rows per column selected.
|
||||||
|
- Board View: Percentage of empty values per property specified within the same column.
|
||||||
|
|
||||||
|
* **Percent Not Empty**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Percentage of rows with non-empty cells per column selected.
|
||||||
|
- Board View: Percentage of non-empty values per property specified within the same column.
|
||||||
|
|
||||||
|
* **Count Value**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Counts the total number of values within the column (helpful for multi-select properties).
|
||||||
|
- Board View: Counts the total number of values per property specified within the same column.
|
||||||
|
|
||||||
|
* **Count Unique Values**: Applies to any property type.
|
||||||
|
|
||||||
|
- Table View: Counts the total number of rows with unique values within the column, omitting any duplicates from the count.
|
||||||
|
- Board View: Counts the total number of unique values per property specified within the same column, omitting any duplicates from the count.
|
||||||
|
|
||||||
|
* **Sum**: The sum of any specified number property within the same column.
|
||||||
|
* **Average**: The average of any specified number property within the same column.
|
||||||
|
* **Median**: The median of any specified number property within the same column.
|
||||||
|
* **Min**: The lowest number of any specified number property within the same column.
|
||||||
|
* **Max**: The highest number of any specified number property within the same column.
|
||||||
|
* **Range**: Displays the lowest and highest number. Requires a number property.
|
||||||
|
* **Earliest Date**: Displays the oldest date. Requires any custom date property or the included "Created time" or "Last updated time".
|
||||||
|
* **Latest Date**: Displays the most recent date. Requires any custom date property or the included "Created time" or "Last updated time".
|
||||||
|
* **Date Range**: The difference between the most recent date and oldest date within the same column. In Table View, it's labeled simply as "Range" for any date property/column. Requires any custom date property or the included "Created time" or "Last updated time".
|
17
docs/create-new-board.md
Normal file
17
docs/create-new-board.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Create a new board
|
||||||
|
|
||||||
|
If none of the standard templates suit your requirements, you can create a blank board. Select the plus icon at the top of the sidebar, then select **Create New Board** to open the template picker and select the **Create empty board** option.
|
||||||
|
|
||||||
|
## Manage board details
|
||||||
|
|
||||||
|
If you've created a board, you can edit that board any time. To name or rename a board, select the title area to edit it.
|
||||||
|
|
||||||
|
To display board description, hover above the board’s title and select **Show description** to activate the show/hide toggle. Once the description field is displayed, select **Add a description** right below the board title to add or edit the description.
|
||||||
|
|
||||||
|
Boards and cards are created with random icons by default. To change or remove icons, select the icon then choose the appropriate action.
|
||||||
|
|
||||||
|
All changes you make to boards and cards are saved immediately.
|
||||||
|
|
||||||
|
## Create a template from a board
|
||||||
|
|
||||||
|
To turn an existing board into a template, hover over the board title in the sidebar. Select the options menu, then select **New template from board**.
|
@ -1,6 +1,8 @@
|
|||||||
# Developer Tips and Tricks
|
# Developer Tips and Tricks
|
||||||
|
|
||||||
These tips and tricks apply to developing the standalone Personal Server of Focalboard. For most features, this is the easiest way to get started working against code that ships across editions. For working with Mattermost Boards, refer to the [Mattermost Boards developer's guide](mattermost-boards-dev-guide.md).
|
These tips and tricks apply to developing the standalone Personal Server of Focalboard. For most features, this is the easiest way to get started working against code that ships across editions.
|
||||||
|
|
||||||
|
For working with the Focalboard plugin, refer to the [Focalboard Plugin Developer's Guide](focalboard-dev-guide.md).
|
||||||
|
|
||||||
## Installation prerequisites
|
## Installation prerequisites
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Mattermost Boards Developer's Guide
|
# Focalboard Plugin Developer's Guide
|
||||||
|
|
||||||
[Mattermost Boards](https://mattermost.com/boards/) is the Focalboard (aka Boards) plugin running in Mattermost. It is pre-packaed, and runs out of the box with Mattermost 6.0 and later.
|
**Important**: Effective September 15th, 2023, Mattermost Boards transitions to being fully community supported as the Focalboard Plugin. Mattermost will no longer be maintaining this plugin - this includes bug fixes and feature additions. Instead, the plugin is open-sourced and made available indefinitely for community contributions in GitHub.
|
||||||
|
|
||||||
To build your own version of it:
|
To build your own version of it:
|
||||||
1. Build [mattermost-plugin](https://github.com/mattermost/focalboard/tree/main/mattermost-plugin) in the [Focalboard repo](https://github.com/mattermost/focalboard)
|
1. Build [mattermost-plugin](https://github.com/mattermost/focalboard/tree/main/mattermost-plugin) in the [Focalboard repo](https://github.com/mattermost/focalboard)
|
||||||
@ -8,7 +8,7 @@ To build your own version of it:
|
|||||||
|
|
||||||
Here are the steps in more detail:
|
Here are the steps in more detail:
|
||||||
|
|
||||||
### Building the Boards plugin
|
### Building the Focalboard plugin
|
||||||
|
|
||||||
Fork the [Focalboard repo](https://github.com/mattermost/focalboard), clone it locally, and follow the steps in the readme to set up your dev environment.
|
Fork the [Focalboard repo](https://github.com/mattermost/focalboard), clone it locally, and follow the steps in the readme to set up your dev environment.
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ First, build and run Mattermost locally:
|
|||||||
5. Add an ENV var `MM_SERVICESETTINGS_SITEURL` with the same site URL used in the config
|
5. Add an ENV var `MM_SERVICESETTINGS_SITEURL` with the same site URL used in the config
|
||||||
6. Run `make run-server` in Mattermost
|
6. Run `make run-server` in Mattermost
|
||||||
|
|
||||||
Now, to build and deploy the Boards plugin:
|
Now, to build and deploy the plugin:
|
||||||
1. Clone / fork [mattermost/focalboard](https://github.com/mattermost/focalboard)
|
1. Clone / fork [mattermost/focalboard](https://github.com/mattermost/focalboard)
|
||||||
2. Install the dependencies (see above)
|
2. Install the dependencies (see above)
|
||||||
3. Run:
|
3. Run:
|
23
docs/focalboard-plugin-end-user-guide.md
Normal file
23
docs/focalboard-plugin-end-user-guide.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Focalboard Plugin End User's Guide
|
||||||
|
|
||||||
|
The Focalboard plugin is a deliverable and task management solution to help teams achieve project milestones using a familiar kanban board structure.
|
||||||
|
|
||||||
|
This user guide is for anyone looking to use Focalboard to:
|
||||||
|
- Align work across the organization and drive milestone achievement such as project planning, execution, and task management.
|
||||||
|
- Keep everyone in your team and organization in the loop to stay on schedule with clearly defined tasks, owners, checklists, and deadlines.
|
||||||
|
- Increase transparency and keep all resources available including documents, images, and important hyperlinks.
|
||||||
|
- Track tasks for sprints and features in roadmap planning.
|
||||||
|
|
||||||
|
The following end user documentation is available:
|
||||||
|
|
||||||
|
- [Get started with board templates](get-started-with-board-templates.md)
|
||||||
|
- [Create a new board](create-new-board.md)
|
||||||
|
- [Link boards to Mattermost channels](link-boards-to-mattermost-channels.md)
|
||||||
|
- [Manage boards](manage-boards.md)
|
||||||
|
- [Work with cards](work-with-cards.md)
|
||||||
|
- [Work with board views](work-with-board-views.md)
|
||||||
|
- [Group, filter, and sort boards](group-filter-sort-boards.md)
|
||||||
|
- [Board metrics](board-metrics.md)
|
||||||
|
- [Share and collaborate](share-collaborate.md)
|
||||||
|
- [Import, export, and back up boards data](import-export-backup-data.md)
|
||||||
|
- [Manage plugin preferences](manage-plugin-preferences.md)
|
47
docs/get-started-with-board-templates.md
Normal file
47
docs/get-started-with-board-templates.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Get started with board templates
|
||||||
|
|
||||||
|
## What's a board?
|
||||||
|
|
||||||
|
A board is a collection of cards to help you manage your projects, organize tasks, and collaborate with your team all in one place. A board contains cards, which typically track tasks or topics, and views, which define how to display the cards, or a subset of them.
|
||||||
|
|
||||||
|
Boards can be displayed and filtered in different views such as kanban, table, calendar, and gallery views to help you visualize work items in the format that makes most sense to you.
|
||||||
|
|
||||||
|
## Start from a board template
|
||||||
|
|
||||||
|
To create a new board, we strongly recommend starting from a standard board template.
|
||||||
|
|
||||||
|
Board templates provide you with a predefined structure so that you can get started quickly. Each template has a different function, but can be customized to suit your use case. When you create a new board from the template picker, select each template’s name to preview it and make sure it suits your requirements. Alternatively, you can create your own board templates.
|
||||||
|
|
||||||
|
Select the plus icon at the top of the sidebar, then select **Create New Board** to open the template picker and select a template or a blank board.
|
||||||
|
|
||||||
|
Standard board templates include:
|
||||||
|
|
||||||
|
- **Content Calendar**: Plan and organize your content creation and publication schedule.
|
||||||
|
- **Company Goals & OKRs**: Plan your company goals and objectives more efficiently.
|
||||||
|
- **Competitive Analysis**: Track and stay ahead of the competition.
|
||||||
|
- **Meeting Agenda**: Use this template for recurring meetings. Queue up items, organize discussions, and plan what to revisit later.
|
||||||
|
- **Personal Goals**: Categorize and plan your personal goals.
|
||||||
|
- **Personal Tasks**: Organize your life and track your personal tasks.
|
||||||
|
- **Project Tasks**: Stay on top of your project tasks, track progress, and set priorities.
|
||||||
|
- **Roadmap**: Plan your roadmap and manage your releases more efficiently.
|
||||||
|
- **Sprint Planner**: Plan your sprints and releases more efficiently.
|
||||||
|
- **Team Retrospective**: Identify what worked well and what can be improved for the future.
|
||||||
|
- **User Research Sessions**: Manage and keep track of all your user research sessions.
|
||||||
|
- **Welcome to Boards!**: Onboarding template with guided tour points to help you quickly ramp up on Focalboard.
|
||||||
|
|
||||||
|
### Edit board templates
|
||||||
|
|
||||||
|
To open the template editor for a specific template, go to the template picker then hover over the custom template and select the pencil icon. Any changes made on the template editor will be automatically saved and visible to team members who have access to the template. If you don't see the pencil icon when hovering over the template, then you don't have the appropriate permissions to edit the template.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
- From v7.2 of the Focalboard plugin, only admins and editors of a custom template can edit the template.
|
||||||
|
- Prior to v7.2 of the plugin, any member of the channel workspace can edit a custom template in the channel. To limit access to the template, create or export the template to a private channel.
|
||||||
|
- Custom templates are fully editable, but standard templates cannot be edited or deleted.
|
||||||
|
|
||||||
|
## Create a template
|
||||||
|
|
||||||
|
To create a new board template select the plus icon at the top of the sidebar to open the template picker, select **Create New Board** and then select **+ New template**.
|
||||||
|
|
||||||
|
## Turn a board into a template
|
||||||
|
|
||||||
|
To turn an existing board into a template, hover over the board title in the sidebar. Select the options menu, then select **New template from board**.
|
79
docs/group-filter-sort-boards.md
Normal file
79
docs/group-filter-sort-boards.md
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Group, filter, and sort boards
|
||||||
|
|
||||||
|
Your boards can be grouped, filtered, and sorted into different views using a range of properties. This gives you a powerful way to track work from various perspectives. For example, easily find tasks assigned to you or a team member using the person or multi-person filters, and keep track of upcoming tasks with date filters.
|
||||||
|
|
||||||
|
## Group cards
|
||||||
|
|
||||||
|
You can group cards on your board if they utilize the **Select** or **Person** property.
|
||||||
|
|
||||||
|
Card grouping is only available in board and table views and you must have at least one **Select** or **Person** property on your board for grouping to work.
|
||||||
|
|
||||||
|
### Apply a group
|
||||||
|
|
||||||
|
To apply a group, select the **Group by** option at the top of the board, then select any available **Select** or **Person** property to group your cards by.
|
||||||
|
|
||||||
|
- In the boards view, cards are automatically grouped into columns by the values from the specified property.
|
||||||
|
- In the table view, grouped cards will appear in individual sections based on the values from the specified property. Select the arrow to the left of the group name to expand or collapse cards in the group.
|
||||||
|
|
||||||
|
### Hide and unhide groups
|
||||||
|
|
||||||
|
- To hide a group, select the options menu **(...)** to the right of any group name, then select **Hide**. Additionally, in table view only, you can hide empty groups by selecting the **Group by** option at the top of the board, then selecting **Hide empty groups**.
|
||||||
|
- To unhide a group, go to the hidden column section towards the right of a board view, select the group you want to unhide, then select **Show**. On table view, select the **Group by** option at the top of the board, then select **Show hidden groups**.
|
||||||
|
|
||||||
|
### Ungroup cards
|
||||||
|
|
||||||
|
To ungroup cards on table view, select the **Group by** option at the top of the board, then select **Ungroup** from the top of the menu. This will return your table to its default state. Cards can be ungrouped in table view only. Ungrouping is not possible on board view since groups are used to determine what to display.
|
||||||
|
|
||||||
|
## Filter cards
|
||||||
|
|
||||||
|
You can filter cards on your board if they utilize any of the following property types:
|
||||||
|
|
||||||
|
- Select
|
||||||
|
- Text
|
||||||
|
- Email
|
||||||
|
- Phone
|
||||||
|
- URL
|
||||||
|
- Date
|
||||||
|
- Person
|
||||||
|
- Multi-person
|
||||||
|
- Created time
|
||||||
|
- Created by
|
||||||
|
- Last updated time
|
||||||
|
- Last updated by
|
||||||
|
|
||||||
|
You must have at least one of the property types listed above on your board for filtering to work.
|
||||||
|
|
||||||
|
To use filters, you must have the above property types already added to your board. Go to **Filter > Add filter**, and select the property you wish to filter by. You can use the modifiers to get even more granular results.
|
||||||
|
|
||||||
|
### Add filters
|
||||||
|
|
||||||
|
To add a filter, select the **Filter** option at the top of the board, then select **+ Add filter**. To change the property to filter by, select the name of the first property, then select another property (if available) from the menu.
|
||||||
|
|
||||||
|
**Specify the filtering criteria**
|
||||||
|
|
||||||
|
- **Includes**: Display cards with any of the specified values.
|
||||||
|
- **Doesn’t include**: Display all cards without any of the specified values.
|
||||||
|
- **Is empty**: Display cards with no values assigned to a property.
|
||||||
|
- **Is not empty**: Display cards with any value assigned to a property.
|
||||||
|
|
||||||
|
To add another filtering layer, repeat the steps above with another property to refine your filtering results. Adding another layer will display cards that only match the criteria from the first layer and the second layer.
|
||||||
|
|
||||||
|
### Delete filters
|
||||||
|
|
||||||
|
To delete a filter, select the **Filter** option at the top of the board, then select **Delete** to the right of each filtering layer. Delete all filtering layers to completely remove filters from the board.
|
||||||
|
|
||||||
|
## Sort cards
|
||||||
|
|
||||||
|
Sort cards by the card name or by any property available on the card.
|
||||||
|
|
||||||
|
Sorting is only available in boards, table, and gallery views.
|
||||||
|
|
||||||
|
### Apply sorting
|
||||||
|
|
||||||
|
To apply a sort, select the **Sort** option at the top of the board, then select an option from the menu. The cards will be sorted in ascending order by default based on the selected option and the **Sort** menu will display an upward pointing arrow next to the selected option.
|
||||||
|
|
||||||
|
To change the sort order to descending order, select the same option again from the **Sort** menu. The cards will now be sorted in descending order and the menu will display a downward pointing arrow next to the selected option.
|
||||||
|
|
||||||
|
### Clear sorting
|
||||||
|
|
||||||
|
To clear a sort, select the **Sort** option at the top of the board, then select the **Manual** option from the top of the menu.
|
147
docs/import-export-backup-data.md
Normal file
147
docs/import-export-backup-data.md
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
# Import, export, and back up data
|
||||||
|
|
||||||
|
## Import data into Focalboard
|
||||||
|
|
||||||
|
You can import data from other tools to use with Focalboard.
|
||||||
|
|
||||||
|
### Import from Asana
|
||||||
|
|
||||||
|
This node app converts an Asana JSON archive into a ``.boardarchive`` file. The script imports all cards from a single board, including their section (column) membership, names, and notes.
|
||||||
|
|
||||||
|
1. Log into your Asana account.
|
||||||
|
2. Select the drop-down menu next to the Asana board's name. Then select **Export/Print > JSON**. This will create an archive file.
|
||||||
|
3. Save the file locally, e.g. to ``asana.json``.
|
||||||
|
4. Open a terminal window on your local machine and clone the focalboard repository to a local directory, e.g. to ``focalboard``: ``git clone https://github.com/mattermost/focalboard focalboard``
|
||||||
|
5. Navigate to ``focalboard/webapp``.
|
||||||
|
6. Run ``npm install``.
|
||||||
|
7. Change directory to ``focalboard/import/asana``.
|
||||||
|
8. Run ``npm install``.
|
||||||
|
9. From within the same folder, run ``npx ts-node importAsana.ts -i <asana.json> -o archive.boardarchive``. This generates the following data:
|
||||||
|
|
||||||
|
```
|
||||||
|
My-MacbookPro:asana macbook$ npx ts-node importAsana.ts -i ~/Downloads/asana.json -o archive.boardarchive
|
||||||
|
Board: 1:1 Meeting Agenda Test
|
||||||
|
Card: [READ ME] Instructions for using this project
|
||||||
|
Card: [EXAMPLE TASK] Feedback on design team presentation
|
||||||
|
Card: [EXAMPLE TASK] Finalize monthly staffing plan
|
||||||
|
Card: [EXAMPLE TASK] Review Q2 launch video outline
|
||||||
|
Card: [EXAMPLE TASK] Mentor a peer
|
||||||
|
|
||||||
|
Found 5 card(s).
|
||||||
|
Exported to archive.boardarchive
|
||||||
|
```
|
||||||
|
|
||||||
|
10. In Focalboard, open the board you want to use for the export.
|
||||||
|
11. Select **Settings > Import archive** and select ``archive.boardarchive``.
|
||||||
|
12. Select **Upload**.
|
||||||
|
13. Return to your board and confirm that your Asana data is now displaying.
|
||||||
|
|
||||||
|
If you don't see your Asana data, an error should be displayed. You can also check log files for errors.
|
||||||
|
|
||||||
|
### Import from Notion
|
||||||
|
|
||||||
|
This node app converts a Notion CSV and markdown export into a ``.boardarchive`` file. The script imports all cards from a single board, including their properties and markdown content.
|
||||||
|
|
||||||
|
**Note**: 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.
|
||||||
|
|
||||||
|
1. From a Notion Board, open the **...** menu at the top right corner of the board.
|
||||||
|
2. Select `Export` and pick `Markdown & CSV` as the export format.
|
||||||
|
3. Save the generated file locally, and unzip the folder.
|
||||||
|
4. Open a terminal window on your local machine and clone the focalboard repository to a local directory, e.g. to ``focalboard``: ``git clone https://github.com/mattermost/focalboard focalboard``
|
||||||
|
5. Navigate to ``focalboard/webapp``.
|
||||||
|
6. Run ``npm install``.
|
||||||
|
7. Change directory to ``focalboard/import/notion``.
|
||||||
|
8. Run ``npm install``.
|
||||||
|
9. From within the same folder, run ``npx ts-node importNotion.ts -i <path to the notion-export folder> -o archive.boardarchive``.
|
||||||
|
10. In Focalboard, open the board you want to use for the export.
|
||||||
|
11. Select **Settings > Import archive** and select ``archive.boardarchive``.
|
||||||
|
12. Select **Upload**.
|
||||||
|
13. Return to your board and confirm that your Notion data is now displaying.
|
||||||
|
|
||||||
|
### Import from Jira
|
||||||
|
|
||||||
|
This node app converts a Jira ``.XML`` export into a ``.boardarchive`` file. The script imports each item as a card into a single board. Users are imported as Select properties, with the name of the user.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
- Jira ``.XML`` export is limited to 1000 issues at a time.
|
||||||
|
- The following aren't currently imported: custom properties, comments, and embedded files.
|
||||||
|
|
||||||
|
1. Open Jira advanced search, and search for all the items to export.
|
||||||
|
2. Select **Export > Export XML**.
|
||||||
|
3. Save the generated file locally, e.g. to ``jira_export.xml``.
|
||||||
|
4. Open a terminal window on your local machine and clone the focalboard repository to a local directory, e.g. to ``focalboard``: ``git clone https://github.com/mattermost/focalboard focalboard``
|
||||||
|
5. Navigate to ``focalboard/webapp``.
|
||||||
|
6. Run ``npm install``.
|
||||||
|
7. Change directory to ``focalboard/import/jira`.
|
||||||
|
8. Run ``npm install``.
|
||||||
|
9. From within the same folder, run ``npx ts-node importJira.ts -i <path-to-jira.xml> -o archive.boardarchive``.
|
||||||
|
10. In Focalboard, open the board you want to use for the export.
|
||||||
|
11. Select **Settings > Import archive** and select ``archive.boardarchive``.
|
||||||
|
12. Select **Upload**.
|
||||||
|
13. Return to your board and confirm that your Jira data is now displaying.
|
||||||
|
|
||||||
|
### Import from Trello
|
||||||
|
|
||||||
|
This node app converts a Trello ``.json`` archive into a ``.boardarchive`` file. The script imports all cards from a single board, including their list (column) membership, names, and descriptions.
|
||||||
|
|
||||||
|
1. From the Trello Board Menu, select **...Show Menu**.
|
||||||
|
2. Select **More > Print and Export > Export to JSON**.
|
||||||
|
3. Save the generated file locally, e.g. to ``trello.json``.
|
||||||
|
4. Open a terminal window on your local machine and clone the focalboard repository to a local directory, e.g. to ``focalboard``: ``git clone https://github.com/mattermost/focalboard focalboard``
|
||||||
|
5. Navigate to ``focalboard/webapp``.
|
||||||
|
6. Run ``npm install``.
|
||||||
|
7. Change directory to ``focalboard/import/trello``.
|
||||||
|
8. Run ``npm install``.
|
||||||
|
9. From within the same folder, run ``npx ts-node importTrello.ts -i <path-to-trello.json> -o archive.boardarchive``.
|
||||||
|
10. In Focalboard, open the board you want to use for the export.
|
||||||
|
11. Select **Settings > Import archive** and select ``archive.boardarchive``.
|
||||||
|
12. Select **Upload**.
|
||||||
|
13. Return to your board and confirm that your Trello data is now displaying.
|
||||||
|
|
||||||
|
### Import from Todoist
|
||||||
|
|
||||||
|
This node app converts a Todoist ``.json`` archive into a ``.boardarchive`` file.
|
||||||
|
|
||||||
|
1. Visit the open source Todoist data export service at https://darekkay.com/todoist-export/.
|
||||||
|
2. From the **Options** menu, select **Export As > JSON (all data)**.
|
||||||
|
3. Uncheck the **Archived** option if checked.
|
||||||
|
4. Select **Authorize and Backup**. This will take you to your Todoist account. Follow the instructions on screen.
|
||||||
|
5. Note the name and location of the downloaded ``.json`` file.
|
||||||
|
6. Open a terminal window on your local machine and clone the focalboard repository to a local directory, e.g. to ``focalboard``: ``git clone https://github.com/mattermost/focalboard focalboard``
|
||||||
|
7. Navigate to ``focalboard/webapp``.
|
||||||
|
8. Run ``npm install``.
|
||||||
|
9. Change directory to ``focalboard/import/todoist``.
|
||||||
|
10. Run ``npm install``.
|
||||||
|
11. From within the same folder, run ``npx ts-node importTodoist.ts -i <path-to-todoist.json> -o archive.boardarchive``.
|
||||||
|
12. In Focalboard, open the board you want to use for the export.
|
||||||
|
13. Select **Settings > Import archive** and select ``archive.boardarchive``.
|
||||||
|
14. Select **Upload**.
|
||||||
|
15. Return to your board and confirm that your Todoist data is now displaying.
|
||||||
|
|
||||||
|
## Export from Focalboard
|
||||||
|
|
||||||
|
You can export your boards data as a CSV file.
|
||||||
|
|
||||||
|
1. Select the options menu to the left of the **New** button at the top of any board.
|
||||||
|
2. Select **Export to CSV**.
|
||||||
|
3. Import the CSV file to your tool of choice. The CSV file contains all the cards in that board and their associated properties.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
|
||||||
|
- If you only see a single entry in the CSV export when the board contains multiple cards, you may have a specific card in context when you exported the file because you were performing a card search. If you have searched for a card, and that card is in context, that’s the only card that will be exported into the CSV file. Clear your search and try exporting to CSV again.
|
||||||
|
- After importing CSV Focalboard data from one Mattermost instance into another (such as during a migration from Mattermost Cloud to self-hosted), card timestamps will be updated based on the import date, and cards won't correctly identify users whose user IDs differ across Mattermost instances.
|
||||||
|
|
||||||
|
## Back up your Focalboard data
|
||||||
|
|
||||||
|
If you’d like to back up a board, you can export it as an archive file. You can import that board to another Mattermost team within the same Mattermost instance. Exported and imported board archives include all card content such as properties, comments, descriptions, and image attachments.
|
||||||
|
|
||||||
|
1. Select the options menu Options icon to the left of the **New** button at the top of the board
|
||||||
|
2. Select **Export board archive**.
|
||||||
|
3. Download the archive file.
|
||||||
|
4. Navigate to the team or channel workspace where you’d like to add the exported board.
|
||||||
|
5. Select the Gear icon next to your profile picture, then choose **Import archive**. The board you exported will be added to this team or channel workspace.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
|
||||||
|
- If you're using a version of the Focalboard plugin older than v6.4, backing up a board results in a ``.focalboard`` file, rather than a ``.boardarchive`` file. When importing a board backup, select the **Select all files** option to select ``.focalboard`` files.
|
||||||
|
- After importing a Focalboard backup from one Mattermost instance into another (such as during a migration from Mattermost Cloud to self-hosted), card timestamps will be updated based on the import date, and cards won't correctly identify users whose user IDs differ across Mattermost instances.
|
@ -1,10 +1,30 @@
|
|||||||
# Focalboard / Mattermost Boards Contributors Guide
|
# Focalboard Plugin Documentation
|
||||||
|
|
||||||
Welcome to the [Focalboard](https://www.focalboard.com) / [Mattermost Boards](https://mattermost.com/boards/?utm_source=focalboard) project!
|
Welcome to the Focalboard plugin project! We're very glad you want to check it out and perhaps contribute code to this project in GitHub.
|
||||||
|
|
||||||
We're very glad you want to check it out and perhaps contribute code our repository in GitHub.
|
## Install the plugin
|
||||||
|
|
||||||
Our goal is to make your experience as great as possible. Follow these simple steps to contribute:
|
Visit the [Mattermost Developer Documentation](https://developers.mattermost.com/integrate/plugins/using-and-managing-plugins/#custom-plugins) for details on how to install and enable the Focalboard plugin in your self-hosted Mattermost instance.
|
||||||
|
|
||||||
|
## Enable the plugin
|
||||||
|
|
||||||
|
Once you've installed the Focalboard plugin, you can enable the plugin in the Mattermost System Console by going to **Plugins > Plugin Management**, and selecting the **Enable** option for the Focalboard plugin.
|
||||||
|
|
||||||
|
## Learn what Focalboard plugin data is being collected
|
||||||
|
|
||||||
|
See the [plugin data being collected documentation](plugin-data-being-collected.md) for details.
|
||||||
|
|
||||||
|
## Use the plugin
|
||||||
|
|
||||||
|
See the [Focalboard plugin end user guide](focalboard-plugin-end-user-guide.md) for details on getting started with and using the plugin.
|
||||||
|
|
||||||
|
## Manage plugin preferences
|
||||||
|
|
||||||
|
See the [manage plugin preferences documentation](manage-plugin-preferences.md) for details.
|
||||||
|
|
||||||
|
## Contribute to the Focalboard plugin project
|
||||||
|
|
||||||
|
Follow these simple steps to contribute:
|
||||||
|
|
||||||
1. [Fork the Focalboard repo](https://github.com/mattermost/focalboard), clone it locally, and follow the steps in the README to build. Read the [developer tips & tricks](dev-tips.md) to get started.
|
1. [Fork the Focalboard repo](https://github.com/mattermost/focalboard), clone it locally, and follow the steps in the README to build. Read the [developer tips & tricks](dev-tips.md) to get started.
|
||||||
|
|
||||||
|
24
docs/link-boards-to-mattermost-channels.md
Normal file
24
docs/link-boards-to-mattermost-channels.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Link boards to Mattermost channels
|
||||||
|
|
||||||
|
## Link a board to a channel
|
||||||
|
|
||||||
|
Boards can be linked to channels and accessed from the channel Apps Bar.
|
||||||
|
|
||||||
|
1. Select the **Focalboard** icon from the Apps Bar in a channel to open a right-hand sidebar (RHS).
|
||||||
|
2. Search for and link boards to the channel.
|
||||||
|
3. Select **Add** button to open the link boards dialog and search for a board to link.
|
||||||
|
|
||||||
|
Once a board is linked to a channel, it's listed in the right-hand pane. Linking a board to a channel automatically grants all channel members access to the board, with the exception of guest accounts. Select a linked board to navigate directly to the board.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
- A channel can be linked to multiple boards, but each individual board can only be linked to one channel at a time.
|
||||||
|
- Linking the same board to another channel will automatically replaces the link to the previous channel with the new channel.
|
||||||
|
- Channel members can only search and link boards within the team where they are a board admin.
|
||||||
|
- If you're using a Focalboard plugin older than v7.2, you won't be able to link a board to a channel. We recommend upgrading to the latest version of the plugin to take full advantage of all plugin features and functionality.
|
||||||
|
- After upgrading to version v7.2 or later of the Focalboard plugin, your boards automatically appear in the right-hand side pane for easy access.
|
||||||
|
|
||||||
|
## Unlink a board from a channel
|
||||||
|
|
||||||
|
If you're a board admin, and want to unlink a board from a channel you're in, open linked board, select the options menu, and select **Unlink**.
|
||||||
|
|
||||||
|
Alternatively, you can open the **Share** dialog on the board, open the **Role** drop-down menu next to the channel's name and select **Unlink**.
|
39
docs/manage-boards.md
Normal file
39
docs/manage-boards.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Manage boards
|
||||||
|
|
||||||
|
## Access your boards
|
||||||
|
|
||||||
|
Open the Boards tab via the product menu in the top left corner of Mattermost to view all the boards for your team. You can select the **Focalboard** icon in the Apps Bar to open the right-hand panel, and display boards linked to the channel or message that you're in.
|
||||||
|
|
||||||
|
If you don't see the Apps Bar and your boards layout looks different to what's described, you may be using an older version of Mattermost and/or the Focalboard plugin.
|
||||||
|
|
||||||
|
## Find a board
|
||||||
|
|
||||||
|
From the top of the boards left hand sidebar, select the **Find Boards** field (CMD+K/CTRL+K) to open the board switcher, and start typing the name of the board you’re looking for.
|
||||||
|
|
||||||
|
## Manage sidebar categories
|
||||||
|
|
||||||
|
From Focalboard plugin v7.2, you can organize your boards in the left-hand sidebar using custom categories. By default, all boards will appear under the **Boards** category. To manage your categories, open the Options menu next to the category to create, delete, or rename a category. With the exception to the default **Boards** category, all other categories can be renamed or deleted.
|
||||||
|
|
||||||
|
After creating categories, you can move your boards to those categories by opening the Options menu next to the board and selecting **Move To…** to select the category where you want the board to be moved.
|
||||||
|
|
||||||
|
If you delete a category with boards in it, then those boards will return to the default **Boards** category.
|
||||||
|
|
||||||
|
Categories are organized per-user, so you can arrange your boards under categories that make sense to you without impacting boards or categories for other users. If a board is moved to a custom category, then the board will appear under that category for you only. Other users who are members of the board will continue to see the board in their own categories.
|
||||||
|
|
||||||
|
### Organize using drag and drop
|
||||||
|
|
||||||
|
You can organize both sidebar categories and boards to change the order of both to suit your preference. You can:
|
||||||
|
|
||||||
|
- Set the position of a board within a category.
|
||||||
|
- Drag a board out of one category and drop it into another category.
|
||||||
|
|
||||||
|
To do this, select and hold the cursor over the category or board name. Then move the category or board around as needed. Boards moved into a category are sorted to the top of the category by default unless you specifically position the board before releasing the cursor.
|
||||||
|
|
||||||
|
### Manage boards in the sidebar
|
||||||
|
|
||||||
|
In addition to moving boards to other categories, from the Options menu next to each board name, you can perform the following actions:
|
||||||
|
|
||||||
|
- **Delete board**: If you're an admin of the board, you will see an option to delete the board. Deleting the board permanently removes the board from the sidebar of all board members.
|
||||||
|
- **Duplicate board**: Creates a copy of the board and all the cards on the board. The duplicated board will appear under the same category as the original board. Board members and comments from the original board aren't migrated to the new board.
|
||||||
|
- **New template from board**: Creates a custom board template of the board and all the cards on the board.
|
||||||
|
- **Hide board**: Hides the board from your sidebar only. The board will still remain visible on the sidebar for other board members. You can add the board back to your sidebar using the search box (CMD+K/CTRL+K).
|
5
docs/manage-plugin-preferences.md
Normal file
5
docs/manage-plugin-preferences.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Manage plugin preferences
|
||||||
|
|
||||||
|
## Disable emojis on cards
|
||||||
|
|
||||||
|
You can enable or disable random emoji icons for your board and cards by selecting the Gear icon next to your profile picture, then toggling **Random icons on or off**.
|
46
docs/plugin-data-being-collected.md
Normal file
46
docs/plugin-data-being-collected.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Plugin data being collected
|
||||||
|
|
||||||
|
Boards metadata is collected and sent to Mattermost every 24 hours. Visit the [Focalboard telemetry file](https://github.com/mattermost/focalboard/blob/main/webapp/src/telemetry/telemetryClient.ts) for information about the action and event data collected.
|
||||||
|
|
||||||
|
Other telemetry information that Mattermost collects includes:
|
||||||
|
|
||||||
|
## Server telemetry
|
||||||
|
|
||||||
|
### Boards Plugin Information
|
||||||
|
|
||||||
|
- Boards Version and Build Number
|
||||||
|
- Boards Edition
|
||||||
|
- Operating System for Boards server
|
||||||
|
- The server diagnostic ID
|
||||||
|
|
||||||
|
### Configuration Information
|
||||||
|
|
||||||
|
- ServerRoot is default server root (``true``/``false``)
|
||||||
|
- Port is default port (``true``/``false``)
|
||||||
|
- UseSSL (``true``/``false``)
|
||||||
|
- Database Type
|
||||||
|
- Single User (``true``/``false``)
|
||||||
|
|
||||||
|
### User Count Information
|
||||||
|
|
||||||
|
- Registered User Count
|
||||||
|
- Daily Active User Count
|
||||||
|
- Weekly Active User Count
|
||||||
|
- Monthly Active User Count
|
||||||
|
|
||||||
|
### Block Count Information
|
||||||
|
|
||||||
|
- Block Counts By Type
|
||||||
|
|
||||||
|
### Workspace Information
|
||||||
|
|
||||||
|
- Workspace Count
|
||||||
|
|
||||||
|
## Web app event activity
|
||||||
|
|
||||||
|
### Load Board View
|
||||||
|
|
||||||
|
- ``UserID``: Unique identifier of the server.
|
||||||
|
- ``UserActualID``: Unique identifier of the user who initiated the action.
|
||||||
|
- ``Event``: Type of the event. Only the ``view`` event is currently monitored.
|
||||||
|
- ``View Type`` (``board``, ``table``, ``gallery``).
|
93
docs/share-collaborate.md
Normal file
93
docs/share-collaborate.md
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
# Share and collaborate
|
||||||
|
|
||||||
|
You can share boards with your Mattermost teams and within your Mattermost channel conversations.
|
||||||
|
|
||||||
|
## Share a board internally
|
||||||
|
|
||||||
|
To share a board with team members internally, select **Share** in the top-right corner of the board, then select **Copy link** from the **Share** tab below. Paste the copied link in a channel or direct message to share the board with other team members. Only team members who have permissions to the board will be able to open the board from the shared link.
|
||||||
|
|
||||||
|
## Share cards in channel conversations
|
||||||
|
|
||||||
|
Cards can be linked and shared with team members directly with Mattermost Channels. When you share a link to a card within a channel, the card details are automatically displayed in a preview. This preview highlights what the card is about at a glance without having to navigate to it.
|
||||||
|
|
||||||
|
To share a card, you'll need to copy the card link first:
|
||||||
|
|
||||||
|
- Open a card and select the options menu **(...)** at the top right of the card, then select **Copy link**.
|
||||||
|
- Alternatively, you can open the board view and hover your mouse over any card to access the options menu **(...)** for the card and select **Copy link** from there.
|
||||||
|
|
||||||
|
After you've copied the link, paste it into any channel or direct message to share the card. A preview of the card will display within the channel with a link back to the card on the board.
|
||||||
|
|
||||||
|
## Control access to boards
|
||||||
|
|
||||||
|
Boards belong to teams, and any member of a team can be granted access to a board.
|
||||||
|
|
||||||
|
**Note**: If you're using a Focalboard plugin version prior to v7.2, boards are tied to channel workspaces and board membership is determined by channel membership. In this case, roles and permissions information on this page won't be applicable to you.
|
||||||
|
|
||||||
|
### Board roles
|
||||||
|
|
||||||
|
The level of access to a board is determined by a user’s assigned board role. Individual board membership always gets precedence, followed by highest (most permissive) group role.
|
||||||
|
|
||||||
|
- **Admin**: Can modify the board, its contents, and its permissions. By default, board creators are also admins of the board.
|
||||||
|
- **Editor**: Can modify the board and its contents.
|
||||||
|
- **Commenter**: Can add comments to cards.
|
||||||
|
- **Viewer**: Can view the board and its contents but can't comment or edit the board.
|
||||||
|
|
||||||
|
| **Board permissions** | **Admin** | **Editor** | **Commenter** | **Viewer** |
|
||||||
|
|------------------------------------|-----------|------------|---------------|------------|
|
||||||
|
| Modify permissions | X | | | |
|
||||||
|
| Delete a board | X | | | |
|
||||||
|
| Rename a board | X | X | | |
|
||||||
|
| Add, edit, and delete views | X | X | | |
|
||||||
|
| Add, edit, and delete cards | X | X | | |
|
||||||
|
| Comment and delete my own comments | X | X | X | |
|
||||||
|
| Delete any comment | X | | | |
|
||||||
|
| View a board | X | X | X | X |
|
||||||
|
|
||||||
|
## System admin access
|
||||||
|
|
||||||
|
System admins can access any board across the server provided they have the board's URL without having to request permission or be manually added. When a system admin joins a board, their default role is admin. System admins will have an **Admin** label assigned to their name on the participants list.
|
||||||
|
|
||||||
|
## Team admin access
|
||||||
|
|
||||||
|
Team admins can access any board within their team provided they have the board's URL without having to request permission or be manually added. When a system admin joins a board, their default role is admin. Team admins will have a **Team admin** label assigned to their name on the participants list.
|
||||||
|
|
||||||
|
## Manage team access
|
||||||
|
|
||||||
|
Board admins can manage team access to their board by selecting **Share** in the top-right corner of the board. On the dropdown next to **Everyone at… Team** option, select a minimum board role for everyone on the team. You can also easily assign the new roles to the entire team and/or to individual team members.
|
||||||
|
|
||||||
|
Minimum default board roles reduce permission ambiguity and prevent security loopholes. The minimum default role means that board admins can't assign individual board members a role lower than the team role. If the team role is set to **Editor** then the board admin will only be able to assign the **Editor** or **Admin** role to individual team members. Lower roles will not be available for selection unless the admin changes the minimum board role.
|
||||||
|
|
||||||
|
Depending on the role selected, everyone on the team will have access to the board with a minimum of the permissions from the role selected. Users can get elevated permissions based on their individual board membership. The default team access for a newly created board is **None**, which means nobody on the team has access to the board.
|
||||||
|
|
||||||
|
## Manage individual board membership
|
||||||
|
|
||||||
|
Only board admins can manage user permissions on a board, including adding, changing, and removing members.
|
||||||
|
|
||||||
|
To add individual users from the team as explicit members of the board, open the **Share** dialog on the board, search for individual team members, then assign a role to set their permissions for the board. The role for individual board members overrides any role specified for team access.
|
||||||
|
|
||||||
|
- To change a board member’s role, open the **Share** dialog, select the role dropdown next to the user’s name, then select another role from the list.
|
||||||
|
- To remove a member from a board, open the **Share** dialog, select the role dropdown next to the user’s name, then select **Remove member**.
|
||||||
|
|
||||||
|
Board admins can also add individual members using the autocomplete list from @mentions and the person properties. To add an individual from the autocomplete list, type their username in an @mention or in the **Person** or **Multi-person** properties, then assign a role to the user from the confirmation dialog, and select **Add to board**.
|
||||||
|
|
||||||
|
On boards with team access, board members with **Editor** or **Commenter** roles can also add individuals to the board from the autocomplete list. Board members added in this manner will be assigned the default minimum board role.
|
||||||
|
|
||||||
|
## Channel role groups
|
||||||
|
|
||||||
|
Board admins can add a channel to a board to grant all its members Editor access. To do this, select **Share** in the top-right corner of the board, search for the channel name, and add it to the board as a user. The default role is Editor. Doing so also [links the board back to the channel](link-boards-to-mattermost-channels) where the board will appear on the channel RHS.
|
||||||
|
|
||||||
|
To unlink the channel from the board, open the **Share** dialog, select the role dropdown next to the channel’s name, then select **Unlink**.
|
||||||
|
|
||||||
|
Remember, a board can only be linked to one channel at a time. Linking another channel to the same board will automatically remove the link from the previous channel.
|
||||||
|
|
||||||
|
## Guest accounts
|
||||||
|
|
||||||
|
From version v7.4 of the Focalboard plugin, [Mattermost guest accounts](https://docs.mattermost.com/onboard/guest-accounts.html#guest-accounts) are supported. If you're not able to access this functionality, you may be on an earlier version of the Focalboard plugin.
|
||||||
|
|
||||||
|
Guests can:
|
||||||
|
|
||||||
|
- Access boards where they're added as an explicit member of the board, but can't manage team access or add channels to boards.
|
||||||
|
- Access existing boards, but can't create new boards. Guests also don't have access to the template picker and can't duplicate an existing board.
|
||||||
|
- Search for boards where they're currently an explicit member.
|
||||||
|
- Be assigned the Viewer, Commenter, or Editor roles, but not the Admin role.
|
||||||
|
- Only @mention current members on the board.
|
35
docs/work-with-board-views.md
Normal file
35
docs/work-with-board-views.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Work with board views
|
||||||
|
|
||||||
|
Views display your cards in a board, table, calendar, or gallery layout, optionally filtered and grouped by a property (e.g., priority, status, etc).
|
||||||
|
|
||||||
|
To add a new view to a board:
|
||||||
|
|
||||||
|
1. From the board header, select the menu next to the current view name.
|
||||||
|
2. Scroll down and select **+ Add view**.
|
||||||
|
3. select the new visualization you’d like to use.
|
||||||
|
|
||||||
|
The following board views are available.
|
||||||
|
|
||||||
|
## Board view
|
||||||
|
|
||||||
|
This is a kanban view where cards are grouped into columns. Column groups only work with the **Select** or **Person** properties and display all cards that share the same value from the specified property. The column names are editable, and any changes to the column names are also applied to the value from the property. Cards can be dragged between columns, which will automatically update the property’s assigned value on the card.
|
||||||
|
|
||||||
|
## Table view
|
||||||
|
|
||||||
|
Displays cards in a table format with rows and columns. Use this view to get an overview of all your project tasks. Easily view and compare the state of all properties across all cards without needing to open individual cards. Each column corresponds to a card property. You can edit cells directly or you can select **Open** to open the card view for that row.
|
||||||
|
|
||||||
|
## Gallery view
|
||||||
|
|
||||||
|
Displays cards in a gallery format, so you can manage and organize cards with image attachments. Gallery view displays a preview of the first image attached on the card. For cards with no image attachments, a preview of the first description block will be displayed instead.
|
||||||
|
|
||||||
|
## Calendar view
|
||||||
|
|
||||||
|
To use this view, cards need to have the **Date** property added.
|
||||||
|
|
||||||
|
If cards don’t have a custom **Date** property, they’ll be sorted and displayed by the card creation date (default). These cards can’t be moved around the board until a custom **Date** property is added.
|
||||||
|
|
||||||
|
If your cards do have a **Date** property and you’re not able to move them around, you may be displaying them by **Created Time** or **Last Updated Time**.
|
||||||
|
|
||||||
|
- To add a new card, select the **+** option in the top-left corner of the relevant date.
|
||||||
|
- To create a date range event, select a start date and then drag to the end date to create a card for that date range event.
|
||||||
|
- To add a date range to an existing card, hover over the side of the card to display the arrow and drag to the left or right to create a date range.
|
164
docs/work-with-cards.md
Normal file
164
docs/work-with-cards.md
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
# Work with cards
|
||||||
|
|
||||||
|
## What's a card?
|
||||||
|
|
||||||
|
Cards are used on a board to track individual work items. Cards are customizable and can have a number of properties added to them, which are then used as a way to tag, sort, and filter the cards.
|
||||||
|
|
||||||
|
A card consists of:
|
||||||
|
|
||||||
|
- **A set of properties**: Properties are common to all cards in a board. Board views can group cards by “Select” type properties into different columns.
|
||||||
|
- **A list of comments**: Comments are useful for noting important changes or milestones.
|
||||||
|
- **A set of content**: The content of a card can consist of Markdown text, checkboxes, and images. Use this to record detailed specs or design decisions for an item for example.
|
||||||
|
|
||||||
|
When working with cards, you can manage properties, add descriptions, attach images, assign them to team members, mention team members, add comments, and so on.
|
||||||
|
|
||||||
|
Standard board templates provide some default card properties that can be customized or removed. In the Roadmap template, there's a **Type** property, whereas in the Project Tasks template, there's an **Estimated Hours** property. These properties are not exclusive to any template and can be easily re-created in any of the templates provided.
|
||||||
|
|
||||||
|
## Add card descriptions
|
||||||
|
|
||||||
|
Card descriptions can include text with Markdown formatting, checkboxes, and visual elements such as images or GIFs, and can be separated into blocks of content. To add a description, open a card, select **Add a description** below the **Comments** section, and start typing in your content.
|
||||||
|
|
||||||
|
To add a new content block in the description section, hover over the section and select **Add content**. Then choose from any of the following options:
|
||||||
|
|
||||||
|
- **Text**: Adds a new text block that can be formatted with Markdown.
|
||||||
|
- **Image**: Select and embed an image file into the content block. The following image formats are currently supported: GIF, JPEG, and PNG.
|
||||||
|
- **Divider**: Adds a divider content block below the previous block.
|
||||||
|
- **Checkbox**: Adds a checkbox content block. Press Enter/Return after typing in content for your checkbox to add another checkbox within the same block. Please note, Markdown formatting isn't supported within the **Checkbox** content block.
|
||||||
|
|
||||||
|
To manage the description content blocks on a card, hover over any existing block and select the options menu |options-icon| to move the block up or down, insert a new block above, or delete the current block. Alternatively, you can hover over any existing block, then select and hold the grid button to drag and drop it to a new position within the description section.
|
||||||
|
|
||||||
|
## Attach files to cards
|
||||||
|
|
||||||
|
From Focalboard plugin version v7.7, you can attach files to your cards, which other board members can download. There are no limitations to the file types that you can upload.
|
||||||
|
|
||||||
|
To upload a file to a card, select **Attach** in the top-right corner of the card. Then select the file you'd like to upload. When your file has been uploaded, you can find it in the **Attachments** section of the card. Select the **+** sign to add additional files to your card.
|
||||||
|
|
||||||
|
To delete a file attachment, hover over it and select the 3-dot menu, then select **Delete**. To download the file, select the download icon.
|
||||||
|
|
||||||
|
## Add card badges
|
||||||
|
|
||||||
|
Card badges are a quick way to view card details without opening up a card. To add them, select **Properties > Comments and Description**. Icons related to the card description, comments, and checkboxes will be displayed on cards with the respective content. Open the card to view the details.
|
||||||
|
|
||||||
|
- The description icon indicates that a card has a text description.
|
||||||
|
- The comment icon displays a number indicating how many comments have been added to a card. When a new comment is added, that number is updated.
|
||||||
|
- The checkbox icon displays the number of items checked off relative to the total number of checkboxes within the card. When an item is checked off, the icon is automatically updated.
|
||||||
|
|
||||||
|
## Comment on a card
|
||||||
|
|
||||||
|
Comments allow you to provide feedback and ask questions relevant to the specific work item on the card.
|
||||||
|
|
||||||
|
To add a comment, select a card to open the card view, then click on **Add a comment…** to type in your comment, and press **Send** to save the comment to the card. All team members who are `following the card </boards/work-with-cards.html#receive-updates>`_ will receive a notification with a preview of your comment in Mattermost Channels.
|
||||||
|
|
||||||
|
From Focalboard plugin v7.4, only board members with the *Commenter* role or higher can comment on a card. Board members assigned the *Viewer* role can view, but not comment on, a card.
|
||||||
|
|
||||||
|
## Mention people on cards
|
||||||
|
|
||||||
|
You can include a team member on a card by `mentioning them on a card </channels/mention-people.html>`__ the same way you would in Channels. Mentions are supported in the `Comments </boards/work-with-cards.html#comment-on-a-card>`_ and `Description </boards/work-with-cards.html#card-descriptions>`_ sections within a card. The team member you mention will receive a direct message notification from the boards bot with a link to the card you mentioned them on. To mention multiple team members, separate each name with a comma.
|
||||||
|
|
||||||
|
## Follow card updates
|
||||||
|
|
||||||
|
When you create a card, you automatically follow it. You can @mention someone on a card to add them as a follower. This can be a card you've created or someone else's card. Lastly, you can also follow cards manually using the **Follow** option on the top-right corner of a card. To unfollow a card, select **Following**.
|
||||||
|
|
||||||
|
When updates are made to a card you're following, you'll receive a direct message from the boards bot with a summary of the change (e.g. Bob changed status from **In progress** to **Done**) and a link to the card for more detailed information.
|
||||||
|
|
||||||
|
You won't get a notification of your own changes made to a card, even if you're following that card.
|
||||||
|
|
||||||
|
## Search for cards
|
||||||
|
|
||||||
|
You can search through all the cards on a board to find what you’re looking for. Open the board you want to search, then select the **Search cards** field in the top-right of the board.
|
||||||
|
|
||||||
|
## Manage card properties
|
||||||
|
|
||||||
|
Cards can contain different data fields depending on the purpose of the board. Using card properties, you can customize these data fields to fit your needs and track the information most important to you. For example, in a **Roadmap** board, cards include a **Type** field where you can add categories such as **Bug**, **Epic**, etc. In a **Project Task** board, cards include the **Estimated Hours** field instead.
|
||||||
|
|
||||||
|
Properties are displayed in the order they were created and can't be re-ordered.
|
||||||
|
|
||||||
|
## Create card properties
|
||||||
|
|
||||||
|
To create a new property field open a card and select **Add a property**. Then select the type of property from the drop-down menu. The property type specifies the type of data you plan to capture within that field. When you create new card properties, they're added to all new and all existing cards on the current board.
|
||||||
|
|
||||||
|
Properties are automatically added to the board filter list at the top of the page, so ensure you customize all property names to make it easy to filter your board by specific properties later.
|
||||||
|
|
||||||
|
## Work with property types
|
||||||
|
|
||||||
|
The Focalboard plugin supports a wide range of fully customizable property types:
|
||||||
|
|
||||||
|
- **Text** can be used to add short notes to a card. An advantage of the text property over card descriptions is that it can be `shown on the board <https://docs.mattermost.com/boards/work-with-cards.html#toggle-properties-shown-on-a-board>`_ without needing to open the card.
|
||||||
|
- **Numbers** are useful to capture metrics such as task sizing or effort estimates. Use in conjunction with calculations to get the most out of the number property type.
|
||||||
|
- **Email** and **Phone** can be used to record contact information.
|
||||||
|
- **URL** can be used to provide a link to a pull request or relevant website. Clicking on the box of a URL property will automatically open the link in a new tab on your browser. Hover over the box to surface options to copy or edit the URL.
|
||||||
|
- **Select** and **Multi-select** allows you to create a predefined list of options that can be color-coded and displayed as badges on the card to indicate things like status and priority.
|
||||||
|
- **Dates** are useful to set and track due dates or milestones. Use the date property to make a card appear on the `Calendar view <https://docs.mattermost.com/boards/work-with-views.html#calendar-view>`_. Set a single date or toggle on the **End date** to set a date range.
|
||||||
|
- **Person** and **Multi-person** provides a quick way to capture user assignments. Note that this is not available in Personal Desktop.
|
||||||
|
- **Checkbox** is a toggle property that can be used for assigning simple binary options on a card such as True/False or Yes/No.
|
||||||
|
- **Created time/Created by/Last updated time/Last updated by** are predefined system properties to help you audit changes on a card. The names of these properties are customizable, but the values are not.
|
||||||
|
|
||||||
|
### Rename a property type
|
||||||
|
|
||||||
|
The default name for a new property is the name of the property type (e.g. **Date**, **URL**).
|
||||||
|
To rename a property field, open up a card and select the property name to open an editable field. Enter the new name in the field provided. The change is saved immediately and applied across all cards on the current board.
|
||||||
|
|
||||||
|
### Change a property type
|
||||||
|
|
||||||
|
To change a property type, select the property then open the **Type** menu and choose a new property type. You’ll be asked to confirm the change from every card on the current board. Changing the type for an existing property will affect values across all cards on the board and may result in data loss.
|
||||||
|
|
||||||
|
### Delete a property
|
||||||
|
|
||||||
|
To delete properties you no longer need, select the property, then choose **Delete**. You’ll be asked to confirm that you want to remove that property from every card on the current board.
|
||||||
|
|
||||||
|
### Define a "Select" or "Multi-select" property
|
||||||
|
|
||||||
|
The options on a **Select** and **Multi-select** property type appear as color-coded tags on a card. Options in a **Select** or **Multi-Select** property list are sorted in the order they were created and can't be re-ordered or renamed.
|
||||||
|
|
||||||
|
To add and configure the options on these types:
|
||||||
|
|
||||||
|
1. Select a card to open the card view.
|
||||||
|
2. Add a new property, give it a name, and set its type to **Select** (or **Multi-Select**).
|
||||||
|
3. Select the field box for the property, and start typing the name of a new option. Press Enter to accept. Repeat this step to add additional options.
|
||||||
|
- To assign a color to or delete an option, select the value and select the options menu **(...)** next to each option name.
|
||||||
|
- To select an option on the property, select the box and choose one of the values from the menu.
|
||||||
|
- To remove an option on the property, select the box and chooose the `X` next to the option name you want to remove.
|
||||||
|
|
||||||
|
Alternatively, you can also add new options directly from a board:
|
||||||
|
|
||||||
|
1. Open a board view.
|
||||||
|
2. Group by a **Select** property.
|
||||||
|
3. Scroll to the right of the board and select **+ Add a group**.
|
||||||
|
|
||||||
|
This will add a new column, which corresponds to a new value option for the Select property.
|
||||||
|
|
||||||
|
### Control what properties are shown on a board
|
||||||
|
|
||||||
|
Once you have card properties defined, you have full control over which properties are shown on the board as a preview without having to open the card. Select **Properties** at the top of the board, then enable all properties you want to see at a glance, and hide all properties you don’t want to see.
|
||||||
|
|
||||||
|
## Create card templates
|
||||||
|
|
||||||
|
Card templates can help reduce repetitive manual input for similar types of work items. Each board can have any number of card templates. To create a new card template:
|
||||||
|
|
||||||
|
1. Open the board where you want to add the card template.
|
||||||
|
2. Select the drop-down arrow next to **New**, then select **New template**.
|
||||||
|
3. Add a title to the card template.
|
||||||
|
4. Then assign values to any properties and add a description you wish to have pre-populated when a card is created from the template.
|
||||||
|
5. Close the card using the **X** in the top left corner.
|
||||||
|
6. Select the drop-down arrow next to **New**, then select the template you just created.
|
||||||
|
|
||||||
|
Alternatively, you can turn any existing card into a template:
|
||||||
|
|
||||||
|
1. Open the card you want to use as a template.
|
||||||
|
2. Select the options menu |options-icon| in the top-right corner of the card.
|
||||||
|
3. Select **New template from card**.
|
||||||
|
4. Edit the card as needed, including a helpful name.
|
||||||
|
5. Close the card using the **X** in the top left corner.
|
||||||
|
6. Select the drop-down arrow next to **New**, then select the template you just created.
|
||||||
|
|
||||||
|
To set a default card template for all new cards created on the board:
|
||||||
|
|
||||||
|
1. Select the drop-down arrow next to **New**.
|
||||||
|
2. Open the options menu |options-icon| next to the card template of your choosing.
|
||||||
|
3. Select **Set as default**.
|
||||||
|
|
||||||
|
**Notes**:
|
||||||
|
|
||||||
|
- The card template is applicable only to the board in which it’s created, and isn’t available in other boards within your team workspace.
|
||||||
|
- Comments on a template don't get populated on to new cards.
|
||||||
|
- Additionally, properties can't be hidden from a card template at this time. All cards on a board share the same properties, so adding or deleting a property on a template will also apply to all cards on a board.
|
@ -93,15 +93,25 @@ func (a *API) handleGetUsersList(w http.ResponseWriter, r *http.Request) {
|
|||||||
session := ctx.Value(sessionContextKey).(*model.Session)
|
session := ctx.Value(sessionContextKey).(*model.Session)
|
||||||
isSystemAdmin := a.permissions.HasPermissionTo(session.UserID, model.PermissionManageSystem)
|
isSystemAdmin := a.permissions.HasPermissionTo(session.UserID, model.PermissionManageSystem)
|
||||||
|
|
||||||
|
sanitizedUsers := make([]*model.User, 0)
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
|
canSeeUser, err2 := a.app.CanSeeUser(session.UserID, user.ID)
|
||||||
|
if err2 != nil {
|
||||||
|
a.errorResponse(w, r, err2)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !canSeeUser {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if user.ID == session.UserID {
|
if user.ID == session.UserID {
|
||||||
user.Sanitize(map[string]bool{})
|
user.Sanitize(map[string]bool{})
|
||||||
} else {
|
} else {
|
||||||
a.app.SanitizeProfile(user, isSystemAdmin)
|
a.app.SanitizeProfile(user, isSystemAdmin)
|
||||||
}
|
}
|
||||||
|
sanitizedUsers = append(sanitizedUsers, user)
|
||||||
}
|
}
|
||||||
|
|
||||||
usersList, err := json.Marshal(users)
|
usersList, err := json.Marshal(sanitizedUsers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
a.errorResponse(w, r, err)
|
a.errorResponse(w, r, err)
|
||||||
return
|
return
|
||||||
|
@ -634,6 +634,26 @@ func (c *Client) GetUser(id string) (*model.User, *Response) {
|
|||||||
return user, BuildResponse(r)
|
return user, BuildResponse(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) GetUserList(ids []string) ([]model.User, *Response) {
|
||||||
|
r, err := c.DoAPIPost("/users", toJSON(ids))
|
||||||
|
if err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
}
|
||||||
|
defer closeBody(r)
|
||||||
|
|
||||||
|
requestBody, err := io.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var users []model.User
|
||||||
|
err = json.Unmarshal(requestBody, &users)
|
||||||
|
if err != nil {
|
||||||
|
return nil, BuildErrorResponse(r, err)
|
||||||
|
}
|
||||||
|
return users, BuildResponse(r)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) GetUserChangePasswordRoute(id string) string {
|
func (c *Client) GetUserChangePasswordRoute(id string) string {
|
||||||
return fmt.Sprintf("/users/%s/changepassword", id)
|
return fmt.Sprintf("/users/%s/changepassword", id)
|
||||||
}
|
}
|
||||||
|
@ -127,6 +127,17 @@ func (s *PluginTestStore) GetUserByID(userID string) (*model.User, error) {
|
|||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *PluginTestStore) GetUsersList(userIDs []string, showEmail, showName bool) ([]*model.User, error) {
|
||||||
|
var users []*model.User
|
||||||
|
for _, id := range userIDs {
|
||||||
|
user := s.users[id]
|
||||||
|
if user != nil {
|
||||||
|
users = append(users, user)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *PluginTestStore) GetUserByEmail(email string) (*model.User, error) {
|
func (s *PluginTestStore) GetUserByEmail(email string) (*model.User, error) {
|
||||||
for _, user := range s.users {
|
for _, user := range s.users {
|
||||||
if user.Email == email {
|
if user.Email == email {
|
||||||
|
@ -164,6 +164,79 @@ func TestGetUser(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetUserList(t *testing.T) {
|
||||||
|
th := SetupTestHelperPluginMode(t)
|
||||||
|
defer th.TearDown()
|
||||||
|
clients := setupClients(th)
|
||||||
|
th.Client = clients.TeamMember
|
||||||
|
th.Client2 = clients.Editor
|
||||||
|
|
||||||
|
me, resp := th.Client.GetMe()
|
||||||
|
require.NoError(t, resp.Error)
|
||||||
|
require.NotNil(t, me)
|
||||||
|
|
||||||
|
userID1 := me.ID
|
||||||
|
userID2 := th.GetUser2().ID
|
||||||
|
|
||||||
|
// Admin user should return both
|
||||||
|
returnUsers, resp := clients.Admin.GetUserList([]string{userID1, userID2})
|
||||||
|
require.NoError(t, resp.Error)
|
||||||
|
require.NotNil(t, returnUsers)
|
||||||
|
require.Equal(t, 2, len(returnUsers))
|
||||||
|
|
||||||
|
// Guest user should return none
|
||||||
|
returnUsers2, resp := clients.Guest.GetUserList([]string{userID1, userID2})
|
||||||
|
require.NoError(t, resp.Error)
|
||||||
|
require.NotNil(t, returnUsers2)
|
||||||
|
require.Equal(t, 0, len(returnUsers2))
|
||||||
|
|
||||||
|
newBoard := &model.Board{
|
||||||
|
Title: "title",
|
||||||
|
Type: model.BoardTypeOpen,
|
||||||
|
TeamID: testTeamID,
|
||||||
|
}
|
||||||
|
board, err := th.Server.App().CreateBoard(newBoard, userID1, true)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// add Guest as board member
|
||||||
|
newGuestMember := &model.BoardMember{
|
||||||
|
UserID: userGuestID,
|
||||||
|
BoardID: board.ID,
|
||||||
|
SchemeViewer: true,
|
||||||
|
SchemeCommenter: true,
|
||||||
|
SchemeEditor: true,
|
||||||
|
SchemeAdmin: false,
|
||||||
|
}
|
||||||
|
guestMember, err := th.Server.App().AddMemberToBoard(newGuestMember)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, guestMember)
|
||||||
|
|
||||||
|
// Guest user should now return one of members
|
||||||
|
guestUsers, resp := clients.Guest.GetUserList([]string{th.GetUser1().ID, th.GetUser2().ID})
|
||||||
|
require.NoError(t, resp.Error)
|
||||||
|
require.NotNil(t, guestUsers)
|
||||||
|
require.Equal(t, 1, len(guestUsers))
|
||||||
|
|
||||||
|
// add other user as board member
|
||||||
|
newBoardMember := &model.BoardMember{
|
||||||
|
UserID: userID2,
|
||||||
|
BoardID: board.ID,
|
||||||
|
SchemeViewer: true,
|
||||||
|
SchemeCommenter: true,
|
||||||
|
SchemeEditor: true,
|
||||||
|
SchemeAdmin: false,
|
||||||
|
}
|
||||||
|
newMember, err := th.Server.App().AddMemberToBoard(newBoardMember)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, newMember)
|
||||||
|
|
||||||
|
// Guest user should now return both
|
||||||
|
guestUsers, resp = clients.Guest.GetUserList([]string{th.GetUser1().ID, th.GetUser2().ID})
|
||||||
|
require.NoError(t, resp.Error)
|
||||||
|
require.NotNil(t, guestUsers)
|
||||||
|
require.Equal(t, 2, len(guestUsers))
|
||||||
|
}
|
||||||
|
|
||||||
func TestUserChangePassword(t *testing.T) {
|
func TestUserChangePassword(t *testing.T) {
|
||||||
th := SetupTestHelper(t).Start()
|
th := SetupTestHelper(t).Start()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
@ -1297,17 +1297,16 @@ func (s *MattermostAuthLayer) CanSeeUser(seerID string, seenID string) (bool, er
|
|||||||
|
|
||||||
query := s.getQueryBuilder().
|
query := s.getQueryBuilder().
|
||||||
Select("1").
|
Select("1").
|
||||||
From(s.tablePrefix + "board_members AS BM1").
|
From(s.tablePrefix + "board_members AS bm1").
|
||||||
Join(s.tablePrefix + "board_members AS BM2 ON BM1.BoardID=BM2.BoardID").
|
Join(s.tablePrefix + "board_members AS bm2 ON bm1.board_id=bm2.board_id").
|
||||||
LeftJoin("Bots b ON ( b.UserId = u.id )").
|
|
||||||
Where(sq.Or{
|
Where(sq.Or{
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"BM1.UserID": seerID},
|
sq.Eq{"bm1.user_id": seerID},
|
||||||
sq.Eq{"BM2.UserID": seenID},
|
sq.Eq{"bm2.user_id": seenID},
|
||||||
},
|
},
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"BM1.UserID": seenID},
|
sq.Eq{"bm1.user_id": seenID},
|
||||||
sq.Eq{"BM2.UserID": seerID},
|
sq.Eq{"bm2.user_id": seerID},
|
||||||
},
|
},
|
||||||
}).Limit(1)
|
}).Limit(1)
|
||||||
|
|
||||||
@ -1323,17 +1322,16 @@ func (s *MattermostAuthLayer) CanSeeUser(seerID string, seenID string) (bool, er
|
|||||||
|
|
||||||
query = s.getQueryBuilder().
|
query = s.getQueryBuilder().
|
||||||
Select("1").
|
Select("1").
|
||||||
From("ChannelMembers AS CM1").
|
From("channelmembers AS cm1").
|
||||||
Join("ChannelMembers AS CM2 ON CM1.BoardID=CM2.BoardID").
|
Join("channelmembers AS cm2 ON cm1.channelid=cm2.channelid").
|
||||||
LeftJoin("Bots b ON ( b.UserId = u.id )").
|
|
||||||
Where(sq.Or{
|
Where(sq.Or{
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"CM1.UserID": seerID},
|
sq.Eq{"cm1.userid": seerID},
|
||||||
sq.Eq{"CM2.UserID": seenID},
|
sq.Eq{"cm2.userid": seenID},
|
||||||
},
|
},
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"CM1.UserID": seenID},
|
sq.Eq{"cm1.userid": seenID},
|
||||||
sq.Eq{"CM2.UserID": seerID},
|
sq.Eq{"cm2.userid": seerID},
|
||||||
},
|
},
|
||||||
}).Limit(1)
|
}).Limit(1)
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ pygmentsStyle = "manni"
|
|||||||
weight = 2
|
weight = 2
|
||||||
|
|
||||||
[[menu.postpend]]
|
[[menu.postpend]]
|
||||||
url = "https://docs.mattermost.com/guides/boards.html"
|
url = "https://github.com/mattermost/focalboard/#readme"
|
||||||
name = "Help Docs"
|
name = "Help Docs"
|
||||||
weight = 3
|
weight = 3
|
||||||
|
|
||||||
@ -74,11 +74,6 @@ pygmentsStyle = "manni"
|
|||||||
name = "Feedback"
|
name = "Feedback"
|
||||||
weight = 4
|
weight = 4
|
||||||
|
|
||||||
[[menu.postpend]]
|
|
||||||
url = "https://mattermost.com/"
|
|
||||||
name = "Mattermost"
|
|
||||||
weight = 5
|
|
||||||
|
|
||||||
# postpended links
|
# postpended links
|
||||||
[[menu.postpend]]
|
[[menu.postpend]]
|
||||||
url = "/download"
|
url = "/download"
|
||||||
|
@ -12,7 +12,7 @@ weight: 0
|
|||||||
<div class="threecol__copy">
|
<div class="threecol__copy">
|
||||||
<h4>For Teams</h4>
|
<h4>For Teams</h4>
|
||||||
<p>
|
<p>
|
||||||
Get started with Boards for free with <a href="https://mattermost.com/sign-up-fb/?utm_source=focalboard&utm_campaign=focalboard" target='_blank'>Mattermost Cloud</a> or install Mattermost as a <a href="https://mattermost.com/deploy/?utm_source=focalboard&utm_campaign=focalboard" target='_blank'>self-hosted server</a>.
|
Install the <a href="https://github.com/mattermost/focalboard/releases" target='_blank'>latest version</a> of the Focalboard plugin in your existing Mattermost server
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,8 +8,6 @@ weight: 1
|
|||||||
Please contact us via one of the following:
|
Please contact us via one of the following:
|
||||||
* [File a GitHub issue](https://github.com/mattermost/focalboard/issues) for bugs or feature ideas
|
* [File a GitHub issue](https://github.com/mattermost/focalboard/issues) for bugs or feature ideas
|
||||||
* [Start a GitHub discussion](https://github.com/mattermost/focalboard/discussions)
|
* [Start a GitHub discussion](https://github.com/mattermost/focalboard/discussions)
|
||||||
* [Mattermost community channel](https://community.mattermost.com/core/channels/focalboard)
|
|
||||||
* [Anonymous feedback form](https://docs.google.com/forms/d/e/1FAIpQLSdTq7M69Pdlz71CwucaSEG0FCK1M_WRvIbZbPr2imfT2QvUCQ/viewform?usp=sf_link)
|
|
||||||
|
|
||||||
Focalboard is an open source project that is in early access. Help shape its future by sharing what you'd like to see with the community.
|
Focalboard is an open source project that is in early access. Help shape its future by sharing what you'd like to see with the community.
|
||||||
|
|
||||||
|
@ -1,184 +1,17 @@
|
|||||||
<footer aria-label="Mattermost Footer" class="site-footer">
|
<footer class='py-5'>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div id="footer-logo">
|
<div class='d-flex justify-content-between'>
|
||||||
<img src="/img/footer-logo.svg" alt="Mattermost Footer Logo" />
|
<a href="/"><img class='header__logo' src="/img/logo.svg?version=v2" alt="Logo" width="180"></a>
|
||||||
|
<div>
|
||||||
|
<a href="https://github.com/mattermost/focalboard#readme-ov-file" target='_blank'>
|
||||||
|
Read me
|
||||||
|
</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/mattermost/focalboard/blob/main/LICENSE.txt" target='_blank'>
|
||||||
|
License
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ul class="footer-menu__single">
|
|
||||||
<li><span class="footer-menu__heading">Company</span>
|
|
||||||
<ul id="menu-footer-company" class="menu">
|
|
||||||
<li id="menu-item-25352"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25352"><a
|
|
||||||
href="https://mattermost.com/about-us/">About Us</a></li>
|
|
||||||
<li id="menu-item-25353"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25353"><a
|
|
||||||
href="https://mattermost.com/newsroom/">Newsroom</a></li>
|
|
||||||
<li id="menu-item-25354"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25354"><a
|
|
||||||
href="https://mattermost.com/partners/">Partners</a></li>
|
|
||||||
<li id="menu-item-25355"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25355"><a
|
|
||||||
href="https://mattermost.com/events/">Events</a></li>
|
|
||||||
<li id="menu-item-25356"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25356"><a
|
|
||||||
href="https://mattermost.com/careers/">Careers</a></li>
|
|
||||||
<li id="menu-item-28328"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28328"><a
|
|
||||||
href="https://mattermost.com/contact-sales/">Contact Us</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<ul class="footer-menu__single">
|
|
||||||
<li><span class="footer-menu__heading">Platform</span>
|
|
||||||
<ul id="menu-footer-platform" class="menu">
|
|
||||||
<li id="menu-item-27084"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27084"><a
|
|
||||||
href="https://mattermost.com/platform-overview/">Platform Overview</a></li>
|
|
||||||
<li id="menu-item-27085"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27085"><a
|
|
||||||
href="https://mattermost.com/channels/">Channels</a></li>
|
|
||||||
<li id="menu-item-27087"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27087"><a
|
|
||||||
href="https://mattermost.com/playbooks/">Playbooks</a></li>
|
|
||||||
<li id="menu-item-27086"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27086"><a
|
|
||||||
href="https://mattermost.com/boards/">Boards</a></li>
|
|
||||||
<li id="menu-item-27088"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-27088"><a
|
|
||||||
href="https://mattermost.com/integrations-overview/">Integrations</a></li>
|
|
||||||
<li id="menu-item-25358"
|
|
||||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-25358"><a
|
|
||||||
href="https://mattermost.com/security/">Security</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<ul class="footer-menu__single">
|
|
||||||
<li><span class="footer-menu__heading">Documentation</span>
|
|
||||||
<ul id="menu-footer-documentation" class="menu">
|
|
||||||
<li id="menu-item-25359"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25359"><a
|
|
||||||
href="https://docs.mattermost.com/guides/deployment.html">Deployment</a></li>
|
|
||||||
<li id="menu-item-25360"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25360"><a
|
|
||||||
href="https://docs.mattermost.com/guides/channels.html">Channels Guide</a></li>
|
|
||||||
<li id="menu-item-30298"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-30298"><a
|
|
||||||
href="https://docs.mattermost.com/guides/playbooks.html">Playbooks Guide</a></li>
|
|
||||||
<li id="menu-item-30299"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-30299"><a
|
|
||||||
href="https://docs.mattermost.com/guides/boards.html">Boards Guide</a></li>
|
|
||||||
<li id="menu-item-25362"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25362"><a
|
|
||||||
href="https://docs.mattermost.com/guides/administration.html">Admin</a></li>
|
|
||||||
<li id="menu-item-25363"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25363"><a
|
|
||||||
href="https://api.mattermost.com/">API Reference</a></li>
|
|
||||||
<li id="menu-item-25364"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25364"><a
|
|
||||||
href="https://docs.mattermost.com/">All Docs</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<ul class="footer-menu__single">
|
|
||||||
<li><span class="footer-menu__heading">Download</span>
|
|
||||||
<ul id="menu-footer-download" class="menu">
|
|
||||||
<li id="menu-item-25365"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25365"><a
|
|
||||||
href="https://mattermost.com/download/">Mobile & Desktop Apps</a></li>
|
|
||||||
<li id="menu-item-25366"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25366"><a
|
|
||||||
href="https://mattermost.com/deploy/">Mattermost Server</a></li>
|
|
||||||
<li id="menu-item-27089"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27089"><a
|
|
||||||
href="https://mattermost.com/trial/">Enterprise Trial License</a></li>
|
|
||||||
<li id="menu-item-27090"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-27090"><a
|
|
||||||
href="https://mattermost.com/sign-up-fb/?utm_source=focalboard&utm_campaign=focalboard">Cloud Trial</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<ul class="footer-menu__single">
|
|
||||||
<li><span class="footer-menu__heading">Support</span>
|
|
||||||
<ul id="menu-footer-support" class="menu">
|
|
||||||
<li id="menu-item-25369"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25369"><a
|
|
||||||
href="https://community.mattermost.com/login">Community Chat Server</a></li>
|
|
||||||
<li id="menu-item-25370"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25370"><a
|
|
||||||
href="https://forum.mattermost.org/">Forums</a></li>
|
|
||||||
<li id="menu-item-25371"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25371"><a
|
|
||||||
href="https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#report-a-bug">Report
|
|
||||||
an Issue</a></li>
|
|
||||||
<li id="menu-item-25372"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25372"><a
|
|
||||||
href="https://handbook.mattermost.com/contributors/contributors/ways-to-contribute#propose-new-features">Nominate
|
|
||||||
a Feature</a></li>
|
|
||||||
<li id="menu-item-28329"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-28329"><a
|
|
||||||
href="https://support.mattermost.com/hc/en-us">Help Center</a></li>
|
|
||||||
<li id="menu-item-30880"
|
|
||||||
class="menu-item menu-item-type-custom menu-item-object-custom menu-item-30880"><a
|
|
||||||
href="https://mattermost.com/support/">Terms</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="secondary-footer__copy">
|
|
||||||
<small class="disclaimer"><span class="mm-copyright" style="margin-right: 1rem;">© Mattermost, Inc.
|
|
||||||
2023.</span> <span><a href="https://mattermost.com/terms-of-use/" title="Terms of Service">Terms
|
|
||||||
of Use</a> <span style="margin: 0 0.5rem;">|</span> <a
|
|
||||||
href="https://mattermost.com/privacy-policy/" title="Privacy Policy">Privacy Policy</a> <span
|
|
||||||
style="margin: 0 0.5rem;">|</span> <a href="https://mattermost.com/privacy-policy/cookies/"
|
|
||||||
title="Cookie Policy">Cookie Policy</a> </span></small>
|
|
||||||
</div>
|
|
||||||
<ul class="secondary-footer__social">
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/mattermost/" target="_blank" rel="noopener noreferrer">
|
|
||||||
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<title>GitHub icon</title>
|
|
||||||
<path
|
|
||||||
d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM20.8293 27.2317C20.5945 27.061 20.3384 26.8262 20.3384 26.5061C20.3384 26.1433 20.3598 25.9299 20.3598 24.3293C20.3598 22.7287 20.1463 22.1524 19.3994 21.6829C21.7043 21.4482 23.1555 20.872 23.8384 19.3567L23.9024 19.2073C23.9665 19.0793 24.0091 18.9299 24.0091 18.9299L24.0945 18.6311C24.2439 18.0549 24.3293 17.372 24.3506 16.561C24.3506 14.3841 23.2835 13.5945 23.0915 13.2317C23.3902 11.5671 23.0488 10.8201 22.878 10.564C22.2805 10.3506 20.8079 11.0976 19.997 11.6311C18.6738 11.247 15.8994 11.2896 14.8537 11.7378C12.9329 10.372 11.9085 10.5854 11.9085 10.5854C11.9085 10.5854 11.247 11.7591 11.7378 13.4665C11.0976 14.2774 10.628 14.8323 10.628 16.3476C10.628 17.2012 10.7348 17.9482 10.9482 18.6098L11.0122 18.7591L11.2043 19.1646L11.2896 19.314C12.0152 20.6159 13.4024 21.4268 15.7713 21.6616C15.4299 21.9177 15.0244 22.3872 14.9817 22.9634C14.5549 23.2409 13.7012 23.3262 13.0396 23.1128C12.122 22.814 11.7591 21 10.372 21.2561C10.0732 21.3201 10.1372 21.5122 10.3933 21.6829C10.8201 21.9604 11.2043 22.3018 11.5244 23.0274C11.7591 23.5823 12.25 24.5854 13.8293 24.5854C14.4482 24.5854 14.8963 24.5213 14.8963 24.5213C14.8963 24.5213 14.9177 25.9299 14.9177 26.4848C14.9177 26.8476 14.6402 27.061 14.4055 27.2317C10.4787 25.8872 7.64024 22.1524 7.64024 17.7561C7.64024 12.2073 12.122 7.72561 17.6707 7.72561C23.2195 7.72561 27.7012 12.2073 27.7012 17.7561C27.6372 22.1311 24.7774 25.8872 20.8293 27.2317Z"
|
|
||||||
fill="#FFFFFF"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://www.linkedin.com/company/mattermost/" target="_blank" rel="noopener noreferrer">
|
|
||||||
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g clip-path="url(#clip0_5:29)">
|
|
||||||
<path
|
|
||||||
d="M17.5 0C14.0388 0 10.6554 1.02635 7.77754 2.94927C4.89968 4.8722 2.65665 7.60532 1.33211 10.803C0.00758061 14.0007 -0.338975 17.5194 0.336266 20.9141C1.01151 24.3087 2.67822 27.4269 5.12564 29.8744C7.57306 32.3218 10.6913 33.9885 14.0859 34.6637C17.4806 35.339 20.9993 34.9924 24.197 33.6679C27.3947 32.3433 30.1278 30.1003 32.0507 27.2225C33.9737 24.3446 35 20.9612 35 17.5C35 12.8587 33.1563 8.40751 29.8744 5.12562C26.5925 1.84374 22.1413 0 17.5 0ZM13.6287 24.9033C13.6281 24.9734 13.6001 25.0403 13.5505 25.0898C13.501 25.1394 13.4341 25.1674 13.364 25.168H10.2887C10.2185 25.168 10.1512 25.1401 10.1016 25.0905C10.052 25.0408 10.0241 24.9735 10.0241 24.9033V15.0073C10.0247 14.9373 10.0527 14.8703 10.1022 14.8208C10.1517 14.7713 10.2187 14.7432 10.2887 14.7427H13.364C13.4341 14.7432 13.501 14.7713 13.5505 14.8208C13.6001 14.8703 13.6281 14.9373 13.6287 15.0073V24.9033ZM11.8317 13.9104C11.4263 13.9108 11.0299 13.7909 10.6927 13.566C10.3554 13.341 10.0925 13.021 9.93716 12.6466C9.78183 12.2721 9.74108 11.86 9.82006 11.4624C9.89904 11.0648 10.0942 10.6995 10.3809 10.4129C10.6675 10.1262 11.0328 9.93105 11.4304 9.85207C11.828 9.77308 12.2402 9.81383 12.6146 9.96916C12.9891 10.1245 13.309 10.3874 13.534 10.7247C13.7589 11.0619 13.8788 11.4583 13.8784 11.8637C13.8772 12.4062 13.6613 12.9261 13.2777 13.3097C12.8941 13.6932 12.3742 13.9092 11.8317 13.9104ZM25.1488 24.8948C25.1482 24.9648 25.1202 25.0318 25.0707 25.0813C25.0212 25.1308 24.9542 25.1589 24.8842 25.1594H21.811C21.7408 25.1594 21.6735 25.1316 21.6239 25.0819C21.5742 25.0323 21.5464 24.965 21.5464 24.8948V20.0994C21.5464 18.6759 21.4503 17.7412 20.1805 17.7412C18.9107 17.7412 18.6332 18.6119 18.6332 20.0161V24.9119C18.6327 24.9819 18.6046 25.0489 18.5551 25.0984C18.5056 25.1479 18.4386 25.176 18.3686 25.1765H15.2976C15.2626 25.1768 15.228 25.1702 15.1957 25.157C15.1633 25.1438 15.1339 25.1244 15.1091 25.0998C15.0843 25.0752 15.0646 25.0459 15.0511 25.0136C15.0377 24.9814 15.0308 24.9468 15.0308 24.9119V15.0073C15.0314 14.9369 15.0597 14.8696 15.1097 14.8201C15.1596 14.7705 15.2272 14.7427 15.2976 14.7427H18.2448C18.3152 14.7427 18.3827 14.7705 18.4327 14.8201C18.4827 14.8696 18.511 14.9369 18.5116 15.0073V15.528C19.1134 14.9689 20.1015 14.6253 21.2284 14.6253C24.7028 14.6253 25.1488 17.2183 25.1488 19.4741V24.8948Z"
|
|
||||||
fill="white"></path>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_5:29">
|
|
||||||
<rect width="35" height="35" fill="white"></rect>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://www.facebook.com/Mattermost-2300985916642531/" target="_blank"
|
|
||||||
rel="noopener noreferrer">
|
|
||||||
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<title>Facebook icon</title>
|
|
||||||
<path
|
|
||||||
d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM21.7043 11.7378H20.0183C18.9085 11.7378 18.8445 12.1433 18.8445 12.9329V14.5549H21.4909L21.1707 17.4573H18.8445V26.0579H14.9604V17.4573H13.4451V14.5549H14.9604V12.6982C14.9604 10.2866 15.9634 8.83537 18.8232 8.83537H21.7043V11.7378Z"
|
|
||||||
fill="#FFFFFF"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="https://twitter.com/mattermost" target="_blank" rel="noopener noreferrer">
|
|
||||||
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<title>Twitter icon</title>
|
|
||||||
<path
|
|
||||||
d="M17.5 0C7.83232 0 0 7.83232 0 17.5C0 27.1677 7.83232 35 17.5 35C27.1677 35 35 27.1677 35 17.5C35 7.83232 27.1677 0 17.5 0ZM24.0091 14.1494C24.0091 14.2988 24.0091 14.4268 24.0091 14.5762C24.0091 18.9726 20.6799 24.0305 14.5549 24.0305C12.6768 24.0305 10.9268 23.4756 9.47561 22.5366C9.73171 22.5579 10.0091 22.5793 10.2652 22.5793C11.8232 22.5793 13.253 22.0457 14.3841 21.1494C12.9543 21.128 11.7378 20.1677 11.311 18.8445C11.503 18.8872 11.7165 18.9085 11.9299 18.9085C12.2287 18.9085 12.5274 18.8659 12.8049 18.8018C11.2896 18.503 10.1372 17.1585 10.1372 15.5366C10.1372 15.5152 10.1372 15.5152 10.1372 15.4939C10.5854 15.75 11.0976 15.8994 11.6311 15.8994C10.7348 15.3018 10.1585 14.2774 10.1585 13.1463C10.1585 12.5274 10.3293 11.9726 10.6067 11.4817C12.25 13.4878 14.6829 14.811 17.4573 14.9604C17.3933 14.7256 17.372 14.4695 17.372 14.2134C17.372 12.378 18.8659 10.8841 20.7012 10.8841C21.6616 10.8841 22.5152 11.2896 23.1341 11.9299C23.8811 11.7805 24.6067 11.503 25.247 11.1189C24.9909 11.8872 24.4787 12.5488 23.7957 12.9543C24.4573 12.8689 25.0976 12.6982 25.6951 12.4421C25.2256 13.0823 24.6707 13.6799 24.0091 14.1494Z"
|
|
||||||
fill="#FFFFFF"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<link rel="stylesheet" href="{{ "css/bootstrap.min.css" | absURL }}">
|
<link rel="stylesheet" href="{{ "css/bootstrap.min.css" | absURL }}">
|
||||||
<link rel="stylesheet" href="{{ "css/tabs.css" | absURL }}">
|
<link rel="stylesheet" href="{{ "css/tabs.css" | absURL }}">
|
||||||
<link rel="stylesheet" href="{{ "css/bar.css" | absURL }}">
|
<link rel="stylesheet" href="{{ "css/bar.css" | absURL }}">
|
||||||
<link rel="stylesheet" href="{{ "css/styles.css" | absURL }}?version=v8">
|
<link rel="stylesheet" href="{{ "css/styles.css" | absURL }}?version=v9">
|
||||||
<link rel="stylesheet" href="{{ "css/code.css" | absURL }}">
|
<link rel="stylesheet" href="{{ "css/code.css" | absURL }}">
|
||||||
<link rel="stylesheet" href="{{ "css/note.css" | absURL }}">
|
<link rel="stylesheet" href="{{ "css/note.css" | absURL }}">
|
||||||
|
|
||||||
|
@ -1,15 +1,14 @@
|
|||||||
<div class="homepage__intro homepage__section">
|
<div class="homepage__intro homepage__section">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="homepage-intro__text" data-aos="fade-left">
|
<div class="homepage-intro__text" data-aos="fade-left">
|
||||||
<div class="focalboard-tag">Focalboard is now Mattermost Boards <img src="img/bullseye.svg" alt=""></div>
|
|
||||||
<h1>
|
<h1>
|
||||||
Open source <br> project management for <span style='color: #ffbc1f'>technical teams</span>
|
Open source <br> project management for <span style='color: #ffbc1f'>technical teams</span>
|
||||||
</h1>
|
</h1>
|
||||||
<p>
|
<p>
|
||||||
Keep everything and everyone on track, all in the Mattermost platform.
|
Keep everything and everyone on track.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<a href="https://mattermost.com/sign-up-fb/?utm_source=focalboard&utm_campaign=focalboard" target='_blank'><button class='btn btn-primary btn-xl'>Get started</button></a>
|
<a href="https://github.com/mattermost/focalboard" target='_blank'><button class='btn btn-primary btn-xl'>Get started</button></a>
|
||||||
|
|
||||||
<div class='homepage-intro__github'><i class="fa fa-star"></i> Over 13k stars on <a target='_blank' href="https://github.com/mattermost/focalboard" class='mx-1 text-white'>GitHub</a> and counting!</div>
|
<div class='homepage-intro__github'><i class="fa fa-star"></i> Over 13k stars on <a target='_blank' href="https://github.com/mattermost/focalboard" class='mx-1 text-white'>GitHub</a> and counting!</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,23 +1,10 @@
|
|||||||
<div class='mmtrust-banner'>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<div class="title">MATTERMOST IS TRUSTED BY TEAMS AROUND THE WORLD</div>
|
|
||||||
<div class='mmtrust_banner__logos'>
|
|
||||||
<a target="_blank" href="https://www.qualcomm.com/home"><img src="img/teams/qualcom.svg" alt=""></a>
|
|
||||||
<a target="_blank" href="https://www.nasa.gov"><img src="img/teams/nasa.svg" alt=""></a>
|
|
||||||
<a target="_blank" href="https://www.aig.com"><img src="img/teams/aig.svg" alt=""></a>
|
|
||||||
<a target="_blank" href="https://www.nasdaq.com"><img src="img/teams/nasdaq.svg" alt=""></a>
|
|
||||||
<a target="_blank" href="https://www.samsung.com"><img src="img/teams/samsung.svg" alt=""></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class='section-half'>
|
<div class='section-half'>
|
||||||
<div class="section-half__container">
|
<div class="section-half__container">
|
||||||
<div data-aos="fade-right">
|
<div data-aos="fade-right">
|
||||||
<img src="img/3d-icons/rocket.svg" alt="Rocket Icon">
|
<img src="img/3d-icons/rocket.svg" alt="Rocket Icon">
|
||||||
<h2>Accelerate productivity</h2>
|
<h2>Accelerate productivity</h2>
|
||||||
<p>
|
<p>
|
||||||
Centralize, plan, and track all your work in one place. Mattermost Boards helps your organization maintain a single source of truth, so your teams stay aligned to complete tasks, reach milestones, and achieve their goals.
|
Centralize, plan, and track all your work in one place. Focalboard helps your organization maintain a single source of truth, so your teams stay aligned to complete tasks, reach milestones, and achieve their goals.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section-half__visual" data-aos="fade-left">
|
<div class="section-half__visual" data-aos="fade-left">
|
||||||
@ -102,7 +89,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="template-picker-item" x-bind:class="{ 'active': template == 6 }" @click='template = 6'>
|
<div class="template-picker-item" x-bind:class="{ 'active': template == 6 }" @click='template = 6'>
|
||||||
<span class='template-picker-item__emoji'>👋</span>
|
<span class='template-picker-item__emoji'>👋</span>
|
||||||
<span class='template-picker-item__title'>Welcome to Boards</span>
|
<span class='template-picker-item__title'>Welcome to Focalboard</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="template-picker__preview">
|
<div class="template-picker__preview">
|
||||||
@ -111,7 +98,7 @@
|
|||||||
<img x-cloak x-transition.duration.500 x-show='template == 3' src="img/templates/company-goals.png" alt="Company Goals Template">
|
<img x-cloak x-transition.duration.500 x-show='template == 3' src="img/templates/company-goals.png" alt="Company Goals Template">
|
||||||
<img x-cloak x-transition.duration.500 x-show='template == 4' src="img/templates/roadmap.png" alt="Roadmap Template">
|
<img x-cloak x-transition.duration.500 x-show='template == 4' src="img/templates/roadmap.png" alt="Roadmap Template">
|
||||||
<img x-cloak x-transition.duration.500 x-show='template == 5' src="img/templates/meeting-agenda.png" alt="Meeting Agenda Template">
|
<img x-cloak x-transition.duration.500 x-show='template == 5' src="img/templates/meeting-agenda.png" alt="Meeting Agenda Template">
|
||||||
<img x-cloak x-transition.duration.500 x-show='template == 6' src="img/templates/welcome.png" alt="Welcome to Boards Template">
|
<img x-cloak x-transition.duration.500 x-show='template == 6' src="img/templates/welcome.png?version=v3" alt="Welcome to Boards Template">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -155,9 +142,9 @@
|
|||||||
<div class="section-half__container">
|
<div class="section-half__container">
|
||||||
<div data-aos="fade-left">
|
<div data-aos="fade-left">
|
||||||
<img src="img/3d-icons/development.svg" alt="Open source Icon">
|
<img src="img/3d-icons/development.svg" alt="Open source Icon">
|
||||||
<h2>Mattermost Boards is 100% open source</h2>
|
<h2>Focalboard is 100% open source</h2>
|
||||||
<p>
|
<p>
|
||||||
Mattermost Boards is an open source alternative to tools like Asana, Trello, and Notion. Check out the <a target='_blank' href="https://github.com/mattermost/focalboard">source code on GitHub</a>, and contribute to the future of this project. Join the discussion on the <a href="https://community.mattermost.com/core/channels/focalboard" target="_blank">Mattermost community</a> to interact with other Mattermost and Focalboard contributors and users.
|
Focalboard is an open source alternative to tools like Asana, Trello, and Notion. Check out the <a target='_blank' href="https://github.com/mattermost/focalboard">source code on GitHub</a>, and contribute to the future of this project. Join the discussion on the <a href="https://community.mattermost.com/core/channels/focalboard" target="_blank">Mattermost community</a> to interact with other Mattermost and Focalboard contributors and users.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section-half__visual" data-aos="fade-right">
|
<div class="section-half__visual" data-aos="fade-right">
|
||||||
@ -166,7 +153,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='section-half roadmap-section'>
|
{{/* <div class='section-half roadmap-section'>
|
||||||
<div class="section-half__container">
|
<div class="section-half__container">
|
||||||
<div data-aos="fade-left">
|
<div data-aos="fade-left">
|
||||||
<img src="img/3d-icons/firstbump.svg" alt="Fistbump Icon">
|
<img src="img/3d-icons/firstbump.svg" alt="Fistbump Icon">
|
||||||
@ -189,7 +176,7 @@
|
|||||||
x-show='roadmapItem == 3' src="img/roadmap/analytics.png" alt="Analytics and Reporting Image" width='800px'>
|
x-show='roadmapItem == 3' src="img/roadmap/analytics.png" alt="Analytics and Reporting Image" width='800px'>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> */}}
|
||||||
|
|
||||||
<div class="help-section" data-aos="fade-up">
|
<div class="help-section" data-aos="fade-up">
|
||||||
<div class='section-half'>
|
<div class='section-half'>
|
||||||
@ -197,9 +184,9 @@
|
|||||||
<div>
|
<div>
|
||||||
<h2>Need help?</h2>
|
<h2>Need help?</h2>
|
||||||
<p>
|
<p>
|
||||||
We have tons of documentation to help you make the most out of boards, head over to our documentation site to learn more about boards.
|
We have tons of documentation to help you make the most out of focalboard, head over to our documentation site to learn more about focalboard.
|
||||||
</p>
|
</p>
|
||||||
<a href='https://docs.mattermost.com/guides/boards.html' target='_blank'>
|
<a href='https://github.com/mattermost/focalboard/#readme' target='_blank'>
|
||||||
<button class='btn btn-primary btn-xl'>
|
<button class='btn btn-primary btn-xl'>
|
||||||
<span>Go to docs</span>
|
<span>Go to docs</span>
|
||||||
<img src="img/arrow-right.svg" alt="Arrow right">
|
<img src="img/arrow-right.svg" alt="Arrow right">
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<header>
|
<header>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a href="/"><img class='header__logo' src="/img/logo.svg?version=v2" alt="Logo" width="180"></a>
|
<a href="/"><img class='header__logo' src="/img/logo.svg?version=v3" alt="Logo" width="180"></a>
|
||||||
<div class="header__menu-toggle">
|
<div class="header__menu-toggle">
|
||||||
<div class="menu-bar"></div>
|
<div class="menu-bar"></div>
|
||||||
<div class="menu-bar"></div>
|
<div class="menu-bar"></div>
|
||||||
@ -15,7 +15,7 @@
|
|||||||
<li><a class="external" rel="noopener" href="{{ .URL }}">{{ .Name }}</a></li>
|
<li><a class="external" rel="noopener" href="{{ .URL }}">{{ .Name }}</a></li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<li class='header__feedback'>
|
<li class='header__feedback'>
|
||||||
<a target='_blank' href='https://mattermost.com/sign-up-fb/?utm_source=focalboard&utm_campaign=focalboard'><button class='btn btn-primary'>Get started</button></a>
|
<a target='_blank' href='https://github.com/mattermost/focalboard'><button class='btn btn-primary'>Get started</button></a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
/*New Footer*/
|
/*New Footer*/
|
||||||
|
|
||||||
|
footer .container {
|
||||||
|
padding: 4rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
footer #footer-logo {
|
footer #footer-logo {
|
||||||
grid-column: 1 / -1;
|
grid-column: 1 / -1;
|
||||||
max-width: 18.8rem;
|
max-width: 18.8rem;
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
.homepage h1 {
|
.homepage h1 {
|
||||||
font-size: 56px;
|
font-size: 56px;
|
||||||
margin: 24px 0;
|
margin: 0 0 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.homepage h2 {
|
.homepage h2 {
|
||||||
|
15
website/site/static/img/logo-w-mattermost.svg
Normal file
15
website/site/static/img/logo-w-mattermost.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 23 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 11 KiB |
Binary file not shown.
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 55 KiB |
Loading…
Reference in New Issue
Block a user