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

Compare commits

...

334 Commits

Author SHA1 Message Date
Trevor Buckner
10d4cd4ab3 Merge pull request #3796 from naturalcrit/FixGoogleLinksinUserPage 2024-10-06 15:52:29 -04:00
Trevor Buckner
2a523c4955 Fix links to google drive files in user page
User page was not marking Google Brews as "stubbed" if the brew belongs   to another users' Google Drive or your own credentials are expired (it searches the current user drive for google files and checks if those are stubbed)

This now sets *every* file found on Mongo as "Stubbed", whether the Drive file belongs to the current user or not.
2024-10-06 15:48:10 -04:00
Víctor Losada Hernández
487a574f50 initital fix 2024-10-06 00:05:12 -04:00
Trevor Buckner
1a325fb3c5 New notification 2024-10-01 22:25:17 -04:00
Trevor Buckner
0110c6afed Remove duplicate error log for googleActions.list 2024-10-01 15:06:11 -04:00
Trevor Buckner
0e29620710 Remove delayMiddleware and ratelimiter 2024-10-01 14:13:15 -04:00
Trevor Buckner
c33b44855a Go back to service account for brew updates 2024-10-01 12:17:30 -04:00
Trevor Buckner
e7e35294c6 disable rate limiter 2024-09-30 10:59:43 -04:00
Trevor Buckner
e9c45b216c Add retryconfig and forward user ip 2024-09-30 08:31:39 -04:00
Trevor Buckner
40925253bd autosave to 16 seconds 2024-09-30 00:59:30 -04:00
Trevor Buckner
66433d9e77 5 requests 2024-09-30 00:45:10 -04:00
Trevor Buckner
3a6750613b express proxy settings 2024-09-30 00:31:58 -04:00
Trevor Buckner
a7361f8450 add delay between get and update 2024-09-30 00:14:37 -04:00
Trevor Buckner
32fa272947 reduce rate limit to 60 requests in 5 minutes 2024-09-30 00:03:27 -04:00
Trevor Buckner
68895bdca2 Rate limit /api requests from each IP address
100 requests each 5 minutes.
2024-09-29 23:37:26 -04:00
Trevor Buckner
8ab6a8599d Use personal auth if logged in via google. 2024-09-29 21:47:45 -04:00
Trevor Buckner
ea656e5119 Issue notice 2024-09-29 00:15:26 -04:00
Trevor Buckner
05ad8e17a7 Merge pull request #3755 from naturalcrit/RaiseAutoSaveDelay 2024-09-26 19:17:51 -04:00
Trevor Buckner
bf87225415 Merge branch 'v3.15.1' into RaiseAutoSaveDelay 2024-09-26 19:17:35 -04:00
Trevor Buckner
8b61e69b77 Merge pull request #3754 from naturalcrit/RemoveDoubleGoogleDriveLogs 2024-09-26 19:15:46 -04:00
Trevor Buckner
e260eb0911 Raise timeout to 10 s.
No need to be stingy here... Can lower back down if this works.
2024-09-26 19:14:16 -04:00
Trevor Buckner
c8424e0b10 Remove test that no longer applies 2024-09-26 19:12:19 -04:00
Trevor Buckner
ff9a75f6b6 Remove duplicate error logs for google drive update / new
Errors are now logged once in the central error handler in app.js
2024-09-26 19:00:07 -04:00
Trevor Buckner
84736980c9 Merge pull request #3713 from Gazook89/Fix-Vault-Styling-Issues
Fix Vault Page CSS specificity issues
2024-09-05 14:59:09 -04:00
Gazook89
e0be7a5db3 Move rules out of body and into more specific elements 2024-09-05 11:13:08 -05:00
Trevor Buckner
2e332d7699 Merge pull request #3710 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-jest-28.8.3
Bump eslint-plugin-jest from 28.8.2 to 28.8.3
2024-09-05 11:01:57 -04:00
dependabot[bot]
53979f2266 Bump eslint-plugin-jest from 28.8.2 to 28.8.3
Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 28.8.2 to 28.8.3.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.8.2...v28.8.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-05 03:38:40 +00:00
Trevor Buckner
780c92cb9b Merge pull request #3704 from G-Ambatte/experimentalGitAttribs 2024-09-04 19:38:41 -04:00
Trevor Buckner
20c54ef79e Merge branch 'master' into experimentalGitAttribs 2024-09-04 19:38:32 -04:00
Trevor Buckner
5ce69041fc Merge pull request #3708 from naturalcrit/fix-arrows
FIx missing arrows
2024-09-04 18:07:38 -04:00
Víctor Losada Hernández
20db8c6720 restore missing state 2024-09-04 23:57:44 +02:00
Trevor Buckner
ed35eb2680 Merge pull request #3702 from naturalcrit/dependabot/npm_and_yarn/mongoose-8.6.1 2024-09-04 17:22:22 -04:00
Trevor Buckner
2a7b7cd50c Merge branch 'master' into dependabot/npm_and_yarn/mongoose-8.6.1 2024-09-04 17:21:44 -04:00
Trevor Buckner
d37fa03ec7 Merge pull request #3701 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.35.2 2024-09-04 17:21:33 -04:00
Trevor Buckner
2c7d39147d Merge branch 'master' into dependabot/npm_and_yarn/eslint-plugin-react-7.35.2 2024-09-04 17:20:58 -04:00
Trevor Buckner
6535e94ccd Merge pull request #3707 from naturalcrit/v3.15.0 2024-09-04 17:20:49 -04:00
Trevor Buckner
2ede3d7cf3 Merge branch 'master' into v3.15.0 2024-09-04 17:20:41 -04:00
Trevor Buckner
e56b2a7ce5 Merge pull request #3706 from 5e-Cleric/experimental-development 2024-09-04 17:20:21 -04:00
Trevor Buckner
ad8e004fa9 Update Dismisskey for popup
Need a new key so this new message will appear again for users who cleared the popup before
2024-09-04 17:16:11 -04:00
Trevor Buckner
e05d2e805c v3.15.0 2024-09-04 17:01:27 -04:00
Víctor Losada Hernández
a083999943 Merge branch 'master' into experimental-development 2024-09-04 22:54:09 +02:00
Víctor Losada Hernández
247bc719b8 fix z-index issue 2024-09-04 22:52:57 +02:00
Víctor Losada Hernández
cd01014d79 notification 2024-09-04 22:48:39 +02:00
Víctor Losada Hernández
7ab1efb0c9 litttle message in vault 2024-09-04 22:39:30 +02:00
Trevor Buckner
eb05ac00a6 Merge pull request #3263 from 5e-Cleric/experimental-development 2024-09-04 16:24:44 -04:00
Trevor Buckner
2bc39a468f set default value for dontRenderStorage prop 2024-09-04 16:15:18 -04:00
Trevor Buckner
c735ab7c35 Fix crash on metaData tab
Hiding the `moveBrew` etc. properties when `this.state.showMoveArrows == false` means when the `metaData` tab turns off the arrows it crashes because now some functions are undefined.

Just using a whole separate property to avoid conflict.
2024-09-04 15:50:32 -04:00
Víctor Losada Hernández
d5e367649e fix overlapping thumbnail issue 2024-09-04 12:23:21 +02:00
Víctor Losada Hernández
f10444f14a fix for storage 2 2024-09-04 12:18:35 +02:00
Víctor Losada Hernández
29d4003bd2 fix splitpane errors 2024-09-04 09:37:35 +02:00
Víctor Losada Hernández
1225e5cb6a remove storage rendering in vault 2024-09-04 09:29:47 +02:00
Víctor Losada Hernández
aab24c732e fix error managing 2024-09-04 09:25:13 +02:00
G.Ambatte
dd5d551c73 Merge branch 'master' into experimentalGitAttribs 2024-09-04 17:11:21 +12:00
Trevor Buckner
d7d690a9d1 Lint 2024-09-04 01:06:56 -04:00
Trevor Buckner
4f39222724 Change spaces to tabs 2024-09-04 00:52:08 -04:00
Trevor Buckner
a1e585ccaa Remove redundant validation check
`performSearch()` and `loadTotal()` shouldn't need a separate check for valid items if `loadPage` already does it through `validateForm`
2024-09-04 00:43:12 -04:00
Trevor Buckner
373a627c14 With unneeded state gone, can rename back to title, author, etc.
No longer naming conflict with state and function parameters. We can go back to the shorter names
2024-09-04 00:35:27 -04:00
Trevor Buckner
a7cb73b02e Remove unused update in loadPage
Now `update` is unused; can remove that parameter.
2024-09-04 00:20:18 -04:00
Trevor Buckner
cd3e517b03 Remove setPageState in loadPage. Already occurs in performSearch()
`performSearch` will set PageState whether `update` is true or not, so this line here is not doing anything.
2024-09-04 00:18:35 -04:00
Trevor Buckner
ef201409d9 rename setPage to setPageState (match pageState name) 2024-09-03 23:55:54 -04:00
Trevor Buckner
e3ef93f03a Alignment 2024-09-03 23:54:52 -04:00
G.Ambatte
aa90513825 Update gitattributes 2024-09-04 15:46:00 +12:00
Trevor Buckner
1990064be4 Tidy findTotal 2024-09-03 23:44:43 -04:00
Trevor Buckner
44099c813c Fix err is not defined. Remove extra console.error (central error handler already prints the error) 2024-09-03 23:44:24 -04:00
dependabot[bot]
8f18601c2e Bump mongoose from 8.6.0 to 8.6.1
Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.6.0 to 8.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/8.6.0...8.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>
2024-09-04 03:39:03 +00:00
dependabot[bot]
db02f88287 Bump eslint-plugin-react from 7.35.1 to 7.35.2
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.35.1 to 7.35.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.35.1...v7.35.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>
2024-09-04 03:38:40 +00:00
Trevor Buckner
56185e2a1c Tidy findBrews 2024-09-03 23:11:10 -04:00
Trevor Buckner
590318ff1d Simplify rendererConditions 2024-09-03 22:58:50 -04:00
Víctor Losada Hernández
48a5a70d2e z-index doesn't work with static positioning 2024-09-04 00:17:59 +02:00
Víctor Losada Hernández
1c1901c90a fix thumbnail over text 2024-09-04 00:16:15 +02:00
Víctor Losada Hernández
ebae351033 remove unnecesary state 2024-09-04 00:11:58 +02:00
Víctor Losada Hernández
e54d81ceef small css fixes 2024-09-03 23:28:33 +02:00
Víctor Losada Hernández
849da23829 bring back thumbnails! 2024-09-03 23:17:33 +02:00
Víctor Losada Hernández
1e36e63ed6 bring back the comma! 2024-09-03 23:07:23 +02:00
Víctor Losada Hernández
abb2d57879 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-09-03 22:58:05 +02:00
Víctor Losada Hernández
52779eec35 Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery into experimental-development 2024-09-03 22:56:49 +02:00
Víctor Losada Hernández
9e694e5e46 move email catching to api 2024-09-03 22:56:45 +02:00
Víctor Losada Hernández
321b8a0696 Merge pull request #3699 from Gazook89/Focus-Editor-After-Switch
Set Focus on Editor after Tab Switches
2024-09-03 22:37:01 +02:00
Víctor Losada Hernández
f2563e436f Merge branch 'master' into Focus-Editor-After-Switch 2024-09-03 22:34:30 +02:00
Gazook89
3c6f49aa0a Move focus method to handleViewChange 2024-09-03 14:48:45 -05:00
Trevor Buckner
9bc5701006 Indent 2024-09-03 14:18:17 -04:00
Trevor Buckner
a3a5f749ab Merge pull request #3700 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-react-7.35.1
Bump eslint-plugin-react from 7.35.0 to 7.35.1
2024-09-03 14:10:20 -04:00
dependabot[bot]
36b026d89e Bump eslint-plugin-react from 7.35.0 to 7.35.1
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.35.0 to 7.35.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.35.0...v7.35.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>
2024-09-03 18:09:47 +00:00
Trevor Buckner
dbd4a5c490 Merge pull request #3686 from G-Ambatte/v3.14.3
Up version to v3.14.3
2024-09-03 14:08:29 -04:00
Trevor Buckner
0d95c48988 Merge branch 'master' into v3.14.3 2024-09-03 14:08:06 -04:00
Trevor Buckner
0d40f4eb16 Small Rewording 2024-09-03 14:06:54 -04:00
Trevor Buckner
6234943ffd Merge pull request #3698 from naturalcrit/dependabot/npm_and_yarn/eslint-plugin-jest-28.8.2
Bump eslint-plugin-jest from 28.8.0 to 28.8.2
2024-09-03 13:52:41 -04:00
dependabot[bot]
702f55bdbd Bump eslint-plugin-jest from 28.8.0 to 28.8.2
Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 28.8.0 to 28.8.2.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.8.0...v28.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-03 17:35:36 +00:00
Trevor Buckner
859117cdf8 Merge pull request #3691 from naturalcrit/dependabot/npm_and_yarn/googleapis/drive-8.14.0
Bump @googleapis/drive from 8.13.1 to 8.14.0
2024-09-03 13:34:22 -04:00
Víctor Losada Hernández
7474605b93 rename 2 2024-09-03 15:58:31 +02:00
Víctor Losada Hernández
00a83ec16e renaming to make more clear 2024-09-03 15:54:53 +02:00
Gazook89
afa1e7974a Set focus on editor after tab switch
This sets the focus on the editor (and thus reveals cursor position) between editor changes (style to text to meta and back).
2024-09-02 21:07:19 -05:00
Víctor Losada Hernández
1517c00132 error logging to vault 2024-09-01 19:39:00 +02:00
Víctor Losada Hernández
6d24908465 now yes fixed 2024-09-01 19:31:43 +02:00
Víctor Losada Hernández
fd2d1f1ce2 fix little bug 2024-09-01 19:21:40 +02:00
Víctor Losada Hernández
226ad49663 renaming to keep some consistency 2024-09-01 19:12:25 +02:00
Víctor Losada Hernández
e830c51a16 add spacing to link 2024-09-01 11:22:25 +02:00
Víctor Losada Hernández
b6e904c9c8 "Rename searchButtonRef to submitButtonRef and update references" 2024-09-01 11:19:00 +02:00
Víctor Losada Hernández
3fc2e5202e rest of the suggested changes 2024-09-01 11:14:09 +02:00
Víctor Losada Hernández
f0b447866c suggested changes 2 2024-09-01 11:10:46 +02:00
Víctor Losada Hernández
c528c8639a title attribute to hidden authors 2024-08-31 23:21:14 +02:00
Víctor Losada Hernández
47d8bb20d2 hide usernames with emails 2024-08-31 23:12:24 +02:00
Víctor Losada Hernández
bb08aed1a8 move some css to prevent affecting brew cards 2024-08-31 22:43:54 +02:00
Víctor Losada Hernández
9a2f18fc0d provide error code text 2024-08-31 22:38:03 +02:00
Víctor Losada Hernández
df21f978df bring back throws 2024-08-31 22:34:04 +02:00
Víctor Losada Hernández
fb8c4c5c44 all sugggested changes 2024-08-31 22:28:29 +02:00
Víctor Losada Hernández
19102db23a indent with tabs 2024-08-31 22:11:43 +02:00
Víctor Losada Hernández
8d2a9ed9cb adress app.js changes requested 2024-08-31 22:08:21 +02:00
Víctor Losada Hernández
a0010c9c84 "Moved error message styles from .searchButton to body, and removed duplicate styles." 2024-08-31 19:39:01 +02:00
Víctor Losada Hernández
f7c3e81b7b "Added new route for '/vault' and updated catch-all for invalid routes" 2024-08-31 19:35:44 +02:00
Víctor Losada Hernández
c7f695e86a Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-08-31 19:21:06 +02:00
Víctor Losada Hernández
e6e220fbec reposition button 2024-08-31 19:19:47 +02:00
Víctor Losada Hernández
8658a6a97a styling 2024-08-31 19:13:08 +02:00
Víctor Losada Hernández
cd94857b13 "Refactor VaultPage component: remove unnecessary whitespace, reformat code, and reorganize tips and tricks section" 2024-08-31 18:59:32 +02:00
Víctor Losada Hernández
3825bcbbfb "Simplified brewsQuery construction in buildBrewsQuery function" 2024-08-31 18:41:36 +02:00
Víctor Losada Hernández
981e7986ce Added className='renderer' to two input elements in vaultPage.jsx and added CSS rules for .renderer in vaultPage.less to display an error message when no checkboxes are checked. 2024-08-31 16:20:46 +02:00
dependabot[bot]
89583528c2 Bump @googleapis/drive from 8.13.1 to 8.14.0
Bumps [@googleapis/drive](https://github.com/googleapis/google-api-nodejs-client) from 8.13.1 to 8.14.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/release-please-config.json)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/drive-v8.13.1...drive-v8.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-30 03:53:37 +00:00
G.Ambatte
e588e68313 Merge branch 'master' into v3.14.3 2024-08-29 17:47:36 +12:00
G.Ambatte
e4c2ffe973 Add image wrap icon fix 2024-08-29 17:46:23 +12:00
Trevor Buckner
c41116e6c8 Merge pull request #3687 from G-Ambatte/fixImageWrapIcons
Fix Image Wrap icons
2024-08-29 01:30:17 -04:00
G.Ambatte
b66ac43b35 Fix Image Wrap icons 2024-08-29 17:23:18 +12:00
G.Ambatte
c30404804d Fix typo 2024-08-29 17:20:39 +12:00
G.Ambatte
6b10e1aacb Very important F 2024-08-29 17:19:47 +12:00
G.Ambatte
e6185879c8 Up version to v3.14.3 2024-08-29 17:17:12 +12:00
Trevor Buckner
e776e5e054 Merge pull request #3684 from naturalcrit/FixTableInterruptors 2024-08-29 00:47:00 -04:00
Trevor Buckner
04bbb3d615 Merge branch 'master' into FixTableInterruptors 2024-08-29 00:44:46 -04:00
Trevor Buckner
5d1f589b07 Merge pull request #3685 from naturalcrit/dependabot/npm_and_yarn/marked-extended-tables-1.0.10 2024-08-29 00:44:38 -04:00
dependabot[bot]
ce5f093945 Bump marked-extended-tables from 1.0.9 to 1.0.10
Bumps [marked-extended-tables](https://github.com/calculuschild/marked-extended-tables) from 1.0.9 to 1.0.10.
- [Release notes](https://github.com/calculuschild/marked-extended-tables/releases)
- [Changelog](https://github.com/calculuschild/marked-extended-tables/blob/main/release.config.cjs)
- [Commits](https://github.com/calculuschild/marked-extended-tables/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-29 04:42:49 +00:00
Trevor Buckner
371e464eb2 Merge branch 'master' into FixTableInterruptors 2024-08-29 00:30:07 -04:00
Trevor Buckner
804d714473 Add regex to detect when to interrupt a table 2024-08-29 00:20:47 -04:00
Trevor Buckner
8d00389aa2 Merge pull request #3683 from naturalcrit/dependabot/npm_and_yarn/marked-extended-tables-1.0.9 2024-08-29 00:19:42 -04:00
dependabot[bot]
d64787168b Bump marked-extended-tables from 1.0.8 to 1.0.9
Bumps [marked-extended-tables](https://github.com/calculuschild/marked-extended-tables) from 1.0.8 to 1.0.9.
- [Release notes](https://github.com/calculuschild/marked-extended-tables/releases)
- [Changelog](https://github.com/calculuschild/marked-extended-tables/blob/main/release.config.cjs)
- [Commits](https://github.com/calculuschild/marked-extended-tables/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-29 04:17:07 +00:00
Trevor Buckner
49a1a74263 Merge pull request #3681 from naturalcrit/dependabot/npm_and_yarn/mongoose-8.6.0 2024-08-29 00:04:39 -04:00
dependabot[bot]
2636635397 Bump mongoose from 8.5.4 to 8.6.0
Bumps [mongoose](https://github.com/Automattic/mongoose) from 8.5.4 to 8.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/8.5.4...8.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>
2024-08-29 04:01:06 +00:00
Trevor Buckner
c49c620ce1 Merge pull request #3680 from naturalcrit/dependabot/npm_and_yarn/stylelint-16.9.0 2024-08-29 00:00:07 -04:00
dependabot[bot]
0b00162590 Bump stylelint from 16.8.2 to 16.9.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.8.2 to 16.9.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.8.2...16.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-29 03:33:22 +00:00
Trevor Buckner
5e19bdaee7 Merge pull request #3678 from dbolack-ab/accursedKeys 2024-08-28 22:24:50 -04:00
David Bolack
bda8be6ec1 Remove stray console.log 2024-08-28 20:54:50 -05:00
David Bolack
132a7d1f53 A temporary, imperfect fix for the jump hotkeys 2024-08-28 20:48:33 -05:00
Trevor Buckner
2dbb92a37e Merge pull request #3677 from 5e-Cleric/account-page-handling-of-invalid-user
Account page handling of invalid user
2024-08-28 17:07:52 -04:00
Trevor Buckner
a124bd8657 I'm dumb. 2024-08-28 16:59:22 -04:00
Trevor Buckner
5323e6ca7a Merge branch 'master' into account-page-handling-of-invalid-user 2024-08-28 15:25:12 -04:00
Trevor Buckner
8423c48fd1 Slight rewording and add a period 2024-08-28 15:24:50 -04:00
Trevor Buckner
e8aceac133 Move check for account up a little 2024-08-28 15:21:43 -04:00
Trevor Buckner
5a692a74c5 Merge pull request #3660 from naturalcrit/imageWrappin
Image wrapping
2024-08-28 15:18:50 -04:00
Víctor Losada Hernández
6436e62ec0 set up error page 2024-08-28 21:10:28 +02:00
Víctor Losada Hernández
c9947d7f91 handle invalid account in account page, redirect to home 2024-08-28 20:42:53 +02:00
Trevor Buckner
3b3127248b Merge branch 'master' into imageWrappin 2024-08-28 14:37:26 -04:00
Trevor Buckner
1d2355e802 Merge pull request #3674 from naturalcrit/dependabot/npm_and_yarn/googleapis/drive-8.13.1
Bump @googleapis/drive from 8.13.0 to 8.13.1
2024-08-28 09:47:22 -04:00
dependabot[bot]
b85bb7bdd4 Bump @googleapis/drive from 8.13.0 to 8.13.1
Bumps [@googleapis/drive](https://github.com/googleapis/google-api-nodejs-client) from 8.13.0 to 8.13.1.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/release-please-config.json)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/drive-v8.13.0...drive-v8.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-28 03:42:23 +00:00
Víctor Losada Hernández
5e69718f4f Merge branch 'master' into imageWrappin 2024-08-23 23:30:37 +02:00
Trevor Buckner
fc294807fd Merge branch 'master' into imageWrappin 2024-08-22 22:10:11 -04:00
Trevor Buckner
dc7d877e6f Add snippets and icons 2024-08-22 16:35:48 -04:00
Trevor Buckner
d8f0618691 Fix variables tests for same reason 2024-08-22 13:20:07 -04:00
Trevor Buckner
955b34b637 Fix tests to account for --HB_src variable presence 2024-08-22 13:12:40 -04:00
Trevor Buckner
8dea2ca9fb wrapLeft and wrapRight classes to automatically apply wrapping 2024-08-22 12:47:26 -04:00
Trevor Buckner
696bcd4367 Expose src url in --HB_src
Decided to do this for *all* images, not just those being injected. In case someone wants to automatically apply wrapping to images inside a stat block, etc.
2024-08-22 12:46:56 -04:00
Víctor Losada Hernández
c6f87eded0 add vault nav item to userpage 2024-08-14 20:42:18 +02:00
Víctor Losada Hernández
62b96f4e79 change back prop names 2024-08-13 12:00:58 +02:00
Víctor Losada Hernández
8faae1e645 Remove console log statement for invalid search in VaultPage component. 2024-08-13 00:51:28 +02:00
Víctor Losada Hernández
e4852b7077 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-08-13 00:47:25 +02:00
Víctor Losada Hernández
2dc4ebb39f Remove console log and CSS rule for hr element in vaultPage. 2024-08-10 00:12:17 +02:00
Víctor Losada Hernández
59672b79d8 remove unnecessary changes in unrelated files 2024-08-10 00:05:58 +02:00
Víctor Losada Hernández
59717fe630 "Refactor VaultPage component, update styles, and modify server-side API queries" 2024-08-10 00:00:43 +02:00
Víctor Losada Hernández
3f9c7a1794 "Moved and rearranged conditional statements for rendering no search/brews found messages in VaultPage component." 2024-08-09 23:15:59 +02:00
Víctor Losada Hernández
ca1f2dd1c3 fix validity check 2024-08-09 22:57:17 +02:00
Víctor Losada Hernández
a8e6f5cf26 "Refactor VaultPage component: moved form validation logic, removed unnecessary variables, and rearranged code structure." 2024-08-09 22:53:20 +02:00
Víctor Losada Hernández
f3a774d55c "Removed unnecessary conditional statement in buildBrewsQuery function" 2024-08-09 22:46:25 +02:00
Víctor Losada Hernández
834980890a "Refactor VaultPage component: update form validation and submission logic" 2024-08-09 22:44:26 +02:00
Víctor Losada Hernández
969eb354ce include query example for future debugging 2024-08-09 22:35:39 +02:00
Víctor Losada Hernández
9288ead130 remove owner functionality completely 2024-08-09 19:24:39 +02:00
Víctor Losada Hernández
a8a4930225 Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery; branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-08-09 18:54:51 +02:00
Víctor Losada Hernández
2bc7cda8c9 fixes 2024-08-01 17:36:14 +02:00
Víctor Losada Hernández
f1ab332ce0 hide instead of comment 2024-08-01 16:02:00 +02:00
Víctor Losada Hernández
d50f23354a minor changes 2024-08-01 15:57:27 +02:00
Víctor Losada Hernández
662a2d776a Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery into experimental-development 2024-08-01 15:55:09 +02:00
Víctor Losada Hernández
80f07bf0b0 Nav item 2024-08-01 15:55:04 +02:00
Víctor Losada Hernández
6cf2dd8186 Merge branch 'master' into experimental-development 2024-08-01 15:49:52 +02:00
Víctor Losada Hernández
5de20cb451 disabling owner input 2024-08-01 15:32:13 +02:00
Víctor Losada Hernández
aa0d0bed48 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-07-31 23:12:47 +02:00
Víctor Losada Hernández
c92f30cfe0 change owner default to false 2024-07-31 08:58:23 +02:00
Víctor Losada Hernández
2a8e4b2a63 Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery into experimental-development 2024-07-31 08:57:42 +02:00
Víctor Losada Hernández
51c7549b45 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-07-31 08:57:28 +02:00
Víctor Losada Hernández
ea5170e6a6 Merge branch 'master' into experimental-development 2024-07-30 22:46:44 +02:00
Víctor Losada Hernández
cef90f5ff9 Added !brewCollection condition to if statement in VaultPage component. 2024-07-28 11:18:26 +02:00
Víctor Losada Hernández
5a9b77190a "Removed console log statement in VaultPage.jsx and updated brewsQuery logic in vault.api.js to handle legacy and v3 filters" 2024-07-28 11:10:27 +02:00
Víctor Losada Hernández
59a5f641af search by author 2024-07-28 10:45:56 +02:00
Víctor Losada Hernández
0bda666127 "Changed condition in onKeyDown event handler from checking input validity and value to checking searchButtonRef.current.disabled" 2024-07-27 10:46:08 +02:00
Víctor Losada Hernández
5b96ef4406 "Refactor VaultPage component: updated validateInput to validateForm, changed input validation logic, and added refs for search button and checkboxes." 2024-07-27 10:41:10 +02:00
Víctor Losada Hernández
af5bbdc677 change from $or to $in 2024-07-27 10:39:06 +02:00
Víctor Losada Hernández
c1dc712542 better checkboxes and linting 2024-07-25 23:48:37 +02:00
Víctor Losada Hernández
3e2c2de269 Added hideMoveArrows prop to split pane for use in vault 2024-07-25 23:11:51 +02:00
Víctor Losada Hernández
cc08579583 change to splitPane component 2024-07-25 16:57:33 +02:00
Víctor Losada Hernández
e562ebef48 media query for mobile use expanded to vertical stack 2024-07-24 00:50:21 +02:00
Víctor Losada Hernández
e206b501a6 media query to show only one column in case of small window 2024-07-24 00:34:13 +02:00
Víctor Losada Hernández
016a9fa1e8 few css changes to make the page more responsive on smaller screens 2024-07-24 00:26:23 +02:00
Víctor Losada Hernández
01ee184044 "Update default count value from 10 to 20 in VaultPage component and vault API" 2024-07-23 23:57:05 +02:00
Víctor Losada Hernández
ddf2006285 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-07-21 18:06:08 +02:00
Víctor Losada Hernández
5232c16eb2 change div to form 2024-06-13 01:32:34 +02:00
Víctor Losada Hernández
bdfd194672 changed order of params per request 2024-06-13 01:13:38 +02:00
Víctor Losada Hernández
cb0cb32860 minor style changes & lint less file 2024-06-13 01:04:39 +02:00
Víctor Losada Hernández
1e080b30fd finally fixed the damn issue 2024-06-13 00:41:40 +02:00
Víctor Losada Hernández
90431efbc9 "Removed ArchivePage and related files, replaced with VaultPage, updated routes and API endpoints, and made minor changes to theme configuration and error handling." 2024-06-11 00:33:36 +02:00
Víctor Losada Hernández
99b0c2b54e Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-06-10 23:25:42 +02:00
Víctor Losada Hernández
042e217872 "Refactor ArchivePage component from createClass to functional component with hooks" 2024-06-10 23:23:31 +02:00
Víctor Losada Hernández
609f5a3330 more logs 2024-05-23 14:08:37 +02:00
Víctor Losada Hernández
058d70ed82 auto, not scroll 2024-05-23 13:37:23 +02:00
Víctor Losada Hernández
cbdf06f39d oops 2024-05-23 13:35:00 +02:00
Víctor Losada Hernández
6f6c142aa2 fixes scrolling error 2024-05-23 13:32:09 +02:00
Víctor Losada Hernández
72cb8e7db9 remove console logs and add forced space to brew count 2024-05-23 13:18:07 +02:00
Víctor Losada Hernández
133295c225 big changes to the UI 2024-05-22 20:10:54 +02:00
Víctor Losada Hernández
54efc18ad4 minimum range text to 3 2024-05-22 19:55:20 +02:00
Víctor Losada Hernández
43f77dc525 fix valid check 2024-05-22 19:49:06 +02:00
Víctor Losada Hernández
34d37b24f1 "Update text in 'noBrews' div from 'Whenever you want, just start typing...' to 'No search yet'" 2024-05-22 12:33:11 +02:00
Víctor Losada Hernández
1e6427ca56 non selection , as per request 2024-05-22 12:28:57 +02:00
Víctor Losada Hernández
b9152867b8 "Refactor UpdateURL function" 2024-05-22 12:26:47 +02:00
Víctor Losada Hernández
879a1f5a57 fix page size to count 2024-05-22 08:51:49 +02:00
Víctor Losada Hernández
0f9ba1a5ae Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-05-22 08:23:53 +02:00
Víctor Losada Hernández
d96d3c501e logs 2024-05-22 08:22:19 +02:00
Víctor Losada Hernández
215888baf4 "Simplified conditional statement for displaying total brews count" 2024-05-22 08:21:00 +02:00
Víctor Losada Hernández
d56ea62b5e "Refactor loadPage function in ArchivePage component to fix wrong load of data" 2024-05-22 08:17:12 +02:00
Víctor Losada Hernández
888cf55b3d should render an icon while loading total count 2024-05-22 08:13:21 +02:00
Víctor Losada Hernández
4d7b1864d9 This should fix correct load on URL, will probably not work 2024-05-22 08:02:50 +02:00
Víctor Losada Hernández
319746f6cd "Removed options from pageSize select, added new options, and updated CSS selector for searchButton" 2024-05-22 07:58:09 +02:00
Víctor Losada Hernández
8fd165a79b form changes 2024-05-21 23:43:56 +02:00
Víctor Losada Hernández
ecfdada810 fix damn error finally 2024-05-21 12:24:47 +02:00
Víctor Losada Hernández
68c3e1ba84 log at will 2024-05-21 12:16:07 +02:00
Víctor Losada Hernández
efda06ebe5 console log to find the issue 2024-05-21 12:09:41 +02:00
Víctor Losada Hernández
e9b85e1a9a damn totalBrews won't go away 2024-05-21 12:06:08 +02:00
Víctor Losada Hernández
f9d19c75b2 change renderPagination order of operations and fix pagination not loading properly 2024-05-21 11:57:48 +02:00
Víctor Losada Hernández
21244fba58 "Removed lodash import, simplified boolean assignments, refactored API request and error handling, and removed unused variables in ArchivePage component." 2024-05-19 23:45:12 +02:00
Víctor Losada Hernández
55dd4efe41 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-05-19 23:21:47 +02:00
Víctor Losada Hernández
6e08fcca80 minor changes 2024-05-18 23:47:29 +02:00
Víctor Losada Hernández
3d0a9ea805 "Update ArchivePage: erase brewcount when new query, modify error messages for 503 and 500 status codes" 2024-05-18 23:19:25 +02:00
Víctor Losada Hernández
a711f8eb89 remove regex search 2024-05-18 23:07:43 +02:00
Víctor Losada Hernández
97ef56f905 small changes, tips and style 2024-05-14 11:10:48 +02:00
Víctor Losada Hernández
124af97cc8 extra page buttons linked to relevant pages 2024-05-14 10:49:10 +02:00
Víctor Losada Hernández
021ac68400 Update archive page to use pagination with page numbers and ellipses
* Change the way pagination is handled on the archive page
* Display page links for 10 pages max
2024-05-14 10:44:16 +02:00
Víctor Losada Hernández
4b10686336 simplify logic 2024-05-14 09:49:14 +02:00
Víctor Losada Hernández
153812c6e5 simplify console log and remove unused code 2024-05-14 09:36:59 +02:00
Víctor Losada Hernández
9aa3ebe872 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-05-14 09:31:40 +02:00
Víctor Losada Hernández
e23166e1d5 when did i change this? 2024-05-14 09:31:22 +02:00
Víctor Losada Hernández
a89b575b26 archive 2.0 2024-05-13 13:37:53 +02:00
Víctor Losada Hernández
5eeac603db why didn't i think about this sooner 2024-05-09 08:24:27 +02:00
Víctor Losada Hernández
cca0f3b4dc Revert "pagination controls update search terms"
This reverts commit 9966e6322d.
2024-05-08 15:51:31 +02:00
Víctor Losada Hernández
22f4dade4f default value to page size 2024-05-08 15:51:14 +02:00
Víctor Losada Hernández
e30a0c3dce page size log to track issue 2024-05-08 15:41:44 +02:00
Víctor Losada Hernández
9966e6322d pagination controls update search terms 2024-05-08 15:33:27 +02:00
Víctor Losada Hernández
02450982c1 fix brewCollection issue 2024-05-08 13:32:03 +02:00
Víctor Losada Hernández
f9f2e604c0 linting and remove async conflict 2024-05-07 10:14:46 +02:00
Víctor Losada Hernández
40ac8b1909 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-05-07 00:12:26 +02:00
Víctor Losada Hernández
f1a2037bca page is sometimes a string?? 2024-05-06 23:40:31 +02:00
Víctor Losada Hernández
ded78c6639 better error handling in jsx 2024-05-06 23:32:18 +02:00
Víctor Losada Hernández
51fcb59f09 debugging 500 errir catching 2024-05-06 23:26:02 +02:00
Víctor Losada Hernández
e75c556443 use $text instead 2024-05-06 22:59:09 +02:00
Víctor Losada Hernández
752b2caaf4 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-05-06 13:45:06 +02:00
Víctor Losada Hernández
3c84143511 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-04-02 14:40:24 +02:00
Víctor Losada Hernández
094ad3bd59 -proj in countdocs 2024-02-21 08:07:46 +01:00
Víctor Losada Hernández
01e3cd0296 fix notitle search and catch 404? 2024-02-15 17:22:20 +01:00
Víctor Losada Hernández
fd6109099a catch catch catch 2024-02-15 16:59:17 +01:00
Víctor Losada Hernández
8c07b12bb0 catch error codes 2024-02-15 16:56:09 +01:00
Víctor Losada Hernández
eb404b8e5b where is my 503 error code 2024-02-15 16:51:20 +01:00
Víctor Losada Hernández
0fdb5e83cf if this renders null i don't understand anything 2024-02-15 16:44:03 +01:00
Víctor Losada Hernández
2a780bc482 503 2024-02-15 16:36:10 +01:00
Víctor Losada Hernández
f61b664687 503 log 2024-02-15 16:32:50 +01:00
Víctor Losada Hernández
04844a4422 you know the deal 2024-02-15 16:27:50 +01:00
Víctor Losada Hernández
3afc9f83d9 where the hell did i lose the error handling 2024-02-15 16:23:37 +01:00
Víctor Losada Hernández
e08435568c don't search on reload without title 2024-02-15 16:20:08 +01:00
Víctor Losada Hernández
1a80a74d4f more error handling 2024-02-15 16:15:38 +01:00
Víctor Losada Hernández
9c53541cbd searching animation 2024-02-15 15:53:26 +01:00
Víctor Losada Hernández
62db393969 proper error handling(i think) 2024-02-15 15:50:27 +01:00
Víctor Losada Hernández
d7c9ab43bc more tests 2024-02-15 15:34:10 +01:00
Víctor Losada Hernández
fcb4c722c6 test 404 error 2024-02-15 15:28:36 +01:00
Víctor Losada Hernández
7626f63beb page numberas as links 2024-02-15 15:16:01 +01:00
Víctor Losada Hernández
a6e45c7fd1 Merge branch 'master' into experimental-development 2024-02-15 13:49:43 +01:00
Víctor Losada Hernández
2658831e83 pagination controls don't reset search 2024-02-15 13:45:31 +01:00
Víctor Losada Hernández
ffdbe46a23 catch 503 without title query 2024-02-15 10:43:12 +01:00
Víctor Losada Hernández
6a11cd0e28 renderer filter query 2024-02-15 10:34:39 +01:00
Víctor Losada Hernández
153ab63393 pagesize as input 2024-02-15 08:48:47 +01:00
Víctor Losada Hernández
ea1855485c css fixes 2024-02-15 01:27:05 +01:00
Víctor Losada Hernández
3427fa1e94 total brews found 2024-02-15 01:26:54 +01:00
Víctor Losada Hernández
46262c56db 503 catch 2 2024-02-15 01:15:00 +01:00
Víctor Losada Hernández
3482d92ab6 catch 503 error 2024-02-15 01:10:28 +01:00
Víctor Losada Hernández
74ac8f9ffa quickfix 2024-02-13 10:52:12 +01:00
Víctor Losada Hernández
7e289950fa Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery into experimental-development 2024-02-13 10:48:24 +01:00
Víctor Losada Hernández
9fc8af6553 pagination controls render separately 2024-02-13 10:48:19 +01:00
G.Ambatte
7ffc02c3e5 Reset searching state on error 2024-02-13 13:25:45 +13:00
Víctor Losada Hernández
2f323cde8a remove unused logic from loadpage 2024-02-12 23:54:15 +01:00
Víctor Losada Hernández
534131d994 edit console logs and change totalDocs logic to count correctly 2024-02-12 23:54:00 +01:00
Víctor Losada Hernández
d233e2b4a5 css fix, pagination controls basic look 2024-02-12 23:18:37 +01:00
Víctor Losada Hernández
05a7defcb8 remove brewCount useless element 2024-02-12 23:18:24 +01:00
G.Ambatte
eeec24ae78 Change fetch to use request-middleware instead 2024-02-13 09:14:31 +13:00
G.Ambatte
1d778e3249 Update API route 2024-02-13 09:13:47 +13:00
G.Ambatte
3bb44d8a17 Lint clean up 2024-02-13 09:06:33 +13:00
Víctor Losada Hernández
71c52b4587 fix html response 2024-02-12 08:44:18 +01:00
Víctor Losada Hernández
fe449abb47 trying to figure out pagination 2024-02-10 16:41:39 +01:00
Víctor Losada Hernández
46d1f89b77 minor fixes 2024-01-29 00:12:14 +01:00
Víctor Losada Hernández
bf1f2054de minor fixes 2024-01-28 16:14:54 +01:00
Víctor Losada Hernández
399caaaeff typo 2024-01-28 16:11:32 +01:00
Víctor Losada Hernández
27b4176e23 initial screen 2024-01-28 16:08:44 +01:00
Víctor Losada Hernández
a8bc6b4e1d h2 to h3 2024-01-28 16:04:21 +01:00
Víctor Losada Hernández
3ca8f72762 brewCount 2024-01-28 16:02:19 +01:00
Víctor Losada Hernández
8aec5dbba6 error 500 catch and show 2024-01-28 15:57:51 +01:00
Víctor Losada Hernández
cccebd8494 title and no brews UI 2024-01-28 11:18:37 +01:00
Víctor Losada Hernández
5fbbd92ea7 limit to 1000 2024-01-28 01:12:46 +01:00
Víctor Losada Hernández
81f26e0892 exclude last fix 2024-01-28 00:55:22 +01:00
Víctor Losada Hernández
9366284e1d quick fix 2024-01-28 00:26:35 +01:00
Víctor Losada Hernández
9aa5eea8c9 exclude fields and add a time limit 2024-01-27 23:31:56 +01:00
Víctor Losada Hernández
20f61bff07 limit to 2000 2024-01-27 21:46:28 +01:00
Víctor Losada Hernández
625819da91 Merge branch 'master' of https://github.com/naturalcrit/homebrewery into experimental-development 2024-01-27 19:14:48 +01:00
Víctor Losada Hernández
2c691d84f2 author fix 3 2024-01-27 19:14:38 +01:00
Víctor Losada Hernández
4630d2640b author another fix 2024-01-27 17:29:16 +01:00
Víctor Losada Hernández
043f24d5ca invited authors is not a thing 2024-01-27 16:56:38 +01:00
Víctor Losada Hernández
87e18c0521 no authors fix 2024-01-27 16:56:28 +01:00
Víctor Losada Hernández
7e30f860b2 typo fix 2024-01-27 16:26:06 +01:00
Víctor Losada Hernández
0ac0ffe53d limit to 3000 2024-01-27 16:25:06 +01:00
Víctor Losada Hernández
ae4e1b55e6 minor changes 2024-01-27 16:24:45 +01:00
Víctor Losada Hernández
756ced088c Merge branch 'experimental-development' of https://github.com/5e-Cleric/homebrewery into experimental-development 2024-01-27 14:31:34 +01:00
Víctor Losada Hernández
8ce6b22be7 reject modernity, embrace tradition 2024-01-27 14:31:32 +01:00
Trevor Buckner
6184d64f89 Merge branch 'master' into pr/3263 2024-01-25 16:43:21 -05:00
Víctor Losada Hernández
c00c2626b4 Merge branch 'master' into experimental-development 2024-01-24 22:56:30 +01:00
Víctor Losada Hernández
89fddd0210 limit search and adapt ui 2024-01-24 21:15:26 +01:00
Víctor Losada Hernández
0c167d803c limit the search 2024-01-24 21:15:00 +01:00
Víctor Losada Hernández
c50042c1e7 i love grid template area 2024-01-23 22:55:36 +01:00
Víctor Losada Hernández
0dc1b46466 stying updates, agnostic theme 2024-01-23 19:08:57 +01:00
Víctor Losada Hernández
4ed9fc7d0e fix url params 2024-01-23 18:35:09 +01:00
Víctor Losada Hernández
162929bdca trying to catch url with query 2024-01-23 14:02:27 +01:00
Víctor Losada Hernández
54a2f6940c from admin to archive api 2024-01-23 10:40:53 +01:00
Víctor Losada Hernández
0dff59d793 linting and space issues 2024-01-23 08:07:51 +01:00
Víctor Losada Hernández
7951c4a03a basic ui and small changes 2024-01-23 00:20:18 +01:00
Víctor Losada Hernández
66fd56fccb basic functionality 2024-01-22 23:52:42 +01:00
Víctor Losada Hernández
da699e999f basic looks 2024-01-22 23:20:36 +01:00
Víctor Losada Hernández
c6a5f50c76 admin page fix 2024-01-22 17:22:54 +01:00
Víctor Losada Hernández
74c7395ab9 admin look by title 2024-01-22 16:59:45 +01:00
31 changed files with 1341 additions and 232 deletions

4
.gitattributes vendored
View File

@@ -1 +1,3 @@
package-lock.json binary
package-lock.json binary
*.json text eol=lf

View File

@@ -84,9 +84,54 @@ pre {
## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
### Tuesday 8/27/2024 - v3.14.2
{{taskList
### Wednesday 9/04/2024 - v3.15.0
{{taskList
##### 5e-Cleric, abquintic, calculuschild, Gazook89, G-Ambatte, Ericsheid, Kaiburr
* [x] New {{openSans **VAULT** {{fas,fa-dungeon}}}} page 🎉🎉🎉
:
All **PUBLISHED** brews ({{openSans :fas_circle_info: **Properties**}} menu) will be searchable, by title or author, and filtered by renderer. More features and adjustments will be coming.
:
Note: If any of your own brews are not showing up in search (particularly if stored on Google Drive), please edit and re-save to ensure our database has the data needed from document to be searchable.
Fixes issue [#697](https://github.com/naturalcrit/homebrewery/issues/697)
##### Gazook89
* [x] Auto-focus on text editor when switching editor tabs
}}
### Wednesday 8/28/2024 - v3.14.3
{{taskList
##### calculuschild, G-Ambatte
* [x] New {{openSans **IMAGES → {{fac,image-wrap-left}} IMAGE WRAP LEFT/RIGHT**}} snippets
Fixes issue [#380](https://github.com/naturalcrit/homebrewery/issues/380)
* [x] Fix v3.14.2 bug with `` failing after tables
##### 5e-Cleric
* [x] Fix Account page crash when not logged in
Fixes issue [#3605](https://github.com/naturalcrit/homebrewery/issues/3605)
##### abquintic
* [x] Fix jump hotkeys conflicting with `CTRL + SHIFT`. Preview and Source movement shortcuts now use `CTRL + SHIFT + META + LEFT\RIGHTARROW`
##### G-Ambatte
* [x] Fix display issue with image wrap icons
}}
### Tuesday 8/27/2024 - v3.14.2
{{taskList
##### calculuschild
* [x] Reroute invalid urls to homepage
@@ -119,7 +164,7 @@ Fixes issues [#3572](https://github.com/naturalcrit/homebrewery/issues/3572)
Fixes issues [#1430](https://github.com/naturalcrit/homebrewery/issues/1430)
* [x] Fix colon `:::` being parsed in codeblocks
* [x] Fix colon `` being parsed in codeblocks
* [x] Prevent crashes when loading undefined renderer or theme bundle
@@ -133,12 +178,11 @@ Fixes issues [#1430](https://github.com/naturalcrit/homebrewery/issues/1430)
##### 5e-Cleric, Gazook89
* [x] Viewer tools for zoom/page navigation
}}
### Tuesday 8/13/2024 - v3.14.1
{{taskList
{{taskList
##### abquintic
* [x] Allow Table of Contents to flow across columns
@@ -181,16 +225,13 @@ Fixes issues [#3613](https://github.com/naturalcrit/homebrewery/issues/3613)
Fixes issues [#3622](https://github.com/naturalcrit/homebrewery/issues/3622)
##### calculuschild
* [x] Fix `/migrate` page using an editor context instead of share context
##### 5e-Cleric
* [x] Fix Monster Stat Blocks losing color in Safari
}}
\page

View File

@@ -4,7 +4,7 @@ const _ = require('lodash');
import Dialog from '../../../components/dialog.jsx';
const DISMISS_KEY = 'dismiss_notification12-04-23';
const DISMISS_KEY = 'dismiss_notification01-10-24';
const DISMISS_BUTTON = <i className='fas fa-times dismiss' />;
const NotificationPopup = ()=>{
@@ -15,11 +15,40 @@ const NotificationPopup = ()=>{
<small>This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind:</small>
</div>
<ul>
<li key='psa'>
<em>Don't store IMAGES in Google Drive</em><br />
Google Drive is not an image service, and will block images from being used
in brews if they get more views than expected. Google has confirmed they won't fix
this, so we recommend you look for another image hosting service such as imgur, ImgBB or Google Photos.
<li key='ThrottlingError' style={{
backgroundColor: '#910000',
margin: '-10px -10px -10px -20px',
padding: '10px 10px 10px 20px',
fontSize: '1.0em'
}}>
<em>Known issue with saving/creating Google Drive files</em><br />
Dear users. The <a href="https://github.com/naturalcrit/homebrewery/issues/3770">
issue with saving to Google Drive</a> has resurfaced as of Oct 1, 2024 22:00 UTC.
<br></br><br></br>
Earlier we submitted a bug report to Google and have all but confirmed the issue
lies on Google's end and the disruption has been affecting multiple other
organizations besides us. Unfortunately, it means reliable interaction with
Google remains out of our control until they can resolve their issue.
<br></br><br></br>
Brews saved to Google Drive are <em>not lost</em> and can still be viewed, just not updated.
You can also access them via your Google Drive interface in the <code>/Hombrewery</code> folder.
<br></br><br></br>
If you need to urgently edit documents, you can detatch them from your Google Drive
by transferring them to our Homebrewery storage. To do this, click the colored Google Drive
icon next to the save button when on an edit page; you can transfer them back later,
but this should allow you to edit while this issue is ongoing.
<br></br><br></br>
If you are experiencing errors creating new documents, you can similarly change your
account settings to create new brews by default in the Homebrewery storage. Click
your username and then "account", then change the "default save location".
</li>
<li key='Vault'>
<em>Search brews with our new page!</em><br />
We have been working very hard in making this possible, now you can share your work and look at it in the new <a href="/vault">Vault</a> page!
All PUBLISHED brews will be available to anyone searching there, by title or author, and filtering by renderer.
More features will be coming.
</li>
<li key='googleDriveFolder'>

View File

@@ -85,7 +85,7 @@ const Editor = createClass({
},
handleControlKeys : function(e){
if(!(e.ctrlKey || e.metaKey)) return;
if(!(e.ctrlKey && e.metaKey)) return;
const LEFTARROW_KEY = 37;
const RIGHTARROW_KEY = 39;
if (e.shiftKey && (e.keyCode == RIGHTARROW_KEY)) this.brewJump();
@@ -113,7 +113,10 @@ const Editor = createClass({
this.props.setMoveArrows(newView === 'text');
this.setState({
view : newView
}, this.updateEditorSize); //TODO: not sure if updateeditorsize needed
}, ()=>{
this.codeEditor.current?.codeMirror.focus();
this.updateEditorSize();
}); //TODO: not sure if updateeditorsize needed
},
getCurrentPage : function(){

View File

@@ -10,6 +10,7 @@ const UserPage = require('./pages/userPage/userPage.jsx');
const SharePage = require('./pages/sharePage/sharePage.jsx');
const NewPage = require('./pages/newPage/newPage.jsx');
const ErrorPage = require('./pages/errorPage/errorPage.jsx');
const VaultPage = require('./pages/vaultPage/vaultPage.jsx');
const AccountPage = require('./pages/accountPage/accountPage.jsx');
const WithRoute = (props)=>{
@@ -71,6 +72,7 @@ const Homebrew = createClass({
<Route path='/new/:id' element={<WithRoute el={NewPage} brew={this.props.brew} userThemes={this.props.userThemes}/>} />
<Route path='/new' element={<WithRoute el={NewPage} userThemes={this.props.userThemes}/> } />
<Route path='/user/:username' element={<WithRoute el={UserPage} brews={this.props.brews} />} />
<Route path='/vault' element={<WithRoute el={VaultPage}/>}/>
<Route path='/changelog' element={<WithRoute el={SharePage} brew={this.props.brew} disableMeta={true} />} />
<Route path='/faq' element={<WithRoute el={SharePage} brew={this.props.brew} disableMeta={true} />} />
<Route path='/migrate' element={<WithRoute el={SharePage} brew={this.props.brew} disableMeta={true} />} />

View File

@@ -116,6 +116,17 @@ const ErrorNavItem = createClass({
</Nav.item>;
}
if(HBErrorCode === '55') {
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer' onClick={clearError}>
Looks like there are too many requests
from this IP address in a short time.
Please try again after a few minutes.
</div>
</Nav.item>;
}
return <Nav.item className='save error' icon='fas fa-exclamation-triangle'>
Oops!
<div className='errorContainer'>

View File

@@ -36,7 +36,7 @@ const RecentItems = createClass({
//== Add current brew to appropriate recent items list (depending on storageKey) ==//
if(this.props.storageKey == 'edit'){
let editId = this.props.brew.editId;
if(this.props.brew.googleId){
if(this.props.brew.googleId && !this.props.brew.stubbed){
editId = `${this.props.brew.googleId}${this.props.brew.editId}`;
}
edited = _.filter(edited, (brew)=>{
@@ -51,7 +51,7 @@ const RecentItems = createClass({
}
if(this.props.storageKey == 'view'){
let shareId = this.props.brew.shareId;
if(this.props.brew.googleId){
if(this.props.brew.googleId && !this.props.brew.stubbed){
shareId = `${this.props.brew.googleId}${this.props.brew.shareId}`;
}
viewed = _.filter(viewed, (brew)=>{
@@ -83,7 +83,7 @@ const RecentItems = createClass({
let edited = JSON.parse(localStorage.getItem(EDIT_KEY) || '[]');
if(this.props.storageKey == 'edit') {
let prevEditId = prevProps.brew.editId;
if(prevProps.brew.googleId){
if(prevProps.brew.googleId && !this.props.brew.stubbed){
prevEditId = `${prevProps.brew.googleId}${prevProps.brew.editId}`;
}
@@ -91,7 +91,7 @@ const RecentItems = createClass({
return brew.id !== prevEditId;
});
let editId = this.props.brew.editId;
if(this.props.brew.googleId){
if(this.props.brew.googleId && !this.props.brew.stubbed){
editId = `${this.props.brew.googleId}${this.props.brew.editId}`;
}
edited.unshift({

View File

@@ -0,0 +1,17 @@
const React = require('react');
const Nav = require('naturalcrit/nav/nav.jsx');
module.exports = function (props) {
return (
<Nav.item
color='purple'
icon='fas fa-dungeon'
href='/vault'
newTab={false}
rel='noopener noreferrer'
>
Vault
</Nav.item>
);
};

View File

@@ -19,7 +19,8 @@ const BrewItem = createClass({
stubbed : true
},
updateListFilter : ()=>{},
reportError : ()=>{}
reportError : ()=>{},
renderStorage : true
};
},
@@ -95,6 +96,7 @@ const BrewItem = createClass({
},
renderStorageIcon : function(){
if(!this.props.renderStorage) return;
if(this.props.brew.googleId) {
return <span title={this.props.brew.webViewLink ? 'Your Google Drive Storage': 'Another User\'s Google Drive Storage'}>
<a href={this.props.brew.webViewLink} target='_blank'>
@@ -142,10 +144,14 @@ const BrewItem = createClass({
}
<span title={`Authors:\n${brew.authors?.join('\n')}`}>
<i className='fas fa-user'/> {brew.authors?.map((author, index)=>(
<>
<a key={index} href={`/user/${author}`}>{author}</a>
{index < brew.authors.length - 1 && ', '}
</>))}
<React.Fragment key={index}>
{author === 'hidden'
? <span title="Username contained an email address; hidden to protect user's privacy">{author}</span>
: <a href={`/user/${author}`}>{author}</a>
}
{index < brew.authors.length - 1 && ', '}
</React.Fragment>
))}
</span>
<br />
<span title={`Last viewed: ${moment(brew.lastViewed).local().format(dateFormatString)}`}>

View File

@@ -29,7 +29,7 @@ const { printCurrentBrew, fetchThemeBundle } = require('../../../../shared/helpe
const googleDriveIcon = require('../../googleDrive.svg');
const SAVE_TIMEOUT = 3000;
const SAVE_TIMEOUT = 16000;
const EditPage = createClass({
displayName : 'EditPage',

View File

@@ -2,6 +2,9 @@ const dedent = require('dedent-tabs').default;
const loginUrl = 'https://www.naturalcrit.com/login';
//001-050 : Brew errors
//050-100 : Other pages errors
const errorIndex = (props)=>{
return {
// Default catch all
@@ -149,8 +152,16 @@ const errorIndex = (props)=>{
**Brew ID:** ${props.brew.brewId}`,
//account page when account is not defined
'50' : dedent`
## You are not signed in
You are trying to access the account page, but are not signed in to an account.
Please login or signup at our [login page](https://www.naturalcrit.com/login?redirect=https://homebrewery.naturalcrit.com/account).`,
// Brew locked by Administrators error
'100' : dedent`
'51' : dedent`
## This brew has been locked.
Only an author may request that this lock is removed.
@@ -160,7 +171,12 @@ const errorIndex = (props)=>{
**Brew ID:** ${props.brew.brewId}
**Brew Title:** ${props.brew.brewTitle}`,
'90' : dedent` An unexpected error occurred while looking for these brews.
Try again in a few minutes.`,
'91' : dedent` An unexpected error occurred while trying to get the total of brews.`,
};
};
module.exports = errorIndex;
module.exports = errorIndex;

View File

@@ -10,12 +10,12 @@ 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 VaultNavItem = require('../../navbar/vault.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 { fetchThemeBundle } = require('../../../../shared/helpers.js');
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
const Editor = require('../../editor/editor.jsx');
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
@@ -76,6 +76,7 @@ const HomePage = createClass({
}
<NewBrewItem />
<HelpNavItem />
<VaultNavItem />
<RecentNavItem />
<AccountNavItem />
</Nav.section>

View File

@@ -12,6 +12,7 @@ const Account = require('../../navbar/account.navitem.jsx');
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
const HelpNavItem = require('../../navbar/help.navitem.jsx');
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
const VaultNavitem = require('../../navbar/vault.navitem.jsx');
const UserPage = createClass({
displayName : 'UserPage',
@@ -66,6 +67,7 @@ const UserPage = createClass({
}
<NewBrew />
<HelpNavItem />
<VaultNavitem/>
<RecentNavItem />
<Account />
</Nav.section>

View File

@@ -0,0 +1,396 @@
require('./vaultPage.less');
const React = require('react');
const { useState, useEffect, useRef } = React;
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 BrewItem = require('../basePages/listPage/brewItem/brewItem.jsx');
const SplitPane = require('../../../../shared/naturalcrit/splitPane/splitPane.jsx');
const ErrorIndex = require('../errorPage/errors/errorIndex.js');
const request = require('../../utils/request-middleware.js');
const VaultPage = (props)=>{
const [pageState, setPageState] = useState(parseInt(props.query.page) || 1);
//Response state
const [brewCollection, setBrewCollection] = useState(null);
const [totalBrews, setTotalBrews] = useState(null);
const [searching, setSearching] = useState(false);
const [error, setError] = useState(null);
const titleRef = useRef(null);
const authorRef = useRef(null);
const countRef = useRef(null);
const v3Ref = useRef(null);
const legacyRef = useRef(null);
const submitButtonRef = useRef(null);
useEffect(()=>{
disableSubmitIfFormInvalid();
loadPage(pageState, true);
}, []);
const updateStateWithBrews = (brews, page)=>{
setBrewCollection(brews || null);
setPageState(parseInt(page) || 1);
setSearching(false);
};
const updateUrl = (titleValue, authorValue, countValue, v3Value, legacyValue, page)=>{
const url = new URL(window.location.href);
const urlParams = new URLSearchParams(url.search);
urlParams.set('title', titleValue);
urlParams.set('author', authorValue);
urlParams.set('count', countValue);
urlParams.set('v3', v3Value);
urlParams.set('legacy', legacyValue);
urlParams.set('page', page);
url.search = urlParams.toString();
window.history.replaceState(null, '', url.toString());
};
const performSearch = async (title, author, count, v3, legacy, page)=>{
updateUrl(title, author, count, v3, legacy, page);
const response = await request.get(
`/api/vault?title=${title}&author=${author}&v3=${v3}&legacy=${legacy}&count=${count}&page=${page}`
).catch((error)=>{
console.log('error at loadPage: ', error);
setError(error);
updateStateWithBrews([], 1);
});
if(response.ok)
updateStateWithBrews(response.body.brews, page);
};
const loadTotal = async (title, author, v3, legacy)=>{
setTotalBrews(null);
const response = await request.get(
`/api/vault/total?title=${title}&author=${author}&v3=${v3}&legacy=${legacy}`
).catch((error)=>{
console.log('error at loadTotal: ', error);
setError(error);
updateStateWithBrews([], 1);
});
if(response.ok)
setTotalBrews(response.body.totalBrews);
};
const loadPage = async (page, updateTotal)=>{
if(!validateForm())
return;
setSearching(true);
setError(null);
const title = titleRef.current.value || '';
const author = authorRef.current.value || '';
const count = countRef.current.value || 10;
const v3 = v3Ref.current.checked != false;
const legacy = legacyRef.current.checked != false;
performSearch(title, author, count, v3, legacy, page);
if(updateTotal)
loadTotal(title, author, v3, legacy);
};
const renderNavItems = ()=>(
<Navbar>
<Nav.section>
<Nav.item className='brewTitle'>
Vault: Search for brews
</Nav.item>
</Nav.section>
<Nav.section>
<NewBrew />
<HelpNavItem />
<RecentNavItem />
<Account />
</Nav.section>
</Navbar>
);
const validateForm = ()=>{
//form validity: title or author must be written, and at least one renderer set
const isTitleValid = titleRef.current.validity.valid && titleRef.current.value;
const isAuthorValid = authorRef.current.validity.valid && authorRef.current.value;
const isCheckboxChecked = legacyRef.current.checked || v3Ref.current.checked;
const isFormValid = (isTitleValid || isAuthorValid) && isCheckboxChecked;
return isFormValid;
};
const disableSubmitIfFormInvalid = ()=>{
submitButtonRef.current.disabled = !validateForm();
};
const renderForm = ()=>(
<div className='brewLookup'>
<h2 className='formTitle'>Brew Lookup</h2>
<div className='formContents'>
<label>
Title of the brew
<input
ref={titleRef}
type='text'
name='title'
defaultValue={props.query.title || ''}
onKeyUp={disableSubmitIfFormInvalid}
pattern='.{3,}'
title='At least 3 characters'
onKeyDown={(e)=>{
if(e.key === 'Enter' && !submitButtonRef.current.disabled)
loadPage(1, true);
}}
placeholder='v3 Reference Document'
/>
</label>
<label>
Author of the brew
<input
ref={authorRef}
type='text'
name='author'
pattern='.{1,}'
defaultValue={props.query.author || ''}
onKeyUp={disableSubmitIfFormInvalid}
onKeyDown={(e)=>{
if(e.key === 'Enter' && !submitButtonRef.current.disabled)
loadPage(1, true);
}}
placeholder='Username'
/>
</label>
<label>
Results per page
<select ref={countRef} name='count' defaultValue={props.query.count || 20}>
<option value='10'>10</option>
<option value='20'>20</option>
<option value='40'>40</option>
<option value='60'>60</option>
</select>
</label>
<label>
<input
className='renderer'
ref={v3Ref}
type='checkbox'
defaultChecked={props.query.v3 !== 'false'}
onChange={disableSubmitIfFormInvalid}
/>
Search for v3 brews
</label>
<label>
<input
className='renderer'
ref={legacyRef}
type='checkbox'
defaultChecked={props.query.legacy !== 'false'}
onChange={disableSubmitIfFormInvalid}
/>
Search for legacy brews
</label>
<button
id='searchButton'
ref={submitButtonRef}
onClick={()=>{
loadPage(1, true);
}}
>
Search
<i
className={searching ? 'fas fa-spin fa-spinner': 'fas fa-search'}
/>
</button>
</div>
<legend>
<h3>Tips and tricks</h3>
<ul>
<li>
Only <b>published</b> brews are searchable via this tool
</li>
<li>
Usernames are case-sensitive
</li>
<li>
Use <code>"word"</code> to match an exact string,
and <code>-</code> to exclude words (at least one word must not be negated)
</li>
<li>
Some common words like "a", "after", "through", "itself", "here", etc.,
are ignored in searches. The full list can be found &nbsp;
<a href='https://github.com/mongodb/mongo/blob/0e3b3ca8480ddddf5d0105d11a94bd4698335312/src/mongo/db/fts/stop_words_english.txt'>
here
</a>
</li>
</ul>
<small>New features will be coming, such as filters and search by tags.</small>
</legend>
</div>
);
const renderPaginationControls = ()=>{
if(!totalBrews) return null;
const countInt = parseInt(props.query.count || 20);
const totalPages = Math.ceil(totalBrews / countInt);
let startPage, endPage;
if(pageState <= 6) {
startPage = 1;
endPage = Math.min(totalPages, 10);
} else if(pageState + 4 >= totalPages) {
startPage = Math.max(1, totalPages - 9);
endPage = totalPages;
} else {
startPage = pageState - 5;
endPage = pageState + 4;
}
const pagesAroundCurrent = new Array(endPage - startPage + 1)
.fill()
.map((_, index)=>(
<a
key={startPage + index}
className={`pageNumber ${
pageState === startPage + index ? 'currentPage' : ''
}`}
onClick={()=>loadPage(startPage + index, false)}
>
{startPage + index}
</a>
));
return (
<div className='paginationControls'>
<button
className='previousPage'
onClick={()=>loadPage(pageState - 1, false)}
disabled={pageState === startPage}
>
<i className='fa-solid fa-chevron-left'></i>
</button>
<ol className='pages'>
{startPage > 1 && (
<a
className='pageNumber firstPage'
onClick={()=>loadPage(1, false)}
>
1 ...
</a>
)}
{pagesAroundCurrent}
{endPage < totalPages && (
<a
className='pageNumber lastPage'
onClick={()=>loadPage(totalPages, false)}
>
... {totalPages}
</a>
)}
</ol>
<button
className='nextPage'
onClick={()=>loadPage(pageState + 1, false)}
disabled={pageState === totalPages}
>
<i className='fa-solid fa-chevron-right'></i>
</button>
</div>
);
};
const renderFoundBrews = ()=>{
if(searching) {
return (
<div className='foundBrews searching'>
<h3 className='searchAnim'>Searching</h3>
</div>
);
}
if(error) {
const errorText = ErrorIndex()[error.HBErrorCode.toString()] || '';
return (
<div className='foundBrews noBrews'>
<h3>Error: {errorText}</h3>
</div>
);
}
if(!brewCollection) {
return (
<div className='foundBrews noBrews'>
<h3>No search yet</h3>
</div>
);
}
if(brewCollection.length === 0) {
return (
<div className='foundBrews noBrews'>
<h3>No brews found</h3>
</div>
);
}
return (
<div className='foundBrews'>
<span className='totalBrews'>
{`Brews found: `}
<span>{totalBrews}</span>
</span>
{brewCollection.map((brew, index)=>{
return (
<BrewItem
brew={{ ...brew }}
key={index}
reportError={props.reportError}
renderStorage={false}
/>
);
})}
{renderPaginationControls()}
</div>
);
};
return (
<div className='vaultPage'>
<link href='/themes/V3/Blank/style.css' rel='stylesheet' />
<link href='/themes/V3/5ePHB/style.css' rel='stylesheet' />
{renderNavItems()}
<div className='content'>
<SplitPane showDividerButtons={false}>
<div className='form dataGroup'>{renderForm()}</div>
<div className='resultsContainer dataGroup'>
{renderFoundBrews()}
</div>
</SplitPane>
</div>
</div>
);
};
module.exports = VaultPage;

View File

@@ -0,0 +1,362 @@
.vaultPage {
height : 100%;
overflow-y : hidden;
background-color : #2C3E50;
*:not(input) { user-select : none; }
.content {
background : #2C3E50;
height: 100%;
.dataGroup {
width : 100%;
height : 100%;
background : white;
&.form .brewLookup {
position : relative;
padding : 50px clamp(20px, 4vw, 50px);
small {
font-size : 10pt;
color : #555555;
a { color : #333333; }
}
code {
padding-inline : 5px;
background : lightgrey;
border-radius : 5px;
font-family : monospace;
}
h1, h2, h3, h4 {
font-family : 'CodeBold';
letter-spacing : 2px;
}
legend {
h3 {
margin-block : 30px 20px;
font-size : 20px;
text-align : center;
border-bottom : 2px solid;
}
ul {
padding-inline : 30px 10px;
li {
margin-block : 5px;
line-height : calc(1em + 5px);
list-style : disc;
}
}
}
&::after {
position : absolute;
top : 0;
right : 0;
left : 0;
display : block;
padding : 10px;
font-weight : 900;
color : white;
white-space : pre-wrap;
content : 'Error:\A At least one renderer should be enabled to make a search';
background : rgb(255, 60, 60);
opacity : 0;
transition : opacity 0.5s;
}
&:not(:has(input[type='checkbox']:checked))::after { opacity : 1; }
.formTitle {
margin : 20px 0;
font-size : 30px;
color : black;
text-align : center;
border-bottom : 2px solid;
}
.formContents {
position : relative;
display : flex;
flex-direction : column;
label {
display : flex;
align-items : center;
margin : 10px 0;
}
select { margin : 0 10px; }
input {
margin : 0 10px;
&:invalid { background : rgb(255, 188, 181); }
&[type='checkbox'] {
position : relative;
display : inline-block;
width : 50px;
height : 30px;
font-family : 'WalterTurncoat';
font-size : 20px;
font-weight : 800;
color : white;
letter-spacing : 2px;
appearance : none;
background : red;
isolation : isolate;
border-radius : 5px;
&::before,&::after {
position : absolute;
inset : 0;
z-index : 5;
padding-top : 2px;
text-align : center;
}
&::before {
display : block;
content : 'No';
}
&::after {
display : none;
content : 'Yes';
}
&:checked {
background : green;
&::before { display : none; }
&::after { display : block; }
}
}
}
#searchButton {
position : absolute;
right : 20px;
bottom : 0;
i {
margin-left : 10px;
animation-duration : 1000s;
}
}
}
}
&.resultsContainer {
display : flex;
flex-direction : column;
height : 100%;
overflow-y : auto;
font-family : 'BookInsanityRemake';
font-size : 0.34cm;
h3 {
font-family : 'Open Sans';
font-weight : 900;
color : white;
}
.foundBrews {
position : relative;
width : 100%;
height : 100%;
max-height : 100%;
padding : 50px 50px 70px 50px;
overflow-y : scroll;
background-color : #2C3E50;
h3 { font-size : 25px; }
&.noBrews {
display : grid;
place-items : center;
color : white;
}
&.searching {
display : grid;
place-items : center;
color : white;
h3 { position : relative; }
h3.searchAnim::after {
position : absolute;
top : 50%;
right : 0;
width : max-content;
height : 1em;
content : '';
translate : calc(100% + 5px) -50%;
animation : trailingDots 2s ease infinite;
}
}
.totalBrews {
position : fixed;
right : 0;
bottom : 0;
z-index : 1000;
padding : 8px 10px;
font-family : 'Open Sans';
font-size : 11px;
font-weight : 800;
color : white;
background-color : #333333;
.searchAnim {
position : relative;
display : inline-block;
width : 3ch;
height : 1em;
}
.searchAnim::after {
position : absolute;
top : 50%;
right : 0;
width : max-content;
height : 1em;
content : '';
translate : -50% -50%;
animation : trailingDots 2s ease infinite;
}
}
.brewItem {
width : 47%;
margin-right : 40px;
color : black;
isolation:isolate;
&:after {
position:absolute;
inset:0;
display:block;
content:'';
background-image : url('/assets/parchmentBackground.jpg');
z-index:-1;
}
&:nth-child(even of .brewItem) { margin-right : 0; }
h2 {
font-family : 'MrEavesRemake';
font-size : 0.75cm;
font-weight : 800;
line-height : 0.988em;
color : var(--HB_Color_HeaderText);
}
.info {
font-family : 'ScalySansRemake';
font-size : 1.2em;
position:relative;
z-index:2;
>span {
margin-right : 12px;
line-height : 1.5em;
}
}
.links {
z-index:2;
}
hr {
margin: 0px;
visibility: hidden;
}
.thumbnail {
z-index:1;
}
}
.paginationControls {
position : absolute;
left : 50%;
display : grid;
grid-template-areas : 'previousPage currentPage nextPage';
grid-template-columns : 50px 1fr 50px;
place-items : center;
width : auto;
translate : -50%;
.pages {
display : flex;
grid-area : currentPage;
justify-content : space-evenly;
width : 100%;
height : 100%;
padding : 5px 8px;
text-align : center;
.pageNumber {
margin-inline : 1vw;
font-family : 'Open Sans';
font-weight : 900;
color : white;
text-underline-position : under;
text-wrap : nowrap;
cursor : pointer;
&.currentPage {
color : gold;
text-decoration : underline;
pointer-events : none;
}
&.firstPage { margin-right : -5px; }
&.lastPage { margin-left : -5px; }
}
}
button {
width : max-content;
&.previousPage { grid-area : previousPage; }
&.nextPage { grid-area : nextPage; }
}
}
}
}
}
}
}
@keyframes trailingDots {
0%,
32% { content : ' .'; }
33%,
65% { content : ' ..'; }
66%,
100% { content : ' ...'; }
}
// media query for when the page is smaller than 1079 px in width
@media screen and (max-width : 1079px) {
.vaultPage .content {
.dataGroup.form .brewLookup { padding : 1px 20px 20px 10px; }
.dataGroup.resultsContainer .foundBrews .brewItem {
width : 100%;
margin-inline : auto;
}
}
}

View File

@@ -52,6 +52,12 @@
.book-part-cover {
mask-image: url('../icons/book-part-cover.svg');
}
.image-wrap-left {
mask-image: url('../icons/image-wrap-left.svg');
}
.image-wrap-right {
mask-image: url('../icons/image-wrap-right.svg');
}
.davek {
mask-image: url('../icons/Davek.svg');
}

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
x="0px"
y="0px"
viewBox="0 0 512.00006 512"
xml:space="preserve"
id="svg10"
sodipodi:docname="noun-wrap-image-left-212078.svg"
width="512.00006"
height="512"
inkscape:export-filename="image-wrap-right.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs10" /><sodipodi:namedview
id="namedview10"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 185.80018,144 H 32"
id="path11"
sodipodi:nodetypes="cc"
clip-path="none"
inkscape:export-filename="image-wrap-right.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 185.80018,368 H 32"
id="path11-8"
sodipodi:nodetypes="cc"
clip-path="none" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 480.00007,32 H 32"
id="path11-8-2-67"
clip-path="none"
sodipodi:nodetypes="cc" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 480.00008,480 H 32"
id="path11-8-2-67-2"
clip-path="none"
sodipodi:nodetypes="cc" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 160.0001,255.98832 32,256.01162"
id="path11-0"
sodipodi:nodetypes="cc"
clip-path="none" /><path
id="path23"
style="opacity:0.922046;fill:#000000;fill-opacity:1;stroke-width:64;stroke-linecap:round;stroke-dasharray:none;paint-order:fill markers stroke"
d="m 416.00008,96 a 160,160 0 0 1 96,32.50977 v 254.98046 a 160,160 0 0 1 -96,32.50977 160,160 0 0 1 -160,-160 160,160 0 0 1 160,-160 z" /></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
x="0px"
y="0px"
viewBox="0 0 512.00006 512"
xml:space="preserve"
id="svg10"
sodipodi:docname="noun-wrap-image-left-212078.svg"
width="512.00006"
height="512"
inkscape:export-filename="image-wrap-right.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs10" /><sodipodi:namedview
id="namedview10"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 326.1999,144 H 480.00008"
id="path11"
sodipodi:nodetypes="cc"
clip-path="none"
inkscape:export-filename="image-wrap-right.svg"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 326.1999,368 H 480.00008"
id="path11-8"
sodipodi:nodetypes="cc"
clip-path="none" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 32.00001,32 H 480.00008"
id="path11-8-2-67"
clip-path="none"
sodipodi:nodetypes="cc" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="M 32,480 H 480.00008"
id="path11-8-2-67-2"
clip-path="none"
sodipodi:nodetypes="cc" /><path
style="fill:none;stroke:#000000;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
d="m 351.99998,255.98832 128.0001,0.0233"
id="path11-0"
sodipodi:nodetypes="cc"
clip-path="none" /><path
id="path23"
style="opacity:0.922046;fill:#000000;fill-opacity:1;stroke-width:64;stroke-linecap:round;stroke-dasharray:none;paint-order:fill markers stroke"
d="M 96,96 A 160,160 0 0 0 0,128.50977 V 383.49023 A 160,160 0 0 0 96,416 160,160 0 0 0 256,256 160,160 0 0 0 96,96 Z" /></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

192
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "homebrewery",
"version": "3.14.2",
"version": "3.15.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "homebrewery",
"version": "3.14.2",
"version": "3.15.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
@@ -14,7 +14,7 @@
"@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.24.7",
"@googleapis/drive": "^8.13.0",
"@googleapis/drive": "^8.14.0",
"body-parser": "^1.20.2",
"classnames": "^2.5.1",
"codemirror": "^5.65.6",
@@ -25,6 +25,7 @@
"expr-eval": "^2.0.2",
"express": "^4.19.2",
"express-async-handler": "^1.2.0",
"express-rate-limit": "^7.4.0",
"express-static-gzip": "2.1.7",
"fs-extra": "11.2.0",
"js-yaml": "^4.1.0",
@@ -33,12 +34,12 @@
"lodash": "^4.17.21",
"marked": "11.2.0",
"marked-emoji": "^1.4.2",
"marked-extended-tables": "^1.0.8",
"marked-extended-tables": "^1.0.10",
"marked-gfm-heading-id": "^3.2.0",
"marked-smartypants-lite": "^1.0.2",
"markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.30.1",
"mongoose": "^8.5.4",
"mongoose": "^8.6.1",
"nanoid": "3.3.4",
"nconf": "^0.12.1",
"react": "^18.3.1",
@@ -52,13 +53,13 @@
"devDependencies": {
"@stylistic/stylelint-plugin": "^3.0.1",
"eslint": "^9.9.1",
"eslint-plugin-jest": "^28.8.0",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-jest": "^28.8.3",
"eslint-plugin-react": "^7.35.2",
"globals": "^15.9.0",
"jest": "^29.7.0",
"jest-expect-message": "^1.1.3",
"postcss-less": "^6.0.0",
"stylelint": "^16.8.2",
"stylelint": "^16.9.0",
"stylelint-config-recess-order": "^5.1.0",
"stylelint-config-recommended": "^14.0.1",
"supertest": "^7.0.0"
@@ -2091,9 +2092,9 @@
}
},
"node_modules/@googleapis/drive": {
"version": "8.13.0",
"resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.13.0.tgz",
"integrity": "sha512-xpXzZeYtNNFLy1m2D5A8/QR2bngpjLPEvO5KZUW4Dlwi/SBHYNTjVm37IQagtQg6QUJlFb4lVLewenUdZZB1rA==",
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/@googleapis/drive/-/drive-8.14.0.tgz",
"integrity": "sha512-AOokfpP6pCdcJXWA8khaCEgbGpWYavWTdAAhL4idbbf2VCQcJ2f7vPalAYNu6a4Sfj0Ly4Ehnd1xw9J9TixB1A==",
"dependencies": {
"googleapis-common": "^7.0.0"
},
@@ -2970,7 +2971,6 @@
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz",
"integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==",
"license": "MIT",
"dependencies": {
"sparse-bitfield": "^3.0.3"
}
@@ -3172,14 +3172,12 @@
"node_modules/@types/webidl-conversions": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
"integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
"license": "MIT"
"integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
},
"node_modules/@types/whatwg-url": {
"version": "11.0.5",
"resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
"integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
"license": "MIT",
"dependencies": {
"@types/webidl-conversions": "*"
}
@@ -4434,7 +4432,6 @@
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
"integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=16.20.1"
}
@@ -5882,9 +5879,9 @@
}
},
"node_modules/eslint-plugin-jest": {
"version": "28.8.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.0.tgz",
"integrity": "sha512-Tubj1hooFxCl52G4qQu0edzV/+EZzPUeN8p2NnW5uu4fbDs+Yo7+qDVDc4/oG3FbCqEBmu/OC3LSsyiU22oghw==",
"version": "28.8.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz",
"integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==",
"dev": true,
"dependencies": {
"@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
@@ -5907,11 +5904,10 @@
}
},
"node_modules/eslint-plugin-react": {
"version": "7.35.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz",
"integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==",
"version": "7.35.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz",
"integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
@@ -6357,6 +6353,21 @@
"integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==",
"license": "MIT"
},
"node_modules/express-rate-limit": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.0.tgz",
"integrity": "sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg==",
"license": "MIT",
"engines": {
"node": ">= 16"
},
"funding": {
"url": "https://github.com/sponsors/express-rate-limit"
},
"peerDependencies": {
"express": "4 || 5 || ^5.0.0-beta.1"
}
},
"node_modules/express-static-gzip": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.7.tgz",
@@ -10430,12 +10441,11 @@
}
},
"node_modules/marked-extended-tables": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/marked-extended-tables/-/marked-extended-tables-1.0.8.tgz",
"integrity": "sha512-GcVQP7EnfQ98o09ooqM4t4M0qfpKdKuk7/z4qZfgkLyXTXsIyFS1eeBmfC36o1NbR6aSq8ynL/LeTz3w4RS27Q==",
"license": "MIT",
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/marked-extended-tables/-/marked-extended-tables-1.0.10.tgz",
"integrity": "sha512-zvRS0GPTkxq8UWawSDecd1Rxd2KD8crrmq2QALGDdrgkcgRNQzHlbnlujBGuXxdgDJg7f6UTv+JpcfejBpKdSg==",
"peerDependencies": {
"marked": ">=3 <12"
"marked": ">=3 <15"
}
},
"node_modules/marked-gfm-heading-id": {
@@ -10513,8 +10523,7 @@
"node_modules/memory-pager": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
"license": "MIT"
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
},
"node_modules/meow": {
"version": "13.2.0",
@@ -10562,11 +10571,10 @@
}
},
"node_modules/micromatch": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
@@ -10765,7 +10773,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
"integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
"license": "Apache-2.0",
"dependencies": {
"@types/whatwg-url": "^11.0.2",
"whatwg-url": "^13.0.0"
@@ -10775,7 +10782,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
"integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
"license": "MIT",
"dependencies": {
"punycode": "^2.3.0"
},
@@ -10787,7 +10793,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
}
@@ -10796,7 +10801,6 @@
"version": "13.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
"integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
"license": "MIT",
"dependencies": {
"tr46": "^4.1.1",
"webidl-conversions": "^7.0.0"
@@ -10806,13 +10810,13 @@
}
},
"node_modules/mongoose": {
"version": "8.5.4",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.4.tgz",
"integrity": "sha512-nG3eehhWf9l1q80WuHvp5DV+4xDNFpDWLE5ZgcFD5tslUV2USJ56ogun8gaZ62MKAocJnoStjAdno08b8U57hg==",
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.6.1.tgz",
"integrity": "sha512-dppGcYqvsdg+VcnqXR5b467V4a+iNhmvkfYNpEPi6AjaUxnz6ioEDmrMLOi+sOWjvoHapuwPOigV4f2l7HC6ag==",
"dependencies": {
"bson": "^6.7.0",
"kareem": "2.6.3",
"mongodb": "6.7.0",
"mongodb": "6.8.0",
"mpath": "0.9.0",
"mquery": "5.0.0",
"ms": "2.1.3",
@@ -10830,7 +10834,6 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
@@ -10844,7 +10847,6 @@
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz",
"integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==",
"license": "Apache-2.0",
"optional": true,
"peer": true,
"dependencies": {
@@ -10861,7 +10863,6 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
"integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
"license": "Apache-2.0",
"optional": true,
"peer": true,
"dependencies": {
@@ -10876,7 +10877,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
@@ -10888,10 +10888,9 @@
}
},
"node_modules/mongoose/node_modules/mongodb": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz",
"integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==",
"license": "Apache-2.0",
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz",
"integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==",
"dependencies": {
"@mongodb-js/saslprep": "^1.1.5",
"bson": "^6.7.0",
@@ -13231,7 +13230,6 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
"license": "MIT",
"dependencies": {
"memory-pager": "^1.0.2"
}
@@ -13573,9 +13571,9 @@
"license": "ISC"
},
"node_modules/stylelint": {
"version": "16.8.2",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.8.2.tgz",
"integrity": "sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A==",
"version": "16.9.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz",
"integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==",
"dev": true,
"funding": [
{
@@ -13588,9 +13586,9 @@
}
],
"dependencies": {
"@csstools/css-parser-algorithms": "^3.0.0",
"@csstools/css-tokenizer": "^3.0.0",
"@csstools/media-query-list-parser": "^3.0.0",
"@csstools/css-parser-algorithms": "^3.0.1",
"@csstools/css-tokenizer": "^3.0.1",
"@csstools/media-query-list-parser": "^3.0.1",
"@csstools/selector-specificity": "^4.0.0",
"@dual-bundle/import-meta-resolve": "^4.1.0",
"balanced-match": "^2.0.0",
@@ -13612,7 +13610,7 @@
"known-css-properties": "^0.34.0",
"mathml-tag-names": "^2.1.3",
"meow": "^13.2.0",
"micromatch": "^4.0.7",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"picocolors": "^1.0.1",
"postcss": "^8.4.41",
@@ -13623,7 +13621,7 @@
"resolve-from": "^5.0.0",
"string-width": "^4.2.3",
"strip-ansi": "^7.1.0",
"supports-hyperlinks": "^3.0.0",
"supports-hyperlinks": "^3.1.0",
"svg-tags": "^1.0.0",
"table": "^6.8.2",
"write-file-atomic": "^5.0.1"
@@ -13684,70 +13682,6 @@
"stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1"
}
},
"node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz",
"integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
},
{
"type": "opencollective",
"url": "https://opencollective.com/csstools"
}
],
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@csstools/css-tokenizer": "^3.0.1"
}
},
"node_modules/stylelint/node_modules/@csstools/css-tokenizer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz",
"integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
},
{
"type": "opencollective",
"url": "https://opencollective.com/csstools"
}
],
"engines": {
"node": ">=18"
}
},
"node_modules/stylelint/node_modules/@csstools/media-query-list-parser": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz",
"integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
},
{
"type": "opencollective",
"url": "https://opencollective.com/csstools"
}
],
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@csstools/css-parser-algorithms": "^3.0.1",
"@csstools/css-tokenizer": "^3.0.1"
}
},
"node_modules/stylelint/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -13947,17 +13881,19 @@
}
},
"node_modules/supports-hyperlinks": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
"integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
"integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0",
"supports-color": "^7.0.0"
},
"engines": {
"node": ">=14.18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/supports-hyperlinks/node_modules/has-flag": {
@@ -13965,7 +13901,6 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@@ -13975,7 +13910,6 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},

View File

@@ -1,7 +1,7 @@
{
"name": "homebrewery",
"description": "Create authentic looking D&D homebrews using only markdown",
"version": "3.14.2",
"version": "3.15.0",
"engines": {
"npm": "^10.2.x",
"node": "^20.8.x"
@@ -89,7 +89,7 @@
"@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.25.4",
"@babel/preset-react": "^7.24.7",
"@googleapis/drive": "^8.13.0",
"@googleapis/drive": "^8.14.0",
"body-parser": "^1.20.2",
"classnames": "^2.5.1",
"codemirror": "^5.65.6",
@@ -100,6 +100,7 @@
"expr-eval": "^2.0.2",
"express": "^4.19.2",
"express-async-handler": "^1.2.0",
"express-rate-limit": "^7.4.0",
"express-static-gzip": "2.1.7",
"fs-extra": "11.2.0",
"js-yaml": "^4.1.0",
@@ -108,12 +109,12 @@
"lodash": "^4.17.21",
"marked": "11.2.0",
"marked-emoji": "^1.4.2",
"marked-extended-tables": "^1.0.8",
"marked-extended-tables": "^1.0.10",
"marked-gfm-heading-id": "^3.2.0",
"marked-smartypants-lite": "^1.0.2",
"markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.30.1",
"mongoose": "^8.5.4",
"mongoose": "^8.6.1",
"nanoid": "3.3.4",
"nconf": "^0.12.1",
"react": "^18.3.1",
@@ -127,13 +128,13 @@
"devDependencies": {
"@stylistic/stylelint-plugin": "^3.0.1",
"eslint": "^9.9.1",
"eslint-plugin-jest": "^28.8.0",
"eslint-plugin-react": "^7.35.0",
"eslint-plugin-jest": "^28.8.3",
"eslint-plugin-react": "^7.35.2",
"globals": "^15.9.0",
"jest": "^29.7.0",
"jest-expect-message": "^1.1.3",
"postcss-less": "^6.0.0",
"stylelint": "^16.8.2",
"stylelint": "^16.9.0",
"stylelint-config-recess-order": "^5.1.0",
"stylelint-config-recommended": "^14.0.1",
"supertest": "^7.0.0"

View File

@@ -30,6 +30,10 @@ const sanitizeBrew = (brew, accessType)=>{
return brew;
};
app.set('trust proxy', 1 /* number of proxies between user and server */)
app.get('/ip', (request, response) => response.send(request.ip))
app.use('/', serveCompressedStaticAssets(`build`));
app.use(require('./middleware/content-negotiation.js'));
app.use(require('body-parser').json({ limit: '25mb' }));
@@ -55,6 +59,7 @@ app.use((req, res, next)=>{
app.use(homebrewApi);
app.use(require('./admin.api.js'));
app.use(require('./vault.api.js'));
const HomebrewModel = require('./homebrew.model.js').model;
const welcomeText = require('fs').readFileSync('client/homebrew/pages/homePage/welcome_msg.md', 'utf8');
@@ -237,6 +242,8 @@ app.get('/user/:username', async (req, res, next)=>{
console.log(err);
});
brews.forEach(brew => brew.stubbed = true); //All brews from MongoDB are "stubbed"
if(ownAccount && req?.account?.googleId){
const auth = await GoogleActions.authCheck(req.account, res);
let googleBrews = await GoogleActions.listGoogleBrews(auth)
@@ -244,12 +251,12 @@ app.get('/user/:username', async (req, res, next)=>{
console.error(err);
});
// If stub matches file from Google, use Google metadata over stub metadata
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;
@@ -258,6 +265,7 @@ app.get('/user/:username', async (req, res, next)=>{
}
}
//Remaining unstubbed google brews display current user as author
googleBrews = googleBrews.map((brew)=>({ ...brew, authors: [req.account.username] }));
brews = _.concat(brews, googleBrews);
}
@@ -360,27 +368,26 @@ app.get('/share/:id', asyncHandler(getBrew('share')), asyncHandler(async (req, r
app.get('/account', asyncHandler(async (req, res, next)=>{
const data = {};
data.title = 'Account Information Page';
if(!req.account) {
res.set('WWW-Authenticate', 'Bearer realm="Authorization Required"');
const error = new Error('No valid account');
error.status = 401;
error.HBErrorCode = '50';
error.page = data.title;
return next(error);
};
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);
}
}
auth = await GoogleActions.authCheck(req.account, res, false)
googleCount = await GoogleActions.listGoogleBrews(auth)
.catch((err)=>{
console.error(err);
});
}
const query = { authors: req.account.username, googleId: { $exists: false } };
@@ -394,7 +401,7 @@ app.get('/account', asyncHandler(async (req, res, next)=>{
username : req.account.username,
issued : req.account.issued,
googleId : Boolean(req.account.googleId),
authCheck : Boolean(req.account.googleId && auth.credentials.access_token),
authCheck : Boolean(req.account.googleId && auth?.credentials.access_token),
mongoCount : mongoCount,
googleCount : googleCount?.length
};
@@ -424,6 +431,11 @@ if(isLocalEnvironment){
});
}
//Vault Page
app.get('/vault', asyncHandler(async(req, res, next)=>{
return next();
}));
//Send rendered page
app.use(asyncHandler(async (req, res, next)=>{
if (!req.route) return res.redirect('/'); // Catch-all for invalid routes
@@ -483,7 +495,7 @@ app.use(async (err, req, res, next)=>{
err.originalUrl = req.originalUrl;
console.error(err);
if(err.originalUrl?.startsWith('/api/')) {
if(err.originalUrl?.startsWith('/api')) {
// console.log('API error');
res.status(err.status || err.response?.status || 500).send(err);
return;

View File

@@ -25,6 +25,15 @@ if(!config.get('service_account')){
const defaultAuth = serviceAuth || config.get('google_api_key');
const retryConfig = {
retry: 3, // Number of retry attempts
retryDelay: 100, // Initial delay in milliseconds
retryDelayMultiplier: 2, // Multiplier for exponential backoff
maxRetryDelay: 32000, // Maximum delay in milliseconds
httpMethodsToRetry: ['PATCH'], // Only retry PATCH requests
statusCodesToRetry: [[429, 429]], // Only retry on 429 status code
};
const GoogleActions = {
authCheck : (account, res, updateTokens=true)=>{
@@ -112,9 +121,7 @@ const GoogleActions = {
})
.catch((err)=>{
console.log(`Error Listing Google Brews`);
console.error(err);
throw (err);
//TODO: Should break out here, but continues on for some reason.
});
fileList.push(...obj.data.files);
NextPageToken = obj.data.nextPageToken;
@@ -147,8 +154,9 @@ const GoogleActions = {
return brews;
},
updateGoogleBrew : async (brew)=>{
const drive = googleDrive.drive({ version: 'v3', auth: defaultAuth });
updateGoogleBrew : async (brew, auth = defaultAuth, userIp)=>{
const drive = googleDrive.drive({ version: 'v3', auth: auth });
console.log(auth == defaultAuth ? 'UPDATE w SERVICEACC' : 'UPDATE w USERACC')
await drive.files.update({
fileId : brew.googleId,
@@ -168,11 +176,14 @@ const GoogleActions = {
media : {
mimeType : 'text/plain',
body : brew.text
}
},
headers: {
'X-Forwarded-For': userIp, // Set the X-Forwarded-For header
},
retryConfig
})
.catch((err)=>{
console.log('Error saving to google');
console.error(err);
throw (err);
});

View File

@@ -9,6 +9,7 @@ const yaml = require('js-yaml');
const asyncHandler = require('express-async-handler');
const { nanoid } = require('nanoid');
const { splitTextStyleAndMetadata } = require('../shared/helpers.js');
const rateLimit = require('express-rate-limit');
const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js');
@@ -99,7 +100,7 @@ const api = {
stub = stub?.toObject();
if(stub?.lock?.locked && accessType != 'edit') {
throw { HBErrorCode: '100', code: stub.lock.code, message: stub.lock.shareMessage, brewId: stub.shareId, brewTitle: stub.title };
throw { HBErrorCode: '51', code: stub.lock.code, message: stub.lock.shareMessage, brewId: stub.shareId, brewTitle: stub.title };
}
// If there is a google id, try to find the google brew
@@ -242,11 +243,8 @@ const api = {
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);
});
googleId = await api.newGoogleBrew(req.account, newHomebrew, res);
if(!googleId) return;
api.excludeStubProps(newHomebrew);
newHomebrew.googleId = googleId;
@@ -351,19 +349,13 @@ const api = {
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);
});
brew.googleId = await api.newGoogleBrew(req.account, api.excludeGoogleProps(brew), res);
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);
});
const updated = await api.updateGoogleBrew(req.account, api.excludeGoogleProps(brew), res, req);
if(!updated) return;
}
@@ -406,6 +398,15 @@ const api = {
res.status(200).send(saved);
},
updateGoogleBrew : async (account, brew, res, req)=>{
//let oAuth2Client;
//if(account.googleId)
// oAuth2Client = GoogleActions.authCheck(account, res);
return await GoogleActions.updateGoogleBrew(brew, undefined, req.ip);
},
deleteGoogleBrew : async (account, id, editId, res)=>{
const auth = await GoogleActions.authCheck(account, res);
await GoogleActions.deleteGoogleBrew(auth, id, editId);

View File

@@ -309,7 +309,7 @@ describe('Tests for api', ()=>{
const req = { brew: {} };
const next = jest.fn();
await expect(fn(req, null, next)).rejects.toEqual({ 'HBErrorCode': '100', 'brewId': '1', 'brewTitle': 'test brew', 'code': 404, 'message': 'brew locked' });
await expect(fn(req, null, next)).rejects.toEqual({ 'HBErrorCode': '51', 'brewId': '1', 'brewTitle': 'test brew', 'code': 404, 'message': 'brew locked' });
});
});
@@ -560,16 +560,6 @@ brew`);
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', ()=>{

102
server/vault.api.js Normal file
View File

@@ -0,0 +1,102 @@
const express = require('express');
const asyncHandler = require('express-async-handler');
const HomebrewModel = require('./homebrew.model.js').model;
const router = express.Router();
const titleConditions = (title)=>{
if(!title) return {};
return {
$text : {
$search : title,
$caseSensitive : false,
},
};
};
const authorConditions = (author)=>{
if(!author) return {};
return { authors: author };
};
const rendererConditions = (legacy, v3)=>{
if(legacy === 'true' && v3 !== 'true')
return { renderer: 'legacy' };
if(v3 === 'true' && legacy !== 'true')
return { renderer: 'V3' };
return {}; // If all renderers selected, renderer field not needed in query for speed
};
const findBrews = async (req, res)=>{
const title = req.query.title || '';
const author = req.query.author || '';
const page = Math.max(parseInt(req.query.page) || 1, 1);
const count = Math.max(parseInt(req.query.count) || 20, 10);
const skip = (page - 1) * count;
const combinedQuery = {
$and : [
{ published: true },
rendererConditions(req.query.legacy, req.query.v3),
titleConditions(title),
authorConditions(author)
],
};
const projection = {
editId : 0,
googleId : 0,
text : 0,
textBin : 0,
version : 0
};
await HomebrewModel.find(combinedQuery, projection)
.skip(skip)
.limit(count)
.maxTimeMS(5000)
.exec()
.then((brews)=>{
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const processedBrews = brews.map((brew)=>{
brew.authors = brew.authors.map((author)=>emailRegex.test(author) ? 'hidden' : author
);
return brew;
});
res.json({ brews: processedBrews, page });
})
.catch((error)=>{
throw { ...error, message: 'Error finding brews in Vault search', HBErrorCode: 90 };
});
};
const findTotal = async (req, res)=>{
const title = req.query.title || '';
const author = req.query.author || '';
const combinedQuery = {
$and : [
{ published: true },
rendererConditions(req.query.legacy, req.query.v3),
titleConditions(title),
authorConditions(author)
],
};
await HomebrewModel.countDocuments(combinedQuery)
.then((totalBrews)=>{
console.log(`when returning, the total of brews is ${totalBrews} for the query ${JSON.stringify(combinedQuery)}`);
res.json({ totalBrews });
})
.catch((error)=>{
throw { ...error, message: 'Error finding brews in Vault search findTotal function', HBErrorCode: 91 };
});
};
router.get('/api/vault/total', asyncHandler(findTotal));
router.get('/api/vault', asyncHandler(findBrews));
module.exports = router;

View File

@@ -102,6 +102,20 @@ renderer.link = function (href, title, text) {
return out;
};
// Expose `src` attribute as `--HB_src` to make the URL accessible via CSS
renderer.image = function (href, title, text) {
href = cleanUrl(href);
if (href === null)
return text;
let out = `<img src="${href}" alt="${text}" style="--HB_src:url(${href});"`;
if (title)
out += ` title="${title}"`;
out += '>';
return out;
}
// Disable default reflink behavior, as it steps on our variables extension
tokenizer.def = function () {
return undefined;
@@ -727,12 +741,18 @@ const MarkedEmojiOptions = {
renderer : (token)=>`<i class="${token.emoji}"></i>`
};
const tableTerminators = [
`:+\\n`, // hardBreak
` *{[^\n]+}`, // blockInjector
` *{{[^{\n]*\n.*?\n}}` // mustacheDiv
]
Marked.use(MarkedVariables());
Marked.use({ extensions : [definitionListsMultiLine, definitionListsSingleLine, forcedParagraphBreaks, superSubScripts,
mustacheSpans, mustacheDivs, mustacheInjectInline] });
Marked.use(mustacheInjectBlock);
Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false });
Marked.use(MarkedExtendedTables(), MarkedGFMHeadingId({ globalSlugs: true }), MarkedSmartypantsLite(), MarkedEmojis(MarkedEmojiOptions));
Marked.use(MarkedExtendedTables(tableTerminators), MarkedGFMHeadingId({ globalSlugs: true }), MarkedSmartypantsLite(), MarkedEmojis(MarkedEmojiOptions));
function cleanUrl(href) {
try {

View File

@@ -7,8 +7,9 @@ const SplitPane = createClass({
displayName : 'SplitPane',
getDefaultProps : function() {
return {
storageKey : 'naturalcrit-pane-split',
onDragFinish : function(){} //fires when dragging
storageKey : 'naturalcrit-pane-split',
onDragFinish : function(){}, //fires when dragging
showDividerButtons : true
};
},
@@ -142,9 +143,11 @@ const SplitPane = createClass({
width={this.state.currentDividerPos}
>
{React.cloneElement(this.props.children[0], {
moveBrew : this.state.moveBrew,
moveSource : this.state.moveSource,
setMoveArrows : this.setMoveArrows
...(this.props.showDividerButtons && {
moveBrew: this.state.moveBrew,
moveSource: this.state.moveSource,
setMoveArrows: this.setMoveArrows,
}),
})}
</Pane>
{this.renderDivider()}

View File

@@ -322,9 +322,9 @@ describe('Injection: When an injection tag follows an element', ()=>{
});
it('Renders an image element with injected style', function() {
const source = '![alt text](http://i.imgur.com/hMna6G0.png){position:absolute}';
const source = '![alt text](https://i.imgur.com/hMna6G0.png){position:absolute}';
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<p><img style="position:absolute;" src="http://i.imgur.com/hMna6G0.png" alt="alt text"></p>');
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<p><img style="--HB_src:url(https://i.imgur.com/hMna6G0.png); position:absolute;" src="https://i.imgur.com/hMna6G0.png" alt="alt text"></p>');
});
it('Renders an element modified by only the first of two consecutive injections', function() {
@@ -343,19 +343,19 @@ describe('Injection: When an injection tag follows an element', ()=>{
it('Renders an image with added attributes', function() {
const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e}`;
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png" alt="homebrew mug" a="b and c" d="e"></p>`);
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="--HB_src:url(https://i.imgur.com/hMna6G0.png); position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png" alt="homebrew mug" a="b and c" d="e"></p>`);
});
it('Renders an image with "=" in the url, and added attributes', function() {
const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png?auth=12345&height=1024) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e}`;
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png?auth=12345&height=1024" alt="homebrew mug" a="b and c" d="e"></p>`);
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="--HB_src:url(https://i.imgur.com/hMna6G0.png?auth=12345&height=1024); position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png?auth=12345&height=1024" alt="homebrew mug" a="b and c" d="e"></p>`);
});
it('Renders an image and added attributes with "=" in the value, ', function() {
const source = `![homebrew mug](https://i.imgur.com/hMna6G0.png) {position:absolute,bottom:20px,left:130px,width:220px,a="b and c",d=e,otherUrl="url?auth=12345"}`;
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png" alt="homebrew mug" a="b and c" d="e" otherUrl="url?auth=12345"></p>`);
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p><img style="--HB_src:url(https://i.imgur.com/hMna6G0.png); position:absolute; bottom:20px; left:130px; width:220px;" src="https://i.imgur.com/hMna6G0.png" alt="homebrew mug" a="b and c" d="e" otherUrl="url?auth=12345"></p>`);
});
});

View File

@@ -315,21 +315,21 @@ describe('Normal Links and Images', ()=>{
const source = `![alt text](url)`;
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(dedent`
<p><img src="url" alt="alt text"></p>`.trimReturns());
<p><img src="url" alt="alt text" style="--HB_src:url(url);"></p>`.trimReturns());
});
it('Renders normal images with a title', function() {
const source = 'An image ![alt text](url "and title")!';
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(dedent`
<p>An image <img src="url" alt="alt text" title="and title">!</p>`.trimReturns());
<p>An image <img src="url" alt="alt text" style="--HB_src:url(url);" title="and title">!</p>`.trimReturns());
});
it('Applies curly injectors to images', function() {
const source = `![alt text](url){width:100px}`;
const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(dedent`
<p><img style="width:100px;" src="url" alt="alt text"></p>`.trimReturns());
<p><img style="--HB_src:url(url); width:100px;" src="url" alt="alt text"></p>`.trimReturns());
});
it('Renders normal links', function() {

View File

@@ -153,6 +153,18 @@ module.exports = [
gen : dedent`
![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px,mix-blend-mode:multiply}`
},
{
name : 'Image Wrap Left',
icon : 'fac image-wrap-left',
gen : dedent`
![homebrewery_mug](http://i.imgur.com/hMna6G0.png) {width:280px,margin-right:-3cm,wrapLeft}`
},
{
name : 'Image Wrap Right',
icon : 'fac image-wrap-right',
gen : dedent`
![homebrewery_mug](http://i.imgur.com/hMna6G0.png) {width:280px,margin-left:-3cm,wrapRight}`
},
{
name : 'Background Image',
icon : 'fas fa-tree',

View File

@@ -156,6 +156,19 @@ body { counter-reset : page-numbers; }
break-inside : avoid;
}
/* Wrap Text */
.wrapLeft {
shape-outside : var(--HB_src);
float : right;
shape-margin : 0.2cm;
}
.wrapRight {
shape-outside : var(--HB_src);
float : left;
shape-margin : 0.2cm;
}
/* Watermark */
.watermark {
position : absolute;