0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-23 20:53:05 +00:00

Compare commits

...

1434 Commits

Author SHA1 Message Date
Trevor Buckner
512ef78e9e Up version to 3.6.1 2023-02-18 13:56:41 -05:00
Trevor Buckner
4fca81fd3f Merge pull request #2675 from G-Ambatte/fixAuthorDeletion-#2674
Fix author deletion #2674
2023-02-18 13:48:49 -05:00
Trevor Buckner
6a8a2f080c Lint 2023-02-18 13:48:32 -05:00
Trevor Buckner
298a10bc42 Clean up tests 2023-02-18 13:48:02 -05:00
Trevor Buckner
b6a95a2c01 Merge pull request #2677 from naturalcrit/FixDividerBarDots
Override FontAwesome conflict due to @layers
2023-02-18 13:30:32 -05:00
Trevor Buckner
b09a4ea5fa Override FontAwesome conflict due to @layers 2023-02-18 13:30:06 -05:00
G.Ambatte
1fb7fe2487 Add markModified mock function to test spec 2023-02-17 17:43:21 +13:00
G.Ambatte
e751f9a25c Remove mocking function from homebrew.api.js 2023-02-17 17:42:56 +13:00
G.Ambatte
41db670e63 Add mock markModified when it does not exist 2023-02-17 16:14:33 +13:00
G.Ambatte
74e14ca72a Restore coverage to .gitignore 2023-02-17 16:05:32 +13:00
G.Ambatte
860070b0c2 Remove coverage folder from .gitignore 2023-02-17 15:48:55 +13:00
G.Ambatte
43d1cb12db Add change log entry for v3.6.1 2023-02-17 11:30:16 +13:00
G.Ambatte
2bab0b50d2 Add coverage folder to gitignore 2023-02-17 11:26:29 +13:00
G.Ambatte
4b98c1ac89 Add markModified to fix authors array in DB 2023-02-17 11:26:11 +13:00
Trevor Buckner
d9f5e9d635 Merge pull request #2673 from naturalcrit/dependabot/npm_and_yarn/jest-29.4.3
Bump jest from 29.4.1 to 29.4.3
2023-02-16 15:19:49 -05:00
Trevor Buckner
1ce3e399a8 Merge pull request #2670 from naturalcrit/dependabot/npm_and_yarn/eslint-8.34.0
Bump eslint from 8.33.0 to 8.34.0
2023-02-16 15:19:26 -05:00
Trevor Buckner
4a12ccf2b6 Merge pull request #2669 from naturalcrit/dependabot/npm_and_yarn/googleapis-111.0.0
Bump googleapis from 110.0.0 to 111.0.0
2023-02-16 15:19:14 -05:00
Trevor Buckner
da83e1a252 Merge pull request #2666 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.8.1
Bump react-router-dom from 6.8.0 to 6.8.1
2023-02-16 15:18:31 -05:00
Trevor Buckner
a971dd4713 Merge pull request #2665 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.9.1
Bump mongoose from 6.9.0 to 6.9.1
2023-02-16 15:18:19 -05:00
dependabot[bot]
0a7e25a749 Bump jest from 29.4.1 to 29.4.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.4.1 to 29.4.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.4.3/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-16 03:57:59 +00:00
dependabot[bot]
c9ee1bc4b0 Bump eslint from 8.33.0 to 8.34.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.33.0 to 8.34.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.33.0...v8.34.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-13 03:58:32 +00:00
dependabot[bot]
d5c21c5881 Bump googleapis from 110.0.0 to 111.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 110.0.0 to 111.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v110.0.0...googleapis-v111.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-13 03:57:01 +00:00
dependabot[bot]
f157b57928 Bump react-router-dom from 6.8.0 to 6.8.1
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.8.0 to 6.8.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.8.1/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-07 03:01:39 +00:00
dependabot[bot]
e6318fefb6 Bump mongoose from 6.9.0 to 6.9.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.9.0 to 6.9.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.9.0...6.9.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-07 03:00:46 +00:00
Trevor Buckner
7ea3ef8474 Merge pull request #2662 from naturalcrit/CustomSnippetIcons
Custom icons for snippets
2023-02-04 11:10:29 -05:00
Trevor Buckner
a0af588d75 Custom icons 2023-02-04 11:07:04 -05:00
Trevor Buckner
9b06380b9c Merge pull request #2656 from naturalcrit/SubSnippets
Add a side menu for sub-snippets
2023-02-02 15:49:10 -05:00
Trevor Buckner
5e38ff66da Add a side menu for sub-snippets
Subsnippets can be added to snippets as an additional property "subsnippets" which is an array of more snippets.
2023-02-02 15:29:12 -05:00
Trevor Buckner
85b3741df8 Merge pull request #2651 from 5e-Cleric/cloning-fix-2
Thanks @5e-Cleric for this fix!
2023-01-30 17:19:19 -05:00
Trevor Buckner
4260f5197c Update specs to expect a views prop from default brew 2023-01-30 17:15:33 -05:00
Trevor Buckner
f628e1a5ae Use DEFAULT_BREW values instead of setting them here 2023-01-30 17:08:19 -05:00
Trevor Buckner
14bc7e45ab Merge pull request #2619 from 5e-Cleric/readme
Readme update
2023-01-30 14:44:19 -05:00
Trevor Buckner
4668d36a52 typo 2023-01-30 14:40:13 -05:00
Victor Losada Hernandez
91fc8a1a5e Suggested changes 2023-01-30 20:30:43 +01:00
Trevor Buckner
6226f3376a Merge pull request #2604 from naturalcrit/CSS-Layers
Try @Layers to not need `.page` in user style
2023-01-30 12:41:36 -05:00
Trevor Buckner
ed8b0c51af Merge pull request #2653 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.32.2
Bump eslint-plugin-react from 7.32.1 to 7.32.2
2023-01-30 12:32:41 -05:00
dependabot[bot]
a19b961b0f Bump eslint-plugin-react from 7.32.1 to 7.32.2
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.32.1 to 7.32.2.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.32.1...v7.32.2)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 16:45:54 +00:00
Trevor Buckner
f4326616b4 Merge pull request #2652 from naturalcrit/dependabot/npm_and_yarn/eslint-8.33.0
Bump eslint from 8.32.0 to 8.33.0
2023-01-30 11:44:28 -05:00
dependabot[bot]
e8509dbbed Bump eslint from 8.32.0 to 8.33.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.32.0 to 8.33.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.32.0...v8.33.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 03:00:51 +00:00
Victor Losada Hernandez
541109e7b1 fix created, updated published last viewed 2023-01-28 11:47:26 +01:00
Trevor Buckner
625d3f7034 Add note about why we use !important on user page 2023-01-28 01:13:10 -05:00
Trevor Buckner
5bb61a7c3c Fix userpage 2023-01-27 17:09:52 -05:00
Trevor Buckner
3c551daf16 Fix print page 2023-01-27 15:16:16 -05:00
Trevor Buckner
0bf96cb9e2 Add layers to all current themes 2023-01-27 14:57:20 -05:00
Trevor Buckner
bef4d9f41f Merge branch 'master' into CSS-Layers 2023-01-27 14:48:13 -05:00
Trevor Buckner
9ff0789387 Merge pull request #2622 from 5e-Cleric/previews
Theme previews updated
2023-01-27 14:45:47 -05:00
Trevor Buckner
a457058041 Resize dropdown button 2023-01-27 14:45:31 -05:00
Trevor Buckner
6d40e63e96 Merge branch 'master' into pr/2622 2023-01-27 14:26:05 -05:00
Trevor Buckner
964342a13d Merge pull request #2646 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.8.0
Bump react-router-dom from 6.7.0 to 6.8.0
2023-01-27 14:04:35 -05:00
Trevor Buckner
9067cbdced Merge pull request #2644 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.9.0
Bump mongoose from 6.8.4 to 6.9.0
2023-01-27 14:04:25 -05:00
Trevor Buckner
c9fd2c63af Merge pull request #2647 from naturalcrit/dependabot/npm_and_yarn/jest-29.4.1
Bump jest from 29.4.0 to 29.4.1
2023-01-27 14:04:16 -05:00
Trevor Buckner
ec8126eb8a Merge pull request #2648 from naturalcrit/FixNodestoFont
Update fonts.less path for Nodesto fonts
2023-01-27 14:04:03 -05:00
Trevor Buckner
6aa1920061 Update fonts.less 2023-01-27 14:02:11 -05:00
dependabot[bot]
07325a7550 Bump jest from 29.4.0 to 29.4.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.4.0 to 29.4.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.4.1/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-27 03:01:43 +00:00
dependabot[bot]
7fa50099a6 Bump react-router-dom from 6.7.0 to 6.8.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.7.0 to 6.8.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.8.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-27 03:00:56 +00:00
dependabot[bot]
12b1c41716 Bump mongoose from 6.8.4 to 6.9.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.4 to 6.9.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.4...6.9.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-26 03:02:15 +00:00
Trevor Buckner
62d193ddd1 Merge pull request #2639 from naturalcrit/dependabot/npm_and_yarn/jest-29.4.0
Bump jest from 29.3.1 to 29.4.0
2023-01-25 11:38:09 -05:00
dependabot[bot]
750c650b69 Bump jest from 29.3.1 to 29.4.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.3.1 to 29.4.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.4.0/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-25 03:01:12 +00:00
Trevor Buckner
70219f1bd4 Merge pull request #2628 from naturalcrit/v3.6.0
Update Version to v3.6.0
2023-01-23 16:02:07 -05:00
Trevor Buckner
c8f9e5bcf2 Update Version to v3.6.0 2023-01-23 16:01:32 -05:00
Trevor Buckner
0a9a5909d1 Merge pull request #2589 from jeddai/client-server-version-mismatch-middleware
adjust frontend error handling, add client/server mismatch middleware
2023-01-23 15:40:48 -05:00
Charlie Humphreys
8f75ea4728 fix error issue 2023-01-23 14:22:18 -06:00
Trevor Buckner
91ad46b202 Merge pull request #2627 from naturalcrit/dependabot/npm_and_yarn/cookiejar-2.1.4
Bump cookiejar from 2.1.3 to 2.1.4
2023-01-23 14:59:58 -05:00
Trevor Buckner
752806c0ef Merge pull request #2616 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.7.0
Bump react-router-dom from 6.6.1 to 6.7.0
2023-01-23 14:59:41 -05:00
dependabot[bot]
c39bb67bf3 Bump cookiejar from 2.1.3 to 2.1.4
Bumps [cookiejar](https://github.com/bmeck/node-cookiejar) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/bmeck/node-cookiejar/releases)
- [Commits](https://github.com/bmeck/node-cookiejar/commits)

---
updated-dependencies:
- dependency-name: cookiejar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-23 19:58:54 +00:00
Trevor Buckner
fe6097e0d9 Merge pull request #2607 from naturalcrit/dependabot/npm_and_yarn/eslint-8.32.0
Bump eslint from 8.31.0 to 8.32.0
2023-01-23 14:58:12 -05:00
Charlie Humphreys
6ddf0bb889 update metadata editor to include error handling 2023-01-23 09:35:19 -06:00
Trevor Buckner
8dcbad97df Merge pull request #2623 from 5e-Cleric/Cloning-views-fix
Cloning views fix
2023-01-23 10:14:23 -05:00
Trevor Buckner
64b3955bc9 Update Dependencies 2023-01-23 10:13:59 -05:00
Victor Losada Hernandez
0f88a13635 Merge branch 'master' of hb into Cloning-views-fix 2023-01-22 22:11:23 +01:00
Victor Losada Hernandez
e8c7d38608 setting view count to 0 2023-01-22 21:57:14 +01:00
Trevor Buckner
6020657529 Ensure getBrew returns an object if undefined 2023-01-22 21:57:14 +01:00
Trevor Buckner
a8c35f3967 Remove extra console log for getGoogleBrew
App.js already logs the thrown error, so we were getting double logs (and Google errors are long....). This should make the logs a bit easier to sift through.
2023-01-22 21:57:13 +01:00
Trevor Buckner
62fa8f511a Only fix stub if we actually found one. 2023-01-22 21:57:13 +01:00
Trevor Buckner
18cf202ac0 If no stub exists, start stub as {}, not undefined
Recent changes to handle bad brew properties (tags as strings, no renderer, etc.) didn't account for the case where an old Google brew is first being stubbed; since no stub exists, there is no object to perform the corrections on, and we crash.
2023-01-22 21:57:13 +01:00
Trevor Buckner
98d9018e13 Fix saving issue when tags do not exist
Rare case where tags don't exist at all; gets confused in the step of converting tag strings to arrays
2023-01-22 21:57:13 +01:00
Trevor Buckner
a9e14f6165 Enable brew version mismatch checking on server
Was commented out previously to allow users time to update client code so the proper error displays
2023-01-22 21:57:13 +01:00
dependabot[bot]
7005e9f760 Bump mongoose from 6.8.2 to 6.8.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.2 to 6.8.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.2...6.8.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-22 21:57:13 +01:00
dependabot[bot]
163bc4e0b3 Bump @babel/core from 7.20.7 to 7.20.12
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.7 to 7.20.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.20.12/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-22 21:57:13 +01:00
dependabot[bot]
3420886192 Bump eslint from 8.31.0 to 8.32.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.31.0 to 8.32.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.31.0...v8.32.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-22 17:31:41 +00:00
Trevor Buckner
1704ef6557 Merge pull request #2610 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.32.1
Bump eslint-plugin-react from 7.31.11 to 7.32.1
2023-01-22 12:30:28 -05:00
Trevor Buckner
637b3311d6 Merge pull request #2612 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.8.4
Bump mongoose from 6.8.3 to 6.8.4
2023-01-22 12:30:09 -05:00
Trevor Buckner
4b8c34bcbd Merge pull request #2608 from naturalcrit/dependabot/npm_and_yarn/marked-4.2.12
Bump marked from 4.2.5 to 4.2.12
2023-01-22 12:29:50 -05:00
Victor Losada Hernandez
0c68e5870b admin privileges detail readme 2023-01-22 15:52:28 +01:00
Charlie Humphreys
d5a34eedb9 Merge branch 'master' into client-server-version-mismatch-middleware 2023-01-21 15:00:54 -06:00
Victor Losada Hernandez
d0dc83cf10 preview images updated 2023-01-21 17:15:50 +01:00
Trevor Buckner
c997908a49 Merge pull request #2621 from jeddai/adjust-coverage-thresholds
lower coverage thresholds for api
2023-01-21 11:11:31 -05:00
Victor Losada Hernandez
45c7ac4b85 Themes dropdown previews 2023-01-21 17:11:28 +01:00
Trevor Buckner
128b299f25 Ensure getBrew returns an object if undefined 2023-01-21 17:11:28 +01:00
Trevor Buckner
692daa88fc Remove extra console log for getGoogleBrew
App.js already logs the thrown error, so we were getting double logs (and Google errors are long....). This should make the logs a bit easier to sift through.
2023-01-21 17:11:28 +01:00
Trevor Buckner
bd6eb816f2 Only fix stub if we actually found one. 2023-01-21 17:11:28 +01:00
Trevor Buckner
2050028484 If no stub exists, start stub as {}, not undefined
Recent changes to handle bad brew properties (tags as strings, no renderer, etc.) didn't account for the case where an old Google brew is first being stubbed; since no stub exists, there is no object to perform the corrections on, and we crash.
2023-01-21 17:11:28 +01:00
Trevor Buckner
7e4018351d Fix saving issue when tags do not exist
Rare case where tags don't exist at all; gets confused in the step of converting tag strings to arrays
2023-01-21 17:11:28 +01:00
Trevor Buckner
01b03e8683 Enable brew version mismatch checking on server
Was commented out previously to allow users time to update client code so the proper error displays
2023-01-21 17:11:28 +01:00
dependabot[bot]
3538aa6da0 Bump mongoose from 6.8.2 to 6.8.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.2 to 6.8.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.2...6.8.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-21 17:11:28 +01:00
dependabot[bot]
13eb6cac17 Bump @babel/core from 7.20.7 to 7.20.12
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.7 to 7.20.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.20.12/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-21 17:11:28 +01:00
Charlie Humphreys
bd594fa214 lower coverage thresholds for api 2023-01-21 09:22:58 -06:00
Charlie Humphreys
6bae21a578 Merge branch 'master' into client-server-version-mismatch-middleware 2023-01-21 00:26:18 -06:00
Charlie Humphreys
79db97efdf create error navitem and use it in all necessary use cases 2023-01-21 00:25:35 -06:00
Charlie Humphreys
7755affa1e update based on feedback 2023-01-20 23:07:24 -06:00
Victor Losada Hernandez
6b6e05ca11 Readme update, installation text improved 2023-01-21 00:05:54 +01:00
Trevor Buckner
ea04069fe5 Merge pull request #2618 from naturalcrit/FixGoogleBrewsDuplicatingOnStub
Fix Google Drive brews duplicating
2023-01-20 17:25:47 -05:00
Trevor Buckner
2c3a302c85 Merge branch 'master' into FixGoogleBrewsDuplicatingOnStub 2023-01-20 17:25:07 -05:00
Trevor Buckner
89d9bfe1f1 Merge pull request #2606 from G-Ambatte/addThemesToWatchList-#2605
[LOCAL] Add Themes directory to watch list
2023-01-20 17:21:15 -05:00
Trevor Buckner
c9241e2162 Fix Google Drive brews duplicating 2023-01-20 17:19:02 -05:00
dependabot[bot]
99f7668901 Bump react-router-dom from 6.6.1 to 6.7.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.6.1 to 6.7.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.7.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-19 03:01:37 +00:00
dependabot[bot]
187738ee11 Bump mongoose from 6.8.3 to 6.8.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.3 to 6.8.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.3...6.8.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-18 03:01:47 +00:00
dependabot[bot]
68d3724e50 Bump eslint-plugin-react from 7.31.11 to 7.32.1
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.11 to 7.32.1.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.11...v7.32.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-17 03:00:45 +00:00
dependabot[bot]
8526faa041 Bump marked from 4.2.5 to 4.2.12
Bumps [marked](https://github.com/markedjs/marked) from 4.2.5 to 4.2.12.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.2.5...v4.2.12)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 03:01:52 +00:00
G.Ambatte
ac9fbb1f08 Move changes from 3.6.1 to 3.6.0 2023-01-15 18:24:23 +13:00
G.Ambatte
e82da3a6c1 Add buildDev to NPM scripts 2023-01-15 18:19:23 +13:00
G.Ambatte
40e36fd875 Fix minor version number 2023-01-15 17:26:56 +13:00
G.Ambatte
3c86984cf1 Add change to changelog 2023-01-15 14:13:25 +13:00
G.Ambatte
50d172bbd5 Add Themes directory to watch list 2023-01-15 14:11:33 +13:00
Trevor Buckner
a22d59475e Try @Layers to not need .page in user style 2023-01-13 17:08:12 -05:00
Trevor Buckner
da676c6ec1 Ensure getBrew returns an object if undefined 2023-01-12 13:33:55 -05:00
Trevor Buckner
901615d99e Remove extra console log for getGoogleBrew
App.js already logs the thrown error, so we were getting double logs (and Google errors are long....). This should make the logs a bit easier to sift through.
2023-01-10 21:08:21 -05:00
Trevor Buckner
6ed52f37cc Only fix stub if we actually found one. 2023-01-09 17:30:49 -05:00
Trevor Buckner
15e5a31767 If no stub exists, start stub as {}, not undefined
Recent changes to handle bad brew properties (tags as strings, no renderer, etc.) didn't account for the case where an old Google brew is first being stubbed; since no stub exists, there is no object to perform the corrections on, and we crash.
2023-01-09 14:53:35 -05:00
Trevor Buckner
8cbab4d4ce Fix saving issue when tags do not exist
Rare case where tags don't exist at all; gets confused in the step of converting tag strings to arrays
2023-01-09 14:12:57 -05:00
Trevor Buckner
a9c28e84d0 Enable brew version mismatch checking on server
Was commented out previously to allow users time to update client code so the proper error displays
2023-01-09 10:30:07 -05:00
Trevor Buckner
bafabb84b4 Merge pull request #2591 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.8.3
Bump mongoose from 6.8.2 to 6.8.3
2023-01-09 10:26:36 -05:00
dependabot[bot]
f5d592a291 Bump mongoose from 6.8.2 to 6.8.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.2 to 6.8.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.2...6.8.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-09 03:00:50 +00:00
Charlie Humphreys
385bee964d adjust frontend error handling, add client/server mismatch middleware 2023-01-06 21:29:21 -06:00
Trevor Buckner
18f277182a Merge pull request #2588 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.20.12
Bump @babel/core from 7.20.7 to 7.20.12
2023-01-06 13:08:12 -05:00
Trevor Buckner
344a9d8334 Merge pull request #2548 from jeddai/api-tests
Add api tests
2023-01-06 13:07:54 -05:00
Charlie Humphreys
67a76f9d86 adjust circleci command for API unit tests 2023-01-06 11:53:38 -06:00
Charlie Humphreys
93d6d1ac6a add unit test command 2023-01-06 11:48:00 -06:00
Charlie Humphreys
4b3edf053f add coverage thresholds and coverage command 2023-01-05 23:30:20 -06:00
Charlie Humphreys
0720ac6a15 update changelog 2023-01-05 23:29:58 -06:00
Charlie Humphreys
c0b9cd951e update circleci test config to run test coverage 2023-01-05 23:29:43 -06:00
Charlie Humphreys
a54ebabf53 fix tests after merge from master 2023-01-05 23:10:25 -06:00
Charlie Humphreys
676acb9e5a Merge branch 'master' into api-tests 2023-01-05 23:02:43 -06:00
Charlie Humphreys
387c468d84 add tests for deletion and address PR feedback 2023-01-05 22:56:54 -06:00
dependabot[bot]
64e7fe3422 Bump @babel/core from 7.20.7 to 7.20.12
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.7 to 7.20.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.20.12/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-05 03:01:25 +00:00
Trevor Buckner
2b1466c51b Merge pull request #2587 from naturalcrit/FixThemesOnPrint
Fix Themes on /print
2023-01-04 21:41:15 -05:00
Trevor Buckner
332bcde4b2 Themes weren't being picked up for rendering 2023-01-04 21:39:51 -05:00
Trevor Buckner
db783179ce Merge pull request #2429 from G-Ambatte/fixThemesDefault
Add default brew on load and before save
2023-01-04 21:36:37 -05:00
Trevor Buckner
c78d687387 Fix all brews being forced to V3 on load 2023-01-04 21:32:16 -05:00
Trevor Buckner
b717059a39 Fix /new storing string "undefined" in Style tab 2023-01-04 20:58:29 -05:00
Trevor Buckner
e02bde5eed Cleanup; added more fields to DEFAULT_BREW 2023-01-04 17:33:23 -05:00
Trevor Buckner
e1765cad41 Merge branch 'fixThemesDefault' of https://github.com/G-Ambatte/homebrewery into pr/2429 2023-01-03 15:13:41 -05:00
Trevor Buckner
6dab5f836e Merge branch 'master' into pr/2429 2023-01-03 15:13:19 -05:00
Charlie Humphreys
e47f81698c Merge branch 'master' into api-tests 2023-01-03 13:47:09 -06:00
Trevor Buckner
2b824839c3 Merge pull request #2581 from naturalcrit/dependabot/npm_and_yarn/eslint-8.31.0
Bump eslint from 8.30.0 to 8.31.0
2023-01-03 14:05:28 -05:00
Trevor Buckner
26f009a295 Merge pull request #2577 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.6.1
Bump react-router-dom from 6.6.0 to 6.6.1
2023-01-03 14:05:18 -05:00
Trevor Buckner
9b4c997b57 Merge pull request #2578 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.8.2
Bump mongoose from 6.8.1 to 6.8.2
2023-01-03 14:05:10 -05:00
Trevor Buckner
39143295b1 Merge pull request #2576 from naturalcrit/dependabot/npm_and_yarn/marked-4.2.5
Bump marked from 4.2.4 to 4.2.5
2023-01-03 14:05:01 -05:00
Trevor Buckner
6eaf2feb40 Log version mismatch errors
To gauge how frequently they are occurring for future update.
2023-01-03 12:47:17 -05:00
Trevor Buckner
4fe0f1a7af Comment out server-side brew version checking
Requires client-side update to apply brew version correctly; temporarily disabling server-side checking for a few days until more users have updated their clients.
2023-01-03 12:38:00 -05:00
Trevor Buckner
7aac377ce8 Merge pull request #2575 from jeddai/google-brew-version-comparison-fix
add check for truthy version, and make sure the version exists when incrementing it
2023-01-03 11:22:37 -05:00
dependabot[bot]
77542c5f06 Bump eslint from 8.30.0 to 8.31.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.30.0 to 8.31.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.30.0...v8.31.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-02 03:01:18 +00:00
dependabot[bot]
3d365339e4 Bump mongoose from 6.8.1 to 6.8.2
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.1 to 6.8.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.1...6.8.2)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-29 03:01:18 +00:00
dependabot[bot]
66be400f5f Bump react-router-dom from 6.6.0 to 6.6.1
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.6.0 to 6.6.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.6.1/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-26 03:01:12 +00:00
dependabot[bot]
9880792c4d Bump marked from 4.2.4 to 4.2.5
Bumps [marked](https://github.com/markedjs/marked) from 4.2.4 to 4.2.5.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.2.4...v4.2.5)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-26 03:00:50 +00:00
Charlie Humphreys
ca03a473ec add check for truthy version, and make sure the version exists when incrementing it 2022-12-23 14:31:58 -06:00
Trevor Buckner
c364856942 Merge branch 'master' into fixThemesDefault 2022-12-23 13:40:12 -05:00
Trevor Buckner
4e7a96b67c Merge pull request #2571 from naturalcrit/v3.5.0
v3.5.0
2022-12-23 13:25:00 -05:00
Trevor Buckner
39bfc818a6 Merge pull request #2572 from jeddai/new-props-authors-fix
add elvis to fix invited authors editor
2022-12-23 13:24:48 -05:00
Charlie Humphreys
6d9982f735 add elvis to fix invited authors editor 2022-12-23 12:21:15 -06:00
Trevor Buckner
4f6ba7a388 v3.5.0 2022-12-23 12:07:31 -05:00
Trevor Buckner
0274fb214c Merge pull request #2566 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.8.1
Bump mongoose from 6.8.0 to 6.8.1
2022-12-23 01:57:27 -05:00
Trevor Buckner
15519f142d Merge pull request #2569 from naturalcrit/dependabot/npm_and_yarn/googleapis-110.0.0
Bump googleapis from 109.0.1 to 110.0.0
2022-12-23 01:53:09 -05:00
Trevor Buckner
6b258886a4 Merge pull request #2570 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.20.7
Bump @babel/core from 7.20.5 to 7.20.7
2022-12-23 01:52:49 -05:00
Trevor Buckner
d23a88c997 Merge pull request #2568 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.6.0
Bump react-router-dom from 6.4.5 to 6.6.0
2022-12-23 01:52:42 -05:00
Trevor Buckner
096e17ab5a Merge pull request #2564 from naturalcrit/dependabot/npm_and_yarn/eslint-8.30.0
Bump eslint from 8.29.0 to 8.30.0
2022-12-23 01:52:32 -05:00
Charlie Humphreys
da9e20e96f add more tests and merge from main 2022-12-23 00:11:46 -06:00
dependabot[bot]
53d5f9f6e0 Bump @babel/core from 7.20.5 to 7.20.7
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.5 to 7.20.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.20.7/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-23 03:01:08 +00:00
dependabot[bot]
43b4fe75e2 Bump googleapis from 109.0.1 to 110.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 109.0.1 to 110.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v109.0.1...googleapis-v110.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-23 03:00:52 +00:00
Charlie Humphreys
925db96b08 Merge branch 'fixThemesDefault' into api-tests 2022-12-22 20:09:49 -06:00
G.Ambatte
efdb8e07b0 Merge branch 'master' into fixThemesDefault 2022-12-23 13:03:31 +13:00
Trevor Buckner
816860dc4f Merge pull request #2561 from jeddai/add-ability-to-invite-authors
Add ability to invite authors + version comparison check
2022-12-22 17:03:31 -05:00
Charlie
314f758d62 Update server/homebrew.api.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-12-22 15:58:33 -06:00
dependabot[bot]
c799aaa7cb Bump react-router-dom from 6.4.5 to 6.6.0
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.4.5 to 6.6.0.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.6.0/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-22 03:00:35 +00:00
Charlie Humphreys
2f5bc8db54 remove redundant boolean comparison logic 2022-12-21 16:19:41 -06:00
Charlie Humphreys
7c61a27084 update authorship edit check and error 2022-12-21 15:59:00 -06:00
dependabot[bot]
ad3e83da22 Bump mongoose from 6.8.0 to 6.8.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.8.0 to 6.8.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.8.0...6.8.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-20 03:00:35 +00:00
dependabot[bot]
8888704b58 Bump eslint from 8.29.0 to 8.30.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.29.0 to 8.30.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.29.0...v8.30.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-19 03:00:45 +00:00
Charlie Humphreys
a3dc5e78fd remove console log 2022-12-14 10:04:43 -06:00
G.Ambatte
32506860dd Add additional fields to default 2022-12-14 21:26:57 +13:00
G.Ambatte
a89b20584f Apply default to EditPage 2022-12-14 21:26:40 +13:00
G.Ambatte
8e42c09721 Apply default to HomePage 2022-12-14 21:26:31 +13:00
G.Ambatte
bb5978dfea Apply default to SharePage 2022-12-14 21:26:20 +13:00
G.Ambatte
0dc491adfc Apply default to NewPage 2022-12-14 21:26:11 +13:00
G.Ambatte
f470a6185a Move default brew to app.js 2022-12-14 19:23:16 +13:00
Charlie Humphreys
e5febc1fef update ui to include invitedAuthors array 2022-12-13 21:06:47 -06:00
Charlie Humphreys
354d01e980 set the version in the ui from the server response on save 2022-12-13 21:05:45 -06:00
Charlie Humphreys
63e043593a add invitedAuthors key and move invited author to authors on save 2022-12-13 21:05:00 -06:00
Charlie Humphreys
770d0c141d add 409 return when server version is greater than updating version
This also moves the version back onto the stub
2022-12-13 21:03:51 -06:00
G.Ambatte
0a885c8581 Merge branch 'master' into fixThemesDefault 2022-12-14 12:30:28 +13:00
G.Ambatte
ec9c704e71 Merge branch 'master' into fixThemesDefault 2022-12-14 11:57:37 +13:00
Trevor Buckner
02c0176070 Merge pull request #2509 from jeddai/disable-changes-from-non-authors
Disable changes from non authors
2022-12-12 12:15:23 -05:00
Charlie Humphreys
f847de852b Merge branch 'master' into disable-changes-from-non-authors 2022-12-12 10:39:08 -06:00
Trevor Buckner
86413b5767 Merge pull request #2560 from naturalcrit/fixGoogleToMongoTransfer
Change findOneAndUpdate to FindOne and Save
2022-12-12 10:22:49 -05:00
Trevor Buckner
747c976a14 typo 2022-12-12 10:19:49 -05:00
Trevor Buckner
326c28a11d Change findOneAndUpdate to FindOne and Save
Setting an object property to `undefined` should tell Mongoose to remove that property (for example, remove the googleId from a brew). That doesn't seem to work with `findOneAndUpdate` however; the `undefined` property remains after the update.

Switching back to `save()` to make this work again.
2022-12-12 09:59:04 -05:00
Trevor Buckner
263471bcbb Fix changelog typo 2022-12-10 18:03:16 -05:00
Trevor Buckner
9478454063 Merge pull request #2558 from naturalcrit/v3.4.2
v3.4.2
2022-12-10 14:18:16 -05:00
Trevor Buckner
a9a9804517 v3.4.2 2022-12-10 14:15:09 -05:00
Trevor Buckner
0bde44ec2f Merge pull request #2470 from jeddai/remove-google-get-during-update
update getBrew usages to not fetch google brew during updates
2022-12-10 13:54:58 -05:00
Trevor Buckner
13ad179a1b Merge pull request #2523 from G-Ambatte/showGoogleAuthStatus-#2520
Add link to instructions to refresh Google creds
2022-12-10 13:34:17 -05:00
Trevor Buckner
b72acd9e59 cleanup 2022-12-10 13:31:57 -05:00
G.Ambatte
d0a1ef9571 Change to aggregate query, rename variables 2022-12-09 18:35:17 +13:00
G.Ambatte
d1f049871f Merge branch 'master' into showGoogleAuthStatus-#2520 2022-12-09 07:56:25 +13:00
Trevor Buckner
070184b309 Merge pull request #2553 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.4.5
Bump react-router-dom from 6.4.4 to 6.4.5
2022-12-07 22:49:39 -05:00
Trevor Buckner
cbb41676e0 Merge pull request #2551 from naturalcrit/dependabot/npm_and_yarn/marked-4.2.4
Bump marked from 4.2.3 to 4.2.4
2022-12-07 22:49:09 -05:00
Trevor Buckner
81130dd514 Merge pull request #2550 from naturalcrit/dependabot/npm_and_yarn/supertest-6.3.3
Bump supertest from 6.3.2 to 6.3.3
2022-12-07 22:48:59 -05:00
dependabot[bot]
61d3edca17 Bump react-router-dom from 6.4.4 to 6.4.5
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.4.4 to 6.4.5.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.4.5/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-08 03:01:48 +00:00
dependabot[bot]
248b56a706 Bump marked from 4.2.3 to 4.2.4
Bumps [marked](https://github.com/markedjs/marked) from 4.2.3 to 4.2.4.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.2.3...v4.2.4)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-08 03:01:13 +00:00
dependabot[bot]
90f8d1d6da Bump supertest from 6.3.2 to 6.3.3
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.3.2 to 6.3.3.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.3.2...v6.3.3)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-08 03:00:58 +00:00
Trevor Buckner
8f08b71475 Merge pull request #2547 from jeddai/tags-validation-fix
Fix tags validation issues
2022-12-07 12:54:22 -05:00
Trevor Buckner
cc6527029c Merge pull request #2546 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.8.0
Bump mongoose from 6.7.5 to 6.8.0
2022-12-07 11:32:27 -05:00
Charlie Humphreys
8a110567fc remove call to persist 2022-12-07 07:32:22 -06:00
Charlie Humphreys
a451e562fb add initial set of tests for api 2022-12-06 00:01:38 -06:00
Charlie Humphreys
4e2f6b1d26 move callIfExists to base file scope 2022-12-05 22:39:38 -06:00
Charlie Humphreys
6b8db74a2b add authors length check and account elvis operator 2022-12-05 22:31:56 -06:00
Charlie Humphreys
4c629772cc add a check for the accessType when editing a document 2022-12-05 22:11:24 -06:00
Charlie Humphreys
208593d203 add callIfExists, which will call a method only if it exists 2022-12-05 22:06:06 -06:00
Charlie Humphreys
99019be152 switch updateOne to findOneAndUpdate and return the saved instead of the brew passed in 2022-12-05 21:00:44 -06:00
dependabot[bot]
fa73e1707d Bump mongoose from 6.7.5 to 6.8.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.7.5 to 6.8.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.7.5...6.8.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-06 03:00:40 +00:00
Trevor Buckner
d7de2e3d21 Merge pull request #2545 from naturalcrit/v3.4.1
Up version to v3.4.1
2022-12-05 21:38:11 -05:00
Trevor Buckner
903ff4fd09 Merge pull request #2542 from naturalcrit/dependabot/npm_and_yarn/supertest-6.3.2
Bump supertest from 6.3.1 to 6.3.2
2022-12-05 21:37:55 -05:00
Trevor Buckner
feaabacc94 Merge pull request #2544 from naturalcrit/dependabot/npm_and_yarn/eslint-8.29.0
Bump eslint from 8.28.0 to 8.29.0
2022-12-05 21:37:40 -05:00
Trevor Buckner
a5827f66c9 Up version to v3.4.1 2022-12-05 21:36:01 -05:00
Trevor Buckner
bc0846c190 Merge pull request #2537 from Gazook89/Update-Injector-RegEx
change injector regex to work with safari
2022-12-05 21:18:24 -05:00
Gazook89
ecdcaadfa9 remove | from regexp 2022-12-05 11:25:24 -06:00
dependabot[bot]
db2478f73d Bump eslint from 8.28.0 to 8.29.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.28.0 to 8.29.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.28.0...v8.29.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:01:41 +00:00
dependabot[bot]
5d6a7e692f Bump supertest from 6.3.1 to 6.3.2
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.3.1 to 6.3.2.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.3.1...v6.3.2)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 03:00:45 +00:00
Gazook89
0fbeca1536 Merge branch 'master' into Update-Injector-RegEx 2022-12-04 20:17:46 -06:00
Trevor Buckner
f5e1869a9b Merge pull request #2529 from naturalcrit/dependabot/npm_and_yarn/fs-extra-11.1.0
Bump fs-extra from 10.1.0 to 11.1.0
2022-12-02 21:39:08 -05:00
Trevor Buckner
10c8414ab0 Merge pull request #2536 from Gazook89/Prevent-Crash-with-Non-Latin-Characters
Encode Filename in Content-Disposition header
2022-12-02 21:31:46 -05:00
Trevor Buckner
6832e68ada Merge pull request #2528 from Gazook89/GoogleActions-error
Change error message about googleActions on local startup.
2022-12-02 21:29:39 -05:00
Trevor Buckner
24477327aa message tweaks 2022-12-02 21:28:57 -05:00
dependabot[bot]
52b11d9b38 Bump fs-extra from 10.1.0 to 11.1.0
Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 10.1.0 to 11.1.0.
- [Release notes](https://github.com/jprichardson/node-fs-extra/releases)
- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jprichardson/node-fs-extra/compare/10.1.0...11.1.0)

---
updated-dependencies:
- dependency-name: fs-extra
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-03 01:58:32 +00:00
Trevor Buckner
c7b239f362 Merge pull request #2539 from naturalcrit/react17
update to react 17
2022-12-02 20:57:17 -05:00
Trevor Buckner
f1b67ad9d6 Update package-lock.json 2022-12-02 20:55:38 -05:00
Trevor Buckner
6279a85d2e Merge branch 'master' into react17 2022-12-02 17:14:45 -05:00
Trevor Buckner
7a4b5cca04 Merge pull request #2538 from naturalcrit/dependabot/npm_and_yarn/decode-uri-component-0.2.2
Bump decode-uri-component from 0.2.0 to 0.2.2
2022-12-02 17:13:55 -05:00
Trevor Buckner
c4eff2478a update dpendencies 2022-12-02 15:31:06 -05:00
Trevor Buckner
15c918b5d4 Merge pull request #2533 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.4.4
Bump react-router-dom from 6.4.3 to 6.4.4
2022-12-02 10:14:23 -05:00
Gazook89
0a5bfe2939 check if keys exist before trying for auth. 2022-12-01 19:51:36 -06:00
dependabot[bot]
05b9bbdf59 Bump decode-uri-component from 0.2.0 to 0.2.2
Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-02 01:23:25 +00:00
Trevor Buckner
b88c89d61b Merge pull request #2535 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.7.5
Bump mongoose from 6.7.4 to 6.7.5
2022-12-01 16:46:00 -05:00
Gazook89
31d58f9075 change regex to work with safari. 2022-12-01 11:55:37 -06:00
Trevor Buckner
743d0fa689 Merge pull request #2527 from Gazook89/OG-Meta-tag-fix
Fix og:image and og:site_name
2022-12-01 12:49:36 -05:00
Gazook89
3b6d3963f1 point to defaultMetatags.image 2022-12-01 11:01:40 -06:00
Gazook89
3a4c2d8f13 change image property to reference default image property
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-12-01 10:58:27 -06:00
Gazook89
7d86a40261 encode filename string to allow non-latin characters 2022-12-01 10:52:30 -06:00
dependabot[bot]
5527aa7990 Bump mongoose from 6.7.4 to 6.7.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.7.4 to 6.7.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.7.4...6.7.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-01 03:02:05 +00:00
dependabot[bot]
f48484520a Bump react-router-dom from 6.4.3 to 6.4.4
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.4.3 to 6.4.4.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.4.4/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-01 03:00:49 +00:00
Trevor Buckner
5957ddd01c Merge pull request #2526 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.7.4
Bump mongoose from 6.7.3 to 6.7.4
2022-11-30 14:21:53 -05:00
Trevor Buckner
994b1584b7 Merge pull request #2524 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.20.5
Bump @babel/core from 7.20.2 to 7.20.5
2022-11-30 14:21:43 -05:00
Gazook89
9647fbcc74 change default image on a few pages, and default description. 2022-11-29 19:12:54 -06:00
Gazook89
ca6f8d085a changing messaging about googleActions 2022-11-29 12:57:27 -06:00
Gazook89
c2637a7576 fix og:image and og:site_name 2022-11-29 11:27:15 -06:00
dependabot[bot]
4fd1cdd7e8 Bump mongoose from 6.7.3 to 6.7.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.7.3 to 6.7.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.7.3...6.7.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-29 03:01:22 +00:00
dependabot[bot]
ad20ff514a Bump @babel/core from 7.20.2 to 7.20.5
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.2 to 7.20.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.20.5/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-29 03:00:35 +00:00
Trevor Buckner
5cd50f7138 Merge pull request #2522 from G-Ambatte/fixAccountLoginTime-#2521
[AccountPage] Fix last login time
2022-11-28 17:19:31 -05:00
G.Ambatte
89e6bada56 Add link to instructions to refresh Google creds 2022-11-29 10:26:44 +13:00
G.Ambatte
420d703f9d Add updateTokens param to GoogleActions/authCheck 2022-11-29 10:00:23 +13:00
Trevor Buckner
090da33f33 Merge pull request #2519 from naturalcrit/v3.4.0
V3.4.0
2022-11-28 13:43:43 -05:00
Trevor Buckner
134e260d7b Update changelog.md 2022-11-28 13:34:46 -05:00
Trevor Buckner
82c8ca55fc 3.4.0 2022-11-28 12:33:57 -05:00
Trevor Buckner
e92cd3be18 Merge pull request #2517 from G-Ambatte/fixPrintMargins-#2516
Update Style for V3 & Legacy
2022-11-28 11:11:25 -05:00
G.Ambatte
93c2d2d860 Add contain:size to Legacy 2022-11-25 17:53:28 +13:00
G.Ambatte
cd79a38755 Add contain:size to V3 2022-11-25 17:53:17 +13:00
Trevor Buckner
84286b7942 Merge pull request #2515 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.7.3
Bump mongoose from 6.7.2 to 6.7.3
2022-11-23 10:52:13 -05:00
dependabot[bot]
a16ca8c897 Bump mongoose from 6.7.2 to 6.7.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.7.2 to 6.7.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.7.2...6.7.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-23 03:01:09 +00:00
Charlie Humphreys
fec1766e26 switch fetchGoogle to stubOnly 2022-11-21 16:21:36 -06:00
Trevor Buckner
fea07429fe Merge pull request #2514 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.11
Bump eslint-plugin-react from 7.31.10 to 7.31.11
2022-11-21 12:57:35 -05:00
dependabot[bot]
fa29f2281d Bump eslint-plugin-react from 7.31.10 to 7.31.11
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.10 to 7.31.11.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.10...v7.31.11)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 17:41:10 +00:00
Trevor Buckner
002b88ab83 Merge pull request #2513 from naturalcrit/dependabot/npm_and_yarn/marked-4.2.3
Bump marked from 4.2.2 to 4.2.3
2022-11-21 12:38:37 -05:00
Trevor Buckner
54833f9fc6 Merge pull request #2512 from naturalcrit/dependabot/npm_and_yarn/eslint-8.28.0
Bump eslint from 8.27.0 to 8.28.0
2022-11-21 12:38:26 -05:00
dependabot[bot]
cba9286217 Bump marked from 4.2.2 to 4.2.3
Bumps [marked](https://github.com/markedjs/marked) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.2.2...v4.2.3)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:01:20 +00:00
dependabot[bot]
9ebbff49fb Bump eslint from 8.27.0 to 8.28.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.27.0 to 8.28.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.27.0...v8.28.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-21 03:01:06 +00:00
Charlie Humphreys
f26e3d6cd1 remove tags from google brew fetch 2022-11-18 17:53:47 -06:00
Trevor Buckner
9ee39a83c1 Merge pull request #2507 from Gazook89/OG-Meta-Tag-default-object
Move common meta tags to default object
2022-11-17 23:01:32 -05:00
Trevor Buckner
c09a4c4374 cleanup 2022-11-17 22:58:46 -05:00
Trevor Buckner
3e44d0ad13 Merge pull request #2488 from Gazook89/Field-Validation-System-2
Field validation system 2
2022-11-17 21:58:54 -05:00
Trevor Buckner
b23a09b1b8 cleanup 2022-11-17 21:58:24 -05:00
Trevor Buckner
421ed8f51d Remove comments 2022-11-17 21:53:46 -05:00
Gazook89
14a057cf55 change account page title to something generic 2022-11-17 11:37:29 -06:00
Charlie Humphreys
2e6fcafc68 Merge branch 'remove-google-get-during-update' into disable-changes-from-non-authors 2022-11-16 23:15:55 -06:00
Charlie Humphreys
13b43e8902 Merge branch 'master' into remove-google-get-during-update 2022-11-16 23:15:11 -06:00
Charlie Humphreys
837708fc0c prevent changes to brews from non-authors 2022-11-16 22:39:06 -06:00
Charlie Humphreys
2e305d5636 remove authorship piece from this PR 2022-11-16 22:37:59 -06:00
Charlie Humphreys
f9711de634 add elvis for the possibility that the save failed 2022-11-16 22:32:50 -06:00
Charlie Humphreys
2c6779bb1c adjust getBrew to check authorship, change update method to not perform a get 2022-11-16 22:28:00 -06:00
Trevor Buckner
ee05392d27 Merge pull request #2503 from Gazook89/Add-syntax-highlighting-for-injections
Add syntax highlighting for injections
2022-11-16 15:43:17 -05:00
Trevor Buckner
1cc84da976 Remove end/start bracket tracking for injectors 2022-11-16 15:42:45 -05:00
Gazook89
5cfdd504c1 Move common meta tags to default object 2022-11-16 12:52:59 -06:00
Gazook89
24debfc75c fix regexp to not include inside of curly spans 2022-11-15 11:09:27 -06:00
Gazook89
ffe6272299 Merge branch 'master' into Add-syntax-highlighting-for-injections 2022-11-15 10:36:06 -06:00
Trevor Buckner
64c3d69641 Merge pull request #2506 from Gazook89/FAQ-in-Navbar
Add link to FAQ in "Need Help" menu
2022-11-15 11:26:23 -05:00
Gazook89
67c19b79e3 Add link to FAQ in "Need Help" menu 2022-11-15 10:21:35 -06:00
Trevor Buckner
ea29106101 Merge pull request #2501 from Gazook89/RegExp-Crash-in-Curly-Syntax
Reg exp crash in curly syntax
2022-11-14 18:57:27 -05:00
Trevor Buckner
8016f82040 Tweak capture group order 2022-11-14 18:56:04 -05:00
Trevor Buckner
7c93e5879c Merge pull request #2442 from Gazook89/Delete-Recent-Items
Add Ability to Remove Brews from Recent Items
2022-11-14 10:01:03 -05:00
Trevor Buckner
dc86f89c4f Add title attribute 2022-11-14 09:58:48 -05:00
Trevor Buckner
d03be052aa Merge pull request #2504 from Gazook89/Remove-Checkboxes-from-GH-Forms
Remove Checkboxes from Github Issue Forms
2022-11-14 00:18:41 -05:00
Gazook89
fef79f4fc3 remove checkboxes 2022-11-13 22:09:50 -06:00
Gazook89
cc58721ccd give span tags to injection syntax for styling 2022-11-13 21:02:45 -06:00
Gazook89
5f2115da0e fix mustacheInjectBlock pattern as well (missed it earlier) 2022-11-13 20:32:01 -06:00
Gazook89
1dd1e677e4 adjust span regexp pattern to capture trailing spaces 2022-11-13 20:19:39 -06:00
Gazook89
29b89bdc00 Merge branch 'master' into RegExp-Crash-in-Curly-Syntax 2022-11-13 20:06:05 -06:00
Gazook89
4493d86fd5 fix injection curly syntax 2022-11-13 20:05:52 -06:00
Gazook89
6a600df19a Merge branch 'master' into Field-Validation-System-2 2022-11-13 19:11:21 -06:00
Trevor Buckner
e8c6e36521 Merge pull request #2499 from G-Ambatte/fixMissingMetaTagsCrash-#2498
Fix template.js crash when ogMeta undefined
2022-11-13 15:46:25 -05:00
G.Ambatte
3e3610a204 Move fix to template.js 2022-11-14 08:20:46 +13:00
G.Ambatte
3e626d91f0 Add empty object as ogMeta default 2022-11-14 08:12:27 +13:00
Gazook89
6a0d8d13b0 don't save errs to state 2022-11-13 12:56:17 -06:00
Gazook89
4f762b376f tweak validation rules on Thumbnail & prevent invalid field from block valid fields 2022-11-13 12:45:31 -06:00
Gazook89
bda80c9984 remove comments 2022-11-13 11:43:55 -06:00
Gazook89
7de60e2345 Merge branch 'master' into Delete-Recent-Items 2022-11-13 11:41:19 -06:00
Trevor Buckner
77ad2c8958 Merge pull request #2481 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.4.3
Bump react-router-dom from 6.4.2 to 6.4.3
2022-11-12 21:27:52 -05:00
Trevor Buckner
6cca821ba6 Merge pull request #2487 from naturalcrit/dependabot/npm_and_yarn/googleapis-109.0.1
Bump googleapis from 108.0.1 to 109.0.1
2022-11-12 21:27:44 -05:00
Trevor Buckner
96da053717 Merge branch 'master' into pr/2488 2022-11-11 20:33:20 -05:00
dependabot[bot]
3723006f39 Bump react-router-dom from 6.4.2 to 6.4.3
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.4.2 to 6.4.3.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.4.3/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-11 03:21:08 +00:00
dependabot[bot]
6cfdc47760 Bump googleapis from 108.0.1 to 109.0.1
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 108.0.1 to 109.0.1.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v108.0.1...googleapis-v109.0.1)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-11 03:21:02 +00:00
Trevor Buckner
00a5600768 Merge pull request #2490 from naturalcrit/dependabot/npm_and_yarn/marked-4.2.2
Bump marked from 4.1.1 to 4.2.2
2022-11-10 22:10:57 -05:00
Trevor Buckner
d8674d09a2 Merge pull request #2453 from Gazook89/Open-Graph-Meta-Changes
Change `<meta>` tags based on Current Page
2022-11-10 22:02:47 -05:00
dependabot[bot]
a46630f774 Bump marked from 4.1.1 to 4.2.2
Bumps [marked](https://github.com/markedjs/marked) from 4.1.1 to 4.2.2.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.1.1...v4.2.2)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-11 02:57:54 +00:00
Trevor Buckner
38fb9d467c Merge branch 'master' into pr/2453 2022-11-10 21:56:49 -05:00
Trevor Buckner
fee56ca8e0 Merge pull request #2496 from naturalcrit/fixV3_PreviewTest
Update Jest test  for moved legacy homepage
2022-11-10 21:55:32 -05:00
Trevor Buckner
de60419926 Update config.yml 2022-11-10 21:53:28 -05:00
Trevor Buckner
42a1410cc2 Update config.yml 2022-11-10 21:52:06 -05:00
Trevor Buckner
ddd4f93f01 Merge branch 'fixV3_PreviewTest' of https://github.com/naturalcrit/homebrewery into fixV3_PreviewTest 2022-11-10 21:50:09 -05:00
Trevor Buckner
21de3b31b6 Use lower npm version 2022-11-10 21:49:57 -05:00
Trevor Buckner
aea25119c0 Updated config.yml 2022-11-10 21:46:56 -05:00
Trevor Buckner
aa1100642d update circleCI config 2022-11-10 21:37:45 -05:00
Trevor Buckner
4121cc0e14 Update package-lock.json 2022-11-10 21:23:21 -05:00
Trevor Buckner
3b7b56c789 Update package-lock.json 2022-11-10 21:19:36 -05:00
Trevor Buckner
ebc03aee33 Update Jest test for moved legacy homepage 2022-11-10 21:04:25 -05:00
Gazook89
03c6edf31a change regexp to calculuschild's atomic fix 2022-11-07 10:01:22 -06:00
Gazook89
970d03a5e4 validate thumbnail is URL 2022-11-06 13:17:39 -06:00
Gazook89
ed4c090f21 finish setting OG tags 2022-11-06 12:34:24 -06:00
Gazook89
672d582caf move metaTag objects to app.js 2022-11-05 23:32:30 -05:00
Gazook89
b6c09683be add language field validation (for future pr)
fix an oversight in validations
2022-11-05 20:07:27 -05:00
Gazook89
a13fd48cda prevent crash on input to second field. small css change 2022-11-05 12:19:01 -05:00
Gazook89
aec1147aa5 set :invalid input to light red background 2022-11-05 11:56:48 -05:00
Gazook89
78da48b08d fix issue with async setState using Event.persist() 2022-11-05 11:42:21 -05:00
Gazook89
edce191c29 remove a silly rule 2022-11-05 11:32:35 -05:00
Gazook89
8c52a253dc log errs correctly, setCustomValidity and reportValidity 2022-11-04 20:22:59 -05:00
Gazook89
589ec0251a move validations into it's own file. 2022-11-04 15:32:20 -05:00
Gazook89
ffddc275c1 set removeItem icon to transparent background 2022-11-03 23:38:46 -05:00
Gazook89
4e26bb309c Merge branch 'master' into Open-Graph-Meta-Changes 2022-11-03 22:05:13 -05:00
Gazook89
7696be5d95 first commit 2022-11-03 22:00:45 -05:00
Trevor Buckner
ef80c23034 Merge pull request #2479 from G-Ambatte/excludeGoogleStubsFromAccountPage
[AccountPage] Modify query to exclude Google brew stubs
2022-10-31 22:37:40 -04:00
G.Ambatte
1f7be69624 Modify query to exclude Google brew stubs 2022-10-31 17:43:41 +13:00
Trevor Buckner
6e069dc29d Merge pull request #2161 from G-Ambatte/createUIBasePage
Create UI base page
2022-10-30 11:08:04 -04:00
G.Ambatte
e40bbf56c7 Merge branch 'master' into createUIBasePage 2022-10-30 18:21:45 +13:00
Trevor Buckner
65beb8d65e Merge branch 'master' into pr/2442 2022-10-28 14:07:14 -04:00
Trevor Buckner
ebf4f614c4 Merge pull request #2447 from Gazook89/autosave-default-fix
Fix Autosave Default
2022-10-28 14:05:45 -04:00
Trevor Buckner
26942e276a Merge branch 'master' into pr/2447 2022-10-28 14:04:45 -04:00
Trevor Buckner
0bcce67e39 Small logic simplification 2022-10-28 14:04:28 -04:00
Trevor Buckner
3318ba6277 Merge pull request #2450 from G-Ambatte/fixUserPageStyle-#2449
[UserPage] Fix UserPage groups styling
2022-10-28 14:00:17 -04:00
Trevor Buckner
c5eb7db432 Merge pull request #2448 from naturalcrit/dependabot/npm_and_yarn/dedent-tabs-0.10.2
Bump dedent-tabs from 0.10.1 to 0.10.2
2022-10-28 13:07:26 -04:00
Trevor Buckner
f35345f385 Actually update version number. 2022-10-28 13:03:09 -04:00
Trevor Buckner
a13ac2e0c5 Merge pull request #2469 from jeddai/update-twitter-card
update twitter:card meta tag to have "summary" as the content
2022-10-28 02:31:09 -04:00
Trevor Buckner
27eb95ece8 Simplify split-table margins, .blank should have no margins before or after 2022-10-28 02:10:22 -04:00
Trevor Buckner
7958bb4cda Missed one table style 2022-10-28 00:51:40 -04:00
Trevor Buckner
8fc01ebb12 Merge pull request #2472 from naturalcrit/Version3.3.1
Update changelog.md
2022-10-28 00:11:57 -04:00
Trevor Buckner
d2c10bb9ac Update changelog.md 2022-10-28 00:11:31 -04:00
Trevor Buckner
13eedc9f82 Merge pull request #2467 from naturalcrit/dependabot/npm_and_yarn/googleapis-108.0.1
Bump googleapis from 108.0.0 to 108.0.1
2022-10-28 00:05:45 -04:00
Trevor Buckner
6f919bc214 Merge pull request #2471 from naturalcrit/MoreThemesFixes
More themes fixes
2022-10-28 00:05:28 -04:00
Trevor Buckner
496328d511 Remove unnecessary spacing rules from Blank Theme 2022-10-27 23:46:47 -04:00
Trevor Buckner
d6af56c51c Move table line-height from TD to Table 2022-10-27 23:34:50 -04:00
Trevor Buckner
079d59695f Return :where(.page) to .page 2022-10-27 23:27:56 -04:00
Charlie Humphreys
0867b142da update getBrew usages to not fetch google brew during updates 2022-10-27 21:44:26 -05:00
Charlie Humphreys
ac7b2bce9f update twitter:card meta tag to have "summary" as the content 2022-10-27 21:14:14 -05:00
dependabot[bot]
4664d88aad Bump googleapis from 108.0.0 to 108.0.1
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 108.0.0 to 108.0.1.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v108.0.0...googleapis-v108.0.1)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-26 03:01:07 +00:00
Trevor Buckner
7d6a3da2e2 Merge pull request #2465 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.7.0
Bump mongoose from 6.6.5 to 6.7.0
2022-10-24 23:20:42 -04:00
Trevor Buckner
4180a7cfb4 Merge pull request #2455 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.19.6
Bump @babel/plugin-transform-runtime from 7.19.1 to 7.19.6
2022-10-24 23:20:15 -04:00
Trevor Buckner
a2e11d12c9 Merge pull request #2452 from G-Ambatte/fixBrewItemError-#2451
[UserPage] Add key prop to Brew tags
2022-10-24 23:20:02 -04:00
dependabot[bot]
301c3fbdd2 Bump @babel/plugin-transform-runtime from 7.19.1 to 7.19.6
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.19.1 to 7.19.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.6/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-25 03:16:37 +00:00
Trevor Buckner
35088188b3 Merge pull request #2456 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.19.6
Bump @babel/core from 7.19.3 to 7.19.6
2022-10-24 23:15:38 -04:00
Trevor Buckner
95cda71eb5 Merge pull request #2458 from naturalcrit/dependabot/npm_and_yarn/eslint-8.26.0
Bump eslint from 8.25.0 to 8.26.0
2022-10-24 23:15:26 -04:00
Trevor Buckner
a2e9fc67e4 Merge pull request #2463 from naturalcrit/dependabot/npm_and_yarn/jest-29.2.2
Bump jest from 29.2.1 to 29.2.2
2022-10-24 23:15:18 -04:00
dependabot[bot]
50c541f3fa Bump jest from 29.2.1 to 29.2.2
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.2.1 to 29.2.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.2.2/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-25 03:12:38 +00:00
dependabot[bot]
f98a3fe6c5 Bump eslint from 8.25.0 to 8.26.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.25.0 to 8.26.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.25.0...v8.26.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-25 03:11:05 +00:00
Trevor Buckner
d2c86bf619 Merge pull request #2464 from naturalcrit/dependabot/npm_and_yarn/supertest-6.3.1
Bump supertest from 6.3.0 to 6.3.1
2022-10-24 23:10:00 -04:00
dependabot[bot]
aeb4f85a48 Bump mongoose from 6.6.5 to 6.7.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.6.5 to 6.7.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.6.5...6.7.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-25 03:01:46 +00:00
dependabot[bot]
b8f32cc2cb Bump supertest from 6.3.0 to 6.3.1
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.3.0 to 6.3.1.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.3.0...v6.3.1)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-25 03:01:25 +00:00
Trevor Buckner
d562308b63 Merge pull request #2461 from naturalcrit/FixPHBHeaderSpacings
Fix PHB Tables (again) + Header spacings
2022-10-24 19:37:20 -04:00
Trevor Buckner
2d26e7cd07 Handle spacing at bottom of side-by-side tables 2022-10-24 19:29:59 -04:00
Trevor Buckner
8b011804ca Merge branch 'master' into FixPHBHeaderSpacings 2022-10-24 17:08:49 -04:00
Trevor Buckner
93a90dbf13 Merge pull request #2460 from naturalcrit/FixPrintPageMissingBlankTheme
Fix "blank" theme not included on print page.
2022-10-24 17:08:33 -04:00
Trevor Buckner
2b6585545c Fix "blank" theme not included on print page. 2022-10-24 17:04:33 -04:00
Trevor Buckner
047160e4ec Further tweaks to table size/header spacings 2022-10-24 17:01:38 -04:00
Trevor Buckner
6a6ee9fc12 Tweak top margins for headers 2022-10-21 09:27:55 -04:00
dependabot[bot]
96577794e9 Bump @babel/core from 7.19.3 to 7.19.6
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.3 to 7.19.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.6/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-21 03:01:56 +00:00
Gazook89
5c3f7b1b82 small fixes 2022-10-20 11:46:53 -05:00
Gazook89
bdf1bd1e8b add user page 2022-10-20 11:40:10 -05:00
Gazook89
df6d372243 Merge branch 'master' into Open-Graph-Meta-Changes 2022-10-20 11:19:48 -05:00
Gazook89
b237456420 add fn to change meta tags based on page 2022-10-20 11:19:17 -05:00
G.Ambatte
52a79b4f75 Add default loading properties using custom assign 2022-10-20 19:11:31 +13:00
G.Ambatte
99382adbf6 Add key prop to Brew tags 2022-10-20 17:34:06 +13:00
G.Ambatte
3f0c950e72 Fix UserPage groups styling 2022-10-20 17:26:46 +13:00
dependabot[bot]
2b71ff2dec Bump dedent-tabs from 0.10.1 to 0.10.2
Bumps [dedent-tabs](https://github.com/adrianjost/dedent-tabs) from 0.10.1 to 0.10.2.
- [Release notes](https://github.com/adrianjost/dedent-tabs/releases)
- [Commits](https://github.com/adrianjost/dedent-tabs/commits)

---
updated-dependencies:
- dependency-name: dedent-tabs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-20 03:01:28 +00:00
G.Ambatte
9ccf9d0a83 Merge branch 'master' into fixThemesDefault 2022-10-20 08:03:43 +13:00
Gazook89
1801691f49 fix autosave default 2022-10-19 11:45:47 -05:00
Trevor Buckner
2bad0bfcb0 Further table tweaks for Chrome 106 2022-10-19 09:06:48 -04:00
Trevor Buckner
ac30b3df9d Merge pull request #2446 from naturalcrit/Update-to-v-3.3.0
Update to v 3.3.0
2022-10-19 00:54:29 -04:00
Trevor Buckner
f67ba7ecda Update changelog.md 2022-10-19 00:50:30 -04:00
Trevor Buckner
812b8350d3 3.3.0 2022-10-19 00:49:31 -04:00
Trevor Buckner
0c67a23b57 Update changelog.md 2022-10-19 00:49:24 -04:00
Trevor Buckner
976f6be3f0 Merge pull request #2441 from naturalcrit/TemporaryChromeTableHeightFix
Tweak table padding
2022-10-19 00:07:33 -04:00
Trevor Buckner
852d2a1d5f Merge pull request #2443 from naturalcrit/dependabot/npm_and_yarn/jest-29.2.1
Bump jest from 29.2.0 to 29.2.1
2022-10-19 00:07:11 -04:00
dependabot[bot]
bf39d4124c Bump jest from 29.2.0 to 29.2.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.2.0 to 29.2.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.2.1/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-19 03:01:25 +00:00
Gazook89
04eebae3ec Merge branch 'master' into Open-Graph-Meta-Changes 2022-10-18 21:19:55 -05:00
Gazook89
23a0a89ead autohide dropdown again 2022-10-18 21:02:44 -05:00
Gazook89
a7a67621a1 added removeItem() function 2022-10-18 21:01:24 -05:00
Trevor Buckner
2d2a81a3ca Tweak table padding 2022-10-18 21:29:34 -04:00
Gazook89
bebb06a36d Merge branch 'master' into Delete-Recent-Items 2022-10-18 19:22:01 -05:00
Trevor Buckner
c4e331ee7e Merge pull request #2438 from G-Ambatte/fixToC-#2437
Change ToC to use flexbox
2022-10-18 15:25:24 -04:00
Trevor Buckner
13192dc102 Merge pull request #2428 from G-Ambatte/fixSaveFromHomePage-#2427
Send entire brew to HomePage save function
2022-10-18 14:12:47 -04:00
Trevor Buckner
ab773f5f7b Merge pull request #2426 from G-Ambatte/ignoreVSCodeFIles
Add .vscode to .gitignore
2022-10-18 14:12:15 -04:00
Trevor Buckner
164a0fe8d5 Merge pull request #2425 from G-Ambatte/addURIEncodingToUserName-#2420
Add URI encoding to User Page link
2022-10-18 14:11:42 -04:00
Trevor Buckner
3032363aea Merge pull request #2392 from G-Ambatte/stopUnfoldingCode-#2135
[Editor] Prevent unfolding code in Editor when adding a Snippet
2022-10-18 13:55:21 -04:00
Trevor Buckner
3327712253 Focus on editor after snippet 2022-10-18 13:52:22 -04:00
Trevor Buckner
2abd0a871b Merge pull request #2416 from naturalcrit/dependabot/npm_and_yarn/supertest-6.3.0
Bump supertest from 6.2.4 to 6.3.0
2022-10-18 13:23:39 -04:00
Trevor Buckner
eff7fde8cf Merge pull request #2384 from Gazook89/Toggle-AutoSave
Add ability to toggle the Auto Save
2022-10-18 13:23:26 -04:00
Trevor Buckner
8b8a60c8ad tweak alert text 2022-10-18 13:22:29 -04:00
Trevor Buckner
5350f7d933 Merge pull request #2418 from naturalcrit/dependabot/npm_and_yarn/react-router-dom-6.4.2
Bump react-router-dom from 6.3.0 to 6.4.2
2022-10-18 11:57:36 -04:00
Trevor Buckner
30c9b35354 Merge pull request #2404 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.19.3
Bump @babel/core from 7.19.1 to 7.19.3
2022-10-18 11:57:23 -04:00
Trevor Buckner
4c46388686 Merge pull request #2419 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.6.5
Bump mongoose from 6.6.1 to 6.6.5
2022-10-18 11:57:12 -04:00
dependabot[bot]
3bd9fe4c99 Bump supertest from 6.2.4 to 6.3.0
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.2.4 to 6.3.0.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.2.4...v6.3.0)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-18 15:32:04 +00:00
Trevor Buckner
837554eb17 Merge pull request #2439 from naturalcrit/dependabot/npm_and_yarn/jest-29.2.0
Bump jest from 29.0.3 to 29.2.0
2022-10-18 11:30:45 -04:00
Gazook89
d8fe54b7b2 Merge branch 'master' into Toggle-AutoSave 2022-10-17 21:53:35 -05:00
Gazook89
c49be3391e change time delay between warnings to 15min 2022-10-17 21:52:48 -05:00
Gazook89
c56adcba76 only display 'off' warning if changes exist 2022-10-17 21:49:50 -05:00
dependabot[bot]
74e20bf7be Bump jest from 29.0.3 to 29.2.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.0.3 to 29.2.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.2.0/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 03:01:24 +00:00
G.Ambatte
7896fe3ed9 Remove footer on pages with ToC 2022-10-16 22:37:30 +13:00
G.Ambatte
0e0cdfe25b Fix font size in ToC 2022-10-16 21:20:01 +13:00
G.Ambatte
2c2a10730e Change style of page numbers 2022-10-16 21:01:45 +13:00
G.Ambatte
51f8786905 Change ToC to use flexbox 2022-10-16 20:34:18 +13:00
dependabot[bot]
78a5390917 Bump @babel/core from 7.19.1 to 7.19.3
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.1 to 7.19.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.3/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-11 01:18:32 +00:00
Trevor Buckner
d998381bbe Merge pull request #2435 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.19.4
Bump @babel/preset-env from 7.19.1 to 7.19.4
2022-10-10 21:17:48 -04:00
Trevor Buckner
6326a93d98 Merge pull request #2434 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.10
Bump eslint-plugin-react from 7.31.8 to 7.31.10
2022-10-10 21:17:42 -04:00
dependabot[bot]
e4e619ac1e Bump @babel/preset-env from 7.19.1 to 7.19.4
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.19.1 to 7.19.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.4/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-11 01:11:34 +00:00
dependabot[bot]
439afcb667 Bump eslint-plugin-react from 7.31.8 to 7.31.10
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.8 to 7.31.10.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.8...v7.31.10)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-11 01:11:10 +00:00
Trevor Buckner
f4108f241e Merge pull request #2422 from naturalcrit/dependabot/npm_and_yarn/body-parser-1.20.1
Bump body-parser from 1.20.0 to 1.20.1
2022-10-10 21:10:36 -04:00
Trevor Buckner
2e3c9114c6 Merge pull request #2412 from naturalcrit/dependabot/npm_and_yarn/marked-4.1.1
Bump marked from 4.1.0 to 4.1.1
2022-10-10 21:10:16 -04:00
Trevor Buckner
746b04646c Merge pull request #2431 from naturalcrit/dependabot/npm_and_yarn/express-4.18.2
Bump express from 4.18.1 to 4.18.2
2022-10-10 21:10:04 -04:00
Trevor Buckner
a7577bf83b Merge pull request #2432 from naturalcrit/dependabot/npm_and_yarn/eslint-8.25.0
Bump eslint from 8.24.0 to 8.25.0
2022-10-10 21:09:51 -04:00
dependabot[bot]
b283e8e66a Bump eslint from 8.24.0 to 8.25.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.24.0 to 8.25.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.24.0...v8.25.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:01:22 +00:00
dependabot[bot]
a129e887dd Bump express from 4.18.1 to 4.18.2
Bumps [express](https://github.com/expressjs/express) from 4.18.1 to 4.18.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.1...4.18.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 03:01:07 +00:00
G.Ambatte
9ad915c14a Remove unnecessary & incorrect default setting 2022-10-09 21:50:31 +13:00
G.Ambatte
9fd5fea50c Remove obsolete code in app.js 2022-10-09 21:50:11 +13:00
G.Ambatte
41fa0f2c77 Apply defaults on load and before saving 2022-10-09 21:49:25 +13:00
G.Ambatte
ed65d0c922 Send entire brew to HomePage save function 2022-10-09 11:55:05 +13:00
G.Ambatte
df53369ec1 Add .vscode to .gitignore 2022-10-08 14:56:42 +13:00
G.Ambatte
cc385462de Add URI encoding to User Page link 2022-10-08 14:47:59 +13:00
dependabot[bot]
269ba246ec Bump body-parser from 1.20.0 to 1.20.1
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.0 to 1.20.1.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.0...1.20.1)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-07 03:01:00 +00:00
dependabot[bot]
a67b1b9c12 Bump mongoose from 6.6.1 to 6.6.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.6.1 to 6.6.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.6.1...6.6.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-06 03:02:20 +00:00
dependabot[bot]
8c13d4d7ad Bump react-router-dom from 6.3.0 to 6.4.2
Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.3.0 to 6.4.2.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/react-router-dom@6.4.2/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.4.2/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-06 03:01:39 +00:00
Gazook89
8562d328ff Merge remote-tracking branch 'upstream/master' into Toggle-AutoSave 2022-10-03 20:46:11 -05:00
G.Ambatte
1d8781da90 Modify how data is passed to UIPage 2022-10-03 20:27:34 +13:00
dependabot[bot]
dd64d19037 Bump marked from 4.1.0 to 4.1.1
Bumps [marked](https://github.com/markedjs/marked) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 03:01:09 +00:00
G.Ambatte
93918bc26c Nudge SVG size 2022-10-02 11:06:57 +13:00
Gazook89
bfb82e8a21 autosave warning conditional on elapsed time unsaved. 2022-09-30 12:20:59 -05:00
Gazook89
8609026531 add unsavedTime state for better notification 2022-09-30 11:24:15 -05:00
Gazook89
0cd598ae14 rework the whole thing 2022-09-30 10:42:50 -05:00
Gazook89
95497350e4 move test for autosave status to handleTextChange from trySave() 2022-09-28 20:20:11 -05:00
Gazook89
9bb1344538 tweak behavior per calculuschild notes
Default to autosave = true.   trySave() when autosave toggled on.  Display "auto-saved." when save is a result of autosave.
2022-09-28 12:17:14 -05:00
Gazook89
ab695d29fe refactor into handle... and render... methods 2022-09-28 11:13:16 -05:00
Gazook89
fa4b3338af save autosave setting to localStorage 2022-09-27 21:04:51 -05:00
Gazook89
c7ed9ea717 Create autosave toggle dropdown menu 2022-09-27 19:35:29 -05:00
G.Ambatte
7ae939623c Merge branch 'master' into createUIBasePage 2022-09-28 07:06:01 +13:00
G.Ambatte
de86a77dfc Change post-insertion selection option 2022-09-27 17:06:48 +13:00
G.Ambatte
b44a7d3236 Merge branch 'master' into stopUnfoldingCode-#2135 2022-09-27 13:01:30 +13:00
Trevor Buckner
a3c7e2f807 Merge pull request #2396 from G-Ambatte/adjustCodeFold-#1907
[Editor] Change folded code text generation
2022-09-26 16:40:40 -04:00
G.Ambatte
447f8d39dc Reduce variable use 2022-09-27 08:03:43 +13:00
G.Ambatte
7b961af45f Merge branch 'master' into adjustCodeFold-#1907 2022-09-27 07:54:05 +13:00
Gazook89
bc0ee8138e change title and description 2022-09-26 13:03:40 -05:00
G.Ambatte
91b2911bb0 Change capitalization of page title 2022-09-26 20:17:52 +13:00
G.Ambatte
9848dc54ba Add Nav bar items 2022-09-26 19:07:46 +13:00
G.Ambatte
9a3bd4db4b Merge branch 'master' into createUIBasePage 2022-09-26 19:02:07 +13:00
G.Ambatte
891bde6990 Merge branch 'createUIBasePage' of https://github.com/G-Ambatte/homebrewery into createUIBasePage 2022-09-26 18:44:45 +13:00
G.Ambatte
d9228b8c4b Add Account menu item 2022-09-26 18:43:47 +13:00
Trevor Buckner
edd58455f6 Merge pull request #2399 from naturalcrit/dependabot/npm_and_yarn/got-and-nodemon--removed
Bump got and nodemon
2022-09-25 23:56:57 -04:00
Trevor Buckner
e082167c39 Merge pull request #2398 from naturalcrit/dependabot/npm_and_yarn/eslint-8.24.0
Bump eslint from 8.23.1 to 8.24.0
2022-09-25 23:55:04 -04:00
G.Ambatte
5a3daf8ffd Merge branch 'master' into createUIBasePage 2022-09-26 16:34:44 +13:00
dependabot[bot]
3719614dee Bump got and nodemon
Removes [got](https://github.com/sindresorhus/got). It's no longer used after updating ancestor dependency [nodemon](https://github.com/remy/nodemon). These dependencies need to be updated together.


Removes `got`

Updates `nodemon` from 2.0.7 to 2.0.20
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v2.0.7...v2.0.20)

---
updated-dependencies:
- dependency-name: got
  dependency-type: indirect
- dependency-name: nodemon
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 03:27:43 +00:00
Trevor Buckner
e098dc21ce Merge pull request #2389 from naturalcrit/dependabot/npm_and_yarn/googleapis-108.0.0
Bump googleapis from 107.0.0 to 108.0.0
2022-09-25 23:26:55 -04:00
Trevor Buckner
f4580f9040 Merge pull request #2372 from Gazook89/CSS-Flex-Meta-Editor
Reposition Thumbnail Preview in Metadata Editor
2022-09-25 23:19:27 -04:00
Trevor Buckner
6e05186f1a Merge pull request #2395 from G-Ambatte/shiftThumbnailUrlToStub-#2351
[Stub] Shift thumbnail url to stub #2351
2022-09-25 23:16:50 -04:00
Trevor Buckner
9701c55195 Merge branch 'master' into pr/2395 2022-09-25 23:08:37 -04:00
dependabot[bot]
0d2eebe324 Bump eslint from 8.23.1 to 8.24.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.23.1 to 8.24.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.23.1...v8.24.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 03:01:13 +00:00
Trevor Buckner
e21fe49359 Merge pull request #2387 from Gazook89/stat-block-color-tweak
Change Monster Stat background color
2022-09-25 22:54:42 -04:00
Trevor Buckner
bc94082eb6 Merge pull request #2383 from Gazook89/Prevent-Selection-on-splitPane-drag
Prevent text selection in editor when dragging splitPane divider.
2022-09-25 22:29:36 -04:00
Trevor Buckner
5d769d2297 Merge pull request #2382 from Gazook89/scroll-behavior-correction
Scroll behavior correction
2022-09-25 22:26:15 -04:00
Trevor Buckner
48d0434178 Merge branch 'master' into pr/2382 2022-09-25 22:23:19 -04:00
Trevor Buckner
f74b84bd12 Merge pull request #2379 from Gazook89/filter-sort-as-divs
Change User Page search bar to Divs
2022-09-25 22:21:58 -04:00
Trevor Buckner
910868cfdb Simplified sort arrow, removed duplicate "onClick" 2022-09-25 22:20:44 -04:00
G.Ambatte
5469ec6683 Format Issued datetime 2022-09-26 13:28:50 +13:00
G.Ambatte
764621f762 Add Homebrewery Icon 2022-09-26 12:12:21 +13:00
G.Ambatte
248687684a Add group styling 2022-09-26 11:31:00 +13:00
G.Ambatte
d7b1f89152 Change data items to a list 2022-09-26 11:30:45 +13:00
G.Ambatte
9a844dae39 Fix class=>className 2022-09-26 00:41:49 +13:00
G.Ambatte
5193271796 Fix Google Drive icon 2022-09-26 00:41:17 +13:00
G.Ambatte
ed5bef27e0 Shift renderUiItems to function 2022-09-26 00:35:12 +13:00
G.Ambatte
be25e90009 Change variable name 2022-09-26 00:34:54 +13:00
G.Ambatte
ab98bf5d6c Fix Routes 2022-09-26 00:05:53 +13:00
G.Ambatte
ffb1c77697 Merge branch 'createUIBasePage' 2022-09-25 23:54:20 +13:00
G.Ambatte
6bddba6762 Merge branch 'master' into createUIBasePage 2022-09-25 23:47:55 +13:00
G.Ambatte
57b0af54df Renamed functions, eliminate unnecessary variable 2022-09-25 23:29:45 +13:00
G.Ambatte
0ac50017c4 Change path to /account 2022-09-25 23:20:45 +13:00
G.Ambatte
9135ca1e43 Fix class => className 2022-09-25 23:20:03 +13:00
G.Ambatte
1dc6256aab Change fold-marker color to grey 2022-09-25 19:59:35 +13:00
G.Ambatte
227be5e3be Modify folded text generation 2022-09-25 13:55:46 +13:00
G.Ambatte
e18e3cf7e4 Remove thumbnail from Google brew properties 2022-09-24 23:51:08 +12:00
G.Ambatte
ca09e98d8f Exclude thumbnail from Google props 2022-09-24 23:50:20 +12:00
G.Ambatte
db174c9655 Add optional overwrite protection 2022-09-24 13:50:26 +12:00
G.Ambatte
22896470e3 Remove unused splice function 2022-09-24 13:36:14 +12:00
G.Ambatte
56fde5a448 Use cm.replaceSelection instead of split/join text 2022-09-24 13:34:26 +12:00
Trevor Buckner
6ade9925d7 Merge pull request #2388 from Gazook89/Display-Renderer-on-Page
Add renderer to pageInfo
2022-09-22 14:51:20 -04:00
Trevor Buckner
e755ab878d Merge pull request #2332 from G-Ambatte/showThumbnailOnUserPage-#2331
[UserPage] Show Brew's Meta thumbnail on UserPage
2022-09-22 14:23:06 -04:00
G.Ambatte
fa0d8e86fc Remove unnecessary empty element 2022-09-22 20:25:18 +12:00
dependabot[bot]
5458b8297c Bump googleapis from 107.0.0 to 108.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 107.0.0 to 108.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v107.0.0...googleapis-v108.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-22 03:01:15 +00:00
Gazook89
f3c9dde801 thumbnail preview de-uglification 2022-09-21 20:50:10 -05:00
Gazook89
45aa8bdfae Add html node and css for Delete button 2022-09-21 20:27:16 -05:00
G.Ambatte
09d161f3a6 Adjust background image properties 2022-09-22 07:48:51 +12:00
Gazook89
90a65d0a57 Add renderer to pageInfo 2022-09-21 11:37:14 -05:00
Gazook89
0bf1328c17 change monster stat background color 2022-09-21 11:29:42 -05:00
Gazook89
3754468cf4 change sortDir by clicking on sort title. 2022-09-21 11:12:23 -05:00
Gazook89
6329cb2cec style changes for better contrast 2022-09-21 10:56:45 -05:00
G.Ambatte
f218f48f0f Apply Gazook89's thumbnail style 2022-09-21 18:38:45 +12:00
G.Ambatte
a179f8d124 Lint fix 2022-09-21 18:16:36 +12:00
Gazook89
f681948a35 pedantic change 2022-09-21 00:42:10 -05:00
Gazook89
475f3e75dd add simple toggle to 'save status' field for auto-save 2022-09-21 00:29:40 -05:00
Gazook89
f337925af9 add e.preventDefault() to mousedown event 2022-09-20 23:46:25 -05:00
G.Ambatte
918690e773 Merge branch 'master' into showThumbnailOnUserPage-#2331 2022-09-21 14:35:27 +12:00
Gazook89
7623d3e93a set scrollbar to 'thin' in recentItems dropdown 2022-09-20 20:37:55 -05:00
Gazook89
f2a8a6a03a match scroll bar style of recentItems to UI 2022-09-20 19:59:38 -05:00
Gazook89
49cc4180a7 set only listPage to overflow-y scroll.
The pages are not all quite set up the same way.  /new/, /edit/, and /share/ all use an iframe and those iframes have their own scroll behavior.  /user/ doesn't have an iframe and so the `.content` portion of the page needs to scroll.
2022-09-20 19:58:52 -05:00
Trevor Buckner
8ebfc772f3 Merge pull request #2381 from Gazook89/Effect-to-Affect-PPR
Update PPR notice with correct spelling.
2022-09-20 13:21:36 -04:00
Gazook89
38dccbae09 change 'effect' to 'affect' 2022-09-20 12:19:27 -05:00
Trevor Buckner
0f68f5a356 Merge pull request #2380 from Gazook89/reddit-issue-template-fix
Make Reddit Issue Template a List
2022-09-19 22:19:04 -04:00
Gazook89
7999553973 make reddit issue template a list 2022-09-19 20:44:31 -05:00
Gazook89
3c75ac6156 change some .less to reflect new focus of .active 2022-09-19 11:30:44 -05:00
Gazook89
9fcc7b84c3 set .sort-option to .active rather than button within. 2022-09-19 11:07:47 -05:00
Gazook89
8ac4d93581 change sort-container to baseline alignment 2022-09-19 10:47:35 -05:00
Gazook89
10a349ade8 change sortDir to always white. 2022-09-19 10:27:02 -05:00
Gazook89
87a9194189 remove unset on listPage height. 2022-09-19 10:08:52 -05:00
Gazook89
ac371946d8 Merge branch 'master' into filter-sort-as-divs 2022-09-19 10:04:47 -05:00
Trevor Buckner
158d47edde Merge pull request #2378 from Gazook89/github-forms
remove labels from dropdowns and add label
2022-09-19 11:00:34 -04:00
Gazook89
5ad4e6b1f1 remove labels from dropdowns and add label 2022-09-19 09:54:34 -05:00
Trevor Buckner
ce7c3dfb8a Merge pull request #2377 from Gazook89/github-forms
GitHub forms tweaks
2022-09-19 10:44:36 -04:00
Gazook89
208e9261ce fixed two more validations 2022-09-19 09:31:55 -05:00
Gazook89
af8d327ae2 fix editPage url query & Saving label 2022-09-18 19:37:40 -05:00
Gazook89
0d931ed5b5 add validation (required) to user-description in save_issue.yml 2022-09-18 19:33:53 -05:00
Gazook89
d8039b0cf2 removed 'title' from save_issue.yml 2022-09-18 19:32:15 -05:00
Gazook89
2e27c5957d fix checkboxes on feature_request.yml 2022-09-18 19:30:30 -05:00
Gazook89
1bfcb5a839 fix 'validations' on general_issue.yaml 2022-09-18 19:25:26 -05:00
Trevor Buckner
6d98119df2 Merge pull request #2367 from Gazook89/github-forms
Add different Issue forms
2022-09-18 17:20:25 -04:00
Trevor Buckner
a90028d93f Merge pull request #2360 from Gazook89/navbar-vs-content-sections
change overflow-y behavior to fix navbar
2022-09-18 17:16:48 -04:00
Gazook89
630ff9d86a add browser field 2022-09-18 10:32:50 -05:00
Gazook89
600b92cbce Move 'additional steps' to end of post. 2022-09-18 10:19:00 -05:00
Gazook89
7a609f5a78 set Report Save Issue to open save_issue.yaml template 2022-09-18 10:08:01 -05:00
Gazook89
4c3b9f8fb6 small requested changes 2022-09-17 23:59:25 -05:00
Gazook89
b120c47faa add vertical scroll - auto 2022-09-15 13:38:09 -05:00
Gazook89
49a3057765 clear out some unused properties 2022-09-15 13:33:19 -05:00
Gazook89
fc5d06be0e fixed vertical spacing 2022-09-15 13:19:27 -05:00
Gazook89
bb25d30663 flex working, but odd vertical spacing 2022-09-15 12:29:25 -05:00
Trevor Buckner
d20bb15204 Merge pull request #2370 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.19.1
Bump @babel/preset-env from 7.19.0 to 7.19.1
2022-09-14 23:03:51 -04:00
Trevor Buckner
4261b515e6 Merge pull request #2368 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.19.1
Bump @babel/core from 7.19.0 to 7.19.1
2022-09-14 23:03:43 -04:00
dependabot[bot]
283db495ad Bump @babel/preset-env from 7.19.0 to 7.19.1
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.19.0 to 7.19.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.1/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-15 03:03:36 +00:00
dependabot[bot]
535bb34ed4 Bump @babel/core from 7.19.0 to 7.19.1
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.19.0 to 7.19.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.1/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-15 03:03:35 +00:00
Trevor Buckner
1d4ebf48f2 Merge pull request #2363 from naturalcrit/dependabot/npm_and_yarn/classnames-2.3.2
Bump classnames from 2.3.1 to 2.3.2
2022-09-14 23:03:18 -04:00
Trevor Buckner
f637018b5d Merge pull request #2369 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.19.1
Bump @babel/plugin-transform-runtime from 7.18.10 to 7.19.1
2022-09-14 23:02:58 -04:00
Trevor Buckner
4dfbf8ecaf Merge pull request #2371 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.6.1
Bump mongoose from 6.6.0 to 6.6.1
2022-09-14 23:02:48 -04:00
Trevor Buckner
c3b17a6816 Merge pull request #2355 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.8
Bump eslint-plugin-react from 7.31.7 to 7.31.8
2022-09-14 23:02:37 -04:00
dependabot[bot]
f940a9181a Bump mongoose from 6.6.0 to 6.6.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.6.0 to 6.6.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.6.0...6.6.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-15 03:02:23 +00:00
dependabot[bot]
95a0151234 Bump @babel/plugin-transform-runtime from 7.18.10 to 7.19.1
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.18.10 to 7.19.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.1/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-15 03:01:46 +00:00
Gazook89
3bae1565b2 Add different Issue forms 2022-09-14 21:30:01 -05:00
dependabot[bot]
66cf29e58f Bump classnames from 2.3.1 to 2.3.2
Bumps [classnames](https://github.com/JedWatson/classnames) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/JedWatson/classnames/releases)
- [Changelog](https://github.com/JedWatson/classnames/blob/main/HISTORY.md)
- [Commits](https://github.com/JedWatson/classnames/compare/v2.3.1...v2.3.2)

---
updated-dependencies:
- dependency-name: classnames
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-14 03:01:24 +00:00
Gazook89
9f4920fd2a change overflow-y behavior to fix navbar 2022-09-13 15:55:50 -05:00
dependabot[bot]
2724eb6518 Bump eslint-plugin-react from 7.31.7 to 7.31.8
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.7 to 7.31.8.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.7...v7.31.8)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-13 18:40:08 +00:00
Trevor Buckner
c8742289de Merge pull request #2358 from naturalcrit/dependabot/npm_and_yarn/eslint-8.23.1
Bump eslint from 8.23.0 to 8.23.1
2022-09-13 14:25:01 -04:00
Trevor Buckner
0e40da73f6 Merge pull request #2354 from naturalcrit/dependabot/npm_and_yarn/jest-29.0.3
Bump jest from 29.0.2 to 29.0.3
2022-09-13 14:24:46 -04:00
Trevor Buckner
93b1576de1 Merge pull request #2359 from Gazook89/mongodb-URL-change
Change MongoDB address from localhost to 127.0.0.1
2022-09-13 13:51:02 -04:00
Gazook89
cfdbe06d07 move dir button next to active sort option 2022-09-13 12:26:28 -05:00
Gazook89
46a45a8536 replace sort table with divs and give UI styling 2022-09-13 10:57:28 -05:00
Gazook89
f86ec64714 change localhost to 127.0.0.1
node v16+ better utilizes the address 127.0.01 rather than localhost, at least on MacOS while still working for Windows.
2022-09-13 09:19:34 -05:00
dependabot[bot]
08c7c8b10f Bump eslint from 8.23.0 to 8.23.1
Bumps [eslint](https://github.com/eslint/eslint) from 8.23.0 to 8.23.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.23.0...v8.23.1)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 20:01:09 -07:00
dependabot[bot]
8cd896fbfa Bump jest from 29.0.2 to 29.0.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.0.2 to 29.0.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.0.3/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-12 03:01:21 +00:00
G.Ambatte
abe7d858a8 Merge branch 'master' into showThumbnailOnUserPage-#2331 2022-09-11 12:21:44 +12:00
Trevor Buckner
5e076fc948 Merge pull request #1954 from naturalcrit/SwappableThemes-ReorganizeFolderStructure
Swappable themes
2022-09-09 11:00:57 -04:00
Trevor Buckner
0f566fe912 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-09-09 10:51:08 -04:00
Trevor Buckner
be8abe9dcb Merge pull request #2349 from naturalcrit/Up-Version-to-v3.2.2
Up version to v3.2.2
2022-09-09 10:48:19 -04:00
Trevor Buckner
8efdf61143 Merge pull request #2348 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.6.0
Bump mongoose from 6.5.5 to 6.6.0
2022-09-08 23:50:58 -04:00
Trevor Buckner
c3f885012a Update changelog 2022-09-08 23:19:29 -04:00
Trevor Buckner
969eac4c5a 3.2.2 2022-09-08 23:02:00 -04:00
dependabot[bot]
003b9dcd7f Bump mongoose from 6.5.5 to 6.6.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.5.5 to 6.6.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.5.5...6.6.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-09 03:01:35 +00:00
Trevor Buckner
0bc20112b2 Merge pull request #2345 from jeddai/fix-delete-former-google-brew
update deletion to delete brews when the google brew cannot be found
2022-09-08 22:40:51 -04:00
Trevor Buckner
9e137fa6a8 Merge pull request #2344 from naturalcrit/StyleBrewitemTags
Add Styling to Tags on userpage
2022-09-08 22:40:31 -04:00
Trevor Buckner
1f8701bea6 Merge pull request #2342 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.19.0
Bump @babel/preset-env from 7.18.10 to 7.19.0
2022-09-08 22:39:21 -04:00
Trevor Buckner
313ffab7c1 Merge pull request #2341 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.7
Bump eslint-plugin-react from 7.31.1 to 7.31.7
2022-09-08 22:39:10 -04:00
Trevor Buckner
9f602e416f Merge pull request #2343 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.19.0
Bump @babel/core from 7.18.13 to 7.19.0
2022-09-08 22:38:54 -04:00
Trevor Buckner
de90e2d801 Merge pull request #2347 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.5.5
Bump mongoose from 6.5.4 to 6.5.5
2022-09-08 22:38:37 -04:00
Trevor Buckner
3c12f1133e Tweak console warning 2022-09-08 22:38:00 -04:00
Charlie Humphreys
0625c57824 override next with an empty function 2022-09-08 08:16:49 -05:00
Charlie Humphreys
a234fdbab7 fix getBrew issue 2022-09-08 08:15:55 -05:00
dependabot[bot]
5830ee471b Bump @babel/core from 7.18.13 to 7.19.0
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.13 to 7.19.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.0/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-08 04:06:01 +00:00
dependabot[bot]
c35d97bf69 Bump eslint-plugin-react from 7.31.1 to 7.31.7
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.1 to 7.31.7.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.1...v7.31.7)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-08 04:05:48 +00:00
dependabot[bot]
6c3a9370dc Bump mongoose from 6.5.4 to 6.5.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.5.4 to 6.5.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.5.4...6.5.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-08 04:05:29 +00:00
dependabot[bot]
edb74237bd Bump @babel/preset-env from 7.18.10 to 7.19.0
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.10 to 7.19.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.0/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-08 04:05:20 +00:00
Trevor Buckner
cd8496b62b Merge pull request #2338 from naturalcrit/dependabot/npm_and_yarn/jest-29.0.2
Bump jest from 29.0.1 to 29.0.2
2022-09-08 00:04:23 -04:00
Charlie Humphreys
af1821e697 update deletion to delete brews when the google brew cannot be found 2022-09-06 22:50:51 -05:00
Trevor Buckner
c0a14a5618 remove console.log 2022-09-06 22:57:00 -04:00
Trevor Buckner
8709545f14 Don't display tags that are empty strings. 2022-09-06 22:41:10 -04:00
Trevor Buckner
e0d8846c44 tweaks 2022-09-06 01:00:38 -04:00
Trevor Buckner
cae1bc9f0a Put tags in individual spans 2022-09-05 23:31:23 -04:00
Trevor Buckner
eae5fc9be9 Hide themes behind flag "enable_themes" 2022-09-05 17:05:37 -04:00
Trevor Buckner
c2a5aad1e8 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-09-05 16:13:11 -04:00
dependabot[bot]
2a3aeec459 Bump jest from 29.0.1 to 29.0.2
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.0.1 to 29.0.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.0.2/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-05 13:11:21 +00:00
G.Ambatte
4a89d73f73 Update brewItem.less
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-09-04 16:44:18 +12:00
Trevor Buckner
746e8f8a6a Merge pull request #2329 from G-Ambatte/smartenApostrophe-#2328
[UserPage] Change apostrophe in `usernameWithS`
2022-09-03 23:12:13 -04:00
Trevor Buckner
4f52cc075a Merge pull request #2327 from G-Ambatte/addSortType&DirToLocalStorage-#2326
[UserPage] Add sort type & dir to local storage
2022-09-03 23:11:24 -04:00
Trevor Buckner
8cf8c5cabb Merge branch 'master' into addSortType&DirToLocalStorage-#2326 2022-09-03 23:11:13 -04:00
Trevor Buckner
2f44c35ede Merge pull request #2320 from G-Ambatte/addBrewTagsToFilter-#2319
[UserPage] Add tags to filter
2022-09-03 22:40:08 -04:00
Trevor Buckner
62dee13881 Merge pull request #2324 from naturalcrit/FixNewPageCloning
Fix conflicts on /new
2022-09-03 22:38:59 -04:00
G.Ambatte
3975c74b2b Add thumbnail styling to BrewItem.less 2022-09-04 00:19:26 +12:00
G.Ambatte
0f1c585567 Add thumbnail functionality to BrewItem 2022-09-04 00:19:05 +12:00
G.Ambatte
1fb3ec4057 Add thumbnail to UserPage data 2022-09-04 00:18:08 +12:00
G.Ambatte
85cad49b03 Simplify getSortedBrews logic 2022-09-03 22:28:03 +12:00
G.Ambatte
76203928d2 Change apostrophe 2022-09-03 22:07:23 +12:00
G.Ambatte
cfbc089207 Add sort type & dir to local storage 2022-09-03 21:15:32 +12:00
G.Ambatte
ba693365ec Lint fixes 2022-09-03 20:53:28 +12:00
Trevor Buckner
2c7fdd3993 Remove unused variables from Journal theme 2022-09-03 01:42:38 -04:00
Trevor Buckner
0828a9fe68 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-09-03 01:38:59 -04:00
Trevor Buckner
b4be9bb741 Default brew in getDefaultProps, don't get localstorage when cloning 2022-09-03 01:32:42 -04:00
Trevor Buckner
e5fe6b1fd9 Merge branch 'master' into pr/2320 2022-09-02 23:55:34 -04:00
Trevor Buckner
8d10800cb6 Merge pull request #2318 from G-Ambatte/addTagsToBrewItem-#2317
[UserPage] Add tags to UserPage BrewItem
2022-09-02 23:43:26 -04:00
Trevor Buckner
67099bba40 Merge pull request #2316 from G-Ambatte/addSortTypeAndDirToURL-#2315
[UserPage] Add sort type and dir to URL
2022-09-02 22:46:25 -04:00
Trevor Buckner
d94b274439 Merge branch 'master' into addSortTypeAndDirToURL-#2315 2022-09-02 22:44:43 -04:00
Trevor Buckner
99c2ff15a0 Merge pull request #2300 from G-Ambatte/addUserPageCollapse-#1797
[UserPage] Collapse Brew Groups
2022-09-02 22:33:27 -04:00
G.Ambatte
0b89a895e7 Merge branch 'master' into addSortTypeAndDirToURL-#2315 2022-09-03 13:28:28 +12:00
G.Ambatte
64740ba528 Merge branch 'master' into addBrewTagsToFilter-#2319 2022-09-03 13:28:05 +12:00
G.Ambatte
f35634a295 Merge branch 'master' into addTagsToBrewItem-#2317 2022-09-03 13:27:19 +12:00
G.Ambatte
9807e24e0a Add brewTags class to BrewItem tags 2022-09-03 12:58:45 +12:00
G.Ambatte
de43bd46a5 Merge branch 'master' into addUserPageCollapse-#1797 2022-09-03 12:49:49 +12:00
G.Ambatte
b9f64092b8 Remove unnecessary visible from UserPage 2022-09-03 12:48:04 +12:00
G.Ambatte
3f1bc02885 Reduce duplicate CSS
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-09-03 09:58:17 +12:00
Trevor Buckner
407d3565cd Fix /new page "default" values not being read 2022-09-01 11:05:47 -04:00
G.Ambatte
2fcccfb48f Expand filtering functionality 2022-09-01 23:55:14 +12:00
G.Ambatte
3262751fea Add tags to UserPage BrewItem 2022-09-01 23:25:52 +12:00
G.Ambatte
80428fc412 Expand updateUrl function 2022-09-01 23:03:33 +12:00
G.Ambatte
66626b3427 Remove unnecessary visible from UserPage props 2022-09-01 20:06:30 +12:00
G.Ambatte
fc3a599f90 Merge branch 'addUserPageCollapse-#1797' of https://github.com/G-Ambatte/homebrewery into addUserPageCollapse-#1797 2022-09-01 19:18:04 +12:00
G.Ambatte
e355621bbf Load from local storage working without errors 2022-09-01 19:17:51 +12:00
G.Ambatte
9571cb0cc4 Initial pass at visibility functionality 2022-09-01 19:17:51 +12:00
Trevor Buckner
66a5f51927 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-08-31 23:57:46 -04:00
Trevor Buckner
98e2d57691 Update changelog for v3.2.1 2022-08-31 23:29:38 -04:00
Trevor Buckner
6038b90798 3.2.1 2022-08-31 23:12:36 -04:00
Trevor Buckner
0ca25c06f2 Update Marked-Extended-Tables to V1.0.5 2022-08-31 23:11:55 -04:00
Trevor Buckner
b85b3be1d1 Merge pull request #2291 from naturalcrit/dependabot/npm_and_yarn/jest-29.0.1
Bump jest from 28.1.3 to 29.0.1
2022-08-31 21:57:32 -04:00
Trevor Buckner
78b7e07d09 Merge pull request #2309 from naturalcrit/dependabot/npm_and_yarn/marked-4.1.0
Bump marked from 4.0.19 to 4.1.0
2022-08-31 19:51:54 -04:00
dependabot[bot]
cd3dcfce86 Bump marked from 4.0.19 to 4.1.0
Bumps [marked](https://github.com/markedjs/marked) from 4.0.19 to 4.1.0.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.19...v4.1.0)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-31 15:12:51 +00:00
Trevor Buckner
0a0e57ad38 Merge pull request #2310 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.5.4
Bump mongoose from 6.5.3 to 6.5.4
2022-08-31 11:08:37 -04:00
Trevor Buckner
4c565657a9 Merge pull request #2313 from G-Ambatte/fixMissingSnippetButtons-#2311
[NewPage] Load from local storage in componentDidMount
2022-08-31 08:44:03 -04:00
Trevor Buckner
165a15e106 Update newPage.jsx 2022-08-31 08:43:18 -04:00
G.Ambatte
d27e07b620 Load from local storage in componentDidMount 2022-08-31 08:38:31 -04:00
Trevor Buckner
545ea8342e Merge pull request #2308 from jeddai/fix-new-print-page
add elvis to handle missing metaStorage
2022-08-31 08:26:37 -04:00
Trevor Buckner
0831c68e2d Merge pull request #2305 from G-Ambatte/userPage-removeAutofocus-#2121
[UserPage] Remove autofocus from filter textbox
2022-08-31 08:24:20 -04:00
Trevor Buckner
4ad674040d Merge pull request #2304 from G-Ambatte/userPage-fixSortContainerPosition-#2303
[UserPage] Fix sort container position when scroll bar absent
2022-08-31 08:22:05 -04:00
Trevor Buckner
052fd4132b Merge pull request #2302 from G-Ambatte/userPage-changeRenderer
[UserPage] Change UserPage CSS
2022-08-31 08:19:53 -04:00
dependabot[bot]
6c54c0a960 Bump mongoose from 6.5.3 to 6.5.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.5.3...6.5.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-31 03:02:06 +00:00
Trevor Buckner
17704e5010 Immediately save brew to localstorage upon page load 2022-08-30 22:50:04 -04:00
Charlie Humphreys
59451f47e6 add elvis to handle missing metaStorage 2022-08-30 19:20:32 -05:00
dependabot[bot]
f8ea556ed5 Bump jest from 28.1.3 to 29.0.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.3 to 29.0.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.0.1/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 15:09:18 +00:00
Trevor Buckner
9a60d60b6d Merge pull request #2299 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.1
Bump eslint-plugin-react from 7.31.0 to 7.31.1
2022-08-29 11:06:50 -04:00
dependabot[bot]
4c50f60484 Bump eslint-plugin-react from 7.31.0 to 7.31.1
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.31.0 to 7.31.1.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.31.0...v7.31.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 15:04:30 +00:00
Trevor Buckner
e6d034b163 Merge pull request #2298 from naturalcrit/dependabot/npm_and_yarn/eslint-8.23.0
Bump eslint from 8.22.0 to 8.23.0
2022-08-29 11:03:00 -04:00
G.Ambatte
7034da03ab Remove autofocus from filter textbox 2022-08-29 21:57:31 +12:00
G.Ambatte
289fcc531d Fix sort container position when scroll bar absent 2022-08-29 21:50:38 +12:00
G.Ambatte
4e5f86e8b6 Change UserPage CSS 2022-08-29 21:23:18 +12:00
G.Ambatte
a25c7a5ccd Load from local storage working without errors 2022-08-29 20:39:16 +12:00
dependabot[bot]
1fb0b694f6 Bump eslint from 8.22.0 to 8.23.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.22.0 to 8.23.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.22.0...v8.23.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-29 03:01:18 +00:00
G.Ambatte
f93d46d2b1 Merge branch 'addUserPageCollapse-#1797' of https://github.com/G-Ambatte/homebrewery into addUserPageCollapse-#1797 2022-08-29 10:12:56 +12:00
G.Ambatte
4bb5e96c42 Initial pass at visibility functionality 2022-08-29 10:12:40 +12:00
Trevor Buckner
0811da79c4 Merge pull request #2297 from jeddai/fix-query-params
update WithRoute to handle query params correctly
2022-08-28 15:00:39 -04:00
Charlie Humphreys
17c426cc91 update WithRoute to handle query params correctly 2022-08-28 12:40:56 -05:00
G.Ambatte
4b5b6e3b02 Initial pass at visibility functionality 2022-08-28 23:46:19 +12:00
Trevor Buckner
a383995522 Cleaning up some redundant styles in Journal Theme 2022-08-27 21:20:35 -04:00
Trevor Buckner
eb9d76655e Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-08-27 18:24:35 -04:00
Trevor Buckner
e40dbf7935 Merge pull request #2292 from naturalcrit/v3.2.0
Up version to 3.2.0
2022-08-27 13:28:56 -04:00
Trevor Buckner
2ea853aeda Up version to 3.2.0 2022-08-27 13:28:31 -04:00
Trevor Buckner
215b64f5a6 Merge pull request #2287 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.5.3
Bump mongoose from 6.5.2 to 6.5.3
2022-08-27 13:05:57 -04:00
Trevor Buckner
239526f4ee Merge pull request #2286 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.31.0
Bump eslint-plugin-react from 7.30.1 to 7.31.0
2022-08-27 13:05:49 -04:00
Trevor Buckner
697d4d98bf Merge pull request #2285 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.13
Bump @babel/core from 7.18.10 to 7.18.13
2022-08-27 13:05:37 -04:00
Trevor Buckner
87bc27544b Merge pull request #2290 from naturalcrit/MakeV3Default
Make V3 default setting in /new, and homepage
2022-08-27 13:05:26 -04:00
Trevor Buckner
1bbddacbf3 Merge pull request #2233 from jeddai/document-tags
Document tags
2022-08-27 13:05:09 -04:00
Trevor Buckner
cf2e6aa900 Update notificationPopup.jsx 2022-08-27 13:01:53 -04:00
Charlie Humphreys
6aa9eda5fb update if in stringArrayEditor.jsx componentDidUpdate 2022-08-27 00:52:44 -05:00
Trevor Buckner
3271eae4df Make V3 default setting in /new, and homepage 2022-08-27 01:51:30 -04:00
Charlie Humphreys
5227bbc1d4 add tag length limit, fix tag editing issues 2022-08-26 10:42:34 -05:00
dependabot[bot]
f3cdb0dfc2 Bump mongoose from 6.5.2 to 6.5.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.5.2...6.5.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-25 03:01:34 +00:00
dependabot[bot]
9a6d409800 Bump eslint-plugin-react from 7.30.1 to 7.31.0
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.30.1 to 7.31.0.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.30.1...v7.31.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-25 03:01:07 +00:00
dependabot[bot]
7f343d4634 Bump @babel/core from 7.18.10 to 7.18.13
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.10 to 7.18.13.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.13/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-23 03:01:18 +00:00
Trevor Buckner
ed933bdf92 Merge pull request #2273 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.18.10
Bump @babel/plugin-transform-runtime from 7.18.6 to 7.18.10
2022-08-22 21:34:43 -04:00
Trevor Buckner
1c4dac6a52 Merge pull request #2255 from naturalcrit/dependabot/npm_and_yarn/jest-28.1.3
Bump jest from 28.1.2 to 28.1.3
2022-08-22 21:34:29 -04:00
Trevor Buckner
f734b29a00 Merge pull request #2284 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.19
Bump marked from 4.0.17 to 4.0.19
2022-08-22 21:33:32 -04:00
dependabot[bot]
889fcb84b2 Bump @babel/plugin-transform-runtime from 7.18.6 to 7.18.10
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.18.6 to 7.18.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.10/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-23 01:33:29 +00:00
Trevor Buckner
fa4db2acfa Merge pull request #2279 from naturalcrit/dependabot/npm_and_yarn/eslint-8.22.0
Bump eslint from 8.19.0 to 8.22.0
2022-08-22 21:33:22 -04:00
Trevor Buckner
167e5c87ae Merge pull request #2283 from naturalcrit/dependabot/npm_and_yarn/googleapis-107.0.0
Bump googleapis from 105.0.0 to 107.0.0
2022-08-22 21:33:13 -04:00
Trevor Buckner
42db46fa33 Merge pull request #2276 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.5.2
Bump mongoose from 6.4.4 to 6.5.2
2022-08-22 21:32:51 -04:00
Trevor Buckner
257920d9db Merge pull request #2272 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.18.10
Bump @babel/preset-env from 7.18.6 to 7.18.10
2022-08-22 21:32:08 -04:00
Trevor Buckner
88a09415e5 Merge pull request #2271 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.10
Bump @babel/core from 7.18.6 to 7.18.10
2022-08-22 21:31:56 -04:00
dependabot[bot]
a86f5232cc Bump marked from 4.0.17 to 4.0.19
Bumps [marked](https://github.com/markedjs/marked) from 4.0.17 to 4.0.19.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.17...v4.0.19)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:01:12 +00:00
dependabot[bot]
4fa0d701c9 Bump googleapis from 105.0.0 to 107.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 105.0.0 to 107.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v105.0.0...googleapis-v107.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-22 03:00:49 +00:00
Trevor Buckner
fc20d73520 Journal theme "complete"? 2022-08-21 00:03:29 -04:00
dependabot[bot]
2544563fea Bump eslint from 8.19.0 to 8.22.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.19.0 to 8.22.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.19.0...v8.22.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-15 03:01:04 +00:00
dependabot[bot]
65f943bc21 Bump mongoose from 6.4.4 to 6.5.2
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.4.4 to 6.5.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.4.4...6.5.2)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 03:01:14 +00:00
Trevor Buckner
fd64215298 Make blank theme load by default behind all themes 2022-08-07 00:37:47 -04:00
Trevor Buckner
9d05ee56a3 Further trim Blank theme. Use :where(.page)
where(.page) lowers specificity so styles can be overwritten by the user style tab without needing `.page`
2022-08-07 00:10:14 -04:00
Trevor Buckner
7ff478b542 Make reset.less have lower specificity 2022-08-07 00:08:58 -04:00
Trevor Buckner
aee0337d01 Trim down the "blank" style a lot. 2022-08-06 13:17:01 -04:00
Trevor Buckner
ddcf34c006 Reorder snippets 2022-08-06 12:09:14 -04:00
Charlie Humphreys
ae9eef4fba update location of tags type rewrite 2022-08-05 15:37:22 -05:00
Trevor Buckner
44dbb8f285 Fix merging again. 2022-08-04 22:49:52 -04:00
Trevor Buckner
58edf329f5 Remove basic print snippets from PHB theme 2022-08-04 22:32:04 -04:00
Trevor Buckner
0611c67651 Remove standard tables from PHB snippets 2022-08-04 22:23:28 -04:00
Trevor Buckner
3da2d094a0 Fix merging snippets with base snippets. 2022-08-04 22:20:29 -04:00
dependabot[bot]
539fb8365f Bump @babel/preset-env from 7.18.6 to 7.18.10
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.6 to 7.18.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.10/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-02 03:01:49 +00:00
dependabot[bot]
0e65685b8e Bump @babel/core from 7.18.6 to 7.18.10
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.6 to 7.18.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.10/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-02 03:01:18 +00:00
Trevor Buckner
993bcc2719 Start adding "Blank" theme 2022-07-30 00:28:15 -04:00
Trevor Buckner
947b2f5072 Start adding Journal theme, Add "snippetBase" property 2022-07-23 12:01:34 -04:00
Trevor Buckner
442c5e2d8a Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-07-23 11:39:06 -04:00
dependabot[bot]
a3038868b9 Bump jest from 28.1.2 to 28.1.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.2 to 28.1.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.3/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-14 03:01:19 +00:00
Trevor Buckner
80334a1649 Merge pull request #2252 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.4.4
Bump mongoose from 6.4.2 to 6.4.4
2022-07-08 14:19:16 -04:00
dependabot[bot]
3fe43a1f4d Bump mongoose from 6.4.2 to 6.4.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.4.2 to 6.4.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.4.2...6.4.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-08 17:45:19 +00:00
Trevor Buckner
b257b4c0fc Merge pull request #2251 from naturalcrit/dependabot/npm_and_yarn/moment-2.29.4
Bump moment from 2.29.3 to 2.29.4
2022-07-08 13:44:39 -04:00
dependabot[bot]
10cc040f16 Bump moment from 2.29.3 to 2.29.4
Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-07 03:01:21 +00:00
Trevor Buckner
985f4abb45 Merge pull request #2232 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.30.1
Bump eslint-plugin-react from 7.30.0 to 7.30.1
2022-07-05 20:53:07 -04:00
Trevor Buckner
e20fa09170 Merge pull request #2239 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.18.6
Bump @babel/plugin-transform-runtime from 7.18.5 to 7.18.6
2022-07-05 20:52:59 -04:00
Trevor Buckner
b2a4054561 Merge pull request #2249 from naturalcrit/dependabot/npm_and_yarn/googleapis-105.0.0
Bump googleapis from 104.0.0 to 105.0.0
2022-07-05 20:52:44 -04:00
dependabot[bot]
23e378dcdf Bump googleapis from 104.0.0 to 105.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 104.0.0 to 105.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v104.0.0...googleapis-v105.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 03:01:08 +00:00
dependabot[bot]
6d6c9ab102 Bump @babel/plugin-transform-runtime from 7.18.5 to 7.18.6
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.18.5 to 7.18.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 05:47:05 +00:00
dependabot[bot]
3f191d5b47 Bump eslint-plugin-react from 7.30.0 to 7.30.1
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.30.0 to 7.30.1.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.30.0...v7.30.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 05:46:21 +00:00
Trevor Buckner
5362cc90f4 Merge pull request #2237 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.18.6
Bump @babel/preset-env from 7.18.2 to 7.18.6
2022-07-04 01:46:00 -04:00
Trevor Buckner
66ae4dc67d Merge pull request #2246 from naturalcrit/dependabot/npm_and_yarn/eslint-8.19.0
Bump eslint from 8.18.0 to 8.19.0
2022-07-04 01:45:52 -04:00
Trevor Buckner
7d8890a61a Merge pull request #2247 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.4.2
Bump mongoose from 6.4.1 to 6.4.2
2022-07-04 01:45:45 -04:00
Trevor Buckner
0697673382 Merge pull request #2248 from naturalcrit/dependabot/npm_and_yarn/supertest-6.2.4
Bump supertest from 6.2.3 to 6.2.4
2022-07-04 01:45:38 -04:00
dependabot[bot]
1646fa14e6 Bump supertest from 6.2.3 to 6.2.4
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.2.3 to 6.2.4.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.2.3...v6.2.4)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 03:02:11 +00:00
dependabot[bot]
2f104712ed Bump mongoose from 6.4.1 to 6.4.2
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.4.1...6.4.2)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 03:01:58 +00:00
dependabot[bot]
c23ba26171 Bump eslint from 8.18.0 to 8.19.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.18.0 to 8.19.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.18.0...v8.19.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 03:01:30 +00:00
dependabot[bot]
fa59f8b156 Bump @babel/preset-env from 7.18.2 to 7.18.6
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.2 to 7.18.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-02 14:20:49 +00:00
Trevor Buckner
bc66ad0221 Merge pull request #2238 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.4.1
Bump mongoose from 6.4.0 to 6.4.1
2022-07-02 10:19:31 -04:00
Trevor Buckner
08c52e4bac Merge pull request #2240 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.6
Bump @babel/core from 7.18.5 to 7.18.6
2022-07-02 10:19:13 -04:00
Trevor Buckner
0741066554 Merge pull request #2241 from naturalcrit/dependabot/npm_and_yarn/babel/preset-react-7.18.6
Bump @babel/preset-react from 7.17.12 to 7.18.6
2022-07-02 10:19:05 -04:00
Trevor Buckner
24458ad2af Merge pull request #2242 from naturalcrit/dependabot/npm_and_yarn/jest-28.1.2
Bump jest from 28.1.1 to 28.1.2
2022-07-02 10:18:57 -04:00
dependabot[bot]
e38975177f Bump jest from 28.1.1 to 28.1.2
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.1 to 28.1.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.2/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-30 03:01:28 +00:00
dependabot[bot]
abebe1b3a0 Bump @babel/preset-react from 7.17.12 to 7.18.6
Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.17.12 to 7.18.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-preset-react)

---
updated-dependencies:
- dependency-name: "@babel/preset-react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 03:02:41 +00:00
dependabot[bot]
ae8942d989 Bump @babel/core from 7.18.5 to 7.18.6
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.5 to 7.18.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.6/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 03:02:03 +00:00
dependabot[bot]
3cded29729 Bump mongoose from 6.4.0 to 6.4.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.4.0 to 6.4.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.4.0...6.4.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 03:01:32 +00:00
Charlie Humphreys
c7cfa86205 remove migration in favor of as-edited approach 2022-06-25 00:43:47 -05:00
Charlie Humphreys
8ee832e633 add MIGRATE environment variable 2022-06-25 00:00:41 -05:00
Charlie Humphreys
c7d5d6800b add close button for string array edit input, update styles 2022-06-24 23:48:32 -05:00
Charlie Humphreys
e963672b65 update tag setup to be based on the latest version of the stringArrayEditor.jsx 2022-06-24 23:31:20 -05:00
Charlie Humphreys
1965218e74 Merge branch 'master' into document-tags
# Conflicts:
#	client/homebrew/editor/metadataEditor/metadataEditor.jsx
#	server/homebrew.api.js
2022-06-24 22:55:35 -05:00
Trevor Buckner
3649099d00 Merge pull request #2229 from naturalcrit/dependabot/npm_and_yarn/googleapis-104.0.0
Bump googleapis from 103.0.0 to 104.0.0
2022-06-22 00:24:28 -04:00
Trevor Buckner
5d7a46abfe Merge pull request #2228 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.6
Bump codemirror from 5.65.5 to 5.65.6
2022-06-22 00:24:14 -04:00
dependabot[bot]
209f0ec32a Bump codemirror from 5.65.5 to 5.65.6
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.5 to 5.65.6.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/codemirror5/blob/5.65.6/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.5...5.65.6)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-22 04:21:42 +00:00
dependabot[bot]
b336a6b6a3 Bump googleapis from 103.0.0 to 104.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 103.0.0 to 104.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v103.0.0...googleapis-v104.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-22 04:21:26 +00:00
Trevor Buckner
32833459e4 Merge pull request #2230 from naturalcrit/dependabot/npm_and_yarn/shell-quote-1.7.3
Bump shell-quote from 1.7.2 to 1.7.3
2022-06-22 00:20:18 -04:00
dependabot[bot]
0e450f724b Bump shell-quote from 1.7.2 to 1.7.3
Bumps [shell-quote](https://github.com/substack/node-shell-quote) from 1.7.2 to 1.7.3.
- [Release notes](https://github.com/substack/node-shell-quote/releases)
- [Changelog](https://github.com/substack/node-shell-quote/blob/master/CHANGELOG.md)
- [Commits](https://github.com/substack/node-shell-quote/compare/v1.7.2...1.7.3)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-22 04:18:40 +00:00
Trevor Buckner
5f5ff0023b Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-06-21 16:07:00 -04:00
Trevor Buckner
1e1a3d891a Change let to const 2022-06-21 15:59:28 -04:00
Trevor Buckner
2e27e9f8f6 Update styles/snippets to match current master 2022-06-21 15:53:24 -04:00
Trevor Buckner
c4ee39461e Merge pull request #2223 from jlgraves/master
Implements issue #2215 - spell-casting ability
2022-06-21 15:40:54 -04:00
Trevor Buckner
586ff67fa0 Small tweaks 2022-06-21 15:38:20 -04:00
jlgraves
dbbc529a57 Merge branch 'master' into master 2022-06-20 15:34:00 -07:00
jlgraves
a4c80f2bbf added review changes requested
- correctly centred the legacy snippet
- fixed a couple small typos in both files
2022-06-20 15:33:51 -07:00
Trevor Buckner
a76715d2b3 Merge pull request #2224 from jeddai/update-react-router-dom
react-router-dom 5->6 upgrade
2022-06-20 17:27:19 -04:00
Trevor Buckner
9073435ff3 Update package-lock.json 2022-06-20 17:26:52 -04:00
Trevor Buckner
802e798492 Merge branch 'master' into update-react-router-dom 2022-06-20 17:24:59 -04:00
Charlie Humphreys
c0405fae08 add catch-all route 2022-06-20 13:19:43 -05:00
Charlie Humphreys
755b9dcc89 update based on feedback, remove query-string dependency, add/move favicon url 2022-06-20 12:53:26 -05:00
Trevor Buckner
038d0c5b68 Merge pull request #1699 from naturalcrit/v3ClassTableTweaks
Allow wide classTables to bleed into top margin
2022-06-20 11:36:38 -04:00
Trevor Buckner
5ac65245b7 Merge pull request #2226 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.4.0
Bump mongoose from 6.3.8 to 6.4.0
2022-06-19 23:12:53 -04:00
Trevor Buckner
06cbcb047b Merge pull request #2225 from naturalcrit/dependabot/npm_and_yarn/eslint-8.18.0
Bump eslint from 8.17.0 to 8.18.0
2022-06-19 23:12:45 -04:00
dependabot[bot]
60811a3295 Bump mongoose from 6.3.8 to 6.4.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.8 to 6.4.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.8...6.4.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-20 03:01:19 +00:00
dependabot[bot]
5ca2899b54 Bump eslint from 8.17.0 to 8.18.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.17.0 to 8.18.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.17.0...v8.18.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-20 03:00:52 +00:00
Charlie Humphreys
60a372de68 update react-router-dom to 6.3.0, add WithRoute function component wrapper 2022-06-18 16:20:51 -05:00
jlgraves
01c16b4a1c Updating legacy class feature
Separated into two commits - one for new, one for legacy
2022-06-18 12:26:07 -07:00
jlgraves
2ebfd19169 Adding in spell-casting ability
Re issue #2215 added spellcasting ability modifier
2022-06-18 11:30:35 -07:00
Trevor Buckner
f7d8c6434f Small tweaks 2022-06-16 22:41:04 -04:00
Trevor Buckner
936fdff871 Update CSS, Shrink vertical border margins slightly 2022-06-16 22:13:52 -04:00
Trevor Buckner
da3460f3bf Merge branch 'master' into v3ClassTableTweaks 2022-06-16 22:08:01 -04:00
Trevor Buckner
8ea58d22ba Merge pull request #2218 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.5
Bump @babel/core from 7.18.2 to 7.18.5
2022-06-16 15:31:18 -04:00
dependabot[bot]
4f9ac9cad0 Bump @babel/core from 7.18.2 to 7.18.5
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.2 to 7.18.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.5/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-16 03:47:29 +00:00
Trevor Buckner
7dafd3ee77 Merge pull request #2217 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.17
Bump marked from 4.0.16 to 4.0.17
2022-06-15 23:47:06 -04:00
Trevor Buckner
4e403dd0e9 Merge pull request #2220 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.18.5
Bump @babel/plugin-transform-runtime from 7.18.2 to 7.18.5
2022-06-15 23:46:46 -04:00
dependabot[bot]
530d1bee8d Bump marked from 4.0.16 to 4.0.17
Bumps [marked](https://github.com/markedjs/marked) from 4.0.16 to 4.0.17.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.16...v4.0.17)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-16 03:45:26 +00:00
Trevor Buckner
e8c7bcfee9 Merge pull request #2219 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.8
Bump mongoose from 6.3.6 to 6.3.8
2022-06-15 23:44:14 -04:00
Trevor Buckner
6ed12f41f9 Merge pull request #2222 from naturalcrit/dependabot/npm_and_yarn/googleapis-103.0.0
Bump googleapis from 101.0.0 to 103.0.0
2022-06-15 23:44:07 -04:00
dependabot[bot]
a754959a7d Bump googleapis from 101.0.0 to 103.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 101.0.0 to 103.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v101.0.0...googleapis-v103.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-16 03:01:32 +00:00
dependabot[bot]
d0334c69a2 Bump @babel/plugin-transform-runtime from 7.18.2 to 7.18.5
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.18.2 to 7.18.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.5/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-14 03:02:23 +00:00
dependabot[bot]
2063d12c42 Bump mongoose from 6.3.6 to 6.3.8
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.6 to 6.3.8.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.6...6.3.8)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-14 03:02:02 +00:00
Trevor Buckner
5601b932c8 Fix Clone to New broken with #2114 2022-06-09 01:09:18 -04:00
Trevor Buckner
204b379fcb Merge pull request #2114 from jeddai/google-document-stubs
Google Drive document stubs
2022-06-09 00:37:49 -04:00
Trevor Buckner
5f7abe2a8f Merge branch 'master' into pr/2114 2022-06-09 00:33:44 -04:00
Trevor Buckner
385a22f199 Merge pull request #2214 from naturalcrit/3.1.1
v3.1.1
2022-06-09 00:27:51 -04:00
Trevor Buckner
1045867d73 Up version to 3.1.1 2022-06-09 00:26:22 -04:00
Trevor Buckner
0061e44339 3.1.1 2022-06-09 00:11:57 -04:00
Trevor Buckner
29eb2fe39e Merge pull request #2211 from naturalcrit/FixOverlappingDecorations
Fix Overlapping ClassTable Decorations
2022-06-09 00:09:35 -04:00
Trevor Buckner
f9af27b159 Merge pull request #2208 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.6
Bump mongoose from 6.3.5 to 6.3.6
2022-06-09 00:05:29 -04:00
Trevor Buckner
86f0abbfd1 Merge pull request #2209 from naturalcrit/dependabot/npm_and_yarn/googleapis-101.0.0
Bump googleapis from 100.0.0 to 101.0.0
2022-06-09 00:05:18 -04:00
Trevor Buckner
e2a46c4883 Merge pull request #2210 from naturalcrit/dependabot/npm_and_yarn/jest-28.1.1
Bump jest from 28.1.0 to 28.1.1
2022-06-09 00:04:43 -04:00
Trevor Buckner
389bcf1bbd Use z-index instead of translateZ 2022-06-08 00:44:58 -04:00
dependabot[bot]
b3ccbc183d Bump jest from 28.1.0 to 28.1.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.0 to 28.1.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.1/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-08 03:02:34 +00:00
dependabot[bot]
362cb4f728 Bump googleapis from 100.0.0 to 101.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 100.0.0 to 101.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v100.0.0...googleapis-v101.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-08 03:01:43 +00:00
dependabot[bot]
7bc2e5a71e Bump mongoose from 6.3.5 to 6.3.6
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.5 to 6.3.6.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.5...6.3.6)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-08 03:00:49 +00:00
Charlie Humphreys
890fbcc250 Merge branch 'master' into google-document-stubs 2022-06-06 15:04:24 +00:00
Charlie Humphreys
18ce232be9 Merge branch 'google-document-stubs' of https://github.com/jeddai/homebrewery into google-document-stubs 2022-06-06 15:01:10 +00:00
Charlie Humphreys
92b3f8252e fix data reuse and add field to projection 2022-06-06 14:59:40 +00:00
Trevor Buckner
b1066a1df5 Merge pull request #2206 from naturalcrit/v3.1.0
Up version to 3.1.0
2022-06-06 00:45:12 -04:00
Trevor Buckner
111ade7719 Merge pull request #2205 from naturalcrit/dependabot/npm_and_yarn/eslint-8.17.0
Bump eslint from 8.16.0 to 8.17.0
2022-06-06 00:44:59 -04:00
Trevor Buckner
a60b8f9acc Up version to 3.1.0 2022-06-06 00:44:29 -04:00
Trevor Buckner
8b55e55277 Merge pull request #2162 from G-Ambatte/fixBrewJump
Brew & Source Navigation
2022-06-06 00:20:58 -04:00
dependabot[bot]
4b57745275 Bump eslint from 8.16.0 to 8.17.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.16.0 to 8.17.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.16.0...v8.17.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-06 03:01:42 +00:00
G.Ambatte
4f69b1e7e0 Remove unused toTop function 2022-06-05 11:13:35 +12:00
G.Ambatte
2ac9c190a9 Remove commented out shortcut keys 2022-06-05 11:11:58 +12:00
G.Ambatte
d04df9aeb0 Remove redundant isStyle check 2022-06-05 10:10:59 +12:00
G.Ambatte
6bc5edd33f Remove unnecessary isMeta check 2022-06-05 10:03:03 +12:00
G.Ambatte
6c8cdffd8f Fix typo 2022-06-04 19:52:41 +12:00
G.Ambatte
ae6ad1eaff Prune unnecessary styles 2022-06-04 18:40:05 +12:00
G.Ambatte
ee3c521094 Change throttle options 2022-06-04 18:35:22 +12:00
G.Ambatte
ff2268871d Throttle brew move function 2022-06-04 17:54:35 +12:00
G.Ambatte
1d0cceda04 Eliminate unnecessary window.frames calls 2022-06-04 17:09:25 +12:00
G.Ambatte
4e8cbf621b Add brew bounce animation 2022-06-04 16:38:32 +12:00
Trevor Buckner
c9a182f1e2 Add Tooltips to arrow buttons 2022-06-03 15:38:26 -04:00
Trevor Buckner
df41b58441 Smooth scroll editor Panel, and flash target line 2022-06-03 13:32:04 -04:00
Trevor Buckner
bd681dffae Fix scrollpastend not working
Since the `require('codemirror/addon/scroll/scrollpastend.js');` line is inside of an `if()` block, it doesn't get compiled in the same way. We have to specify it in the `libs` array of our build script so our bundler can allow it to be loaded dynamically.
2022-06-02 23:24:41 -04:00
Trevor Buckner
f21d79d4e0 Merge pull request #2200 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.5
Bump mongoose from 6.3.4 to 6.3.5
2022-06-02 12:15:34 -04:00
Trevor Buckner
87db57239c Merge pull request #2199 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.5
Bump codemirror from 5.65.4 to 5.65.5
2022-06-02 12:15:25 -04:00
G.Ambatte
0dbe84a91a Update style 2022-06-02 14:09:41 +12:00
G.Ambatte
e9adc4de82 Highlight target line during moveSource 2022-06-02 13:50:37 +12:00
G.Ambatte
0c0d817cc2 Add scrollPastEnd to CodeMirror 2022-06-02 13:49:27 +12:00
dependabot[bot]
6c307856e1 Bump mongoose from 6.3.4 to 6.3.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.4 to 6.3.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.4...6.3.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-31 03:01:45 +00:00
dependabot[bot]
24248c2dc6 Bump codemirror from 5.65.4 to 5.65.5
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.4 to 5.65.5.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.4...5.65.5)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-31 03:01:02 +00:00
Trevor Buckner
fe374f7de0 Merge pull request #2187 from naturalcrit/dependabot/npm_and_yarn/eslint-8.16.0
Bump eslint from 8.15.0 to 8.16.0
2022-05-29 11:59:22 -04:00
Trevor Buckner
3e9ecc2b34 Merge pull request #2194 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.18.2
Bump @babel/plugin-transform-runtime from 7.18.0 to 7.18.2
2022-05-29 11:59:09 -04:00
dependabot[bot]
bce9cc2586 Bump eslint from 8.15.0 to 8.16.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.15.0 to 8.16.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.15.0...v8.16.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-29 15:58:06 +00:00
dependabot[bot]
7de747b264 Bump @babel/plugin-transform-runtime from 7.18.0 to 7.18.2
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.18.0 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-29 15:58:02 +00:00
Trevor Buckner
d14466f1d3 Merge pull request #2193 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.2
Bump @babel/core from 7.18.0 to 7.18.2
2022-05-29 11:57:24 -04:00
Trevor Buckner
97a0a17149 Merge pull request #2192 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.18.2
Bump @babel/preset-env from 7.18.0 to 7.18.2
2022-05-29 11:57:15 -04:00
G.Ambatte
bb1fba27c2 Set a default userSetDividerPos 2022-05-29 16:26:30 +12:00
G.Ambatte
eff2ec20b2 Fall back to current divider position on resizing 2022-05-29 16:19:58 +12:00
G.Ambatte
4cc3dd93e2 Move state change to handleViewChange 2022-05-29 16:16:48 +12:00
G.Ambatte
ab8dd8ae76 Merge branch 'master' into fixBrewJump 2022-05-29 16:00:41 +12:00
G.Ambatte
08db2e8492 Hide divider arrows when not required 2022-05-29 15:49:37 +12:00
G.Ambatte
7b2486e411 Use RegEx for text.split 2022-05-29 15:31:57 +12:00
G.Ambatte
03bcbee1fc Apply suggested regex
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-29 15:27:02 +12:00
G.Ambatte
4e5daf583a Remove from snippet bar 2022-05-29 15:24:02 +12:00
G.Ambatte
eca39369de Initial pass at split pane button functionality 2022-05-29 15:18:35 +12:00
Trevor Buckner
45950cb8b4 Merge branch 'google-document-stubs' of https://github.com/jeddai/homebrewery into pr/2114 2022-05-28 23:10:53 -04:00
Trevor Buckner
f1f82abdb4 Merge branch 'master' into pr/2114 2022-05-28 23:10:14 -04:00
Trevor Buckner
69ea9a8f94 Merge pull request #2197 from naturalcrit/FixPublishedPropNotFetched
Fetch `published` prop for brew on user page
2022-05-28 22:59:10 -04:00
Trevor Buckner
7eaec80d96 Fetch published prop for brew on user page 2022-05-28 22:57:31 -04:00
G.Ambatte
3ccd1ebb7b Merge branch 'master' into fixBrewJump 2022-05-29 14:17:11 +12:00
G.Ambatte
db5e4fc36c Fix button position with default divider position 2022-05-29 13:49:08 +12:00
G.Ambatte
160cfcce4d Change for line consistency when moving to page 1 2022-05-29 13:48:36 +12:00
Trevor Buckner
ca8bd448a2 Merge pull request #2196 from naturalcrit/Remove-Duplicate-Column-Break-for-Chrome-102
Remove `break-before: column`
2022-05-27 21:22:40 -04:00
Trevor Buckner
fdaf56b91a Remove break-before: column 2022-05-27 21:19:16 -04:00
Charlie Humphreys
bade09c24c linting 2022-05-26 04:46:07 +00:00
Charlie Humphreys
b54b7e317e pre-filter brews list when finding google brews 2022-05-26 04:45:50 +00:00
Charlie Humphreys
627c52e845 Add comments and adjust google brew for loop 2022-05-26 04:40:33 +00:00
dependabot[bot]
53367579f4 Bump @babel/core from 7.18.0 to 7.18.2
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.18.0 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-26 03:33:29 +00:00
dependabot[bot]
9ebe5fa989 Bump @babel/preset-env from 7.18.0 to 7.18.2
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.18.0 to 7.18.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.2/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-26 03:32:33 +00:00
Charlie Humphreys
55c91217ab fix deletion, update urls 2022-05-25 03:03:43 +00:00
G.Ambatte
3f852ccff3 Merge branch 'master' into fixBrewJump 2022-05-23 07:59:06 +12:00
Charlie Humphreys
7691e4d24e Merge branch 'master' into google-document-stubs 2022-05-22 00:40:57 +00:00
Trevor Buckner
46853a121c Merge pull request #2183 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.18.0
Bump @babel/plugin-transform-runtime from 7.17.12 to 7.18.0
2022-05-21 18:15:41 -04:00
Trevor Buckner
757ba04d67 Merge pull request #2186 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.4
Bump codemirror from 5.65.3 to 5.65.4
2022-05-21 18:15:33 -04:00
dependabot[bot]
fb40817826 Bump codemirror from 5.65.3 to 5.65.4
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.3 to 5.65.4.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.3...5.65.4)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-20 20:46:15 +00:00
dependabot[bot]
7ca6d362f3 Bump @babel/plugin-transform-runtime from 7.17.12 to 7.18.0
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.17.12 to 7.18.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.0/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-20 20:45:04 +00:00
Trevor Buckner
7e124641e7 Merge pull request #2184 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.18.0
Bump @babel/preset-env from 7.17.12 to 7.18.0
2022-05-20 16:43:33 -04:00
Trevor Buckner
d68c306c95 Merge pull request #2182 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.4
Bump mongoose from 6.3.3 to 6.3.4
2022-05-20 16:43:15 -04:00
Trevor Buckner
2e5cfaea1f Merge pull request #2181 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.18.0
Bump @babel/core from 7.17.12 to 7.18.0
2022-05-20 16:43:07 -04:00
dependabot[bot]
87c9650f17 Bump @babel/preset-env from 7.17.12 to 7.18.0
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.17.12 to 7.18.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.0/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-20 03:02:11 +00:00
dependabot[bot]
fbf02c3393 Bump mongoose from 6.3.3 to 6.3.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.3 to 6.3.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.3...6.3.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-20 03:01:26 +00:00
dependabot[bot]
f5ca950b0b Bump @babel/core from 7.17.12 to 7.18.0
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.12 to 7.18.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.0/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-20 03:01:10 +00:00
Trevor Buckner
aea9b55a01 Merge pull request #2179 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.30.0
Bump eslint-plugin-react from 7.29.4 to 7.30.0
2022-05-19 11:06:20 -04:00
dependabot[bot]
dc8c1c359d Bump eslint-plugin-react from 7.29.4 to 7.30.0
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.29.4 to 7.30.0.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.29.4...v7.30.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-19 03:01:14 +00:00
Trevor Buckner
c1d8c8f341 Merge pull request #2176 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.17.12
Bump @babel/preset-env from 7.17.10 to 7.17.12
2022-05-18 16:28:47 -04:00
Trevor Buckner
ec07feee80 Merge pull request #2178 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.16
Bump marked from 4.0.14 to 4.0.16
2022-05-18 16:28:37 -04:00
Trevor Buckner
9ff5818a0d Remove redundant helper files for DMG snippets 2022-05-18 16:25:44 -04:00
Trevor Buckner
59d267dff8 Remove redundant snippets from DMG theme 2022-05-18 16:23:01 -04:00
Trevor Buckner
8153bf7952 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-05-18 16:21:20 -04:00
dependabot[bot]
52835a5bbd Bump @babel/preset-env from 7.17.10 to 7.17.12
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.17.10 to 7.17.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 20:20:22 +00:00
Trevor Buckner
18d5d96ddb Merge pull request #2174 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.17.12
Bump @babel/plugin-transform-runtime from 7.17.10 to 7.17.12
2022-05-18 16:18:55 -04:00
dependabot[bot]
1323a433d2 Bump marked from 4.0.14 to 4.0.16
Bumps [marked](https://github.com/markedjs/marked) from 4.0.14 to 4.0.16.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.14...v4.0.16)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 20:18:02 +00:00
Trevor Buckner
4aad03074c Merge pull request #2177 from naturalcrit/dependabot/npm_and_yarn/express-static-gzip-2.1.7
Bump express-static-gzip from 2.1.5 to 2.1.7
2022-05-18 16:17:57 -04:00
dependabot[bot]
cadf0efbd8 Bump @babel/plugin-transform-runtime from 7.17.10 to 7.17.12
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.17.10 to 7.17.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 20:17:38 +00:00
Trevor Buckner
53e7c78141 Merge pull request #2173 from naturalcrit/dependabot/npm_and_yarn/babel/preset-react-7.17.12
Bump @babel/preset-react from 7.16.7 to 7.17.12
2022-05-18 16:16:23 -04:00
Trevor Buckner
57687c83e6 Merge pull request #2172 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.12
Bump @babel/core from 7.17.10 to 7.17.12
2022-05-18 16:16:14 -04:00
Trevor Buckner
d7fb137263 Merge pull request #2170 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.3
Bump mongoose from 6.3.1 to 6.3.3
2022-05-18 16:16:06 -04:00
Trevor Buckner
2493442e3f Merge pull request #2168 from naturalcrit/dependabot/npm_and_yarn/jest-28.1.0
Bump jest from 28.0.3 to 28.1.0
2022-05-18 16:15:56 -04:00
dependabot[bot]
353a438849 Bump jest from 28.0.3 to 28.1.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.0.3 to 28.1.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.0/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 16:24:25 +00:00
dependabot[bot]
37a4d8edca Bump mongoose from 6.3.1 to 6.3.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.1 to 6.3.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.1...6.3.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 16:22:58 +00:00
Trevor Buckner
79dff10240 Merge pull request #2167 from naturalcrit/dependabot/npm_and_yarn/eslint-8.15.0
Bump eslint from 8.14.0 to 8.15.0
2022-05-18 12:22:01 -04:00
Trevor Buckner
d7c62b2d38 Merge pull request #2165 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.3.4
Bump nanoid from 3.3.3 to 3.3.4
2022-05-18 12:20:48 -04:00
Trevor Buckner
7200889d8c Restore recent snippet changes from after this PR 2022-05-17 23:42:15 -04:00
dependabot[bot]
5f073932ec Bump express-static-gzip from 2.1.5 to 2.1.7
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.5 to 2.1.7.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.5...v2.1.7)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-18 03:00:43 +00:00
Trevor Buckner
253db8304a Make dropdown close on clickoutside, not mouseout
Accomplished by adding an onClick event listener to the whole document and then closing if the click was not inside the dropdown.
2022-05-16 23:07:38 -04:00
dependabot[bot]
63d0d9447f Bump @babel/preset-react from 7.16.7 to 7.17.12
Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.16.7 to 7.17.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-preset-react)

---
updated-dependencies:
- dependency-name: "@babel/preset-react"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-17 03:01:18 +00:00
dependabot[bot]
fbd772ecef Bump @babel/core from 7.17.10 to 7.17.12
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.10 to 7.17.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.12/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-17 03:00:48 +00:00
Trevor Buckner
a17a9ac0a0 lint 2022-05-16 01:41:31 -04:00
Trevor Buckner
4f6555b522 Merge snippets between theme and basetheme
- Current theme has preference over the base theme
- Snippets with the same name are overwritten by the current theme.
- If the overwritten snippet has no `gen` property (or `gen` is falsy), it will remove the base Theme snippet.
- Snippets not overwritten will carry over from base Theme
- New snippets will be added on to base Theme
2022-05-16 01:40:40 -04:00
Trevor Buckner
4167026ca7 Point to new theme location for user page 2022-05-16 00:01:34 -04:00
Trevor Buckner
ef7b8f1ba4 Themes work on Print page 2022-05-15 23:48:23 -04:00
Trevor Buckner
ec57b209b6 Themes work on Share page 2022-05-15 23:36:07 -04:00
Trevor Buckner
1e64ca04d8 BaseTheme is a separate file; not duplicated inside child theme 2022-05-15 23:08:44 -04:00
Trevor Buckner
1f82dbe8ee Make DMG style use CSS variables 2022-05-15 22:45:59 -04:00
Charlie Humphreys
452aa1feaf lint 2022-05-14 04:19:54 +00:00
Charlie Humphreys
74d22a05d0 swap transferToGoogle to saveToGoogle in a spot I missed 2022-05-14 04:19:36 +00:00
Charlie Humphreys
ac905ddf3f add comments, update query params, adjust code based on feedback 2022-05-14 04:17:39 +00:00
Charlie Humphreys
ff885dc6c2 Merge branch 'master' into google-document-stubs 2022-05-11 23:35:31 -05:00
Charlie Humphreys
01441e0610 adjust code based on feedback 2022-05-11 23:34:48 -05:00
G.Ambatte
80fa48e592 Remove redundant variable
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-11 15:48:03 +12:00
G.Ambatte
9f7ee39b09 Use BoundingRect.bottom to determine page 2022-05-11 10:46:49 +12:00
G.Ambatte
412ac5f331 Change to getBoundingClientRect().bottom 2022-05-09 23:39:04 +12:00
G.Ambatte
7c0e702ead Remove a loop from sourceJump 2022-05-09 23:20:16 +12:00
G.Ambatte
02c8bf7292 Change to smooth scrolling from auto 2022-05-09 22:21:00 +12:00
G.Ambatte
b26ff9eb00 Shift to getBoundingClientRect().height 2022-05-09 22:20:35 +12:00
G.Ambatte
be0b1abe41 Adjust \page check for renderer 2022-05-09 20:57:43 +12:00
G.Ambatte
3c36b7f328 Limit Style tab source jumping 2022-05-09 20:23:39 +12:00
G.Ambatte
3d9704a392 Fix typo
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-09 19:47:04 +12:00
dependabot[bot]
d798cb1407 Bump eslint from 8.14.0 to 8.15.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.14.0 to 8.15.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.14.0...v8.15.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-09 03:08:22 +00:00
dependabot[bot]
ac6af3cbcc Bump nanoid from 3.3.3 to 3.3.4
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.3 to 3.3.4.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.3...3.3.4)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-04 03:00:53 +00:00
G.Ambatte
e84f68aa15 Minor styling adjustments 2022-05-04 07:54:15 +12:00
G.Ambatte
af3a403971 Add moveBrew and moveSource function calls 2022-05-03 22:33:05 +12:00
G.Ambatte
7034f1d2d5 Add sourceJump function 2022-05-03 22:32:30 +12:00
G.Ambatte
4f154922c0 Update client/homebrew/pages/accountPage/accountPage.jsx
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-03 22:30:08 +12:00
G.Ambatte
2b1fe5d3fe Update client/homebrew/pages/accountPage/accountPage.jsx
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-03 22:29:53 +12:00
G.Ambatte
03402e4342 Add Google icon
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-05-03 22:29:33 +12:00
G.Ambatte
a56601196d Add divider buttons 2022-05-03 17:24:58 +12:00
G.Ambatte
451f06ca74 Fix getCurrentPage 2022-05-03 17:24:37 +12:00
G.Ambatte
f202e45e49 Shift to [].includes 2022-05-03 13:48:19 +12:00
G.Ambatte
010309b04f Add toTop button to SnippetBar 2022-05-03 13:36:27 +12:00
G.Ambatte
f6db66b28c Add brewJump and sourceJump functions 2022-05-03 13:36:03 +12:00
G.Ambatte
cde611eed5 Add ID to iFrame 2022-05-03 11:50:04 +12:00
G.Ambatte
1d85eede43 Account information added 2022-05-03 11:38:24 +12:00
G.Ambatte
61f4456842 Styling updates. 2022-05-01 12:58:10 +12:00
G.Ambatte
c925e04f3c Remove unused require 2022-05-01 12:41:10 +12:00
G.Ambatte
00412a70e9 Remove test UI page, add initial Account page 2022-05-01 12:39:19 +12:00
G.Ambatte
0923c50218 Update UI page styling 2022-05-01 12:38:20 +12:00
G.Ambatte
fe536bc9df Initial pass at UI page and styling 2022-04-30 16:54:11 +12:00
G.Ambatte
e8937a285c Add UI route for testing 2022-04-30 16:53:30 +12:00
Trevor Buckner
b9f2517696 Merge pull request #2159 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.17.10
Bump @babel/preset-env from 7.16.11 to 7.17.10
2022-04-29 16:40:11 -04:00
Trevor Buckner
5709a15f52 Merge pull request #2157 from naturalcrit/dependabot/npm_and_yarn/express-4.18.1
Bump express from 4.17.3 to 4.18.1
2022-04-29 16:40:02 -04:00
Trevor Buckner
27d1f6daa6 Merge pull request #2160 from naturalcrit/dependabot/npm_and_yarn/jest-28.0.3
Bump jest from 27.5.1 to 28.0.3
2022-04-29 16:39:53 -04:00
dependabot[bot]
ef6f8b4433 Bump @babel/preset-env from 7.16.11 to 7.17.10
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.11 to 7.17.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.10/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-29 20:38:34 +00:00
dependabot[bot]
d1e8223843 Bump jest from 27.5.1 to 28.0.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 27.5.1 to 28.0.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.0.3/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-29 20:37:28 +00:00
Trevor Buckner
85e28c201f Merge pull request #2158 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.17.10
Bump @babel/plugin-transform-runtime from 7.17.0 to 7.17.10
2022-04-29 16:37:27 -04:00
dependabot[bot]
e4a429180d Bump @babel/plugin-transform-runtime from 7.17.0 to 7.17.10
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.17.0 to 7.17.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.10/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-29 20:36:20 +00:00
dependabot[bot]
4b953bc264 Bump express from 4.17.3 to 4.18.1
Bumps [express](https://github.com/expressjs/express) from 4.17.3 to 4.18.1.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.3...4.18.1)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-29 20:35:45 +00:00
Trevor Buckner
e28aaf4fd1 Merge pull request #2156 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.10
Bump @babel/core from 7.17.9 to 7.17.10
2022-04-29 16:34:51 -04:00
Trevor Buckner
e54f3c46b7 Merge pull request #2153 from naturalcrit/dependabot/npm_and_yarn/supertest-6.2.3
Bump supertest from 6.2.2 to 6.2.3
2022-04-29 16:31:08 -04:00
dependabot[bot]
9a62393df1 Bump @babel/core from 7.17.9 to 7.17.10
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.9 to 7.17.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.10/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-29 20:30:36 +00:00
Trevor Buckner
8f8b32e873 Merge pull request #2142 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.1
Bump mongoose from 6.3.0 to 6.3.1
2022-04-29 16:29:56 -04:00
Trevor Buckner
4465ecd372 Merge pull request #2154 from G-Ambatte/fixUserPageBrews-#2147
Add fields to Mongoose brew query
2022-04-29 16:25:28 -04:00
G.Ambatte
b059bf68b5 Revert change to select method 2022-04-29 10:53:03 +12:00
G.Ambatte
c46c4a9320 Switch to use select method 2022-04-28 20:19:01 +12:00
G.Ambatte
cffe08b785 Add fields to Mongoose query 2022-04-28 11:09:32 +12:00
dependabot[bot]
bac8b53984 Bump supertest from 6.2.2 to 6.2.3
Bumps [supertest](https://github.com/visionmedia/supertest) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/visionmedia/supertest/releases)
- [Commits](https://github.com/visionmedia/supertest/compare/v6.2.2...v6.2.3)

---
updated-dependencies:
- dependency-name: supertest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-27 03:02:24 +00:00
dependabot[bot]
ee10b10c2d Bump mongoose from 6.3.0 to 6.3.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.3.0 to 6.3.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.3.0...6.3.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 12:53:03 +00:00
Trevor Buckner
3fb4c5bdd9 Merge pull request #2139 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.3.3
Bump nanoid from 3.3.2 to 3.3.3
2022-04-25 08:52:29 -04:00
dependabot[bot]
08ca061af8 Bump nanoid from 3.3.2 to 3.3.3
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.2 to 3.3.3.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.2...3.3.3)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 12:26:01 +00:00
Trevor Buckner
fbb092562d Merge pull request #2140 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.3
Bump codemirror from 5.65.2 to 5.65.3
2022-04-25 08:25:28 -04:00
Trevor Buckner
1e47f896fe Merge pull request #2148 from naturalcrit/dependabot/npm_and_yarn/eslint-8.14.0
Bump eslint from 8.13.0 to 8.14.0
2022-04-25 08:25:12 -04:00
Trevor Buckner
5d5bf9586e Merge pull request #2138 from naturalcrit/dependabot/npm_and_yarn/fs-extra-10.1.0
Bump fs-extra from 10.0.1 to 10.1.0
2022-04-25 08:24:54 -04:00
Trevor Buckner
f836277f4f Merge pull request #2137 from naturalcrit/dependabot/npm_and_yarn/moment-2.29.3
Bump moment from 2.29.2 to 2.29.3
2022-04-25 08:24:45 -04:00
Trevor Buckner
09e1702dd2 Merge pull request #2133 from naturalcrit/dependabot/npm_and_yarn/nconf-0.12.0
Bump nconf from 0.11.4 to 0.12.0
2022-04-25 08:24:37 -04:00
dependabot[bot]
ac18acc2f4 Bump eslint from 8.13.0 to 8.14.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.13.0 to 8.14.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.13.0...v8.14.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 03:17:04 +00:00
dependabot[bot]
3dbc90b3b8 Bump codemirror from 5.65.2 to 5.65.3
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.2 to 5.65.3.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.2...5.65.3)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-21 03:01:13 +00:00
Trevor Buckner
96e704234c Convert LESS variables to CSS variables 2022-04-18 16:32:56 -04:00
Trevor Buckner
407528bd94 Don't embed base64 images
4+MB down to 17kb CSS file.

Images are only ~1.7MB. They were very bloated as base64
2022-04-18 16:32:35 -04:00
Trevor Buckner
5b107d4e62 Remove unneeded console log 2022-04-18 16:31:23 -04:00
dependabot[bot]
504628f59c Bump fs-extra from 10.0.1 to 10.1.0
Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 10.0.1 to 10.1.0.
- [Release notes](https://github.com/jprichardson/node-fs-extra/releases)
- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jprichardson/node-fs-extra/compare/10.0.1...10.1.0)

---
updated-dependencies:
- dependency-name: fs-extra
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-18 03:01:19 +00:00
dependabot[bot]
752430bb59 Bump moment from 2.29.2 to 2.29.3
Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.3.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.3)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-18 03:01:07 +00:00
Trevor Buckner
f71dc004c0 Themes list to use object instead of array. 2022-04-15 17:17:13 -04:00
dependabot[bot]
8e0e1c5946 Bump nconf from 0.11.4 to 0.12.0
Bumps [nconf](https://github.com/flatiron/nconf) from 0.11.4 to 0.12.0.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.11.4...v0.12.0)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-15 16:15:51 +00:00
Trevor Buckner
156abe3b9e Merge pull request #2134 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.3.0
Bump mongoose from 6.2.11 to 6.3.0
2022-04-15 12:14:54 -04:00
Charlie Humphreys
2e145e7ff1 Merge branch 'master' into google-document-stubs 2022-04-15 00:23:51 -05:00
Charlie Humphreys
8a5e9aa1f6 update app to better handle google brew stubs 2022-04-15 00:22:51 -05:00
Charlie Humphreys
e7fe68d20c merge master into google-document-stubs 2022-04-14 23:31:07 -05:00
dependabot[bot]
0393fcd5c4 Bump mongoose from 6.2.11 to 6.3.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.11 to 6.3.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.11...6.3.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-15 03:01:04 +00:00
Trevor Buckner
784c0ec8f8 Merge pull request #2131 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.11
Bump mongoose from 6.2.10 to 6.2.11
2022-04-13 23:56:42 -04:00
Trevor Buckner
e86c24943f Merge pull request #2130 from G-Ambatte/userPublicUrlForLinkGen-#2128
User public url for link gen #2128
2022-04-13 23:56:26 -04:00
Trevor Buckner
2bc3aaf796 Merge pull request #2129 from G-Ambatte/fixMetaTags
Fix meta tags
2022-04-13 23:53:56 -04:00
dependabot[bot]
56d3d38cad Bump mongoose from 6.2.10 to 6.2.11
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.10 to 6.2.11.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.10...6.2.11)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-14 03:01:21 +00:00
G.Ambatte
b2bcc9ef95 Shift to logical OR operator
(cherry picked from commit 0fb0f4b6b0)
2022-04-14 13:59:42 +12:00
G.Ambatte
0fb0f4b6b0 Shift to logical OR operator 2022-04-14 13:58:51 +12:00
G.Ambatte
a73b3648ae Update editPage links to use publicUrl 2022-04-13 19:40:33 +12:00
G.Ambatte
0e25793f0a Add publicUrl to global.config & update template 2022-04-13 19:35:51 +12:00
G.Ambatte
3ad6f1d794 Switch from nullish coalescing operator to ternary operator to correct unexpected behaviour
Change meta type from website to article based on feedback
2022-04-13 17:19:45 +12:00
G.Ambatte
5f734096d6 Merge branch 'naturalcrit:master' into master 2022-04-13 15:23:37 +12:00
Trevor Buckner
7dbac5d848 Merge pull request #2061 from Gazook89/Nodesto-Caps
Add Nodesto font files to 5e, v3
2022-04-12 23:04:41 -04:00
Trevor Buckner
eac4d4ed94 Merge pull request #2052 from G-Ambatte/addLocalLogin-#269
[LOCAL ONLY] Add passwordless login
2022-04-12 23:04:08 -04:00
G.Ambatte
de977b3b94 Make local login route conditional and rename 2022-04-13 14:49:16 +12:00
G.Ambatte
3787cdf11c Update server/app.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 14:39:27 +12:00
G.Ambatte
84bc3d0be2 Update server/app.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 14:37:11 +12:00
G.Ambatte
6fdd415fcb Update server/app.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 14:37:06 +12:00
G.Ambatte
0999125678 Update client/homebrew/navbar/account.navitem.jsx
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 14:30:49 +12:00
G.Ambatte
ad8d5bd8a0 Merge branch 'master' into addLocalLogin-#269 2022-04-13 14:30:02 +12:00
G.Ambatte
5d3fe719b3 Remove errant semicolon
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 14:26:25 +12:00
Trevor Buckner
b11fe0e760 Merge pull request #2080 from G-Ambatte/addMetadata-#820
Add social metadata tags
2022-04-12 22:23:02 -04:00
G.Ambatte
85312859d2 Change props.publicUrl fallback behavior 2022-04-13 14:15:26 +12:00
G.Ambatte
f8086a098b Add publicUrl to default.json 2022-04-13 14:14:09 +12:00
G.Ambatte
811d1347ea Reduce calls to config.get 2022-04-13 12:57:04 +12:00
G.Ambatte
1bdd08f878 Shift JWT generation to app.js 2022-04-13 12:40:16 +12:00
G.Ambatte
0023e87d54 Whitespace fix 2022-04-13 12:37:50 +12:00
G.Ambatte
42878ea99d Merge branch 'master' into addMetadata-#820 2022-04-13 09:13:37 +12:00
G.Ambatte
16ae32b881 Move default URL check to app.js 2022-04-13 09:12:48 +12:00
G.Ambatte
f3ee95f9db Update client/template.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 08:24:33 +12:00
G.Ambatte
af950159e0 Update client/template.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 08:24:25 +12:00
G.Ambatte
46eaad1226 Update client/template.js
Co-authored-by: Trevor Buckner <calculuschild@gmail.com>
2022-04-13 08:24:19 +12:00
G.Ambatte
4600624edf Merge branch 'naturalcrit:master' into master 2022-04-13 08:20:57 +12:00
Trevor Buckner
daa0832740 Merge pull request #2125 from naturalcrit/dependabot/npm_and_yarn/nconf-0.11.4
Bump nconf from 0.11.3 to 0.11.4
2022-04-11 14:23:08 -04:00
Trevor Buckner
c9353c06da Merge pull request #2126 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.14
Bump marked from 4.0.12 to 4.0.14
2022-04-11 14:22:57 -04:00
Trevor Buckner
2a88d143fd Merge pull request #2124 from naturalcrit/dependabot/npm_and_yarn/eslint-8.13.0
Bump eslint from 8.12.0 to 8.13.0
2022-04-11 14:22:46 -04:00
Charlie Humphreys
39d29abb19 update app to list stubbed google docs only once 2022-04-11 12:55:19 -05:00
dependabot[bot]
153802cd5b Bump marked from 4.0.12 to 4.0.14
Bumps [marked](https://github.com/markedjs/marked) from 4.0.12 to 4.0.14.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.12...v4.0.14)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-11 03:01:28 +00:00
dependabot[bot]
b0b39e638a Bump nconf from 0.11.3 to 0.11.4
Bumps [nconf](https://github.com/flatiron/nconf) from 0.11.3 to 0.11.4.
- [Release notes](https://github.com/flatiron/nconf/releases)
- [Changelog](https://github.com/indexzero/nconf/blob/master/CHANGELOG.md)
- [Commits](https://github.com/flatiron/nconf/compare/v0.11.3...v0.11.4)

---
updated-dependencies:
- dependency-name: nconf
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-11 03:01:16 +00:00
dependabot[bot]
39e5f4aaf4 Bump eslint from 8.12.0 to 8.13.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.12.0 to 8.13.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.12.0...v8.13.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-11 03:00:58 +00:00
Trevor Buckner
2860b8d50a Merge pull request #2120 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.9
Bump @babel/core from 7.17.8 to 7.17.9
2022-04-07 09:04:36 -04:00
Trevor Buckner
a9b2e098ac Merge pull request #2118 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.10
Bump mongoose from 6.2.9 to 6.2.10
2022-04-07 09:04:28 -04:00
dependabot[bot]
394171ebb7 Bump @babel/core from 7.17.8 to 7.17.9
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.8 to 7.17.9.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.9/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-07 03:01:31 +00:00
Trevor Buckner
0a05f37774 Merge pull request #2119 from jeddai/google-transfer-api
fix deletion request
2022-04-06 12:18:04 -04:00
Charlie Humphreys
9f69763572 fix deletion request 2022-04-06 11:14:34 -05:00
Charlie Humphreys
4941dbb5bd add exclusions for stub props 2022-04-06 11:11:11 -05:00
dependabot[bot]
9565f1d0ba Bump mongoose from 6.2.9 to 6.2.10
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.9 to 6.2.10.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.9...6.2.10)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 03:01:28 +00:00
Trevor Buckner
172d2a8bd6 Fixed font spacings/corrupted outlines 2022-04-04 15:47:30 -04:00
Trevor Buckner
c70857af6f Merge pull request #2117 from naturalcrit/dependabot/npm_and_yarn/moment-2.29.2
Bump moment from 2.29.1 to 2.29.2
2022-04-04 04:17:03 -04:00
Trevor Buckner
a98b23411c Merge pull request #2116 from naturalcrit/dependabot/npm_and_yarn/body-parser-1.20.0
Bump body-parser from 1.19.2 to 1.20.0
2022-04-04 04:16:34 -04:00
dependabot[bot]
a734a7da25 Bump moment from 2.29.1 to 2.29.2
Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-04 03:00:50 +00:00
dependabot[bot]
6672ec0149 Bump body-parser from 1.19.2 to 1.20.0
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.19.2 to 1.20.0.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.19.2...1.20.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-04 03:00:40 +00:00
Trevor Buckner
ff1f70afa8 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-04-02 13:50:18 -04:00
G.Ambatte
6c7eb339f4 Revert "Initial pass at redirecting / to a landing page"
This reverts commit 468ccd748d.
2022-04-02 10:11:59 +13:00
G.Ambatte
468ccd748d Initial pass at redirecting / to a landing page 2022-04-02 10:10:40 +13:00
Trevor Buckner
613b9c4405 Merge pull request #2101 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.3.2
Bump nanoid from 3.3.1 to 3.3.2
2022-03-31 23:09:59 -04:00
Trevor Buckner
6318b1f84c Merge pull request #2115 from naturalcrit/dependabot/npm_and_yarn/googleapis-100.0.0
Bump googleapis from 99.0.0 to 100.0.0
2022-03-31 23:09:44 -04:00
dependabot[bot]
8800808925 Bump googleapis from 99.0.0 to 100.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 99.0.0 to 100.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v99.0.0...googleapis-v100.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-01 03:01:36 +00:00
Trevor Buckner
12670d4d9b Merge pull request #2090 from G-Ambatte/addQueryToUserPageUrl
Add UserPage filtering to/from URL
2022-03-31 22:24:48 -04:00
Trevor Buckner
41c0b7fef9 Formatting 2022-03-31 22:21:58 -04:00
dependabot[bot]
9a4c7da375 Bump nanoid from 3.3.1 to 3.3.2
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.1...3.3.2)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-01 01:43:02 +00:00
Trevor Buckner
34b4556e5c Merge pull request #2088 from naturalcrit/dependabot/npm_and_yarn/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6
2022-03-31 21:42:47 -04:00
Trevor Buckner
bb935f4727 Merge pull request #2097 from naturalcrit/dependabot/npm_and_yarn/ansi-regex-4.1.1
Bump ansi-regex from 4.1.0 to 4.1.1
2022-03-31 21:42:35 -04:00
Trevor Buckner
2719bb8280 Merge pull request #2096 from naturalcrit/dependabot/npm_and_yarn/eslint-8.12.0
Bump eslint from 8.11.0 to 8.12.0
2022-03-31 21:42:17 -04:00
Trevor Buckner
ebfb0d8fcf Merge pull request #2098 from naturalcrit/dependabot/npm_and_yarn/googleapis-99.0.0
Bump googleapis from 98.0.0 to 99.0.0
2022-03-31 21:42:03 -04:00
Trevor Buckner
8a0d74d323 Merge pull request #2102 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.9
Bump mongoose from 6.2.8 to 6.2.9
2022-03-31 21:41:48 -04:00
Charlie Humphreys
e5021259bb swap usage of delete on possible Mongoose object for setting the value to undefined 2022-03-30 23:34:39 -05:00
Charlie Humphreys
6791df7f75 Merge branch 'master' into google-document-stubs
# Conflicts:
#	server/homebrew.api.js
2022-03-30 23:26:41 -05:00
Charlie Humphreys
fa8d47400f update API and frontend for google drive document stubs 2022-03-30 23:23:45 -05:00
Trevor Buckner
84d0010702 Merge pull request #2111 from jeddai/logout-fix
update logout logic
2022-03-30 12:58:04 -04:00
Charlie Humphreys
e610c12b2a update logout logic 2022-03-30 10:24:25 -05:00
Trevor Buckner
eeef9dcc1b Merge pull request #2105 from jeddai/add-async-handler
add asyncHandler to async methods in routes
2022-03-29 16:43:00 -04:00
Charlie Humphreys
c17db043ba remove extra slash in regex 2022-03-29 11:54:15 -05:00
Charlie Humphreys
89dbd19556 update response handling for saving google brews 2022-03-29 11:46:50 -05:00
Charlie Humphreys
e9cf7be488 add asyncHandler to async methods in routes 2022-03-28 20:43:45 -05:00
dependabot[bot]
48c05081a4 Bump mongoose from 6.2.8 to 6.2.9
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.8 to 6.2.9.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.8...6.2.9)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-28 17:37:06 +00:00
Trevor Buckner
36fcce7f1e Merge pull request #2100 from naturalcrit/v3.0.8
Update version to v3.0.8
2022-03-28 13:35:20 -04:00
Trevor Buckner
6c85d0f35a Update version to v3.0.8 2022-03-27 23:16:37 -04:00
Trevor Buckner
331fcf0714 Merge pull request #2085 from Gazook89/Drop-Cap-Snippet-Update
Unset `:first-line` small-caps rule with *Remove Drop Cap* snippet
2022-03-27 01:14:07 -04:00
Trevor Buckner
0ec9e8932e Merge pull request #2089 from jeddai/google-transfer-api
Update app to use a single endpoint for google and non-google stored brews
2022-03-27 00:54:28 -04:00
Trevor Buckner
67eb7fdbd4 Merge branch 'master' into pr/2089 2022-03-27 00:41:50 -04:00
G.Ambatte
c0b2fb8ed9 Merge branch 'master' into addLocalLogin-#269 2022-03-27 17:15:41 +13:00
G.Ambatte
c8f6dea1e1 Conflict fix for homebrew.jsx 2022-03-27 17:12:15 +13:00
G.Ambatte
a0a02f5375 Merge branch 'master' into addLocalLogin-#269 2022-03-27 17:09:13 +13:00
Trevor Buckner
a1e7da8d84 Merge pull request #2091 from G-Ambatte/fixComponentWillMount
Remove calls to deprecated `componentWillMount`
2022-03-26 23:49:36 -04:00
dependabot[bot]
396a49a16d Bump googleapis from 98.0.0 to 99.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 98.0.0 to 99.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v98.0.0...googleapis-v99.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-27 03:47:37 +00:00
dependabot[bot]
3628fb690a Bump ansi-regex from 4.1.0 to 4.1.1
Bumps [ansi-regex](https://github.com/chalk/ansi-regex) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/chalk/ansi-regex/releases)
- [Commits](https://github.com/chalk/ansi-regex/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: ansi-regex
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-27 03:46:44 +00:00
dependabot[bot]
58428fbcc2 Bump eslint from 8.11.0 to 8.12.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.11.0 to 8.12.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.11.0...v8.12.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-27 03:46:44 +00:00
Trevor Buckner
f53b0ec9af Merge pull request #2094 from G-Ambatte/experimentalCircleCIConfig
Increase test time out and update CircleCI testing configuration
2022-03-26 23:46:08 -04:00
G.Ambatte
b6933406ed Remove test timeout increase 2022-03-26 21:27:48 +13:00
G.Ambatte
57d0e8eea3 Test standard Docker MongoDB image 2022-03-26 21:13:06 +13:00
G.Ambatte
7403ef60c1 Increase test timeout via Jest config 2022-03-26 20:56:04 +13:00
G.Ambatte
42ee461f56 Remove commented out delay 2022-03-26 20:55:50 +13:00
G.Ambatte
47a4c8829c Move publicUrl to local.conf from default.conf 2022-03-25 17:40:53 +13:00
G.Ambatte
4b6fb9f595 Add publicUrl as configuration item 2022-03-25 17:05:35 +13:00
G.Ambatte
77e8952e8a Shift componentWillMount call to getInitialState 2022-03-25 16:40:41 +13:00
G.Ambatte
2be365c839 Shift global declarations to componentDidMount 2022-03-25 16:12:33 +13:00
G.Ambatte
c0c08b3354 Fix new Node image location 2022-03-25 15:08:37 +13:00
G.Ambatte
b0d8462a60 Remove MongoDB from testing, update Node image 2022-03-25 15:06:26 +13:00
G.Ambatte
f246c96b28 Remove 10s delay for diagnostics 2022-03-25 15:00:33 +13:00
G.Ambatte
aa7b3d985f Move test setup to BEFORE delay 2022-03-25 14:50:30 +13:00
G.Ambatte
5ed6e9842c Add 10s delay to route test start 2022-03-25 14:39:14 +13:00
G.Ambatte
eaf8b02aa9 Update circleCi config to use new tests 2022-03-25 14:38:50 +13:00
G.Ambatte
7aa0aed7c9 Add individual tests to package.json 2022-03-25 14:38:19 +13:00
G.Ambatte
17dd738ac1 Shift to history.replaceState 2022-03-25 12:23:01 +13:00
G.Ambatte
32a5e71015 Change verbiage of filter placeholder text 2022-03-25 11:28:30 +13:00
G.Ambatte
1c641e3aff Initial pass at UserPage filtering to/from URL 2022-03-25 11:20:16 +13:00
Charlie Humphreys
562ba42b1b add the transfer if statement back in after erroneously removing it 2022-03-24 13:50:26 -05:00
Charlie Humphreys
c081234021 update package-lock.json 2022-03-24 13:47:57 -05:00
Charlie Humphreys
bba0208361 update based on feedback 2022-03-24 13:46:23 -05:00
Charlie Humphreys
b19efcebb9 update package-lock.json 2022-03-24 08:18:24 -05:00
Charlie Humphreys
4d6ce6b917 Merge branch 'master' into google-transfer-api
# Conflicts:
#	package-lock.json
2022-03-24 08:17:56 -05:00
Charlie Humphreys
92d8027640 update app to use a single endpoint for google and non-google stored brews 2022-03-24 08:13:34 -05:00
dependabot[bot]
9c511a6c64 Bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 04:22:56 +00:00
Trevor Buckner
c9935fa45c Merge pull request #2087 from naturalcrit/dependabot/npm_and_yarn/googleapis-98.0.0
Bump googleapis from 97.0.0 to 98.0.0
2022-03-24 00:08:23 -04:00
dependabot[bot]
a140deae54 Bump googleapis from 97.0.0 to 98.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 97.0.0 to 98.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v97.0.0...googleapis-v98.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 03:03:48 +00:00
Trevor Buckner
9e5cc57441 Merge pull request #2055 from G-Ambatte/addDividerResetOnWindowResize-#2053
Add divider reset on window resize #2053
2022-03-23 21:08:18 -04:00
Trevor Buckner
8bab346cbb Change var names, simplify resize logic, limit on page refresh 2022-03-23 16:21:37 -04:00
Trevor Buckner
0a52cafefe Merge pull request #2050 from lucastucious/Fix-#1749---ToC-linking-in-pdf
Fix #1749 - ToC linking in pdf
2022-03-23 12:48:45 -04:00
Trevor Buckner
83b3fdff21 Merge pull request #2084 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.8
Bump @babel/core from 7.17.7 to 7.17.8
2022-03-23 12:47:45 -04:00
Trevor Buckner
97dfbe9e35 Merge pull request #2086 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.8
Bump mongoose from 6.2.7 to 6.2.8
2022-03-23 12:46:07 -04:00
dependabot[bot]
e4e6b5426e Bump mongoose from 6.2.7 to 6.2.8
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.7 to 6.2.8.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.7...6.2.8)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-23 03:01:23 +00:00
Gazook89
58815a3910 add descriptive css comment 2022-03-21 22:09:45 -05:00
Gazook89
b17f173e03 Unset :first-line small-caps rule with drop-cap 2022-03-21 22:02:44 -05:00
G.Ambatte
9535fea964 Revert change to verbose 2022-03-22 12:03:26 +13:00
G.Ambatte
4134e43f6e Change test to verbose mode 2022-03-22 11:58:19 +13:00
G.Ambatte
274b3bcb7e Add parallelism parameter 2022-03-22 11:34:32 +13:00
G.Ambatte
8800397ba4 Working directory changes 2022-03-22 11:31:26 +13:00
G.Ambatte
0a90218d2a Fix for missing package.json 2022-03-22 11:27:08 +13:00
G.Ambatte
06598e0665 Fix typo 2022-03-22 11:21:51 +13:00
G.Ambatte
03e5d86b73 Add NPM settings 2022-03-22 11:20:49 +13:00
G.Ambatte
8533240407 Add executor to config 2022-03-22 11:18:59 +13:00
G.Ambatte
2753005386 Add orb to CircleCI config 2022-03-22 11:16:16 +13:00
G.Ambatte
9178d061ff Fix config 2022-03-22 11:14:41 +13:00
G.Ambatte
934c77cee9 Test CircleCI config changes 2022-03-22 11:12:52 +13:00
G.Ambatte
0d8ad50e2a Increase home page test timeout (5s -> 30s) 2022-03-22 10:53:33 +13:00
G.Ambatte
2ec2239124 Merge branch 'master' into addDividerResetOnWindowResize-#2053 2022-03-22 10:31:03 +13:00
G.Ambatte
257262e3cc Allow divider to grow back to original position 2022-03-22 10:26:29 +13:00
G.Ambatte
57c5f28938 Merge branch 'master' into addLocalLogin-#269 2022-03-22 09:39:41 +13:00
dependabot[bot]
e85975308f Bump @babel/core from 7.17.7 to 7.17.8
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.7 to 7.17.8.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.8/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-21 03:02:20 +00:00
Trevor Buckner
323ccf3b25 Merge pull request #2082 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.7
Bump mongoose from 6.2.6 to 6.2.7
2022-03-17 13:35:15 -04:00
dependabot[bot]
be892516d5 Bump mongoose from 6.2.6 to 6.2.7
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.6 to 6.2.7.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.6...6.2.7)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-17 03:01:21 +00:00
LUCASTUCIOUS
a6e956472f Fix #1749 - ToC linking in pdf 2022-03-16 11:45:44 +01:00
Trevor Buckner
45969127f5 Merge pull request #2070 from Gazook89/z-index-on-dropdown
add z-index to dropdown container.
2022-03-15 21:42:00 -04:00
Trevor Buckner
392ce35efa Merge pull request #2079 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.7
Bump @babel/core from 7.17.5 to 7.17.7
2022-03-15 21:41:00 -04:00
G.Ambatte
a11e93ef54 Initial pass at social metadata tags 2022-03-15 18:47:46 +13:00
Trevor Buckner
a163e611be Fix Bold Font outlines (union multi-path characters) 2022-03-14 22:23:34 -04:00
dependabot[bot]
ef35991a8c Bump @babel/core from 7.17.5 to 7.17.7
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.5 to 7.17.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.7/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-15 01:26:44 +00:00
Trevor Buckner
1c2992c887 Merge pull request #2073 from naturalcrit/dependabot/npm_and_yarn/eslint-8.11.0
Bump eslint from 8.10.0 to 8.11.0
2022-03-14 21:25:46 -04:00
Trevor Buckner
1eaeebf2fe Merge pull request #2078 from naturalcrit/dependabot/npm_and_yarn/googleapis-97.0.0
Bump googleapis from 96.0.0 to 97.0.0
2022-03-14 21:25:37 -04:00
Trevor Buckner
ffc027a309 Merge pull request #2072 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.6
Bump mongoose from 6.2.5 to 6.2.6
2022-03-14 21:25:25 -04:00
dependabot[bot]
6821d84f9b Bump eslint from 8.10.0 to 8.11.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.10.0 to 8.11.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.10.0...v8.11.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-15 01:03:42 +00:00
dependabot[bot]
dcb25d8a40 Bump googleapis from 96.0.0 to 97.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 96.0.0 to 97.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v96.0.0...googleapis-v97.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-15 01:03:29 +00:00
Trevor Buckner
2f20eeb016 Merge pull request #2074 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.29.4
Bump eslint-plugin-react from 7.29.3 to 7.29.4
2022-03-14 21:02:55 -04:00
dependabot[bot]
98e40e2b49 Bump eslint-plugin-react from 7.29.3 to 7.29.4
Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.29.3 to 7.29.4.
- [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases)
- [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.29.3...v7.29.4)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-14 03:02:12 +00:00
dependabot[bot]
2d10394690 Bump mongoose from 6.2.5 to 6.2.6
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.5 to 6.2.6.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.5...6.2.6)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-14 03:01:17 +00:00
Gazook89
f13c16bb4f add z-index to dropdown container.
also just format spacing on css rules
2022-03-13 20:40:41 -05:00
Trevor Buckner
222ad3e73e Fixed font files. 2022-03-13 03:32:05 -04:00
Trevor Buckner
ebe76aacf3 Merge pull request #2062 from Gazook89/Remove-Reddit-Post-Issue-Title
Remove post title when opening issue on Reddit; add leading questions
2022-03-13 01:52:49 -05:00
Trevor Buckner
b144f0c1d7 Bold text 2022-03-13 01:51:24 -05:00
Trevor Buckner
8ec8b2c66d Merge pull request #2063 from Gazook89/Fix-classTable-Decoration
Set `.classTable.decoration` to display below text
2022-03-13 01:44:40 -05:00
Trevor Buckner
5bb5af2b5e Merge pull request #2064 from Gazook89/Changelog-3.0.6-MacOS-Typo
Small change to 3.0.6 changelog for MacOS
2022-03-13 01:41:03 -05:00
Trevor Buckner
438c7eabdc Merge pull request #2065 from Gazook89/Small-Changes-to-Theme-Swapper
Small changes to theme swapper
2022-03-13 01:40:38 -05:00
Trevor Buckner
e12579a2a2 Restore original image size, shift position to not cover text 2022-03-13 01:38:48 -05:00
Trevor Buckner
2229686057 Merge pull request #2066 from craigelloyd/doc-fixes
Fixed typos and some grammar things in README.md
2022-03-13 00:31:54 -05:00
craigelloyd
1a419f7e28 Fixed typos and some grammar things in README.md 2022-03-12 20:09:19 -08:00
Gazook89
a6ede58d8e set dropdown items to appear *over* subsequent items
change navdropdown items to position:absolute; so they appear *over* the next metadata items, rather than pushing them down when dropdown is open.
2022-03-11 23:16:08 -06:00
Gazook89
3a82e2a24b fix *suppdorted* typo 2022-03-11 23:11:27 -06:00
Gazook89
28d45b89e0 set mask-image blends to fixed points
fixed blend points allows for different sized metadata panel without inadvertently masking text.
2022-03-11 23:10:50 -06:00
Gazook89
b8973d63c0 Small change to search/replace update
add correct instruction for MacOS
2022-03-10 22:20:43 -06:00
Gazook89
b1932dc8e4 Utilize dedent in URL paremeters 2022-03-10 22:08:19 -06:00
Gazook89
de54bd4817 add z-index and position to .decoration 2022-03-10 21:56:49 -06:00
Gazook89
424bc9fa6e remove post title. add post text 2022-03-10 21:42:00 -06:00
Gazook89
5d5d0633ab Add Nodesto font files to 5e, v3. Update fonts.less 2022-03-10 21:12:20 -06:00
Trevor Buckner
9282bdc09d Merge pull request #2056 from G-Ambatte/addDividerResetOnLogout-#2054
Reset divider position on log out
2022-03-10 19:46:51 -05:00
Trevor Buckner
2cb34c6535 Merge pull request #2060 from naturalcrit/dependabot/npm_and_yarn/googleapis-96.0.0
Bump googleapis from 95.0.0 to 96.0.0
2022-03-10 19:45:42 -05:00
Trevor Buckner
5329f21896 Merge pull request #2059 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.5
Bump mongoose from 6.2.4 to 6.2.5
2022-03-10 14:34:45 -05:00
dependabot[bot]
6d73f2eb9f Bump googleapis from 95.0.0 to 96.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 95.0.0 to 96.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v95.0.0...googleapis-v96.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-10 03:01:57 +00:00
dependabot[bot]
52a777aae6 Bump mongoose from 6.2.4 to 6.2.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.4 to 6.2.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.4...6.2.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-10 03:01:28 +00:00
G.Ambatte
e44bbae07a Use percentage based positioning, not reset 2022-03-09 17:55:24 +13:00
G.Ambatte
f8abca6053 Formatting change - space out functions correctly 2022-03-09 16:45:21 +13:00
G.Ambatte
156e697042 Initial pass: reset divider position on log out 2022-03-09 14:17:12 +13:00
G.Ambatte
39d338e5bf Reset position in local storage on divider reset 2022-03-09 13:19:07 +13:00
G.Ambatte
8fb25646bd Initial pass: reset pane width on browser resize 2022-03-09 13:13:03 +13:00
G.Ambatte
535291a91a Add local_environments to configuration files
Add `local` parameter to global `config` object to avoid repeating tests
JWT key `secret` only added to global object `config` when local installation detected
2022-03-07 14:14:32 +13:00
G.Ambatte
7c2663fa56 Add passwordless login for local installs 2022-03-07 13:26:54 +13:00
Trevor Buckner
04cd53397a Merge pull request #2051 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.29.3
Bump eslint-plugin-react from 7.29.2 to 7.29.3
2022-03-04 22:49:39 -05:00
dependabot[bot]
c16588578b Bump eslint-plugin-react from 7.29.2 to 7.29.3
Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.29.2 to 7.29.3.
- [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases)
- [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.29.2...v7.29.3)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-04 03:01:08 +00:00
Trevor Buckner
fc000af68c Merge pull request #2044 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.29.2
Bump eslint-plugin-react from 7.28.0 to 7.29.2
2022-03-01 15:02:32 -05:00
dependabot[bot]
b3414b23ce Bump eslint-plugin-react from 7.28.0 to 7.29.2
Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.28.0 to 7.29.2.
- [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases)
- [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.28.0...v7.29.2)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-01 18:11:20 +00:00
Trevor Buckner
3143c4e51c Merge pull request #2046 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.4
Bump mongoose from 6.2.3 to 6.2.4
2022-03-01 13:10:13 -05:00
Trevor Buckner
bf7d43768b Merge pull request #2045 from naturalcrit/dependabot/npm_and_yarn/eslint-8.10.0
Bump eslint from 8.9.0 to 8.10.0
2022-03-01 13:09:55 -05:00
Trevor Buckner
01087ca302 Add preview texture to dropdown options 2022-03-01 11:21:13 -05:00
Trevor Buckner
297365407b Fixed comment showing up on page 2022-03-01 09:30:56 -05:00
Trevor Buckner
8e0629062d Fully disable theme selection when in Legacy mode
Making Legacy a "theme" implies we will add more themes to Legacy, which we aren't planning to.
2022-03-01 00:34:19 -05:00
dependabot[bot]
ea5a96f87f Bump mongoose from 6.2.3 to 6.2.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.3 to 6.2.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.3...6.2.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-01 03:01:01 +00:00
dependabot[bot]
50f7dec026 Bump eslint from 8.9.0 to 8.10.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.9.0 to 8.10.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.9.0...v8.10.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-28 03:01:33 +00:00
Trevor Buckner
98de9f1d7f Merge pull request #2042 from naturalcrit/dependabot/npm_and_yarn/fs-extra-10.0.1
Bump fs-extra from 10.0.0 to 10.0.1
2022-02-22 23:46:05 -05:00
Trevor Buckner
4dc3d5dcf7 Merge pull request #2041 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.3
Bump mongoose from 6.2.2 to 6.2.3
2022-02-22 23:45:54 -05:00
Trevor Buckner
49566756cd Merge pull request #2040 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.2
Bump codemirror from 5.65.1 to 5.65.2
2022-02-22 23:45:42 -05:00
dependabot[bot]
5de89949b3 Bump fs-extra from 10.0.0 to 10.0.1
Bumps [fs-extra](https://github.com/jprichardson/node-fs-extra) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/jprichardson/node-fs-extra/releases)
- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jprichardson/node-fs-extra/compare/10.0.0...10.0.1)

---
updated-dependencies:
- dependency-name: fs-extra
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-23 03:01:22 +00:00
dependabot[bot]
7b49f66ab7 Bump mongoose from 6.2.2 to 6.2.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.2...6.2.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-22 03:01:28 +00:00
dependabot[bot]
412193f1d7 Bump codemirror from 5.65.1 to 5.65.2
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.1 to 5.65.2.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.1...5.65.2)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-22 03:00:55 +00:00
Trevor Buckner
4c52c1b188 Merge pull request #2035 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.5
Bump @babel/core from 7.17.4 to 7.17.5
2022-02-18 17:12:54 -05:00
dependabot[bot]
66152c52ca Bump @babel/core from 7.17.4 to 7.17.5
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.4 to 7.17.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.5/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-18 03:00:52 +00:00
Trevor Buckner
ca7b758dd4 Merge pull request #2026 from jeddai/google-service-auth
Update Google interactions to prefer the service account where viable
2022-02-16 23:17:25 -05:00
Charlie Humphreys
8ea2780a44 add log line to explain what to do when the service account cannot be found 2022-02-16 22:03:01 -06:00
Trevor Buckner
a679c615ed Merge pull request #2015 from G-Ambatte/addLogout-#303
Add logout button
2022-02-16 22:52:45 -05:00
Charlie Humphreys
7cc7bd4786 update readFileMetadata to be getGoogleBrew 2022-02-16 21:51:14 -06:00
Trevor Buckner
99761f0a93 Merge pull request #2032 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.3.1
Bump nanoid from 3.3.0 to 3.3.1
2022-02-16 22:19:14 -05:00
Trevor Buckner
b87f57cd25 Merge pull request #2031 from naturalcrit/dependabot/npm_and_yarn/express-4.17.3
Bump express from 4.17.2 to 4.17.3
2022-02-16 22:19:04 -05:00
Trevor Buckner
14ff9aeae5 Merge pull request #2028 from naturalcrit/dependabot/npm_and_yarn/express-static-gzip-2.1.5
Bump express-static-gzip from 2.1.4 to 2.1.5
2022-02-16 22:18:56 -05:00
dependabot[bot]
6ce37db3dc Bump express from 4.17.2 to 4.17.3
Bumps [express](https://github.com/expressjs/express) from 4.17.2 to 4.17.3.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.2...4.17.3)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-17 03:17:36 +00:00
dependabot[bot]
90dcbdfd02 Bump nanoid from 3.3.0 to 3.3.1
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.0...3.3.1)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-17 03:16:56 +00:00
Trevor Buckner
ba7976c5c6 Merge pull request #2030 from naturalcrit/dependabot/npm_and_yarn/body-parser-1.19.2
Bump body-parser from 1.19.1 to 1.19.2
2022-02-16 22:16:29 -05:00
Trevor Buckner
6520d3fd76 Merge pull request #2033 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.2
Bump mongoose from 6.2.1 to 6.2.2
2022-02-16 22:15:27 -05:00
Trevor Buckner
aafe9724d4 Merge pull request #2027 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.4
Bump @babel/core from 7.17.2 to 7.17.4
2022-02-16 22:14:41 -05:00
dependabot[bot]
72207f9222 Bump mongoose from 6.2.1 to 6.2.2
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.1...6.2.2)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-17 03:01:39 +00:00
dependabot[bot]
f1be8c88f2 Bump body-parser from 1.19.1 to 1.19.2
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.19.1 to 1.19.2.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.19.1...1.19.2)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-17 03:00:44 +00:00
Charlie Humphreys
927345b131 update app, googleActions, and homebrew api based on PR feedback 2022-02-16 16:53:34 -06:00
dependabot[bot]
bb68421474 Bump express-static-gzip from 2.1.4 to 2.1.5
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.4 to 2.1.5.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.4...v2.1.5)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-16 03:01:27 +00:00
dependabot[bot]
7699e1e79a Bump @babel/core from 7.17.2 to 7.17.4
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.2 to 7.17.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.4/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-16 03:01:15 +00:00
Charlie Humphreys
59d08a7414 update googleActions and related files to use service-level auth where viable 2022-02-14 22:21:58 -06:00
Trevor Buckner
41c2d2a3d7 Merge pull request #2025 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.3.0
Bump nanoid from 3.2.0 to 3.3.0
2022-02-14 23:14:08 -05:00
dependabot[bot]
0c0be58e65 Bump nanoid from 3.2.0 to 3.3.0
Bumps [nanoid](https://github.com/ai/nanoid) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.2.0...3.3.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-15 03:00:49 +00:00
Trevor Buckner
42afbd3e70 Merge pull request #2024 from naturalcrit/dependabot/npm_and_yarn/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7
2022-02-14 10:00:14 -05:00
dependabot[bot]
da9c0712a8 Bump path-parse from 1.0.6 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 14:57:34 +00:00
Trevor Buckner
143d0f294a Merge pull request #2022 from naturalcrit/dependabot/npm_and_yarn/express-static-gzip-2.1.4
Bump express-static-gzip from 2.1.3 to 2.1.4
2022-02-14 09:57:06 -05:00
Trevor Buckner
e197ab7bc3 Merge pull request #2021 from naturalcrit/dependabot/npm_and_yarn/eslint-8.9.0
Bump eslint from 8.8.0 to 8.9.0
2022-02-14 09:56:56 -05:00
dependabot[bot]
d3bb075c47 Bump express-static-gzip from 2.1.3 to 2.1.4
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.3 to 2.1.4.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.3...v2.1.4)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 03:01:20 +00:00
dependabot[bot]
afeb797c78 Bump eslint from 8.8.0 to 8.9.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.8.0 to 8.9.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.8.0...v8.9.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 03:00:58 +00:00
Trevor Buckner
da5ce35c3c Make themes work on /new 2022-02-11 00:32:05 -05:00
Trevor Buckner
96d9d323d1 Fix merge 2022-02-10 23:42:05 -05:00
Trevor Buckner
dd0112f749 Update to Master 2022-02-10 23:38:33 -05:00
Trevor Buckner
d35c5c2719 Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-02-10 23:36:41 -05:00
Trevor Buckner
9ab14a9fd8 Merge pull request #2018 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.2
Bump @babel/core from 7.17.0 to 7.17.2
2022-02-09 08:34:39 -05:00
Trevor Buckner
55a5546f25 Merge pull request #2017 from naturalcrit/dependabot/npm_and_yarn/jest-27.5.1
Bump jest from 27.5.0 to 27.5.1
2022-02-09 08:34:30 -05:00
dependabot[bot]
938f0a028b Bump @babel/core from 7.17.0 to 7.17.2
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.17.0 to 7.17.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.2/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-09 03:01:54 +00:00
dependabot[bot]
c2b9a19c12 Bump jest from 27.5.0 to 27.5.1
Bumps [jest](https://github.com/facebook/jest) from 27.5.0 to 27.5.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v27.5.0...v27.5.1)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-09 03:01:42 +00:00
Trevor Buckner
29c32f03ae Merge pull request #2013 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.1
Bump mongoose from 6.2.0 to 6.2.1
2022-02-08 11:08:30 -05:00
Trevor Buckner
950e03e321 Merge pull request #2014 from naturalcrit/dependabot/npm_and_yarn/express-static-gzip-2.1.3
Bump express-static-gzip from 2.1.2 to 2.1.3
2022-02-08 11:08:21 -05:00
G.Ambatte
a1876f16da Change icon for Brews page 2022-02-08 18:19:17 +13:00
G.Ambatte
c4b0dd5aa6 Initial pass of Account dropdown + LogOut 2022-02-08 18:05:02 +13:00
dependabot[bot]
fa60258edc Bump express-static-gzip from 2.1.2 to 2.1.3
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.2...v2.1.3)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-08 03:00:59 +00:00
dependabot[bot]
6846d5c6f0 Bump mongoose from 6.2.0 to 6.2.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.2.0 to 6.2.1.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.2.0...6.2.1)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-08 03:00:44 +00:00
Trevor Buckner
30867960ce Merge pull request #2007 from naturalcrit/TweakUserpageBrewItemStyle
Make brewItems stand out a bit.
2022-02-07 12:43:08 -05:00
Trevor Buckner
ee201ae6d8 Merge pull request #2011 from naturalcrit/dependabot/npm_and_yarn/query-string-7.1.1
Bump query-string from 7.1.0 to 7.1.1
2022-02-06 23:19:40 -05:00
Trevor Buckner
6e5b4ca6e0 Merge pull request #2010 from naturalcrit/dependabot/npm_and_yarn/jest-27.5.0
Bump jest from 27.4.7 to 27.5.0
2022-02-06 23:19:25 -05:00
Trevor Buckner
cbc3c36dc3 Merge pull request #2009 from naturalcrit/dependabot/npm_and_yarn/googleapis-95.0.0
Bump googleapis from 94.0.0 to 95.0.0
2022-02-06 23:19:15 -05:00
Trevor Buckner
9675b1cf0b Merge pull request #2008 from naturalcrit/dependabot/npm_and_yarn/express-static-gzip-2.1.2
Bump express-static-gzip from 2.1.1 to 2.1.2
2022-02-06 23:19:03 -05:00
dependabot[bot]
31967428ca Bump query-string from 7.1.0 to 7.1.1
Bumps [query-string](https://github.com/sindresorhus/query-string) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/sindresorhus/query-string/releases)
- [Commits](https://github.com/sindresorhus/query-string/compare/v7.1.0...v7.1.1)

---
updated-dependencies:
- dependency-name: query-string
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 03:02:31 +00:00
dependabot[bot]
9f60fe49ab Bump jest from 27.4.7 to 27.5.0
Bumps [jest](https://github.com/facebook/jest) from 27.4.7 to 27.5.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v27.4.7...v27.5.0)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 03:02:21 +00:00
dependabot[bot]
d51340649b Bump googleapis from 94.0.0 to 95.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 94.0.0 to 95.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v94.0.0...googleapis-v95.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 03:01:39 +00:00
dependabot[bot]
6907ec3a2e Bump express-static-gzip from 2.1.1 to 2.1.2
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.1...v2.1.2)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-07 03:01:03 +00:00
Trevor Buckner
30b1aef8ba Make brewItems stand out a bit. 2022-02-06 18:54:09 -05:00
Trevor Buckner
e1bbd76208 Merge pull request #1799 from G-Ambatte/createBasePages
Create Base Page structure - ListPage
2022-02-06 18:07:05 -05:00
Trevor Buckner
d38bf3b450 Clean up. 2022-02-06 17:17:59 -05:00
Trevor Buckner
63e1849854 Merge branch 'master' into pr/1799 2022-02-06 15:31:24 -05:00
G.Ambatte
0b7fee0cc5 Add displayName properties 2022-02-05 19:10:18 +13:00
G.Ambatte
402301f201 Restore BrewItem action classNames 2022-02-05 19:04:53 +13:00
G.Ambatte
c41141fe10 Add missing Help navItem file 2022-02-05 17:32:34 +13:00
G.Ambatte
eccf5e15b1 Change ReportIssue navItem to Help navItem 2022-02-05 17:29:41 +13:00
G.Ambatte
6299e87569 Filtering now functional on ListPage 2022-02-05 17:14:41 +13:00
G.Ambatte
0611db1bdf Move Nav items to UserPage 2022-02-05 17:01:52 +13:00
G.Ambatte
660004e348 Remove UserPage BrewItem files 2022-02-05 15:19:12 +13:00
Trevor Buckner
ac5ce90eba Merge pull request #2005 from jeddai/update-icon-links
remove text under social links, adjust spacing
2022-02-03 23:11:16 -05:00
Trevor Buckner
0a41e7a4af Make "Discord of Many Things" a link in homepage 2022-02-03 23:07:04 -05:00
Trevor Buckner
5170b991b4 Move v3 icons to end of page 2022-02-03 21:43:42 -05:00
Charlie Humphreys
cd27933f98 add width:auto to div 2022-02-03 11:37:32 -06:00
Charlie Humphreys
6985f69caa update height to use style syntax 2022-02-03 10:09:20 -06:00
Charlie Humphreys
aaf36a29a7 remove text under social links, adjust spacing 2022-02-03 09:56:45 -06:00
Trevor Buckner
790420b320 Merge pull request #2004 from naturalcrit/v3.0.7
Update to Version 3.0.7
2022-02-02 23:07:27 -05:00
Trevor Buckner
2f011ebb24 Merge pull request #2002 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.17.0
Bump @babel/core from 7.16.12 to 7.17.0
2022-02-02 23:07:08 -05:00
Trevor Buckner
191adf0a7c Update to Version 3.0.7 2022-02-02 23:05:32 -05:00
dependabot[bot]
2ab95d908b Bump @babel/core from 7.16.12 to 7.17.0
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.16.12 to 7.17.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.0/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-03 03:06:17 +00:00
Trevor Buckner
62f505f982 Merge pull request #2003 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.17.0
Bump @babel/plugin-transform-runtime from 7.16.10 to 7.17.0
2022-02-02 22:05:37 -05:00
Trevor Buckner
eaafce0517 Merge pull request #2001 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.2.0
Bump mongoose from 6.1.10 to 6.2.0
2022-02-02 22:05:22 -05:00
dependabot[bot]
10f529c6b6 Bump @babel/plugin-transform-runtime from 7.16.10 to 7.17.0
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.10 to 7.17.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.17.0/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-03 03:01:47 +00:00
dependabot[bot]
8424e51592 Bump mongoose from 6.1.10 to 6.2.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.10 to 6.2.0.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.10...6.2.0)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-03 03:01:09 +00:00
Trevor Buckner
45e391b273 Merge pull request #2000 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.10
Bump mongoose from 6.1.9 to 6.1.10
2022-02-02 09:21:59 -05:00
Trevor Buckner
78e042cb9a Remove unused functions in userPage.jsx 2022-02-01 22:40:06 -05:00
dependabot[bot]
0c41fdee6f Bump mongoose from 6.1.9 to 6.1.10
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.9 to 6.1.10.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.9...6.1.10)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-02 03:01:14 +00:00
Trevor Buckner
11bbf1b8fa Merge pull request #1999 from naturalcrit/dependabot/npm_and_yarn/googleapis-94.0.0
Bump googleapis from 92.0.0 to 94.0.0
2022-02-01 00:08:10 -05:00
Trevor Buckner
f89f686097 Merge pull request #1998 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.9
Bump mongoose from 6.1.8 to 6.1.9
2022-02-01 00:07:58 -05:00
Trevor Buckner
d93e4c7458 Merge pull request #1897 from jeddai/migration-guide
Legacy -> v3 Migration guide
2022-02-01 00:05:01 -05:00
Trevor Buckner
6bf4fc6cf8 Help dropdown uses existing dropdown class. Small tweaks. 2022-02-01 00:02:46 -05:00
dependabot[bot]
35a8f7dd98 Bump googleapis from 92.0.0 to 94.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 92.0.0 to 94.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v92.0.0...googleapis-v94.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 03:01:35 +00:00
dependabot[bot]
d0ec8ba22f Bump mongoose from 6.1.8 to 6.1.9
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.8 to 6.1.9.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.8...6.1.9)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 03:01:08 +00:00
Charlie Humphreys
57d3db5322 Merge branch 'master' into migration-guide
# Conflicts:
#	server/app.js
2022-01-31 17:13:36 -06:00
Trevor Buckner
e43ee7ddba Merge pull request #1997 from naturalcrit/dependabot/npm_and_yarn/eslint-8.8.0
Bump eslint from 8.7.0 to 8.8.0
2022-01-31 11:20:14 -05:00
dependabot[bot]
7a7bffab24 Bump eslint from 8.7.0 to 8.8.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.7.0 to 8.8.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.7.0...v8.8.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-31 03:00:57 +00:00
Trevor Buckner
1001e57249 Merge pull request #1981 from AlexeySachkov/private/asachkov/refactor-config-initialization
[NFC] Outline config creation into a separate module
2022-01-30 16:30:21 -05:00
Trevor Buckner
ccbeca2cad Move process.chdir up so it occurs before config.js is ever called.
app.js should be required before config to make sure process.cwd is updated first
2022-01-30 00:13:35 -05:00
Trevor Buckner
d7aa4afa60 process.chdir in app.js.
Everything works, no need for path.resolve. All tests pass.
2022-01-29 23:53:30 -05:00
Trevor Buckner
e4c2ce6a8c Merge branch 'private/asachkov/refactor-config-initialization' of https://github.com/AlexeySachkov/homebrewery into pr/1981 2022-01-29 21:36:10 -05:00
Trevor Buckner
de115c5113 Merge branch 'master' into pr/1981 2022-01-29 21:34:38 -05:00
Alexey Sachkov
4e0ab4b393 Adjust paths to config files 2022-01-28 21:40:40 +03:00
Trevor Buckner
050bc472d0 Merge pull request #1990 from naturalcrit/dependabot/npm_and_yarn/cached-path-relative-1.1.0
Bump cached-path-relative from 1.0.2 to 1.1.0
2022-01-28 11:52:19 -05:00
Trevor Buckner
48da1da5ee Merge pull request #1946 from naturalcrit/dependabot/npm_and_yarn/prop-types-15.8.1
Bump prop-types from 15.8.0 to 15.8.1
2022-01-28 11:51:52 -05:00
Trevor Buckner
1b5f408bef Merge pull request #1989 from naturalcrit/dependabot/npm_and_yarn/node-fetch-2.6.7
Bump node-fetch from 2.6.1 to 2.6.7
2022-01-28 11:51:37 -05:00
dependabot[bot]
b1869a33f9 Bump prop-types from 15.8.0 to 15.8.1
Bumps [prop-types](https://github.com/facebook/prop-types) from 15.8.0 to 15.8.1.
- [Release notes](https://github.com/facebook/prop-types/releases)
- [Changelog](https://github.com/facebook/prop-types/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/prop-types/compare/v15.8.0...v15.8.1)

---
updated-dependencies:
- dependency-name: prop-types
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-28 16:50:48 +00:00
Trevor Buckner
bb07cdaa9f Merge pull request #1992 from naturalcrit/RemovePropTypes
Remove prop-types dependency
2022-01-28 11:49:16 -05:00
Trevor Buckner
db0e4fcc0c Remove prop-types dependency 2022-01-28 11:47:24 -05:00
Trevor Buckner
ba8a2af87d Merge pull request #1929 from jeddai/links-in-home-document
Add discord, github, and reddit links to home page document
2022-01-28 10:29:26 -05:00
Trevor Buckner
85e7071d6c Merge pull request #1991 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.12
Bump marked from 4.0.11 to 4.0.12
2022-01-28 10:27:28 -05:00
Trevor Buckner
ece6df023a Restore custom CSS styling on v3 preview 2022-01-28 09:59:29 -05:00
Trevor Buckner
4c08f4a6e1 Condense v3_preview to fit on two pages again. 2022-01-28 09:44:43 -05:00
Trevor Buckner
039e4dd4e5 Revert extraneous Config changes
Looks like these were part of something else? In any case it conflicts with #1981 so just undoing these changes.
2022-01-28 00:38:00 -05:00
dependabot[bot]
041abf1220 Bump marked from 4.0.11 to 4.0.12
Bumps [marked](https://github.com/markedjs/marked) from 4.0.11 to 4.0.12.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.11...v4.0.12)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-28 03:00:41 +00:00
dependabot[bot]
56fc23f23a Bump cached-path-relative from 1.0.2 to 1.1.0
Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.2 to 1.1.0.
- [Release notes](https://github.com/ashaffer/cached-path-relative/releases)
- [Commits](https://github.com/ashaffer/cached-path-relative/commits)

---
updated-dependencies:
- dependency-name: cached-path-relative
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-27 14:36:29 +00:00
Trevor Buckner
87c28c76f3 Merge pull request #1979 from AlexeySachkov/private/asachkov/testing-with-supertest
Add very basic infrastructure for HTTP testing
2022-01-26 23:42:36 -05:00
dependabot[bot]
235f878dba Bump node-fetch from 2.6.1 to 2.6.7
Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7.
- [Release notes](https://github.com/node-fetch/node-fetch/releases)
- [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7)

---
updated-dependencies:
- dependency-name: node-fetch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-27 03:59:52 +00:00
Trevor Buckner
b2ec0d4a0c Merge pull request #1986 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.8
Bump mongoose from 6.1.7 to 6.1.8
2022-01-26 22:59:29 -05:00
Trevor Buckner
02560d82ab Merge pull request #1988 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.11
Bump marked from 4.0.10 to 4.0.11
2022-01-26 22:59:18 -05:00
Charlie Humphreys
22b80ffbb2 update app templates for welcome messages, add new images 2022-01-26 21:56:12 -06:00
dependabot[bot]
2db127d805 Bump marked from 4.0.10 to 4.0.11
Bumps [marked](https://github.com/markedjs/marked) from 4.0.10 to 4.0.11.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.10...v4.0.11)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-27 03:01:08 +00:00
Charlie Humphreys
c2ca9f8f10 Merge branch 'master' into links-in-home-document
# Conflicts:
#	server.js
2022-01-26 13:59:47 -06:00
Charlie Humphreys
e614fbc5a1 Update app.js from master 2022-01-26 08:46:45 -06:00
Charlie Humphreys
7f001ee391 Merge branch 'master' into migration-guide
# Conflicts:
#	server.js
2022-01-26 08:44:28 -06:00
Charlie Humphreys
9432304be5 Merge branch 'master' into migration-guide
# Conflicts:
#	package-lock.json
2022-01-26 08:43:17 -06:00
Charlie Humphreys
38c0527d35 Add color mixins, help dropdown, and remove unused nav items 2022-01-26 08:40:33 -06:00
dependabot[bot]
6fc176e616 Bump mongoose from 6.1.7 to 6.1.8
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.7 to 6.1.8.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.7...6.1.8)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-25 03:01:18 +00:00
Alexey Sachkov
588bcebc87 [NFC] Outline config creation into a separate module
This is done in order to have config creation rules
unified in one place to avoid modifying them multiple times
if they change.

We already had 3 duplicated pieces of code initializing the
config and there will be more config uses in future tests.

This resolves #1960
2022-01-23 20:06:52 +03:00
Alexey Sachkov
4fd085b684 Update package-lock.json 2022-01-23 20:00:16 +03:00
Alexey Sachkov
d2250cdabb Merge remote-tracking branch 'origin/master' into private/asachkov/testing-with-supertest 2022-01-23 19:58:56 +03:00
Trevor Buckner
179d5e6312 Merge pull request #1980 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.16.12
Bump @babel/core from 7.16.7 to 7.16.12
2022-01-22 22:04:36 -05:00
dependabot[bot]
12d0f69e9c Bump @babel/core from 7.16.7 to 7.16.12
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.16.7 to 7.16.12.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.12/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-22 18:23:01 +00:00
Trevor Buckner
788ff65283 Merge pull request #1973 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.16.10
Bump @babel/plugin-transform-runtime from 7.16.8 to 7.16.10
2022-01-22 13:22:02 -05:00
dependabot[bot]
d7d93c8975 Bump @babel/plugin-transform-runtime from 7.16.8 to 7.16.10
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.8 to 7.16.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.10/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-22 16:36:20 +00:00
Trevor Buckner
eb07fd7c38 Merge pull request #1966 from naturalcrit/dependabot/npm_and_yarn/nanoid-3.2.0
Bump nanoid from 3.1.30 to 3.2.0
2022-01-22 11:35:49 -05:00
Trevor Buckner
c09b87482a Merge pull request #1977 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.16.11
Bump @babel/preset-env from 7.16.8 to 7.16.11
2022-01-22 11:35:17 -05:00
Trevor Buckner
19562a2445 Merge pull request #1978 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.1
Bump codemirror from 5.65.0 to 5.65.1
2022-01-22 11:34:51 -05:00
Alexey Sachkov
543d65f43f Add very first HTTP tests
Added tests for "static" pages like Home, Changelog, FAQ, etc.
2022-01-22 00:36:54 +03:00
Alexey Sachkov
fc1af353f3 Install and configure required packages for HTTP testing
Two new dev dependencies were added:
- supertest package to perform HTTP testing
- @babel/plugin-transform-runtime

Configured jest to so it is able load files from server directory
2022-01-22 00:36:10 +03:00
Alexey Sachkov
9c57450330 [NFC] Explicitly define variables before using them
Fixed two errors which were discovered by trying to run the code in "strict" mode,
which is automatically done by Jest testing framework.
2022-01-22 00:18:13 +03:00
Trevor Buckner
f84e2c316f DMG theme added 2022-01-21 00:27:52 -05:00
Trevor Buckner
0573084ffd Merge pull request #1959 from AlexeySachkov/private/asachkov/refactor-server-js
[NFC] Outline an express app into a separate module
2022-01-21 00:22:58 -05:00
dependabot[bot]
6cb39709c4 Bump codemirror from 5.65.0 to 5.65.1
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.65.0 to 5.65.1.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.65.0...5.65.1)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-21 03:01:49 +00:00
dependabot[bot]
4ea2fc34f0 Bump @babel/preset-env from 7.16.8 to 7.16.11
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.8 to 7.16.11.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.11/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-21 03:01:12 +00:00
dependabot[bot]
a0e2bcb8e4 Bump nanoid from 3.1.30 to 3.2.0
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.2.0.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.2.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-18 22:01:45 +00:00
Trevor Buckner
015644453b Merge pull request #1967 from naturalcrit/dependabot/npm_and_yarn/eslint-8.7.0
Bump eslint from 8.6.0 to 8.7.0
2022-01-18 17:00:45 -05:00
Trevor Buckner
199c7d4e02 Merge pull request #1969 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.7
Bump mongoose from 6.1.6 to 6.1.7
2022-01-18 17:00:38 -05:00
Trevor Buckner
1d71e96421 Merge pull request #1964 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.10
Bump marked from 4.0.9 to 4.0.10
2022-01-18 17:00:32 -05:00
dependabot[bot]
8d0dbac882 Bump mongoose from 6.1.6 to 6.1.7
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.6 to 6.1.7.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.6...6.1.7)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-18 03:01:19 +00:00
dependabot[bot]
6c1b4b1839 Bump eslint from 8.6.0 to 8.7.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.6.0 to 8.7.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.6.0...v8.7.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-17 03:01:30 +00:00
dependabot[bot]
d4a4e7d139 Bump marked from 4.0.9 to 4.0.10
Bumps [marked](https://github.com/markedjs/marked) from 4.0.9 to 4.0.10.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.9...v4.0.10)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-13 03:01:44 +00:00
Alexey Sachkov
0dfe18cd18 Fix liner errors 2022-01-11 23:24:50 +03:00
Alexey Sachkov
8895b44be9 [NFC] Outline an express app into a separate module
This is done in order to be able to re-use that app in API unit tests later
2022-01-11 22:24:23 +03:00
Trevor Buckner
279352377b Merge pull request #1957 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.16.8
Bump @babel/preset-env from 7.16.7 to 7.16.8
2022-01-11 11:32:59 -05:00
dependabot[bot]
51cf363c84 Bump @babel/preset-env from 7.16.7 to 7.16.8
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.7 to 7.16.8.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.8/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-11 16:25:18 +00:00
Trevor Buckner
bdd554851d Merge pull request #1956 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.6
Bump mongoose from 6.1.5 to 6.1.6
2022-01-11 11:24:06 -05:00
Trevor Buckner
f611a36089 Merge pull request #1955 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.16.8
Bump @babel/plugin-transform-runtime from 7.16.7 to 7.16.8
2022-01-11 11:23:59 -05:00
dependabot[bot]
0861e1ed29 Bump mongoose from 6.1.5 to 6.1.6
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.5 to 6.1.6.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.5...6.1.6)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-11 03:01:23 +00:00
dependabot[bot]
4070c53112 Bump @babel/plugin-transform-runtime from 7.16.7 to 7.16.8
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.7 to 7.16.8.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.8/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-11 03:01:11 +00:00
Trevor Buckner
65335162fc Merge branch 'master' into SwappableThemes-ReorganizeFolderStructure 2022-01-10 21:58:21 -05:00
Trevor Buckner
ac8ad98939 Merge pull request #1937 from AlexeySachkov/private/asachkov/v3-markdown-tests
Add tests for our markdown parser/renderer
2022-01-10 13:58:04 -05:00
Trevor Buckner
e315c29620 Merge pull request #1931 from AlexeySachkov/private/asachkov/outline-db-connection
[NFC] Outline database connection into a separate file
2022-01-10 13:55:55 -05:00
Alexey Sachkov
e84cd4fe8b Apply review comments
Switched from raw promises to async/await.
Outlined error handling function to reduce amount of nested code.
Added comment about the new file intent.
2022-01-10 19:25:36 +03:00
Alexey Sachkov
2d85638d7d Update package-lock.json after merge 2022-01-10 18:56:23 +03:00
Alexey Sachkov
1daa700a1a Merge remote-tracking branch 'origin/master' into private/asachkov/v3-markdown-tests 2022-01-10 18:54:53 +03:00
Trevor Buckner
94157ec4d4 Theme switches on click 2022-01-09 23:19:03 -05:00
Trevor Buckner
87bb682836 Add dropdown selector (not clickable yet) 2022-01-09 22:35:53 -05:00
Trevor Buckner
c06176b3bf Merge pull request #1950 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.9
Bump marked from 4.0.8 to 4.0.9
2022-01-06 23:18:59 -05:00
Trevor Buckner
85f93c7861 Merge pull request #1949 from naturalcrit/dependabot/npm_and_yarn/query-string-7.1.0
Bump query-string from 7.0.1 to 7.1.0
2022-01-06 23:18:35 -05:00
dependabot[bot]
e1457b5308 Bump marked from 4.0.8 to 4.0.9
Bumps [marked](https://github.com/markedjs/marked) from 4.0.8 to 4.0.9.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.8...v4.0.9)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-07 03:01:25 +00:00
dependabot[bot]
fc6fd00fe9 Bump query-string from 7.0.1 to 7.1.0
Bumps [query-string](https://github.com/sindresorhus/query-string) from 7.0.1 to 7.1.0.
- [Release notes](https://github.com/sindresorhus/query-string/releases)
- [Commits](https://github.com/sindresorhus/query-string/compare/v7.0.1...v7.1.0)

---
updated-dependencies:
- dependency-name: query-string
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-07 03:00:55 +00:00
Trevor Buckner
3ccc36f87a Merge pull request #1945 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.5
Bump mongoose from 6.1.4 to 6.1.5
2022-01-05 13:14:03 -05:00
Trevor Buckner
ceae540aa0 Merge pull request #1944 from G-Ambatte/increaseGooglePageSize-#1943
Increase Google pageSize to 1000
2022-01-05 13:13:53 -05:00
dependabot[bot]
a5cab7005e Bump mongoose from 6.1.4 to 6.1.5
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.4 to 6.1.5.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.4...6.1.5)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-05 03:00:44 +00:00
G.Ambatte
e48e8cd05b Increase pageSize to 1000 2022-01-05 13:17:56 +13:00
Trevor Buckner
e74800916e Merge pull request #1941 from naturalcrit/dependabot/npm_and_yarn/babel/preset-env-7.16.7
Bump @babel/preset-env from 7.16.5 to 7.16.7
2022-01-04 15:29:30 -05:00
Trevor Buckner
34f154d09d Merge pull request #1940 from naturalcrit/dependabot/npm_and_yarn/babel/core-7.16.7
Bump @babel/core from 7.16.5 to 7.16.7
2022-01-04 15:29:22 -05:00
dependabot[bot]
1bcdd6bc38 Bump @babel/core from 7.16.5 to 7.16.7
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.16.5 to 7.16.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.7/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-04 20:25:26 +00:00
dependabot[bot]
dd82ee68f0 Bump @babel/preset-env from 7.16.5 to 7.16.7
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.16.5 to 7.16.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.7/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-04 20:24:50 +00:00
Trevor Buckner
564486f6d0 Merge pull request #1942 from naturalcrit/dependabot/npm_and_yarn/eslint-8.6.0
Bump eslint from 8.5.0 to 8.6.0
2022-01-04 15:23:35 -05:00
Trevor Buckner
bf632a8584 Merge pull request #1939 from naturalcrit/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.16.7
Bump @babel/plugin-transform-runtime from 7.16.5 to 7.16.7
2022-01-04 15:23:25 -05:00
Trevor Buckner
506cf78dac Merge pull request #1938 from naturalcrit/dependabot/npm_and_yarn/babel/preset-react-7.16.7
Bump @babel/preset-react from 7.16.5 to 7.16.7
2022-01-04 15:23:18 -05:00
Trevor Buckner
9f12e2748d Swapping working. Splitting into separate JS bundles doesn't seem to work. 2022-01-02 23:54:48 -05:00
dependabot[bot]
0dbb5f18ba Bump eslint from 8.5.0 to 8.6.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.5.0 to 8.6.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.5.0...v8.6.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-03 03:01:02 +00:00
dependabot[bot]
85e9c57ee2 Bump @babel/plugin-transform-runtime from 7.16.5 to 7.16.7
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.16.5 to 7.16.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.7/packages/babel-plugin-transform-runtime)

---
updated-dependencies:
- dependency-name: "@babel/plugin-transform-runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-31 03:01:07 +00:00
dependabot[bot]
257c266a2e Bump @babel/preset-react from 7.16.5 to 7.16.7
Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.16.5 to 7.16.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.16.7/packages/babel-preset-react)

---
updated-dependencies:
- dependency-name: "@babel/preset-react"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-31 03:00:54 +00:00
G.Ambatte
605ea2aa62 Revert New & EditPage to master status 2021-12-31 13:42:24 +13:00
G.Ambatte
896d9ae2c7 Lint fixes 2021-12-31 13:35:50 +13:00
G.Ambatte
0beabc6c0c Fix New & EditPage issues after rebase 2021-12-31 13:30:07 +13:00
G.Ambatte
834a4c13a7 Merge branch 'createBasePages' of https://github.com/G-Ambatte/homebrewery into createBasePages
# Conflicts:
#	client/homebrew/pages/userPage/userPage.jsx
2021-12-31 13:11:50 +13:00
G.Ambatte
eca12aae82 Rebase on master 2021-12-31 13:06:21 +13:00
G.Ambatte
00158c1894 Rebase on new master 2021-12-31 13:01:29 +13:00
G.Ambatte
77f5e3e835 Remove unnecessary userPage.less 2021-12-31 13:00:59 +13:00
G.Ambatte
48a5c12ab7 Rebase on new master 2021-12-31 12:59:48 +13:00
Alexey Sachkov
28793e06fc Fix linter errors 2021-12-30 23:40:58 +03:00
Alexey Sachkov
ba74b5aa13 Update package-lock.json 2021-12-30 23:24:38 +03:00
Alexey Sachkov
01bceca7df Add some tests for mustache span syntax
Also refactored test files a bit
2021-12-30 23:23:44 +03:00
Alexey Sachkov
ccca313a15 Initial commit with jest enabling
Removed dependency on pico-check and existing tests.
Added jest as dev dependency, introduced minimal configuration for it.
Added a very first couple of tests for our markdown parser/renderer.
2021-12-30 22:41:01 +03:00
Trevor Buckner
714a425ae5 Split themes into folders by Renderer (Legacy, V3) 2021-12-30 01:21:34 -05:00
Trevor Buckner
c463eedc50 Merge pull request #1933 from AlexeySachkov/private/asachkov/add-display-name-to-react-components
[NFC] Add display name for custom React components
2021-12-29 17:21:31 -05:00
Trevor Buckner
183a8035dd Initial file restructuring 2021-12-29 16:42:25 -05:00
Trevor Buckner
7f49d6f08b Merge pull request #1927 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.4
Bump mongoose from 6.1.3 to 6.1.4
2021-12-29 16:33:08 -05:00
Alexey Sachkov
78d4487c58 Fix linter errors 2021-12-29 21:30:03 +03:00
Alexey Sachkov
8a3f52b704 [NFC] Add display name for custom React components
This improves readability of "Components" tab from React Development Tools extension for Chrome
2021-12-29 21:18:54 +03:00
Alexey Sachkov
6e04535eff [NFC] Outline database connection into a separate file 2021-12-29 19:04:17 +03:00
Charlie Humphreys
5bb580147a Add discord, github, and reddit links to home page document 2021-12-28 21:59:02 -06:00
dependabot[bot]
1adaa9f5c4 Bump mongoose from 6.1.3 to 6.1.4
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.3...6.1.4)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-28 03:01:01 +00:00
Trevor Buckner
7b19bbb1a7 Merge pull request #1922 from naturalcrit/dependabot/npm_and_yarn/prop-types-15.8.0
Bump prop-types from 15.7.2 to 15.8.0
2021-12-23 22:41:44 -05:00
Trevor Buckner
e3d4165fa4 Merge pull request #1921 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.28.0
Bump eslint-plugin-react from 7.27.1 to 7.28.0
2021-12-23 22:41:35 -05:00
dependabot[bot]
ec54434427 Bump prop-types from 15.7.2 to 15.8.0
Bumps [prop-types](https://github.com/facebook/prop-types) from 15.7.2 to 15.8.0.
- [Release notes](https://github.com/facebook/prop-types/releases)
- [Changelog](https://github.com/facebook/prop-types/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/prop-types/compare/v15.7.2...v15.8.0)

---
updated-dependencies:
- dependency-name: prop-types
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-23 03:01:28 +00:00
dependabot[bot]
67bf69fc21 Bump eslint-plugin-react from 7.27.1 to 7.28.0
Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.27.1 to 7.28.0.
- [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases)
- [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.27.1...v7.28.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-23 03:01:10 +00:00
Trevor Buckner
c60e287cbe Merge pull request #1901 from G-Ambatte/addInstallDocs-#1896
Add Install Instructions - Ubuntu
2021-12-21 23:50:01 -05:00
Trevor Buckner
de4b2861b6 Merge pull request #1911 from naturalcrit/dependabot/npm_and_yarn/express-4.17.2
Bump express from 4.17.1 to 4.17.2
2021-12-21 23:19:02 -05:00
Trevor Buckner
eb4234d814 Merge pull request #1912 from naturalcrit/dependabot/npm_and_yarn/marked-4.0.8
Bump marked from 4.0.7 to 4.0.8
2021-12-21 23:18:52 -05:00
Trevor Buckner
4da7b8bd17 Merge pull request #1919 from naturalcrit/dependabot/npm_and_yarn/mongoose-6.1.3
Bump mongoose from 6.1.2 to 6.1.3
2021-12-21 23:18:39 -05:00
Trevor Buckner
c0f5f224bf Merge pull request #1917 from naturalcrit/dependabot/npm_and_yarn/codemirror-5.65.0
Bump codemirror from 5.64.0 to 5.65.0
2021-12-21 23:18:29 -05:00
Trevor Buckner
9b89814056 Merge pull request #1910 from naturalcrit/dependabot/npm_and_yarn/eslint-8.5.0
Bump eslint from 8.4.1 to 8.5.0
2021-12-21 23:18:14 -05:00
Trevor Buckner
12d0baf5d3 Merge pull request #1913 from jeddai/codemirror-tweak-updates
Revert some codemirror tweaks, disable code folding in style tab
2021-12-21 22:48:37 -05:00
dependabot[bot]
8a695c14d7 Bump mongoose from 6.1.2 to 6.1.3
Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/Automattic/mongoose/releases)
- [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Automattic/mongoose/compare/6.1.2...6.1.3)

---
updated-dependencies:
- dependency-name: mongoose
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-22 03:00:58 +00:00
dependabot[bot]
f253bdf954 Bump codemirror from 5.64.0 to 5.65.0
Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.64.0 to 5.65.0.
- [Release notes](https://github.com/codemirror/CodeMirror/releases)
- [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codemirror/CodeMirror/compare/5.64.0...5.65.0)

---
updated-dependencies:
- dependency-name: codemirror
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-21 03:00:47 +00:00
Charlie Humphreys
38d8764f15 Disable code folding in style tab, disable active line highlight and whitespace visibility 2021-12-20 00:42:53 -06:00
dependabot[bot]
01f6d106a2 Bump marked from 4.0.7 to 4.0.8
Bumps [marked](https://github.com/markedjs/marked) from 4.0.7 to 4.0.8.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json)
- [Commits](https://github.com/markedjs/marked/compare/v4.0.7...v4.0.8)

---
updated-dependencies:
- dependency-name: marked
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-20 03:01:12 +00:00
dependabot[bot]
9119860012 Bump express from 4.17.1 to 4.17.2
Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.17.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...4.17.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-20 03:01:01 +00:00
dependabot[bot]
eeaaa0e6c9 Bump eslint from 8.4.1 to 8.5.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.4.1 to 8.5.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.4.1...v8.5.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-20 03:00:51 +00:00
G.Ambatte
db5987a466 Shift install instruction READMEs into install directory 2021-12-19 19:26:12 +13:00
G.Ambatte
b5d5cb085b Merge branch 'addInstallDocs-#1896' of https://github.com/G-Ambatte/homebrewery into addInstallDocs-#1896 2021-12-19 19:22:55 +13:00
G.Ambatte
dcf17e3b72 Add README.UBUNTU.md 2021-12-19 19:22:33 +13:00
G.Ambatte
5b746c0d9c Merge branch 'naturalcrit:master' into addInstallDocs-#1896 2021-12-19 18:51:59 +13:00
G.Ambatte
41bc6ca444 Add HB service file
Update install.sh to create service and set to start automatically
2021-12-19 18:50:35 +13:00
Trevor Buckner
aba2f58fc4 Merge pull request #1898 from naturalcrit/v3.0.6
3.0.6
2021-12-18 23:02:43 -05:00
Sean Robertson
aa4de67e90 Ensure curl is installed
Fix mongodb package name
Use apt satisfy instead of apt install
2021-12-17 16:06:34 +13:00
Sean Robertson
b1a9fbe3ca Update location of FreeBSD install instructions 2021-12-17 15:21:52 +13:00
Charlie Humphreys
603cf2c0ab Adjust migrate document text 2021-12-16 00:03:23 -06:00
Charlie Humphreys
0bc27e83ed Fix reference to old function 2021-12-16 00:01:16 -06:00
Charlie Humphreys
25c1d03cca Update package-lock.json 2021-12-15 23:59:36 -06:00
Charlie Humphreys
e2b4151ab4 Merge branch 'master' into migration-guide
# Conflicts:
#	shared/naturalcrit/markdown.js
2021-12-15 23:59:10 -06:00
Charlie Humphreys
889d307372 Lint change double quotes into single quotes 2021-12-15 23:58:49 -06:00
Charlie Humphreys
fd23396b95 Add migrate nav item to pages and update migrate document 2021-12-15 23:57:52 -06:00
Charlie Humphreys
f1c4910993 Add to migrate document and update colon-replacement for the markdown renderer 2021-12-10 20:25:31 -06:00
Charlie Humphreys
b817148d1c Initial page for migrating from GMB to HB 2021-12-07 22:09:01 -06:00
Charlie Humphreys
e2fe77ade7 Update tag keydown handler to allow tags that match a certain pattern
#758
2021-11-18 23:05:39 -06:00
Charlie Humphreys
19c13342c4 Add autoFocus functionality when editing tags and allow for multi-tag entry by comma separation
#758
2021-11-17 23:56:57 -06:00
Charlie Humphreys
330bf20d61 Update UI to support tags
#758
2021-11-17 22:26:25 -06:00
Charlie Humphreys
22f9efd58a Update API to support homebrew tags
#758
2021-11-17 22:22:33 -06:00
G.Ambatte
f422b22af1 Revert "Initial pass at editorPage.jsx."
This reverts commit 6cd56dfd62.
2021-11-04 14:07:11 +13:00
G.Ambatte
6cd56dfd62 Initial pass at editorPage.jsx. 2021-11-04 14:03:57 +13:00
G.Ambatte
fe708e0a0b Remove line rather than comment it out 2021-11-04 11:44:41 +13:00
G.Ambatte
4fc0bbc9d7 Remove unnecessary userPage.less 2021-11-04 11:44:05 +13:00
G.Ambatte
fd0eb4ca7d Add & implement ListPage 2021-11-04 10:42:27 +13:00
Trevor Buckner
4bebdfda79 Allow wide classTables to bleed into top margin 2021-09-18 00:37:21 -04:00
170 changed files with 27338 additions and 10335 deletions

View File

@@ -2,17 +2,23 @@
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
version: 2.1
orbs:
node: circleci/node@3.0.0
jobs:
build:
docker:
- image: circleci/node:16.10.0
- image: circleci/mongo:4.4
- image: cimg/node:16.11.0
- image: mongo:4.4
working_directory: ~/repo
working_directory: ~/homebrewery
executor: node/default
steps:
- checkout
- checkout:
path: ~/homebrewery
# Download and cache dependencies
- restore_cache:
@@ -21,12 +27,54 @@ jobs:
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: npm install
- run: sudo npm install -g npm@8.10.0
- node/install-packages:
app-dir: ~/homebrewery
cache-path: node_modules
override-ci-command: npm i
- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}
- persist_to_workspace:
root: .
paths:
- .
test:
docker:
- image: cimg/node:16.11.0
working_directory: ~/homebrewery
parallelism: 4
steps:
- attach_workspace:
at: .
# run tests!
- run: npm run circleci
- run:
name: Test - API Unit Tests
command: npm run test:api-unit
- run:
name: Test - Basic
command: npm run test:basic
- run:
name: Test - Coverage
command: npm run test:coverage
- run:
name: Test - Mustache Spans
command: npm run test:mustache-span
- run:
name: Test - Routes
command: npm run test:route
workflows:
build_and_test:
jobs:
- build
- test:
requires:
- build

7
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
contact_links:
- name: /r/Homebrewery Subreddit
url: https://www.reddit.com/r/homebrewery
about: The Homebrewery community on Reddit!
- name: Discord of Many Things
url: https://discord.gg/domt
about: "Join the conversation in the #formatting channel on DoMT!"

View File

@@ -0,0 +1,17 @@
name: Feature Request
description: Have an idea to improve the Homebrewery? Let us know!
labels: ["feature request"]
body:
- type: markdown
attributes:
value: "We'd love to hear your idea! Please be sure to [search the current Issues](https://github.com/naturalcrit/homebrewery/issues) for any duplicate requests."
- type: textarea
id: user-request
attributes:
label: "Your idea:"
description: The best feature requests provide an explanation of the current issue and then an explanation of how it could be improved. Screenshots/images can be pasted right in as well!
validations:
required: true
- type: markdown
attributes:
value: "Please be sure to search for any close matches to your request in the GitHub Issues tracker before opening a new request, thanks!"

View File

@@ -0,0 +1,55 @@
name: General Issue
description: Report an issue unrelated to Saving
body:
- type: markdown
attributes:
value: Please include as much information as possible.
- type: dropdown
id: renderer
attributes:
label: Renderer
description: Which renderer does this issue occur on? If you are unsure, you can check the renderer in the Properties Editor (click the "i" in the Snippet Menu bar above the editor).
options:
- v3
- Legacy
- Both
validations:
required: true
- type: dropdown
id: browser
attributes:
label: Browser
description: Which browser were you using when the issue occurred?
options:
- Chrome
- Firefox
- Edge
- Safari
- other
validations:
required: true
- type: dropdown
id: operating-system
attributes:
label: Operating System
description: Which OS were you using when the issue occurred?
options:
- Windows
- MacOS
- Linux
- other
validations:
required: true
- type: textarea
id: user-description
attributes:
label: "What happened?"
description: Please include any steps you took leading up to the issue and if you can reproduce it. Let us know what you expected to happen, and what did happen.
validations:
required: true
- type: textarea
id: code
attributes:
label: Code
description: Paste in any relevant code snippet below.
render: gfm

26
.github/ISSUE_TEMPLATE/save_issue.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Saving Issue
description: Report an issue Saving
labels: ["Saving"]
body:
- type: markdown
attributes:
value: |
Woops, sorry there was an issue Saving. Please add any detail you can to this report and check back soon!
- type: textarea
id: error-code
attributes:
label: Error Code
render: shell
- type: textarea
id: user-description
attributes:
label: "Your description of what happened:"
validations:
required: true
- type: markdown
attributes:
value: |
Thanks for the report. Here are some steps that may help in the meantime:
1. Refreshing your Google credentials in Homebrewery by signing out, and back in (they expire after one year).
2. Waiting a few minutes and trying again - sometimes there is just a momentary blip in the server.
3. Check the Issues in Github or the /r/homebrewery subreddit to see if others are experiencing the same issue.

3
.gitignore vendored
View File

@@ -11,3 +11,6 @@ config/docker.*
todo.md
startDB.bat
startMViewer.bat
.vscode
coverage

View File

@@ -9,37 +9,42 @@ using [Markdown][markdown-url]. It is distributed under the terms of the [MIT Li
[markdown-url]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
## Quick Start
The easiest way to get started using the Homebrewery is to use it
The easiest way to get started using The Homebrewery is to use it
[on our website][homebrewery-url]. The code is open source, so feel free to
clone it, tinker with it. If you want to make changes to the code, you can run
clone it and tinker with it. If you want to make changes to the code, you can run
your own local version for testing by following the installation instructions
below.
[homebrewery-url]: https://homebrewery.naturalcrit.com
### Installation
First, install three programs that the Homebrewery requires to run and retrieve
First, install three programs that The Homebrewery requires to run and retrieve
updates:
1. install [node](https://nodejs.org/en/)
1. install [node](https://nodejs.org/en/), version v16 or higher.
1. install [mongodb](https://www.mongodb.com/try/download/community) (Community version)
For easiest installation, follow these steps:
1. In the installer, uncheck the option to run as a service
1. You can install MongoDB Compass if you want a GUI to view your database documents
1. Go to the C drive and create a folder called "data"
1. Inside the "data" folder, create a new folder called "db"
1. Open a command prompt or other terminal and navigate to your mongodb install folder (c:program files\mongo\server\4.4\bin)
1. In the command prompt, run "mongod", which will start up your local database server
1. While MongoD is running, open a second command prompt and navigate to the mongodb install folder
1. In the second command prompt, run "mongo", which allows you to edit the database
1. Type `use homebrewery` to create the homebrewery database. You should see `switched to db homebrewery`
1. Type `db.brews.insert({"title":"test"})` to create a blank document. You should see `WriteResult({ "nInserted" : 1 })`
1. Search in Windows for "Advanced system settings" and open it
1. Click "Environment variables", find the "path" variable, and double-click to open it
1. Click "New" and paste in the path to the mongodb "bin" folder
1. Click "OK", "OK", "OK" to close all the windows
1. install [git](https://git-scm.com/downloads) (select the option that allows Git to run from the command prompt)
For the easiest installation, follow these steps:
1. In the installer, uncheck the option to run as a service.
1. You can install MongoDB Compass if you want a GUI to view your database documents.
1. If you install any version over 6.0, you will have to install [MongoDB Shell](https://www.mongodb.com/try/download/shell).
1. Go to the C:\ drive and create a folder called "data".
1. Inside the "data" folder, create a new folder called "db".
1. Open a command prompt or other terminal and navigate to your MongoDB install folder (C:\Program Files\Mongo\Server\6.0\bin).
1. In the command prompt, run "mongod", which will start up your local database server.
1. While MongoD is running, open a second command prompt and navigate to the MongoDB install folder.
1. Search in Windows for "Advanced system settings" and open it.
1. Click "Environment variables", find the "path" variable, and double-click to open it.
1. Click "New" and paste in the path to the MongoDB "bin" folder.
1. Click "OK" three times to close all the windows.
1. In the second command prompt, run "mongo", which allows you to edit the database.
1. Type `use homebrewery` to create The Homebrewery database. You should see `switched to db homebrewery`.
1. Type `db.brews.insertOne({"title":"test"})` to create a blank document. You should see `{
acknowledged: true,
insertedId: ObjectId("63c2fce9e5ac5a94fe2410cf")
}`
1. install [git](https://git-scm.com/downloads) (select the option that allows Git to run from the command prompt).
Checkout the repo ([documentation][github-clone-repo-docs-url]):
```
@@ -51,10 +56,18 @@ git clone https://github.com/naturalcrit/homebrewery.git
Second, you will need to add the environment variable `NODE_ENV=local` to allow
the project to run locally.
You can set this temporarily in your shell of choice:
You can set this **temporarily** (until you close the terminal) in your shell of choice with admin privileges:
* Windows Powershell: `$env:NODE_ENV="local"`
* Windows CMD: `set NODE_ENV=local`
* Linux / OSX: `export NODE_ENV=local`
* Linux / macOS: `export NODE_ENV=local`
If you want to add this variable **permanently** the steps are as follows:
1. Search in Windows for "Advanced system settings" and open it.
1. Click "Environment variables".
1. In System Variables, click "New"
1. Click "New" and write `NODE_ENV` as a name and `local` as the value.
1. Click "OK" three times to close all the windows.
This can be undone at any time if needed.
Third, you will need to install the Node dependencies, compile the app, and run
it using the two commands:
@@ -63,7 +76,14 @@ it using the two commands:
1. `npm start`
You should now be able to go to [http://localhost:8000](http://localhost:8000)
in your browser and use the Homebrewery offline.
in your browser and use The Homebrewery offline.
If you had any issue at all, here are some links that may be useful:
- [Course](https://learn.mongodb.com/courses/m103-basic-cluster-administration) on cluster administration, useful for beginners
- [Mongo community forums](https://www.mongodb.com/community/forums/)
- Useful Stack Overflow links for your most probable errors: [1](https://stackoverflow.com/questions/44962540/mongod-and-mongo-commands-not-working-on-windows-10), [2](https://stackoverflow.com/questions/15053893/mongo-command-not-recognized-when-trying-to-connect-to-a-mongodb-server/41507803#41507803), [3](https://stackoverflow.com/questions/51224959/mongo-is-not-recognized-as-an-internal-or-external-command-operable-program-o)
If you still have problems, post in [Our Subreddit](https://www.reddit.com/r/homebrewery/) and we will help you.
### Running the application via Docker
@@ -95,11 +115,11 @@ You can check out the [changelog](./changelog.md).
## License
This project is licensed under the [MIT license](./license). Which means you
This project is licensed under the [MIT license](./license), which means you
are free to use The Homebrewery in any way that you want, except for claiming
that you made it yourself.
If you wish to sell or in some way gain profit for what's created on this site,
If you wish to sell, or in some way gain profit for, what's created on this site,
it's your responsibility to ensure you have the proper licenses/rights for any
images or resources used.
@@ -108,13 +128,12 @@ images or resources used.
You are welcome to contribute to the development and maintenance of the
project! There are several ways of doing that:
- At the moment, we have a huge backlog of [issues][repo-issues-url] and some
of them are outdated, duplicates or doesn't contain any useful info. In order
to help you can [mark duplicates][github-mark-duplicate-url], try to
reproduce some complex or weird issues, try with finding a workaround for a
reported bug or just mention issue managers team to let them know about
outdated issue via `@naturalcrit/issue-managers`.
of them are outdated, duplicates, or don't contain any useful info. To help, you can [mark duplicates][github-mark-duplicate-url], try to
reproduce some complex or weird issues, try finding a workaround for a
reported bug, or just mention our issue managers team to let them know about
outdated issues via `@naturalcrit/issue-managers`.
- Our [subreddit][subreddit-url] is constantly growing and there are number of
bug reports: any help with sorting them out is very welcome.
bug reports. Any help with sorting them out is very welcome.
- And of course you can contribute by fixing a bug or implementing a new
feature by yourself, we are waiting for your
[pull requests][github-pr-docs-url]!

View File

@@ -7,6 +7,11 @@ h5 {
margin-left: 0px;
}
.page .taskList {
display:block;
break-inside:auto;
}
.taskList li input {
list-style-type : none;
margin-left : -0.52cm;
@@ -14,6 +19,11 @@ h5 {
filter: brightness(1.1) drop-shadow(1px 2px 1px #222);
}
.taskList ul {
margin-bottom: 0px;
margin-top: 0px;
}
.taskList li input[checked] {
filter: sepia(100%) hue-rotate(60deg) saturate(3.5) contrast(4) brightness(1.1) drop-shadow(1px 2px 1px #222);
}
@@ -29,21 +39,398 @@ pre {
.page p + pre {
margin-top : 0.1cm;
}
.page ul + h5 {
margin-top: 0.25cm;
}
.page p + h5 {
margin-top: 0.25cm;
}
.page .openSans {
font-family: 'Open Sans';
font-size: 0.9em;
}
.page {
padding-bottom: 1.5cm;
}
```
## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
### Saturday 18/02/2023 - v3.6.1
{{taskList
##### G-Ambatte
* [x] Fix users not being removed from Authors list correctly
Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674)
}}
### Friday 23/01/2023 - v3.6.0
{{taskList
##### calculuschild
* [x] Fix Google Drive brews sometimes duplicating
Fixes issues [#2603](https://github.com/naturalcrit/homebrewery/issues/2603)
##### Jeddai
* [x] Add unit tests with full coverage for the Homebrewery API
* [x] Add message to refresh the browser if the user is missing an update to the Homebrewery
Fixes issues [#2583](https://github.com/naturalcrit/homebrewery/issues/2583)
##### G-Ambatte
* [x] Auto-compile Themes CSS on development server
##### 5e-Cleric
* [x] Fix cloned brews inheriting the parent view count
}}
### Friday 23/12/2022 - v3.5.0
{{taskList
##### Jeddai
* [x] Only brew owners or invited authors can edit a brew
- Visiting an `/edit` page of a brew that does not list you as an author will result in an error page. Authors can be added to any brew by opening its {{fa,fa-info-circle}} **Properties** menu and typing the author's username (case-sensitive) into the **Invited Authors** bubble.
- Warn user if a newer brew version has been saved on another device
Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987)
}}
\page
### Saturday 10/12/2022 - v3.4.2
{{taskList
##### Jeddai
* [x] Fix broken tags editor
* [x] Reduce server load to fix some saving issues
Fixes issues [#2322](https://github.com/naturalcrit/homebrewery/issues/2322)
##### G-Ambatte
* [x] Account page help link for Google Drive errors
Fixes issues [#2520](https://github.com/naturalcrit/homebrewery/issues/2520)
}}
### Monday 05/12/2022 - v3.4.1
{{taskList
##### G-Ambatte
* [x] Fix Account page incorrect last login time
Fixes issues [#2521](https://github.com/naturalcrit/homebrewery/issues/2521)
##### Gazook
* [x] Fix crashing on iOS and Safari browsers
Fixes issues [#2531](https://github.com/naturalcrit/homebrewery/issues/2531)
}}
### Monday 28/11/2022 - v3.4.0
{{taskList
##### G-Ambatte
* [x] Fix for Chrome v108 handling of page size
Fixes issues [#2445](https://github.com/naturalcrit/homebrewery/issues/2445), [#2516](https://github.com/naturalcrit/homebrewery/issues/2516)
* [x] New account page with some user info, at {{openSans **USERNAME {{fa,fa-user}} → ACCOUNT {{fa,fa-user}}**}}
Fixes issues [#2049](https://github.com/naturalcrit/homebrewery/issues/2049), [#2043](https://github.com/naturalcrit/homebrewery/issues/2043)
* [x] Fix "Published/Private Brews" buttons on userpage
Fixes issues [#2449](https://github.com/naturalcrit/homebrewery/issues/2449)
##### Gazook
* [x] Make autosave default on for new users
* [x] Added link to our FAQ at {{openSans **NEED HELP? {{fa,fa-question-circle}} → FAQ {{fa,fa-question-circle}}**}}
* [x] Fix curly blocks freezing with long property lists
Fixes issues [#2393](https://github.com/naturalcrit/homebrewery/issues/2393)
* [x] Items can now be removed from {{openSans **RECENT BREWS** {{fas,fa-history}} }}
Fixes issues [#1918](https://github.com/naturalcrit/homebrewery/issues/1918)
* [x] Curly injector syntax `{blue}` highlighting in editor
Fixes issues [#1670](https://github.com/naturalcrit/homebrewery/issues/1670)
}}
### Thursday 28/10/2022 - v3.3.1
{{taskList
##### Calculuschild
* [x] Fixes to several broken CSS styles from v3.3.0
Fixes issues [#2468](https://github.com/naturalcrit/homebrewery/issues/2468)
##### Jeddai
* [x] Reduce size of thumbnails on social media links
}}
### Friday 19/10/2022 - v3.3.0
{{taskList
##### Calculuschild
* [x] Fix for tables broken by Chrome v106
##### G-Ambatte:
* [x] Fix Table of Contents broken by Chrome v106
Fixes issues [#2437](https://github.com/naturalcrit/homebrewery/issues/2437)
* [x] Show brew thumbnails on user page
Fixes issues [#2331](https://github.com/naturalcrit/homebrewery/issues/2331)
* [x] Allow longer URLs for brew thumbnails
Fixes issues [#2351](https://github.com/naturalcrit/homebrewery/issues/2351)
* [x] Code no longer unfolds when inserting a snippet
Fixes issues [#2135](https://github.com/naturalcrit/homebrewery/issues/2135)
* [x] Fix brew settings being lost on first save
Fixes issues [#2427](https://github.com/naturalcrit/homebrewery/issues/2427)
##### Gazook:
* [x] Several updates to bug reporting and error popups
Fixes issues [#2376](https://github.com/naturalcrit/homebrewery/issues/2376)
* [x] Fixes to userpage search bar
Fixes issues [#1675](https://github.com/naturalcrit/homebrewery/issues/1675), [#2353](https://github.com/naturalcrit/homebrewery/issues/2353)
* [x] Renderer *(legacy / V3)* now shown next to page #
Fixes issues [#1928](https://github.com/naturalcrit/homebrewery/issues/1928)
* [x] Prevent text selection when moving divider bar
Fixes issues [#1632](https://github.com/naturalcrit/homebrewery/issues/1632)
* [x] Tweak Monster Stat Block coloring
Fixes issues [#2123](https://github.com/naturalcrit/homebrewery/issues/2123)
* [x] Added dropdown button to toggle autosave
Fixes issues [#1546](https://github.com/naturalcrit/homebrewery/issues/1546)
}}
### Friday 08/09/2022 - v3.2.2
{{taskList
##### Jeddai:
* [x] Fix brews not deleting from User page when removed from Google Drive externally.
Fixes issues: [#2325](https://github.com/naturalcrit/homebrewery/issues/2325)
##### G-Ambatte:
* [x] Brew Tags are now searchable on the User page
Fixes issues [#2317](https://github.com/naturalcrit/homebrewery/issues/2317), [#2319](https://github.com/naturalcrit/homebrewery/issues/2319), [#2334](https://github.com/naturalcrit/homebrewery/issues/2334)
* [x] Several tweaks to the User page
Fixes issues: [#1797](https://github.com/naturalcrit/homebrewery/issues/1797), [#2315](https://github.com/naturalcrit/homebrewery/issues/2315), [#2326](https://github.com/naturalcrit/homebrewery/issues/2326), [#2328](https://github.com/naturalcrit/homebrewery/issues/2328)
}}
\page
### Wednesday 31/08/2022 - v3.2.1
{{taskList
##### Calculuschild
* [x] Reference Links should now work inside tables
Fixes issues: [#2307](https://github.com/naturalcrit/homebrewery/issues/2307)
##### Jeddai:
* [x] Fix printing from `/new` not working
Fixes issues: [#1789](https://github.com/naturalcrit/homebrewery/issues/1789), [#1806](https://github.com/naturalcrit/homebrewery/issues/1806)
* [x] Fix broken snippet buttons on `/new`
Fixes issues: [#2311](https://github.com/naturalcrit/homebrewery/issues/2311)
##### G-Ambatte:
* [x] Several small tweaks to the User page
Fixes issues: [#2301](https://github.com/naturalcrit/homebrewery/issues/2301), [#2303](https://github.com/naturalcrit/homebrewery/issues/2303), [#2121](https://github.com/naturalcrit/homebrewery/issues/2121)
}}
### Saturday 27/08/2022 - v3.2.0
{{taskList
##### Calculuschild
* [x] The V3 renderer is now the default for new brews.
* [x] Small tweaks to the spacing around the `classTable` style
##### Jeddai:
* [x] Brew transfers between Homebrewery and Google Drive now keep the same share and edit links! Metadata is now also kept across transfers.
Fixes issues: [#1838](https://github.com/naturalcrit/homebrewery/issues/1838)
* [x] Brews can now be labeled with tags; these will be searchable on the My Brews page in a future update.
Fixes issues: [#758](https://github.com/naturalcrit/homebrewery/issues/758)
##### Jlgraves:
* [x] Small tweaks to the `ClassFeature` snippet
Fixes issues: [#2215](https://github.com/naturalcrit/homebrewery/issues/2215)
}}
### Thursday 09/06/2022 - v3.1.1
{{taskList
##### Calculuschild:
* [x] Fixed class table decorations appearing on top of the table in PDF output.
Fixes issues: [#1784](https://github.com/naturalcrit/homebrewery/issues/1784)
* [x] Fix bottom decoration on half class tables disappearing when the table is too short.
Fixes issues: [#2202](https://github.com/naturalcrit/homebrewery/issues/2202)
}}
### Monday 06/06/2022 - v3.1.0
{{taskList
##### G-Ambatte:
* [x] "Jump to Preview/Editor" buttons added to the divider bar. Easily sync between the editor and preview panels!
Fixes issues: [#1756](https://github.com/naturalcrit/homebrewery/issues/1756)
* [x] Speedups to the user page for users with large and/or many brews.
Fixes issues: [#2147](https://github.com/naturalcrit/homebrewery/issues/2147)
* [x] Search text on the user page is saved to the URL for easy bookmarking in your browser
Fixes issues: [#1858](https://github.com/naturalcrit/homebrewery/issues/1858)
* [x] Added easy login system for offline installs.
Fixes issues: [#269](https://github.com/naturalcrit/homebrewery/issues/269)
* [x] New **THUMBNAIL** option in the {{fa,fa-info-circle}} **Properties** menu. This image will show up in social media links.
Fixes issues: [#820](https://github.com/naturalcrit/homebrewery/issues/820)
}}
### Wednesday 27/03/2022 - v3.0.8
{{taskList
* [x] Style updates to user page.
* [x] Added a logout button (finally)! You can find it under {{openSans **USERNAME {{fa,fa-user}} → LOGOUT {{fas,fa-power-off}}**}}
Fixes issues: [#303](https://github.com/naturalcrit/homebrewery/issues/303)
* [x] Clarified the default text when submitting an issue via Reddit post.
* [x] Fixed broken Table of Contents links in PDFs. (Thanks lucastucious!)
Fixes issues: [#1749](https://github.com/naturalcrit/homebrewery/issues/1749)
* [x] Fixed window resizing causing the edit page divider to get lost off of the edge of the page.
Fixes issues: [#2053](https://github.com/naturalcrit/homebrewery/issues/2053)
* [x] Fixed Class Table decorations overlapping main text.
Fixes issues: [#1985](https://github.com/naturalcrit/homebrewery/issues/1985)
* [x] Updated {{openSans **STYLE EDITOR {{fa,fa-pencil-alt}} → REMOVE DROP CAP {{fas,fa-remove-format}}**}} snippet to also remove small-caps first line font.
* [x] Background work in preparation for brew themes.
}}
### Wednesday 02/02/2022 - v3.0.7
{{taskList
* [x] Revert active line highlighting.
Fixes issues: [#1913](https://github.com/naturalcrit/homebrewery/issues/1913)
* [x] Added install steps for Ubuntu. [HERE](https://github.com/naturalcrit/homebrewery/blob/master/install/README.UBUNTU.md)
Fixes issues: [#1900](https://github.com/naturalcrit/homebrewery/issues/1900)
* [x] Added social media links to home page.
* [x] Increase brews visible on the user page to 1,000.
Fixes issues: [#1943](https://github.com/naturalcrit/homebrewery/issues/1943)
* [x] Added a Legacy to V3 migration guide under {{openSans **NEED HELP? {{fa,fa-question-circle}} → MIGRATE {{fas,fa-file-import}}**}}
* [x] Background refactoring and unit tests.
}}
### Saturday 18/12/2021 - v3.0.6
{{taskList
* [x] Fixed text wrapping for long strings in code blocks.
Fixes issues: [#1736](https://github.com/naturalcrit/homebrewery/issues/1736)
* [x] Code search/replace `CTRL F / CTRL SHIFT F`
* [x] Code search/replace PC: `CTRL F / CTRL SHIFT F` / Mac: `CMD F / OPTION CMD F`
Fixes issues: [#1201](https://github.com/naturalcrit/homebrewery/issues/1201)
* [x] Auto-closing HTML tags and curly braces `{{ }}`
* [x] Highlight current active line
@@ -56,7 +443,7 @@ For a full record of development, visit our [Github Page](https://github.com/nat
* [x] Make columns even in V3 Table of Contents.
Fixes issues: [#1671](https://github.com/naturalcrit/homebrewery/issues/1671)
* [x] Fix `CTRL P` failing to print from `/new` pages.
Fixes issues: [#1815](https://github.com/naturalcrit/homebrewery/issues/1815)

View File

@@ -1,3 +1,4 @@
/*eslint max-lines: ["warn", {"max": 300, "skipBlankLines": true, "skipComments": true}]*/
require('./brewRenderer.less');
const React = require('react');
const createClass = require('create-react-class');
@@ -13,15 +14,19 @@ const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx');
const NotificationPopup = require('./notificationPopup/notificationPopup.jsx');
const Frame = require('react-frame-component').default;
const Themes = require('themes/themes.json');
const PAGE_HEIGHT = 1056;
const PPR_THRESHOLD = 50;
const BrewRenderer = createClass({
displayName : 'BrewRenderer',
getDefaultProps : function() {
return {
text : '',
style : '',
renderer : 'legacy',
theme : '5ePHB',
errors : []
};
},
@@ -104,7 +109,12 @@ const BrewRenderer = createClass({
renderPageInfo : function(){
return <div className='pageInfo' ref='main'>
{this.state.viewablePageNumber + 1} / {this.state.pages.length}
<div>
{this.props.renderer}
</div>
<div>
{this.state.viewablePageNumber + 1} / {this.state.pages.length}
</div>
</div>;
},
@@ -112,7 +122,7 @@ const BrewRenderer = createClass({
if(!this.state.usePPR) return;
return <div className='ppr_msg'>
Partial Page Renderer enabled, because your brew is so large. May effect rendering.
Partial Page Renderer is enabled, because your brew is so large. May affect rendering.
</div>;
},
@@ -124,7 +134,7 @@ const BrewRenderer = createClass({
renderStyle : function() {
if(!this.props.style) return;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style> ${this.props.style} </style>` }} />;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>@layer styleTab {\n${this.props.style}\n} </style>` }} />;
},
renderPage : function(pageText, index){
@@ -176,6 +186,9 @@ const BrewRenderer = createClass({
render : function(){
//render in iFrame so broken code doesn't crash the site.
//Also render dummy page while iframe is mounting.
const rendererPath = this.props.renderer == 'V3' ? 'V3' : 'Legacy';
const themePath = this.props.theme ?? '5ePHB';
const baseThemePath = Themes[rendererPath][themePath].baseTheme;
return (
<React.Fragment>
@@ -187,7 +200,7 @@ const BrewRenderer = createClass({
</div>
: null}
<Frame initialContent={this.state.initialContent}
<Frame id='BrewRenderer' initialContent={this.state.initialContent}
style={{ width: '100%', height: '100%', visibility: this.state.visibility }}
contentDidMount={this.frameDidMount}>
<div className={'brewRenderer'}
@@ -199,7 +212,11 @@ const BrewRenderer = createClass({
<RenderWarnings />
<NotificationPopup />
</div>
<link href={`${this.props.renderer == 'legacy' ? '/themes/5ePhbLegacy.style.css' : '/themes/5ePhb.style.css'}`} rel='stylesheet'/>
<link href={`/themes/${rendererPath}/Blank/style.css`} rel='stylesheet'/>
{baseThemePath &&
<link href={`/themes/${rendererPath}/${baseThemePath}/style.css`} rel='stylesheet'/>
}
<link href={`/themes/${rendererPath}/${themePath}/style.css`} rel='stylesheet'/>
{/* Apply CSS from Style tab and render pages from Markdown tab */}
{this.state.isMounted
&&

View File

@@ -21,11 +21,17 @@
right : 17px;
bottom : 0;
z-index : 1000;
padding : 8px 10px;
background-color : #333;
font-size : 10px;
font-weight : 800;
color : white;
div {
display: inline-block;
padding : 8px 10px;
&:not(:last-child){
border-right: 1px solid #666;
}
}
}
.ppr_msg{
position : absolute;

View File

@@ -5,6 +5,7 @@ const _ = require('lodash');
const cx = require('classnames');
const ErrorBar = createClass({
displayName : 'ErrorBar',
getDefaultProps : function() {
return {
errors : []

View File

@@ -4,9 +4,10 @@ const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames'); //Unused variable
const DISMISS_KEY = 'dismiss_notification09-9-21';
const DISMISS_KEY = 'dismiss_notification08-27-22';
const NotificationPopup = createClass({
displayName : 'NotificationPopup',
getInitialState : function() {
return {
notifications : {}
@@ -21,45 +22,45 @@ const NotificationPopup = createClass({
},
notifications : {
psa : function(){
return <li key='psa'>
<em>V3.0.0 Released!</em> <br />
After a long and bumpy road, we decided it was high time we finally release version 3 of the homebrewery into the wild. You can check out a
brief overview and see how to opt-in to the new features here:&nbsp;
<a target='_blank' href='https://homebrewery.naturalcrit.com/v3_preview'>V3 Welcome Page</a> and&nbsp;
<a target='_blank' href='https://homebrewery.naturalcrit.com/changelog'>the Changelog</a>.
<br /><br />
<em>BE WARNED:</em> As we continue to develop V3, expect small tweaks in the styling, fonts, and snippets; your brews may look slightly
different from day-to-day. All of your old documents will continue to work as normal; we are not touching them. If you don't want to deal
with the possibility of slight formatting changes, you may choose to stick with the Legacy renderer on any of your brews for as long as you like.
<br /><br />
With this in mind, if you still wish to try out V3, you can opt-in any of your brews to the the V3 renderer.
This will likely break much of your formatting as a lot of the Markdown code has been updated, and starting from scratch may be cleaner.
(Don't worry, you can always change the renderer back to Legacy for any brew at any time).
</li>;
},
refreshGoogle : function (){
return <li key='refreshGoogle'>
<em>Refresh your Google Drive Credentials!</em> <br />
Currently a lot of people are striking issues with their Google credentials expiring, which happens one year after the last sign in via
Google. This can cause errors when trying to save your brews. If this happens, simply visit the&nbsp;
<a target='_blank' href='https://www.naturalcrit.com/login'>
logout page
</a>
, sign out, and then sign back in "with Google" to refresh your credentials. See&nbsp;
<a target='_blank' href='https://github.com/naturalcrit/homebrewery/discussions/1580'>
this discussion on Github
</a> for more details.
</li>;
},
faq : function(){
return <li key='faq'>
<em>Protect your work! </em> <br />
If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!&nbsp;
<a target='_blank' href='https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/'>
See the FAQ
</a> to learn how to avoid losing your work!
</li>;
},
return (
<>
<li key='psa'>
<em>V3.2.0 Released!</em> <br />
We are happy to announce that after nearly a year of use by our many users,
we are making the V3 render mode the default setting for all new brews.
This mode has become quite popular, and has proven to be stable and powerful.
Of course, we will always keep the option to use the Legacy renderer for any
brew, which can still be accessed from the Properties menu.
</li>
<li key='stubs'>
<em>Change to Google Drive Storage!</em> <br />
We have made a change to the process of tranferring brews between Google
Drive and the Homebrewery storage. Starting now, any time a brew is
transferred, it will keep the same links instead of generating new ones!
We hope this change will help reduce issues where people "lost" their work
by trying to visit old links.
</li>
<li key='googleDriveFolder'>
<em>Don't delete your Homebrewery folder on Google Drive!</em> <br />
We have had several reports of users losing their brews, not realizing
that they had deleted the files on their Google Drive. If you have a Homebrewery folder
on your Google Drive with *.txt files inside, <em>do not delete it</em>!
We cannot help you recover files that you have deleted from your own
Google Drive.
</li>
<li key='faq'>
<em>Protect your work! </em> <br />
If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!&nbsp;
<a target='_blank' href='https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/'>
See the FAQ
</a> to learn how to avoid losing your work!
</li>
</>
);
}
},
checkNotifications : function(){
const hideDismiss = localStorage.getItem(DISMISS_KEY);

View File

@@ -19,13 +19,9 @@ const DEFAULT_STYLE_TEXT = dedent`
color: black;
}`;
const splice = function(str, index, inject){
return str.slice(0, index) + inject + str.slice(index);
};
const Editor = createClass({
displayName : 'Editor',
getDefaultProps : function() {
return {
brew : {
@@ -36,6 +32,7 @@ const Editor = createClass({
onTextChange : ()=>{},
onStyleChange : ()=>{},
onMetaChange : ()=>{},
reportError : ()=>{},
renderer : 'legacy'
};
@@ -60,8 +57,14 @@ const Editor = createClass({
window.removeEventListener('resize', this.updateEditorSize);
},
componentDidUpdate : function() {
componentDidUpdate : function(prevProps, prevState, snapshot) {
this.highlightCustomMarkdown();
if(prevProps.moveBrew !== this.props.moveBrew) {
this.brewJump();
};
if(prevProps.moveSource !== this.props.moveSource) {
this.sourceJump();
};
},
updateEditorSize : function() {
@@ -73,31 +76,24 @@ const Editor = createClass({
},
handleInject : function(injectText){
let text;
if(this.isText()) text = this.props.brew.text;
if(this.isStyle()) text = this.props.brew.style ?? DEFAULT_STYLE_TEXT;
const lines = text.split('\n');
const cursorPos = this.refs.codeEditor.getCursorPosition();
lines[cursorPos.line] = splice(lines[cursorPos.line], cursorPos.ch, injectText);
const injectLines = injectText.split('\n');
this.refs.codeEditor.setCursorPosition(cursorPos.line + injectLines.length, cursorPos.ch + injectLines[injectLines.length - 1].length);
if(this.isText()) this.props.onTextChange(lines.join('\n'));
if(this.isStyle()) this.props.onStyleChange(lines.join('\n'));
this.refs.codeEditor?.injectText(injectText, false);
},
handleViewChange : function(newView){
this.props.setMoveArrows(newView === 'text');
this.setState({
view : newView
}, this.updateEditorSize); //TODO: not sure if updateeditorsize needed
},
getCurrentPage : function(){
const lines = this.props.brew.text.split('\n').slice(0, this.cursorPosition.line + 1);
const lines = this.props.brew.text.split('\n').slice(0, this.refs.codeEditor.getCursorPosition().line + 1);
return _.reduce(lines, (r, line)=>{
if(line.indexOf('\\page') !== -1) r++;
if(
(this.props.renderer == 'legacy' && line.indexOf('\\page') !== -1)
||
(this.props.renderer == 'V3' && line.match(/^\\page$/))
) r++;
return r;
}, 1);
},
@@ -119,6 +115,7 @@ const Editor = createClass({
//reset custom line styles
codeMirror.removeLineClass(lineNumber, 'background', 'pageLine');
codeMirror.removeLineClass(lineNumber, 'text');
codeMirror.removeLineClass(lineNumber, 'wrap', 'sourceMoveFlash');
// Styling for \page breaks
if((this.props.renderer == 'legacy' && line.includes('\\page')) ||
@@ -141,9 +138,17 @@ const Editor = createClass({
codeMirror.addLineClass(lineNumber, 'text', 'columnSplit');
}
// Highlight injectors {style}
if(line.includes('{') && line.includes('}')){
const regex = /(?:^|[^{\n])({(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\2})/gm;
let match;
while ((match = regex.exec(line)) != null) {
codeMirror.markText({ line: lineNumber, ch: line.indexOf(match[1]) }, { line: lineNumber, ch: line.indexOf(match[1]) + match[1].length }, { className: 'injection' });
}
}
// Highlight inline spans {{content}}
if(line.includes('{{') && line.includes('}}')){
const regex = /{{(?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])*\s*|}}/g;
const regex = /{{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1 *|}}/g;
let match;
let blockCount = 0;
while ((match = regex.exec(line)) != null) {
@@ -162,7 +167,7 @@ const Editor = createClass({
// Highlight block divs {{\n Content \n}}
let endCh = line.length+1;
const match = line.match(/^ *{{(?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])* *$|^ *}}$/);
const match = line.match(/^ *{{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1 *$|^ *}}$/);
if(match)
endCh = match.index+match[0].length;
codeMirror.markText({ line: lineNumber, ch: 0 }, { line: lineNumber, ch: endCh }, { className: 'block' });
@@ -173,9 +178,76 @@ const Editor = createClass({
}
},
brewJump : function(){
const currentPage = this.getCurrentPage();
window.location.hash = `p${currentPage}`;
brewJump : function(targetPage=this.getCurrentPage()){
if(!window) return;
// console.log(`Scroll to: p${targetPage}`);
const brewRenderer = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer')[0];
const currentPos = brewRenderer.scrollTop;
const targetPos = window.frames['BrewRenderer'].contentDocument.getElementById(`p${targetPage}`).getBoundingClientRect().top;
const interimPos = targetPos >= 0 ? -30 : 30;
const bounceDelay = 100;
const scrollDelay = 500;
if(!this.throttleBrewMove) {
this.throttleBrewMove = _.throttle((currentPos, interimPos, targetPos)=>{
brewRenderer.scrollTo({ top: currentPos + interimPos, behavior: 'smooth' });
setTimeout(()=>{
brewRenderer.scrollTo({ top: currentPos + targetPos, behavior: 'smooth', block: 'start' });
}, bounceDelay);
}, scrollDelay, { leading: true, trailing: false });
};
this.throttleBrewMove(currentPos, interimPos, targetPos);
// const hashPage = (page != 1) ? `p${page}` : '';
// window.location.hash = hashPage;
},
sourceJump : function(targetLine=null){
if(this.isText()) {
if(targetLine == null) {
targetLine = 0;
const pageCollection = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('page');
const brewRendererHeight = window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer').item(0).getBoundingClientRect().height;
let currentPage = 1;
for (const page of pageCollection) {
if(page.getBoundingClientRect().bottom > (brewRendererHeight / 2)) {
currentPage = parseInt(page.id.slice(1)) || 1;
break;
}
}
const textSplit = this.props.renderer == 'V3' ? /^\\page$/gm : /\\page/;
const textString = this.props.brew.text.split(textSplit).slice(0, currentPage-1).join(textSplit);
const textPosition = textString.length;
const lineCount = textString.match('\n') ? textString.slice(0, textPosition).split('\n').length : 0;
targetLine = lineCount - 1; //Scroll to `\page`, which is one line back.
let currentY = this.refs.codeEditor.codeMirror.getScrollInfo().top;
let targetY = this.refs.codeEditor.codeMirror.heightAtLine(targetLine, 'local', true);
//Scroll 1/10 of the way every 10ms until 1px off.
const incrementalScroll = setInterval(()=>{
currentY += (targetY - currentY) / 10;
this.refs.codeEditor.codeMirror.scrollTo(null, currentY);
// Update target: target height is not accurate until within +-10 lines of the visible window
if(Math.abs(targetY - currentY > 100))
targetY = this.refs.codeEditor.codeMirror.heightAtLine(targetLine, 'local', true);
// End when close enough
if(Math.abs(targetY - currentY) < 1) {
this.refs.codeEditor.codeMirror.scrollTo(null, targetY); // Scroll any remaining difference
this.refs.codeEditor.setCursorPosition({ line: targetLine + 1, ch: 0 });
this.refs.codeEditor.codeMirror.addLineClass(targetLine + 1, 'wrap', 'sourceMoveFlash');
clearInterval(incrementalScroll);
}
}, 10);
}
}
},
//Called when there are changes to the editor's dimensions
@@ -208,6 +280,7 @@ const Editor = createClass({
view={this.state.view}
value={this.props.brew.style ?? DEFAULT_STYLE_TEXT}
onChange={this.props.onStyleChange}
enableFolding={false}
rerenderParent={this.rerenderParent} />
</>;
}
@@ -219,7 +292,8 @@ const Editor = createClass({
rerenderParent={this.rerenderParent} />
<MetadataEditor
metadata={this.props.brew}
onChange={this.props.onMetaChange} />
onChange={this.props.onMetaChange}
reportError={this.props.reportError}/>
</>;
}
},
@@ -246,6 +320,7 @@ const Editor = createClass({
onInject={this.handleInject}
showEditButtons={this.props.showEditButtons}
renderer={this.props.renderer}
theme={this.props.brew.theme}
undo={this.undo}
redo={this.redo}
historySize={this.historySize()} />

View File

@@ -29,6 +29,10 @@
font-weight : bold;
//font-style: italic;
}
.injection{
color : green;
font-weight : bold;
}
}
.brewJump{

View File

@@ -1,34 +1,86 @@
/* eslint-disable max-lines */
require('./metadataEditor.less');
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
const request = require('superagent');
const request = require('../../utils/request-middleware.js');
const Nav = require('naturalcrit/nav/nav.jsx');
const StringArrayEditor = require('../stringArrayEditor/stringArrayEditor.jsx');
const Themes = require('themes/themes.json');
const validations = require('./validations.js');
const SYSTEMS = ['5e', '4e', '3.5e', 'Pathfinder'];
const homebreweryThumbnail = require('../../thumbnail.png');
const callIfExists = (val, fn, ...args)=>{
if(val[fn]) {
val[fn](...args);
}
};
const MetadataEditor = createClass({
displayName : 'MetadataEditor',
getDefaultProps : function() {
return {
metadata : {
editId : null,
title : '',
description : '',
tags : '',
thumbnail : '',
tags : [],
published : false,
authors : [],
systems : [],
renderer : 'legacy'
renderer : 'legacy',
theme : '5ePHB'
},
onChange : ()=>{}
onChange : ()=>{},
reportError : ()=>{}
};
},
handleFieldChange : function(name, e){
this.props.onChange(_.merge({}, this.props.metadata, {
[name] : e.target.value
}));
getInitialState : function(){
return {
showThumbnail : true
};
},
toggleThumbnailDisplay : function(){
this.setState({
showThumbnail : !this.state.showThumbnail
});
},
renderThumbnail : function(){
if(!this.state.showThumbnail) return;
return <img className='thumbnail-preview' src={this.props.metadata.thumbnail || homebreweryThumbnail}></img>;
},
handleFieldChange : function(name, e){
// load validation rules, and check input value against them
const inputRules = validations[name] ?? [];
const validationErr = inputRules.map((rule)=>rule(e.target.value)).filter(Boolean);
// if no validation rules, save to props
if(validationErr.length === 0){
callIfExists(e.target, 'setCustomValidity', '');
this.props.onChange({
...this.props.metadata,
[name] : e.target.value
});
} else {
// if validation issues, display built-in browser error popup with each error.
const errMessage = validationErr.map((err)=>{
return `- ${err}`;
}).join('\n');
callIfExists(e.target, 'setCustomValidity', errMessage);
callIfExists(e.target, 'reportValidity');
}
},
handleSystem : function(system, e){
if(e.target.checked){
this.props.metadata.systems.push(system);
@@ -37,16 +89,26 @@ const MetadataEditor = createClass({
}
this.props.onChange(this.props.metadata);
},
handleRenderer : function(renderer, e){
if(e.target.checked){
this.props.metadata.renderer = renderer;
if(renderer == 'legacy')
this.props.metadata.theme = '5ePHB';
}
this.props.onChange(this.props.metadata);
},
handlePublish : function(val){
this.props.onChange(_.merge({}, this.props.metadata, {
this.props.onChange({
...this.props.metadata,
published : val
}));
});
},
handleTheme : function(theme){
this.props.metadata.renderer = theme.renderer;
this.props.metadata.theme = theme.path;
this.props.onChange(this.props.metadata);
},
handleDelete : function(){
@@ -58,10 +120,14 @@ const MetadataEditor = createClass({
if(!confirm('Are you REALLY sure? You will lose editor access to this document.')) return;
}
request.delete(`/api/${this.props.metadata.editId}`)
request.delete(`/api/${this.props.metadata.googleId ?? ''}${this.props.metadata.editId}`)
.send()
.end(function(err, res){
window.location.href = '/';
.end((err, res)=>{
if(err) {
this.props.reportError(err);
} else {
window.location.href = '/';
}
});
},
@@ -115,6 +181,49 @@ const MetadataEditor = createClass({
</div>;
},
renderThemeDropdown : function(){
if(!global.enable_themes) return;
const listThemes = (renderer)=>{
return _.map(_.values(Themes[renderer]), (theme)=>{
return <div className='item' key={''} onClick={()=>this.handleTheme(theme)} title={''}>
{`${theme.renderer} : ${theme.name}`}
<img src={`/themes/${theme.renderer}/${theme.path}/dropdownTexture.png`}/>
<div className='preview'>
<h6>{`${theme.name}`} preview</h6>
<img src={`/themes/${theme.renderer}/${theme.path}/dropdownPreview.png`}/>
</div>
</div>;
});
};
const currentTheme = Themes[`${_.upperFirst(this.props.metadata.renderer)}`][this.props.metadata.theme];
let dropdown;
if(this.props.metadata.renderer == 'legacy') {
dropdown =
<Nav.dropdown className='disabled value' trigger='disabled'>
<div>
{`Themes are not supported in the Legacy Renderer`} <i className='fas fa-caret-down'></i>
</div>
</Nav.dropdown>;
} else {
dropdown =
<Nav.dropdown className='value' trigger='click'>
<div>
{`${_.upperFirst(currentTheme.renderer)} : ${currentTheme.name}`} <i className='fas fa-caret-down'></i>
</div>
{/*listThemes('Legacy')*/}
{listThemes('V3')}
</Nav.dropdown>;
}
return <div className='field themes'>
<label>theme</label>
{dropdown}
</div>;
},
renderRenderOptions : function(){
if(!global.enable_v3) return;
@@ -141,8 +250,8 @@ const MetadataEditor = createClass({
V3
</label>
<a href='/v3_preview' target='_blank' rel='noopener noreferrer'>
Click here for a quick intro to V3!
<a href='/legacy' target='_blank' rel='noopener noreferrer'>
Click here to see the demo page for the old Legacy renderer!
</a>
</div>
</div>;
@@ -150,26 +259,40 @@ const MetadataEditor = createClass({
render : function(){
return <div className='metadataEditor'>
<h1 className='sectionHead'>Brew</h1>
<div className='field title'>
<label>title</label>
<input type='text' className='value'
value={this.props.metadata.title}
defaultValue={this.props.metadata.title}
onChange={(e)=>this.handleFieldChange('title', e)} />
</div>
<div className='field description'>
<label>description</label>
<textarea value={this.props.metadata.description} className='value'
onChange={(e)=>this.handleFieldChange('description', e)} />
<div className='field-group'>
<div className='field-column'>
<div className='field description'>
<label>description</label>
<textarea defaultValue={this.props.metadata.description} className='value'
onChange={(e)=>this.handleFieldChange('description', e)} />
</div>
<div className='field thumbnail'>
<label>thumbnail</label>
<input type='text'
defaultValue={this.props.metadata.thumbnail}
placeholder='https://my.thumbnail.url'
className='value'
onChange={(e)=>this.handleFieldChange('thumbnail', e)} />
<button className='display' onClick={this.toggleThumbnailDisplay}>
<i className={`fas fa-caret-${this.state.showThumbnail ? 'right' : 'left'}`} />
</button>
</div>
</div>
{this.renderThumbnail()}
</div>
{/*}
<div className='field tags'>
<label>tags</label>
<textarea value={this.props.metadata.tags}
onChange={(e)=>this.handleFieldChange('tags', e)} />
</div>
*/}
{this.renderAuthors()}
<StringArrayEditor label='tags' valuePatterns={[/^(?:(?:group|meta|system|type):)?[A-Za-z0-9][A-Za-z0-9 \/.\-]{0,40}$/]}
placeholder='add tag' unique={true}
values={this.props.metadata.tags}
onChange={(e)=>this.handleFieldChange('tags', e)}/>
<div className='field systems'>
<label>systems</label>
@@ -178,8 +301,27 @@ const MetadataEditor = createClass({
</div>
</div>
{this.renderThemeDropdown()}
{this.renderRenderOptions()}
<hr/>
<h1 className='sectionHead'>Authors</h1>
{this.renderAuthors()}
<StringArrayEditor label='invited authors' valuePatterns={[/.+/]}
validators={[(v)=>!this.props.metadata.authors?.includes(v)]}
placeholder='invite author' unique={true}
values={this.props.metadata.invitedAuthors}
notes={['Invited authors are case sensitive.', 'After adding an invited author, send them the edit link. There, they can choose to accept or decline the invitation.']}
onChange={(e)=>this.handleFieldChange('invitedAuthors', e)}/>
<hr/>
<h1 className='sectionHead'>Privacy</h1>
<div className='field publish'>
<label>publish</label>
<div className='value'>

View File

@@ -1,3 +1,4 @@
@import 'naturalcrit/styles/colors.less';
.metadataEditor{
position : absolute;
@@ -6,31 +7,106 @@
width : 100%;
padding : 25px;
background-color : #999;
height : calc(100vh - 54px); // 54px is the height of the navbar + snippet bar. probably a better way to dynamic get this.
overflow-y : auto;
.sectionHead {
font-weight: 1000;
margin: 20px 0;
&:first-of-type {
margin-top: 0;
}
}
& > div {
margin-bottom: 10px;
}
.field-group {
display: flex;
width: 100%;
flex-wrap: wrap;
gap: 10px;
}
.field-column {
display: flex;
flex-direction: column;
flex: 5 0 200px;
gap: 10px;
}
.field{
display : flex;
flex-wrap : wrap;
width : 100%;
margin-bottom : 10px;
min-width : 200px;
&>label{
display : inline-block;
vertical-align : top;
width : 80px;
font-size : 0.7em;
font-size : 11px;
font-weight : 800;
line-height : 1.8em;
text-transform : uppercase;
flex : 0 0 auto;
}
&>.value{
flex : 1 1 auto;
min-width : 200px;
width : 50px;
&:invalid {
background : #ffb9b9;
}
}
input[type='text'], textarea {
border : 1px solid gray;
}
&.thumbnail{
height : 1.4em;
label{
line-height: 2.0em;
}
.value{
overflow: hidden;
text-overflow: ellipsis;
}
button{
border: 1px solid #999;
color: white;
padding: 0px 5px;
background-color: black;
&:hover{
background-color: #777;
}
}
}
&.description {
flex: 1;
textarea.value {
resize : none;
height : auto;
font-family : 'Open Sans', sans-serif;
font-size : 0.8em;
}
}
small {
font-size : 0.6em;
font-style : italic;
}
}
.description.field textarea.value{
resize : none;
height : 5em;
font-family : 'Open Sans', sans-serif;
font-size : 0.8em;
.thumbnail-preview {
position: relative;
justify-self: center;
width: 80px;
height: min-content;
flex: 1 1;
max-height: 115px;
aspect-ratio: 1 / 1;
object-fit: contain;
background-color: #AAA;
}
.systems.field .value{
label{
vertical-align : middle;
@@ -66,10 +142,6 @@
button.unpublish{
.button(@silver);
}
small{
font-size : 0.6em;
font-style : italic;
}
}
.delete.field .value{
@@ -81,4 +153,163 @@
font-size: 0.8em;
line-height : 1.5em;
}
.themes.field{
font-size : 13.33px;
.navDropdownContainer {
background-color : white;
position : relative;
z-index : 500;
&.disabled {
font-style :italic;
font-style : italic;
background-color : darkgray;
color : dimgray;
}
&>div:first-child {
border : 2px solid rgb(118,118,118);
padding : 6px 3px;
background-color : inherit;
i {
float : right;
}
&:hover {
background-color : @blue;
color : white;
}
}
.navDropdown {
box-shadow : 0px 5px 10px rgba(0, 0, 0, 0.3);
position : absolute;
width : 100%;
.item {
padding : 3px 3px;
border-top : 1px solid rgb(118, 118, 118);
position : relative;
overflow : visible;
background-color : white;
.preview {
display : flex;
flex-direction: column;
background : #ccc;
border-radius : 5px;
box-shadow : 0 0 5px black;
width : 200px;
color :black;
position : absolute;
top : 0;
right : 0;
opacity : 0;
transition : opacity 250ms ease;
z-index : 1;
overflow :hidden;
h6 {
font-weight : 900;
padding-inline:1em;
padding-block :.5em;
border-bottom :2px solid hsl(0,0%,40%);
}
}
&:hover {
background-color : @blue;
color : white;
}
&:hover > .preview {
opacity: 1;
}
>img {
mask-image : linear-gradient(90deg, transparent, black 20%);
-webkit-mask-image : linear-gradient(90deg, transparent, black 20%);
position : absolute;
right : 0;
top : 0px;
width : 50%;
height : 100%;
}
}
}
}
}
.field .list {
display: flex;
flex: 1 0;
flex-wrap: wrap;
> * {
flex: 0 0 auto;
}
#groupedIcon {
#backgroundColors;
display: inline-block;
height: ~"calc(100% + 0.6em)";
position: relative;
top: -0.3em;
right: -0.3em;
cursor: pointer;
min-width: 20px;
text-align: center;
color: white;
i {
position: relative;
top: 50%;
transform: translateY(-50%);
}
&:not(:last-child) {
border-right: 1px solid black;
}
&:last-child {
border-radius: 0 0.5em 0.5em 0;
}
}
.badge {
background-color: #dddddd;
border-radius: .5em;
font-size: .9em;
margin: 2px;
padding: .3em;
.icon {
#groupedIcon
}
}
.input-group {
height: ~"calc(.9em + 4px + .6em)";
input {
border-radius: .5em 0 0 .5em;
}
input:last-child {
border-radius: .5em;
}
.value {
width: 7.5vw;
min-width: 75px;
height: 100%;
}
.invalid:focus {
background-color: pink;
}
.icon {
#groupedIcon;
height: 97%;
font-size: .8em;
right: 1px;
top: -.54em;
i {
font-size: 1.125em;
}
}
}
}
}

View File

@@ -0,0 +1,34 @@
module.exports = {
title : [
(value)=>{
return value?.length > 100 ? 'Max title length of 100 characters' : null;
}
],
description : [
(value)=>{
return value?.length > 500 ? 'Max description length of 500 characters.' : null;
}
],
thumbnail : [
(value)=>{
return value?.length > 256 ? 'Max URL length of 256 characters.' : null;
},
(value)=>{
if(value?.length == 0){return null;}
try {
Boolean(new URL(value));
return null;
} catch (e) {
return 'Must be a valid URL';
}
}
],
language : [
(value)=>{
return new RegExp(/[a-z]{2,3}(-.*)?/).test(value || '') === false ? 'Invalid language code.' : null;
}
]
};

View File

@@ -4,9 +4,16 @@ const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
//Import all themes
const SnippetsLegacy = require('./snippetsLegacy/snippets.js');
const SnippetsV3 = require('./snippets/snippets.js');
const Themes = require('themes/themes.json');
const ThemeSnippets = {};
ThemeSnippets['Legacy_5ePHB'] = require('themes/Legacy/5ePHB/snippets.js');
ThemeSnippets['V3_5ePHB'] = require('themes/V3/5ePHB/snippets.js');
ThemeSnippets['V3_5eDMG'] = require('themes/V3/5eDMG/snippets.js');
ThemeSnippets['V3_Journal'] = require('themes/V3/Journal/snippets.js');
ThemeSnippets['V3_Blank'] = require('themes/V3/Blank/snippets.js');
const execute = function(val, brew){
if(_.isFunction(val)) return val(brew);
@@ -14,6 +21,7 @@ const execute = function(val, brew){
};
const Snippetbar = createClass({
displayName : 'SnippetBar',
getDefaultProps : function() {
return {
brew : {},
@@ -31,21 +39,63 @@ const Snippetbar = createClass({
getInitialState : function() {
return {
renderer : this.props.renderer
renderer : this.props.renderer,
snippets : []
};
},
componentDidMount : async function() {
const rendererPath = this.props.renderer == 'V3' ? 'V3' : 'Legacy';
const themePath = this.props.theme ?? '5ePHB';
let snippets = _.cloneDeep(ThemeSnippets[`${rendererPath}_${themePath}`]);
snippets = this.compileSnippets(rendererPath, themePath, snippets);
this.setState({
snippets : snippets
});
},
componentDidUpdate : async function(prevProps) {
if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme) {
const rendererPath = this.props.renderer == 'V3' ? 'V3' : 'Legacy';
const themePath = this.props.theme ?? '5ePHB';
let snippets = _.cloneDeep(ThemeSnippets[`${rendererPath}_${themePath}`]);
snippets = this.compileSnippets(rendererPath, themePath, snippets);
this.setState({
snippets : snippets
});
}
},
mergeCustomizer : function(valueA, valueB, key) {
if(key == 'snippets') {
const result = _.reverse(_.unionBy(_.reverse(valueB), _.reverse(valueA), 'name')); // Join snippets together, with preference for the current theme over the base theme
return _.filter(result, 'gen'); //Only keep snippets with a 'gen' property.
}
},
compileSnippets : function(rendererPath, themePath, snippets) {
let compiledSnippets = snippets;
const baseSnippetsPath = Themes[rendererPath][themePath].baseSnippets;
const objB = _.keyBy(compiledSnippets, 'groupName');
if(baseSnippetsPath) {
const objA = _.keyBy(_.cloneDeep(ThemeSnippets[`${rendererPath}_${baseSnippetsPath}`]), 'groupName');
compiledSnippets = _.values(_.mergeWith(objA, objB, this.mergeCustomizer));
compiledSnippets = this.compileSnippets(rendererPath, baseSnippetsPath, _.cloneDeep(compiledSnippets));
} else {
const objA = _.keyBy(_.cloneDeep(ThemeSnippets[`${rendererPath}_Blank`]), 'groupName');
compiledSnippets = _.values(_.mergeWith(objA, objB, this.mergeCustomizer));
}
return compiledSnippets;
},
handleSnippetClick : function(injectedText){
this.props.onInject(injectedText);
},
renderSnippetGroups : function(){
let snippets = [];
if(this.props.renderer === 'V3')
snippets = SnippetsV3.filter((snippetGroup)=>snippetGroup.view === this.props.view);
else
snippets = SnippetsLegacy.filter((snippetGroup)=>snippetGroup.view === this.props.view);
const snippets = this.state.snippets.filter((snippetGroup)=>snippetGroup.view === this.props.view);
return _.map(snippets, (snippetGroup)=>{
return <SnippetGroup
@@ -103,6 +153,7 @@ module.exports = Snippetbar;
const SnippetGroup = createClass({
displayName : 'SnippetGroup',
getDefaultProps : function() {
return {
brew : {},
@@ -112,15 +163,22 @@ const SnippetGroup = createClass({
onSnippetClick : function(){},
};
},
handleSnippetClick : function(snippet){
handleSnippetClick : function(e, snippet){
e.stopPropagation();
this.props.onSnippetClick(execute(snippet.gen, this.props.brew));
},
renderSnippets : function(){
return _.map(this.props.snippets, (snippet)=>{
return <div className='snippet' key={snippet.name} onClick={()=>this.handleSnippetClick(snippet)}>
renderSnippets : function(snippets){
return _.map(snippets, (snippet)=>{
return <div className='snippet' key={snippet.name} onClick={(e)=>this.handleSnippetClick(e, snippet)}>
<i className={snippet.icon} />
{snippet.name}
{snippet.subsnippets && <>
<i className='fas fa-caret-right'></i>
<div className='dropdown side'>
{this.renderSnippets(snippet.subsnippets)}
</div></>}
</div>;
});
},
@@ -131,7 +189,7 @@ const SnippetGroup = createClass({
<span className='groupName'>{this.props.groupName}</span>
</div>
<div className='dropdown'>
{this.renderSnippets()}
{this.renderSnippets(this.props.snippets)}
</div>
</div>;
},

View File

@@ -1,4 +1,4 @@
@import (less) './client/icons/customIcons.less';
.snippetBar{
@menuHeight : 25px;
position : relative;
@@ -83,7 +83,7 @@
.snippetGroup{
border-right : 1px solid black;
&:hover{
.dropdown{
&>.dropdown{
visibility : visible;
}
}
@@ -97,15 +97,30 @@
background-color : #ddd;
.snippet{
.animate(background-color);
width : max-content;
padding : 5px;
cursor : pointer;
font-size : 10px;
i{
margin-right : 8px;
font-size : 1.2em;
height : 1.2em;
&~i{
margin-right: 0;
margin-left: 8px;
}
}
&:hover{
background-color : #999;
&>.dropdown{
visibility : visible;
&.side {
left: 100%;
top: 0%;
margin-left:0;
box-shadow: -1px 1px 2px 0px #999;
}
}
}
}
}

View File

@@ -0,0 +1,149 @@
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const StringArrayEditor = createClass({
displayName : 'StringArrayEditor',
getDefaultProps : function() {
return {
label : '',
values : [],
valuePatterns : null,
validators : [],
placeholder : '',
notes : [],
unique : false,
cannotEdit : [],
onChange : ()=>{}
};
},
getInitialState : function() {
return {
valueContext : !!this.props.values ? this.props.values.map((value)=>({
value,
editing : false
})) : [],
temporaryValue : '',
updateValue : ''
};
},
componentDidUpdate : function(prevProps) {
if(!_.eq(this.props.values, prevProps.values)) {
this.setState({
valueContext : this.props.values ? this.props.values.map((newValue)=>({
value : newValue,
editing : this.state.valueContext.find(({ value })=>value === newValue)?.editing || false
})) : []
});
}
},
handleChange : function(value) {
this.props.onChange({
target : {
value
}
});
},
addValue : function(value){
this.handleChange(_.uniq([...this.props.values, value]));
this.setState({
temporaryValue : ''
});
},
removeValue : function(index){
this.handleChange(this.props.values.filter((_, i)=>i !== index));
},
updateValue : function(value, index){
const valueContext = this.state.valueContext;
valueContext[index].value = value;
valueContext[index].editing = false;
this.handleChange(valueContext.map((context)=>context.value));
this.setState({ valueContext, updateValue: '' });
},
editValue : function(index){
if(!!this.props.cannotEdit && this.props.cannotEdit.includes(this.props.values[index])) {
return;
}
const valueContext = this.state.valueContext.map((context, i)=>{
context.editing = index === i;
return context;
});
this.setState({ valueContext, updateValue: this.props.values[index] });
},
valueIsValid : function(value, index) {
const values = _.clone(this.props.values);
if(index !== undefined) {
values.splice(index, 1);
}
const matchesPatterns = !this.props.valuePatterns || this.props.valuePatterns.some((pattern)=>!!(value || '').match(pattern));
const uniqueIfSet = !this.props.unique || !values.includes(value);
const passesValidators = !this.props.validators || this.props.validators.every((validator)=>validator(value));
return matchesPatterns && uniqueIfSet && passesValidators;
},
handleValueInputKeyDown : function(event, index) {
if(event.key === 'Enter') {
if(this.valueIsValid(event.target.value, index)) {
if(index !== undefined) {
this.updateValue(event.target.value, index);
} else {
this.addValue(event.target.value);
}
}
} else if(event.key === 'Escape') {
this.closeEditInput(index);
}
},
closeEditInput : function(index) {
const valueContext = this.state.valueContext;
valueContext[index].editing = false;
this.setState({ valueContext, updateValue: '' });
},
render : function() {
const valueElements = Object.values(this.state.valueContext).map((context, i)=>context.editing
? <React.Fragment key={i}>
<div className='input-group'>
<input type='text' className={`value ${this.valueIsValid(this.state.updateValue, i) ? '' : 'invalid'}`} autoFocus placeholder={this.props.placeholder}
value={this.state.updateValue}
onKeyDown={(e)=>this.handleValueInputKeyDown(e, i)}
onChange={(e)=>this.setState({ updateValue: e.target.value })}/>
{<div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.closeEditInput(i); }}><i className='fa fa-undo fa-fw'/></div>}
{this.valueIsValid(this.state.updateValue, i) ? <div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.updateValue(this.state.updateValue, i); }}><i className='fa fa-check fa-fw'/></div> : null}
</div>
</React.Fragment>
: <div className='badge' key={i} onClick={()=>this.editValue(i)}>{context.value}
{!!this.props.cannotEdit && this.props.cannotEdit.includes(context.value) ? null : <div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.removeValue(i); }}><i className='fa fa-times fa-fw'/></div>}
</div>
);
return <div className='field'>
<label>{this.props.label}</label>
<div style={{ flex: '1 0' }}>
<div className='list'>
{valueElements}
<div className='input-group'>
<input type='text' className={`value ${this.valueIsValid(this.state.temporaryValue) ? '' : 'invalid'}`} placeholder={this.props.placeholder}
value={this.state.temporaryValue}
onKeyDown={(e)=>this.handleValueInputKeyDown(e)}
onChange={(e)=>this.setState({ temporaryValue: e.target.value })}/>
{this.valueIsValid(this.state.temporaryValue) ? <div className='icon steel' onClick={(e)=>{ e.stopPropagation(); this.addValue(this.state.temporaryValue); }}><i className='fa fa-check fa-fw'/></div> : null}
</div>
</div>
{this.props.notes ? this.props.notes.map((n)=><p><small>{n}</small></p>) : null}
</div>
</div>;
}
});
module.exports = StringArrayEditor;

View File

@@ -1,8 +1,8 @@
require('./homebrew.less');
const React = require('react');
const createClass = require('create-react-class');
const { StaticRouter:Router, Switch, Route } = require('react-router-dom');
const queryString = require('query-string');
const { StaticRouter:Router } = require('react-router-dom/server');
const { Route, Routes, useParams, useSearchParams } = require('react-router-dom');
const HomePage = require('./pages/homePage/homePage.jsx');
const EditPage = require('./pages/editPage/editPage.jsx');
@@ -11,8 +11,27 @@ const SharePage = require('./pages/sharePage/sharePage.jsx');
const NewPage = require('./pages/newPage/newPage.jsx');
//const ErrorPage = require('./pages/errorPage/errorPage.jsx');
const PrintPage = require('./pages/printPage/printPage.jsx');
const AccountPage = require('./pages/accountPage/accountPage.jsx');
const WithRoute = (props)=>{
const params = useParams();
const [searchParams] = useSearchParams();
const queryParams = {};
for (const [key, value] of searchParams?.entries() || []) {
queryParams[key] = value;
}
const Element = props.el;
const allProps = {
...props,
...params,
query : queryParams,
el : undefined
};
return <Element {...allProps} />;
};
const Homebrew = createClass({
displayName : 'Homebrewery',
getDefaultProps : function() {
return {
url : '',
@@ -31,28 +50,36 @@ const Homebrew = createClass({
}
};
},
componentWillMount : function() {
getInitialState : function() {
global.account = this.props.account;
global.version = this.props.version;
global.enable_v3 = this.props.enable_v3;
global.enable_themes = this.props.enable_themes;
global.config = this.props.config;
return {};
},
render : function (){
return (
<Router location={this.props.url}>
<div className='homebrew'>
<Switch>
<Route path='/edit/:id' component={(routeProps)=><EditPage id={routeProps.match.params.id} brew={this.props.brew} />}/>
<Route path='/share/:id' component={(routeProps)=><SharePage id={routeProps.match.params.id} brew={this.props.brew} />}/>
<Route path='/new/:id' component={(routeProps)=><NewPage id={routeProps.match.params.id} brew={this.props.brew} />}/>
<Route path='/new' exact component={(routeProps)=><NewPage />}/>
<Route path='/user/:username' component={(routeProps)=><UserPage username={routeProps.match.params.username} brews={this.props.brews} />}/>
<Route path='/print/:id' component={(routeProps)=><PrintPage brew={this.props.brew} query={queryString.parse(routeProps.location.search)} />}/>
<Route path='/print' exact component={(routeProps)=><PrintPage query={queryString.parse(routeProps.location.search)} />}/>
<Route path='/changelog' exact component={()=><SharePage brew={this.props.brew} />}/>
<Route path='/faq' exact component={()=><SharePage brew={this.props.brew} />}/>
<Route path='/v3_preview' exact component={()=><HomePage brew={this.props.brew} />}/>
<Route path='/' component={()=><HomePage brew={this.props.brew} />}/>
</Switch>
<Routes>
<Route path='/edit/:id' element={<WithRoute el={EditPage} brew={this.props.brew} />} />
<Route path='/share/:id' element={<WithRoute el={SharePage} brew={this.props.brew} />} />
<Route path='/new/:id' element={<WithRoute el={NewPage} brew={this.props.brew} />} />
<Route path='/new' element={<WithRoute el={NewPage}/>} />
<Route path='/user/:username' element={<WithRoute el={UserPage} brews={this.props.brews} />} />
<Route path='/print/:id' element={<WithRoute el={PrintPage} brew={this.props.brew} />} />
<Route path='/print' element={<WithRoute el={PrintPage} />} />
<Route path='/changelog' element={<WithRoute el={SharePage} brew={this.props.brew} />} />
<Route path='/faq' element={<WithRoute el={SharePage} brew={this.props.brew} />} />
<Route path='/account' element={<WithRoute el={AccountPage} brew={this.props.brew} uiItems={this.props.brew.uiItems} />} />
<Route path='/legacy' element={<WithRoute el={HomePage} brew={this.props.brew} />} />
<Route path='/' element={<WithRoute el={HomePage} brew={this.props.brew} />} />
<Route path='/*' element={<WithRoute el={HomePage} brew={this.props.brew} />} />
</Routes>
</div>
</Router>
);

View File

@@ -6,10 +6,15 @@
height : 100%;
background-color : @steel;
flex-direction : column;
overflow-y : hidden;
.content{
position : relative;
height : calc(~"100% - 29px"); //Navbar height
flex : auto;
overflow-y : hidden;
}
&.listPage .content {
overflow-y : scroll;
}
}
}
}

View File

@@ -1,9 +1,10 @@
const React = require('react');
const createClass = require('create-react-class');
const Nav = require('naturalcrit/nav/nav.jsx');
const request = require('superagent');
const Account = createClass({
displayName : 'AccountNavItem',
getInitialState : function() {
return {
url : ''
@@ -18,13 +19,92 @@ const Account = createClass({
}
},
handleLogout : function(){
if(confirm('Are you sure you want to log out?')) {
// Reset divider position
window.localStorage.removeItem('naturalcrit-pane-split');
// Clear login cookie
let domain = '';
if(window.location?.hostname) {
let domainArray = window.location.hostname.split('.');
if(domainArray.length > 2){
domainArray = [''].concat(domainArray.slice(-2));
}
domain = domainArray.join('.');
}
document.cookie = `nc_session=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;samesite=lax;${domain ? `domain=${domain}` : ''}`;
window.location = '/';
}
},
localLogin : async function(){
const username = prompt('Enter username:');
if(!username) {return;}
const expiry = new Date;
expiry.setFullYear(expiry.getFullYear() + 1);
const token = await request.post('/local/login')
.send({ username })
.then((response)=>{
return response.body;
})
.catch((err)=>{
console.warn(err);
});
if(!token) return;
document.cookie = `nc_session=${token};expires=${expiry};path=/;samesite=lax;${window.domain ? `domain=${window.domain}` : ''}`;
window.location.reload(true);
},
render : function(){
// Logged in
if(global.account){
return <Nav.item href={`/user/${global.account.username}`} color='yellow' icon='fas fa-user'>
{global.account.username}
</Nav.item>;
return <Nav.dropdown>
<Nav.item
className='account'
color='orange'
icon='fas fa-user'
>
{global.account.username}
</Nav.item>
<Nav.item
href={`/user/${encodeURI(global.account.username)}`}
color='yellow'
icon='fas fa-beer'
>
brews
</Nav.item>
<Nav.item
className='account'
color='orange'
icon='fas fa-user'
href='/account'
>
account
</Nav.item>
<Nav.item
className='logout'
color='red'
icon='fas fa-power-off'
onClick={this.handleLogout}
>
logout
</Nav.item>
</Nav.dropdown>;
}
// Logged out
// LOCAL ONLY
if(global.config.local) {
return <Nav.item color='teal' icon='fas fa-sign-in-alt' onClick={this.localLogin}>
login
</Nav.item>;
};
// Logged out
// Production site
return <Nav.item href={`https://www.naturalcrit.com/login?redirect=${this.state.url}`} color='teal' icon='fas fa-sign-in-alt'>
login
</Nav.item>;

View File

@@ -7,6 +7,7 @@ const MAX_TITLE_LENGTH = 50;
const EditTitle = createClass({
displayName : 'EditTitleNavItem',
getDefaultProps : function() {
return {
title : '',

View File

@@ -0,0 +1,85 @@
require('./error-navitem.less');
const React = require('react');
const Nav = require('naturalcrit/nav/nav.jsx');
const createClass = require('create-react-class');
const ErrorNavItem = createClass({
getDefaultProps : function() {
return {
error : '',
parent : null
};
},
render : function() {
const clearError = ()=>{
const state = {
error : null
};
if(this.props.parent.state.isSaving) {
state.isSaving = false;
}
this.props.parent.setState(state);
};
const error = this.props.error;
const response = error.response;
const status = response.status;
const message = response.body?.message;
let errMsg = '';
try {
errMsg += `${error.toString()}\n\n`;
errMsg += `\`\`\`\n${error.stack}\n`;
errMsg += `${JSON.stringify(response.error, null, ' ')}\n\`\`\``;
console.log(errMsg);
} catch (e){}
if(status === 409) {
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={clearError}>
{message ?? 'Conflict: please refresh to get latest changes'}
</div>
</Nav.item>;
} else if(status === 412) {
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={clearError}>
{message ?? 'Your client is out of date. Please save your changes elsewhere and refresh.'}
</div>
</Nav.item>;
}
if(response.req.url.match(/^\/api.*Google.*$/m)){
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={clearError}>
Looks like your Google credentials have
expired! Visit our log in page to sign out
and sign back in with Google,
then try saving again!
<a target='_blank' rel='noopener noreferrer'
href={`https://www.naturalcrit.com/login?redirect=${window.location.href}`}>
<div className='confirm'>
Sign In
</div>
</a>
<div className='deny'>
Not Now
</div>
</div>
</Nav.item>;
}
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer'>
Looks like there was a problem saving. <br />
Report the issue <a target='_blank' rel='noopener noreferrer' href={`https://github.com/naturalcrit/homebrewery/issues/new?template=save_issue.yml&error-code=${encodeURIComponent(errMsg)}`}>
here
</a>.
</div>
</Nav.item>;
}
});
module.exports = ErrorNavItem;

View File

@@ -0,0 +1,77 @@
.navItem {
&.error {
position : relative;
background-color : @red;
}
.errorContainer{
animation-name: glideDown;
animation-duration: 0.4s;
position : absolute;
top : 100%;
left : 50%;
z-index : 1000;
width : 140px;
padding : 3px;
color : white;
background-color : #333;
border : 3px solid #444;
border-radius : 5px;
transform : translate(-50% + 3px, 10px);
text-align : center;
font-size : 10px;
font-weight : 800;
text-transform : uppercase;
a{
color : @teal;
}
&:before {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #444;
left: 53px;
top: -23px;
}
&:after {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #333;
left: 53px;
top: -19px;
}
.deny {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
border-left : 1px solid #666;
.animate(background-color);
&:hover{
background-color : red;
}
}
.confirm {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
color : white;
.animate(background-color);
&:hover{
background-color : teal;
}
}
}
}

View File

@@ -0,0 +1,36 @@
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const dedent = require('dedent-tabs').default;
const Nav = require('naturalcrit/nav/nav.jsx');
module.exports = function(props){
return <Nav.dropdown>
<Nav.item color='grey' icon='fas fa-question-circle'>
need help?
</Nav.item>
<Nav.item color='red' icon='fas fa-fw fa-bug'
href={`https://www.reddit.com/r/homebrewery/submit?selftext=true&text=${encodeURIComponent(dedent`
- **Browser(s)** :
- **Operating System** :
- **Legacy or v3 Renderer** :
- **Issue** : `)}`}
newTab={true}
rel='noopener noreferrer'>
report issue
</Nav.item>
<Nav.item color='green' icon='fas fa-question-circle'
href='/faq'
newTab={true}
rel='noopener noreferrer'>
FAQ
</Nav.item>
<Nav.item color='blue' icon='fas fa-fw fa-file-import'
href='/migrate'
newTab={true}
rel='noopener noreferrer'>
migrate
</Nav.item>
</Nav.dropdown>;
};

View File

@@ -1,13 +0,0 @@
const React = require('react');
const createClass = require('create-react-class');
const Nav = require('naturalcrit/nav/nav.jsx');
module.exports = function(props){
return <Nav.item
newTab={true}
color='red'
icon='fas fa-bug'
href={`https://www.reddit.com/r/homebrewery/submit?selftext=true&title=${encodeURIComponent('[Issue] Describe Your Issue Here')}`} >
report issue
</Nav.item>;
};

View File

@@ -6,6 +6,7 @@ const Nav = require('naturalcrit/nav/nav.jsx');
const PatreonNavItem = require('./patreon.navitem.jsx');
const Navbar = createClass({
displayName : 'Navbar',
getInitialState : function() {
return {
//showNonChromeWarning : false,
@@ -13,12 +14,10 @@ const Navbar = createClass({
};
},
componentDidMount : function() {
//const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
this.setState({
//showNonChromeWarning : !isChrome,
ver : window.version
});
getInitialState : function() {
return {
ver : global.version
};
},
/*

View File

@@ -1,5 +1,6 @@
@import 'naturalcrit/styles/colors.less';
@navbarHeight : 28px;
@keyframes coloring {
@keyframes pinkColoring {
//from {color: white;}
//to {color: red;}
0% {color: pink;}
@@ -54,6 +55,18 @@
text-align : center;
text-transform : initial;
}
.save-menu {
.dropdown {
z-index: 1000;
}
.navItem i.fa-power-off {
color : red;
&.active {
color : rgb(0, 182, 52);
filter : drop-shadow(0 0 2px rgba(0, 182, 52, 0.765))
}
}
}
.patreon.navItem{
border-left : 1px solid #666;
border-right : 1px solid #666;
@@ -62,19 +75,23 @@
}
i{
.animate(color);
animation-name: coloring;
animation-name: pinkColoring;
animation-duration: 2s;
color: pink;
}
}
.recent.navItem{
.recent.navItem {
position : relative;
.dropdown{
position : absolute;
top : 28px;
left : 0px;
z-index : 10000;
width : 100%;
position : absolute;
top : 28px;
left : 0px;
z-index : 10000;
width : 100%;
overflow : hidden auto;
max-height : ~"calc(100vh - 28px)";
scrollbar-color : #666 #333;
scrollbar-width : thin;
h4{
display : block;
box-sizing : border-box;
@@ -88,17 +105,46 @@
&:nth-of-type(2){ background-color: darken(@purple, 30%); }
}
.item{
#backgroundColorsHover;
.animate(background-color);
position : relative;
display : block;
box-sizing : border-box;
padding : 13px 5px;
padding : 8px 5px 13px;
background-color : #333;
color : white;
text-decoration : none;
border-top : 1px solid #888;
overflow : clip;
.clear{
display : none;
position : absolute;
top : 50%;
transform : translateY(-50%);
right : 0px;
width : 20px;
height : 100%;
background-color : #333;
opacity : 70%;
border-radius : 3px;
&:hover {
opacity : 100%;
}
i {
text-align : center;
font-size : 10px;
margin : 0;
height :100%;
width :100%;
}
}
&:hover{
background-color : @blue;
.clear{
display : grid;
place-content : center;
}
}
.title{
display : inline-block;
@@ -138,4 +184,7 @@
text-align : center;
}
}
.account.navItem{
min-width: 100px;
}
}

View File

@@ -10,7 +10,7 @@ const VIEW_KEY = 'homebrewery-recently-viewed';
const RecentItems = createClass({
DisplayName : 'RecentItems',
getDefaultProps : function() {
return {
storageKey : '',
@@ -119,14 +119,34 @@ const RecentItems = createClass({
});
},
removeItem : function(url, evt){
evt.preventDefault();
let edited = JSON.parse(localStorage.getItem(EDIT_KEY) || '[]');
let viewed = JSON.parse(localStorage.getItem(VIEW_KEY) || '[]');
edited = edited.filter((item)=>{ return (item.url !== url);});
viewed = viewed.filter((item)=>{ return (item.url !== url);});
localStorage.setItem(EDIT_KEY, JSON.stringify(edited));
localStorage.setItem(VIEW_KEY, JSON.stringify(viewed));
this.setState({
edit : edited,
view : viewed
});
},
renderDropdown : function(){
if(!this.state.showDropdown) return null;
const makeItems = (brews)=>{
return _.map(brews, (brew)=>{
return <a href={brew.url} className='item' key={brew.id} target='_blank' rel='noopener noreferrer' title={brew.title || '[ no title ]'}>
return _.map(brews, (brew, i)=>{
return <a href={brew.url} className='item' key={`${brew.id}-${i}`} target='_blank' rel='noopener noreferrer' title={brew.title || '[ no title ]'}>
<span className='title'>{brew.title || '[ no title ]'}</span>
<span className='time'>{Moment(brew.ts).fromNow()}</span>
<div className='clear' title='Remove from Recents' onClick={(e)=>{this.removeItem(`${brew.url}`, e);}}><i className='fas fa-times'></i></div>
</a>;
});
};

View File

@@ -8,6 +8,7 @@ const MAIN_URL = 'https://www.reddit.com/r/UnearthedArcana/submit?selftext=true'
const RedditShare = createClass({
displayName : 'RedditShareNavItem',
getDefaultProps : function() {
return {
brew : {

View File

@@ -0,0 +1,74 @@
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
const moment = require('moment');
const UIPage = require('../basePages/uiPage/uiPage.jsx');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const Account = require('../../navbar/account.navitem.jsx');
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const NaturalCritIcon = require('naturalcrit/svg/naturalcrit.svg.jsx');
const AccountPage = createClass({
displayName : 'AccountPage',
getDefaultProps : function() {
return {
brew : {},
uiItems : {}
};
},
getInitialState : function() {
return {
uiItems : this.props.uiItems
};
},
renderNavItems : function() {
return <Navbar>
<Nav.section>
<NewBrew />
<HelpNavItem />
<RecentNavItem />
<Account />
</Nav.section>
</Navbar>;
},
renderUiItems : function() {
return <>
<div className='dataGroup'>
<h1>Account Information <i className='fas fa-user'></i></h1>
<p><strong>Username: </strong> {this.props.uiItems.username || 'No user currently logged in'}</p>
<p><strong>Last Login: </strong> {moment(this.props.uiItems.issued).format('dddd, MMMM Do YYYY, h:mm:ss a ZZ') || '-'}</p>
</div>
<div className='dataGroup'>
<h3>Homebrewery Information <NaturalCritIcon /></h3>
<p><strong>Brews on Homebrewery: </strong> {this.props.uiItems.mongoCount}</p>
</div>
<div className='dataGroup'>
<h3>Google Information <i className='fab fa-google-drive'></i></h3>
<p><strong>Linked to Google: </strong> {this.props.uiItems.googleId ? 'YES' : 'NO'}</p>
{this.props.uiItems.googleId &&
<p>
<strong>Brews on Google Drive: </strong> {this.props.uiItems.googleCount ?? <>Unable to retrieve files - <a href='https://github.com/naturalcrit/homebrewery/discussions/1580'>follow these steps to renew your Google credentials.</a></>}
</p>
}
</div>
</>;
},
render : function(){
return <UIPage brew={this.props.brew}>
{this.renderUiItems()}
</UIPage>;
}
});
module.exports = AccountPage;

View File

@@ -4,20 +4,22 @@ const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
const moment = require('moment');
const request = require('superagent');
const request = require('../../../../utils/request-middleware.js');
const googleDriveIcon = require('../../../googleDrive.png');
const googleDriveIcon = require('../../../../googleDrive.png');
const dedent = require('dedent-tabs').default;
const BrewItem = createClass({
displayName : 'BrewItem',
getDefaultProps : function() {
return {
brew : {
title : '',
description : '',
authors : []
}
authors : [],
stubbed : true
},
reportError : ()=>{}
};
},
@@ -30,19 +32,15 @@ const BrewItem = createClass({
if(!confirm('Are you REALLY sure? You will lose editor access to this document.')) return;
}
if(this.props.brew.googleId) {
request.get(`/api/removeGoogle/${this.props.brew.googleId}${this.props.brew.editId}`)
.send()
.end(function(err, res){
request.delete(`/api/${this.props.brew.googleId ?? ''}${this.props.brew.editId}`)
.send()
.end((err, res)=>{
if(err) {
this.props.reportError(err);
} else {
location.reload();
});
} else {
request.delete(`/api/${this.props.brew.editId}`)
.send()
.end(function(err, res){
location.reload();
});
}
}
});
},
renderDeleteBrewLink : function(){
@@ -57,7 +55,7 @@ const BrewItem = createClass({
if(!this.props.brew.editId) return;
let editLink = this.props.brew.editId;
if(this.props.brew.googleId) {
if(this.props.brew.googleId && !this.props.brew.stubbed) {
editLink = this.props.brew.googleId + editLink;
}
@@ -70,7 +68,7 @@ const BrewItem = createClass({
if(!this.props.brew.shareId) return;
let shareLink = this.props.brew.shareId;
if(this.props.brew.googleId) {
if(this.props.brew.googleId && !this.props.brew.stubbed) {
shareLink = this.props.brew.googleId + shareLink;
}
@@ -83,7 +81,7 @@ const BrewItem = createClass({
if(!this.props.brew.shareId) return;
let shareLink = this.props.brew.shareId;
if(this.props.brew.googleId) {
if(this.props.brew.googleId && !this.props.brew.stubbed) {
shareLink = this.props.brew.googleId + shareLink;
}
@@ -93,7 +91,7 @@ const BrewItem = createClass({
},
renderGoogleDriveIcon : function(){
if(!this.props.brew.gDrive) return;
if(!this.props.brew.googleId) return;
return <span>
<img className='googleDriveIcon' src={googleDriveIcon} alt='googleDriveIcon' />
@@ -102,17 +100,35 @@ const BrewItem = createClass({
render : function(){
const brew = this.props.brew;
if(Array.isArray(brew.tags)) { // temporary fix until dud tags are cleaned
brew.tags = brew.tags?.filter((tag)=>tag); //remove tags that are empty strings
}
const dateFormatString = 'YYYY-MM-DD HH:mm:ss';
return <div className='brewItem'>
{brew.thumbnail &&
<div className='thumbnail' style={{ backgroundImage: `url(${brew.thumbnail})` }} >
</div>
}
<div className='text'>
<h2>{brew.title}</h2>
<p className='description'>{brew.description}</p>
</div>
<hr />
<div className='info'>
<span title={`Authors:\n${brew.authors.join('\n')}`}>
<i className='fas fa-user'/> {brew.authors.join(', ')}
{brew.tags?.length ? <>
<div className='brewTags' title={`Tags:\n${brew.tags.join('\n')}`}>
<i className='fas fa-tags'/>
{brew.tags.map((tag, idx)=>{
const matches = tag.match(/^(?:([^:]+):)?([^:]+)$/);
return <span key={idx} className={matches[1]}>{matches[2]}</span>;
})}
</div>
</> : <></>
}
<span title={`Authors:\n${brew.authors?.join('\n')}`}>
<i className='fas fa-user'/> {brew.authors?.join(', ')}
</span>
<br />
<span title={`Last viewed: ${moment(brew.lastViewed).local().format(dateFormatString)}`}>

View File

@@ -10,13 +10,29 @@
min-height : 105px;
margin-right : 15px;
margin-bottom : 15px;
padding : 5px 15px 2px 8px;
padding : 5px 15px 2px 6px;
padding-right : 15px;
border : 1px solid #c9ad6a;
border-radius : 5px;
-webkit-column-break-inside : avoid;
page-break-inside : avoid;
break-inside : avoid;
box-shadow : 0px 4px 5px 0px #333;
background-color : #cab2802e;
.thumbnail {
position: absolute;
width: 150px;
height: 100%;
top: 0;
right: 0;
z-index: -1;
background-size: contain;
background-repeat: no-repeat;
background-position: right top;
mask-image: linear-gradient(80deg, #0000 20%, #050 40%);
-webkit-mask-image: linear-gradient(80deg, #0000 20%, #050 40%);
opacity: 50%;
}
.text {
min-height : 54px;
h4{
@@ -27,13 +43,23 @@
.info{
position: initial;
bottom: 2px;
font-family : ScalySans;
font-family : ScalySansRemake;
font-size : 1.2em;
&>span{
margin-right : 12px;
line-height : 1.5em;
}
}
.brewTags span {
background-color: #c8ac6e3b;
margin: 2px;
padding: 2px;
border: 1px solid #c8ac6e;
border-radius: 4px;
white-space: nowrap;
display: inline-block;
font-weight: bold;
}
&:hover{
.links{
opacity : 1;

View File

@@ -0,0 +1,236 @@
/*eslint max-lines: ["warn", {"max": 300, "skipBlankLines": true, "skipComments": true}]*/
require('./listPage.less');
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const moment = require('moment');
const BrewItem = require('./brewItem/brewItem.jsx');
const USERPAGE_KEY_PREFIX = 'HOMEBREWERY-LISTPAGE';
const DEFAULT_SORT_TYPE = 'alpha';
const DEFAULT_SORT_DIR = 'asc';
const ListPage = createClass({
displayName : 'ListPage',
getDefaultProps : function() {
return {
brewCollection : [
{
title : '',
class : '',
brews : []
}
],
navItems : <></>,
reportError : null
};
},
getInitialState : function() {
// HIDE ALL GROUPS UNTIL LOADED
const brewCollection = this.props.brewCollection.map((brewGroup)=>{
brewGroup.visible = false;
return brewGroup;
});
return {
filterString : this.props.query?.filter || '',
sortType : this.props.query?.sort || null,
sortDir : this.props.query?.dir || null,
query : this.props.query,
brewCollection : brewCollection
};
},
componentDidMount : function() {
// SAVE TO LOCAL STORAGE WHEN LEAVING PAGE
window.onbeforeunload = this.saveToLocalStorage;
// LOAD FROM LOCAL STORAGE
if(typeof window !== 'undefined') {
const newSortType = (this.state.sortType ?? (localStorage.getItem(`${USERPAGE_KEY_PREFIX}-SORTTYPE`) || DEFAULT_SORT_TYPE));
const newSortDir = (this.state.sortDir ?? (localStorage.getItem(`${USERPAGE_KEY_PREFIX}-SORTDIR`) || DEFAULT_SORT_DIR));
this.updateUrl(this.state.filterString, newSortType, newSortDir);
const brewCollection = this.props.brewCollection.map((brewGroup)=>{
brewGroup.visible = (localStorage.getItem(`${USERPAGE_KEY_PREFIX}-VISIBILITY-${brewGroup.class}`) ?? 'true')=='true';
return brewGroup;
});
this.setState({
brewCollection : brewCollection,
sortType : newSortType,
sortDir : newSortDir
});
};
},
componentWillUnmount : function() {
window.onbeforeunload = function(){};
},
saveToLocalStorage : function() {
this.state.brewCollection.map((brewGroup)=>{
localStorage.setItem(`${USERPAGE_KEY_PREFIX}-VISIBILITY-${brewGroup.class}`, `${brewGroup.visible}`);
});
localStorage.setItem(`${USERPAGE_KEY_PREFIX}-SORTTYPE`, this.state.sortType);
localStorage.setItem(`${USERPAGE_KEY_PREFIX}-SORTDIR`, this.state.sortDir);
},
renderBrews : function(brews){
if(!brews || !brews.length) return <div className='noBrews'>No Brews.</div>;
return _.map(brews, (brew, idx)=>{
return <BrewItem brew={brew} key={idx} reportError={this.props.reportError}/>;
});
},
sortBrewOrder : function(brew){
if(!brew.title){brew.title = 'No Title';}
const mapping = {
'alpha' : _.deburr(brew.title.toLowerCase()),
'created' : moment(brew.createdAt).format(),
'updated' : moment(brew.updatedAt).format(),
'views' : brew.views,
'latest' : moment(brew.lastViewed).format()
};
return mapping[this.state.sortType];
},
handleSortOptionChange : function(event){
this.updateUrl(this.state.filterString, event.target.value, this.state.sortDir);
this.setState({
sortType : event.target.value
});
},
handleSortDirChange : function(event){
const newDir = this.state.sortDir == 'asc' ? 'desc' : 'asc';
this.updateUrl(this.state.filterString, this.state.sortType, newDir);
this.setState({
sortDir : newDir
});
},
renderSortOption : function(sortTitle, sortValue){
return <div className={`sort-option ${(this.state.sortType == sortValue ? 'active' : '')}`}>
<button
value={`${sortValue}`}
onClick={this.state.sortType == sortValue ? this.handleSortDirChange : this.handleSortOptionChange}
>
{`${sortTitle}`}
</button>
{this.state.sortType == sortValue &&
<i className={`sortDir fas ${this.state.sortDir == 'asc' ? 'fa-sort-up' : 'fa-sort-down'}`}></i>
}
</div>;
},
handleFilterTextChange : function(e){
this.setState({
filterString : e.target.value,
});
this.updateUrl(e.target.value, this.state.sortType, this.state.sortDir);
return;
},
updateUrl : function(filterTerm, sortType, sortDir){
const url = new URL(window.location.href);
const urlParams = new URLSearchParams(url.search);
urlParams.set('sort', sortType);
urlParams.set('dir', sortDir);
if(!filterTerm)
urlParams.delete('filter');
else
urlParams.set('filter', filterTerm);
url.search = urlParams;
window.history.replaceState(null, null, url);
},
renderFilterOption : function(){
return <div className='filter-option'>
<label>
<i className='fas fa-search'></i>
<input
type='search'
placeholder='filter title/description'
onChange={this.handleFilterTextChange}
value={this.state.filterString}
/>
</label>
</div>;
},
renderSortOptions : function(){
return <div className='sort-container'>
<h6>Sort by :</h6>
{this.renderSortOption('Title', 'alpha')}
{this.renderSortOption('Created Date', 'created')}
{this.renderSortOption('Updated Date', 'updated')}
{this.renderSortOption('Views', 'views')}
{/* {this.renderSortOption('Latest', 'latest')} */}
{this.renderFilterOption()}
</div>;
},
getSortedBrews : function(brews){
const testString = _.deburr(this.state.filterString).toLowerCase();
brews = _.filter(brews, (brew)=>{
const brewStrings = _.deburr([
brew.title,
brew.description,
brew.tags].join('\n')
.toLowerCase());
return brewStrings.includes(testString);
});
return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir);
},
toggleBrewCollectionState : function(brewGroupClass) {
this.setState((prevState)=>({
brewCollection : prevState.brewCollection.map(
(brewGroup)=>brewGroup.class === brewGroupClass ? { ...brewGroup, visible: !brewGroup.visible } : brewGroup
)
}));
},
renderBrewCollection : function(brewCollection){
if(brewCollection == []) return <div className='brewCollection'>
<h1>No Brews</h1>
</div>;
return _.map(brewCollection, (brewGroup, idx)=>{
return <div key={idx} className={`brewCollection ${brewGroup.class ?? ''}`}>
<h1 className={brewGroup.visible ? 'active' : 'inactive'} onClick={()=>{this.toggleBrewCollectionState(brewGroup.class);}}>{brewGroup.title || 'No Title'}</h1>
{brewGroup.visible ? this.renderBrews(this.getSortedBrews(brewGroup.brews)) : <></>}
</div>;
});
},
render : function(){
return <div className='listPage sitePage'>
<style>@layer V3_5ePHB, bundle;</style>
<link href='/themes/V3/5ePHB/style.css' rel='stylesheet'/>
{this.props.navItems}
{this.renderSortOptions()}
<div className='content V3'>
<div className='page'>
{this.renderBrewCollection(this.state.brewCollection)}
</div>
</div>
</div>;
}
});
module.exports = ListPage;

View File

@@ -0,0 +1,126 @@
.noColumns(){
column-count : auto;
column-fill : auto;
column-gap : auto;
column-width : auto;
-webkit-column-count : auto;
-moz-column-count : auto;
-webkit-column-width : auto;
-moz-column-width : auto;
-webkit-column-gap : auto;
-moz-column-gap : auto;
height : auto;
min-height : 279.4mm;
margin : 20px auto;
}
.listPage{
.content{
.page{
.noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer
&::after{
display : none;
}
.noBrews{
margin : 10px 0px;
font-size : 1.3em;
font-style : italic;
}
.brewCollection {
h1:hover{
cursor: pointer;
}
.active::before, .inactive::before {
font-family: 'Font Awesome 5 Free';
font-weight: 900;
font-size: 0.6cm;
padding-right: 0.5em;
}
.active {
color: var(--HB_Color_HeaderText);
}
.active::before {
content: '\f107';
}
.inactive {
color: #707070;
}
.inactive::before {
content: '\f105';
}
}
}
}
.sort-container{
font-family : 'Open Sans', sans-serif;
position : sticky;
top : 0;
left : 0;
width : 100%;
height : 30px;
background-color : #555;
border-top : 1px solid #666;
border-bottom : 1px solid #666;
color : white;
text-align : center;
z-index : 500;
display : flex;
justify-content : center;
align-items : baseline;
column-gap : 15px;
row-gap : 5px;
flex-wrap : wrap;
h6{
text-transform : uppercase;
font-family : 'Open Sans', sans-serif;
font-size : 11px;
font-weight : bold;
}
.sort-option {
display: flex;
align-items: center;
padding: 0 8px;
color: #ccc;
height: 100%;
&:hover{
background-color : #444;
}
&.active {
font-weight: bold;
color: #ddd;
background-color: #333;
button {
color: white;
font-weight: 800;
height: 100%;
& + .sortDir {
padding-left: 5px;
}
}
}
}
.filter-option {
margin-left: 20px;
background-color : transparent !important;
font-size : 11px;
i{
padding-right : 5px;
}
}
button{
background-color : transparent;
font-family : 'Open Sans', sans-serif;
text-transform : uppercase;
font-weight : normal;
font-size : 11px;
color : #ccc;
padding : 0;
}
}
}

View File

@@ -0,0 +1,38 @@
require('./uiPage.less');
const React = require('react');
const createClass = require('create-react-class');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../../navbar/navbar.jsx');
const NewBrewItem = require('../../../navbar/newbrew.navitem.jsx');
const HelpNavItem = require('../../../navbar/help.navitem.jsx');
const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both;
const Account = require('../../../navbar/account.navitem.jsx');
const UIPage = createClass({
displayName : 'UIPage',
render : function(){
return <div className='uiPage sitePage'>
<Navbar>
<Nav.section>
<Nav.item className='brewTitle'>{this.props.brew.title}</Nav.item>
</Nav.section>
<Nav.section>
<NewBrewItem />
<HelpNavItem />
<RecentNavItem />
<Account />
</Nav.section>
</Navbar>
<div className='content'>
{this.props.children}
</div>
</div>;
}
});
module.exports = UIPage;

View File

@@ -0,0 +1,47 @@
.uiPage{
.content{
overflow-y : hidden;
width : 90vw;
background-color: #f0f0f0;
font-family: 'Open Sans';
margin-left: auto;
margin-right: auto;
margin-top: 25px;
padding: 2% 4%;
font-size: 0.8em;
line-height: 1.8em;
.dataGroup{
padding: 6px 20px 15px;
border: 2px solid black;
border-radius: 5px;
margin: 5px 0px;
}
h1, h2, h3, h4{
font-weight: 900;
text-transform: uppercase;
margin: 0.5em 30% 0.25em 0;
border-bottom: 2px solid slategrey;
}
h1 {
font-size: 2em;
border-bottom: 2px solid darkslategrey;
margin-bottom: 0.5em;
margin-right: 0;
}
h2 {
font-size: 1.75em;
}
h3 {
font-size: 1.5em;
svg {
width: 19px;
}
}
h4 {
font-size: 1.25em;
}
strong {
font-weight: bold;
}
}
}

View File

@@ -3,15 +3,16 @@ require('./editPage.less');
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const request = require('superagent');
const request = require('../../utils/request-middleware.js');
const { Meta } = require('vitreum/headtags');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
const ReportIssue = require('../../navbar/issue.navitem.jsx');
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const PrintLink = require('../../navbar/print.navitem.jsx');
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
const Account = require('../../navbar/account.navitem.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
@@ -21,32 +22,18 @@ const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
const Markdown = require('naturalcrit/markdown.js');
const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js');
const googleDriveActive = require('../../googleDrive.png');
const googleDriveInactive = require('../../googleDriveMono.png');
const SAVE_TIMEOUT = 3000;
const EditPage = createClass({
displayName : 'EditPage',
getDefaultProps : function() {
return {
brew : {
text : '',
style : '',
shareId : null,
editId : null,
createdAt : null,
updatedAt : null,
gDrive : false,
trashed : false,
title : '',
description : '',
tags : '',
published : false,
authors : [],
systems : [],
renderer : 'legacy'
}
brew : DEFAULT_BREW_LOAD
};
},
@@ -59,9 +46,12 @@ const EditPage = createClass({
alertLoginToTransfer : false,
saveGoogle : this.props.brew.googleId ? true : false,
confirmGoogleTransfer : false,
errors : null,
error : null,
htmlErrors : Markdown.validate(this.props.brew.text),
url : ''
url : '',
autoSave : true,
autoSaveWarning : false,
unsavedTime : new Date()
};
},
savedBrew : null,
@@ -73,7 +63,14 @@ const EditPage = createClass({
this.savedBrew = JSON.parse(JSON.stringify(this.props.brew)); //Deep copy
this.trySave();
this.setState({ autoSave: JSON.parse(localStorage.getItem('AUTOSAVE_ON')) ?? true }, ()=>{
if(this.state.autoSave){
this.trySave();
} else {
this.setState({ autoSaveWarning: true });
}
});
window.onbeforeunload = ()=>{
if(this.state.isSaving || this.state.isPending){
return 'You have unsaved changes!';
@@ -113,24 +110,27 @@ const EditPage = createClass({
if(htmlErrors.length) htmlErrors = Markdown.validate(text);
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, { text: text }),
brew : { ...prevState.brew, text: text },
isPending : true,
htmlErrors : htmlErrors
}), ()=>this.trySave());
}), ()=>{if(this.state.autoSave) this.trySave();});
},
handleStyleChange : function(style){
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, { style: style }),
brew : { ...prevState.brew, style: style },
isPending : true
}), ()=>this.trySave());
}), ()=>{if(this.state.autoSave) this.trySave();});
},
handleMetaChange : function(metadata){
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, metadata),
brew : {
...prevState.brew,
...metadata
},
isPending : true,
}), ()=>this.trySave());
}), ()=>{if(this.state.autoSave) this.trySave();});
},
@@ -157,7 +157,10 @@ const EditPage = createClass({
this.setState((prevState)=>({
confirmGoogleTransfer : !prevState.confirmGoogleTransfer
}));
this.clearErrors();
this.setState({
error : null,
isSaving : false
});
},
closeAlerts : function(event){
@@ -173,24 +176,16 @@ const EditPage = createClass({
this.setState((prevState)=>({
saveGoogle : !prevState.saveGoogle,
isSaving : false,
errors : null
error : null
}), ()=>this.save());
},
clearErrors : function(){
this.setState({
errors : null,
isSaving : false
});
},
save : async function(){
if(this.debounceSave && this.debounceSave.cancel) this.debounceSave.cancel();
this.setState((prevState)=>({
isSaving : true,
errors : null,
error : null,
htmlErrors : Markdown.validate(prevState.brew.text)
}));
@@ -199,83 +194,29 @@ const EditPage = createClass({
const brew = this.state.brew;
brew.pageCount = ((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1;
if(this.state.saveGoogle) {
if(transfer) {
const res = await request
.post('/api/newGoogle/')
.send(brew)
.catch((err)=>{
console.log(err.status === 401
? 'Not signed in!'
: 'Error Transferring to Google!');
this.setState({ errors: err, saveGoogle: false });
});
const params = `${transfer ? `?${this.state.saveGoogle ? 'saveToGoogle' : 'removeFromGoogle'}=true` : ''}`;
const res = await request
.put(`/api/update/${brew.editId}${params}`)
.send(brew)
.catch((err)=>{
console.log('Error Updating Local Brew');
this.setState({ error: err });
});
if(!res) return;
if(!res) { return; }
console.log('Deleting Local Copy');
await request.delete(`/api/${brew.editId}`)
.send()
.catch((err)=>{
console.log('Error deleting Local Copy');
});
this.savedBrew = res.body;
history.replaceState(null, null, `/edit/${this.savedBrew.googleId}${this.savedBrew.editId}`); //update URL to match doc ID
} else {
const res = await request
.put(`/api/updateGoogle/${brew.editId}`)
.send(brew)
.catch((err)=>{
console.log(err.status === 401
? 'Not signed in!'
: 'Error Saving to Google!');
this.setState({ errors: err });
return;
});
this.savedBrew = res.body;
}
} else {
if(transfer) {
const res = await request.post('/api')
.send(brew)
.catch((err)=>{
console.log('Error creating Local Copy');
this.setState({ errors: err });
return;
});
await request.get(`/api/removeGoogle/${brew.googleId}${brew.editId}`)
.send()
.catch((err)=>{
console.log('Error Deleting Google Brew');
});
this.savedBrew = res.body;
history.replaceState(null, null, `/edit/${this.savedBrew.editId}`); //update URL to match doc ID
} else {
const res = await request
.put(`/api/update/${brew.editId}`)
.send(brew)
.catch((err)=>{
console.log('Error Updating Local Brew');
this.setState({ errors: err });
return;
});
this.savedBrew = res.body;
}
}
this.savedBrew = res.body;
history.replaceState(null, null, `/edit/${this.savedBrew.editId}`);
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, {
brew : { ...prevState.brew,
googleId : this.savedBrew.googleId ? this.savedBrew.googleId : null,
editId : this.savedBrew.editId,
shareId : this.savedBrew.shareId
}),
isPending : false,
isSaving : false,
shareId : this.savedBrew.shareId,
version : this.savedBrew.version
},
isPending : false,
isSaving : false,
unsavedTime : new Date()
}));
},
@@ -321,63 +262,15 @@ const EditPage = createClass({
},
renderSaveButton : function(){
if(this.state.errors){
let errMsg = '';
try {
errMsg += `${this.state.errors.toString()}\n\n`;
errMsg += `\`\`\`\n${this.state.errors.stack}\n`;
errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``;
console.log(errMsg);
} catch (e){}
if(this.state.autoSaveWarning && this.hasChanges()){
this.setAutosaveWarning();
const elapsedTime = Math.round((new Date() - this.state.unsavedTime) / 1000 / 60);
const text = elapsedTime == 0 ? 'Autosave is OFF.' : `Autosave is OFF, and you haven't saved for ${elapsedTime} minutes.`;
if(this.state.errors.status == '401'){
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={this.clearErrors}>
You must be signed in to a Google account
to save this to<br />Google Drive!<br />
<a target='_blank' rel='noopener noreferrer'
href={`https://www.naturalcrit.com/login?redirect=${this.state.url}`}>
<div className='confirm'>
Sign In
</div>
</a>
<div className='deny'>
Not Now
</div>
</div>
</Nav.item>;
}
if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={this.clearErrors}>
Looks like your Google credentials have
expired! Visit our log in page to sign out
and sign back in with Google,
then try saving again!
<a target='_blank' rel='noopener noreferrer'
href={`https://www.naturalcrit.com/login?redirect=${this.state.url}`}>
<div className='confirm'>
Sign In
</div>
</a>
<div className='deny'>
Not Now
</div>
</div>
</Nav.item>;
}
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
return <Nav.item className='save error' icon='fas fa-exclamation-circle'>
Reminder...
<div className='errorContainer'>
Looks like there was a problem saving. <br />
Report the issue <a target='_blank' rel='noopener noreferrer'
href={`https://github.com/naturalcrit/homebrewery/issues/new?body=${encodeURIComponent(errMsg)}`}>
here
</a>.
{text}
</div>
</Nav.item>;
}
@@ -388,13 +281,44 @@ const EditPage = createClass({
if(this.state.isPending && this.hasChanges()){
return <Nav.item className='save' onClick={this.save} color='blue' icon='fas fa-save'>Save Now</Nav.item>;
}
if(!this.state.isPending && !this.state.isSaving && this.state.autoSave){
return <Nav.item className='save saved'>auto-saved.</Nav.item>;
}
if(!this.state.isPending && !this.state.isSaving){
return <Nav.item className='save saved'>saved.</Nav.item>;
}
},
handleAutoSave : function(){
if(this.warningTimer) clearTimeout(this.warningTimer);
this.setState((prevState)=>({
autoSave : !prevState.autoSave,
autoSaveWarning : prevState.autoSave
}), ()=>{
localStorage.setItem('AUTOSAVE_ON', JSON.stringify(this.state.autoSave));
});
},
setAutosaveWarning : function(){
setTimeout(()=>this.setState({ autoSaveWarning: false }), 4000); // 4 seconds to display
this.warningTimer = setTimeout(()=>{this.setState({ autoSaveWarning: true });}, 900000); // 15 minutes between warnings
this.warningTimer;
},
errorReported : function(error) {
this.setState({
error
});
},
renderAutoSaveButton : function(){
return <Nav.item onClick={this.handleAutoSave}>
Autosave <i className={this.state.autoSave ? 'fas fa-power-off active' : 'fas fa-power-off'}></i>
</Nav.item>;
},
processShareId : function() {
return this.state.brew.googleId ?
return this.state.brew.googleId && !this.state.brew.stubbed ?
this.state.brew.googleId + this.state.brew.shareId :
this.state.brew.shareId;
},
@@ -406,7 +330,7 @@ const EditPage = createClass({
const title = `${this.props.brew.title} ${systems}`;
const text = `Hey guys! I've been working on this homebrew. I'd love your feedback. Check it out.
**[Homebrewery Link](https://homebrewery.naturalcrit.com/share/${shareLink})**`;
**[Homebrewery Link](${global.config.publicUrl}/share/${shareLink})**`;
return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(title)}&text=${encodeURIComponent(text)}`;
},
@@ -431,9 +355,15 @@ const EditPage = createClass({
<Nav.section>
{this.renderGoogleDriveIcon()}
{this.renderSaveButton()}
{this.state.error ?
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
<Nav.dropdown className='save-menu'>
{this.renderSaveButton()}
{this.renderAutoSaveButton()}
</Nav.dropdown>
}
<NewBrew />
<ReportIssue />
<HelpNavItem/>
<Nav.dropdown>
<Nav.item color='teal' icon='fas fa-share-alt'>
share
@@ -441,7 +371,7 @@ const EditPage = createClass({
<Nav.item color='blue' href={`/share/${shareLink}`}>
view
</Nav.item>
<Nav.item color='blue' onClick={()=>{navigator.clipboard.writeText(`https://homebrewery.naturalcrit.com/share/${shareLink}`);}}>
<Nav.item color='blue' onClick={()=>{navigator.clipboard.writeText(`${global.config.publicUrl}/share/${shareLink}`);}}>
copy url
</Nav.item>
<Nav.item color='blue' href={this.getRedditLink()} newTab={true} rel='noopener noreferrer'>
@@ -469,9 +399,10 @@ const EditPage = createClass({
onTextChange={this.handleTextChange}
onStyleChange={this.handleStyleChange}
onMetaChange={this.handleMetaChange}
reportError={this.errorReported}
renderer={this.state.brew.renderer}
/>
<BrewRenderer text={this.state.brew.text} style={this.state.brew.style} renderer={this.state.brew.renderer} errors={this.state.htmlErrors} />
<BrewRenderer text={this.state.brew.text} style={this.state.brew.style} renderer={this.state.brew.renderer} theme={this.state.brew.theme} errors={this.state.htmlErrors} />
</SplitPane>
</div>
</div>;

View File

@@ -13,10 +13,6 @@
cursor : initial;
color : #666;
}
&.error{
position : relative;
background-color : @red;
}
}
.googleDriveStorage {
position : relative;
@@ -26,74 +22,4 @@
padding : 0px;
margin : -5px;
}
.errorContainer{
animation-name: glideDown;
animation-duration: 0.4s;
position : absolute;
top : 100%;
left : 50%;
z-index : 100000;
width : 140px;
padding : 3px;
color : white;
background-color : #333;
border : 3px solid #444;
border-radius : 5px;
transform : translate(-50% + 3px, 10px);
text-align : center;
font-size : 10px;
font-weight : 800;
text-transform : uppercase;
a{
color : @teal;
}
&:before {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #444;
left: 53px;
top: -23px;
}
&:after {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #333;
left: 53px;
top: -19px;
}
.deny {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
border-left : 1px solid #666;
.animate(background-color);
&:hover{
background-color : red;
}
}
.confirm {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
color : white;
.animate(background-color);
&:hover{
background-color : teal;
}
}
}
}

View File

@@ -7,8 +7,8 @@ const cx = require('classnames');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
const PatreonNavItem = require('../../navbar/patreon.navitem.jsx');
const IssueNavItem = require('../../navbar/issue.navitem.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
@@ -33,7 +33,7 @@ const ErrorPage = createClass({
<Nav.section>
<PatreonNavItem />
<IssueNavItem />
<HelpNavItem />
<RecentNavItem />
</Nav.section>
</Navbar>

View File

@@ -3,45 +3,47 @@ const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
const request = require('superagent');
const request = require('../../utils/request-middleware.js');
const { Meta } = require('vitreum/headtags');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
const NewBrewItem = require('../../navbar/newbrew.navitem.jsx');
const IssueNavItem = require('../../navbar/issue.navitem.jsx');
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const AccountNavItem = require('../../navbar/account.navitem.jsx');
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
const Editor = require('../../editor/editor.jsx');
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js');
const HomePage = createClass({
displayName : 'HomePage',
getDefaultProps : function() {
return {
brew : {
text : '',
},
ver : '0.0.0'
brew : DEFAULT_BREW,
ver : '0.0.0'
};
},
getInitialState : function() {
return {
brew : this.props.brew,
welcomeText : this.props.brew.text
welcomeText : this.props.brew.text,
error : undefined
};
},
handleSave : function(){
request.post('/api')
.send({
text : this.state.brew.text
})
.send(this.state.brew)
.end((err, res)=>{
if(err) return;
if(err) {
this.setState({ error: err });
return;
}
const brew = res.body;
window.location = `/edit/${brew.editId}`;
});
@@ -51,14 +53,18 @@ const HomePage = createClass({
},
handleTextChange : function(text){
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, { text: text })
brew : { ...prevState.brew, text: text }
}));
},
renderNavbar : function(){
return <Navbar ver={this.props.ver}>
<Nav.section>
{this.state.error ?
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
null
}
<NewBrewItem />
<IssueNavItem />
<HelpNavItem />
<RecentNavItem />
<AccountNavItem />
</Nav.section>

View File

@@ -40,4 +40,11 @@
right : 350px;
}
}
.navItem.save{
background-color: @orange;
&:hover{
background-color: @green;
}
}
}

View File

@@ -0,0 +1,202 @@
# How to Convert a Legacy Document to v3
Here you will find a number of steps to guide you through converting a Legacy document into a Homebrewery v3 document.
**The first thing you'll want to do is switch the editor's rendering engine from `Legacy` to `v3`.** This will be the renderer we design features for moving forward.
There are some examples of Legacy code in the code pane if you need more context behind some of the changes.
**This document will evolve as users like yourself inform us of issues with it, or areas of conversion that it does not cover. _Please_ reach out if you have any suggestions for this document.**
## Simple Replacements
To make your life a little easier with this section, a text editor like [VSCode](https://code.visualstudio.com/) or Notepad will help a lot.
The following table describes Legacy and other document elements and their Homebrewery counterparts. A simple find/replace should get these in working order.
| Legacy / Other | Homebrewery |
|:----------------|:-----------------------------|
| `\pagebreak` | `\page` |
| `======` | `\page` |
| `\pagebreaknum` | `{{pageNumber,auto}}\n\page` |
| `@=====` | `{{pageNumber,auto}}\n\page` |
| `\columnbreak` | `\column` |
| `.phb` | `.page` |
## Classed or Styled Divs
Anything that relies on the following syntax can be changed to the new Homebrewery v3 curly brace syntax:
```
<div class="classTable wide">
...
</div>
```
:
The above example is equivalent to the following in v3 syntax.
```
{{classTable,wide
...
}}
```
:
Some examples of this include class tables (as shown above), descriptive blocks, notes, and spell lists.
\column
## Margins and Padding
Any manual margins and padding to push text down the page will likely need to be updated. Colons can be used on lines by themselves to push things down the page vertically if you'd rather not set pixel-perfect margins or padding.
## Notes
In Legacy, notes are denoted using markdown blockquote syntax. In Homebrewery v3, this is replaced by the curly brace syntax.
<!--
> ##### Catchy Title
> Useful Information
-->
{{note
##### Title
Information
}}
## Split Tables
Split tables also use the curly brace syntax, as the new renderer can handle style values separately from class names.
<!--
<div style='column-count:2'>
| d8 | Loot |
|:---:|:-----------:|
| 1 | 100gp |
| 2 | 200gp |
| 3 | 300gp |
| 4 | 400gp |
| d8 | Loot |
|:---:|:-----------:|
| 5 | 500gp |
| 6 | 600gp |
| 7 | 700gp |
| 8 | 1000gp |
</div>
-->
##### Typical Difficulty Classes
{{column-count:2
| Task Difficulty | DC |
|:----------------|:--:|
| Very easy | 5 |
| Easy | 10 |
| Medium | 15 |
| Task Difficulty | DC |
|:------------------|:--:|
| Hard | 20 |
| Very hard | 25 |
| Nearly impossible | 30 |
}}
## Blockquotes
Blockquotes are denoted by the `>` character at the beginning of the line. In Homebrewery's v3 renderer, they hold virtually no meaning and have no CSS styling. You are free to use blockquotes when styling your document or creating themes without needing to worry about your CSS affecting other parts of the document.
{{pageNumber,auto}}
\page
## Stat Blocks
There are pretty significant differences between stat blocks on the Legacy renderer and Homebrewery v3. This section contains a list of changes that will need to be made to update the stat block.
### Initial Changes
You will want to **remove all leading** `___` that started the stat block in Legacy, and replace that with `{{monster` before the stat block, and `}}` after it.
**If you want a frame** around the stat block, you can add `,frame` to the curly brace definition.
**If the stat block was wide**, make sure to add `,wide` to the curly brace definition.
### Blockquotes
The key difference is the lack of blockquotes. Legacy documents use the `>` symbol at the start of the line for each line in the stat block, and the v3 renderer does not. **You will want to remove all `>` characters at the beginning of all lines, and delete any leading spaces.**
### Lists
The basic characteristics and advanced characteristics sections are not list elements in Homebrewery. You will want to **remove all `-` or `*` characters from the beginning of lines.**
### Spacing
In order to have the correct spacing after removing the list elements, you will want to **add two colons between the name of each basic/advanced characteristic and its value.** _(see example in the code pane)_
Additionally, in the special traits and actions sections, you will want to add a colon at the beginning of each line that separates a trait/action from another, as seen below. **Any empty lines between special traits and actions should contain only a colon.** _(see example in the code pane)_
\column
{{margin-top:102px}}
<!--
### Legacy/Other Document Example:
___
> ## Centaur
> *Large Monstrosity, neutral good*
>___
> - **Armor Class** 12
> - **Hit Points** 45(6d10 + 12)
> - **Speed** 50ft.
>___
>|STR|DEX|CON|INT|WIS|CHA|
>|:---:|:---:|:---:|:---:|:---:|:---:|
>|18 (+4)|14 (+2)|14 (+2)|9 (-1)|13 (+1)|11 (+0)|
>___
> - **Skills** Athletics +6, Perception +3, Survival +3
> - **Senses** passive Perception 13
> - **Languages** Elvish, Sylvan
> - **Challenge** 2 (450 XP)
> ___
> ***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage.
>
> ***Second Thing*** More details.
>
> ### Actions
> ***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow.
>
> ***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage.
>
> ***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage.
>
> ***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage.
-->
### Homebrewery v3 Example:
{{monster
## Centaur
*Large monstrosity, neutral good*
___
**Armor Class** :: 12
**Hit Points** :: 45(6d10 + 12)
**Speed** :: 50ft.
___
| STR | DEX | CON | INT | WIS | CHA |
|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
|18 (+4)|14 (+2)|14 (+2)|9 (-1) |13 (+1)|11 (+0)|
___
**Skills** :: Athletics +6, Perception +3, Survival +3
**Senses** :: passive Perception 13
**Languages** :: Elvish, Sylvan
**Challenge** :: 2 (450 XP)
___
***Charge.*** If the centaur moves at least 30 feet straight toward a target and then hits it with a pike attack on the same turn, the target takes an extra 10 (3d6) piercing damage.
:
***Second Thing*** More details.
### Actions
***Multiattack.*** The centaur makes two attacks: one with its pike and one with its hooves or two with its longbow.
:
***Pike.*** *Melee Weapon Attack:* +6 to hit, reach 10 ft., one target. *Hit:* 9 (1d10 + 4) piercing damage.
:
***Hooves.*** *Melee Weapon Attack:* +6 to hit, reach 5 ft., one target. *Hit:* 11 (2d6 + 4) bludgeoning damage.
:
***Longbow.*** *Ranged Weapon Attack:* +4 to hit, range 150/600 ft., one target. *Hit:* 6 (1d8 + 2) piercing damage.
}}
{{pageNumber,auto}}

View File

@@ -1,49 +1,68 @@
# The Homebrewery
```css
.page #example + table td {
border:1px dashed #00000030;
}
.page {
padding-bottom : 1.1cm;
}
```
# The Homebrewery *V3*
Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen.
### Homebrew D&D made easy
The Homebrewery makes the creation and sharing of authentic looking Fifth-Edition homebrews easy. It uses [Markdown](https://help.github.com/articles/markdown-basics/) with a little CSS magic to make your brews come to life.
**Try it!** Simply edit the text on the left and watch it *update live* on the right.
**Try it!** Simply edit the text on the left and watch it *update live* on the right. Note that not every button is visible on this demo page. Click New {{fas,fa-plus-square}} in the navbar above to start brewing with all the features!
### Editing and Sharing
When you create your own homebrew you will be given a *edit url* and a *share url*. Any changes you make will be automatically saved to the database within a few seconds. Anyone with the edit url will be able to make edits to your homebrew. So be careful about who you share it with.
When you create your own homebrew, you will be given a *edit url* and a *share url*.
Any changes you make while on the *edit url* will be automatically saved to the database within a few seconds. Anyone with the edit url will be able to make edits to your homebrew, so be careful about who you share it with.
Anyone with the *share url* will be able to access a read-only version of your homebrew.
## Helping out
{{note
##### PDF Creation
PDF Printing works best in Google Chrome. If you are having quality/consistency issues, try using Chrome to print instead.
After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up.
* Set the **Destination** to "Save as PDF"
* Set **Paper Size** to "Letter"
* If you are printing on A4 paper, make sure to have the **PRINT → {{far,fa-file}} A4 Pagesize** snippet in your brew
* In **Options** make sure "Background Images" is selected.
* Hit print and enjoy! You're done!
If you want to save ink or have a monochrome printer, add the **PRINT → {{fas,fa-tint}} Ink Friendly** snippet to your brew!
}}
![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px}
{{artist,bottom:160px,left:100px
##### Homebrew Mug
[naturalcrit](https://homebrew.naturalcrit.com)
}}
{{pageNumber 1}}
{{footnote PART 1 | FANCINESS}}
\column
## New in V3.0.0
We've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div` and `span` in most cases. No raw HTML tags should be needed in a brew (*but can still be used if you insist*).
Much of the syntax and styling has changed in V3, so converting a Legacy brew to V3 (or vice-versa) will require tweaking your document. *However*, all brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "Legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew at any time.
Scroll down to the next page for a brief summary of the changes and new features available in V3!
#### New Things All The Time!
Check out the latest updates in the full changelog [here](/changelog).
### Helping out
Like this tool? Want to buy me a beer? [Head here](https://www.patreon.com/Naturalcrit) to help me keep the servers running.
This tool will **always** be free, never have ads, and I will never offer any "premium" features or whatever.
>##### PDF Exporting
> PDF Printing works best in Chrome. If you are having quality/consistency issues, try using Chrome to print instead.
>
> After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up.
> * Set the **Destination** to "Save as PDF"
> * Set **Paper Size** to "Letter"
> * If you are printing on A4 paper, make sure to have the "A4 page size snippet" in your brew
> * In **Options** make sure "Background Images" is selected.
> * Hit print and enjoy! You're done!
>
> If you want to save ink or have a monochrome printer, add the **Ink Friendly** snippet to your brew before you print
```
```
## V3.0.0 Released!
With the latest major update to *The Homebrewery* we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like **div** and **span** in most cases. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*).
**You can enable V3 via the <span class="fa fa-info-circle" style="text-indent:0"></span> Properties button!**
## New Things All The Time!
What's new in the latest update? Check out the full changelog [here](/changelog)
### Bugs, Issues, Suggestions?
Take a quick look at our [Frequently Asked Questions page](/faq) to see if your question has a handy answer.
@@ -52,53 +71,105 @@ Need help getting started or just the right look for your brew? Head to [r/Homeb
Have an idea to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues.
### Legal Junk
The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). This means you are free to use The Homebrewery codebase any way that you want, except for claiming that you made it yourself.
The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). Which means you are free to use The Homebrewery codebase any way that you want, except for claiming that you made it yourself.
If you wish to sell or in some way gain profit for what you make on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used.
### More Resources
If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources).
<img src='https://i.imgur.com/hMna6G0.png' style='position:absolute;bottom:50px;right:30px;width:280px' />
<div class='pageNumber'>1</div>
<div class='footnote'>PART 1 | FANCINESS</div>
If you wish to sell or in some way gain profit for what's created on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used.
#### Crediting Me
If you'd like to credit me in your brew, I'd be flattered! Just reference that you made it with The Homebrewery.
### More Homebrew Resources
<a href='https://discord.gg/by3deKx' target='_blank'><img src='/assets/discordOfManyThings.svg' alt='Discord of Many Things Logo' title='Discord of Many Things Logo' style='width:50px; float: right; padding-left: 10px;'/></a>
If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). The <a href='https://discord.gg/by3deKx' target='_blank' title='Discord of Many Things'>Discord of Many Things</a> is another great resource to connect with fellow homebrewers for help and feedback.
{{position:absolute;top:20px;right:20px;width:auto
<a href='https://discord.gg/by3deKx' target='_blank' title='Discord of Many Things' style='color: black;'><img src='/assets/discord.png' style='height:30px'/></a>
<a href='https://github.com/naturalcrit/homebrewery' target='_blank' title='Github' style='color: black; padding-left: 5px;'><img src='/assets/github.png' style='height:30px'/></a>
<a href='https://patreon.com/NaturalCrit' target='_blank' title='Patreon' style='color: black; padding-left: 5px;'><img src='/assets/patreon.png' style='height:30px'/></a>
<a href='https://www.reddit.com/r/homebrewery/' target='_blank' title='Reddit' style='color: black; padding-left: 5px;'><img src='/assets/reddit.png' style='height:30px'/></a>
}}
\page
# Appendix
## Markdown+
The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML.
### Not quite Markdown
Although the Homebrewery uses Markdown, to get all the styling features from the PHB, we had to get a little creative. Some base HTML elements are not used as expected and I've had to include a few new keywords.
In version 3.0.0, with a goal of adding maximum flexibility without users resorting to complex HTML to accomplish simple tasks, Homebrewery provides an extended verision of Markdown with additional syntax.
**You can enable V3 via the {{fa,fa-info-circle}} Properties button!**
___
* **Horizontal Rules** are generally used to *modify* existing elements into a different style. For example, a horizontal rule before a blockquote will give it the style of a Monster Stat Block instead of a note.
* **New Pages** are controlled by the author. It's impossible for the site to detect when the end of a page is reached, so indicate you'd like to start a new page, use the new page snippet to get the syntax.
* **Code Blocks** are used only to indicate column breaks. Since they don't allow for styling within them, they weren't that useful to use.
* **HTML** can be used to get *just* the right look for your homebrew. I've included some examples in the snippet icons above the editor.
### Curly Brackets
The biggest change in V3 is the replacement of `<span></span>` and `<div></div>` with `{{ }}` for a cleaner custom formatting. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Use double quotes if a value requires spaces. Spans and Blocks start the same:
#### Span
My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text has a class of `pen`, an id of `author`, is colored orange, and given a new font. The first space outside of quotes marks the beginning of the content.
#### Block
{{purple,#book,text-align:center,background:#aa88aa55
My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and centered text with a colored background. The opening and closing brackets are on lines separate from the block contents.
}}
```
```
#### Injection
For any element not inside a span or block, you can *inject* attributes using the same syntax but with single brackets in a single line immediately after the element.
Inline elements like *italics* {color:#D35400} or images require the injection on the same line.
### Images
Images must be hosted online somewhere, like imgur. You use the address to that image to reference it in your brew. Images can be included 'inline' with the text using Markdown-style images. However for background images more control is needed.
Block elements like headers require the injection to start on the line immediately following.
Background images should be included as HTML-style img tags. Using inline CSS you can precisely position your image where you'd like it to be. I have added both a inflow image snippet and a background image snippet to give you exmaples of how to do it.
##### A Purple Header
{color:purple,text-align:center}
\* *this does not currently work for tables yet*
### Vertical Spacing
A blank line can be achieved with a run of one or more `:` alone on a line. More `:`'s will create more space.
### Crediting Me
If you'd like to credit The Homebrewery in your brew, I'd be flattered! Just reference that you made it with The Homebrewery.
::
Much nicer than `<br><br><br><br><br>`
### Definition Lists
**Example** :: V3 uses HTML *definition lists* to create "lists" with hanging indents.
<div class='pageNumber'>2</div>
<div class='footnote'>PART 2 | BORING STUFF</div>
### Column Breaks
Column and page breaks with `\column` and `\page`.
\column
### Tables
Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below.
A cell can be spanned across columns by grouping multiple pipe `|` characters at the end of a cell.
Row spanning is achieved by adding a `^` at the end of a cell just before the `|`.
These can be combined to span a cell across both columns and rows. Cells must have the same colspan if they are to be rowspan'd.
##### Example
| Head A | Spanned Header ||
| Head B | Head C | Head D |
|:-------|:------:|:------:|
| 1A | 1B | 1C |
| 2A ^| 2B | 2C |
| 3A ^| 3B 3C ||
| 4A | 4B 4C^||
| 5A ^| 5B | 5C |
| 6A | 6B ^| 6C |
## Images
Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You use the address to that image to reference it in your brew\*.
Using *Curly Injection* you can assign an id, classes, or inline CSS properties to the Markdown image syntax.
![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px}
\* *When using Imgur-hosted images, use the "direct link", which can be found when you click into your image in the Imgur interace.*
## Snippets
Homebrewery comes with a series of *code snippets* found at the top of the editor pane that make it easy to create brews as quickly as possible. Just set your cursor where you want the code to appear in the editor pane, choose a snippet, and make the adjustments you need.
## Style Editor Panel
{{fa,fa-paint-brush}} Technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor accepts CSS for styling without requiring `<style>` tags-- anything that would have gone inside style tags before can now be placed here, and snippets that insert CSS styles are now located on that tab.
{{pageNumber 2}}
{{footnote PART 2 | BORING STUFF}}

View File

@@ -0,0 +1,108 @@
# The Homebrewery
Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen.
### Homebrew D&D made easy
The Homebrewery makes the creation and sharing of authentic looking Fifth-Edition homebrews easy. It uses [Markdown](https://help.github.com/articles/markdown-basics/) with a little CSS magic to make your brews come to life.
**Try it!** Simply edit the text on the left and watch it *update live* on the right.
### Editing and Sharing
When you create your own homebrew you will be given a *edit url* and a *share url*. Any changes you make will be automatically saved to the database within a few seconds. Anyone with the edit url will be able to make edits to your homebrew. So be careful about who you share it with.
Anyone with the *share url* will be able to access a read-only version of your homebrew.
## Helping out
Like this tool? Want to buy me a beer? [Head here](https://www.patreon.com/Naturalcrit) to help me keep the servers running.
This tool will **always** be free, never have ads, and I will never offer any "premium" features or whatever.
>##### PDF Exporting
> PDF Printing works best in Chrome. If you are having quality/consistency issues, try using Chrome to print instead.
>
> After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up.
> * Set the **Destination** to "Save as PDF"
> * Set **Paper Size** to "Letter"
> * If you are printing on A4 paper, make sure to have the "A4 page size snippet" in your brew
> * In **Options** make sure "Background Images" is selected.
> * Hit print and enjoy! You're done!
>
> If you want to save ink or have a monochrome printer, add the **Ink Friendly** snippet to your brew before you print
```
```
## V3.0.0 Released!
With the latest major update to *The Homebrewery* we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like **div** and **span** in most cases. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*).
**You can enable V3 via the <span class="fa fa-info-circle" style="text-indent:0"></span> Properties button!**
## New Things All The Time!
What's new in the latest update? Check out the full changelog [here](/changelog)
### Bugs, Issues, Suggestions?
Take a quick look at our [Frequently Asked Questions page](/faq) to see if your question has a handy answer.
Need help getting started or just the right look for your brew? Head to [r/Homebrewery](https://www.reddit.com/r/homebrewery/submit?selftext=true&title=%5BIssue%5D%20Describe%20Your%20Issue%20Here) and let us know!
Have an idea to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues.
### Legal Junk
The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). This means you are free to use The Homebrewery codebase any way that you want, except for claiming that you made it yourself.
If you wish to sell or in some way gain profit for what you make on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used.
### More Resources
<a href='https://discord.gg/by3deKx' target='_blank'><img src='/assets/discordOfManyThings.svg' alt='Discord of Many Things Logo' title='Discord of Many Things Logo' style='width:50px; float: right; padding-left: 10px;'/></a>
If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources). The <a href='https://discord.gg/by3deKx' target='_blank' title='Discord of Many Things'>Discord of Many Things</a> is another great resource to connect with fellow homebrewers for help and feedback.
<img src='https://i.imgur.com/hMna6G0.png' style='position:absolute;bottom:40px;right:30px;width:280px' />
<div class='pageNumber'>1</div>
<div class='footnote'>PART 1 | FANCINESS</div>
<div style='position: absolute; top: 20px; right: 20px;'>
<a href='https://discord.gg/by3deKx' target='_blank' title='Discord of Many Things'><img src='/assets/discord.png' style='height:30px'/></a>
<a href='https://github.com/naturalcrit/homebrewery' target='_blank' title='Github' style='color: black; padding-left: 5px;'><img src='/assets/github.png' style='height:30px'/></a>
<a href='https://patreon.com/NaturalCrit' target='_blank' title='Patreon' style='color: black; padding-left: 5px;'><img src='/assets/patreon.png' style='height:30px'/></a>
<a href='https://www.reddit.com/r/homebrewery/' target='_blank' title='Reddit' style='color: black; padding-left: 5px;'><img src='/assets/reddit.png' style='height:30px'/></a>
</div>
\page
# Appendix
### Not quite Markdown
Although the Homebrewery uses Markdown, to get all the styling features from the PHB, we had to get a little creative. Some base HTML elements are not used as expected and I've had to include a few new keywords.
___
* **Horizontal Rules** are generally used to *modify* existing elements into a different style. For example, a horizontal rule before a blockquote will give it the style of a Monster Stat Block instead of a note.
* **New Pages** are controlled by the author. It's impossible for the site to detect when the end of a page is reached, so indicate you'd like to start a new page, use the new page snippet to get the syntax.
* **Code Blocks** are used only to indicate column breaks. Since they don't allow for styling within them, they weren't that useful to use.
* **HTML** can be used to get *just* the right look for your homebrew. I've included some examples in the snippet icons above the editor.
```
```
### Images
Images must be hosted online somewhere, like imgur. You use the address to that image to reference it in your brew. Images can be included 'inline' with the text using Markdown-style images. However for background images more control is needed.
Background images should be included as HTML-style img tags. Using inline CSS you can precisely position your image where you'd like it to be. I have added both a inflow image snippet and a background image snippet to give you exmaples of how to do it.
### Crediting Me
If you'd like to credit The Homebrewery in your brew, I'd be flattered! Just reference that you made it with The Homebrewery.
<div class='pageNumber'>2</div>
<div class='footnote'>PART 2 | BORING STUFF</div>

View File

@@ -1,171 +0,0 @@
```css
.page #example + table td {
border:1px dashed #00000030;
}
.page {
padding-bottom : 1.1cm;
}
```
# The Homebrewery *V3*
Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen.
### Homebrew D&D made easy
The Homebrewery makes the creation and sharing of authentic looking Fifth-Edition homebrews easy. It uses [Markdown](https://help.github.com/articles/markdown-basics/) with a little CSS magic to make your brews come to life.
**Try it!** Simply edit the text on the left and watch it *update live* on the right. Note that not every button is visible on this demo page. Click New {{fas,fa-plus-square}} in the navbar above to start brewing with all the features!
### Editing and Sharing
When you create your own homebrew, you will be given a *edit url* and a *share url*.
Any changes you make while on the *edit url* will be automatically saved to the database within a few seconds. Anyone with the edit url will be able to make edits to your homebrew, so be careful about who you share it with.
Anyone with the *share url* will be able to access a read-only version of your homebrew.
{{note
##### PDF Creation
PDF Printing works best in Google Chrome. If you are having quality/consistency issues, try using Chrome to print instead.
After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up.
* Set the **Destination** to "Save as PDF"
* Set **Paper Size** to "Letter"
* If you are printing on A4 paper, make sure to have the **PRINT → {{far,fa-file}} A4 Pagesize** snippet in your brew
* In **Options** make sure "Background Images" is selected.
* Hit print and enjoy! You're done!
If you want to save ink or have a monochrome printer, add the **PRINT → {{fas,fa-tint}} Ink Friendly** snippet to your brew!
}}
![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px}
{{artist,bottom:160px,left:100px
##### Homebrew Mug
[naturalcrit](https://homebrew.naturalcrit.com)
}}
{{pageNumber 1}}
{{footnote PART 1 | FANCINESS}}
\column
## New in V3.0.0
With the latest major update to *The Homebrewery* we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div` and `span` in most cases. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*).
Much of the syntax and styling has changed in V3. Code in one version may be broken in the other, and updating an older brew to V3 will require more than just a copy and paste. *However*, all brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "Legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew at any time.
Scroll down to the next page for a brief summary of the changes and new features available in V3!
#### New Things All The Time!
Check out the latest updates in the full changelog [here](/changelog).
### Helping out
Like this tool? Want to buy me a beer? [Head here](https://www.patreon.com/Naturalcrit) to help me keep the servers running.
This tool will **always** be free, never have ads, and I will never offer any "premium" features or whatever.
### Bugs, Issues, Suggestions?
Take a quick look at our [Frequently Asked Questions page](/faq) to see if your question has a handy answer.
Need help getting started or just the right look for your brew? Head to [r/Homebrewery](https://www.reddit.com/r/homebrewery/submit?selftext=true&title=%5BIssue%5D%20Describe%20Your%20Issue%20Here) and let us know!
Have an idea to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues.
### Legal Junk
The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). Which means you are free to use The Homebrewery codebase any way that you want, except for claiming that you made it yourself.
If you wish to sell or in some way gain profit for what's created on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used.
#### Crediting Me
If you'd like to credit me in your brew, I'd be flattered! Just reference that you made it with The Homebrewery.
### More Homebrew Resources
Check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/wiki/resources).
\page
## Markdown+
The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML.
In version 3.0.0, with a goal of adding maximum flexibility without users resorting to complex HTML to accomplish simple tasks, Homebrewery provides an extended verision of Markdown with additional syntax.
**You can enable V3 via the {{fa,fa-info-circle}} Properties button!**
### Curly Brackets
The biggest change in V3 is the replacement of `<span></span>` and `<div></div>` with `{{ }}` for a cleaner custom formatting. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Use double quotes if a value requires spaces. Spans and Blocks start the same:
#### Span
My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text has a class of `pen`, an id of `author`, is colored orange, and given a new font. The first space outside of quotes marks the beginning of the content.
#### Block
{{purple,#book,text-align:center,background:#aa88aa55
My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and centered text with a colored background. The opening and closing brackets are on lines separate from the block contents.
}}
#### Injection
For any element not inside a span or block, you can *inject* attributes using the same syntax but with single brackets in a single line immediately after the element.
Inline elements like *italics* {color:#D35400} or images require the injection on the same line.
Block elements like headers require the injection to start on the line immediately following.
##### A Purple Header
{color:purple,text-align:center}
\* *this does not currently work for tables yet*
### Vertical Spacing
A blank line can be achieved with a run of one or more `:` alone on a line. More `:`'s will create more space.
::
Much nicer than `<br><br><br><br><br>`
### Definition Lists
V3 uses HTML *definition lists* to create "lists" with hanging indents.
**Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent".
### Column Breaks
Column and page breaks with `\column` and `\page`.
\column
### Tables
Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below.
A cell can be spanned across columns by grouping multiple pipe `|` characters at the end of a cell.
Row spanning is achieved by adding a `^` at the end of a cell just before the `|`.
These can be combined to span a cell across both columns and rows. Cells must have the same colspan if they are to be rowspan'd.
##### Example
| Head A | Spanned Header ||
| Head B | Head C | Head D |
|:-------|:------:|:------:|
| 1A | 1B | 1C |
| 2A ^| 2B | 2C |
| 3A ^| 3B 3C ||
| 4A | 4B 4C^||
| 5A ^| 5B | 5C |
| 6A | 6B ^| 6C |
## Images
Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You use the address to that image to reference it in your brew\*. Images can be included using Markdown-style images.
Using *Curly Injection* you can assign an id, classes, or specific inline CSS properties to the image.
![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px}
\* *When using Imgur-hosted images, use the "direct link", which can be found when you click into your image in the Imgur interace.*
## Snippets
Homebrewery comes with a series of *code snippets* found at the top of the editor pane that make it easy to create brews as quickly as possible. Just set your cursor where you want the code to appear in the editor pane, choose a snippet, and make the adjustments you need.
## Style Editor Panel
{{fa,fa-paint-brush}} Technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor accepts CSS for styling without requiring `<style>` tags-- anything that would have gone inside style tags before can now be placed here, and snippets that insert CSS styles are now located on that tab.
{{pageNumber 2}}
{{footnote PART 2 | BORING STUFF}}

View File

@@ -3,87 +3,74 @@ require('./newPage.less');
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const request = require('superagent');
const request = require('../../utils/request-middleware.js');
const Markdown = require('naturalcrit/markdown.js');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
const AccountNavItem = require('../../navbar/account.navitem.jsx');
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const IssueNavItem = require('../../navbar/issue.navitem.jsx');
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
const Editor = require('../../editor/editor.jsx');
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js');
const BREWKEY = 'homebrewery-new';
const STYLEKEY = 'homebrewery-new-style';
const METAKEY = 'homebrewery-new-meta';
const NewPage = createClass({
displayName : 'NewPage',
getDefaultProps : function() {
return {
brew : {
text : '',
style : undefined,
shareId : null,
editId : null,
createdAt : null,
updatedAt : null,
gDrive : false,
title : '',
description : '',
tags : '',
published : false,
authors : [],
systems : []
}
brew : DEFAULT_BREW
};
},
getInitialState : function() {
const brew = this.props.brew;
if(typeof window !== 'undefined') { //Load from localStorage if in client browser
const brewStorage = localStorage.getItem(BREWKEY);
const styleStorage = localStorage.getItem(STYLEKEY);
const metaStorage = JSON.parse(localStorage.getItem(METAKEY));
if(!brew.text || !brew.style){
brew.text = brew.text || (brewStorage ?? '');
brew.style = brew.style || (styleStorage ?? undefined);
// brew.title = metaStorage?.title || this.state.brew.title;
// brew.description = metaStorage?.description || this.state.brew.description;
brew.renderer = metaStorage?.renderer || brew.renderer;
}
}
return {
brew : {
text : brew.text || '',
style : brew.style || undefined,
gDrive : false,
title : brew.title || '',
description : brew.description || '',
tags : brew.tags || '',
published : false,
authors : [],
systems : brew.systems || [],
renderer : brew.renderer || 'legacy'
},
brew : brew,
isSaving : false,
saveGoogle : (global.account && global.account.googleId ? true : false),
errors : null,
error : null,
htmlErrors : Markdown.validate(brew.text)
};
},
componentDidMount : function() {
document.addEventListener('keydown', this.handleControlKeys);
const brew = this.state.brew;
if(!this.props.brew.shareId && typeof window !== 'undefined') { //Load from localStorage if in client browser
const brewStorage = localStorage.getItem(BREWKEY);
const styleStorage = localStorage.getItem(STYLEKEY);
const metaStorage = JSON.parse(localStorage.getItem(METAKEY));
brew.text = brewStorage ?? brew.text;
brew.style = styleStorage ?? brew.style;
// brew.title = metaStorage?.title || this.state.brew.title;
// brew.description = metaStorage?.description || this.state.brew.description;
brew.renderer = metaStorage?.renderer ?? brew.renderer;
brew.theme = metaStorage?.theme ?? brew.theme;
this.setState({
brew : brew
});
}
localStorage.setItem(BREWKEY, brew.text);
if(brew.style)
localStorage.setItem(STYLEKEY, brew.style);
localStorage.setItem(METAKEY, JSON.stringify({ 'renderer': brew.renderer, 'theme': brew.theme }));
},
componentWillUnmount : function() {
document.removeEventListener('keydown', this.handleControlKeys);
@@ -111,7 +98,7 @@ const NewPage = createClass({
if(htmlErrors.length) htmlErrors = Markdown.validate(text);
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, { text: text }),
brew : { ...prevState.brew, text: text },
htmlErrors : htmlErrors
}));
localStorage.setItem(BREWKEY, text);
@@ -119,30 +106,23 @@ const NewPage = createClass({
handleStyleChange : function(style){
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, { style: style }),
brew : { ...prevState.brew, style: style },
}));
localStorage.setItem(STYLEKEY, style);
},
handleMetaChange : function(metadata){
this.setState((prevState)=>({
brew : _.merge({}, prevState.brew, metadata),
brew : { ...prevState.brew, ...metadata },
}));
localStorage.setItem(METAKEY, JSON.stringify({
// 'title' : this.state.brew.title,
// 'description' : this.state.brew.description,
'renderer' : this.state.brew.renderer
'renderer' : this.state.brew.renderer,
'theme' : this.state.brew.theme
}));
},
clearErrors : function(){
this.setState({
errors : null,
isSaving : false
});
},
save : async function(){
this.setState({
isSaving : true
@@ -156,109 +136,27 @@ const NewPage = createClass({
const index = brew.text.indexOf('```\n\n');
brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`;
brew.text = brew.text.slice(index + 5);
};
}
brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1;
if(this.state.saveGoogle) {
const res = await request
.post('/api/newGoogle/')
const res = await request
.post(`/api${this.state.saveGoogle ? '?saveToGoogle=true' : ''}`)
.send(brew)
.catch((err)=>{
console.log(err.status === 401
? 'Not signed in!'
: 'Error Creating New Google Brew!');
this.setState({ isSaving: false, errors: err });
return;
console.log(err);
this.setState({ isSaving: false, error: err });
});
if(!res) return;
brew = res.body;
localStorage.removeItem(BREWKEY);
localStorage.removeItem(STYLEKEY);
localStorage.removeItem(METAKEY);
window.location = `/edit/${brew.googleId}${brew.editId}`;
} else {
request.post('/api')
.send(brew)
.end((err, res)=>{
if(err){
this.setState({
isSaving : false
});
return;
}
window.onbeforeunload = function(){};
brew = res.body;
localStorage.removeItem(BREWKEY);
localStorage.removeItem(STYLEKEY);
localStorage.removeItem(METAKEY);
window.location = `/edit/${brew.editId}`;
});
}
brew = res.body;
localStorage.removeItem(BREWKEY);
localStorage.removeItem(STYLEKEY);
localStorage.removeItem(METAKEY);
window.location = `/edit/${brew.editId}`;
},
renderSaveButton : function(){
if(this.state.errors){
let errMsg = '';
try {
errMsg += `${this.state.errors.toString()}\n\n`;
errMsg += `\`\`\`\n${this.state.errors.stack}\n`;
errMsg += `${JSON.stringify(this.state.errors.response.error, null, ' ')}\n\`\`\``;
console.log(errMsg);
} catch (e){}
if(this.state.errors.status == '401'){
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={this.clearErrors}>
You must be signed in to a Google account
to save this to<br />Google Drive!<br />
<a target='_blank' rel='noopener noreferrer'
href={`https://www.naturalcrit.com/login?redirect=${this.state.url}`}>
<div className='confirm'>
Sign In
</div>
</a>
<div className='deny'>
Not Now
</div>
</div>
</Nav.item>;
}
if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={this.clearErrors}>
Looks like your Google credentials have
expired! Visit our log in page to sign out
and sign back in with Google,
then try saving again!
<a target='_blank' rel='noopener noreferrer'
href={`https://www.naturalcrit.com/login?redirect=${this.state.url}`}>
<div className='confirm'>
Sign In
</div>
</a>
<div className='deny'>
Not Now
</div>
</div>
</Nav.item>;
}
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer'>
Looks like there was a problem saving. <br />
Report the issue <a target='_blank' rel='noopener noreferrer'
href={`https://github.com/naturalcrit/homebrewery/issues/new?body=${encodeURIComponent(errMsg)}`}>
here
</a>.
</div>
</Nav.item>;
}
if(this.state.isSaving){
return <Nav.item icon='fas fa-spinner fa-spin' className='save'>
save...
@@ -288,9 +186,12 @@ const NewPage = createClass({
</Nav.section>
<Nav.section>
{this.renderSaveButton()}
{this.state.error ?
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
this.renderSaveButton()
}
{this.renderLocalPrintButton()}
<IssueNavItem />
<HelpNavItem />
<RecentNavItem />
<AccountNavItem />
</Nav.section>
@@ -310,7 +211,7 @@ const NewPage = createClass({
onMetaChange={this.handleMetaChange}
renderer={this.state.brew.renderer}
/>
<BrewRenderer text={this.state.brew.text} style={this.state.brew.style} renderer={this.state.brew.renderer} errors={this.state.htmlErrors}/>
<BrewRenderer text={this.state.brew.text} style={this.state.brew.style} renderer={this.state.brew.renderer} theme={this.state.brew.theme} errors={this.state.htmlErrors}/>
</SplitPane>
</div>
</div>;

View File

@@ -4,79 +4,5 @@
&:hover{
background-color: @green;
}
&.error{
position : relative;
background-color : @red;
}
}
.errorContainer{
animation-name: glideDown;
animation-duration: 0.4s;
position : absolute;
top : 100%;
left : 50%;
z-index : 100000;
width : 140px;
padding : 3px;
color : white;
background-color : #333;
border : 3px solid #444;
border-radius : 5px;
transform : translate(-50% + 3px, 10px);
text-align : center;
font-size : 10px;
font-weight : 800;
text-transform : uppercase;
a{
color : @teal;
}
&:before {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #444;
left: 53px;
top: -23px;
}
&:after {
content: "";
width: 0px;
height: 0px;
position: absolute;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid transparent;
border-bottom: 10px solid #333;
left: 53px;
top: -19px;
}
.deny {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
border-left : 1px solid #666;
.animate(background-color);
&:hover{
background-color : red;
}
}
.confirm {
width : 48%;
margin : 1px;
padding : 5px;
background-color : #333;
display : inline-block;
color : white;
.animate(background-color);
&:hover{
background-color : teal;
}
}
}
}

View File

@@ -7,11 +7,14 @@ const { Meta } = require('vitreum/headtags');
const MarkdownLegacy = require('naturalcrit/markdownLegacy.js');
const Markdown = require('naturalcrit/markdown.js');
const Themes = require('themes/themes.json');
const BREWKEY = 'homebrewery-new';
const STYLEKEY = 'homebrewery-new-style';
const METAKEY = 'homebrewery-new-meta';
const PrintPage = createClass({
displayName : 'PrintPage',
getDefaultProps : function() {
return {
query : {},
@@ -26,9 +29,10 @@ const PrintPage = createClass({
getInitialState : function() {
return {
brew : {
text : this.props.brew.text || '',
style : this.props.brew.style || undefined,
renderer : this.props.brew.renderer || 'legacy'
text : this.props.brew.text || '',
style : this.props.brew.style || undefined,
renderer : this.props.brew.renderer || 'legacy',
theme : this.props.brew.theme || '5ePHB'
}
};
},
@@ -44,7 +48,8 @@ const PrintPage = createClass({
brew : {
text : brewStorage,
style : styleStorage,
renderer : metaStorage.renderer || 'legacy'
renderer : metaStorage?.renderer || 'legacy',
theme : metaStorage?.theme || '5ePHB'
}
};
});
@@ -55,7 +60,7 @@ const PrintPage = createClass({
renderStyle : function() {
if(!this.state.brew.style) return;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style> ${this.state.brew.style} </style>` }} />;
return <div style={{ display: 'none' }} dangerouslySetInnerHTML={{ __html: `<style>@layer styleTab {\n${this.state.brew.style}\n} </style>` }} />;
},
renderPages : function(){
@@ -81,9 +86,17 @@ const PrintPage = createClass({
},
render : function(){
const rendererPath = this.state.brew.renderer == 'V3' ? 'V3' : 'Legacy';
const themePath = this.state.brew.theme ?? '5ePHB';
const baseThemePath = Themes[rendererPath][themePath].baseTheme;
return <div>
<Meta name='robots' content='noindex, nofollow' />
<link href={`${this.state.brew.renderer == 'legacy' ? '/themes/5ePhbLegacy.style.css' : '/themes/5ePhb.style.css'}`} rel='stylesheet'/>
<link href={`/themes/${rendererPath}/Blank/style.css`} rel='stylesheet'/>
{baseThemePath &&
<link href={`/themes/${rendererPath}/${baseThemePath}/style.css`} rel='stylesheet'/>
}
<link href={`/themes/${rendererPath}/${themePath}/style.css`} rel='stylesheet'/>
{/* Apply CSS from Style tab */}
{this.renderStyle()}
<div className='pages' ref='pages'>

View File

@@ -12,20 +12,13 @@ const Account = require('../../navbar/account.navitem.jsx');
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js');
const SharePage = createClass({
displayName : 'SharePage',
getDefaultProps : function() {
return {
brew : {
title : '',
text : '',
style : '',
shareId : null,
createdAt : null,
updatedAt : null,
views : 0,
renderer : ''
}
brew : DEFAULT_BREW_LOAD
};
},
@@ -48,7 +41,7 @@ const SharePage = createClass({
},
processShareId : function() {
return this.props.brew.googleId ?
return this.props.brew.googleId && !this.props.brew.stubbed ?
this.props.brew.googleId + this.props.brew.shareId :
this.props.brew.shareId;
},
@@ -85,7 +78,7 @@ const SharePage = createClass({
</Navbar>
<div className='content'>
<BrewRenderer text={this.props.brew.text} style={this.props.brew.style} renderer={this.props.brew.renderer} />
<BrewRenderer text={this.props.brew.text} style={this.props.brew.style} renderer={this.props.brew.renderer} theme={this.props.brew.theme} />
</div>
</div>;
}

View File

@@ -1,10 +1,9 @@
require('./userPage.less');
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const cx = require('classnames');
const moment = require('moment');
const ListPage = require('../basePages/listPage/listPage.jsx');
const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx');
@@ -12,179 +11,70 @@ const Navbar = require('../../navbar/navbar.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const Account = require('../../navbar/account.navitem.jsx');
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
const BrewItem = require('./brewItem/brewItem.jsx');
const ReportIssue = require('../../navbar/issue.navitem.jsx');
// const brew = {
// title : 'SUPER Long title woah now',
// authors : []
// };
//const BREWS = _.times(25, ()=>{ return brew;});
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
const UserPage = createClass({
displayName : 'UserPage',
getDefaultProps : function() {
return {
username : '',
brews : [],
query : '',
error : null
};
},
getInitialState : function() {
return {
sortType : 'alpha',
sortDir : 'asc',
filterString : ''
};
},
getUsernameWithS : function() {
if(this.props.username.endsWith('s'))
return `${this.props.username}'`;
return `${this.props.username}'s`;
},
const usernameWithS = this.props.username + (this.props.username.endsWith('s') ? `` : `s`);
renderBrews : function(brews){
if(!brews || !brews.length) return <div className='noBrews'>No Brews.</div>;
const sortedBrews = this.sortBrews(brews);
return _.map(sortedBrews, (brew, idx)=>{
return <BrewItem brew={brew} key={idx}/>;
});
},
sortBrewOrder : function(brew){
if(!brew.title){brew.title = 'No Title';}
const mapping = {
'alpha' : _.deburr(brew.title.toLowerCase()),
'created' : moment(brew.createdAt).format(),
'updated' : moment(brew.updatedAt).format(),
'views' : brew.views,
'latest' : moment(brew.lastViewed).format()
};
return mapping[this.state.sortType];
},
sortBrews : function(brews){
return _.orderBy(brews, (brew)=>{ return this.sortBrewOrder(brew); }, this.state.sortDir);
},
handleSortOptionChange : function(event){
this.setState({
sortType : event.target.value
});
},
handleSortDirChange : function(event){
this.setState({
sortDir : `${(this.state.sortDir == 'asc' ? 'desc' : 'asc')}`
});
},
renderSortOption : function(sortTitle, sortValue){
return <td>
<button
value={`${sortValue}`}
onClick={this.handleSortOptionChange}
className={`sortOption ${(this.state.sortType == sortValue ? 'active' : '')}`}
>
{`${sortTitle}`}
</button>
</td>;
},
handleFilterTextChange : function(e){
this.setState({
filterString : e.target.value
});
return;
},
renderFilterOption : function(){
return <td>
<label className='filterOption'>
<i className='fas fa-search'></i>
<input
type='search'
placeholder='search title/description'
onChange={this.handleFilterTextChange}
/>
</label>
</td>;
},
renderSortOptions : function(){
return <div className='sort-container'>
<table>
<tbody>
<tr>
<td>
<h6>Sort by :</h6>
</td>
{this.renderSortOption('Title', 'alpha')}
{this.renderSortOption('Created Date', 'created')}
{this.renderSortOption('Updated Date', 'updated')}
{this.renderSortOption('Views', 'views')}
{/* {this.renderSortOption('Latest', 'latest')} */}
<td>
<h6>Direction :</h6>
</td>
<td>
<button
onClick={this.handleSortDirChange}
className='sortDir'
>
{`${(this.state.sortDir == 'asc' ? '\u25B2 ASC' : '\u25BC DESC')}`}
</button>
</td>
{this.renderFilterOption()}
</tr>
</tbody>
</table>
</div>;
},
getSortedBrews : function(){
const testString = _.deburr(this.state.filterString).toLowerCase();
const brewCollection = this.state.filterString ? _.filter(this.props.brews, (brew)=>{
return (_.deburr(brew.title).toLowerCase().includes(testString)) ||
(_.deburr(brew.description).toLowerCase().includes(testString));
}) : this.props.brews;
return _.groupBy(brewCollection, (brew)=>{
const brews = _.groupBy(this.props.brews, (brew)=>{
return (brew.published ? 'published' : 'private');
});
const brewCollection = [
{
title : `${usernameWithS} published brews`,
class : 'published',
brews : brews.published
}
];
if(this.props.username == global.account?.username){
brewCollection.push(
{
title : `${usernameWithS} unpublished brews`,
class : 'unpublished',
brews : brews.private
}
);
}
return {
brewCollection : brewCollection
};
},
errorReported : function(error) {
this.setState({
error
});
},
navItems : function() {
return <Navbar>
<Nav.section>
{this.state.error ?
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
null
}
<NewBrew />
<HelpNavItem />
<RecentNavItem />
<Account />
</Nav.section>
</Navbar>;
},
render : function(){
const brews = this.getSortedBrews();
return <div className='userPage sitePage'>
<link href='/themes/5ePhbLegacy.style.css' rel='stylesheet'/>
<Navbar>
<Nav.section>
<NewBrew />
<ReportIssue />
<RecentNavItem />
<Account />
</Nav.section>
</Navbar>
<div className='content V3'>
<div className='phb'>
{this.renderSortOptions()}
<div className='published'>
<h1>{this.getUsernameWithS()} published brews</h1>
{this.renderBrews(brews.published)}
</div>
{this.props.username == global.account?.username &&
<div className='unpublished'>
<h1>{this.getUsernameWithS()} unpublished brews</h1>
{this.renderBrews(brews.private)}
</div>
}
</div>
</div>
</div>;
return <ListPage brewCollection={this.state.brewCollection} navItems={this.navItems()} query={this.props.query} reportError={this.errorReported}></ListPage>;
}
});

View File

@@ -1,77 +0,0 @@
.noColumns(){
column-count : auto;
column-fill : auto;
column-gap : auto;
column-width : auto;
-webkit-column-count : auto;
-moz-column-count : auto;
-webkit-column-width : auto;
-moz-column-width : auto;
-webkit-column-gap : auto;
-moz-column-gap : auto;
}
.userPage{
.content{
overflow-y : scroll;
.phb{
.noColumns();
height : auto;
min-height : 279.4mm;
margin : 20px auto;
&::after{
display : none;
}
.noBrews{
margin : 10px 0px;
font-size : 1.3em;
font-style : italic;
}
}
}
.sort-container{
font-family : 'Open Sans', sans-serif;
position : fixed;
top : 35px;
left : calc(50vw - 408px);
border : 2px solid #58180D;
width : 800px;
background-color : #EEE5CE;
padding : 2px;
text-align : center;
z-index : 15;
h6{
text-transform : uppercase;
font-family : 'Open Sans', sans-serif;
font-size : 11px;
font-weight : bold;
color : #58180D;
}
table{
margin : 0px;
vertical-align : middle;
tbody tr{
background-color: transparent !important;
i{
padding-right : 5px
}
button{
background-color : transparent;
color : #58180D;
font-family : 'Open Sans', sans-serif;
font-size : 11px;
text-transform : uppercase;
font-weight : normal;
&.active{
font-weight : bold;
border : 2px solid #58180D;
}
&.sortDir{
width : 75px;
}
}
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,12 @@
const request = require('superagent');
const addHeader = (request)=>request.set('Homebrewery-Version', global.version);
const requestMiddleware = {
get : (path)=>addHeader(request.get(path)),
put : (path)=>addHeader(request.put(path)),
post : (path)=>addHeader(request.post(path)),
delete : (path)=>addHeader(request.delete(path)),
};
module.exports = requestMiddleware;

View File

@@ -0,0 +1,15 @@
.fac {
display : inline-block;
}
.position-top-left {
content: url('../icons/position-top-left.svg');
}
.position-top-right {
content: url('../icons/position-top-right.svg');
}
.position-bottom-left {
content: url('../icons/position-bottom-left.svg');
}
.position-bottom-right {
content: url('../icons/position-bottom-right.svg');
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><path fill-opacity=".995" d="M495 135.49V0H359.51v135.49M482.72 11.37v113.26H371.9V11.37zM135.49 315.245v-135.49H0v135.49m123.21-124.12v113.26H12.39v-113.26zm12.28-55.635V0H0v135.49M123.21 11.37v113.26H12.39V11.37zm192.035 124.12V0h-135.49v135.49m123.21-124.12v113.26h-110.82V11.37zm12.28 303.875v-135.49h-135.49v135.49m123.21-124.12v113.26h-110.82v-113.26zM495 315.245v-135.49H359.51v135.49m123.21-124.12v113.26H371.9v-113.26zM135.49 495V359.51H0V495Zm179.755 0V359.51h-135.49V495m123.21-124.12v113.26h-110.82V370.88zM495 495V359.51H359.51V495m123.21-124.12v113.26H371.9V370.88z"/></svg>

After

Width:  |  Height:  |  Size: 650 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><g fill-opacity=".995"><path d="M135.49 0H0v135.49h135.49M11.37 12.28h113.26V123.1H11.37zM315.245 359.51h-135.49V495h135.49m-124.12-123.21h113.26v110.82h-113.26zM135.49 359.51H0V495h135.49M11.37 371.79h113.26v110.82H11.37zM135.49 179.755H0v135.49h135.49M11.37 192.035h113.26v110.82H11.37zM315.245 179.755h-135.49v135.49h135.49m-124.12-123.21h113.26v110.82h-113.26zM315.245 0h-135.49v135.49h135.49M191.125 12.28h113.26V123.1h-113.26zM495 359.51H359.51V495H495ZM495 179.755H359.51v135.49H495m-124.12-123.21h113.26v110.82H370.88zM495 0H359.51v135.49H495M370.88 12.28h113.26V123.1H370.88z"/></g></svg>

After

Width:  |  Height:  |  Size: 659 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><path fill-opacity=".995" d="M359.51 495H495V359.51H359.51m124.12 123.21H370.37V371.9h113.26zM179.755 135.49h135.49V0h-135.49m124.12 123.21h-113.26V12.39h113.26zM359.51 135.49H495V0H359.51m124.12 123.21H370.37V12.39h113.26zM359.51 315.245H495v-135.49H359.51m124.12 123.21H370.37v-110.82h113.26zM179.755 315.245h135.49v-135.49h-135.49m124.12 123.21h-113.26v-110.82h113.26zM179.755 495h135.49V359.51h-135.49m124.12 123.21h-113.26V371.9h113.26zM0 135.49h135.49V0H0ZM0 315.245h135.49v-135.49H0m124.12 123.21H10.86v-110.82h113.26zM0 495h135.49V359.51H0m124.12 123.21H10.86V371.9h113.26z"/></svg>

After

Width:  |  Height:  |  Size: 652 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 495 495"><g fill-opacity=".995"><path d="M0 359.51V495h135.49V359.51M12.28 483.63V370.37H123.1v113.26zM359.51 179.755v135.49H495v-135.49m-123.21 124.12v-113.26h110.82v113.26zM359.51 359.51V495H495V359.51M371.79 483.63V370.37h110.82v113.26zM179.755 359.51V495h135.49V359.51m-123.21 124.12V370.37h110.82v113.26zM179.755 179.755v135.49h135.49v-135.49m-123.21 124.12v-113.26h110.82v113.26zM0 179.755v135.49h135.49v-135.49M12.28 303.875v-113.26H123.1v113.26zM359.51 0v135.49H495V0ZM179.755 0v135.49h135.49V0m-123.21 124.12V10.86h110.82v113.26zM0 0v135.49h135.49V0M12.28 124.12V10.86H123.1v113.26z"/></g></svg>

After

Width:  |  Height:  |  Size: 657 B

View File

@@ -1,19 +1,31 @@
module.exports = async(name, title = '', props = {})=>{
return `
<!DOCTYPE html>
<html>
<head>
<link href="//use.fontawesome.com/releases/v5.15.1/css/all.css" rel="stylesheet" />
<link href="//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700" rel="stylesheet" type="text/css" />
<link href=${`/${name}/bundle.css`} rel='stylesheet' />
<link rel="icon" href="/assets/homebrew/favicon.ico" type="image/x-icon" />
<title>${title.length ? `${title} - The Homebrewery`: 'The Homebrewery - NaturalCrit'}</title>
</head>
<body>
<main id="reactRoot">${require(`../build/${name}/ssr.js`)(props)}</main>
<script src=${`/${name}/bundle.js`}></script>
<script>start_app(${JSON.stringify(props)})</script>
</body>
</html>
`;
const template = async function(name, title='', props = {}){
const ogTags = [];
const ogMeta = props.ogMeta ?? {};
Object.entries(ogMeta).forEach(([key, value])=>{
if(!value) return;
const tag = `<meta property="og:${key}" content="${value}">`;
ogTags.push(tag);
});
const ogMetaTags = ogTags.join('\n');
return `<!DOCTYPE html>
<html>
<head>
<link href="//use.fontawesome.com/releases/v5.15.1/css/all.css" rel="stylesheet" />
<link href="//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700" rel="stylesheet" type="text/css" />
<link href=${`/${name}/bundle.css`} rel='stylesheet' />
<link rel="icon" href="/assets/favicon.ico" type="image/x-icon" />
${ogMetaTags}
<meta name="twitter:card" content="summary">
<title>${title.length ? `${title} - The Homebrewery`: 'The Homebrewery - NaturalCrit'}</title>
</head>
<body>
<main id="reactRoot">${require(`../build/${name}/ssr.js`)(props)}</main>
<script src=${`/${name}/bundle.js`}></script>
<script>start_app(${JSON.stringify(props)})</script>
</body>
</html>
`;
};
module.exports = template;

View File

@@ -3,5 +3,7 @@
"naturalcrit_url" : "local.naturalcrit.com:8010",
"secret" : "secret",
"web_port" : 8000,
"enable_v3" : true
"enable_v3" : true,
"local_environments" : ["docker", "local"],
"publicUrl" : "https://homebrewery.naturalcrit.com"
}

View File

@@ -10,7 +10,7 @@ These instructions assume that you are installing to a completely new, fresh Fre
2. Install wget (`pkg install -y wget`). On a fresh jail, you will be prompted to press 'Y' to set up `pkg`.
3. Download the installation script (`wget --no-check-certificate https://raw.githubusercontent.com/naturalcrit/homebrewery/master/freebsd/install.sh`). The parameter `--no-check-certificate` is required as we haven't set up any trusted certificates/authorities yet.
3. Download the installation script (`wget --no-check-certificate https://raw.githubusercontent.com/naturalcrit/homebrewery/master/install/freebsd/install.sh`). The parameter `--no-check-certificate` is required as we haven't set up any trusted certificates/authorities yet.
4. Make the downloaded file executable (`chmod +x install.sh`).

35
install/README.UBUNTU.md Normal file
View File

@@ -0,0 +1,35 @@
# Ubuntu Installation Instructions
## Before Installing
These instructions assume that you are installing to a completely new, fresh Ubuntu installation. As such, some steps will not be necessary if you are installing to an existing Ubuntu instance.
## Installation instructions
1. Install Ubuntu.
2. Install wget (`apt install -y wget`). This may already be installed, depending on your exact Ubuntu version.
3. Download the installation script (`wget https://raw.githubusercontent.com/naturalcrit/homebrewery/master/install/ubuntu/install.sh`).
4. Make the downloaded file executable (`chmod +x install.sh`).
5. Run the script (`sudo ./install.sh`). This will automatically download all of the required packages, install both them and HomeBrewery, configure the system and finally start HomeBrewery.
**NOTE:** At this time, the script **ONLY** installs HomeBrewery. It does **NOT** install the NaturalCrit login system, as that is currently a completely separate project.
---
### Testing
These installation instructions have been tested on the following Ubuntu releases:
- *ubuntu-20.04.3-desktop-amd64*
## Final Notes
While this installation process works successfully at the time of writing (December 19, 2021), it relies on all of the Node.JS packages used in the HomeBrewery project retaining their cross-platform capabilities to continue to function. This is one of the inherent advantages of Node.JS, but it is by no means guaranteed and as such, functionality or even installation may fail without warning at some point in the future.
Regards,
G
December 19, 2021

View File

@@ -0,0 +1,13 @@
[Unit]
Description=Homebrewery Web Server
[Service]
User=root
After=mongodb
Environment=NODE_ENV=local
WorkingDirectory=/usr/local/homebrewery
ExecStart=node server.js
Restart=always
[Install]
WantedBy=multi-user.target

34
install/ubuntu/install.sh Normal file
View File

@@ -0,0 +1,34 @@
#!/bin/sh
# Install CURL and add required NodeJS source to package repo
echo ::Install CURL
apt install -y curl
echo ::Add NodeJS source to package repo
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
# Install required packages
echo ::Install Homebrewery requirements
apt satisfy -y git nodejs npm mongodb
# Clone Homebrewery repo
echo ::Get Homebrewery files
cd /usr/local/
git clone https://github.com/naturalcrit/homebrewery.git
# Install Homebrewery
echo ::Install Homebrewery
cd homebrewery
npm install
npm audit fix
npm run postinstall
# Create Homebrewery service
echo ::Create Homebrewery service
ln -s /usr/local/homebrewery/install/ubuntu/etc/systemd/system/homebrewery.service /etc/systemd/system/homebrewery.service
systemctl daemon-reload
echo ::Set Homebrewery to start automatically
systemctl enable homebrewery
# Start Homebrewery
echo ::Start Homebrewery
systemctl start homebrewery

25520
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "homebrewery",
"description": "Create authentic looking D&D homebrews using only markdown",
"version": "3.0.6",
"version": "3.6.1",
"engines": {
"node": "16.11.x"
},
@@ -14,12 +14,18 @@
"quick": "node scripts/quick.js",
"build": "node scripts/buildHomebrew.js",
"buildall": "node scripts/buildHomebrew.js && node scripts/buildAdmin.js",
"builddev": "node scripts/buildHomebrew.js --dev",
"lint": "eslint --fix **/*.{js,jsx}",
"lint:dry": "eslint **/*.{js,jsx}",
"circleci": "npm test && eslint **/*.{js,jsx} --max-warnings=0",
"verify": "npm run lint && npm test",
"test": "pico-check",
"test:dev": "pico-check -v -w",
"test": "jest",
"test:api-unit": "jest server/*.spec.js --verbose",
"test:coverage": "jest --coverage --silent",
"test:dev": "jest --verbose --watch",
"test:basic": "jest tests/markdown/basic.test.js --verbose",
"test:mustache-span": "jest tests/markdown/mustache-span.test.js --verbose",
"test:route": "jest tests/routes/static-pages.test.js --verbose",
"phb": "node scripts/phb.js",
"prod": "set NODE_ENV=production && npm run build",
"postinstall": "npm run buildall",
@@ -30,55 +36,77 @@
"eslintIgnore": [
"build/*"
],
"pico-check": {
"require": "./tests/test.init.js"
"jest": {
"testTimeout": 15000,
"modulePaths": [
"mode_modules",
"shared",
"server"
],
"coverageThreshold" : {
"global" : {
"statements" : 25,
"branches" : 10,
"functions" : 22,
"lines" : 25
},
"server/homebrew.api.js" : {
"statements" : 65,
"branches" : 50,
"functions" : 60,
"lines" : 70
}
}
},
"babel": {
"presets": [
"@babel/preset-env",
"@babel/preset-react"
],
"plugins": [
"@babel/plugin-transform-runtime"
]
},
"dependencies": {
"@babel/core": "^7.16.5",
"@babel/plugin-transform-runtime": "^7.16.5",
"@babel/preset-env": "^7.16.5",
"@babel/preset-react": "^7.16.5",
"body-parser": "^1.19.1",
"classnames": "^2.3.1",
"codemirror": "^5.64.0",
"@babel/core": "^7.20.12",
"@babel/plugin-transform-runtime": "^7.19.6",
"@babel/preset-env": "^7.19.4",
"@babel/preset-react": "^7.18.6",
"body-parser": "^1.20.1",
"classnames": "^2.3.2",
"codemirror": "^5.65.6",
"cookie-parser": "^1.4.6",
"create-react-class": "^15.7.0",
"dedent-tabs": "^0.10.1",
"express": "^4.17.1",
"dedent-tabs": "^0.10.2",
"express": "^4.18.2",
"express-async-handler": "^1.2.0",
"express-static-gzip": "2.1.1",
"fs-extra": "10.0.0",
"googleapis": "92.0.0",
"express-static-gzip": "2.1.7",
"fs-extra": "11.1.0",
"googleapis": "111.0.0",
"js-yaml": "^4.1.0",
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
"marked": "4.0.7",
"marked-extended-tables": "^1.0.3",
"marked": "4.2.12",
"marked-extended-tables": "^1.0.5",
"markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.29.1",
"mongoose": "^6.1.2",
"nanoid": "3.1.30",
"nconf": "^0.11.3",
"prop-types": "15.7.2",
"query-string": "7.0.1",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"moment": "^2.29.4",
"mongoose": "^6.9.1",
"nanoid": "3.3.4",
"nconf": "^0.12.0",
"npm": "^8.10.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-frame-component": "4.1.3",
"react-router-dom": "5.3.0",
"react-router-dom": "6.8.1",
"sanitize-filename": "1.6.3",
"superagent": "^6.1.0",
"vitreum": "git+https://git@github.com/calculuschild/vitreum.git"
},
"devDependencies": {
"eslint": "^8.4.1",
"eslint-plugin-react": "^7.27.1",
"pico-check": "^2.2.0"
"eslint": "^8.34.0",
"eslint-plugin-react": "^7.32.2",
"jest": "^29.4.3",
"supertest": "^6.3.3"
}
}

View File

@@ -10,7 +10,7 @@ const assetTransform = require('vitreum/transforms/asset.js');
const babel = require('@babel/core');
const less = require('less');
const babelify = async (code)=>(await babel.transformAsync(code, { presets: ['@babel/preset-env', '@babel/preset-react'], plugins: ['@babel/plugin-transform-runtime'] })).code;
const babelify = async (code)=>(await babel.transformAsync(code, { presets: [['@babel/preset-env', { 'exclude': ['proposal-dynamic-import'] }], '@babel/preset-react'], plugins: ['@babel/plugin-transform-runtime'] })).code;
const transforms = {
'.js' : (code, filename, opts)=>babelify(code),
@@ -20,31 +20,13 @@ const transforms = {
};
const build = async ({ bundle, render, ssr })=>{
const css = await lessTransform.generate({ paths: './shared' });
let css = await lessTransform.generate({ paths: './shared' });
css = `@layer bundle {\n${css}\n}`;
await fs.outputFile('./build/homebrew/bundle.css', css);
await fs.outputFile('./build/homebrew/bundle.js', bundle);
await fs.outputFile('./build/homebrew/ssr.js', ssr);
await fs.copy('./themes/fonts', './build/fonts');
let src = './themes/5ePhbLegacy.style.less';
//Parse brew theme files
less.render(fs.readFileSync(src).toString(), {
compress : !isDev
}, function(e, output) {
fs.outputFile('./build/themes/5ePhbLegacy.style.css', output.css);
});
src = './themes/5ePhb.style.less';
less.render(fs.readFileSync(src).toString(), {
compress : !isDev
}, function(e, output) {
fs.outputFile('./build/themes/5ePhb.style.css', output.css);
});
// await less.render(lessCode, {
// compress : !dev,
// sourceMap : (dev ? {
// sourceMapFileInline: true,
// outputSourceFiles: true
// } : false),
// })
await fs.copy('./client/homebrew/favicon.ico', './build/assets/favicon.ico');
//compress files in production
if(!isDev){
@@ -59,20 +41,104 @@ const build = async ({ bundle, render, ssr })=>{
};
fs.emptyDirSync('./build');
pack('./client/homebrew/homebrew.jsx', {
paths : ['./shared'],
libs : Proj.libs,
dev : isDev && build,
transforms
})
.then(build)
.catch(console.error);
(async ()=>{
//v==----------------------------- COMPILE THEMES --------------------------------==v//
// Update list of all Theme files
const themes = { Legacy: {}, V3: {} };
let themeFiles = fs.readdirSync('./themes/Legacy');
for (dir of themeFiles) {
const themeData = JSON.parse(fs.readFileSync(`./themes/Legacy/${dir}/settings.json`).toString());
themeData.path = dir;
themes.Legacy[dir] = (themeData);
//fs.copy(`./themes/Legacy/${dir}/dropdownTexture.png`, `./build/themes/Legacy/${dir}/dropdownTexture.png`);
const src = `./themes/Legacy/${dir}/style.less`;
((outputDirectory)=>{
less.render(fs.readFileSync(src).toString(), {
compress : !isDev
}, function(e, output) {
fs.outputFile(outputDirectory, output.css);
});
})(`./build/themes/Legacy/${dir}/style.css`);
}
themeFiles = fs.readdirSync('./themes/V3');
for (dir of themeFiles) {
const themeData = JSON.parse(fs.readFileSync(`./themes/V3/${dir}/settings.json`).toString());
themeData.path = dir;
themes.V3[dir] = (themeData);
fs.copy(`./themes/V3/${dir}/dropdownTexture.png`, `./build/themes/V3/${dir}/dropdownTexture.png`);
fs.copy(`./themes/V3/${dir}/dropdownPreview.png`, `./build/themes/V3/${dir}/dropdownPreview.png`);
const src = `./themes/V3/${dir}/style.less`;
((outputDirectory)=>{
less.render(fs.readFileSync(src).toString(), {
compress : !isDev
}, function(e, output) {
fs.outputFile(outputDirectory, output.css);
});
})(`./build/themes/V3/${dir}/style.css`);
}
await fs.outputFile('./themes/themes.json', JSON.stringify(themes, null, 2));
// await less.render(lessCode, {
// compress : !dev,
// sourceMap : (dev ? {
// sourceMapFileInline: true,
// outputSourceFiles: true
// } : false),
// })
// Move assets
await fs.copy('./themes/fonts', './build/fonts');
await fs.copy('./themes/assets', './build/assets');
await fs.copy('./client/icons', './build/icons');
//v==----------------------------- BUNDLE PACKAGES --------------------------------==v//
const bundles = await pack('./client/homebrew/homebrew.jsx', {
paths : ['./shared', './'],
libs : Proj.libs,
dev : isDev && build,
transforms
});
build(bundles);
// Possible method for generating separate bundles for theme snippets: factor-bundle first sending all common files to bundle.js, then again using default settings, keeping only snippet bundles
// await fs.outputFile('./build/junk.js', '');
// await fs.outputFile('./build/themes/Legacy/5ePHB/snippets.js', '');
//
// const files = ['./client/homebrew/homebrew.jsx','./themes/Legacy/5ePHB/snippets.js'];
//
// bundles = await pack(files, {
// dedupe: false,
// plugin : [['factor-bundle', { outputs: [ './build/junk.js','./build/themes/Legacy/5ePHB/snippets.js'], threshold : function(row, groups) {
// console.log(groups);
// if (groups.some(group => /.*homebrew.jsx$/.test(group))) {
// console.log("found homebrewery")
// return true;
// }
// return this._defaultThreshold(row, groups);
// }}]],
// paths : ['./shared','./','./build'],
// libs : Proj.libs,
// dev : isDev && build,
// transforms
// });
// build(bundles);
//
})().catch(console.error);
//In development set up a watch server and livereload
if(isDev){
livereload('./build');
watchFile('./server.js', {
watch : ['./client'] // Watch additional folders if you want
watch : ['./client', './server', './themes'] // Watch additional folders if you want
});
}

View File

@@ -15,6 +15,7 @@
"codemirror/addon/fold/foldcode.js",
"codemirror/addon/fold/foldgutter.js",
"codemirror/addon/fold/xml-fold.js",
"codemirror/addon/scroll/scrollpastend.js",
"codemirror/addon/search/search.js",
"codemirror/addon/search/searchcursor.js",
"codemirror/addon/search/jump-to-line.js",

315
server.js
View File

@@ -1,309 +1,12 @@
/*eslint max-lines: ["warn", {"max": 300, "skipBlankLines": true, "skipComments": true}]*/
const _ = require('lodash');
const jwt = require('jwt-simple');
const express = require('express');
const yaml = require('js-yaml');
const app = express();
const DB = require('./server/db.js');
const server = require('./server/app.js');
const config = require('./server/config.js');
const homebrewApi = require('./server/homebrew.api.js');
const GoogleActions = require('./server/googleActions.js');
const serveCompressedStaticAssets = require('./server/static-assets.mv.js');
const sanitizeFilename = require('sanitize-filename');
const asyncHandler = require('express-async-handler');
const brewAccessTypes = ['edit', 'share', 'raw'];
//Get the brew object from the HB database or Google Drive
const getBrewFromId = asyncHandler(async (id, accessType)=>{
if(!brewAccessTypes.includes(accessType))
throw ('Invalid Access Type when getting brew');
let brew;
if(id.length > 12) {
const googleId = id.slice(0, -12);
id = id.slice(-12);
brew = await GoogleActions.readFileMetadata(config.get('google_api_key'), googleId, id, accessType);
} else {
brew = await HomebrewModel.get(accessType == 'edit' ? { editId: id } : { shareId: id });
brew = brew.toObject(); // Convert MongoDB object to standard Javascript Object
}
brew = sanitizeBrew(brew, accessType === 'edit' ? false : true);
//Split brew.text into text and style
//unless the Access Type is RAW, in which case return immediately
if(accessType == 'raw') {
return brew;
}
splitTextStyleAndMetadata(brew);
return brew;
});
const sanitizeBrew = (brew, full=false)=>{
delete brew._id;
delete brew.__v;
if(full){
delete brew.editId;
}
return brew;
};
const splitTextStyleAndMetadata = (brew)=>{
brew.text = brew.text.replaceAll('\r\n', '\n');
if(brew.text.startsWith('```metadata')) {
const index = brew.text.indexOf('```\n\n');
const metadataSection = brew.text.slice(12, index - 1);
const metadata = yaml.load(metadataSection);
Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer']));
brew.text = brew.text.slice(index + 5);
}
if(brew.text.startsWith('```css')) {
const index = brew.text.indexOf('```\n\n');
brew.style = brew.text.slice(7, index - 1);
brew.text = brew.text.slice(index + 5);
}
};
app.use('/', serveCompressedStaticAssets(`${__dirname}/build`));
process.chdir(__dirname);
//app.use(express.static(`${__dirname}/build`));
app.use(require('body-parser').json({ limit: '25mb' }));
app.use(require('cookie-parser')());
app.use(require('./server/forcessl.mw.js'));
const config = require('nconf')
.argv()
.env({ lowerCase: true })
.file('environment', { file: `config/${process.env.NODE_ENV}.json` })
.file('defaults', { file: 'config/default.json' });
//DB
const mongoose = require('mongoose');
mongoose.connect(config.get('mongodb_uri') || config.get('mongolab_uri') || 'mongodb://localhost/naturalcrit',
{ retryWrites: false });
mongoose.connection.on('error', (err)=>{
console.log('Error : Could not connect to a Mongo Database.');
console.log(' If you are running locally, make sure mongodb.exe is running.');
console.log(err);
throw 'Can not connect to Mongo';
});
//Account Middleware
app.use((req, res, next)=>{
if(req.cookies && req.cookies.nc_session){
try {
req.account = jwt.decode(req.cookies.nc_session, config.get('secret'));
//console.log("Just loaded up JWT from cookie:");
//console.log(req.account);
} catch (e){}
}
req.config = {
google_client_id : config.get('google_client_id'),
google_client_secret : config.get('google_client_secret')
};
return next();
});
app.use(homebrewApi);
app.use(require('./server/admin.api.js'));
const HomebrewModel = require('./server/homebrew.model.js').model;
const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8');
const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8');
const changelogText = require('fs').readFileSync('./changelog.md', 'utf8');
const faqText = require('fs').readFileSync('./faq.md', 'utf8');
String.prototype.replaceAll = function(s, r){return this.split(s).join(r);};
//Robots.txt
app.get('/robots.txt', (req, res)=>{
return res.sendFile(`${__dirname}/robots.txt`);
});
//Home page
app.get('/', async (req, res, next)=>{
const brew = {
text : welcomeText
};
req.brew = brew;
return next();
});
//Home page v3
app.get('/v3_preview', async (req, res, next)=>{
const brew = {
text : welcomeTextV3,
renderer : 'V3'
};
splitTextStyleAndMetadata(brew);
req.brew = brew;
return next();
});
//Changelog page
app.get('/changelog', async (req, res, next)=>{
const brew = {
title : 'Changelog',
text : changelogText,
renderer : 'V3'
};
splitTextStyleAndMetadata(brew);
req.brew = brew;
return next();
});
//FAQ page
app.get('/faq', async (req, res, next)=>{
const brew = {
title : 'FAQ',
text : faqText,
renderer : 'V3'
};
splitTextStyleAndMetadata(brew);
req.brew = brew;
return next();
});
//Source page
app.get('/source/:id', asyncHandler(async (req, res)=>{
const brew = await getBrewFromId(req.params.id, 'raw');
const replaceStrings = { '&': '&amp;', '<': '&lt;', '>': '&gt;' };
let text = brew.text;
for (const replaceStr in replaceStrings) {
text = text.replaceAll(replaceStr, replaceStrings[replaceStr]);
}
text = `<code><pre style="white-space: pre-wrap;">${text}</pre></code>`;
res.status(200).send(text);
}));
//Download brew source page
app.get('/download/:id', asyncHandler(async (req, res)=>{
const brew = await getBrewFromId(req.params.id, 'raw');
const prefix = 'HB - ';
let fileName = sanitizeFilename(`${prefix}${brew.title}`).replaceAll(' ', '');
if(!fileName || !fileName.length) { fileName = `${prefix}-Untitled-Brew`; };
res.set({
'Cache-Control' : 'no-cache',
'Content-Type' : 'text/plain',
'Content-Disposition' : `attachment; filename="${fileName}.txt"`
DB.connect(config).then(()=>{
// Ensure that we have successfully connected to the database
// before launching server
const PORT = process.env.PORT || config.get('web_port') || 8000;
server.app.listen(PORT, ()=>{
console.log(`server on port: ${PORT}`);
});
res.status(200).send(brew.text);
}));
//User Page
app.get('/user/:username', async (req, res, next)=>{
const ownAccount = req.account && (req.account.username == req.params.username);
let brews = await HomebrewModel.getByUser(req.params.username, ownAccount)
.catch((err)=>{
console.log(err);
});
if(ownAccount && req?.account?.googleId){
const googleBrews = await GoogleActions.listGoogleBrews(req, res)
.catch((err)=>{
console.error(err);
});
if(googleBrews)
brews = _.concat(brews, googleBrews);
}
req.brews = _.map(brews, (brew)=>{
return sanitizeBrew(brew, !ownAccount);
});
return next();
});
//Edit Page
app.get('/edit/:id', asyncHandler(async (req, res, next)=>{
res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save.
const brew = await getBrewFromId(req.params.id, 'edit');
req.brew = brew;
return next();
}));
//New Page
app.get('/new/:id', asyncHandler(async (req, res, next)=>{
const brew = await getBrewFromId(req.params.id, 'share');
brew.title = `CLONE - ${brew.title}`;
req.brew = brew;
return next();
}));
//Share Page
app.get('/share/:id', asyncHandler(async (req, res, next)=>{
const brew = await getBrewFromId(req.params.id, 'share');
if(req.params.id.length > 12) {
const googleId = req.params.id.slice(0, -12);
const shareId = req.params.id.slice(-12);
await GoogleActions.increaseView(googleId, shareId, 'share', brew)
.catch((err)=>{next(err);});
} else {
await HomebrewModel.increaseView({ shareId: brew.shareId });
}
req.brew = brew;
return next();
}));
//Print Page
app.get('/print/:id', asyncHandler(async (req, res, next)=>{
const brew = await getBrewFromId(req.params.id, 'share');
req.brew = brew;
return next();
}));
//Render the page
const templateFn = require('./client/template.js');
app.use((req, res)=>{
const props = {
version : require('./package.json').version,
url : req.originalUrl,
brew : req.brew,
brews : req.brews,
googleBrews : req.googleBrews,
account : req.account,
enable_v3 : config.get('enable_v3')
};
templateFn('homebrew', title = req.brew ? req.brew.title : '', props)
.then((page)=>{ res.send(page); })
.catch((err)=>{
console.log(err);
return res.sendStatus(500);
});
});
//v=====----- Error-Handling Middleware -----=====v//
//Format Errors so all fields will be sent
const replaceErrors = (key, value)=>{
if(value instanceof Error) {
const error = {};
Object.getOwnPropertyNames(value).forEach(function (key) {
error[key] = value[key];
});
return error;
}
return value;
};
const getPureError = (error)=>{
return JSON.parse(JSON.stringify(error, replaceErrors));
};
app.use((err, req, res, next)=>{
const status = err.status || 500;
console.error(err);
res.status(status).send(getPureError(err));
});
//^=====--------------------------------------=====^//
const PORT = process.env.PORT || config.get('web_port') || 8000;
app.listen(PORT, ()=>{
console.log(`server on port:${PORT}`);
});

480
server/app.js Normal file
View File

@@ -0,0 +1,480 @@
/*eslint max-lines: ["warn", {"max": 400, "skipBlankLines": true, "skipComments": true}]*/
// Set working directory to project root
process.chdir(`${__dirname}/..`);
const _ = require('lodash');
const jwt = require('jwt-simple');
const express = require('express');
const yaml = require('js-yaml');
const app = express();
const config = require('./config.js');
const { homebrewApi, getBrew } = require('./homebrew.api.js');
const GoogleActions = require('./googleActions.js');
const serveCompressedStaticAssets = require('./static-assets.mv.js');
const sanitizeFilename = require('sanitize-filename');
const asyncHandler = require('express-async-handler');
const { DEFAULT_BREW } = require('./brewDefaults.js');
const splitTextStyleAndMetadata = (brew)=>{
brew.text = brew.text.replaceAll('\r\n', '\n');
if(brew.text.startsWith('```metadata')) {
const index = brew.text.indexOf('```\n\n');
const metadataSection = brew.text.slice(12, index - 1);
const metadata = yaml.load(metadataSection);
Object.assign(brew, _.pick(metadata, ['title', 'description', 'tags', 'systems', 'renderer', 'theme']));
brew.text = brew.text.slice(index + 5);
}
if(brew.text.startsWith('```css')) {
const index = brew.text.indexOf('```\n\n');
brew.style = brew.text.slice(7, index - 1);
brew.text = brew.text.slice(index + 5);
}
};
const sanitizeBrew = (brew, accessType)=>{
brew._id = undefined;
brew.__v = undefined;
if(accessType !== 'edit'){
brew.editId = undefined;
}
return brew;
};
app.use('/', serveCompressedStaticAssets(`build`));
//app.use(express.static(`${__dirname}/build`));
app.use(require('body-parser').json({ limit: '25mb' }));
app.use(require('cookie-parser')());
app.use(require('./forcessl.mw.js'));
//Account Middleware
app.use((req, res, next)=>{
if(req.cookies && req.cookies.nc_session){
try {
req.account = jwt.decode(req.cookies.nc_session, config.get('secret'));
//console.log("Just loaded up JWT from cookie:");
//console.log(req.account);
} catch (e){}
}
req.config = {
google_client_id : config.get('google_client_id'),
google_client_secret : config.get('google_client_secret')
};
return next();
});
app.use(homebrewApi);
app.use(require('./admin.api.js'));
const HomebrewModel = require('./homebrew.model.js').model;
const welcomeText = require('fs').readFileSync('client/homebrew/pages/homePage/welcome_msg.md', 'utf8');
const welcomeTextLegacy = require('fs').readFileSync('client/homebrew/pages/homePage/welcome_msg_legacy.md', 'utf8');
const migrateText = require('fs').readFileSync('client/homebrew/pages/homePage/migrate.md', 'utf8');
const changelogText = require('fs').readFileSync('changelog.md', 'utf8');
const faqText = require('fs').readFileSync('faq.md', 'utf8');
String.prototype.replaceAll = function(s, r){return this.split(s).join(r);};
const defaultMetaTags = {
site_name : 'The Homebrewery - Make your Homebrew content look legit!',
title : 'The Homebrewery',
description : 'A NaturalCrit Tool for creating authentic Homebrews using Markdown.',
image : `${config.get('publicUrl')}/thumbnail.png`,
type : 'website'
};
//Robots.txt
app.get('/robots.txt', (req, res)=>{
return res.sendFile(`robots.txt`, { root: process.cwd() });
});
//Home page
app.get('/', (req, res, next)=>{
req.brew = {
text : welcomeText,
renderer : 'V3'
},
req.ogMeta = { ...defaultMetaTags,
title : 'Homepage',
description : 'Homepage'
};
splitTextStyleAndMetadata(req.brew);
return next();
});
//Home page Legacy
app.get('/legacy', (req, res, next)=>{
req.brew = {
text : welcomeTextLegacy,
renderer : 'legacy'
},
req.ogMeta = { ...defaultMetaTags,
title : 'Homepage (Legacy)',
description : 'Homepage'
};
splitTextStyleAndMetadata(req.brew);
return next();
});
//Legacy/Other Document -> v3 Migration Guide
app.get('/migrate', (req, res, next)=>{
req.brew = {
text : migrateText,
renderer : 'V3'
},
req.ogMeta = { ...defaultMetaTags,
title : 'v3 Migration Guide',
description : 'A brief guide to converting Legacy documents to the v3 renderer.'
};
splitTextStyleAndMetadata(req.brew);
return next();
});
//Changelog page
app.get('/changelog', async (req, res, next)=>{
req.brew = {
title : 'Changelog',
text : changelogText,
renderer : 'V3'
},
req.ogMeta = { ...defaultMetaTags,
title : 'Changelog',
description : 'Development changelog.'
};
splitTextStyleAndMetadata(req.brew);
return next();
});
//FAQ page
app.get('/faq', async (req, res, next)=>{
req.brew = {
title : 'FAQ',
text : faqText,
renderer : 'V3'
},
req.ogMeta = { ...defaultMetaTags,
title : 'FAQ',
description : 'Frequently Asked Questions'
};
splitTextStyleAndMetadata(req.brew);
return next();
});
//Source page
app.get('/source/:id', asyncHandler(getBrew('share')), (req, res)=>{
const { brew } = req;
const replaceStrings = { '&': '&amp;', '<': '&lt;', '>': '&gt;' };
let text = brew.text;
for (const replaceStr in replaceStrings) {
text = text.replaceAll(replaceStr, replaceStrings[replaceStr]);
}
text = `<code><pre style="white-space: pre-wrap;">${text}</pre></code>`;
res.status(200).send(text);
});
//Download brew source page
app.get('/download/:id', asyncHandler(getBrew('share')), (req, res)=>{
const { brew } = req;
sanitizeBrew(brew, 'share');
const prefix = 'HB - ';
const encodeRFC3986ValueChars = (str)=>{
return (
encodeURIComponent(str)
.replace(/[!'()*]/g, (char)=>{`%${char.charCodeAt(0).toString(16).toUpperCase()}`;})
);
};
let fileName = sanitizeFilename(`${prefix}${brew.title}`).replaceAll(' ', '');
if(!fileName || !fileName.length) { fileName = `${prefix}-Untitled-Brew`; };
res.set({
'Cache-Control' : 'no-cache',
'Content-Type' : 'text/plain',
'Content-Disposition' : `attachment; filename*=UTF-8''${encodeRFC3986ValueChars(fileName)}.txt`
});
res.status(200).send(brew.text);
});
//User Page
app.get('/user/:username', async (req, res, next)=>{
const ownAccount = req.account && (req.account.username == req.params.username);
req.ogMeta = { ...defaultMetaTags,
title : `${req.params.username}'s Collection`,
description : 'View my collection of homebrew on the Homebrewery.'
// type : could be 'profile'?
};
const fields = [
'googleId',
'title',
'pageCount',
'description',
'authors',
'published',
'views',
'shareId',
'editId',
'createdAt',
'updatedAt',
'lastViewed',
'thumbnail',
'tags'
];
let brews = await HomebrewModel.getByUser(req.params.username, ownAccount, fields)
.catch((err)=>{
console.log(err);
});
if(ownAccount && req?.account?.googleId){
const auth = await GoogleActions.authCheck(req.account, res);
let googleBrews = await GoogleActions.listGoogleBrews(auth)
.catch((err)=>{
console.error(err);
});
if(googleBrews && googleBrews.length > 0) {
for (const brew of brews.filter((brew)=>brew.googleId)) {
const match = googleBrews.findIndex((b)=>b.editId === brew.editId);
if(match !== -1) {
brew.googleId = googleBrews[match].googleId;
brew.stubbed = true;
brew.pageCount = googleBrews[match].pageCount;
brew.renderer = googleBrews[match].renderer;
brew.version = googleBrews[match].version;
googleBrews.splice(match, 1);
}
}
googleBrews = googleBrews.map((brew)=>({ ...brew, authors: [req.account.username] }));
brews = _.concat(brews, googleBrews);
}
}
req.brews = _.map(brews, (brew)=>{
return sanitizeBrew(brew, ownAccount ? 'edit' : 'share');
});
return next();
});
//Edit Page
app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{
req.brew = req.brew.toObject ? req.brew.toObject() : req.brew;
req.ogMeta = { ...defaultMetaTags,
title : req.brew.title || 'Untitled Brew',
description : req.brew.description || 'No description.',
image : req.brew.thumbnail || defaultMetaTags.image,
type : 'article'
};
sanitizeBrew(req.brew, 'edit');
splitTextStyleAndMetadata(req.brew);
res.header('Cache-Control', 'no-cache, no-store'); //reload the latest saved brew when pressing back button, not the cached version before save.
return next();
});
//New Page
app.get('/new/:id', asyncHandler(getBrew('share')), (req, res, next)=>{
sanitizeBrew(req.brew, 'share');
splitTextStyleAndMetadata(req.brew);
const brew = {
shareId : req.brew.shareId,
title : `CLONE - ${req.brew.title}`,
text : req.brew.text,
style : req.brew.style,
renderer : req.brew.renderer,
theme : req.brew.theme
};
req.brew = _.defaults(brew, DEFAULT_BREW);
req.ogMeta = { ...defaultMetaTags,
title : 'New',
description : 'Start crafting your homebrew on the Homebrewery!'
};
return next();
});
//Share Page
app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, res, next)=>{
const { brew } = req;
req.ogMeta = { ...defaultMetaTags,
title : req.brew.title || 'Untitled Brew',
description : req.brew.description || 'No description.',
image : req.brew.thumbnail || defaultMetaTags.image,
type : 'article'
};
if(req.params.id.length > 12 && !brew._id) {
const googleId = req.params.id.slice(0, -12);
const shareId = req.params.id.slice(-12);
await GoogleActions.increaseView(googleId, shareId, 'share', brew)
.catch((err)=>{next(err);});
} else {
await HomebrewModel.increaseView({ shareId: brew.shareId });
}
sanitizeBrew(req.brew, 'share');
splitTextStyleAndMetadata(req.brew);
return next();
}));
//Print Page
app.get('/print/:id', asyncHandler(getBrew('share')), (req, res, next)=>{
sanitizeBrew(req.brew, 'share');
splitTextStyleAndMetadata(req.brew);
next();
});
//Account Page
app.get('/account', asyncHandler(async (req, res, next)=>{
const data = {};
data.title = 'Account Information Page';
let auth;
let googleCount = [];
if(req.account) {
if(req.account.googleId) {
try {
auth = await GoogleActions.authCheck(req.account, res, false);
} catch (e) {
auth = undefined;
console.log('Google auth check failed!');
console.log(e);
}
if(auth.credentials.access_token) {
try {
googleCount = await GoogleActions.listGoogleBrews(auth);
} catch (e) {
googleCount = undefined;
console.log('List Google files failed!');
console.log(e);
}
}
}
const query = { authors: req.account.username, googleId: { $exists: false } };
const mongoCount = await HomebrewModel.countDocuments(query)
.catch((err)=>{
mongoCount = 0;
console.log(err);
});
data.uiItems = {
username : req.account.username,
issued : req.account.issued,
googleId : Boolean(req.account.googleId),
authCheck : Boolean(req.account.googleId && auth.credentials.access_token),
mongoCount : mongoCount,
googleCount : googleCount?.length
};
}
req.brew = data;
req.ogMeta = { ...defaultMetaTags,
title : `Account Page`,
description : null
};
return next();
}));
const nodeEnv = config.get('node_env');
const isLocalEnvironment = config.get('local_environments').includes(nodeEnv);
// Local only
if(isLocalEnvironment){
// Login
app.post('/local/login', (req, res)=>{
const username = req.body.username;
if(!username) return;
const payload = jwt.encode({ username: username, issued: new Date }, config.get('secret'));
return res.json(payload);
});
}
//Render the page
const templateFn = require('./../client/template.js');
app.use(asyncHandler(async (req, res, next)=>{
// Create configuration object
const configuration = {
local : isLocalEnvironment,
publicUrl : config.get('publicUrl') ?? '',
environment : nodeEnv
};
const props = {
version : require('./../package.json').version,
url : req.originalUrl,
brew : req.brew,
brews : req.brews,
googleBrews : req.googleBrews,
account : req.account,
enable_v3 : config.get('enable_v3'),
enable_themes : config.get('enable_themes'),
config : configuration,
ogMeta : req.ogMeta
};
const title = req.brew ? req.brew.title : '';
const page = await templateFn('homebrew', title, props)
.catch((err)=>{
console.log(err);
return res.sendStatus(500);
});
if(!page) return;
res.send(page);
}));
//v=====----- Error-Handling Middleware -----=====v//
//Format Errors so all fields will be sent
const replaceErrors = (key, value)=>{
if(value instanceof Error) {
const error = {};
Object.getOwnPropertyNames(value).forEach(function (key) {
error[key] = value[key];
});
return error;
}
return value;
};
const getPureError = (error)=>{
return JSON.parse(JSON.stringify(error, replaceErrors));
};
app.use((err, req, res, next)=>{
const status = err.status || 500;
console.error(err);
res.status(status).send(getPureError(err));
});
app.use((req, res)=>{
if(!res.headersSent) {
console.error('Headers have not been sent, responding with a server error.', req.url);
res.status(500).send('An error occurred and the server did not send a response. The error has been logged, please note the time this occurred and report this issue.');
}
});
//^=====--------------------------------------=====^//
module.exports = {
app : app
};

37
server/brewDefaults.js Normal file
View File

@@ -0,0 +1,37 @@
const _ = require('lodash');
// Default properties for newly-created brews
const DEFAULT_BREW = {
title : '',
text : '',
style : undefined,
description : '',
editId : undefined,
shareId : undefined,
createdAt : undefined,
updatedAt : undefined,
renderer : 'V3',
theme : '5ePHB',
authors : [],
tags : [],
systems : [],
thumbnail : '',
views : 0,
published : false,
pageCount : 1,
gDrive : false,
trashed : false
};
// Default values for older brews with missing properties
// e.g., missing "renderer" is assumed to be "legacy"
const DEFAULT_BREW_LOAD = _.defaults(
{
renderer : 'legacy',
},
DEFAULT_BREW);
module.exports = {
DEFAULT_BREW,
DEFAULT_BREW_LOAD
};

5
server/config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = require('nconf')
.argv()
.env({ lowerCase: true })
.file('environment', { file: `config/${process.env.NODE_ENV}.json` })
.file('defaults', { file: 'config/default.json' });

37
server/db.js Normal file
View File

@@ -0,0 +1,37 @@
// The main purpose of this file is to provide an interface for database
// connection. Even though the code is quite simple and basically a tiny
// wrapper around mongoose package, it works as single point where
// database setup/config is performed and the interface provided here can be
// reused by both the main application and all tests which require database
// connection.
const Mongoose = require('mongoose');
const getMongoDBURL = (config)=>{
return config.get('mongodb_uri') ||
config.get('mongolab_uri') ||
'mongodb://127.0.0.1/homebrewery'; // changed from mongodb://localhost/homebrewery to accommodate versions 16+ of node.
};
const handleConnectionError = (error)=>{
if(error) {
console.error('Could not connect to a Mongo database: \n');
console.error(error);
console.error('\nIf you are running locally, make sure mongodb.exe is running and DB URL is configured properly');
process.exit(1); // non-zero exit code to indicate an error
}
};
const disconnect = async ()=>{
return await Mongoose.disconnect();
};
const connect = async (config)=>{
return await Mongoose.connect(getMongoDBURL(config),
{ retryWrites: false }, handleConnectionError);
};
module.exports = {
connect : connect,
disconnect : disconnect
};

View File

@@ -3,17 +3,30 @@ const _ = require('lodash');
const { google } = require('googleapis');
const { nanoid } = require('nanoid');
const token = require('./token.js');
const config = require('nconf')
.argv()
.env({ lowerCase: true }) // Load environment variables
.file('environment', { file: `config/${process.env.NODE_ENV}.json` })
.file('defaults', { file: 'config/default.json' });
const config = require('./config.js');
//let oAuth2Client;
let serviceAuth;
if(!config.get('service_account')){
console.log('No Google Service Account in config files - Google Drive integration will not be available.');
} else {
const keys = typeof(config.get('service_account')) == 'string' ?
JSON.parse(config.get('service_account')) :
config.get('service_account');
GoogleActions = {
try {
serviceAuth = google.auth.fromJSON(keys);
serviceAuth.scopes = ['https://www.googleapis.com/auth/drive'];
} catch (err) {
console.warn(err);
console.log('Please make sure the Google Service Account is set up properly in your config files.');
}
}
authCheck : (account, res)=>{
google.options({ auth: serviceAuth || config.get('google_api_key') });
const GoogleActions = {
authCheck : (account, res, updateTokens=true)=>{
if(!account || !account.googleId){ // If not signed into Google
const err = new Error('Not Signed In');
err.status = 401;
@@ -31,7 +44,7 @@ GoogleActions = {
refresh_token : account.googleRefreshToken
});
oAuth2Client.on('tokens', (tokens)=>{
updateTokens && oAuth2Client.on('tokens', (tokens)=>{
if(tokens.refresh_token) {
account.googleRefreshToken = tokens.refresh_token;
}
@@ -47,7 +60,7 @@ GoogleActions = {
},
getGoogleFolder : async (auth)=>{
const drive = google.drive({ version: 'v3', auth: auth });
const drive = google.drive({ version: 'v3', auth });
fileMetadata = {
'name' : 'Homebrewery',
@@ -83,36 +96,27 @@ GoogleActions = {
return folderId;
},
listGoogleBrews : async (req, res)=>{
oAuth2Client = GoogleActions.authCheck(req.account, res);
//TODO: Change to service account to allow non-owners to view published files.
// Requires a driveId parameter in the drive.files.list command
// const keys = JSON.parse(config.get('service_account'));
// const auth = google.auth.fromJSON(keys);
// auth.scopes = ['https://www.googleapis.com/auth/drive'];
const drive = google.drive({ version: 'v3', auth: oAuth2Client });
listGoogleBrews : async (auth)=>{
const drive = google.drive({ version: 'v3', auth });
const obj = await drive.files.list({
pageSize : 100,
pageSize : 1000,
fields : 'nextPageToken, files(id, name, description, createdTime, modifiedTime, properties)',
q : 'mimeType != \'application/vnd.google-apps.folder\' and trashed = false'
})
.catch((err)=>{
console.log(`Error Listing Google Brews`);
console.log(`Error Listing Google Brews`);
console.error(err);
throw (err);
//TODO: Should break out here, but continues on for some reason.
});
});
if(!obj.data.files.length) {
console.log('No files found.');
}
console.log('No files found.');
}
const brews = obj.data.files.map((file)=>{
return {
return {
text : '',
shareId : file.properties.shareId,
editId : file.properties.editId,
@@ -124,67 +128,46 @@ GoogleActions = {
title : file.properties.title,
description : file.description,
views : parseInt(file.properties.views),
tags : '',
published : file.properties.published ? file.properties.published == 'true' : false,
authors : [req.account.username], //TODO: properly save and load authors to google drive
systems : []
};
});
return brews;
},
existsGoogleBrew : async (auth, id)=>{
const drive = google.drive({ version: 'v3', auth: auth });
updateGoogleBrew : async (brew)=>{
const drive = google.drive({ version: 'v3' });
const result = await drive.files.get({ fileId: id })
await drive.files.update({
fileId : brew.googleId,
resource : {
name : `${brew.title}.txt`,
description : `${brew.description}`,
properties : {
title : brew.title,
shareId : brew.shareId || nanoid(12),
editId : brew.editId || nanoid(12),
pageCount : brew.pageCount,
renderer : brew.renderer || 'legacy',
isStubbed : true
}
},
media : {
mimeType : 'text/plain',
body : brew.text
}
})
.catch((err)=>{
console.log('error checking file exists...');
console.log('Error saving to google');
console.error(err);
return false;
throw (err);
});
if(result){return true;}
return false;
},
updateGoogleBrew : async (auth, brew)=>{
const drive = google.drive({ version: 'v3', auth: auth });
if(await GoogleActions.existsGoogleBrew(auth, brew.googleId) == true) {
await drive.files.update({
fileId : brew.googleId,
resource : {
name : `${brew.title}.txt`,
description : `${brew.description}`,
properties : {
title : brew.title,
published : brew.published,
version : brew.version,
renderer : brew.renderer,
tags : brew.tags,
pageCount : brew.pageCount,
systems : brew.systems.join()
}
},
media : {
mimeType : 'text/plain',
body : brew.text
}
})
.catch((err)=>{
console.log('Error saving to google');
console.error(err);
throw (err);
//return res.status(500).send('Error while saving');
});
}
return (brew);
return true;
},
newGoogleBrew : async (auth, brew)=>{
const drive = google.drive({ version: 'v3', auth: auth });
const drive = google.drive({ version: 'v3', auth });
const media = {
mimeType : 'text/plain',
@@ -194,16 +177,17 @@ GoogleActions = {
const folderId = await GoogleActions.getGoogleFolder(auth);
const fileMetadata = {
'name' : `${brew.title}.txt`,
'description' : `${brew.description}`,
'parents' : [folderId],
'properties' : { //AppProperties is not accessible
'shareId' : nanoid(12),
'editId' : nanoid(12),
'title' : brew.title,
'views' : '0',
'pageCount' : brew.pageCount,
'renderer' : brew.renderer || 'legacy'
name : `${brew.title}.txt`,
description : `${brew.description}`,
parents : [folderId],
properties : { //AppProperties is not accessible
shareId : brew.shareId || nanoid(12),
editId : brew.editId || nanoid(12),
title : brew.title,
pageCount : brew.pageCount,
renderer : brew.renderer || 'legacy',
isStubbed : true,
version : 1
}
};
@@ -230,31 +214,11 @@ GoogleActions = {
console.error(err);
});
const newHomebrew = {
text : brew.text,
shareId : fileMetadata.properties.shareId,
editId : fileMetadata.properties.editId,
createdAt : new Date(),
updatedAt : new Date(),
gDrive : true,
googleId : obj.data.id,
pageCount : fileMetadata.properties.pageCount,
title : brew.title,
description : brew.description,
tags : '',
published : brew.published,
renderer : brew.renderer,
authors : [],
systems : []
};
return newHomebrew;
return obj.data.id;
},
readFileMetadata : async (auth, id, accessId, accessType)=>{
const drive = google.drive({ version: 'v3', auth: auth });
getGoogleBrew : async (id, accessId, accessType)=>{
const drive = google.drive({ version: 'v3' });
const obj = await drive.files.get({
fileId : id,
@@ -263,7 +227,6 @@ GoogleActions = {
.catch((err)=>{
console.log('Error loading from Google');
throw (err);
return;
});
if(obj) {
@@ -273,18 +236,7 @@ GoogleActions = {
throw ('Share ID does not match');
}
//Access file using service account. Using API key only causes "automated query" lockouts after a while.
const keys = typeof(config.get('service_account')) == 'string' ?
JSON.parse(config.get('service_account')) :
config.get('service_account');
const serviceAuth = google.auth.fromJSON(keys);
serviceAuth.scopes = ['https://www.googleapis.com/auth/drive'];
const serviceDrive = google.drive({ version: 'v3', auth: serviceAuth });
const file = await serviceDrive.files.get({
const file = await drive.files.get({
fileId : id,
fields : 'description, properties',
alt : 'media'
@@ -301,7 +253,6 @@ GoogleActions = {
text : file.data,
description : obj.data.description,
tags : obj.data.properties.tags ? obj.data.properties.tags : '',
systems : obj.data.properties.systems ? obj.data.properties.systems.split(',') : [],
authors : [],
published : obj.data.properties.published ? obj.data.properties.published == 'true' : false,
@@ -315,7 +266,6 @@ GoogleActions = {
version : parseInt(obj.data.properties.version) || 0,
renderer : obj.data.properties.renderer ? obj.data.properties.renderer : 'legacy',
gDrive : true,
googleId : id
};
@@ -323,51 +273,34 @@ GoogleActions = {
}
},
deleteGoogleBrew : async (req, res, id)=>{
oAuth2Client = GoogleActions.authCheck(req.account, res);
const drive = google.drive({ version: 'v3', auth: oAuth2Client });
const googleId = id.slice(0, -12);
const accessId = id.slice(-12);
deleteGoogleBrew : async (auth, id, accessId)=>{
const drive = google.drive({ version: 'v3', auth });
const obj = await drive.files.get({
fileId : googleId,
fileId : id,
fields : 'properties'
})
.catch((err)=>{
console.log('Error loading from Google');
console.error(err);
return;
});
if(obj && obj.data.properties.editId != accessId) {
throw ('Not authorized to delete this Google brew');
throw { status: 403, message: 'Not authorized to delete this Google brew' };
}
await drive.files.update({
fileId : googleId,
fileId : id,
resource : { trashed: true }
})
.catch((err)=>{
console.log('Can\'t delete Google file');
console.error(err);
});
return res.status(200).send();
},
increaseView : async (id, accessId, accessType, brew)=>{
//service account because this is modifying another user's file properties
//so we need extended scope
const keys = typeof(config.get('service_account')) == 'string' ?
JSON.parse(config.get('service_account')) :
config.get('service_account');
const auth = google.auth.fromJSON(keys);
auth.scopes = ['https://www.googleapis.com/auth/drive'];
const drive = google.drive({ version: 'v3', auth: auth });
const drive = google.drive({ version: 'v3' });
await drive.files.update({
fileId : brew.googleId,
@@ -384,8 +317,6 @@ GoogleActions = {
console.error(err);
//return res.status(500).send('Error while saving');
});
return;
}
};

View File

@@ -1,3 +1,4 @@
/* eslint-disable max-lines */
const _ = require('lodash');
const HomebrewModel = require('./homebrew.model.js').model;
const router = require('express').Router();
@@ -5,6 +6,10 @@ const zlib = require('zlib');
const GoogleActions = require('./googleActions.js');
const Markdown = require('../shared/naturalcrit/markdown.js');
const yaml = require('js-yaml');
const asyncHandler = require('express-async-handler');
const { nanoid } = require('nanoid');
const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js');
// const getTopBrews = (cb) => {
// HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) {
@@ -12,183 +17,331 @@ const yaml = require('js-yaml');
// });
// };
const mergeBrewText = (brew)=>{
let text = brew.text;
if(brew.style !== undefined) {
text = `\`\`\`css\n` +
`${brew.style || ''}\n` +
`\`\`\`\n\n` +
`${text}`;
}
const metadata = _.pick(brew, ['title', 'description', 'tags', 'systems', 'renderer']);
text = `\`\`\`metadata\n` +
`${yaml.dump(metadata)}\n` +
`\`\`\`\n\n` +
`${text}`;
return text;
};
const MAX_TITLE_LENGTH = 100;
const getGoodBrewTitle = (text)=>{
const tokens = Markdown.marked.lexer(text);
return (tokens.find((token)=>token.type == 'heading' || token.type == 'paragraph')?.text || 'No Title')
.slice(0, MAX_TITLE_LENGTH);
};
const api = {
homebrewApi : router,
getId : (req)=>{
// Set the id and initial potential google id, where the google id is present on the existing brew.
let id = req.params.id, googleId = req.body?.googleId;
const excludePropsFromUpdate = (brew)=>{
// Remove undesired properties
const propsToExclude = ['views', 'lastViewed'];
for (const prop of propsToExclude) {
delete brew[prop];
};
return brew;
};
// If the id is longer than 12, then it's a google id + the edit id. This splits the longer id up.
if(id.length > 12) {
googleId = id.slice(0, -12);
id = id.slice(-12);
}
return { id, googleId };
},
getBrew : (accessType, stubOnly = false)=>{
// Create middleware with the accessType passed in as part of the scope
return async (req, res, next)=>{
// Get relevant IDs for the brew
const { id, googleId } = api.getId(req);
const newBrew = (req, res)=>{
const brew = req.body;
// Try to find the document in the Homebrewery database -- if it doesn't exist, that's fine.
let stub = await HomebrewModel.get(accessType === 'edit' ? { editId: id } : { shareId: id })
.catch((err)=>{
if(googleId) {
console.warn(`Unable to find document stub for ${accessType}Id ${id}`);
} else {
console.warn(err);
}
});
stub = stub?.toObject();
if(!brew.title) {
brew.title = getGoodBrewTitle(brew.text);
}
// If there is a google id, try to find the google brew
if(!stubOnly && (googleId || stub?.googleId)) {
let googleError;
const googleBrew = await GoogleActions.getGoogleBrew(googleId || stub?.googleId, id, accessType)
.catch((err)=>{
googleError = err;
});
// Throw any error caught while attempting to retrieve Google brew.
if(googleError) throw googleError;
// Combine the Homebrewery stub with the google brew, or if the stub doesn't exist just use the google brew
stub = stub ? _.assign({ ...api.excludeStubProps(stub), stubbed: true }, api.excludeGoogleProps(googleBrew)) : googleBrew;
}
const authorsExist = stub?.authors?.length > 0;
const isAuthor = stub?.authors?.includes(req.account?.username);
const isInvited = stub?.invitedAuthors?.includes(req.account?.username);
if(accessType === 'edit' && (authorsExist && !(isAuthor || isInvited))) {
throw `The current logged in user does not have editor access to this brew.
brew.authors = (req.account) ? [req.account.username] : [];
brew.text = mergeBrewText(brew);
If you believe you should have access to this brew, ask the file owner to invite you as an author by opening the brew, viewing the Properties tab, and adding your username to the "invited authors" list. You can then try to access this document again.`;
}
delete brew.editId;
delete brew.shareId;
delete brew.googleId;
// If after all of that we still don't have a brew, throw an exception
if(!stub && !stubOnly) {
throw 'Brew not found in Homebrewery database or Google Drive';
}
const newHomebrew = new HomebrewModel(brew);
// Compress brew text to binary before saving
newHomebrew.textBin = zlib.deflateRawSync(newHomebrew.text);
// Delete the non-binary text field since it's not needed anymore
newHomebrew.text = undefined;
// Clean up brew: fill in missing fields with defaults / fix old invalid values
if(stub) {
stub.tags = stub.tags || undefined; // Clear empty strings
stub.renderer = stub.renderer || undefined; // Clear empty strings
stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields
}
newHomebrew.save((err, obj)=>{
if(err) {
console.error(err, err.toString(), err.stack);
return res.status(500).send(`Error while creating new brew, ${err.toString()}`);
req.brew = stub ?? {};
next();
};
},
mergeBrewText : (brew)=>{
let text = brew.text;
if(brew.style !== undefined) {
text = `\`\`\`css\n` +
`${brew.style || ''}\n` +
`\`\`\`\n\n` +
`${text}`;
}
const metadata = _.pick(brew, ['title', 'description', 'tags', 'systems', 'renderer', 'theme']);
text = `\`\`\`metadata\n` +
`${yaml.dump(metadata)}\n` +
`\`\`\`\n\n` +
`${text}`;
return text;
},
getGoodBrewTitle : (text)=>{
const tokens = Markdown.marked.lexer(text);
return (tokens.find((token)=>token.type === 'heading' || token.type === 'paragraph')?.text || 'No Title')
.slice(0, MAX_TITLE_LENGTH);
},
excludePropsFromUpdate : (brew)=>{
// Remove undesired properties
const modified = _.clone(brew);
const propsToExclude = ['_id', 'views', 'lastViewed'];
for (const prop of propsToExclude) {
delete modified[prop];
}
return modified;
},
excludeGoogleProps : (brew)=>{
const modified = _.clone(brew);
const propsToExclude = ['version', 'tags', 'systems', 'published', 'authors', 'owner', 'views', 'thumbnail'];
for (const prop of propsToExclude) {
delete modified[prop];
}
return modified;
},
excludeStubProps : (brew)=>{
const propsToExclude = ['text', 'textBin', 'renderer', 'pageCount'];
for (const prop of propsToExclude) {
brew[prop] = undefined;
}
return brew;
},
beforeNewSave : (account, brew)=>{
if(!brew.title) {
brew.title = api.getGoodBrewTitle(brew.text);
}
obj = obj.toObject();
obj.gDrive = false;
return res.status(200).send(obj);
});
};
brew.authors = (account) ? [account.username] : [];
brew.text = api.mergeBrewText(brew);
const updateBrew = (req, res)=>{
HomebrewModel.get({ editId: req.params.id })
.then((brew)=>{
const updateBrew = excludePropsFromUpdate(req.body);
brew = _.merge(brew, updateBrew);
brew.text = mergeBrewText(brew);
_.defaults(brew, DEFAULT_BREW);
},
newGoogleBrew : async (account, brew, res)=>{
const oAuth2Client = GoogleActions.authCheck(account, res);
const newBrew = api.excludeGoogleProps(brew);
return await GoogleActions.newGoogleBrew(oAuth2Client, newBrew);
},
newBrew : async (req, res)=>{
const brew = req.body;
const { saveToGoogle } = req.query;
delete brew.editId;
delete brew.shareId;
delete brew.googleId;
api.beforeNewSave(req.account, brew);
const newHomebrew = new HomebrewModel(brew);
newHomebrew.editId = nanoid(12);
newHomebrew.shareId = nanoid(12);
let googleId, saved;
if(saveToGoogle) {
googleId = await api.newGoogleBrew(req.account, newHomebrew, res)
.catch((err)=>{
console.error(err);
res.status(err?.status || err?.response?.status || 500).send(err?.message || err);
});
if(!googleId) return;
api.excludeStubProps(newHomebrew);
newHomebrew.googleId = googleId;
} else {
// Compress brew text to binary before saving
newHomebrew.textBin = zlib.deflateRawSync(newHomebrew.text);
// Delete the non-binary text field since it's not needed anymore
newHomebrew.text = undefined;
}
saved = await newHomebrew.save()
.catch((err)=>{
console.error(err, err.toString(), err.stack);
throw `Error while creating new brew, ${err.toString()}`;
});
if(!saved) return;
saved = saved.toObject();
res.status(200).send(saved);
},
updateBrew : async (req, res)=>{
// Initialize brew from request and body, destructure query params, and set the initial value for the after-save method
const brewFromClient = api.excludePropsFromUpdate(req.body);
const brewFromServer = req.brew;
if(brewFromServer.version && brewFromClient.version && brewFromServer.version > brewFromClient.version) {
console.log(`Version mismatch on brew ${brewFromClient.editId}`);
res.setHeader('Content-Type', 'application/json');
return res.status(409).send(JSON.stringify({ message: `The brew has been changed on a different device. Please save your changes elsewhere, refresh, and try again.` }));
}
let brew = _.assign(brewFromServer, brewFromClient);
const googleId = brew.googleId;
const { saveToGoogle, removeFromGoogle } = req.query;
let afterSave = async ()=>true;
brew.text = api.mergeBrewText(brew);
if(brew.googleId && removeFromGoogle) {
// If the google id exists and we're removing it from google, set afterSave to delete the google brew and mark the brew's google id as undefined
afterSave = async ()=>{
return await api.deleteGoogleBrew(req.account, googleId, brew.editId, res)
.catch((err)=>{
console.error(err);
res.status(err?.status || err?.response?.status || 500).send(err.message || err);
});
};
brew.googleId = undefined;
} else if(!brew.googleId && saveToGoogle) {
// If we don't have a google id and the user wants to save to google, create the google brew and set the google id on the brew
brew.googleId = await api.newGoogleBrew(req.account, api.excludeGoogleProps(brew), res)
.catch((err)=>{
console.error(err);
res.status(err.status || err.response.status).send(err.message || err);
});
if(!brew.googleId) return;
} else if(brew.googleId) {
// If the google id exists and no other actions are being performed, update the google brew
const updated = await GoogleActions.updateGoogleBrew(api.excludeGoogleProps(brew))
.catch((err)=>{
console.error(err);
res.status(err?.response?.status || 500).send(err);
});
if(!updated) return;
}
if(brew.googleId) {
// If the google id exists after all those actions, exclude the props that are stored in google and aren't needed for rendering the brew items
api.excludeStubProps(brew);
} else {
// Compress brew text to binary before saving
brew.textBin = zlib.deflateRawSync(brew.text);
// Delete the non-binary text field since it's not needed anymore
brew.text = undefined;
brew.updatedAt = new Date();
if(req.account) {
brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
}
brew.markModified('authors');
brew.markModified('systems');
brew.save((err, obj)=>{
if(err) throw err;
return res.status(200).send(obj);
});
})
.catch((err)=>{
console.error(err);
return res.status(500).send('Error while saving');
});
};
const deleteBrew = (req, res)=>{
HomebrewModel.find({ editId: req.params.id }, (err, objs)=>{
if(!objs.length || err) {
return res.status(404).send('Can not find homebrew with that id');
}
const brew = objs[0];
brew.updatedAt = new Date();
brew.version = (brew.version || 1) + 1;
if(req.account) {
// Remove current user as author
brew.authors = _.pull(brew.authors, req.account.username);
brew.markModified('authors');
brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
brew.invitedAuthors = _.uniq(_.filter(brew.invitedAuthors, (a)=>req.account.username !== a));
}
if(brew.authors.length === 0) {
// Delete brew if there are no authors left
brew.remove((err)=>{
if(err) return res.status(500).send('Error while removing');
return res.status(200).send();
});
// define a function to catch our save errors
const saveError = (err)=>{
console.error(err);
res.status(err.status || 500).send(err.message || 'Unable to save brew to Homebrewery database');
};
let saved;
if(!brew._id) {
// if the brew does not have a stub id, create and save it, then write the new value back to the brew.
saved = await new HomebrewModel(brew).save().catch(saveError);
} else {
// Otherwise, save the brew with updated author list
brew.save((err, savedBrew)=>{
if(err) throw err;
return res.status(200).send(savedBrew);
});
// if the brew does have a stub id, update it using the stub id as the key.
brew = _.assign(await HomebrewModel.findOne({ _id: brew._id }), brew);
saved = await brew.save()
.catch(saveError);
}
});
};
if(!saved) return;
// Call and wait for afterSave to complete
const after = await afterSave();
if(!after) return;
const newGoogleBrew = async (req, res, next)=>{
let oAuth2Client;
res.status(200).send(saved);
},
deleteGoogleBrew : async (account, id, editId, res)=>{
const auth = await GoogleActions.authCheck(account, res);
await GoogleActions.deleteGoogleBrew(auth, id, editId);
return true;
},
deleteBrew : async (req, res, next)=>{
// Delete an orphaned stub if its Google brew doesn't exist
try {
await api.getBrew('edit')(req, res, ()=>{});
} catch (err) {
const { id, googleId } = api.getId(req);
console.warn(`No google brew found for id ${googleId}, the stub with id ${id} will be deleted.`);
await HomebrewModel.deleteOne({ editId: id });
return next();
}
try { oAuth2Client = GoogleActions.authCheck(req.account, res); } catch (err) { return res.status(err.status).send(err.message); }
let brew = req.brew;
const { googleId, editId } = brew;
const account = req.account;
const isOwner = account && (brew.authors.length === 0 || brew.authors[0] === account.username);
// If the user is the owner and the file is saved to google, mark the google brew for deletion
const shouldDeleteGoogleBrew = googleId && isOwner;
const brew = req.body;
if(brew._id) {
brew = _.assign(await HomebrewModel.findOne({ _id: brew._id }), brew);
if(account) {
// Remove current user as author
brew.authors = _.pull(brew.authors, account.username);
}
if(!brew.title) {
brew.title = getGoodBrewTitle(brew.text);
}
if(brew.authors.length === 0) {
// Delete brew if there are no authors left
await brew.remove()
.catch((err)=>{
console.error(err);
throw { status: 500, message: 'Error while removing' };
});
} else {
if(shouldDeleteGoogleBrew) {
// When there are still authors remaining, we delete the google brew but store the full brew in the Homebrewery database
brew.googleId = undefined;
brew.textBin = zlib.deflateRawSync(brew.text);
brew.text = undefined;
}
brew.markModified('authors'); //Mongo will not properly update arrays without markModified()
await brew.save()
.catch((err)=>{
throw { status: 500, message: err };
});
}
}
if(shouldDeleteGoogleBrew) {
const deleted = await api.deleteGoogleBrew(account, googleId, editId, res)
.catch((err)=>{
console.error(err);
res.status(500).send(err);
});
if(!deleted) return;
}
brew.authors = (req.account) ? [req.account.username] : [];
brew.text = mergeBrewText(brew);
delete brew.editId;
delete brew.shareId;
delete brew.googleId;
req.body = brew;
try {
const newBrew = await GoogleActions.newGoogleBrew(oAuth2Client, brew);
return res.status(200).send(newBrew);
} catch (err) {
return res.status(err.response.status).send(err);
res.status(204).send();
}
};
const updateGoogleBrew = async (req, res, next)=>{
let oAuth2Client;
router.use('/api', require('./middleware/check-client-version.js'));
router.post('/api', asyncHandler(api.newBrew));
router.put('/api/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew));
router.put('/api/update/:id', asyncHandler(api.getBrew('edit', true)), asyncHandler(api.updateBrew));
router.delete('/api/:id', asyncHandler(api.deleteBrew));
router.get('/api/remove/:id', asyncHandler(api.deleteBrew));
try { oAuth2Client = GoogleActions.authCheck(req.account, res); } catch (err) { return res.status(err.status).send(err.message); }
const brew = excludePropsFromUpdate(req.body);
brew.text = mergeBrewText(brew);
try {
const updatedBrew = await GoogleActions.updateGoogleBrew(oAuth2Client, brew);
return res.status(200).send(updatedBrew);
} catch (err) {
return res.status(err.response?.status || 500).send(err);
}
};
router.post('/api', newBrew);
router.post('/api/newGoogle/', newGoogleBrew);
router.put('/api/:id', updateBrew);
router.put('/api/update/:id', updateBrew);
router.put('/api/updateGoogle/:id', updateGoogleBrew);
router.delete('/api/:id', deleteBrew);
router.get('/api/remove/:id', deleteBrew);
router.get('/api/removeGoogle/:id', (req, res)=>{GoogleActions.deleteGoogleBrew(req, res, req.params.id);});
module.exports = router;
module.exports = api;

758
server/homebrew.api.spec.js Normal file
View File

@@ -0,0 +1,758 @@
/* eslint-disable max-lines */
describe('Tests for api', ()=>{
let api;
let google;
let model;
let hbBrew;
let googleBrew;
let res;
let modelBrew;
let saveFunc;
let removeFunc;
let markModifiedFunc;
let saved;
beforeEach(()=>{
saved = undefined;
saveFunc = jest.fn(async function() {
saved = { ...this, _id: '1' };
return saved;
});
removeFunc = jest.fn(async function() {});
markModifiedFunc = jest.fn(()=>true);
modelBrew = (brew)=>({
...brew,
save : saveFunc,
remove : removeFunc,
markModified : markModifiedFunc,
toObject : function() {
delete this.save;
delete this.toObject;
delete this.remove;
delete this.markModified;
return this;
}
});
google = require('./googleActions.js');
model = require('./homebrew.model.js').model;
jest.mock('./googleActions.js');
google.authCheck = jest.fn(()=>'client');
google.newGoogleBrew = jest.fn(()=>'id');
google.deleteGoogleBrew = jest.fn(()=>true);
jest.mock('./homebrew.model.js');
model.mockImplementation((brew)=>modelBrew(brew));
res = {
status : jest.fn(()=>res),
send : jest.fn(()=>{})
};
api = require('./homebrew.api');
hbBrew = {
text : `brew text`,
style : 'hello yes i am css',
title : 'some title',
description : 'this is a description',
tags : ['something', 'fun'],
systems : ['D&D 5e'],
renderer : 'v3',
theme : 'phb',
published : true,
authors : ['1', '2'],
owner : '1',
thumbnail : '',
_id : 'mongoid',
editId : 'abcdefg',
shareId : 'hijklmnop',
views : 1,
lastViewed : new Date(),
version : 1,
pageCount : 1,
textBin : '',
views : 0
};
googleBrew = {
...hbBrew,
googleId : '12345'
};
});
afterEach(()=>{
jest.restoreAllMocks();
});
describe('getId', ()=>{
it('should return only id if google id is not present', ()=>{
const { id, googleId } = api.getId({
params : {
id : 'abcdefgh'
}
});
expect(id).toEqual('abcdefgh');
expect(googleId).toBeUndefined();
});
it('should return id and google id from request body', ()=>{
const { id, googleId } = api.getId({
params : {
id : 'abcdefgh'
},
body : {
googleId : '12345'
}
});
expect(id).toEqual('abcdefgh');
expect(googleId).toEqual('12345');
});
it('should return id and google id from params', ()=>{
const { id, googleId } = api.getId({
params : {
id : '123456789012abcdefghijkl'
}
});
expect(id).toEqual('abcdefghijkl');
expect(googleId).toEqual('123456789012');
});
});
describe('getBrew', ()=>{
const toBrewPromise = (brew)=>new Promise((res)=>res({ toObject: ()=>brew }));
const notFoundError = 'Brew not found in Homebrewery database or Google Drive';
it('returns middleware', ()=>{
const getFn = api.getBrew('share');
expect(getFn).toBeInstanceOf(Function);
});
it('should fetch from mongoose', async ()=>{
const testBrew = { title: 'test brew', authors: [] };
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>toBrewPromise(testBrew));
const fn = api.getBrew('share', true);
const req = { brew: {} };
const next = jest.fn();
await fn(req, null, next);
expect(req.brew).toEqual(testBrew);
expect(next).toHaveBeenCalled();
expect(api.getId).toHaveBeenCalledWith(req);
expect(model.get).toHaveBeenCalledWith({ shareId: '1' });
});
it('should handle mongoose error', async ()=>{
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>new Promise((_, rej)=>rej('Unable to find brew')));
const fn = api.getBrew('share', false);
const req = { brew: {} };
const next = jest.fn();
let err;
try {
await fn(req, null, next);
} catch (e) {
err = e;
}
expect(err).toEqual(notFoundError);
expect(req.brew).toEqual({});
expect(next).not.toHaveBeenCalled();
expect(api.getId).toHaveBeenCalledWith(req);
expect(model.get).toHaveBeenCalledWith({ shareId: '1' });
});
it('changes tags from string to array', async ()=>{
const testBrew = { title: 'test brew', authors: [], tags: '' };
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>toBrewPromise(testBrew));
const fn = api.getBrew('share', true);
const req = { brew: {} };
const next = jest.fn();
await fn(req, null, next);
expect(req.brew.tags).toEqual([]);
expect(next).toHaveBeenCalled();
});
it('throws if invalid author', async ()=>{
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', authors: ['a'] }));
const fn = api.getBrew('edit', true);
const req = { brew: {} };
let err;
try {
await fn(req, null, null);
} catch (e) {
err = e;
}
expect(err).toEqual(`The current logged in user does not have editor access to this brew.
If you believe you should have access to this brew, ask the file owner to invite you as an author by opening the brew, viewing the Properties tab, and adding your username to the "invited authors" list. You can then try to access this document again.`);
});
it('does not throw if no authors', async ()=>{
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', authors: [] }));
const fn = api.getBrew('edit', true);
const req = { brew: {} };
const next = jest.fn();
await fn(req, null, next);
expect(next).toHaveBeenCalled();
expect(req.brew.title).toEqual('test brew');
expect(req.brew.authors).toEqual([]);
});
it('does not throw if valid author', async ()=>{
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
model.get = jest.fn(()=>toBrewPromise({ title: 'test brew', authors: ['a'] }));
const fn = api.getBrew('edit', true);
const req = { brew: {}, account: { username: 'a' } };
const next = jest.fn();
await fn(req, null, next);
expect(next).toHaveBeenCalled();
expect(req.brew.title).toEqual('test brew');
expect(req.brew.authors).toEqual(['a']);
});
it('fetches google brew if needed', async()=>{
const stubBrew = { title: 'test brew', authors: ['a'] };
const googleBrew = { title: 'test google brew', text: 'brew text' };
api.getId = jest.fn(()=>({ id: '1', googleId: '2' }));
model.get = jest.fn(()=>toBrewPromise(stubBrew));
google.getGoogleBrew = jest.fn(()=>new Promise((res)=>res(googleBrew)));
const fn = api.getBrew('share', false);
const req = { brew: {} };
const next = jest.fn();
await fn(req, null, next);
expect(req.brew).toEqual({
title : 'test google brew',
authors : ['a'],
text : 'brew text',
stubbed : true,
description : '',
editId : undefined,
pageCount : 1,
published : false,
renderer : 'legacy',
shareId : undefined,
systems : [],
tags : [],
theme : '5ePHB',
thumbnail : '',
textBin : undefined,
version : undefined,
createdAt : undefined,
gDrive : false,
style : undefined,
trashed : false,
updatedAt : undefined,
views : 0
});
expect(next).toHaveBeenCalled();
expect(api.getId).toHaveBeenCalledWith(req);
expect(model.get).toHaveBeenCalledWith({ shareId: '1' });
expect(google.getGoogleBrew).toHaveBeenCalledWith('2', '1', 'share');
});
});
describe('mergeBrewText', ()=>{
it('should set metadata and no style if it is not present', ()=>{
const result = api.mergeBrewText({
text : `brew`,
title : 'some title',
description : 'this is a description',
tags : ['something', 'fun'],
systems : ['D&D 5e'],
renderer : 'v3',
theme : 'phb',
googleId : '12345'
});
expect(result).toEqual(`\`\`\`metadata
title: some title
description: this is a description
tags:
- something
- fun
systems:
- D&D 5e
renderer: v3
theme: phb
\`\`\`
brew`);
});
it('should set metadata and style', ()=>{
const result = api.mergeBrewText({
text : `brew`,
style : 'hello yes i am css',
title : 'some title',
description : 'this is a description',
tags : ['something', 'fun'],
systems : ['D&D 5e'],
renderer : 'v3',
theme : 'phb',
googleId : '12345'
});
expect(result).toEqual(`\`\`\`metadata
title: some title
description: this is a description
tags:
- something
- fun
systems:
- D&D 5e
renderer: v3
theme: phb
\`\`\`
\`\`\`css
hello yes i am css
\`\`\`
brew`);
});
});
describe('exclusion methods', ()=>{
it('excludePropsFromUpdate removes the correct keys', ()=>{
const sent = Object.assign({}, googleBrew);
const result = api.excludePropsFromUpdate(sent);
expect(sent).toEqual(googleBrew);
expect(result._id).toBeUndefined();
expect(result.views).toBeUndefined();
expect(result.lastViewed).toBeUndefined();
});
it('excludeGoogleProps removes the correct keys', ()=>{
const sent = Object.assign({}, googleBrew);
const result = api.excludeGoogleProps(sent);
expect(sent).toEqual(googleBrew);
expect(result.tags).toBeUndefined();
expect(result.systems).toBeUndefined();
expect(result.published).toBeUndefined();
expect(result.authors).toBeUndefined();
expect(result.owner).toBeUndefined();
expect(result.views).toBeUndefined();
expect(result.thumbnail).toBeUndefined();
expect(result.version).toBeUndefined();
});
it('excludeStubProps removes the correct keys from the original object', ()=>{
const sent = Object.assign({}, googleBrew);
const result = api.excludeStubProps(sent);
expect(sent).not.toEqual(googleBrew);
expect(result.text).toBeUndefined();
expect(result.textBin).toBeUndefined();
expect(result.renderer).toBeUndefined();
expect(result.pageCount).toBeUndefined();
});
});
describe('beforeNewSave', ()=>{
it('sets the title if none', ()=>{
const brew = {
...hbBrew,
title : undefined
};
api.beforeNewSave({}, brew);
expect(brew.title).toEqual('brew text');
});
it('does not override the title if present', ()=>{
const brew = {
...hbBrew,
title : 'test'
};
api.beforeNewSave({}, brew);
expect(brew.title).toEqual('test');
});
it('does not set authors if account missing username', ()=>{
api.beforeNewSave({}, hbBrew);
expect(hbBrew.authors).toEqual([]);
});
it('sets authors if account has username', ()=>{
api.beforeNewSave({ username: 'hi' }, hbBrew);
expect(hbBrew.authors).toEqual(['hi']);
});
it('merges brew text', ()=>{
api.mergeBrewText = jest.fn(()=>'merged');
api.beforeNewSave({}, hbBrew);
expect(api.mergeBrewText).toHaveBeenCalled();
expect(hbBrew.text).toEqual('merged');
});
});
describe('newGoogleBrew', ()=>{
it('should call the correct methods', ()=>{
api.excludeGoogleProps = jest.fn(()=>'newBrew');
const acct = { username: 'test' };
const brew = { title: 'test title' };
api.newGoogleBrew(acct, brew, res);
expect(google.authCheck).toHaveBeenCalledWith(acct, res);
expect(api.excludeGoogleProps).toHaveBeenCalledWith(brew);
expect(google.newGoogleBrew).toHaveBeenCalledWith('client', 'newBrew');
});
});
describe('newBrew', ()=>{
it('should set up a default brew via Homebrew model', async ()=>{
await api.newBrew({ body: { text: 'asdf' }, query: {}, account: { username: 'test user' } }, res);
expect(res.status).toHaveBeenCalledWith(200);
expect(res.send).toHaveBeenCalledWith({
_id : '1',
authors : ['test user'],
createdAt : undefined,
description : '',
editId : expect.any(String),
gDrive : false,
pageCount : 1,
published : false,
renderer : 'V3',
shareId : expect.any(String),
style : undefined,
systems : [],
tags : [],
text : undefined,
textBin : expect.objectContaining({}),
theme : '5ePHB',
thumbnail : '',
title : 'asdf',
trashed : false,
updatedAt : undefined,
views : 0
});
});
it('should remove edit/share/google ids', async ()=>{
await api.newBrew({ body: { editId: '1234', shareId: '1234', googleId: '1234', text: 'asdf', title: '' }, query: {} }, res);
expect(res.status).toHaveBeenCalledWith(200);
expect(res.send).toHaveBeenCalled();
const sent = res.send.mock.calls[0][0];
expect(sent.editId).not.toEqual('1234');
expect(sent.shareId).not.toEqual('1234');
expect(sent.googleId).toBeUndefined();
});
it('should handle mongo error', async ()=>{
saveFunc = jest.fn(async function() {
throw 'err';
});
model.mockImplementation((brew)=>modelBrew(brew));
let err;
try {
await api.newBrew({ body: { editId: '1234', shareId: '1234', googleId: '1234', text: 'asdf', title: '' }, query: {} }, res);
} catch (e) {
err = e;
}
expect(res.send).not.toHaveBeenCalled();
expect(err).not.toBeUndefined();
});
it('should save to google if requested', async()=>{
await api.newBrew({ body: { text: 'asdf', title: '' }, query: { saveToGoogle: true }, account: { username: 'test user' } }, res);
expect(google.newGoogleBrew).toHaveBeenCalled();
expect(res.status).toHaveBeenCalledWith(200);
expect(res.send).toHaveBeenCalledWith({
_id : '1',
authors : ['test user'],
createdAt : undefined,
description : '',
editId : expect.any(String),
gDrive : false,
pageCount : undefined,
published : false,
renderer : undefined,
shareId : expect.any(String),
googleId : expect.any(String),
style : undefined,
systems : [],
tags : [],
text : undefined,
textBin : undefined,
theme : '5ePHB',
thumbnail : '',
title : 'asdf',
trashed : false,
updatedAt : undefined,
views : 0
});
});
it('should handle google error', async()=>{
google.newGoogleBrew = jest.fn(()=>{
throw 'err';
});
await api.newBrew({ body: { text: 'asdf', title: '' }, query: { saveToGoogle: true }, account: { username: 'test user' } }, res);
expect(res.status).toHaveBeenCalledWith(500);
expect(res.send).toHaveBeenCalledWith('err');
});
});
describe('deleteGoogleBrew', ()=>{
it('should check auth and delete brew', async ()=>{
const result = await api.deleteGoogleBrew({ username: 'test user' }, 'id', 'editId', res);
expect(result).toBe(true);
expect(google.authCheck).toHaveBeenCalledWith({ username: 'test user' }, expect.objectContaining({}));
expect(google.deleteGoogleBrew).toHaveBeenCalledWith('client', 'id', 'editId');
});
});
describe('deleteBrew', ()=>{
it('should handle case where fetching the brew returns an error', async ()=>{
api.getBrew = jest.fn(()=>async ()=>{ throw 'err'; });
api.getId = jest.fn(()=>({ id: '1', googleId: '2' }));
model.deleteOne = jest.fn(async ()=>{});
const next = jest.fn(()=>{});
await api.deleteBrew(null, null, next);
expect(next).toHaveBeenCalled();
expect(model.deleteOne).toHaveBeenCalledWith({ editId: '1' });
});
it('should delete if no authors', async ()=>{
const brew = {
...hbBrew,
authors : []
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
const req = {};
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).toHaveBeenCalled();
});
it('should throw on delete error', async ()=>{
const brew = {
...hbBrew,
authors : []
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
removeFunc = jest.fn(async ()=>{ throw 'err'; });
const req = {};
let err;
try {
await api.deleteBrew(req, res);
} catch (e) {
err = e;
}
expect(err).not.toBeUndefined();
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).toHaveBeenCalled();
});
it('should delete when one author', async ()=>{
const brew = {
...hbBrew,
authors : ['test']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
const req = { account: { username: 'test' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).toHaveBeenCalled();
});
it('should remove one author when multiple present', async ()=>{
const brew = {
...hbBrew,
authors : ['test', 'test2']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
const req = { account: { username: 'test' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(markModifiedFunc).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled();
expect(saveFunc).toHaveBeenCalled();
expect(saved.authors).toEqual(['test2']);
});
it('should handle save error', async ()=>{
const brew = {
...hbBrew,
authors : ['test', 'test2']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
saveFunc = jest.fn(async ()=>{ throw 'err'; });
const req = { account: { username: 'test' } };
let err;
try {
await api.deleteBrew(req, res);
} catch (e) {
err = e;
}
expect(err).not.toBeUndefined();
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled();
expect(saveFunc).toHaveBeenCalled();
});
it('should delete google brew', async ()=>{
const brew = {
...googleBrew,
authors : ['test']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
api.deleteGoogleBrew = jest.fn(async ()=>true);
const req = { account: { username: 'test' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).toHaveBeenCalled();
expect(api.deleteGoogleBrew).toHaveBeenCalled();
});
it('should handle google brew delete error', async ()=>{
const brew = {
...googleBrew,
authors : ['test']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
api.deleteGoogleBrew = jest.fn(async ()=>{
throw 'err';
});
const req = { account: { username: 'test' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).toHaveBeenCalled();
expect(api.deleteGoogleBrew).toHaveBeenCalled();
});
it('should delete google brew and retain stub when multiple authors and owner request deletion', async ()=>{
const brew = {
...googleBrew,
authors : ['test', 'test2']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
api.deleteGoogleBrew = jest.fn(async ()=>true);
const req = { account: { username: 'test' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(markModifiedFunc).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled();
expect(api.deleteGoogleBrew).toHaveBeenCalled();
expect(saveFunc).toHaveBeenCalled();
expect(saved.authors).toEqual(['test2']);
expect(saved.googleId).toEqual(undefined);
expect(saved.text).toEqual(undefined);
expect(saved.textBin).not.toEqual(undefined);
});
it('should retain google brew and update stub when multiple authors and extra author requests deletion', async ()=>{
const brew = {
...googleBrew,
authors : ['test', 'test2']
};
api.getBrew = jest.fn(()=>async (req)=>{
req.brew = brew;
});
model.findOne = jest.fn(async ()=>modelBrew(brew));
api.deleteGoogleBrew = jest.fn(async ()=>true);
const req = { account: { username: 'test2' } };
await api.deleteBrew(req, res);
expect(api.getBrew).toHaveBeenCalled();
expect(model.findOne).toHaveBeenCalled();
expect(removeFunc).not.toHaveBeenCalled();
expect(api.deleteGoogleBrew).not.toHaveBeenCalled();
expect(saveFunc).toHaveBeenCalled();
expect(saved.authors).toEqual(['test']);
expect(saved.googleId).toEqual(brew.googleId);
});
});
});

View File

@@ -6,17 +6,20 @@ const zlib = require('zlib');
const HomebrewSchema = mongoose.Schema({
shareId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } },
editId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } },
googleId : { type: String },
title : { type: String, default: '' },
text : { type: String, default: '' },
textBin : { type: Buffer },
pageCount : { type: Number, default: 1 },
description : { type: String, default: '' },
tags : { type: String, default: '' },
systems : [String],
renderer : { type: String, default: '' },
authors : [String],
published : { type: Boolean, default: false },
description : { type: String, default: '' },
tags : [String],
systems : [String],
renderer : { type: String, default: '' },
authors : [String],
invitedAuthors : [String],
published : { type: Boolean, default: false },
thumbnail : { type: String, default: '' },
createdAt : { type: Date, default: Date.now },
updatedAt : { type: Date, default: Date.now },
@@ -36,28 +39,26 @@ HomebrewSchema.statics.increaseView = async function(query) {
return brew;
};
HomebrewSchema.statics.get = function(query){
HomebrewSchema.statics.get = function(query, fields=null){
return new Promise((resolve, reject)=>{
Homebrew.find(query, (err, brews)=>{
Homebrew.find(query, fields, null, (err, brews)=>{
if(err || !brews.length) return reject('Can not find brew');
if(!_.isNil(brews[0].textBin)) { // Uncompress zipped text field
unzipped = zlib.inflateRawSync(brews[0].textBin);
brews[0].text = unzipped.toString();
}
if(!brews[0].renderer)
brews[0].renderer = 'legacy';
return resolve(brews[0]);
});
});
};
HomebrewSchema.statics.getByUser = function(username, allowAccess=false){
HomebrewSchema.statics.getByUser = function(username, allowAccess=false, fields=null){
return new Promise((resolve, reject)=>{
const query = { authors: username, published: true };
if(allowAccess){
delete query.published;
}
Homebrew.find(query).lean().exec((err, brews)=>{ //lean() converts results to JSObjects
Homebrew.find(query, fields).lean().exec((err, brews)=>{ //lean() converts results to JSObjects
if(err) return reject('Can not find brew');
return resolve(brews);
});

View File

@@ -0,0 +1,12 @@
module.exports = (req, res, next)=>{
const userVersion = req.get('Homebrewery-Version');
const version = require('../../package.json').version;
if(userVersion != version) {
return res.status(412).send({
message : `Client version ${userVersion} is out of date. Please save your changes elsewhere and refresh to pick up client version ${version}.`
});
}
next();
};

View File

@@ -1,11 +1,7 @@
const jwt = require('jwt-simple');
// Load configuration values
const config = require('nconf')
.argv()
.env({ lowerCase: true }) // Load environment variables
.file('environment', { file: `config/${process.env.NODE_ENV}.json` })
.file('defaults', { file: 'config/default.json' });
const config = require('./config.js');
// Generate an Access Token for the given User ID
const generateAccessToken = (account)=>{

View File

@@ -7,6 +7,7 @@ const cx = require('classnames');
const DISMISS_KEY = 'dismiss_render_warning';
const RenderWarnings = createClass({
displayName : 'RenderWarnings',
getInitialState : function() {
return {
warnings : {}

View File

@@ -27,9 +27,11 @@ if(typeof navigator !== 'undefined'){
require('codemirror/addon/search/matchesonscrollbar.js');
require('codemirror/addon/dialog/dialog.js');
//Trailing space highlighting
require('codemirror/addon/edit/trailingspace.js');
// require('codemirror/addon/edit/trailingspace.js');
//Active line highlighting
require('codemirror/addon/selection/active-line.js');
// require('codemirror/addon/selection/active-line.js');
//Scroll past last line
require('codemirror/addon/scroll/scrollpastend.js');
//Auto-closing
//XML code folding is a requirement of the auto-closing tag feature and is not enabled
require('codemirror/addon/fold/xml-fold.js');
@@ -40,12 +42,14 @@ if(typeof navigator !== 'undefined'){
}
const CodeEditor = createClass({
displayName : 'CodeEditor',
getDefaultProps : function() {
return {
language : '',
value : '',
wrap : true,
onChange : ()=>{}
language : '',
value : '',
wrap : true,
onChange : ()=>{},
enableFolding : true
};
},
@@ -81,6 +85,12 @@ const CodeEditor = createClass({
} else if(this.codeMirror?.getValue() != this.props.value) { //update editor contents if brew.text is changed from outside
this.codeMirror.setValue(this.props.value);
}
if(this.props.enableFolding) {
this.codeMirror.setOption('foldOptions', this.foldOptions(this.codeMirror));
} else {
this.codeMirror.setOption('foldOptions', false);
}
},
buildEditor : function() {
@@ -90,6 +100,7 @@ const CodeEditor = createClass({
indentWithTabs : true,
tabSize : 2,
historyEventDelay : 250,
scrollPastEnd : true,
extraKeys : {
'Ctrl-B' : this.makeBold,
'Cmd-B' : this.makeBold,
@@ -139,39 +150,19 @@ const CodeEditor = createClass({
'Ctrl-]' : this.unfoldAllCode,
'Cmd-]' : this.unfoldAllCode
},
foldGutter : true,
foldOptions : {
scanUp : true,
rangeFinder : CodeMirror.fold.homebrewery,
widget : (from, to)=>{
let text = '';
let currentLine = from.line;
const maxLength = 50;
while (currentLine <= to.line && text.length <= maxLength) {
text += this.codeMirror.getLine(currentLine);
if(currentLine < to.line)
text += ' ';
currentLine += 1;
}
text = text.trim();
if(text.length > maxLength)
text = `${text.substr(0, maxLength)}...`;
return `\u21A4 ${text} \u21A6`;
}
},
gutters : ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
autoCloseTags : true,
styleActiveLine : true,
showTrailingSpace : true,
specialChars : / /,
specialCharPlaceholder : function(char) {
const el = document.createElement('span');
el.className = 'cm-space';
el.innerHTML = ' ';
return el;
}
foldGutter : true,
foldOptions : this.foldOptions(this.codeMirror),
gutters : ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
autoCloseTags : true,
styleActiveLine : true,
showTrailingSpace : false,
// specialChars : / /,
// specialCharPlaceholder : function(char) {
// const el = document.createElement('span');
// el.className = 'cm-space';
// el.innerHTML = ' ';
// return el;
// }
});
closeTag.autoCloseCurlyBraces(CodeMirror, this.codeMirror);
@@ -238,6 +229,15 @@ const CodeEditor = createClass({
this.codeMirror.replaceSelection('\n\\page\n\n', 'end');
},
injectText : function(injectText, overwrite=true) {
const cm = this.codeMirror;
if(!overwrite) {
cm.setCursor(cm.getCursor('from'));
}
cm.replaceSelection(injectText, 'end');
cm.focus();
},
makeUnderline : function() {
const selection = this.codeMirror.getSelection(), t = selection.slice(0, 3) === '<u>' && selection.slice(-4) === '</u>';
this.codeMirror.replaceSelection(t ? selection.slice(3, -4) : `<u>${selection}</u>`, 'around');
@@ -355,6 +355,38 @@ const CodeEditor = createClass({
historySize : function(){
return this.codeMirror.doc.historySize();
},
foldOptions : function(cm){
return {
scanUp : true,
rangeFinder : CodeMirror.fold.homebrewery,
widget : (from, to)=>{
let text = '';
let currentLine = from.line;
const maxLength = 50;
let foldPreviewText = '';
while (currentLine <= to.line && text.length <= maxLength) {
const currentText = this.codeMirror.getLine(currentLine);
currentLine++;
if(currentText[0] == '#'){
foldPreviewText = currentText;
break;
}
if(!foldPreviewText && currentText != '\n') {
foldPreviewText = currentText;
}
}
text = foldPreviewText || `Lines ${from.line+1}-${to.line+1}`;
text = text.trim();
if(text.length > maxLength)
text = `${text.substr(0, maxLength)}...`;
return `\u21A4 ${text} \u21A6`;
}
};
},
//----------------------//
render : function(){

View File

@@ -3,20 +3,31 @@
@import (less) 'codemirror/addon/search/matchesonscrollbar.css';
@import (less) 'codemirror/addon/dialog/dialog.css';
@keyframes sourceMoveAnimation {
50% {background-color: red; color: white;}
100% {background-color: unset; color: unset;}
}
.codeEditor{
.CodeMirror-foldmarker {
font-family: inherit;
text-shadow: none;
font-weight: 600;
color: grey;
}
.sourceMoveFlash .CodeMirror-line{
animation-name: sourceMoveAnimation;
animation-duration: 0.4s;
}
.cm-tab {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAQAAACOs/baAAAARUlEQVR4nGJgIAG8JkXxUAcCtDWemcGR1lY4MvgzCEKY7jSBjgxBDAG09UEQzAe0AMwMHrSOAwEGRtpaMIwAAAAA//8DAG4ID9EKs6YqAAAAAElFTkSuQmCC) no-repeat right;
}
//.cm-tab {
// background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAQAAACOs/baAAAARUlEQVR4nGJgIAG8JkXxUAcCtDWemcGR1lY4MvgzCEKY7jSBjgxBDAG09UEQzAe0AMwMHrSOAwEGRtpaMIwAAAAA//8DAG4ID9EKs6YqAAAAAElFTkSuQmCC) no-repeat right;
//}
.cm-trailingspace {
.cm-space {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQAgMAAABW5NbuAAAACVBMVEVHcEwAAAAAAAAWawmTAAAAA3RSTlMAPBJ6PMxpAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFUlEQVQI12NgwACcCQysASAEZGAAACMuAX06aCQUAAAAAElFTkSuQmCC) no-repeat right;
}
}
}
//.cm-trailingspace {
// .cm-space {
// background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAQAgMAAABW5NbuAAAACVBMVEVHcEwAAAAAAAAWawmTAAAAA3RSTlMAPBJ6PMxpAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFUlEQVQI12NgwACcCQysASAEZGAAACMuAX06aCQUAAAAAElFTkSuQmCC) no-repeat right;
// }
//}
}

View File

@@ -32,7 +32,7 @@ const mustacheSpans = {
start(src) { return src.match(/{{[^{]/)?.index; }, // Hint to Marked.js to stop and check for a match
tokenizer(src, tokens) {
const completeSpan = /^{{[^\n]*}}/; // Regex for the complete token
const inlineRegex = /{{(?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])*\s*|}}/g;
const inlineRegex = /{{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1 *|}}/g;
const match = completeSpan.exec(src);
if(match) {
//Find closing delimiter
@@ -82,7 +82,7 @@ const mustacheDivs = {
start(src) { return src.match(/\n *{{[^{]/m)?.index; }, // Hint to Marked.js to stop and check for a match
tokenizer(src, tokens) {
const completeBlock = /^ *{{[^\n}]* *\n.*\n *}}/s; // Regex for the complete token
const blockRegex = /^ *{{(?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])* *$|^ *}}$/gm;
const blockRegex = /^ *{{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1 *$|^ *}}$/gm;
const match = completeBlock.exec(src);
if(match) {
//Find closing delimiter
@@ -130,7 +130,7 @@ const mustacheInjectInline = {
level : 'inline',
start(src) { return src.match(/ *{[^{\n]/)?.index; }, // Hint to Marked.js to stop and check for a match
tokenizer(src, tokens) {
const inlineRegex = /^ *{((?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])*)}/g;
const inlineRegex = /^ *{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1}/g;
const match = inlineRegex.exec(src);
if(match) {
const lastToken = tokens[tokens.length - 1];
@@ -165,7 +165,7 @@ const mustacheInjectBlock = {
level : 'block',
start(src) { return src.match(/\n *{[^{\n]/m)?.index; }, // Hint to Marked.js to stop and check for a match
tokenizer(src, tokens) {
const inlineRegex = /^ *{((?::(?:"[\w,\-()#%. ]*"|[\w\,\-()#%.]*)|[^"'{}\s])*)}/ym;
const inlineRegex = /^ *{(?=((?::(?:"[\w,\-()#%. ]*"|[\w\-()#%.]*)|[^"':{}\s]*)*))\1}/ym;
const match = inlineRegex.exec(src);
if(match) {
const lastToken = tokens[tokens.length - 1];

View File

@@ -8,7 +8,8 @@ const NaturalCritIcon = require('naturalcrit/svg/naturalcrit.svg.jsx');
const Nav = {
base : createClass({
render : function(){
displayName : 'Nav.base',
render : function(){
return <nav>
<div className='navContent'>
{this.props.children}
@@ -26,7 +27,8 @@ const Nav = {
},
section : createClass({
render : function(){
displayName : 'Nav.section',
render : function(){
return <div className='navSection'>
{this.props.children}
</div>;
@@ -34,6 +36,7 @@ const Nav = {
}),
item : createClass({
displayName : 'Nav.item',
getDefaultProps : function() {
return {
icon : null,
@@ -69,18 +72,36 @@ const Nav = {
}),
dropdown : createClass({
displayName : 'Nav.dropdown',
getDefaultProps : function() {
return {
trigger : 'hover'
};
},
getInitialState : function() {
return {
showDropdown : false
};
},
componentDidMount : function() {
if(this.props.trigger == 'click')
document.addEventListener('click', this.handleClickOutside);
},
componentWillUnmount : function() {
if(this.props.trigger == 'click')
document.removeEventListener('click', this.handleClickOutside);
},
handleClickOutside : function(e){
// Close dropdown when clicked outside
if(this.refs.dropdown && !this.refs.dropdown.contains(e.target)) {
this.handleDropdown(false);
}
},
handleDropdown : function(show){
this.setState({
showDropdown : show
});
},
renderDropdown : function(dropdownChildren){
if(!this.state.showDropdown) return null;
@@ -90,7 +111,6 @@ const Nav = {
</div>
);
},
render : function () {
const dropdownChildren = React.Children.map(this.props.children, (child, i)=>{
// Ignore the first child
@@ -98,10 +118,12 @@ const Nav = {
return child;
});
return (
<div className='navDropdownContainer'
onMouseEnter={()=>this.handleDropdown(true)}
onMouseLeave={()=>this.handleDropdown(false)}>
{this.props.children[0]}
<div className={`navDropdownContainer ${this.props.className}`}
ref='dropdown'
onMouseEnter={this.props.trigger == 'hover' ? ()=>{this.handleDropdown(true);} : undefined}
onClick= {this.props.trigger == 'click' ? ()=>{this.handleDropdown(true);} : undefined}
onMouseLeave={this.props.trigger == 'hover' ? ()=>{this.handleDropdown(false);} : undefined}>
{this.props.children[0] || this.props.children /*children is not an array when only one child*/}
{this.renderDropdown(dropdownChildren)}
</div>
);

View File

@@ -1,3 +1,4 @@
@import '../styles/colors';
@keyframes glideDropDown {
0% {transform : translate(0px, -100%);
opacity : 0;
@@ -49,6 +50,7 @@ nav{
}
}
.navItem{
#backgroundColorsHover;
.animate(background-color);
padding : 8px 12px;
cursor : pointer;
@@ -58,30 +60,12 @@ nav{
color : white;
text-decoration : none;
text-transform : uppercase;
line-height : 13px;
i{
margin-left : 5px;
font-size : 13px;
float : right;
}
&.tealLight:hover{ background-color : @tealLight };
&.teal:hover{ background-color : @teal };
&.greenLight:hover{ background-color : @greenLight };
&.green:hover{ background-color : @green };
&.blueLight:hover{ background-color : @blueLight };
&.blue:hover{ background-color : @blue };
&.purpleLight:hover{ background-color : @purpleLight };
&.purple:hover{ background-color : @purple };
&.steelLight:hover{ background-color : @steelLight };
&.steel:hover{ background-color : @steel };
&.yellowLight:hover{ background-color : @yellowLight };
&.yellow:hover{ background-color : @yellow };
&.orangeLight:hover{ background-color : @orangeLight };
&.orange:hover{ background-color : @orange };
&.redLight:hover{ background-color : @redLight };
&.red:hover{ background-color : @red };
&.silverLight:hover{ background-color : @silverLight };
&.silver:hover{ background-color : @silver };
&.greyLight:hover{ background-color : @greyLight };
&.grey:hover{ background-color : @grey };
}
.navSection:last-child .navItem{
border-left : 1px solid #666;

View File

@@ -5,47 +5,83 @@ const _ = require('lodash');
const cx = require('classnames');
const SplitPane = createClass({
displayName : 'SplitPane',
getDefaultProps : function() {
return {
storageKey : 'naturalcrit-pane-split',
onDragFinish : function(){} //fires when dragging
};
},
getInitialState : function() {
return {
size : null,
isDragging : false
currentDividerPos : null,
windowWidth : 0,
isDragging : false,
moveSource : false,
moveBrew : false,
showMoveArrows : true
};
},
componentDidMount : function() {
const paneSize = window.localStorage.getItem(this.props.storageKey);
if(paneSize){
const dividerPos = window.localStorage.getItem(this.props.storageKey);
if(dividerPos){
this.setState({
size : paneSize
currentDividerPos : this.limitPosition(dividerPos, 0.1*(window.innerWidth-13), 0.9*(window.innerWidth-13)),
userSetDividerPos : dividerPos,
windowWidth : window.innerWidth
});
} else {
this.setState({
currentDividerPos : window.innerWidth / 2,
userSetDividerPos : window.innerWidth / 2
});
}
window.addEventListener('resize', this.handleWindowResize);
},
componentWillUnmount : function() {
window.removeEventListener('resize', this.handleWindowResize);
},
handleWindowResize : function() {
// Allow divider to increase in size to last user-set position
// Limit current position to between 10% and 90% of visible space
const newLoc = this.limitPosition(this.state.userSetDividerPos, 0.1*(window.innerWidth-13), 0.9*(window.innerWidth-13));
this.setState({
currentDividerPos : newLoc,
windowWidth : window.innerWidth
});
},
limitPosition : function(x, min = 1, max = window.innerWidth - 13) {
const result = Math.round(Math.min(max, Math.max(min, x)));
return result;
},
handleUp : function(){
if(this.state.isDragging){
this.props.onDragFinish(this.state.size);
window.localStorage.setItem(this.props.storageKey, this.state.size);
this.props.onDragFinish(this.state.currentDividerPos);
window.localStorage.setItem(this.props.storageKey, this.state.currentDividerPos);
}
this.setState({ isDragging: false });
},
handleDown : function(){
handleDown : function(e){
e.preventDefault();
this.setState({ isDragging: true });
//this.unFocus()
},
handleMove : function(e){
if(!this.state.isDragging) return;
const minWidth = 1;
const maxWidth = window.innerWidth - 13;
const newSize = Math.min(maxWidth, Math.max(minWidth, e.pageX));
const newSize = this.limitPosition(e.pageX);
this.setState({
size : newSize
currentDividerPos : newSize,
userSetDividerPos : newSize
});
},
/*
@@ -56,20 +92,58 @@ const SplitPane = createClass({
window.getSelection().removeAllRanges();
}
},
*/
*/
setMoveArrows : function(newState) {
if(this.state.showMoveArrows != newState){
this.setState({
showMoveArrows : newState
});
}
},
renderMoveArrows : function(){
if(this.state.showMoveArrows) {
return <>
<div className='arrow left'
style={{ left: this.state.currentDividerPos-4 }}
onClick={()=>this.setState({ moveSource: !this.state.moveSource })} >
<i className='fas fa-arrow-left' />
</div>
<div className='arrow right'
style={{ left: this.state.currentDividerPos-4 }}
onClick={()=>this.setState({ moveBrew: !this.state.moveBrew })} >
<i className='fas fa-arrow-right' />
</div>
</>;
}
},
renderDivider : function(){
return <div className='divider' onMouseDown={this.handleDown} >
<div className='dots'>
<i className='fas fa-circle' />
<i className='fas fa-circle' />
<i className='fas fa-circle' />
return <>
{this.renderMoveArrows()}
<div className='divider' onMouseDown={this.handleDown} >
<div className='dots'>
<i className='fas fa-circle' />
<i className='fas fa-circle' />
<i className='fas fa-circle' />
</div>
</div>
</div>;
</>;
},
render : function(){
return <div className='splitPane' onMouseMove={this.handleMove} onMouseUp={this.handleUp}>
<Pane ref='pane1' width={this.state.size}>{this.props.children[0]}</Pane>
<Pane
ref='pane1'
width={this.state.currentDividerPos}
>
{React.cloneElement(this.props.children[0], {
moveBrew : this.state.moveBrew,
moveSource : this.state.moveSource,
setMoveArrows : this.setMoveArrows
})}
</Pane>
{this.renderDivider()}
<Pane ref='pane2' isDragging={this.state.isDragging}>{this.props.children[1]}</Pane>
</div>;
@@ -77,6 +151,7 @@ const SplitPane = createClass({
});
const Pane = createClass({
displayName : 'Pane',
getDefaultProps : function() {
return {
width : null

View File

@@ -13,7 +13,7 @@
.divider{
display : table;
height : 100%;
width : 12px;
width : 15px;
cursor : ew-resize;
background-color : #bbb;
text-align : center;
@@ -22,7 +22,7 @@
vertical-align : middle;
text-align : center;
i{
display : block;
display : block !important;
margin : 10px 0px;
font-size : 6px;
color : #666;
@@ -32,4 +32,28 @@
background-color: #999;
}
}
.arrow{
position : absolute;
width : 25px;
height : 25px;
border : 2px solid #bbb;
border-radius : 15px;
text-align : center;
font-size : 1.2em;
cursor : pointer;
background-color : #ddd;
z-index : 999;
box-shadow : 0 4px 5px #0000007f;
&.left{
.tooltipLeft('Jump to location in Editor');
top : 30px;
}
&.right{
.tooltipRight('Jump to location in Preview');
top : 60px;
}
&:hover{
background-color: #666;
}
}
}

View File

@@ -20,4 +20,50 @@
@silverLight : #ECF0F1;
@silver : #BDC3C7;
@greyLight : #95A5A6;
@grey : #7F8C8D;
@grey : #7F8C8D;
#backgroundColors {
&.tealLight{ background-color : @tealLight };
&.teal{ background-color : @teal };
&.greenLight{ background-color : @greenLight };
&.green{ background-color : @green };
&.blueLight{ background-color : @blueLight };
&.blue{ background-color : @blue };
&.purpleLight{ background-color : @purpleLight };
&.purple{ background-color : @purple };
&.steelLight{ background-color : @steelLight };
&.steel{ background-color : @steel };
&.yellowLight{ background-color : @yellowLight };
&.yellow{ background-color : @yellow };
&.orangeLight{ background-color : @orangeLight };
&.orange{ background-color : @orange };
&.redLight{ background-color : @redLight };
&.red{ background-color : @red };
&.silverLight{ background-color : @silverLight };
&.silver{ background-color : @silver };
&.greyLight{ background-color : @greyLight };
&.grey{ background-color : @grey };
}
#backgroundColorsHover {
&.tealLight:hover{ background-color : @tealLight };
&.teal:hover{ background-color : @teal };
&.greenLight:hover{ background-color : @greenLight };
&.green:hover{ background-color : @green };
&.blueLight:hover{ background-color : @blueLight };
&.blue:hover{ background-color : @blue };
&.purpleLight:hover{ background-color : @purpleLight };
&.purple:hover{ background-color : @purple };
&.steelLight:hover{ background-color : @steelLight };
&.steel:hover{ background-color : @steel };
&.yellowLight:hover{ background-color : @yellowLight };
&.yellow:hover{ background-color : @yellow };
&.orangeLight:hover{ background-color : @orangeLight };
&.orange:hover{ background-color : @orange };
&.redLight:hover{ background-color : @redLight };
&.red:hover{ background-color : @red };
&.silverLight:hover{ background-color : @silverLight };
&.silver:hover{ background-color : @silver };
&.greyLight:hover{ background-color : @greyLight };
&.grey:hover{ background-color : @grey };
}

View File

@@ -1 +1,27 @@
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}
:where(html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video){
border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0
}
:where(article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section){
display:block
}
:where(body){
line-height:1
}
:where(ol,ul){
list-style:none
}
:where(blockquote,q){
quotes:none
}
:where(blockquote:before,blockquote:after,q:before,q:after){
content:none
}
:where(table){
border-collapse:collapse;border-spacing:0
}

View File

@@ -1,7 +0,0 @@
const test = require('pico-check');
test('Just setting up a spot for future tests', (t)=>{
t.pass();
});
module.exports = test;

View File

@@ -0,0 +1,15 @@
/* eslint-disable max-lines */
const Markdown = require('naturalcrit/markdown.js');
test('Escapes <script> tag', function() {
const source = '<script></script>';
const rendered = Markdown.render(source);
expect(rendered).toMatch('&lt;script&gt;&lt;/script&gt;');
});
test('Processes the markdown within an HTML block if its just a class wrapper', function() {
const source = '<div>*Bold text*</div>';
const rendered = Markdown.render(source);
expect(rendered).toBe('<div> <p><em>Bold text</em></p>\n </div>');
});

View File

@@ -0,0 +1,128 @@
/* eslint-disable max-lines */
const Markdown = require('naturalcrit/markdown.js');
test('Renders a mustache span with text only', function() {
const source = '{{ text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block ">text</span>');
});
test('Renders a mustache span with text only, but with spaces', function() {
const source = '{{ this is a text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block ">this is a text</span>');
});
test('Renders an empty mustache span', function() {
const source = '{{}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block "></span>');
});
test('Renders a mustache span with just a space', function() {
const source = '{{ }}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block "></span>');
});
test('Renders a mustache span with a few spaces only', function() {
const source = '{{ }}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block "></span>');
});
test('Renders a mustache span with text and class', function() {
const source = '{{my-class text}}';
const rendered = Markdown.render(source);
// FIXME: why do we have those two extra spaces after closing "?
expect(rendered).toBe('<span class="inline-block my-class" >text</span>');
});
test('Renders a mustache span with text and two classes', function() {
const source = '{{my-class,my-class2 text}}';
const rendered = Markdown.render(source);
// FIXME: why do we have those two extra spaces after closing "?
expect(rendered).toBe('<span class="inline-block my-class my-class2" >text</span>');
});
test('Renders a mustache span with text with spaces and class', function() {
const source = '{{my-class this is a text}}';
const rendered = Markdown.render(source);
// FIXME: why do we have those two extra spaces after closing "?
expect(rendered).toBe('<span class="inline-block my-class" >this is a text</span>');
});
test('Renders a mustache span with text and id', function() {
const source = '{{#my-span text}}';
const rendered = Markdown.render(source);
// FIXME: why do we have that one extra space after closing "?
expect(rendered).toBe('<span class="inline-block " id="my-span" >text</span>');
});
test('Renders a mustache span with text and two ids', function() {
const source = '{{#my-span,#my-favorite-span text}}';
const rendered = Markdown.render(source);
// FIXME: do we need to report an error here somehow?
expect(rendered).toBe('<span class="inline-block " id="my-span" >text</span>');
});
test('Renders a mustache span with text and css property', function() {
const source = '{{color:red text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block " style="color:red;">text</span>');
});
test('Renders a mustache span with text and two css properties', function() {
const source = '{{color:red,padding:5px text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block " style="color:red; padding:5px;">text</span>');
});
test('Renders a mustache span with text and css property which contains quotes', function() {
const source = '{{font:"trebuchet ms" text}}';
const rendered = Markdown.render(source);
// FIXME: is it correct to remove quotes surrounding css property value?
expect(rendered).toBe('<span class="inline-block " style="font:trebuchet ms;">text</span>');
});
test('Renders a mustache span with text and two css properties which contains quotes', function() {
const source = '{{font:"trebuchet ms",padding:"5px 10px" text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block " style="font:trebuchet ms; padding:5px 10px;">text</span>');
});
test('Renders a mustache span with text with quotes and css property which contains quotes', function() {
const source = '{{font:"trebuchet ms" text "with quotes"}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block " style="font:trebuchet ms;">text “with quotes”</span>');
});
test('Renders a mustache span with text, id, class and a couple of css properties', function() {
const source = '{{pen,#author,color:orange,font-family:"trebuchet ms" text}}';
const rendered = Markdown.render(source);
expect(rendered).toBe('<span class="inline-block pen" id="author" style="color:orange; font-family:trebuchet ms;">text</span>');
});
// TODO: add tests for ID with accordance to CSS spec:
//
// From https://drafts.csswg.org/selectors/#id-selectors:
//
// > An ID selector consists of a “number sign” (U+0023, #) immediately followed by the ID value, which must be a CSS identifier.
//
// From: https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier:
//
// > In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9]
// > and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_);
// > they cannot start with a digit, two hyphens, or a hyphen followed by a digit.
// > Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item).
// > For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".
// > Note that Unicode is code-by-code equivalent to ISO 10646 (see [UNICODE] and [ISO10646]).
// TODO: add tests for class with accordance to CSS spec:
//
// From: https://drafts.csswg.org/selectors/#class-html:
//
// > The class selector is given as a full stop (. U+002E) immediately followed by an identifier.

View File

@@ -0,0 +1,27 @@
const supertest = require('supertest');
// Mimic https responses to avoid being redirected all the time
const app = supertest.agent(require('app.js').app)
.set('X-Forwarded-Proto', 'https');
describe('Tests for static pages', ()=>{
it('Home page works', ()=>{
return app.get('/').expect(200);
});
it('Home page legacy works', ()=>{
return app.get('/legacy').expect(200);
});
it('Changelog page works', ()=>{
return app.get('/changelog').expect(200);
});
it('FAQ page works', ()=>{
return app.get('/faq').expect(200);
});
it('robots.txt works', ()=>{
return app.get('/robots.txt').expect(200);
});
});

View File

@@ -1 +0,0 @@
//Set up configs and DB connectiosna nd what not in here

View File

@@ -1,788 +0,0 @@
@import (less) './themes/fonts/5e/fonts.less';
@import (less) './themes/assets/assets.less';
//Colors
@background : #EEE5CE; // Light parchment
@noteGreen : #e0e5c1; // Pastel green
@headerUnderline : #c9ad6a; // Gold
@horizontalRule : #9c2b1b; // Maroon
@headerText : #58180D; // Dark maroon
@monsterStatBackground : #EEDBAB; // Light orange parchment
@captionText : #766649; // Brown
@watercolorStain : #BBAD82; // Light brown
@page { margin: 0; }
body {
counter-reset : phb-page-numbers;
}
*{
-webkit-print-color-adjust : exact;
}
.useSansSerif(){
font-family : ScalySansRemake;
font-size : 0.318cm;
line-height : 1.2em;
p,dl,ul,ol {
line-height : 1.2em;
}
ul, ol {
padding-left : 1em;
}
em{
font-style : italic;
}
strong{
font-weight : 800;
letter-spacing : -0.02em;
}
h5 + * {
margin-top : 0.1cm;
}
}
.useColumns(@multiplier : 1, @fillMode: balance){
column-count : 2;
column-fill : @fillMode;
column-gap : 0.9cm;
column-width : 8cm * @multiplier;
-webkit-column-count : 2;
-moz-column-count : 2;
-webkit-column-width : 8cm * @multiplier;
-moz-column-width : 8cm * @multiplier;
-webkit-column-gap : 0.9cm;
-moz-column-gap : 0.9cm;
}
.columnWrapper{
max-height : 100%;
column-span : all;
columns : inherit;
column-gap : inherit;
}
.page{
.useColumns();
counter-increment : phb-page-numbers;
position : relative;
z-index : 15;
box-sizing : border-box;
overflow : hidden;
height : 279.4mm;
width : 215.9mm;
background-color : @background;
background-image : @backgroundImage;
padding : 1.4cm 1.9cm 1.7cm;
font-family : BookInsanityRemake;
font-size : 0.34cm;
text-rendering : optimizeLegibility;
page-break-before : always;
page-break-after : always;
//*****************************
// * BASE
// *****************************/
p{
overflow-wrap : break-word; //TODO: MAKE ALL MARGINS TOP-ONLY. USE * + * STYLE SELECTORS
display : block;
line-height : 1.25em;
&+* {
margin-top : 0.325cm;
}
&+p{
margin-top : 0;
}
}
ul{
margin-bottom : 0.8em;
padding-left : 1.4em;
line-height : 1.25em;
list-style-position : outside;
list-style-type : disc;
}
ol{
margin-bottom : 0.8em;
padding-left : 1.4em;
line-height : 1.25em;
list-style-position : outside;
list-style-type : decimal;
}
//Indents after p or lists
p+p, ul+p, ol+p{
text-indent : 1em;
}
img{
z-index : -1;
}
strong{
font-weight : bold;
letter-spacing : -0.02em;
}
em{
font-style : italic;
}
sup{
vertical-align : super;
font-size : smaller;
line-height : 0;
}
sub{
vertical-align : sub;
font-size : smaller;
line-height : 0;
}
//*****************************
// * HEADERS
// *****************************/
h1,h2,h3,h4{
font-family : MrEavesRemake;
font-weight : 800;
color : @headerText;
}
h1{
margin-bottom : 0.18cm; //Margin-bottom only because this is WIDE
column-span : all;
font-size : 0.89cm;
-webkit-column-span : all;
-moz-column-span : all;
&+p::first-letter{
float : left;
font-family : SolberaImitationRemake;
line-height : 1em;
font-size : 3.5cm;
padding-left : 40px; //Allow background color to extend into margins
margin-left : -40px;
margin-top : -0.3cm;
padding-bottom : 2px;
margin-bottom : -20px;
background-image : linear-gradient(-45deg, #322814, #998250, #322814);
background-clip : text;
-webkit-background-clip : text;
color : rgba(0, 0, 0, 0);
}
&+p::first-line{
font-variant : small-caps;
}
}
h2{
//margin-top : 0px; //Font is misaligned. Shift up slightly
//margin-bottom : 0.05cm;
font-size : 0.75cm;
line-height : 0.988em; //Font is misaligned. Shift up slightly
}
h3{
//margin-top : -0.1cm; //Font is misaligned. Shift up slightly
//margin-bottom : 0.1cm;
font-size : 0.575cm;
border-bottom : 2px solid @headerUnderline;
line-height : 0.995em; //Font is misaligned. Shift up slightly
}
h4{
//margin-top : -0.02cm; //Font is misaligned. Shift up slightly
//margin-bottom : 0.02cm;
font-size : 0.458cm;
line-height : 0.971em; //Font is misaligned. Shift up slightly
}
h5{
//margin-top : -0.02cm; //Font is misaligned. Shift up slightly
//margin-bottom : 0.02cm;
font-family : ScalySansSmallCapsRemake;
font-size : 0.423cm;
font-weight : 900;
line-height : 0.951em; //Font is misaligned. Shift up slightly
& + * {
margin-top : 0.2cm;
}
}
//*****************************
// * TABLE
// *****************************/
table{
.useSansSerif();
width : 100%;
& + * {
margin-top : 0.325cm;
}
thead{
display: table-row-group;
font-weight : 800;
th{
vertical-align : bottom;
padding : 0.14em 0.4em;
}
}
tbody{
tr{
td{
padding : 0.14em 0.4em;
}
&:nth-child(odd){
background-color : @noteGreen;
}
}
}
}
//*****************************
// * NOTE
// *****************************/
.note{
.useSansSerif();
background-color : @noteGreen;
border-style : solid;
border-width : 1px;
border-image : @noteBorderImage 12 stretch;
border-image-outset : 9px 0px;
border-image-width : 11px;
padding : 0.13cm 0.16cm;
filter : drop-shadow(1px 4px 6px #888);
.page :where(&) {
margin-top : 9px; //Prevent top border getting cut off on colbreak
}
& + * {
margin-top : 0.45cm;
}
h5 {
font-size : 0.375cm;
}
p{
display : block;
padding-bottom : 0px;
}
:last-child {
margin-bottom : 0;
}
}
//************************************
// * DESCRIPTIVE TEXT BOX
// ************************************/
.descriptive{
.useSansSerif();
background-color : #faf7ea;
border-style : solid;
border-width : 7px;
border-image : @descriptiveBoxImage 12 stretch;
border-image-outset : 4px;
padding : 0.1em;
filter : drop-shadow(0 0 3px #faf7ea);
.page :where(&) {
margin-top : 4px; //Prevent top border getting cut off on colbreak
}
& + * {
margin-top : 0.45cm;
}
h5 {
font-size : 0.375cm;
}
p{
display : block;
padding-bottom : 0px;
line-height : 1.5em;
}
:last-child {
margin-bottom : 0;
}
}
//*****************************
// * Images Snippets
// *****************************/
/* Arist Credit */
.artist {
position : absolute;
width : auto;
text-align : center;
font-family : WalterTurncoat;
font-size : 0.27cm;
color : @captionText;
p, p + p {
margin : unset;
text-indent : unset;
line-height : 1em;
}
h5 {
font-size : 1.3em;
font-family : WalterTurncoat;
}
a{
color : inherit;
text-decoration : unset;
&:hover {
text-decoration : underline;
}
}
}
/* Watermark */
.watermark {
display : grid !important;
place-items : center;
justify-content : center;
position : absolute;
top : 0;
left : 0;
width : 100%;
height : 100%;
font-size : 120px;
text-transform : uppercase;
color : black;
mix-blend-mode : overlay;
opacity : 30%;
transform : rotate(-45deg);
z-index : 500;
p {
margin-bottom : none;
}
}
/* Watercolor */
[class*="watercolor"] {
position : absolute;
width : 2000px; /* dimensions need to be real big so the user can set */
height : 2000px; /* height or width and the image will maintain aspect ratio */
-webkit-mask-image : var(--wc);
-webkit-mask-size : contain;
-webkit-mask-repeat : no-repeat;
mask-image : var(--wc);
mask-size : contain;
mask-repeat : no-repeat;
background-size : cover;
background-color : @watercolorStain; /*default color*/
--wc : @watercolor1; /*default image*/
z-index : -2;
}
.watercolor1 { --wc : @watercolor1; }
.watercolor2 { --wc : @watercolor2; }
.watercolor3 { --wc : @watercolor3; }
.watercolor4 { --wc : @watercolor4; }
.watercolor5 { --wc : @watercolor5; }
.watercolor6 { --wc : @watercolor6; }
.watercolor7 { --wc : @watercolor7; }
.watercolor8 { --wc : @watercolor8; }
.watercolor9 { --wc : @watercolor9; }
.watercolor10 { --wc : @watercolor10; }
.watercolor11 { --wc : @watercolor11; }
.watercolor12 { --wc : @watercolor12; }
//*****************************
// * MONSTER STAT BLOCK
// *****************************/
.monster {
.useSansSerif();
&.frame {
border-style : solid;
border-width : 7px 6px;
background-color : @monsterStatBackground;
background-image : @monsterBlockBackground;
border-image : @monsterBorderImage 14 round;
border-image-outset : 0px 2px;
background-blend-mode : overlay;
background-attachment : fixed;
filter : drop-shadow(1px 4px 6px #888);
padding : 4px 2px;
margin-left : -0.16cm;
margin-right : -0.16cm;
width : calc(100% + 0.32cm);
}
position : relative;
padding : 0px;
margin-bottom : 0.325cm;
//Headers
h2{
font-size : 0.62cm;
line-height : 1em;
margin : 0;
&+p {
font-size : 0.304cm; //Monster size and type subtext
margin-bottom : 0;
}
}
h3{
font-family : ScalySansRemake;
font-weight : 800;
font-variant : small-caps;
border-bottom : 2px solid @headerText;
// margin-top : 0.05cm; //Font is misaligned. Shift up slightly
padding-bottom : 0.05cm;
}
//Triangle dividers
hr{
visibility : visible;
height : 6px;
margin : 0.12cm 0cm;
background-image : @redTriangleImage;
background-size : 100% 100%;
border : none;
}
//Attribute Lists - All text between HRs is red
hr ~ :is(dl,p) {
color : @headerText;
}
hr:last-of-type {
& ~ :is(dl,p) {
color : inherit; // After the HRs, reset text to black
}
& + * {
margin-top : 0.325cm; // Space after last HR
}
}
// Monster Ability table
hr + table:first-of-type{
margin : 0;
column-span : none;
color : @headerText;
background-color : transparent;
border-style : none;
border-image : none;
-webkit-column-span : none;
tr {
background-color : transparent;
}
td,th {
padding: 0px;
}
}
:last-child {
margin-bottom : 0;
}
}
//Full Width
.monster.wide{
.useColumns(0.96, @fillMode: balance);
}
//*****************************
// * FOOTER
// *****************************/
&:after{
content : "";
position : absolute;
bottom : 0px;
left : 0px;
z-index : 100;
height : 50px;
width : 100%;
background-image : @footerAccentImage;
background-size : cover;
}
&:nth-child(even){
&:after{
transform : scaleX(-1);
}
.pageNumber{
left : 2px;
}
.footnote{
left : 80px;
text-align : left;
}
}
.pageNumber{
position : absolute;
right : 2px;
bottom : 22px;
width : 50px;
font-size : 0.9em;
color : #c9ad6a;
text-align : center;
text-indent : 0;
&.auto::after {
content : counter(phb-page-numbers);
}
}
.footnote{
position : absolute;
right : 80px;
bottom : 32px;
z-index : 150;
width : 200px;
font-size : 0.8em;
color : #c9ad6a;
text-align : right;
}
//************************************
// * CODE BLOCKS
// ************************************/
code{
font-family : "Courier New", Courier, monospace;
font-size : 0.325;
padding : 0px 4px;
color : #58180d;
background-color : #faf7ea;
border-radius : 4px;
white-space : pre-wrap;
overflow-wrap : break-word;
}
pre code{
width : 100%;
display : inline-block;
border-style : solid;
border-width : 1px;
border-image : @codeBorderImage 26 stretch;
border-image-width : 10px;
border-image-outset : 2px;
border-radius : 12px;
margin-bottom : 2px;
padding : 0.15cm;
.page :where(&) {
margin-top : 2px; //Prevent top border getting cut off on colbreak
}
& + * {
margin-top : 0.325cm;
}
}
//*****************************
// * EXTRAS
// *****************************/
hr{
visibility : hidden;
margin : 0px;
}
.columnSplit {
visibility : hidden;
-webkit-column-break-after : always;
break-after : always;
-moz-column-break-after : always;
break-before : column;
}
//Avoid breaking up
blockquote,table{
z-index : 15;
-webkit-column-break-inside : avoid;
page-break-inside : avoid;
break-inside : avoid;
}
//Text indent right after table
table+p{
text-indent : 1em;
}
// Nested lists
ul ul,ol ol,ul ol,ol ul{
margin-bottom : 0px;
margin-left : 1.5em;
}
li{
-webkit-column-break-inside : avoid;
page-break-inside : avoid;
break-inside : avoid;
}
}
//*****************************
// * SPELL LIST
// *****************************/
.page .spellList{
.useSansSerif();
column-count : 2;
ul+h5{
margin-top : 15px;
}
p, ul{
font-size : 0.352cm;
line-height : 1.265em;
}
ul{
margin-bottom : 0.5em;
padding-left : 1em;
text-indent : -1em;
list-style-type : none;
-webkit-column-break-inside : auto;
page-break-inside : auto;
break-inside : auto;
}
&.wide{
column-count : 4;
}
}
//*****************************
// * CLASS TABLE
// *****************************/
.page .classTable{
th[colspan]:not([rowspan]) {
white-space : nowrap;
}
&.frame {
margin-top : 0.66cm;
margin-bottom : 1.05cm;
margin-left : -0.1cm;
margin-right : -0.1cm;
width : calc(100% + 0.2cm);
border-collapse : separate;
background-color : white;
border : initial;
border-style : solid;
border-image-outset : 0.55cm 0.3cm;
border-image-repeat : stretch;
border-image-slice : 200;
border-image-source : @frameBorderImage;
border-image-width : 47px;
}
&.decoration {
transform-style : preserve-3d;
}
&.decoration::before {
content :'';
position : absolute;
background-image : @classTableDecoration;
background-size : contain;
background-repeat : space;
width : 7.75cm;
height : calc(100% + 3.3cm);
top : 50%;
left : 50%;
transform : translateY(-50%) translateX(-50%) translateZ(-1px);
filter : drop-shadow(0px 0px 1px #C8C5C080)
}
&.decoration.wide::before {
width : calc(100% + 3.3cm);
height : 7.75cm;
top : calc(50% + 0.4cm);
}
h5 + table{
margin-top : 0.2cm;
}
}
//*****************************
// * TABLE OF CONTENTS
// *****************************/
.page .toc{
-webkit-column-break-inside : avoid;
page-break-inside : avoid;
break-inside : avoid;
h1 {
text-align : center;
margin-bottom : 0.3cm;
}
a{
display : table;
color : inherit;
text-decoration : none;
&:hover{
text-decoration : underline;
}
}
h4 {
margin-top : 0.2cm;
line-height : 0.4cm;
& + ul li {
line-height: 1.2em;
}
}
ul{
padding-left : 0;
list-style-type : none;
li + li h3 {
margin-top : 0.26cm;
line-height : 1em
}
h3 span:first-child::after {
border : none;
}
span {
display : table-cell;
&:first-child {
position : relative;
overflow : hidden;
&::after {
content : "";
position : absolute;
bottom : 0.08cm;
margin-left : 0.06cm; /* Spacing before dot leaders */
width : 100%;
border-bottom : 0.05cm dotted #000;
}
}
&:last-child {
font-family : BookInsanityRemake;
font-size : 0.34cm;
font-weight : normal;
color : black;
text-align : right;
vertical-align : bottom; /* Keep page number bottom-aligned */
width : 1%;
padding-left : 0.06cm; /* Spacing after dot leaders */
/*white-space : nowrap; /* Uncomment if needed */
}
}
ul { /*List indent*/
margin-left : 1em;
}
}
&.wide{
.useColumns(0.96, @fillMode: balance);
}
}
//*****************************
// * MUSTACHE DIVS/SPANS
// *****************************/
.page {
.block {
break-inside : avoid;
display : inline-block;
.page :where(&) {
width : 100%;
}
//-webkit-transform : translateZ(0); //Prevents shadows from breaking across columns
}
.inline-block {
display : inline-block;
text-indent : initial;
}
}
//*****************************
// * DEFINITION LISTS
// *****************************/
.page {
dl {
line-height : 1.25em;
padding-left : 1em;
white-space : pre-line;
& + * {
margin-top : 0.28cm;
}
}
dl + * {
margin-top : 0.17cm;
}
p + dl {
margin-top: 0.17cm;
}
dt {
display : inline;
margin-right : 5px;
margin-left : -1em;
}
dd {
display : inline;
margin-left : 0px;
text-indent : 0px;
}
}
//*****************************
// * BLANK LINE
// *****************************/
.page {
.blank {
height : 1em;
margin-top : 0;
}
}
//*****************************
// * WIDE
// *****************************/
.page .wide{
column-span : all;
-webkit-column-span : all;
-moz-column-span : all;
display : block;
margin-bottom : 0.34cm;
&+* {
margin-top : 0;
}
}

Some files were not shown because too many files have changed in this diff Show More