Commit graph

329 commits

Author SHA1 Message Date
Jesús Espino
6a7d3f797b
Websocket client now connects once and subscribe/desubscribe on the fly (#752)
* Websocket client now connects once and subscribe/desubscribe on the fly

* Fixing eslint error

Co-authored-by: Harshil Sharma <harshilsharma63@gmail.com>
2021-07-28 18:14:18 +02:00
Doug Lauder
efedf2f481
Fix nil stringer error (#788)
* fix nil stringer error
* include API path with all API ERROR logs
* enable "caller" field
* disable colour output and min msg length for plugin
* bump Logr version to v2.0.4
2021-07-27 12:57:29 -04:00
dave
a98bcb98ff
Add more unit tests for ./store/sqlstore/user.go (#787)
* Add more unit tests for ./store/sqlstore/user.go

* replace require.Nil to require.NoError

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>
2021-07-27 11:42:02 -04:00
Chen-I Lim
3b11202e3d
InsertBlock per workspace logic (#777) 2021-07-24 08:08:25 -07:00
dave
bafa32108d
[GH-428] Add unit tests for ./store/sqlstore/session.go (#729)
* fix can't delete session

* Add unit tests for  ./server/store/sqlstore/session.go

* fix ci lint complain

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>
Co-authored-by: Hossein <hahmadia@users.noreply.github.com>
2021-07-22 07:56:25 -04:00
Miguel de la Cruz
0bd6233fac
Refactor the websockets connection messages and lifecycle (#749)
* Refactor the websockets connection messages and lifecycle

* Modify frontend to subscribe to a workspace instead of a set of blocks

* Fixing linter errors

Co-authored-by: Jesús Espino <jespinog@gmail.com>
2021-07-19 15:04:17 +05:30
Chen-I Lim
73225e959b Merge release-0.8.0 2021-07-16 10:30:45 -07:00
Doug Lauder
f317574a6d
add mlog package to stack filter list (#717) 2021-07-15 11:42:53 -04:00
Doug Lauder
a0524dd386
Lint server & plugin for CI (#720)
* enable CI linting for server and plugin
* replace `golint` (deprecated) with `revive`
* use GH actions for lint
2021-07-14 09:36:18 -04:00
Chen-I Lim
1b45e16e52 Update to v0.8.0 2021-07-09 09:36:57 -07:00
Doug Lauder
0dec704ddc
fix linter errors in plugin (#696) 2021-07-09 12:59:44 +02:00
Harshil Sharma
74cf28fee5
Added missed test (#695)
* Fixed missing errors

* Used missed test
2021-07-09 00:36:50 -04:00
Harshil Sharma
e0ccfb90e7
Fixed missing errors (#694) 2021-07-09 09:11:54 +05:30
Doug Lauder
ebd477464b
fix remaining golangci linter warnings (#686)
* fix remaining linter warnings
2021-07-08 21:09:02 -04:00
Harshil Sharma
e0ec1c03e0
New Props: Created By, Created At, Updated By, Updated At (#583)
* Added create_at column for blocks

* Populating created by

* Added logic for storing created by

* Added GetBlock by ID to store interface

* Added creayed by and modified by properties

* Added created by and modified by properties

* Added lastmodifiedat property

* Fixed existing webapp test

* Added webapp unit tests

* Added webapp unit tests

* Added webapp unit tests

* Adding server test

* Added server tests

* Fixed a bug causing created by to be set empty

* Avodining timezone specific test behavior

* Made cypress viewport bigger to avoid out-of-viewoport issues in multiple tests

* Removed a leftover comment

* Added updated at/by in table view

* Added updated at in card view

* Fixing sort

* Fixed sorting of updated by

* Fixed existing tests

* Added table tests

* Added cardTree fix

* Fixed tests

* Removed unused import

* Update snapshots

* Added a tamper attempt test

* Removed some leftover debug code

* Removed sending creator from client

* Fixed lint error

* Fixed a build issue

* Avoided setting insert query params multiple times

* Multiple minor review fixes

* Fixed test
2021-07-08 20:06:43 +05:30
Doug Lauder
6e214ebc3d
Ensure all code paths close *sql.Rows (#679)
* ensure all code paths close *sql.Rows
2021-07-06 16:44:11 -04:00
Jesús Espino
0811052a9b Fixing workspace title generation 2021-07-01 11:29:12 +02:00
Harshil Sharma
1020c03924
Prevented concurrent writes to websocket (#658)
* retained individual connection objects

* unlocking lock in defer

* Completely abstracted internal connection object

* Completely removed direct use of WS connection
2021-07-01 08:11:29 +02:00
Agniva De Sarker
8e72b9c528
Add RPC API support to plugin (#619)
* Add RPC API support to plugin

We use the mattermost-plugin-api client to create the sql.DB object
and pass it to the store.

To keep a common point of entry for both the standalone server
and plugin, we refactor the store creation part out of server.New
and pass the DB as a dependency to the server constructor.

This allow us to create different stores in plugin and standalone,
so that the server code remains unaware of any differences.

https://focalboard-community.octo.mattermost.com/workspace/zyoahc9uapdn3xdptac6jb69ic?id=285b80a3-257d-41f6-8cf4-ed80ca9d92e5&v=495cdb4d-c13a-4992-8eb9-80cfee2819a4&c=c7386db7-65fd-469b-8bcf-8dc8f8e61e4f

* Support linux desktop app

* refactor

* fix typos

* Change authlayer to use existing DB conn too
2021-06-25 16:49:06 +02:00
Doug Lauder
66975bdfe9
First pass linter cleanup (#603)
* first pass linter cleanup

* address review comments
2021-06-21 11:21:42 +02:00
Doug Lauder
edc3eb7e8f
Refactor App lifecycle (#590)
* remove Server dep from App

* remove appbuilder
2021-06-18 16:03:42 +02:00
Doug Lauder
ddfae3266a
rename logger & audit config (#591) 2021-06-18 16:01:36 +02:00
Doug Lauder
d5096379de
Remove enterprise symlink (#589)
* fix make

* remove enterprise server build from make

* remove enterprise ifaces

* update .gitignore
2021-06-18 07:48:01 +02:00
Doug Lauder
5c69113911
Auditing (#542)
* audit wip

* finish API coverage

* fix unit test

* remove sample logging and audit config

* default logger

* fix go.mod and go.sum
2021-06-11 14:24:51 +02:00
Jesús Espino
3ae3c5fce1
Adding the users for workspace in mattermost layer (#564) 2021-06-11 12:40:22 +02:00
Miguel de la Cruz
9b5e0483f5
Fix MySQL migration connection when the DSN doesn't contain any query parameters (#557) 2021-06-11 11:18:11 +02:00
Doug Lauder
46243c1ad1
Telemetry and metrics (#496)
- total blocks by block type
- total workspaces
- blocks activity (insert/delete)
- login success / fail
2021-06-04 10:38:49 -04:00
Harshil Sharma
90f6389745
Person Property Type (#406)
* Added getWorkspaceUsers API

* Integrated workspace user API in UI

* Integrated workspace user API in UI

* Added toto for implementation slot

* Implemenmted getWorkspaceUSers to get data from Focalboard DB

* Updated store mocks

* Made select styles a shared constant

* Removed unwanted diffs

* Removed unwanted diffs

* Updated snapshots for new property type

* Added user store test

* Added missing copyright notice

* Returning error if no users found to retain original behavior

* Minor fixes and added tests

* Minor fixes

* Used React context for workspace users

* Used useContext hook, and added additional user ID -> user context to avoid that computation by all componnets

* Mergerd both workspace user contextx

* Minor review fix
2021-06-04 18:53:15 +05:30
Doug Lauder
68d492a855
Bump Logr version to fix Windows build (#520)
* bump Logr version to fix Windows build

* fix return args for syslog_unsupported
2021-06-04 08:43:32 +02:00
Matheus Mosca
ac320ece25
Add units tests for app/sharing.go (#454)
* tests: add units tests for GetSharing

* tests: add unit tests for UpsertSharing

* refactor: add test helper in sharing unit tests

* cleanup
2021-06-03 14:59:16 -05:00
Doug Lauder
417de9f837
Logger for FocalBoard server (#466)
- structured, asynchronous logging
- supports discreet log levels, including custom levels
- supports output to console, files, and all common log aggregators.
- supports JSON, plain text and GELF formats
- lazy formatting and writing
2021-05-29 02:23:10 -04:00
Harshil Sharma
3bf9d9382e
Clickable Links (#393)
* Added implementation for making links clickable

* Improved some clicking UX

* Removed unused stuff

* Fixed lint issues

* Added Compass Icons to Focalboard

* Updaed go.mod

* Made sure links in URL property are always assumed as absolute

* Removed unnecessary JSX code block

* Allowing only http and https protocols

* Removed unused extensions from file loader

* Icon and URL imporvements

* Added React component for Compass Icons.
* Allowed URLs with any arbitrary protocol.
2021-05-26 16:14:09 +05:30
Scott Bishel
6cb7e49a2b
add unit tests (#422)
* add unit tests

* cleanup

* cleanup

* rename helper file, remove gomock.eq()

* update import
2021-05-26 12:38:43 +02:00
Carlos Tadeu Panato Junior
36acff4476
Add GitLab ci to build internally and bump go to 1.16 (#468)
* update go to 1.16

* add gitlab ci to build focalboard
2021-05-26 12:34:42 +02:00
Miguel de la Cruz
b327bc7b8a
Adds plugin actions to the project's CI (#471)
* Adds plugin actions to the project's CI

* Remove the version number from the generated artifact

* Change job name to something more descriptive

* Switch back to workflow_dispatch
2021-05-25 19:22:31 +02:00
Jesús Espino
f1b8d88d6b
Changing mattermost-auth method to work based on shared database access (#335)
* Improving mattermost auth implementation

* Making mattermost-auth based on shared database access

* Reverting unneeded changes in the config.json file

* Fixing tiny problems

* Removing the need of using the mattermost session token

* Fixing some bugs and allowing to not-bind the server to any port

* Small fix to correctly get the templates

* Adding the mattermost-plugin code inside focalboard repo

* Adding a not working code part of the cluster websocket communication

* Updating the mattermost version

* Adding the cluster messages for the websockets

* Updating to the new node version

* Making it compatible with S3

* Addressing some tiny problems

* Fixing server tests

* Adds support for MySQL migrations and initialization

Co-authored-by: Miguel de la Cruz <miguel@mcrx.me>
2021-05-24 19:06:11 +02:00
Chen-I Lim
4c3f14e027 Merge release-0.6.7 2021-05-24 09:59:30 -07:00
Jesús Espino
2d542bbd30 Removing unneeded test 2021-05-24 17:47:38 +02:00
Jesús Espino
746105f14b Removed insecure and not used method 2021-05-24 14:49:40 +02:00
Spiros Economakis
8f746a44bd
Enable prometheus metrics for Focalboard to enable observability (#414)
As an SRE team we would like to expose standard metrics and grouped by version
of the application. Right now will expose only metrics related to Go but instrumentor
should be used in other parts of the codebase so we can track other metrics, eg.
number of tasks, boards, users etc. Similar as we do in MM.

It will run in port `localhost:9092` and it is a new config `prometheus_address`.

Also in the commit we introduced, `group.Add` which helps us to handle gracefully
errors for goroutines. It's a good practice and there are couple of articles by
Golang for this.
2021-05-18 17:12:51 +03:00
Hossein
e2dd9a978a
Add Export/import board (#403)
* Resolve GH-261

* fix eslint

* Address comments

* update mocks

* add test
2021-05-13 15:04:49 -06:00
Harshil Sharma
1f60e70ef3
Used Node 16 and prevented soctet error from starting (#402) 2021-05-11 11:56:40 +02:00
Chen-I Lim
5fe51a9c0c Update for v0.6.7 2021-05-10 12:22:42 -07:00
Harshil Sharma
21c5284d6d
#GH-31 Configured Golangci-Lint and fixed errors (#381)
* Moved golangci-lint config to config file

* Fixed all golangci lint errors

* Not allowing telemetry shutdown error to prevent store from closing

* Remved golangci-lint presets
2021-05-10 17:15:27 +02:00
Jesús Espino
842c2cc0ab Adding system store tests 2021-04-30 16:48:45 +02:00
Jesús Espino
8860f60948 Adding extra test to cover more functions in blocks store 2021-04-30 16:31:04 +02:00
Chen-I Lim
1801422543
Fixes for workspace support (#321) 2021-04-26 13:43:02 +02:00
Jesús Espino
2d261fde59
Adding mysql support to the database (#301)
* Adding mysql support

* Fixing other test cases

* Tests passing on mysql

* Fix the row number generation

* Adding blocks_history table

* merging the migrations in one single set of files

* Passing mysql tests

* Fixing default encoding on mysql

* Simplifying things

* Removing from the blocks table all deleted blocks

* Better indentation

* Moving db types to constants to make it less error prone

* reducing duplicated code

* Removing log line

* Now sql tests are running properly in mysql, sqlite and postgres
2021-04-22 22:53:01 +02:00
Chen-I Lim
4a5d7c4a64
Fix #312. Release 0.6.6 (#313)
* Fixed #269

* Fixing checkbox widht

* Fix #274. Add re-login button to error page.

* Fix #276. Login page title

* Rev Mac build version

* Update changelog for v0.6.5

* Rev Mac build number

* GitHub Actions: Build with Xcode 12.4

* Fix #297: Mac keybpard handling

* Rev Mac built to 12

* Update to v0.6.6

* Fix #312. Windows app images

* Move db and files to Documents\Focalboard on standalone Win app

* Make Win app fixupp code more robust

Co-authored-by: Jesús Espino <jespinog@gmail.com>
2021-04-21 18:25:26 -07:00
Chen-I Lim
e61ba4a7a8 Update to v0.6.6 2021-04-21 12:56:14 -07:00
Jesús Espino
ec1de1c9c2
merging the migrations in one single set of files (#289) 2021-04-20 11:27:20 +02:00
Jesús Espino
d668bf6626 Fix a backward compatibility problem 2021-04-17 10:05:07 +02:00
Jesús Espino
83375684af Adding tablePrefix support 2021-04-17 09:09:34 +02:00
Jesús Espino
5ab3f8d3ce
Addining subpath support (#241)
* Addining subpath support

* Fixing a subpath problem in suburls

* Using the server root for allow subpaths

* Fixing baseURL variable name

* Some improvements

* Making it work in mattermost plugin

* Fixing eslint warnings

* Fixing cypress tests
2021-04-16 13:42:37 +02:00
Chen-I Lim
bc5787ff3a Update version to v0.6.5 2021-04-13 11:04:22 -07:00
ziprandom
530dc81a1c server: additionally read config settings from env
make the server app read configuration settings from execution
environment to make server deployments more convenient.
2021-04-01 10:36:56 +00:00
Chen-I Lim
41ccd7651c Fixup for old file path 2021-03-31 15:30:25 -07:00
Chen-I Lim
c47333948e Rev to v0.6.2 2021-03-31 11:59:07 -07:00
Chen-I Lim
7be7bed916 Show workspace title in sidebar 2021-03-30 15:25:16 -07:00
Chen-I Lim
3531c8307d Global template support 2021-03-30 14:04:00 -07:00
Jesús Espino
c435b23f29
Merge pull request #212 from jespino/better-enterprise-integration
Better enterprise integration
2021-03-30 19:57:40 +02:00
Chen-I Lim
8901bb964c filepath.Join 2021-03-30 10:06:11 -07:00
Chen-I Lim
9ff340c989 Store files per workspace and root block 2021-03-29 16:27:35 -07:00
Chen-I Lim
771be97c3e Workspace support in websockets 2021-03-29 13:00:40 -07:00
Chen-I Lim
aa363041e7 Support worksapce in websocket 2021-03-29 12:31:42 -07:00
Jesús Espino
a8d3d98881 Better enterprise integration 2021-03-29 20:10:12 +02:00
Chen-I Lim
98bfd5a57a Allow sharing with workspace 2021-03-29 10:41:27 -07:00
Chen-I Lim
0b479ff3ae Handle workspace in websocket 2021-03-26 18:04:23 -07:00
Chen-I Lim
68f2b5bedb Fix delimiter for postgres 2021-03-26 13:55:14 -07:00
Chen-I Lim
725971784b Workspace backend support 2021-03-26 11:01:54 -07:00
Jesús Espino
118ba53077 Updating server dependencies 2021-03-26 11:44:46 +01:00
Bo-Yi Wu
2b4e03eed6 chore(format): update coding style 2021-03-21 16:28:26 +08:00
Chen-I Lim
a34c9a7128 Fix #136: Update the displayed version 2021-03-19 09:59:46 -07:00
Emrecan BATI
13339663bb Remove unversioned mattermost-server dependency 2021-03-18 19:26:40 +03:00
Jesús Espino
3290ab48b8 Fixing email validation 2021-03-18 13:34:42 +01:00
lutfuahmet
4887aee648 Register Request email validation 2021-03-18 10:32:23 +03:00
Chen-I Lim
af7f666eff Return JSON empty array when not found, and handle null arrays 2021-03-08 16:08:17 -08:00
Chen-I Lim
eaf8321f52 Update to v0.6.0 2021-03-08 09:36:14 -08:00
Chen-I Lim
da6ffd3eb0 Windows WPF / UWP app 2021-03-01 11:36:36 -08:00
Chen-I Lim
02e436c902 Store fileId for image blocks instead of url 2021-02-23 11:42:28 -08:00
Chen-I Lim
a6920d9bad Link to openAPI html doc 2021-02-17 11:32:03 -08:00
Chen-I Lim
1ad985232d Add Swagger / OpenAPI docs 2021-02-17 11:29:20 -08:00
Chen-I Lim
0082fd0dd3 Move single-user-token to environment var 2021-02-11 10:13:17 -08:00
Chen-I Lim
656d1c7851 single user token in server tests 2021-02-09 16:07:41 -08:00
Chen-I Lim
3ba6f7fa0a Disable login, reg, change password for single-user 2021-02-09 15:58:08 -08:00
Chen-I Lim
0fe96ad7ed Check for single user token 2021-02-09 12:27:34 -08:00
Chen-I Lim
1957e1dbaa cleanup 2021-02-05 11:22:56 -08:00
Chen-I Lim
c484eb8c43 Don't require CSRF token for get files 2021-02-05 10:45:28 -08:00
Chen-I Lim
daf83691b1 Refactor API to use middleware 2021-02-05 10:28:52 -08:00
Chen-I Lim
519cfacaf2 Add X-Requested-With to server test 2021-02-03 10:42:06 -08:00
Chen-I Lim
d655ca3af6 Add X-Requested-With header check for CSRF 2021-02-03 10:16:37 -08:00
Chen-I Lim
37987a2a61 getSharing requires session 2021-02-03 10:12:27 -08:00
Chen-I Lim
79b79b35bc Auth readToken in websocket 2021-02-02 18:21:37 -08:00
Chen-I Lim
26f73135bc Version 0.5.0 2021-02-02 14:34:10 -08:00
Chen-I Lim
c2894693ea websocket: send not authenticated error 2021-02-02 13:17:34 -08:00
Chen-I Lim
a56cf03e0c websocket private functions 2021-02-02 13:00:22 -08:00
Chen-I Lim
58c967bf53 Cleanup 2021-02-02 12:57:36 -08:00
Chen-I Lim
5db1d00d64 Refactor app auth 2021-02-02 12:11:21 -08:00
Chen-I Lim
b3e660d354 Websocket auth 2021-02-02 12:06:28 -08:00
Chen-I Lim
12d24a5aed Check user not found for updateUser 2021-02-01 10:49:57 -08:00
Chen-I Lim
c0f71f870e Rename admin local socket 2021-02-01 10:31:06 -08:00
Jesús Espino
52c38ff7c2 Add sharing unit tests 2021-01-29 20:27:43 +01:00
Jesús Espino
68561f0f6b Add more block store tests 2021-01-29 19:32:33 +01:00
Jesús Espino
7ee3213641 Improving blocks tests 2021-01-29 19:21:55 +01:00
Jesús Espino
baad055cc9 Moving tests outside the sqlstore to allow future no-sql implementations 2021-01-29 17:50:20 +01:00
Chen-I Lim
b72f5ced7d Rename focalboard-server binary 2021-01-28 14:23:52 -08:00
Jesús Espino
8eb1559898 Fixing update session store call 2021-01-27 19:24:19 +01:00
Chen-I Lim
3b4f712649 active user count 2021-01-27 10:01:24 -08:00
Chen-I Lim
d641039131 Registered user count 2021-01-27 09:22:33 -08:00
Chen-I Lim
b4e52b4073 localOnly config flag 2021-01-26 15:29:13 -08:00
Chen-I Lim
3995cbd0e4 Product name 2021-01-26 14:13:46 -08:00
Chen-I Lim
41308ebbb2 Rename admin-scripts folder 2021-01-25 11:22:15 -08:00
Chen-I Lim
22e3e03c39 Check local conn for admin APIs 2021-01-22 14:14:12 -08:00
Chen-I Lim
6af0780c17 Merge branch 'main' into admin-local 2021-01-22 11:28:45 -08:00
Chen-I Lim
dfbc07c06d make generate 2021-01-21 10:25:35 -08:00
Chen-I Lim
1286349a22 Change password 2021-01-21 10:16:40 -08:00
Chen-I Lim
159023b540 Example reset-password.sh script 2021-01-20 14:22:23 -08:00
Chen-I Lim
e15728d003 make generate 2021-01-20 13:52:54 -08:00
Chen-I Lim
91f51fe0b9 Local server on unix port, admin set password 2021-01-20 13:52:25 -08:00
Chen-I Lim
f7769bb14e Use modifiedBy for comment author 2021-01-20 09:47:08 -08:00
Chen-I Lim
b22d34057e Stamp edition and build number 2021-01-19 14:10:14 -08:00
Chen-I Lim
8b2d993675 Fix server test error check 2021-01-18 12:59:32 -08:00
Chen-I Lim
56eda6bbdf Telemetry 2021-01-18 12:27:13 -08:00
Chen-I Lim
0450a03971 Fix register error handling, and client json parsing 2021-01-14 10:58:16 -08:00
Chen-I Lim
c0f8f1288f Cleanup api errorResponse 2021-01-14 10:03:01 -08:00
Chen-I Lim
ed2ff2d6b0 make generate 2021-01-13 17:09:43 -08:00
Chen-I Lim
7915564d2c Require signup token to register 2021-01-13 16:56:01 -08:00
Chen-I Lim
36b5bec65f make generate 2021-01-13 13:01:34 -08:00
Chen-I Lim
413a6e33c7 cleanup 2021-01-13 12:15:38 -08:00
Chen-I Lim
b8bfc7fce3 Pass read_token to getSubTree 2021-01-13 09:40:37 -08:00
Chen-I Lim
61fb38d418 Allow GetSubTree without auth. WIP 2021-01-12 18:49:08 -08:00
Chen-I Lim
2dab4f56fd OctoClient Sharing APIs 2021-01-12 16:52:25 -08:00
Chen-I Lim
1048c009c3 Sharing integration tests 2021-01-12 16:44:50 -08:00
Chen-I Lim
2f71295275 Get/set sharing 2021-01-12 15:35:30 -08:00
Chen-I Lim
7052a022b3 Store modifiedBy for deleted blocks 2021-01-12 11:16:25 -08:00
Chen-I Lim
7f3547dc02 Check for empty session token or userID 2021-01-12 10:53:48 -08:00
Chen-I Lim
f2e8bc8285 Store blocks modified_by userID 2021-01-11 18:53:08 -08:00
Jesús Espino
20a223a091 Fixing tests 2021-01-11 15:33:34 +01:00
Jesús Espino
daae244cba Merge remote-tracking branch 'origin/main' into auth 2021-01-11 13:56:26 +01:00
Chen-I Lim
14ab03cb97 Poll server in Go unit tests 2021-01-06 12:55:14 -08:00
Chen-I Lim
c1a73f88b3 Log error in Server API 2021-01-05 19:50:24 -08:00
Chen-I Lim
593e077fb9 Fix Go integration tests 2021-01-05 19:47:18 -08:00
Chen-I Lim
77de551fdd Clear visible and hidden columns (options) when changing groupBy 2021-01-04 14:26:18 -08:00
Chen-I Lim
b47ae9197f Change project tasks icon 2021-01-04 10:43:02 -08:00
Chen-I Lim
1c719d3a16 Update duplicate to handle card contentOrder 2020-12-18 14:28:54 -08:00
Chen-I Lim
0bd645df4e Filter orphaned nodes on export 2020-12-14 11:24:38 -08:00
Chen-I Lim
0b1370ab35 Cleanup meeting notes template 2020-12-11 12:40:48 -08:00
Chen-I Lim
b8851c89e0 Meeting notes template 2020-12-11 12:13:47 -08:00
Chen-I Lim
578cdc7caa Personal Goals template 2020-12-11 11:45:08 -08:00
Chen-I Lim
6d1782256c Menu text consistent sentence casing 2020-12-11 11:10:25 -08:00