Compare commits

...

3859 Commits

Author SHA1 Message Date
Alejandro Alonso
41cdd2453a Merge remote-tracking branch 'origin/staging' 2024-04-11 13:32:59 +02:00
Andrey Antukh
fa00fed694 🐛 Fix issue with v2 manual migration script 2024-04-11 13:29:33 +02:00
Alejandro Alonso
f97b705468 Merge remote-tracking branch 'origin/staging' 2024-04-11 12:35:32 +02:00
Alejandro
ac835bb655 Merge pull request #4389 from penpot/test
 Several improvements
2024-04-11 12:35:04 +02:00
Aitor Moreno
ee308282f1 Merge pull request #4411 from penpot/eva-fix-tabs-length
🐛 Fix text length on tabs
2024-04-11 11:34:18 +02:00
Eva Marco
f1685f6e75 🐛 Fix text length on tabs 2024-04-11 11:27:56 +02:00
Alejandro Alonso
87d0c2ac30 🐛 Fix internal error on inspect svg 2024-04-11 11:25:44 +02:00
Alejandro
66845033ab Merge pull request #4419 from penpot/alotor-bugfix-43
🐛 Fix problem with text fills
2024-04-11 11:24:28 +02:00
AzazelN28
a569a350b4 🐛 Fix toolbar disappearing 2024-04-11 11:21:33 +02:00
alonso.torres
b684ee2f83 🐛 Fix problem when moving copys in the layers panel 2024-04-11 11:17:48 +02:00
alonso.torres
2e23f19081 🐛 Fix problem with text fills 2024-04-11 10:42:36 +02:00
Alejandro Alonso
5c5188920d Merge remote-tracking branch 'origin/staging' 2024-04-11 10:20:51 +02:00
Pablo Alba
9cbbe1565d 🐛 Fix crash on copy paste a orphan copy inside a copy 2024-04-11 09:51:39 +02:00
Alejandro Alonso
1b17664ade 🐛 Fix gradient stroke breaks arrow-ended paths 2024-04-11 09:35:13 +02:00
Alejandro Alonso
2f89512a75 🐛 Fix project line shows an extra space after the number of files 2024-04-11 09:34:52 +02:00
Alejandro
702ec65d77 Merge pull request #4399 from penpot/palba-bugfixing-006
🐛 Fix no visual cue if user want to create anotation with only spaces
2024-04-11 07:11:22 +02:00
Pablo Alba
d22ae22aad 🐛 Fix no visual cue if user want to create anotation with only spaces 2024-04-10 21:27:21 +02:00
Alejandro Alonso
86ba875317 Merge remote-tracking branch 'origin/staging' 2024-04-10 16:32:03 +02:00
Alejandro Alonso
928fbd8e38 🐛 Fix old texts with empty fills 2024-04-10 16:08:19 +02:00
Alejandro
f6f262f387 Merge pull request #4402 from penpot/hiru-fix-rotation-override
Fix rotation override
2024-04-10 16:03:58 +02:00
Alejandro
7d4b2b1bb7 Merge pull request #4405 from penpot/niwinz-staging-bugfix-7
🐛 Fix incorrect team features handling on onboarding team creation
2024-04-10 16:02:35 +02:00
Alejandro
dd4b5f3eb6 Merge pull request #4407 from penpot/alotor-bugfix-41
🐛 Fix problem with colorpicker
2024-04-10 16:01:46 +02:00
alonso.torres
6fa2137335 🐛 Fix problem with colorpicker 2024-04-10 15:50:25 +02:00
Andrey Antukh
347276fb4e 🐛 Fix incorrect team features handling on onboarding team creation 2024-04-10 15:33:18 +02:00
Andrey Antukh
7d36cf1b5e Add missing jvm parameter on backend run.sh template 2024-04-10 15:31:49 +02:00
Andrey Antukh
0bc5a80c51 Add missing .yarnrc.yml on exporter bundle 2024-04-10 15:31:49 +02:00
Andrey Antukh
c55ceb4bca Add automatic v2 migration process on startup 2024-04-10 15:31:49 +02:00
Andrey Antukh
b3456d0f7f 🐛 Fix incorrect feature handling 2024-04-10 15:31:49 +02:00
Andrey Antukh
352c13881a 🐛 Fix exporter dockerfile issue related to yarn update 2024-04-10 15:31:49 +02:00
Andrey Antukh
79fbbe0bee 📎 Don't report invalid image validation errors 2024-04-10 15:31:49 +02:00
Andrey Antukh
fd0a760b77 📎 Fix log levels on common file migrations 2024-04-10 15:31:49 +02:00
Andrey Antukh
9c25723ee3 📎 Add note about fragments on object-gc ns 2024-04-10 15:31:49 +02:00
Andrey Antukh
6b552fd8a9 🐛 Don't run file-gc on deleted files 2024-04-10 15:31:49 +02:00
Andrey Antukh
f18be26054 📎 Change log levels on webhooks loggers ns 2024-04-10 15:31:49 +02:00
Andrey Antukh
34534c924f Set smaller default deletion delay for devenv
And make the deletion delay configurable
2024-04-10 15:31:49 +02:00
Andrey Antukh
7b7820952c Update docker related files 2024-04-10 15:31:49 +02:00
Andrey Antukh
5924f3bc41 Simplify v2 migration helpers on srepl ns 2024-04-10 15:31:49 +02:00
Andrey Antukh
c6d92a2517 🐛 Fix incorrect feature handling on importing binfile on v1 2024-04-10 15:31:49 +02:00
Andrey Antukh
036392af6e Add the logger info to mattermost reporter 2024-04-10 15:31:49 +02:00
Andrey Antukh
01a64dda2e 🐛 Fix json encoding issue on webhook event with custom object
This commit is a workaround. We will need to properly replace
jsonista with data.json because the data.json has more convenient
way for extending for custom data types.
2024-04-10 15:31:49 +02:00
alonso.torres
389c394f39 🐛 Fix import zip text with gradients 2024-04-10 14:47:54 +02:00
alonso.torres
0935390761 🐛 Fix problem with paste order 2024-04-10 14:47:54 +02:00
Andrés Moya
584e18d858 🐛 Fix ignore touched when rotating a copy 2024-04-10 13:25:46 +02:00
Aitor Moreno
420178e620 Merge pull request #4387 from penpot/superalex-fix-cmd-option-enter-when-popups-blocked
🐛 Fix cmd+option+enter when popups blocked
2024-04-10 12:19:59 +02:00
Alejandro
7d270ed933 Merge pull request #4393 from penpot/palba-fix-swap-naming
🐛 fix naming convention of swap
2024-04-10 11:28:02 +02:00
Pablo Alba
9d7e8cf4e6 🐛 fix naming convention of swap 2024-04-10 10:29:29 +02:00
Alejandro Alonso
9adfaae6bc Merge remote-tracking branch 'origin/staging' 2024-04-10 09:31:21 +02:00
Alejandro
bbe0baac5f Merge pull request #4390 from penpot/alotor-bugfix-39
🐛 Remove transforming flag and use a global flag
2024-04-10 07:01:58 +02:00
alonso.torres
0fa2dbcaf2 🐛 Remove transforming flag and use a global flag 2024-04-10 06:56:04 +02:00
Pablo Alba
c8b2db8145 🐛 Fix crash on moving a copy in a copy (for a migrated file) (2) 2024-04-09 19:11:15 +02:00
alonso.torres
a3f44074a0 🐛 Removed shortcut ctrl+alt+enter in production 2024-04-09 18:05:00 +02:00
Alejandro Alonso
fcd29211a4 🐛 Fix cmd+optin+enter when popups blocked 2024-04-09 17:12:24 +02:00
Alejandro Alonso
b130cc40f0 Merge remote-tracking branch 'origin/staging' 2024-04-09 13:13:23 +02:00
Alejandro
c94478c9bb Merge pull request #4383 from penpot/alotor-bugfix-38
Alotor bugfix 38
2024-04-09 13:13:01 +02:00
Alejandro Alonso
227b2fe085 erge remote-tracking branch 'origin/staging' 2024-04-09 12:56:04 +02:00
Pablo Alba
a4c7cc51bb 🐛 Fix crash on moving a copy in a copy (for a migrated file) 2024-04-09 12:49:30 +02:00
alonso.torres
f6c6207522 🐛 Fix problem renaming boards from viewport 2024-04-09 12:07:17 +02:00
alonso.torres
8f0e11d020 🐛 Fix component name ellipsis 2024-04-09 12:05:02 +02:00
alonso.torres
27010ae0fb 🐛 Fix problem when moving horizontal/vertical lines 2024-04-09 12:03:59 +02:00
alonso.torres
b7c4cb1f58 🐛 Fix project name being cut 2024-04-09 12:03:06 +02:00
alonso.torres
a9052e2690 🐛 Fix problem changing fill images 2024-04-09 12:01:56 +02:00
Andrey Antukh
e8b29c3cfc 🐛 Fix incorrect grid calcultation condition on compv2 migration script 2024-04-08 17:29:58 +02:00
Andrey Antukh
7ebf8dd702 Skip invalid graphics on migration post binfile import 2024-04-08 17:29:58 +02:00
Alejandro Alonso
c5109a1cd5 Merge remote-tracking branch 'origin/staging' 2024-04-08 16:53:15 +02:00
Alejandro
36129bd227 Merge pull request #4376 from penpot/alotor-fix-sort-indexed-problem
🐛 Fix problem with sort indexed shapes
2024-04-08 16:52:12 +02:00
alonso.torres
aed6a045b3 🐛 Fix problem with sort indexed shapes 2024-04-08 16:32:34 +02:00
Alejandro
2fda60f995 Merge pull request #4374 from penpot/hiru-fix-paste-main
Fix paste main component in a different file
2024-04-08 16:24:47 +02:00
Alejandro Alonso
8093555acc Merge remote-tracking branch 'origin/staging' 2024-04-08 14:56:34 +02:00
Alejandro
8be45f100b Merge pull request #4372 from penpot/niwinz-staging-bugfix-6
🐛 Minor bugfixes
2024-04-08 14:07:31 +02:00
Andrés Moya
10fbae2f0a 🐛 Fix error when pasting a main component in other file 2024-04-08 14:02:30 +02:00
Andrey Antukh
5f8d66e7eb Remove unnecesarry transaction wrapping on import-binfile 2024-04-08 13:23:59 +02:00
Andrey Antukh
37507c3697 📎 Update logging on worker module 2024-04-08 11:53:33 +02:00
Andrey Antukh
0965c71a08 📎 Update logging on webhook task handler 2024-04-08 11:42:01 +02:00
Andrey Antukh
d435b17452 🐛 Fix io exception incorrect reporting 2024-04-08 11:18:26 +02:00
Andrey Antukh
06206f39b0 📎 Update devenv nginx configuration 2024-04-08 11:07:32 +02:00
Andrey Antukh
fd5b1c0341 Enable by default components v2 feature 2024-04-08 11:05:16 +02:00
Alejandro Alonso
4029735364 Merge remote-tracking branch 'origin/staging' 2024-04-08 11:00:40 +02:00
Alejandro
b836e8c5ab Merge pull request #4371 from penpot/niwinz-staging-bugfix-6
🐛 Fix timeout error on large binfile import
2024-04-08 10:56:59 +02:00
Alejandro Alonso
2cd0bc565d 🐛 Fix change shadow color from selected colors 2024-04-08 10:26:11 +02:00
AzazelN28
ccce550cda 🐛 Fix comments and history toggle 2024-04-08 10:07:16 +02:00
Andrey Antukh
6904cacd0c 🐛 Fix timeout error on large binfile import 2024-04-08 09:57:36 +02:00
Alejandro
a4a70f81b9 Merge pull request #4352 from penpot/niwinz-staging-migration
📎 MIgration related optimizations
2024-04-07 14:18:26 +02:00
Andrey Antukh
e01f8d6fdf 📎 Update migration scripts 2024-04-07 14:07:40 +02:00
Andrey Antukh
da5f452db5 🐛 Fix issue on migration script related to version 2024-04-07 14:07:40 +02:00
Andrey Antukh
542b27a779 📎 Add minor changes to compv2 related scripts 2024-04-07 14:07:40 +02:00
Andrey Antukh
fed9346ec6 Improve partitioning mechanism on compv2 migration 2024-04-07 14:07:40 +02:00
Andrey Antukh
29332b67f9 Add optimizations to order-by-indexed-shapes fn 2024-04-07 14:07:40 +02:00
Alejandro Alonso
c97f2d620d Merge remote-tracking branch 'origin/staging' 2024-04-07 05:34:07 +02:00
Alejandro
26ca36d8c6 Merge pull request #4365 from penpot/alotor-fix-visual-firefox-bug
Fix visual firefox bug
2024-04-05 16:03:02 +02:00
Alejandro Alonso
9dac69894e 🐛 Add lost template image 2024-04-05 15:56:47 +02:00
alonso.torres
5a79a2d4d6 🐛 Fix visual bug in firefox 2024-04-05 14:58:12 +02:00
Alejandro
10fbbd6c86 Merge pull request #4364 from penpot/superalex-updating-libraries-and-templates-2
🎉 Update libraries and templates section
2024-04-05 14:21:39 +02:00
Alejandro Alonso
a7b7355a7d 🎉 Update libraries and templates section 2024-04-05 14:19:15 +02:00
alonso.torres
43faa06ac0 🐛 Fix problem with uploading temp files 2024-04-05 12:34:56 +02:00
Alejandro
24c9bcf944 Merge pull request #4362 from penpot/superalex-updating-libraries-and-templates
🎉 Update libraries and templates section
2024-04-05 11:45:28 +02:00
Alejandro Alonso
520acfc823 🎉 Update libraries and templates section 2024-04-05 11:36:23 +02:00
Andrés Moya
c2737f2378 🐛 Avoid datatype problem calculating proportions 2024-04-05 10:15:17 +02:00
Alejandro
b2020c8a66 Merge pull request #4360 from penpot/eva-fix-onboarding-grid
🐛  Fix position of image grid on onboarding
2024-04-05 09:54:21 +02:00
Eva Marco
ce7f1440fa 🐛 Fix position of image grid on onboarding 2024-04-05 09:25:50 +02:00
Andrés Moya
3127a020a0 🐛 Remove fill from group heads when migrating to v2 2024-04-04 17:45:45 +02:00
alonso.torres
02ea0374a3 🐛 Fix problem moving shapes into grid 2024-04-04 17:45:31 +02:00
alonso.torres
c295680c89 🐛 Fix problem with grid ordering 2024-04-04 16:48:56 +02:00
alonso.torres
e420be5e51 🐛 Fix problem ordering layers in html markup 2024-04-04 16:48:56 +02:00
alonso.torres
b1e226cdc6 🐛 Fix problem with import zip files 2024-04-04 16:09:11 +02:00
Pablo Alba
8c72770fec 🐛 Fix can't move a layer on a copy 2024-04-04 14:03:48 +02:00
Pablo Alba
e33b08f47f 🐛 Fix crash on moving a copy outside a copy 2024-04-04 14:03:48 +02:00
Pablo Alba
065d481cb5 🐛 Remove the swap slot on some operations with copies 2024-04-04 13:50:57 +02:00
AzazelN28
ad3e44258a 📎 Add cookie consent comment 2024-04-04 13:38:56 +02:00
Eva Marco
7e398515d3 Merge pull request #4350 from penpot/alotor-bugfix-36
Bugfixes
2024-04-04 12:30:40 +02:00
Belén Albeza
ee4e1fbbf4 🐛 Fix comments not being visible on view mode 2024-04-04 10:44:25 +02:00
Belén Albeza
8541ddc598 🐛 Fix comments padding 2024-04-04 10:44:25 +02:00
alonso.torres
bd2630fa1a 🐛 Add shortcut description for grid layout toggle 2024-04-04 10:07:18 +02:00
alonso.torres
d96902f61d 🐛 Fix filter layers 2024-04-04 09:59:24 +02:00
alonso.torres
677da04c43 🐛 Fix component name ellipsis 2024-04-04 09:59:24 +02:00
alonso.torres
4ba7bf664b 🐛 Fix code generation format 2024-04-04 09:59:24 +02:00
alonso.torres
9c36d77573 🐛 Fix problem with cursor when shapes flipped 2024-04-04 09:59:24 +02:00
alonso.torres
5fd72cf9d9 🐛 Fix problem with flip properties 2024-04-04 09:59:24 +02:00
alonso.torres
b258b05fb2 🐛 Fix problem with rtl 2024-04-04 09:59:24 +02:00
alonso.torres
a4776cf27f 🐛 Fix problem with comment refreshing 2024-04-04 09:59:24 +02:00
Eva Marco
61df70b314 🐛 Fix go back close view only 2024-04-04 09:58:59 +02:00
Andrés Moya
dbe32fa980 💄 Fix small typo. 2024-04-04 09:55:50 +02:00
Eva Marco
c4df29f2a6 🐛 Fix hover state on export button 2024-04-03 17:53:08 +02:00
AzazelN28
6b84eef14b 🐛 Fix toolbar hidden after path creation 2024-04-03 17:50:04 +02:00
AzazelN28
357cdb807b ♻️ Refactor carousel using scroll-snap 2024-04-03 17:49:17 +02:00
AzazelN28
7c1e8a753f Add lazy loading to dashboard templates 2024-04-03 17:49:17 +02:00
Eva Marco
04fe8f8960 🐛 Fix close viewer thumbnail clicking outside 2024-04-03 17:44:38 +02:00
Pablo Alba
d57d1ef346 Merge pull request #4311 from penpot/hiru-fix-graphic-sizes
Fix sizes of graphics migrated from v1
2024-04-03 17:34:13 +02:00
Andrés Moya
bd8fcfde28 🐛 Fix sizes of migrated graphics 2024-04-03 17:26:53 +02:00
Andrey Antukh
3a67e51f2f Move worker runner to a separated namespace 2024-04-03 17:03:06 +02:00
Andrey Antukh
4ccea6b2cf Move worker dispatcher code to a separated ns 2024-04-03 17:03:06 +02:00
Andrey Antukh
d2998e1767 Move executor service initialization to a separared ns 2024-04-03 17:03:06 +02:00
Andrey Antukh
9c724c8e95 Set better log level on some rpc middlewares 2024-04-03 17:03:06 +02:00
Andrey Antukh
e2ddb3e31e Move worker cron related code to a separated namespace 2024-04-03 17:03:06 +02:00
Andrey Antukh
9c9d09a816 Add better logging of elapsed time for cron tasks 2024-04-03 17:03:06 +02:00
Pablo Alba
cfb5e9aa66 On migration to v2, add the component path to the copy name 2024-04-03 16:04:23 +02:00
AzazelN28
411af023d5 🐛 Fix comment reply menu 2024-04-02 15:29:07 +02:00
AzazelN28
193df9ce1e 🐛 Fix horizontal resize comment textarea 2024-04-02 15:29:07 +02:00
Eva Marco
08c5cdb2dd 🐛 Fix guides color in both themes 2024-04-02 15:24:53 +02:00
Pablo Alba
5cd46d8bc0 Merge pull request #4338 from penpot/eva-fix-auth-link-css
🐛  Fix auth links font-size
2024-04-01 15:11:00 +02:00
Pablo Alba
dd4cc56384 Merge pull request #4333 from penpot/eva-bugfixing-14
🐛 Fix view only reset on go-back icon
2024-04-01 15:09:01 +02:00
Eva Marco
f24323148b 🐛 Fix auth links font-size 2024-04-01 09:24:29 +02:00
Eva Marco
2396b54e15 🐛 Fix view only reset 2024-03-27 13:24:44 +01:00
Alejandro
3873f477d6 Merge pull request #4330 from penpot/eva-bugfixing-13
🐛 Fix frontend errors
2024-03-27 12:35:52 +01:00
Eva Marco
8285d7538b Merge pull request #4331 from penpot/ladybenko-6582-fix-renaming-firefox
🐛 Fix layer and component names inputs not having their text selectable on Firefox
2024-03-27 12:18:05 +01:00
Belén Albeza
78aafa4635 🐛 Fix layer and component names inputs not having their text selectable on Firefox 2024-03-27 12:02:15 +01:00
Eva Marco
315be268a4 🐛 Fix component element count while dragging 2024-03-27 11:31:23 +01:00
Andrey Antukh
7fa026da15 🐛 Fix issue on frontend build script 2024-03-27 11:08:59 +01:00
Alejandro
0c72a6f7fa Merge pull request #4329 from penpot/alotor-bugfix-35
Bugfixes
2024-03-27 10:02:26 +01:00
alonso.torres
4ef7af104d 🐛 Fix problem with show guides config 2024-03-27 08:41:43 +01:00
alonso.torres
ef0abc1498 🐛 Fix problem with rulers in Firefox 2024-03-26 17:02:03 +01:00
Eva Marco
af5d05b460 🐛 Fix stroke cap dropdown 2024-03-26 16:55:50 +01:00
alonso.torres
bd88b872c7 🐛 Fix problem with flip horizontal/vertical 2024-03-26 16:06:44 +01:00
alonso.torres
4dac2221e7 🐛 Fix problem with proportional scaling 2024-03-26 16:06:44 +01:00
alonso.torres
5315dc18af 🐛 Fix problems with bool shapes 2024-03-26 16:06:44 +01:00
Belén Albeza
6a0768b490 🐛 Fix helper to compile polyfills 2024-03-26 15:09:58 +01:00
Eva Marco
4212b46835 🐛 Add tooltip to select elements by color 2024-03-26 13:55:24 +01:00
Alejandro Alonso
8bf8a28439 🐛 Fix copy paste images on different environments 2024-03-26 13:54:54 +01:00
Alejandro
54af1ce7ae Merge pull request #4325 from penpot/alotor-bugfix-34
Bugfixes
2024-03-26 09:43:27 +01:00
alonso.torres
5d200a70d6 🐛 Fix problem with grid edition 2024-03-26 08:23:31 +01:00
alonso.torres
ecc61130ec 🐛 Fix problem when exporting html texts 2024-03-26 08:23:31 +01:00
alonso.torres
588410bbb1 🐛 Fix problem when importing SVG 2024-03-26 08:23:31 +01:00
alonso.torres
d83787d714 🐛 Fix problem with gradients and borders 2024-03-26 08:23:31 +01:00
alonso.torres
5a30c5e584 🐛 Fix problem with gradient fill text 2024-03-26 08:23:31 +01:00
Alejandro
81a271961f Merge pull request #4323 from penpot/niwinz-staging-bugfix-2
 Several improvements
2024-03-26 07:32:05 +01:00
Alejandro
e4c8d09e9c Merge pull request #4322 from penpot/eva-fix-layer-color
🐛 Fix component layer color
2024-03-26 07:26:31 +01:00
Eva Marco
1d2110b68c 🐛 Fix component layer color 2024-03-26 07:13:11 +01:00
Andrey Antukh
b85c3bec18 Add better timestamp control on audit handler 2024-03-25 17:58:40 +01:00
Andrey Antukh
763fc3532e Simplify local audit table
Remove unnecessary partitioning
2024-03-25 17:58:39 +01:00
Andrey Antukh
eaf546ba5e Add improvements to telemetry task 2024-03-25 15:07:55 +01:00
Alejandro Alonso
22fd0ae306 🐛 Update modification date on publish/unpublish file as library 2024-03-25 14:17:07 +01:00
Alejandro
ffe505e525 Merge pull request #4319 from penpot/superalex-improve-file-validation
🐛 Relax file validation for anidated components from other files
2024-03-25 13:22:56 +01:00
Alejandro Alonso
f66f168a99 🐛 Relax file validation for anidated components from other files 2024-03-25 13:15:22 +01:00
Andrey Antukh
fd24831c71 Move audit tasks to separated namespace files 2024-03-25 10:46:15 +01:00
Alejandro
8585e73c0f Merge pull request #4320 from penpot/eva-login-tagline
♻️ Add tagline and some refactor to login page
2024-03-25 09:25:28 +01:00
Alejandro
f8bd0ba28a Merge pull request #4216 from penpot/niwinz-staging-gulp-replace
🎉 Replace gulp with node scripts
2024-03-25 09:20:19 +01:00
Eva Marco
a75c32fa67 ♻️ Refactor css 2024-03-25 09:19:33 +01:00
Andrey Antukh
ec9d67ae1e 🎉 Add node scripts based compile & watch alternative to gulp 2024-03-25 08:47:55 +01:00
Andrey Antukh
83ac6024a2 🔥 Remove old and unused scripts from frontend directory 2024-03-25 08:47:55 +01:00
Eva Marco
30e1c3b4ff ♻️ Add tagline and some refactor to login page 2024-03-22 16:45:51 +01:00
Alejandro
43d7d91415 Merge pull request #4318 from penpot/niwinz-staging-bugfix-2
🐛 Several bugfixes
2024-03-22 16:45:03 +01:00
Alejandro
a9325754b5 Merge pull request #4316 from penpot/alotor-bugfix-33
Bugfixing
2024-03-22 16:44:09 +01:00
Alejandro
b5cfff77b3 Merge pull request #4317 from penpot/eva-bugfix-libraries
🐛 Add gap between library elements modal
2024-03-22 16:37:18 +01:00
Alejandro
f0602a7a04 Merge pull request #4315 from penpot/eva-add-tooltips
 Add missing tooltips
2024-03-22 16:35:30 +01:00
Andrey Antukh
835c29fbea 🐛 Add missing audit event on copy-all-code 2024-03-22 13:05:22 +01:00
Andrey Antukh
a6562619a3 🐛 Fix incorrect fragment cleaning on file-gc task 2024-03-22 12:59:36 +01:00
Andrey Antukh
a6c9ced5b3 🐛 Fix minor issue on internal srepl helpers 2024-03-22 12:59:16 +01:00
Andrey Antukh
7e803eeca8 Add minor improvements for fdata logging 2024-03-22 12:58:50 +01:00
Eva Marco
4ef62cc2dc 🐛 Add gap between library elements modal 2024-03-22 12:22:17 +01:00
alonso.torres
9c2cbb2a48 🐛 Fix problem with scaling constraints 2024-03-22 12:09:49 +01:00
alonso.torres
2735229ffe 🐛 Fix problem with new line in comments 2024-03-22 12:09:49 +01:00
alonso.torres
bf5d95e069 🐛 Fix problem with fit-content on coponent copies 2024-03-22 12:09:49 +01:00
Eva Marco
b3f4f389ff Add tooltips to some buttons 2024-03-22 11:33:05 +01:00
AzazelN28
3d6eb9d4bb 🐛 Fix check thumbnails size 2024-03-22 10:13:17 +01:00
Eva Marco
87146bea85 🐛 Fix collapse group shadow independently 2024-03-22 08:58:00 +01:00
Eva Marco
d8a6abfb88 🐛 Fix image layer filter 2024-03-22 08:58:00 +01:00
Alejandro
1d726249d0 Merge pull request #4313 from penpot/palba-fix-crash-moving-frame-copy
🐛 Fix Crash on moving a frame with copy outside a component
2024-03-22 08:49:16 +01:00
Pablo Alba
0d751b0e20 🐛 Fix Crash on moving a frame with copy outside a component 2024-03-22 08:43:09 +01:00
AzazelN28
bd9874cf28 🐛 Fix exit edit path mode 2024-03-22 08:38:44 +01:00
Alejandro
1beb39ff60 Merge pull request #4297 from penpot/hiru-fix-advance-shape-ref
Fix references when duplicating nested copies
2024-03-22 08:22:20 +01:00
Andrés Moya
9a7a99e67a 🐛 Advance nested copies when duplicated 2024-03-22 07:51:11 +01:00
Alejandro Alonso
b9743891bb 🐛 Fix is-main-of? calculation for v2 components 2024-03-21 15:49:08 +01:00
Alejandro Alonso
8f156a7fd0 🐛 Limit reset overrides on swapped components to affected subtree 2024-03-21 15:49:08 +01:00
AzazelN28
ef2dfe5888 🐛 Fix library horizontal scroll 2024-03-21 14:07:45 +01:00
Alejandro
095e48e479 Merge pull request #4308 from penpot/palba-add-more-debug
📎 Add two more debug options :display-touched and :show-ids
2024-03-21 13:18:26 +01:00
Pablo Alba
0cd44f5540 📎 Add two more debug options :display-touched and :show-ids 2024-03-21 13:08:56 +01:00
Alejandro
1d25115218 Merge pull request #4305 from penpot/niwinz-staging-bugfix-1
🐛 Minor bugfixes
2024-03-21 12:25:47 +01:00
Andrey Antukh
f697f32707 🐛 Add demo warning to login 2024-03-21 11:34:55 +01:00
Eva Marco
d14565437c 🐛 Fix color asset tooltip 2024-03-21 10:59:44 +01:00
Eva Marco
1c65df69f3 🐛 Fix pinned project on creation 2024-03-21 10:59:44 +01:00
Eva Marco
b4c78e11f4 🐛 Fix inspecting mode text 2024-03-21 10:59:44 +01:00
Andrey Antukh
9a0bb36a20 Set proper internal version number 2024-03-21 10:43:25 +01:00
Andrey Antukh
64dc58c259 🐛 Set correctly the default features 2024-03-21 10:35:18 +01:00
Andrey Antukh
f8bfe249aa 🔥 Remove login illustration flag
It is now a permament configuration
2024-03-21 10:34:10 +01:00
Alejandro Alonso
4606785e5f 🐛 Fix move anidated structures withc component copies to other component copies 2024-03-21 10:14:43 +01:00
Alejandro
892acecd9b Merge pull request #4302 from penpot/niwinz-staging-bugfix-1
🐛 Fix release build issue
2024-03-20 16:32:32 +01:00
Andrey Antukh
526f6ef841 🐛 Fix release build issue
Caused by an unsolved corner case of the interaction of code-move
between modules and types defined with reify. Mainly moves some
definition of protocol to one module and the definition of the type
to other, and as the definition of the type is conditional to the
function execution, the whole build fails to initialize because the
second protocol extension implementation can't find the type initialized
on application startup.
2024-03-20 16:12:00 +01:00
Alejandro
8148151ee5 Merge pull request #4291 from penpot/migration
🐛 Several bugfixes
2024-03-20 14:36:15 +01:00
Alejandro
dc39a14c7c Merge pull request #4295 from penpot/azazeln28-fix-dashboard-thumbnails-with-strokes
🐛 Fix dashboard thumbnails with strokes
2024-03-20 09:33:54 +01:00
Andrey Antukh
5c6e8366c1 🐛 Fix unexpected exception on fix-percent functions 2024-03-20 09:33:53 +01:00
AzazelN28
4378f132b4 🐛 Fix dashboard thumbnails with strokes 2024-03-20 06:44:23 +01:00
Alejandro
abd66050bd Merge pull request #4296 from penpot/eva-bugfing-10
🐛 Fix frontend errors
2024-03-20 06:30:25 +01:00
Eva Marco
02ff228f29 🐛 Fix flow dropdown paddings 2024-03-19 16:35:44 +01:00
Eva Marco
ea73e1d365 🐛 Fix interaction icons 2024-03-19 16:19:05 +01:00
alonso.torres
b31683fe72 🐛 Fix problem with mouse out events 2024-03-19 15:57:16 +01:00
Eva Marco
190e022c29 🐛 Fix Vertical scroll inside the action menu works badly with nested menu 2024-03-19 15:39:02 +01:00
Eva Marco
151421c8db 🐛 Fix toggle comments and history states 2024-03-19 15:39:02 +01:00
Eva Marco
aae4c13231 🐛 Fix add page paddings and margins 2024-03-19 15:39:02 +01:00
Alejandro
0fbd7e95df Merge pull request #4289 from penpot/eva-remove-css
♻️ Remove unused CSS files
2024-03-19 13:50:28 +01:00
Alejandro
ebb02f28be Merge pull request #4292 from penpot/azazeln28-fix-imposters-with-strokes
🐛 Fix imposters rendering with strokes
2024-03-19 12:08:23 +01:00
Alejandro
311a609977 Merge pull request #4290 from penpot/alotor-bugfix-32
Bugfix
2024-03-19 11:53:29 +01:00
AzazelN28
121876110a 🐛 Fix imposters rendering with strokes 2024-03-19 11:42:18 +01:00
alonso.torres
dec3478024 🐛 Fix problem with sticky selection on hovering sidebars 2024-03-19 11:42:18 +01:00
Andrey Antukh
edb0408300 🐛 Fix issue on climit when it is not enabled 2024-03-19 11:40:30 +01:00
Eva Marco
ab3e2fd9c2 ♻️ Remove unused CSS files 2024-03-19 11:34:13 +01:00
alonso.torres
e3f508d8d4 🐛 Fix problem with rendering SVG fills 2024-03-19 11:27:06 +01:00
Andrey Antukh
67cdaa397c Add minor improvements to devenv initial flags 2024-03-19 11:21:16 +01:00
Eva Marco
fe3c68ec39 Merge pull request #4288 from penpot/superalex-fix-error-update-email
🐛 Fix error when update email
2024-03-19 09:56:52 +01:00
Andrey Antukh
126bab3ce4 🐛 Fix invalid page name on compv2 migration 2024-03-19 09:15:04 +01:00
Alejandro Alonso
ab0b3c71a8 🐛 Improve fixing root shapes for v1 components on migration to v2 2024-03-19 09:05:35 +01:00
Andrey Antukh
cfe6fae77d 🐛 Fix incorrect version handling on file migration 2024-03-19 09:03:08 +01:00
Alejandro Alonso
94a0c12049 🐛 Fix error when update email 2024-03-19 08:22:47 +01:00
Alejandro
409eea6c5c Merge pull request #4286 from penpot/alotor-bugfix-31
Bugfix
2024-03-19 06:36:55 +01:00
Eva Marco
6b03145524 🐛 Fix height of v2 modal 2024-03-18 17:23:40 +01:00
Eva Marco
0204cc5d40 🐛 Fix components background color 2024-03-18 17:23:40 +01:00
Eva Marco
65fa434388 🐛 Fix dahsboard project scroll 2024-03-18 17:23:40 +01:00
Alejandro Alonso
38b72abf32 🐛 Fix allow modify component copy structure under some circumstances 2024-03-18 16:45:05 +01:00
alonso.torres
19b5baf7ee 🐛 Fix scroll for import modal 2024-03-18 16:29:26 +01:00
alonso.torres
5e89b1c1d0 🐛 Fix problem when dragging template to the dashboard 2024-03-18 16:29:26 +01:00
alonso.torres
0590336c71 🐛 Fix problem with order of operations 2024-03-18 16:29:26 +01:00
Alejandro Alonso
8363b86cfa 🐛 Fix shadows lost on import export 2024-03-18 15:57:55 +01:00
Pablo Alba
a5b156e0d6 🐛 Fix change structure of comp doesn't update copies on another file 2024-03-18 15:31:30 +01:00
Alejandro Alonso
d6b60ce43a 🐛 Fix rmap shape refs on components v2 migration 2024-03-18 14:19:40 +01:00
Alejandro
89b43d7127 Merge pull request #4269 from penpot/telemetry
 Improve internal naming of setup/props
2024-03-18 09:53:15 +01:00
Alejandro
db59de8494 Merge pull request #4282 from penpot/eva-bugfixing-6
🐛 Fix some UI errors
2024-03-18 09:44:45 +01:00
Alejandro
ef91c00b10 Merge pull request #4270 from penpot/eva-bugfixing-5
🐛  Fix some UI errors
2024-03-18 09:22:52 +01:00
Eva Marco
440495a1d0 🐛 Fix submenu positioning in context menu 2024-03-18 09:22:45 +01:00
Eva Marco
b999057be1 🐛 Fix path top bat z-index 2024-03-18 09:22:43 +01:00
Alejandro Alonso
ca5e2c345b 🎉 Improve naming of components for Main components page on v1 to v2 migration 2024-03-18 09:13:15 +01:00
Alejandro Alonso
3f316ca9c9 🐛 Fix swap on anidated frames 2024-03-18 09:05:49 +01:00
Eva Marco
cdab615cbb 🐛 Fix copies of snap to grid and show hide grid 2024-03-18 08:53:48 +01:00
Alejandro
355af61cda Merge pull request #4281 from penpot/alotor-bugfix-30
Bugfixing
2024-03-18 07:03:14 +01:00
Alejandro
9dc7671a95 Merge pull request #4279 from penpot/eva-add-release-copies
 Add new copies to the release modal
2024-03-18 06:53:25 +01:00
Alejandro
319cbe02cc Merge pull request #4277 from penpot/ladybenko-7199-fix-toolbar-position
Fix toolbar + subactions toolbar positioning
2024-03-18 06:33:59 +01:00
alonso.torres
8e7471509c 🐛 Fix problem on modal transfer owner 2024-03-15 16:02:00 +01:00
alonso.torres
dc7d279e9d 🐛 Fix problem with interactions over frames 2024-03-15 16:02:00 +01:00
alonso.torres
dd69762b31 🐛 Fix problem with dismiss fonts 2024-03-15 15:34:16 +01:00
alonso.torres
db7ed75a91 🐛 Add mime-type otf to color picker 2024-03-15 15:34:16 +01:00
alonso.torres
8850fd8894 🐛 Fix problem dragging in draft/projects screen 2024-03-15 15:34:16 +01:00
alonso.torres
b097f73b13 🐛 Fix problem with snap to frame guides 2024-03-15 15:34:16 +01:00
alonso.torres
895f649ef1 🐛 Stop drag events when the user focus out the application 2024-03-15 15:34:16 +01:00
Alejandro Alonso
054ffbe396 🐛 Fix duplicate board 2024-03-15 14:15:49 +01:00
Eva Marco
80370e39b5 Add new copies to the release modal 2024-03-15 14:03:24 +01:00
Belén Albeza
51c2269c84 🐛 Fix subactions toolbar positioning 2024-03-15 12:22:11 +01:00
Belén Albeza
1e9c6f3ebe 🐛 Fix main toolbar positioning when rulers are hidden 2024-03-15 11:22:24 +01:00
Alejandro Alonso
a3ca905f37 🐛 Fix uneven layer opacities 2024-03-15 09:27:30 +01:00
Eva Marco
d8a9e1a2cb Merge pull request #4273 from penpot/ladybenko-7173-fix-dashboard-layouts
🐛 Fix projects & teams dashboard pages
2024-03-15 09:15:45 +01:00
Eva Marco
a237a82e6f Merge pull request #4271 from penpot/alotor-bugfix-29
Bugfixing
2024-03-14 17:32:13 +01:00
alonso.torres
affa37f0c5 🐛 Fix problem with scroll style in windows 2024-03-14 16:54:15 +01:00
alonso.torres
55b6df0ae4 🐛 Make opacity override same color recent-color 2024-03-14 16:16:33 +01:00
Belén Albeza
b5fe07d5ee 🐛 Fix projects & teams dashboard pages 2024-03-14 16:02:37 +01:00
Andrey Antukh
1a12e63027 ♻️ Simplify audit events code 2024-03-14 15:59:47 +01:00
alonso.torres
5c33bc6892 🐛 Make the layout boards export as responsive markup 2024-03-14 15:52:26 +01:00
alonso.torres
6bf3363429 🐛 Fix scroll when file menu open 2024-03-14 14:19:55 +01:00
alonso.torres
3bc6d2b0a7 🐛 Fix migrating old components should not clip the content 2024-03-14 13:35:56 +01:00
alonso.torres
d5b2a91bce 🐛 Fix problem with fast change between numeric inputs 2024-03-14 12:42:07 +01:00
Eva Marco
4e9710ddfa 🐛 Fix dashboard comment title 2024-03-14 12:15:01 +01:00
Andrey Antukh
91118bec70 Improve internal naming of setup/props
This reverts commit a6f70c77cb.
2024-03-14 10:48:23 +01:00
alonso.torres
75d0648065 🐛 Fix problem with throttle function 2024-03-14 09:53:07 +01:00
Alejandro
7436918edb Merge pull request #4260 from penpot/eva-bugfixing-4
🐛  Some UI fixes
2024-03-14 08:36:16 +01:00
Alejandro
1d55b30132 Merge pull request #4262 from penpot/alotor-bugfix-28
Bugfixes
2024-03-14 08:27:32 +01:00
Alejandro
ecab472ced Merge pull request #4263 from penpot/hiru-add-swap-slots
♻️ Add a tool to generate swap-slots
2024-03-14 08:23:36 +01:00
Eva Marco
fbe09e6b5a 🐛 Fix workspace context menu in small screens 2024-03-13 17:36:40 +01:00
Andrés Moya
2247f0ecac ♻️ Add a tool to generate swap-slots 2024-03-13 17:01:43 +01:00
Eva Marco
04a69c2a2c 🐛 Fix update modal spacing 2024-03-13 16:41:53 +01:00
alonso.torres
b00b77895f 🐛 Fix comment number in sidebar 2024-03-13 16:21:41 +01:00
alonso.torres
c47fe2954a 🐛 Fix problem with typography sample 2024-03-13 16:21:41 +01:00
alonso.torres
2a998a2dcc 🐛 Fix problem when expanding components tab 2024-03-13 16:21:41 +01:00
alonso.torres
a6f70c77cb Revert " Improve internal naming of setup/props"
This reverts commit f525c6df5e.
2024-03-13 16:21:12 +01:00
Belén Albeza
5f0b86e0df 🐛 Fix file renaming input size 2024-03-13 15:47:30 +01:00
Eva Marco
18fc08d418 🐛 Fix typographies in update modal 2024-03-13 13:17:39 +01:00
Eva Marco
b41b3de46d ♻️ Refactor libraries css 2024-03-13 13:07:39 +01:00
Andrey Antukh
eabec6be20 🔥 Remove not needed events 2024-03-13 11:40:16 +01:00
Andrey Antukh
f525c6df5e Improve internal naming of setup/props 2024-03-13 11:39:53 +01:00
Eva Marco
e2412b3d43 🐛 Fix draft grid columns 2024-03-13 11:05:48 +01:00
Eva Marco
16c8c3483f 🐛 Change view only message 2024-03-13 10:18:19 +01:00
Alejandro
ecb8ed8b8b Merge pull request #4254 from penpot/palba-fix-crash-copy
🐛 Fix crash copy paste a Copy from a library
2024-03-13 10:01:58 +01:00
Eva Marco
4c0e17ea7b Merge pull request #4259 from penpot/alotor-fix-update-profile
🐛 Fix problem with language update
2024-03-13 10:00:55 +01:00
Eva Marco
98b41a5bff 🐛 Fix assets group name when is too long 2024-03-13 09:57:12 +01:00
Pablo Alba
2d5e1f7792 Merge pull request #4250 from penpot/superalex-fix-restore-component
🐛 Fix restore component
2024-03-13 09:48:24 +01:00
alonso.torres
d4fb85bb02 🐛 Fix problem with language update 2024-03-13 09:47:20 +01:00
Alejandro
946677f5b3 Merge pull request #4257 from penpot/alotor-bugfixes-27
Bugfixes
2024-03-13 07:11:38 +01:00
Alejandro
a704e919d8 Merge pull request #4258 from penpot/palba-fix-swap-mixed-paths
🐛 Fixes the folders in the Swap pannel appear weird on mixed
2024-03-13 06:59:05 +01:00
Pablo Alba
f8c416c5ae 🐛 Fixes the folders in the Swap pannel appear weird on mixed 2024-03-12 21:34:45 +01:00
Pablo Alba
76b75192e7 🐛 Fix crash copy paste a Copy 2024-03-12 20:57:33 +01:00
Aitor
8ee79e5d7c 🐛 Fix viewer background visible on transition between frames 2024-03-12 18:13:25 +01:00
Belén Albeza
3b0148046b 🐛 Fix horizontal scroll bar in comments 2024-03-12 18:11:15 +01:00
alonso.torres
8128171d8e 🐛 Fix problem with complementary colors slider in picker 2024-03-12 18:06:36 +01:00
alonso.torres
786513863b 🐛 Fix problem with duplicate in main component 2024-03-12 18:05:36 +01:00
Eva Marco
3bbf97fde9 🐛 Fix invitation badge colors 2024-03-12 18:00:42 +01:00
Eva Marco
a3bfeace73 🐛 Fix search icon on dhasboard 2024-03-12 18:00:42 +01:00
Eva Marco
37859a20a6 🐛 Recover lost wrap icon 2024-03-12 18:00:42 +01:00
Eva Marco
c865a1bdfd ♻️ Refactor project header css 2024-03-12 18:00:42 +01:00
Eva Marco
d478a7d8d9 🐛 Fix project name too long 2024-03-12 18:00:42 +01:00
Alejandro Alonso
56bc70dffe 🐛 Fix restore component 2024-03-12 12:43:42 +01:00
Alejandro
9328974511 Merge pull request #4237 from penpot/palba-fix-swap-loop
🐛 Fix possible loop in the list of swappable components
2024-03-12 11:45:28 +01:00
Eva Marco
be22d506a8 Merge pull request #4245 from penpot/ladybenko-6799-comments-moving
🐛 Fix comments thread displacing bubbles
2024-03-12 11:43:45 +01:00
Pablo Alba
e6964cf02c Merge pull request #4248 from penpot/superalex-improve-reset-overrides-behaviour
🐛 Fix reset override behaviour
2024-03-12 11:17:58 +01:00
Alejandro
5d5fc2c151 Merge pull request #4243 from penpot/eva-bugfixing-ui-2
🐛 Fix some UI errors
2024-03-12 11:17:21 +01:00
Alejandro Alonso
343efc68c5 🐛 Propagate parent changes con reset overrides 2024-03-12 11:06:58 +01:00
Belén Albeza
3fdf0c727e 🐛 Fix comments thread overflowing the viewport and displacing comment bubbles 2024-03-12 10:27:23 +01:00
Alejandro
1a6a6e9367 Merge pull request #4249 from penpot/alotor-bugfixing-26
Bugfixes
2024-03-12 09:54:21 +01:00
Alejandro Alonso
d08dfaa022 🐛 Fix reset override behaviour 2024-03-12 09:12:25 +01:00
alonso.torres
9852558a57 🐛 Fix problem when importing templates 2024-03-11 18:43:56 +01:00
alonso.torres
de1dae7f93 🐛 Fix problem with input fast change 2024-03-11 18:43:56 +01:00
alonso.torres
bed13c24df 🐛 Fix problem with comments new line 2024-03-11 16:14:24 +01:00
alonso.torres
112e71a259 🐛 Fix propagation of auto/fix sizing on components 2024-03-11 16:14:24 +01:00
alonso.torres
338b6cdbd6 🐛 Add tooltip to button in layout 2024-03-11 16:14:24 +01:00
Eva Marco
358176c927 🐛 Fix project name in sidebar 2024-03-11 16:03:40 +01:00
Pablo Alba
25cf30e7d3 🐛 Fix possible loop in the list of swappable components 2024-03-11 14:28:26 +01:00
Eva Marco
4ffaf6f996 🐛 Fix gradient background image 2024-03-11 11:46:33 +01:00
Andrey Antukh
b30d525400 🐛 Fix opts passing on process-file! srepl helper 2024-03-11 11:18:46 +01:00
Eva Marco
d860eac59f 🐛 Fix disabled buttons height in login and auth pages 2024-03-11 11:16:15 +01:00
Eva Marco
f714f08716 🐛 Fix comment bubble border 2024-03-11 11:05:21 +01:00
Eva Marco
71b4079483 🐛 Fix the hero project height in dashboard 2024-03-11 10:54:00 +01:00
Eva Marco
9940dabfff 🐛 Fix z-index of workspace context menu 2024-03-11 10:16:56 +01:00
Pablo Alba
fb58d7a4cc Merge pull request #4239 from penpot/alotor-bugfixes-25
Bugfixes
2024-03-08 16:34:52 +01:00
alonso.torres
5390eabcd6 🐛 Add more shortcuts for next/previous frame in viewer 2024-03-08 16:08:52 +01:00
alonso.torres
8963cb2739 🐛 Fix recent fonts name changes 2024-03-08 16:08:52 +01:00
alonso.torres
69f9982d26 🐛 Fix problem with comment thread ignoring filters 2024-03-08 16:08:52 +01:00
alonso.torres
7f93c41005 🐛 Fix colorpicker open palete library 2024-03-08 16:08:52 +01:00
alonso.torres
f32aaee41f 🐛 Fix problem when changing typography assets 2024-03-08 16:08:52 +01:00
Eva Marco
4f01a63771 ♻️ Update name of shape icon refactor 2024-03-08 16:07:38 +01:00
Eva Marco
ca7438aab5 ♻️ Rename all icon functions 2024-03-08 16:07:38 +01:00
Eva Marco
5739c0797c ♻️ Rename all refactored icons 2024-03-08 16:07:38 +01:00
Eva Marco
4ef2482b02 ♻️ Remove unused icons 2024-03-08 16:07:38 +01:00
Aitor
d0889931b5 🐛 Fix color picker blurry bitmap 2024-03-08 15:45:29 +01:00
Aitor
1c29c73b8e 🐛 Fix rasterizer using wrong sizes 2024-03-08 15:32:48 +01:00
Eva Marco
d488d69abc ♻️ Remove old color bullet component 2024-03-08 15:31:29 +01:00
Alejandro
3e9b2ec5c8 Merge pull request #4214 from penpot/hiru-review-override-status-of-swapped-copies
🎉 Improve sync algorithm when swapped copies
2024-03-08 12:10:13 +01:00
Alejandro Alonso
8529927173 ♻️ Avoid unnecessary logs 2024-03-08 12:03:09 +01:00
Andrés Moya
2c12790782 🐛 Fix child compare in reset mode 2024-03-08 11:31:46 +01:00
Andrés Moya
2c740df767 🐛 Do recursive swap-slot finding 2024-03-08 11:31:46 +01:00
Alejandro Alonso
bad0fb912b :tada Add undo-group for layout updates 2024-03-08 11:31:32 +01:00
Pablo Alba
c214d8b044 🎉 Simplify and fix compare children 2024-03-08 11:30:41 +01:00
Alejandro Alonso
895fb3b480 🎉 Remove shapes-group 2024-03-08 11:30:41 +01:00
Alejandro
e25c1e987c Merge pull request #4230 from penpot/azazeln28-component-layers-incorrectly-relocated
🐛 Component layers are incorrectly relocated on drag'n'drop
2024-03-08 09:48:49 +01:00
Aitor
55293e60d6 🐛 Component layers are incorrectly relocated on drag'n'drop 2024-03-08 09:28:05 +01:00
Alejandro
ea51a8d9b6 Merge pull request #4235 from penpot/alotor-bugfixes-24
Bugfixing
2024-03-08 09:23:06 +01:00
Alejandro Alonso
bdf0a64e3a 🐛 Fix release notes 2.0 2024-03-08 08:52:28 +01:00
alonso.torres
9a976a8f6e 🐛 Fix problem with fix scrolling on nested elements 2024-03-07 17:54:49 +01:00
alonso.torres
916d179009 🐛 Fix error on websockets page 2024-03-07 17:54:49 +01:00
alonso.torres
bb5eb4a097 🐛 Fix black screen on non-log access to projects 2024-03-07 17:54:49 +01:00
alonso.torres
e2428fc0c6 🐛 Fix problem with space key stuck 2024-03-07 17:54:49 +01:00
alonso.torres
ee4c56aa9b 🐛 Fix allow entering invalid emails into the invitation form 2024-03-07 17:54:49 +01:00
alonso.torres
8a6882e155 🐛 Fix inspect copy stroke 2024-03-07 17:54:49 +01:00
alonso.torres
28d6cf6f51 🐛 Fix import stroke attached library color 2024-03-07 17:54:49 +01:00
alonso.torres
747cead313 🐛 Fix forbid empty flow names 2024-03-07 17:54:49 +01:00
alonso.torres
b9b85b5ada 🐛 Fix undo for set typography 2024-03-07 17:54:49 +01:00
alonso.torres
0db24dc7ec 🐛 Fix problem with shadow negative spread 2024-03-07 17:54:49 +01:00
alonso.torres
2031e513ed 🐛 Fix problem moving grid elements 2024-03-07 17:54:49 +01:00
Eva Marco
8b6be5b62e ♻️ Refactor access tokens file 2024-03-07 16:49:10 +01:00
Eva Marco
bc04eaa910 ♻️ Update access tokens icons 2024-03-07 16:49:10 +01:00
Eva Marco
47df285500 ♻️ Unnest scss rules in dashboard settings 2024-03-07 16:49:10 +01:00
Eva Marco
cfffb1e551 ♻️ Update go back icon on dashboard 2024-03-07 16:49:10 +01:00
Eva Marco
cf41982ee2 ♻️ Unnest scss of dashboard comments file 2024-03-07 16:49:10 +01:00
Eva Marco
9f7d1be0a9 ♻️ Update dashboard comment icon 2024-03-07 16:49:10 +01:00
Aitor Moreno
9012987f7e Merge pull request #4223 from penpot/niwinz-staging-bugfix-4
🐛 Several bugfixes and optimizations
2024-03-07 15:40:32 +01:00
Andrés Moya
4dfbfcf2ac ♻️ Avoid duplicating helpers 2024-03-07 14:41:08 +01:00
Andrés Moya
07939d11dc 🎉 Improve sync algorithm when swapped copies 2024-03-07 14:41:08 +01:00
Pablo Alba
0d1af260a4 🐛 Remove incorrect find-component function 2024-03-07 14:39:57 +01:00
Pablo Alba
5157928cdb 🐛 Fix copy and paste a main on another main doesn't work 2024-03-07 14:37:32 +01:00
Eva Marco
899093dd55 ♻️ Update team icons 2024-03-07 11:26:49 +01:00
Pablo Alba
875ea58a01 Merge pull request #4229 from penpot/superalex-fix-concat-changes
🐛 Fix concat changes
2024-03-07 10:58:26 +01:00
Alejandro Alonso
b3f97fe456 🐛 Fix concat changes 2024-03-07 10:54:03 +01:00
Pablo Alba
24fb48ea0f Merge pull request #4226 from penpot/alotor-update-changelog
Update changelog
2024-03-06 16:42:03 +01:00
alonso.torres
4f69ff7124 📚 Update changelog 2024-03-06 16:39:18 +01:00
Eva Marco
92425fcbaf ♻️ Update dashboard hero and template icons 2024-03-06 14:11:43 +01:00
Andrey Antukh
1134f16ffa 💄 Add cosmetic refactor to dashboard fonts react components 2024-03-06 13:48:32 +01:00
Aitor Moreno
ef99ad349b Merge pull request #4221 from penpot/alotor-bugfixes-23
Alotor bugfixes 23
2024-03-06 10:50:54 +01:00
Andrey Antukh
131fc95ab0 🐛 Fix release notes not showing on release build 2024-03-06 10:01:57 +01:00
Andrey Antukh
7eecd50c50 📚 Add http methods documentation to the API doc page 2024-03-06 09:24:37 +01:00
Andrey Antukh
88f49cfbc9 🐛 Fix email field intrusive autocomplete on firefox
Firefox has a strange behavior because it ignores the autocomplete
attribute and just does not allow submit a form when an email type
field has invalid email (valid but surrounded with whitespace).

This fix is a workaround, setting up the input field as simple text
instead of semantic type 'email'.
2024-03-06 09:17:39 +01:00
Andrey Antukh
5b722a8608 🐛 Fix error handling on register page 2024-03-06 09:17:04 +01:00
Andrey Antukh
8cb550120a 🐛 Fix error handling on recovery request page 2024-03-06 09:16:45 +01:00
Andrey Antukh
1bc4001e70 Add the ability to set :string for cookie same-site
By configuration. The default is :lax (unchanged)
2024-03-05 19:47:29 +01:00
Andrey Antukh
07b8a2a6e6 Restrict http methods on RPC handlers 2024-03-05 19:47:29 +01:00
Andrey Antukh
c3f37fb8a3 ♻️ Refactor import dialog on dashboard 2024-03-05 19:47:29 +01:00
Andrey Antukh
afd373ffee Simplify implementation of d/name 2024-03-05 19:47:29 +01:00
Andrey Antukh
cac785f3e1 💄 Add cosmetic improvements to dashboard import modal code 2024-03-05 19:47:29 +01:00
Andrey Antukh
d2059475f0 Add minor performance enhancement for inside-layout? helper 2024-03-05 19:47:29 +01:00
Andrey Antukh
6fe85465a1 Add minor performance enhacement on shape layout functions 2024-03-05 19:47:29 +01:00
Andrey Antukh
3412658286 Move some functions from file helpers to types.shape.layout 2024-03-05 19:47:29 +01:00
Andrey Antukh
85d06b10c2 🐛 Fix incorrect event handling on component annotation creation 2024-03-05 19:47:29 +01:00
Andrey Antukh
ee91ab5dad Add nano optimizations to fo_text react component 2024-03-05 19:47:29 +01:00
Andrey Antukh
43cd4656b4 Remove props wrapping on workspace comment react components 2024-03-05 19:47:29 +01:00
Andrey Antukh
4106e8da56 Add performance enhancements to viewport comments layer 2024-03-05 19:47:20 +01:00
Andrey Antukh
638cf6daff 💄 Add cosmetic enhancements to viewport comments layer
That also improves performance
2024-03-05 18:51:40 +01:00
alonso.torres
ce68bde9a8 🐛 Fix problem with detatch color in shadow 2024-03-05 18:13:22 +01:00
alonso.torres
93542282f1 🐛 Fix problem with grid gap 2024-03-05 18:13:22 +01:00
alonso.torres
335b51387d 🐛 Fix interactions with nested frames 2024-03-05 18:13:22 +01:00
alonso.torres
7dec194b1f 🐛 Make no-clip default for new frames from shapes 2024-03-05 18:13:22 +01:00
alonso.torres
ff22208ec2 🐛 Fix problem with grid multiple selection 2024-03-05 18:13:22 +01:00
alonso.torres
38148cf87f 🐛 Fix problem with error reporting screen 2024-03-05 18:13:22 +01:00
Eva Marco
1c38883ddd ♻️ Update sidebar old icons 2024-03-05 16:36:30 +01:00
Eva Marco
c2b8e5c946 ♻️ Refactor dashboard sidebar css 2024-03-05 16:36:30 +01:00
Aitor
9ad0662409 🐛 Fix imposter being regenerated indefinitely 2024-03-05 16:20:03 +01:00
Eva Marco
2465690c7d Merge pull request #4220 from penpot/azazeln28-sort-interaction-destinations
 Sort interaction destinations by label
2024-03-05 16:04:39 +01:00
Aitor
3c9ae9b210 Sort interaction destinations by label 2024-03-05 13:13:25 +01:00
alonso.torres
8d20220330 🐛 Fix inspect code text fonts 2024-03-04 20:31:28 +01:00
alonso.torres
bf6e467abf 🐛 Add tooltip to the locate button 2024-03-04 20:31:28 +01:00
alonso.torres
fb2c4c9c3a 🐛 Fix problem with grid layout paddings 2024-03-04 20:31:28 +01:00
alonso.torres
f36410da87 🐛 Fix problem when changing track data in editor 2024-03-04 20:31:28 +01:00
Belén Albeza
bcd859ca4c Merge pull request #4209 from penpot/eva-bugfixing-ui
Bugfixing
2024-03-04 11:28:35 +01:00
Belén Albeza
7833a06a86 🐛 Fix color rename input height 2024-03-04 10:49:19 +01:00
Eva Marco
6e4075a2e7 🐛 Fix create team name modal width 2024-03-04 10:44:09 +01:00
Eva Marco
add0bed3ca 🐛 Fix ellipsis in library color names 2024-03-04 10:44:09 +01:00
Alejandro
acbc2a80dd Merge pull request #4215 from penpot/palba-bugfixing-005
🐛 Bugfixing
2024-03-04 09:31:51 +01:00
Aitor
611b90f5fb 🐛 Fix rasterizer not setting intrinsic size 2024-03-04 08:58:49 +01:00
Pablo Alba
ca0fd0fa13 🐛 Fix it is possible to upload font with empty font family 2024-03-01 16:35:59 +01:00
Eva Marco
9645ffba40 🐛 Fix upload image alert message 2024-03-01 16:32:31 +01:00
Pablo Alba
041224e44b 🐛 Fix incorrect message trying to login with bad credentials 2024-03-01 13:53:57 +01:00
Pablo Alba
44b66352ab 🐛 Fix invalid error is displayed when changing the password 2024-03-01 13:45:06 +01:00
Pablo Alba
b2ad78d947 🐛 Fix in dashboard it is possible to update project with empty name on left sidebar 2024-03-01 12:27:48 +01:00
Andrey Antukh
42b68a786e Add more performance enhancements to code react component
On the viewer inspect module
2024-03-01 12:18:45 +01:00
Andrey Antukh
942989824a Improve audit events on inspect copy operations 2024-03-01 12:18:45 +01:00
Andrey Antukh
00ee6833c8 Separate inspect-title-bar from title-bar
This now makes the component a bit less overloaded and
the implementation simplified without bracking too much
the modularization
2024-03-01 12:18:45 +01:00
Andrey Antukh
20b651560d Add performance enhancements to copy-button react component 2024-03-01 12:18:45 +01:00
Andrey Antukh
a3faca910f 📎 Add some FIXME comments for future refactors 2024-03-01 12:18:45 +01:00
Andrey Antukh
97e7806bdb 🐛 Update rumext (fix issues on native destructuring) 2024-03-01 12:18:45 +01:00
Andrey Antukh
1cc65c69b7 Add audit events for inspect tab usage
On workspace and viewer
2024-03-01 12:18:45 +01:00
Andrey Antukh
f888a6db4c Add audit events for aspect ration change 2024-03-01 12:18:45 +01:00
Andrey Antukh
a40d207dfd Add audit events for component swap action 2024-03-01 12:18:45 +01:00
Andrey Antukh
0b20d85677 🐛 Add missing option for delete grid layout on context-menu 2024-03-01 12:18:45 +01:00
Andrey Antukh
7d2af587cd Improve audit events for layout context menu 2024-03-01 12:18:45 +01:00
Andrey Antukh
4ec1844e6e Add minor optimizations to component-swap react component 2024-03-01 12:18:45 +01:00
Andrey Antukh
4aef2a475a Add audit events for component annotations 2024-03-01 12:18:45 +01:00
Andrey Antukh
a21a64aa10 Add performance refactor to component-annotaton react component 2024-03-01 12:18:45 +01:00
Andrey Antukh
60962b58fe Add ::mf/props :obj to components menu sidebar 2024-03-01 12:18:45 +01:00
Andrey Antukh
ef2160dbb6 Add audit events for theme activation 2024-03-01 12:18:45 +01:00
Andrey Antukh
8eaf93f08a Add audit events for shape layout creation 2024-03-01 12:18:45 +01:00
Andrey Antukh
467e4c76a6 🐛 Fix some internal issues on audit events 2024-03-01 12:18:45 +01:00
Eva Marco
54511a5ef0 Merge pull request #4211 from penpot/alotor-debug-icons
 Add debug old icons
2024-03-01 11:45:49 +01:00
alonso.torres
bf898bfdc9 Add debug old icons 2024-03-01 11:08:49 +01:00
Eva Marco
1f0683498f 💄 Update release modals to new design 2024-03-01 11:04:24 +01:00
Pablo Alba
238519cb69 🐛 Fix In history panel, If I click on the arrow to see more, it undoes until that change 2024-03-01 10:07:50 +01:00
Pablo Alba
0da51d878f 🐛 Change "Toggle Scale Text" in shortcuts for "Scale" 2024-03-01 10:07:50 +01:00
Pablo Alba
dd5ec39619 🐛 Fix set as thumbnail generate 2 steps for undo 2024-03-01 10:07:50 +01:00
Pablo Alba
445519fc70 🐛 Fix flows list elements are not accessible when too many 2024-03-01 10:07:50 +01:00
Pablo Alba
bbe4ef5fc1 🐛 Change "Twitter" for "X" 2024-03-01 10:07:50 +01:00
Eva Marco
f851d552bf Merge pull request #4210 from penpot/ladybenko-7003-team-dropdown
🐛 Fix team switch dropdown width
2024-03-01 08:44:30 +01:00
Belén Albeza
99cbd84148 🐛 Fix team switch dropdown width 2024-02-29 18:07:12 +01:00
Pablo Alba
e5cd2983d0 Merge pull request #4201 from penpot/niwinz-staging-gulp-improvements
📎 Clean already generated styles on fresh gulp watch start
2024-02-29 12:15:59 +01:00
Andrey Antukh
e2d7105624 Add nano optimization to get-path-id function
Mainly change get-in for dm/get-in macro
2024-02-29 10:20:47 +01:00
Andrey Antukh
26ab7f83fe 💄 Add mainly cosmetic changes to path-editing? function 2024-02-29 10:20:47 +01:00
Aitor
f0955c0e99 ♻️ Refactor toolbar refs and path editing helper 2024-02-29 10:20:47 +01:00
Aitor
f5dd199bc6 💄 Change stoper to stopper 2024-02-29 10:20:47 +01:00
Aitor
c123cf6e98 🐛 Fix path drawing inconsistencies 2024-02-29 10:20:47 +01:00
Pablo Alba
74d2273d24 🐛 Fix problems on sync with components chain with deleted components 2024-02-29 10:18:00 +01:00
Eva Marco
697a542754 💄 Add final design to alert messages 2024-02-29 09:58:35 +01:00
Belén Albeza
233e7e7e87 🐛 Use new icon for menu action in project grid 2024-02-29 09:38:41 +01:00
Belén Albeza
9594c70ec5 💄 Remove nesting in css for project grid menu icon 2024-02-29 09:38:41 +01:00
Belén Albeza
7d2aef441c 🐛 Use new icons for dashboard/projects 2024-02-29 09:38:41 +01:00
Belén Albeza
372e6b8a88 💄 Unnest css selectors for the 'show all files' in the dashboard 2024-02-29 09:38:41 +01:00
Belén Albeza
74e879a2be 🐛 Fix css for mail toolbar button 2024-02-29 09:38:41 +01:00
Belén Albeza
a3e4f3f376 💄 Remove nesting of mail toolbar buttons css 2024-02-29 09:38:41 +01:00
Belén Albeza
75716c37e1 🐛 Fix style of radio buttons in light theme 2024-02-29 09:38:41 +01:00
Belén Albeza
e6d4a56901 💄 remove nesting in radio-button scss 2024-02-29 09:38:41 +01:00
alonso.torres
85ac766bf9 🐛 Fix rulers markers growing with zoom 2024-02-29 09:36:47 +01:00
alonso.torres
58f9b2a4e8 🐛 Fix problem with stroke in multi-paragraph texts 2024-02-29 09:36:47 +01:00
alonso.torres
54db163cd8 🐛 Fix visual bug for scrolls on inspect mode 2024-02-29 09:36:47 +01:00
alonso.torres
05d0d2550a 🐛 Fix problem with button in inspect 2024-02-29 09:36:47 +01:00
alonso.torres
1c5d51bf97 🐛 Fix undo path exit path editor after empty stack 2024-02-29 09:36:47 +01:00
alonso.torres
e636dc30c2 🐛 Fix error with keys on menu 2024-02-29 09:36:47 +01:00
alonso.torres
ab2265d505 🐛 Fix problem when components are inside a boolean 2024-02-29 09:36:47 +01:00
alonso.torres
f1282f8367 🐛 Fix shortcut for increase text font 2024-02-29 09:36:47 +01:00
alonso.torres
f57c5b4da2 🐛 Fix align options on rotated frames 2024-02-29 09:36:47 +01:00
alonso.torres
905e1eea7b 🐛 Fix problem editing font names 2024-02-29 09:36:47 +01:00
alonso.torres
1d9b91821b 🐛 Fix icons in flex layout 2024-02-29 09:36:47 +01:00
Aitor Moreno
27ef14fd2a Merge pull request #4202 from penpot/ladybenko-6754-feedback-form-margin
🐛 Fix wrong margins for the give feedback page
2024-02-28 17:17:30 +01:00
Belén Albeza
abdd58f3cf 🐛 Fix wrong margins for the give feedback page 2024-02-28 13:00:22 +01:00
Belén Albeza
67b343660a 🐛 Use new icons in stroke cap dropdown 2024-02-28 11:28:39 +01:00
Andrey Antukh
85ef9763bd 📎 Clean already generated styles on fresh gulp watch start 2024-02-28 11:27:31 +01:00
Andrey Antukh
9c47d34f98 💄 Adapt frame-wrapper to use new rumext helpers 2024-02-28 11:23:33 +01:00
Andrey Antukh
b6134e1afe 🐛 Rename spread-obj to spread 2024-02-27 12:51:31 +01:00
Andrés Moya
c5f24331a3 🐛 Improve selection of near copies to sync 2024-02-27 12:45:32 +01:00
Aitor Moreno
7dd0745429 Merge pull request #4175 from penpot/niwinz-staging-perfix-3
 Add incremental improvements to `layout-container` related components
2024-02-27 11:23:39 +01:00
alonso.torres
98e56bab80 🐛 Add timeout to request on idle timers 2024-02-27 10:43:14 +01:00
alonso.torres
072c724462 🐛 Fix problem with layers loading 2024-02-27 10:43:14 +01:00
Alejandro
49c750bdaf Merge pull request #4193 from penpot/niwinz-staging-update-deps
⬆️ Update frontend dependencies
2024-02-27 09:26:09 +01:00
Alejandro
addf83ab22 Merge pull request #4190 from penpot/palba-bugfixes-002
🐛 Fix impossible to move an element when it's in a main component
2024-02-27 08:53:06 +01:00
Pablo Alba
78e26794e8 🐛 Fix when you move a library to another team, the warning message does not appear 2024-02-27 07:49:51 +01:00
Andrey Antukh
628454d13c Add missing translations for date functions 2024-02-27 01:04:07 +01:00
Andrey Antukh
d3e9d9be76 ⬆️ Update frontend deps (dateFns, rxjs, etc) 2024-02-27 01:04:07 +01:00
Andrey Antukh
2415bae1b3 ⬆️ Update frontend build dependencies (saas, autoprefixer, ...) 2024-02-27 01:04:07 +01:00
Andrey Antukh
d50afcce15 ⬆️ Update frontend storybook related dependencies 2024-02-27 01:04:07 +01:00
Andrey Antukh
c80da1bbac ⬆️ Update rumext and shadow-cljs 2024-02-27 01:04:07 +01:00
Eva Marco
039baa6bd1 🐛 Fix paddings of right side panel on viewer 2024-02-26 17:45:28 +01:00
Eva Marco
162e7a56d6 🐛 Fix rotate icons in comments 2024-02-26 17:45:28 +01:00
Eva Marco
df43912fe5 🐛 Fix different button size on webhooks 2024-02-26 17:45:28 +01:00
Eva Marco
c7001fed3c 💄 Update context variable name on notification components 2024-02-26 16:51:31 +01:00
Eva Marco
27e9a2a7f2 Add a way to add markdown to context notifications 2024-02-26 16:51:31 +01:00
Eva Marco
336cc98029 💄 Update some namespace abbreviations 2024-02-26 16:51:31 +01:00
Eva Marco
1af2ec0b79 ♻️ Update notification component 2024-02-26 16:51:31 +01:00
Eva Marco
de0cd5aa04 ♻️ Update colors for alerts 2024-02-26 16:51:31 +01:00
Belén Albeza
f91a8b371a 🐛 Fix layer filter dropdown position + add auto-closing on Esc and outside click 2024-02-26 16:50:21 +01:00
Alejandro Alonso
10d6f93ed7 🐛 Fix detach components with shortcut 2024-02-26 14:45:01 +01:00
Pablo Alba
0a09ff8e36 🐛 Fix impossible to move an element when it's in a main component 2024-02-26 12:55:49 +01:00
Aitor Moreno
8ea4e5ca10 Merge pull request #4186 from penpot/alotor-bugfix-19
🐛 Bugfixes
2024-02-23 13:16:50 +01:00
Alejandro Alonso
fea14e9ea6 🐛 Fix switch inspect from html to svg 2024-02-23 10:52:45 +01:00
Andrey Antukh
a6edc184f0 🐛 Fix issues with viewer comments menu 2024-02-23 10:50:55 +01:00
Andrey Antukh
9db714b25d 💄 Add minor cosmetic improvements to viewer comments code
Mainly on comments and header namespace
2024-02-23 10:50:55 +01:00
Aitor
6660ca8e6f ⬆️ Update draft.js 2024-02-23 10:32:55 +01:00
alonso.torres
8de6b0c553 🐛 Add row/column gap to inspect tab 2024-02-23 09:07:34 +01:00
alonso.torres
d45d6af0ec 🐛 Fix problem with measure distances in workspace 2024-02-23 09:07:34 +01:00
alonso.torres
fdf6f0dfef 🐛 Fix problem with snap to guides and zoom 2024-02-23 09:07:34 +01:00
alonso.torres
d51338e754 🐛 Remove after delay event for not-frame shapes 2024-02-23 09:07:34 +01:00
Alejandro
5e6ce26742 Merge pull request #4174 from penpot/palba-bugfixes-001
Bugfixes
2024-02-23 08:51:38 +01:00
Pablo Alba
4390df4b48 🐛 Fix user can detach a copy inside a copy 2024-02-23 08:40:31 +01:00
Pablo Alba
418ec34880 🐛 Fix detaching a copy that has another copy inside produce a validation error 2024-02-23 08:40:31 +01:00
Pablo Alba
bdc303e778 🐛 Fix mixed selection of few components name are truncated 2024-02-23 08:40:31 +01:00
Andrey Antukh
65df775937 💄 Fix naming inconsistencies on layout menu components 2024-02-22 16:45:43 +01:00
Andrey Antukh
87f0e46036 Add performance enhacenements to layout-container menu (part 5)
Refactor and improve performance of align-grid-row related components
2024-02-22 16:35:12 +01:00
Andrey Antukh
0735fa93f6 Add performance enhacenements to layout-container menu (part 4)
Mainly improve performance and minor code refactor on column and row
justify buttons.
2024-02-22 16:35:10 +01:00
Andrey Antukh
2d5500d96f And minor enhancements to the radio-buttons react component
And fix blur handling when on-change is not provided
2024-02-22 16:06:55 +01:00
Andrey Antukh
2170a92dd2 Add performance enhacenements to layout-container menu (part 3)
Refactor and improve performance of gap related components
2024-02-22 15:55:24 +01:00
Andrey Antukh
c1d4fc71a8 💄 Rename is-col? to is-column on layout-container ns 2024-02-22 15:55:03 +01:00
Andrey Antukh
897968939d Add performance enhacenements to layout-container menu (part 2)
Refactor and improve performance of padding related react components
2024-02-22 15:53:43 +01:00
Andrey Antukh
35f3c6e90f 💄 Add cosmetic changes to grid layout editor react components 2024-02-22 15:53:15 +01:00
Andrey Antukh
32ae1bcdc8 🐛 Add missing key prop on grid editor element 2024-02-22 15:53:15 +01:00
Andrey Antukh
593966a30a Add incremental performance enhacements to layout-containers (part 1) 2024-02-22 15:53:14 +01:00
Xaviju
7879d883cf 🐛 Fix ellipsis on color row 2024-02-22 15:49:11 +01:00
Alejandro
8cc4ff0b4c Merge pull request #4183 from penpot/niwinz-staging-migration
🐛 Migration fixes (not components related)
2024-02-22 15:01:58 +01:00
Andrey Antukh
0999ecb2a9 🐛 Fix idempotency problem on fdata migration 25 2024-02-22 14:55:35 +01:00
Andrey Antukh
dec622600d 🐛 Fix incorrect selrect calcultation from shape path 2024-02-22 14:55:35 +01:00
Andrey Antukh
b05421755f 🐛 Fix srepl report query 2024-02-22 14:55:35 +01:00
Belén Albeza
dbcfb2746f 🐛 Fix update library button in libraries modal 2024-02-22 12:27:29 +01:00
alonso.torres
337f52e1bf 🐛 Fix problem with changing cell type in grid 2024-02-22 12:26:03 +01:00
alonso.torres
f4d513b622 🐛 Fix problem with import zip file 2024-02-22 12:26:03 +01:00
alonso.torres
d95d79a7c2 🐛 Moved shortcut for clearing history 2024-02-22 12:26:03 +01:00
alonso.torres
ff88f30c74 🐛 Allow select library colors on gradients 2024-02-22 12:26:03 +01:00
alonso.torres
764d15412f 🐛 Show margin/padding properties outside grid editor 2024-02-22 12:26:03 +01:00
alonso.torres
2942f28880 🐛 Fix problem with layout child properties 2024-02-22 12:26:03 +01:00
alonso.torres
4fb1247045 🐛 Fix proportions for new layouts 2024-02-22 12:26:03 +01:00
alonso.torres
74cc8079bb 🐛 Fix a problem with input rotation for shapes 2024-02-22 12:26:03 +01:00
alonso.torres
9e6db257cc 🐛 Fix problem with strokes and rects 2024-02-22 12:26:03 +01:00
Eva Marco
21927fd54c Merge pull request #4172 from penpot/ladybenko-6982-ui-fixes-design-tab
🐛 UI fixes for the design tab
2024-02-22 08:42:08 +01:00
Alejandro
5883a50520 Merge pull request #4171 from penpot/niwinz-staging-perfix-2
🐛 Bugfixes and  Performance enhancements
2024-02-22 07:09:55 +01:00
Eva Marco
7624797acf ♻️ Update onboarding modals 2024-02-22 00:28:14 +01:00
Alejandro Alonso
5590210088 🐛 Add fix files function to removed :shapes-group from :touched 2024-02-21 16:21:46 +01:00
Belén Albeza
c49d6d4ecf 🐛 Update icon of locked aspect ratio 2024-02-21 09:31:53 +01:00
Belén Albeza
918ecc7b37 🐛 Fix margin of uncollapsed layout item sections in design tab 2024-02-21 09:31:53 +01:00
Alejandro
e7e70b4edd Merge pull request #4173 from penpot/hiru-bugfixes-8
🐛 Detect correctly swapped subinstances with nested components
2024-02-20 18:05:26 +01:00
Andrés Moya
c64464b1b5 🐛 Detect correctly swapped subinstances with nested components 2024-02-20 17:43:27 +01:00
Andrey Antukh
72f7e5bb76 🐛 Add soft size limit for file names 2024-02-20 16:54:40 +01:00
Belén Albeza
b33d114402 🐛 Fix chevron icon behavior on title bars 2024-02-20 16:25:46 +01:00
Belén Albeza
c484c0d667 🐛 Fix UI of clip content + show in viewer icons 2024-02-20 16:25:46 +01:00
Andrey Antukh
3994bf583c Disable props wrapping on layout-container react components 2024-02-20 15:42:02 +01:00
Andrey Antukh
acae8708f5 🐛 Fix ui problem when user selects a recent-color for adding to the assets 2024-02-20 15:28:16 +01:00
Andrey Antukh
d28c7cf061 💄 Add cosmetic changes to colorpicker modal react components 2024-02-20 15:27:44 +01:00
Andrey Antukh
cc9546dd1b 📎 Add documentation assert on add-flow event impl 2024-02-20 15:25:13 +01:00
Eva Marco
47bf121d25 Merge pull request #4158 from penpot/niwinz-staging-perfix-1
 Add performance enhancements for margin-section react component
2024-02-20 13:58:35 +01:00
Andrey Antukh
72937ba091 🐛 Fix styles issues on presence module
The issue happens only when the number of connected sessions
becomes greater that the total number of colors.

The solution is: instead of picking black background we use
the default one.

This PR also improves performance of the presence related
react components.
2024-02-20 13:17:41 +01:00
Belén Albeza
4097dec5a4 🐛 Fix radio buttons UI for boolean operations 2024-02-20 13:00:54 +01:00
Belén Albeza
f1e12015d6 🐛 Fix icon size in buttons 2024-02-20 12:41:49 +01:00
Andrey Antukh
2f242533d2 Add minor performance improvements on workspace presence components 2024-02-20 12:32:37 +01:00
Alejandro
6fdefe69ec Merge pull request #4170 from penpot/niwinz-staging-bugfix-2
🐛 Fix unexpected exception on copy/paste
2024-02-20 10:41:47 +01:00
Andrey Antukh
cf950c426f 🐛 Fix unexpected exception on copy/paste
The exception is caused by a regression introduced in the
refactor of migrations.
2024-02-20 10:18:53 +01:00
Andrey Antukh
541052fee7 ⬆️ Update rumext (new syntax features) 2024-02-20 09:46:53 +01:00
Alejandro
00cea9b215 Merge pull request #4165 from penpot/niwinz-staging-devenv-limits
⬆️ Update devenv
2024-02-20 08:30:24 +01:00
Andrey Antukh
00961808b4 Optimize the layout-item-menu react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
1e7a2b575f 💄 Add mostly cosmetic changes to layout-item ns code 2024-02-19 19:13:39 +01:00
Andrey Antukh
a1a9519cf5 Optimize the layout-item-menu react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
46fca11b38 Optimize the align-self-row react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
71681532cd Optimize the element-behaviour react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
ed336724a0 Optimize the element-behaviour-vertical react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
c7582e7887 Optimize the element-behaviour-horizontal react component 2024-02-19 19:13:39 +01:00
Andrey Antukh
710a357a6e Optimize the margin-section react component 2024-02-19 19:13:39 +01:00
Aitor Moreno
1b10af5cfc Merge pull request #4167 from penpot/ladybenko-6858-opacity-size
🐛 Fix opacity field size
2024-02-19 18:08:08 +01:00
Aitor Moreno
619d46c476 Merge pull request #4168 from penpot/ladybenko-6993-fix-multiline-layer-title
🐛 Add ellipsis to layer title text when inspecting shape
2024-02-19 18:05:39 +01:00
Aitor Moreno
fa50775df2 Merge pull request #4169 from penpot/ladybenko-6756-fix-color-picker-pattern
🐛 Fix color picker gradient for light theme
2024-02-19 18:03:58 +01:00
Aitor Moreno
69ab02fc45 Merge pull request #4159 from penpot/alotor-bugfix-viewer
Alotor bugfix viewer
2024-02-19 17:46:50 +01:00
Belén Albeza
8c657e4172 🐛 Fix color picker gradient for light theme 2024-02-19 17:43:17 +01:00
Belén Albeza
610f5dc5f7 🐛 Add ellipsis to layer title text when inspecting shape 2024-02-19 16:39:07 +01:00
Belén Albeza
32e8098a6d 🐛 Fix opacity field size 2024-02-19 16:21:04 +01:00
Alejandro
35d8fd9d97 Merge pull request #4166 from penpot/hiru-bugfixes-7
🐛 Fix swap in main component with duplicated pages
2024-02-19 15:28:18 +01:00
Andrés Moya
9a9e2af09c 🐛 Fix swap in main component with duplicated pages 2024-02-19 15:21:12 +01:00
Andrey Antukh
dc2b4ddebc ⬆️ Update devenv dockerfile
Mainly version bump for node, kondo and jvm
2024-02-19 14:38:50 +01:00
Andrey Antukh
5573f467b7 📎 Increase devenv limits for multipart requests 2024-02-19 14:28:39 +01:00
Alejandro
5235c5f1dc Merge pull request #4156 from penpot/niwinz-staging-perfix
 Add micro optimizations to radio button react components
2024-02-19 11:58:46 +01:00
Alejandro
60173212e7 Merge pull request #4161 from penpot/hiru-bugfixes-6
Some bugfixes
2024-02-19 11:46:56 +01:00
Alejandro
a6be5bb399 Merge pull request #4150 from penpot/niwinz-staging-migrations
♻️ Add minor refactor to file migrations
2024-02-19 10:42:41 +01:00
alonso.torres
330c0ac9f9 🐛 Fix problem with text proportion lock 2024-02-19 09:39:12 +01:00
alonso.torres
4c81ac4386 🐛 Fix problem with strokes exporting images 2024-02-19 09:39:12 +01:00
alonso.torres
74e57c00af 🐛 Fix create interactions with nested frames 2024-02-19 09:39:12 +01:00
alonso.torres
619b557c80 🐛 Fix anonymous access to shared prototypes 2024-02-19 09:39:12 +01:00
Andrey Antukh
90cb2c4518 🐛 Fix incorrect redirect on login with different user after logout 2024-02-19 09:20:47 +01:00
Andrey Antukh
41794c5f5e Simplify fdata feature helpers 2024-02-19 09:20:47 +01:00
Andrey Antukh
757291644b 🐛 Fix incorrect warning on climit initialization when disabled 2024-02-19 09:20:47 +01:00
Andrey Antukh
a89f16e594 Add better logging config for devenv 2024-02-19 09:20:47 +01:00
Andrey Antukh
b718a282e0 ♻️ Add minor refactor to file migrations
Relevant changes:

- Add the ability to create migration in both directions, defaulting
  to identity if not provided
- Move the version attribute to file table column for to make it more
  accessible (previously it was on data blob)
- Reduce db update operations on file-update rpc method
2024-02-19 09:20:47 +01:00
Alejandro
7ac4b89a0e Merge pull request #4145 from penpot/niwinz-staging-tmp
 Minor improvements on TMP storage API
2024-02-19 07:16:36 +01:00
Aitor
ff3c948056 📎 Add script to find missing mf/use-fn 2024-02-16 15:51:08 +01:00
Andrés Moya
f8b574be81 💄 Improve debug traces of libraries helpers 2024-02-16 14:06:05 +01:00
Andrés Moya
d3dd9ffd9b 🐛 Pack swap component in a single transaction and undo group 2024-02-16 14:06:05 +01:00
Eva Marco
150fa394ff Merge pull request #4151 from penpot/ladybenko-6900-fix-palette-toolbar
🐛 Fix collapsed toolbar/palette position
2024-02-15 16:24:12 +01:00
Eva Marco
14651b1ae5 Merge pull request #4155 from penpot/niwinz-staging-onboarding-fix
🐛 Fix onboarding dialog is not loaded from profile settings
2024-02-15 16:20:11 +01:00
Andrey Antukh
f857836bfa Add micro optimizations to radio button react components 2024-02-15 16:16:46 +01:00
Belén Albeza
415ce339a7 🐛 Fix cropped text for typographies in the small palette 2024-02-15 16:14:08 +01:00
Belén Albeza
261dc553bb 🐛 Fix collapsed toolbar position 2024-02-15 16:14:08 +01:00
Belén Albeza
4c9174969f 🐛 Fix collapsable palette position 2024-02-15 16:14:08 +01:00
Andrey Antukh
443ca0a02c Merge pull request #4137 from penpot/alotor-bugfix-17
Alotor bugfix 17
2024-02-15 16:10:31 +01:00
Eva Marco
862053738a Merge pull request #4149 from penpot/xaviju-fix-margin-detach-button
🐛 Fix detach button position and color info overflow
2024-02-15 15:59:42 +01:00
alonso.torres
4ece2ba148 🐛 Fix problem with calculated margins in flex layout 2024-02-15 15:46:40 +01:00
alonso.torres
2bb2d4ca59 🐛 Fix problem with align-self default 2024-02-15 15:46:40 +01:00
Andrey Antukh
15cd9432b7 🐛 Fix onboarding dialog is not loaded from profile settings 2024-02-15 15:39:33 +01:00
Xaviju
4acc98749c 🐛 Fix ellipsis on color row 2024-02-15 15:21:06 +01:00
Xaviju
9e527e4007 🐛 Fix detach button position 2024-02-15 12:57:03 +01:00
Alejandro Alonso
5cbb3f76c7 🐛 Fix cut/paste component inside a board 2024-02-15 10:57:08 +01:00
Alejandro
c4e707d5a2 Merge pull request #4146 from penpot/alotor-us-6933-keep-aspect-ratio
Add keep aspect ratio flag
2024-02-15 09:37:30 +01:00
alonso.torres
86b4a95875 Fix problem when importing zip files 2024-02-15 09:27:51 +01:00
alonso.torres
ea2173bd30 Add keep aspect ratio flag to image fills 2024-02-15 09:27:51 +01:00
Andrey Antukh
63e74545ab 📎 Add get-raw-file srepl helper 2024-02-14 17:38:53 +01:00
Andrey Antukh
29d48f0a98 Add minor code cleaning on file-update ns 2024-02-14 17:38:53 +01:00
Andrey Antukh
8981e57deb Ensure connection on persisting pointers 2024-02-14 17:36:13 +01:00
Andrey Antukh
ba55d657a4 Prevent adding object map to not loaded pointer-map containers 2024-02-14 17:34:50 +01:00
Andrey Antukh
3212ed9bd1 🐛 Fix incorrect value passed on unhandled error 2024-02-14 17:33:34 +01:00
Belén Albeza
add9c98ba0 🐛 Fix email tags not being shown in invite members modal 2024-02-14 13:15:42 +01:00
Belén Albeza
ee8cdfc7d3 🐛 Fix boolean flatten icon size 2024-02-14 11:55:25 +01:00
Aitor Moreno
26699de71b Merge pull request #4113 from penpot/eva-review-inspect-tab
Update inspect tab
2024-02-14 11:02:20 +01:00
Aitor Moreno
71bc4e5186 Merge pull request #4144 from penpot/superalex-change-stroke-color-from-library-doesnt-work
🐛 Fix change stroke color from library doesn't work
2024-02-14 11:01:28 +01:00
Alejandro Alonso
377d9682da 🐛 Fix default constraints for migrated graphics 2024-02-14 11:00:54 +01:00
Andrey Antukh
a31be7e2ff Use a prefixed dir for storing temp files
And mark them for deletion on JVM exit.
2024-02-14 09:53:54 +01:00
Eva
8ead63cad0 ♻️ Review inspect tab spacing 2024-02-14 09:53:46 +01:00
Andrey Antukh
9649878fd8 Ensure id prop on :data on components-v2 migration 2024-02-14 09:33:02 +01:00
Alejandro Alonso
fa19ce2b5b 🐛 Fix change stroke color from library doesn't work 2024-02-14 07:58:21 +01:00
Alejandro
6fd30d50f4 Merge pull request #4143 from penpot/niwinz-staging-file-gc
♻️ Refactor the file-gc task
2024-02-14 06:48:07 +01:00
Andrés Moya
d654a4faed 🐛 Avoid setting touched in parent when swapping components 2024-02-13 19:38:00 +01:00
Belén Albeza
f152e30737 🐛 Fix shortcuts menu being clipped 2024-02-13 19:36:58 +01:00
Andrey Antukh
8ea82021f0 Add better error report on importing truncated binfile 2024-02-13 19:36:15 +01:00
Andrey Antukh
afd68fa09d 🐛 Properly handle fdata features on file-gc task
It also adds a schema validation process after cleaning. If file
does not validates it will be skiped.
2024-02-13 19:36:10 +01:00
Andrey Antukh
bc3d268f57 Add minor improvements to srepl helpers 2024-02-13 19:09:54 +01:00
Belén Albeza
1415ed30b6 🐛 Fix icon not being shown when asset category had a zero count 2024-02-13 18:42:06 +01:00
Belén Albeza
c824711893 🐛 Replace overlay icons with new ones 2024-02-13 18:41:19 +01:00
Belén Albeza
2633e56a76 🐛 Fix icon size in selects 2024-02-13 18:41:19 +01:00
Belén Albeza
4e152f470b 🐛 Fix overaly checkboxes in prototype tab 2024-02-13 18:41:19 +01:00
Belén Albeza
c89a1b3b27 🐛 Fix extend button style in prototype tab 2024-02-13 18:41:19 +01:00
Andrey Antukh
1cb6f43339 📎 Add srepl fix function for disable fdata features 2024-02-13 17:54:11 +01:00
Andrey Antukh
e8a1c58c5d 🐛 Fix incorrect change detection on srepl helper process-file 2024-02-13 17:54:11 +01:00
Andrey Antukh
39cb4a081b 🐛 Clean legacy features on binfile (v1) importation 2024-02-13 17:54:11 +01:00
Belén Albeza
c336cbe8ab 🐛 Fix text transform buttons order 2024-02-13 12:57:18 +01:00
Belén Albeza
565bf5fbb8 🐛 Fix padding of font size selector 2024-02-13 12:57:18 +01:00
Belén Albeza
d3bf35869a 🐛 Fix font size for modal links 2024-02-13 12:53:46 +01:00
Belén Albeza
d63e5f520e 🐛 Fix opacity display when selecting multiple shapes 2024-02-13 11:44:05 +01:00
Alejandro
9fbdc10971 Merge pull request #4131 from penpot/hiru-bugfixes-4
🐛 Fix update main when there are swapped copies
2024-02-13 10:02:34 +01:00
Andrés Moya
39b5f10529 🐛 Fix update main when there are swapped copies 2024-02-12 17:40:44 +01:00
alonso.torres
af7142e97b New overlay for v2 information 2024-02-12 16:29:47 +01:00
Alejandro
dd3040c56f Merge pull request #4129 from penpot/niwinz-stagoing-debug-on-error
 Add the ability to download a report on internal error
2024-02-12 16:02:05 +01:00
Alejandro Alonso
90d6d38b47 🐛 Fix duplicate component 2024-02-12 15:49:40 +01:00
Andrey Antukh
f62d2085e8 Add the ability to download a report on internal error page 2024-02-12 15:37:29 +01:00
Andrey Antukh
e55d1a3b7f Add minor optimization for d/without-qualified helper 2024-02-12 15:28:07 +01:00
Andrey Antukh
528f0b4f60 💄 Add cosmetic improvements on static page components 2024-02-12 14:55:42 +01:00
Andrey Antukh
722cb6351d 💄 Add minor cosmetic changes to file-update ns 2024-02-12 14:55:42 +01:00
Andrey Antukh
4cd9237f47 🐛 Fix unexpected exception on task-gc
Because table was renamed but the sql on the task function
still uses the old name.
2024-02-12 14:55:42 +01:00
Aitor
b9b66aee85 🐛 Fix dropdown being cut off 2024-02-12 12:19:17 +01:00
Aitor
08c8b938ae 🐛 Fix color picker picking color from library 2024-02-12 12:19:17 +01:00
Aitor
1907884a6d 🐛 Fix create token button size 2024-02-12 12:19:17 +01:00
Aitor
44c4ba08b8 🐛 Show color name when it is from the library 2024-02-12 12:19:17 +01:00
Andrey Antukh
f4ac607958 ♻️ Refactor srepl helpers 2024-02-12 10:21:47 +01:00
Alejandro Alonso
dc67056a8c 🐛 Fix components without root shape for v2 migration 2024-02-12 10:21:47 +01:00
alonso.torres
9f6b82dfc0 🐛 Fix problem with changes files 2024-02-11 17:55:34 +01:00
alonso.torres
c17d2c1aba 🐛 Fix problems when moving shapes in layouts 2024-02-11 17:55:34 +01:00
alonso.torres
b6be1c2e1a 🐛 Fix line break on flex/grid options 2024-02-11 17:55:34 +01:00
alonso.torres
ed9ee210e4 🐛 Change icon to align self stretch 2024-02-11 17:55:34 +01:00
alonso.torres
0f50afc4c3 🐛 Fix typo when grid board selected 2024-02-11 17:55:34 +01:00
alonso.torres
4e1353caf1 🐛 Fix problems with grid layout and flex children absolute 2024-02-11 17:55:34 +01:00
alonso.torres
c8d19c846a 🐛 Fix problems with flex child properties in components 2024-02-11 17:55:34 +01:00
Andrey Antukh
d6114d0a2b Merge branch 'translations' into staging 2024-02-09 15:01:17 +01:00
Andrey Antukh
3a6a20e1da Merge remote-tracking branch 'weblate/develop' into translations 2024-02-09 14:59:22 +01:00
Revenant
aa360dd0aa 🌐 Add translations for: Malay.
Currently translated at 7.5% (102 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ms/
2024-02-09 14:58:31 +01:00
Andrés Moya
80feaaeed3 🐛 Improve the smartness of the ref-shape-not-found repair script 2024-02-09 12:07:24 +01:00
Andrés Moya
206f9acfd9 Make shape ref smarter to find some subtle validation error 2024-02-09 12:07:24 +01:00
Andrey Antukh
f9af2a16b9 Add the ability to create a file snapshot on repair 2024-02-09 12:01:09 +01:00
Andrey Antukh
c07dbc9843 📎 Move repair and validate srepl helpers to srepl.main 2024-02-09 12:01:09 +01:00
Andrey Antukh
43b8ccb52e Improve error handling on websocket code 2024-02-09 12:01:09 +01:00
Andrey Antukh
ec2eb3d406 🐛 Fix broken text shapes without position-data on comp-v2 migration 2024-02-09 12:01:09 +01:00
Andrey Antukh
6d35cb2eb4 Improve snapshot related internal API
This commit also adds the ability to take snapshot of all files
of the team in a single run/transaction.
2024-02-09 12:01:09 +01:00
Andrey Antukh
aaf457a792 Add support for ::sql/order-by on db/sql layer 2024-02-09 12:01:09 +01:00
Alejandro Alonso
8d65998cc3 🐛 Fix remove nested roots on components v2 migration 2024-02-09 12:01:09 +01:00
Andrey Antukh
a5fc42cafa Normalize ids parsing on srepl helpers 2024-02-09 12:01:09 +01:00
Alejandro Alonso
66eca9ba4a 🐛 Fix conflict on components path for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso
6fa22c3a04 🐛 Fix components with non existing component-ids for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso
0c682ea75d 🐛 Fix components with compont-root on library for v2 migration 2024-02-09 12:01:09 +01:00
Alejandro Alonso
bdb16109d5 🐛 Fix empty components on v2 migration 2024-02-09 12:01:09 +01:00
Madalena Melo
ced357dcca 🌐 Added translation for: Malay. 2024-02-09 11:25:49 +01:00
Aitor
07693a46f2 🐛 Fix thumbnails not being cleared immediately 2024-02-08 17:25:14 +01:00
Belén Albeza
6b60b10cfb 🐛 Fix multi radius input being reset to zero on blur 2024-02-08 17:13:45 +01:00
Belén Albeza
acef775131 🐛 Fix mixed values displays for measurements in the design tab 2024-02-08 17:13:45 +01:00
Eva
d91b3d4fb6 ♻️ Update spacing on assets tab 2024-02-08 09:37:51 +01:00
Alejandro
de7c61e5ca Merge pull request #4107 from penpot/staging-migration
 Improvements to migration process
2024-02-08 08:32:33 +01:00
Alejandro
a31fbabc10 Merge pull request #4103 from penpot/niwinz-staging-bugfix-12
💄 Minor cosmetic changes
2024-02-08 08:22:50 +01:00
Alejandro
5b2227cf4f Merge pull request #4111 from penpot/alotor-bugfix-16
Alotor bugfix 16
2024-02-07 13:14:05 +01:00
alonso.torres
84537b607e 🐛 Fix problem with numeric inputs 2024-02-07 12:59:41 +01:00
alonso.torres
3d66ae21de 🐛 Fix problem with line caps 2024-02-07 11:09:54 +01:00
alonso.torres
8032a22f14 🐛 Fix problem when moving absolute positioned shapes 2024-02-07 09:49:01 +01:00
alonso.torres
5ed1ff6d41 🐛 Fix error when changing shadow color 2024-02-07 09:49:01 +01:00
Andrey Antukh
d2626ead0b Add better email cleaning mechanism
This commit separates the email cleaning mechanism to a separated
function, and enables a proper cleaning of `mailto:` prefix, usually
found on invitations because users just copy and paste from external
source.
2024-02-07 09:14:07 +01:00
Andrey Antukh
040b336ef9 Add helper for restoring team after migration to comp-v2 2024-02-06 19:20:25 +01:00
Andrey Antukh
2331647ec6 🐛 Add missing team-profile rels cloning on duplicate-team srepl helper 2024-02-06 19:18:22 +01:00
Andrey Antukh
7a50cb3ff9 🐛 Fix broken restore snapshot function 2024-02-06 19:17:59 +01:00
Andrey Antukh
a71e7f7906 Remove partitioning from task table
Which causes strange random delays when some row is moved from one
partition to other. Also, there are evidences that partitioning is
not aporting real value here.
2024-02-06 17:23:18 +01:00
Andrey Antukh
267045e113 Improve migration scripts 2024-02-06 17:22:20 +01:00
Belén Albeza
a41ce5b8b7 🐛 Fix search bar being wider when recent-fonts is nil 2024-02-06 16:30:13 +01:00
Belén Albeza
d737b9501b 🐛 Fix color of email input when inviting members to team 2024-02-06 16:29:41 +01:00
Belén Albeza
79130b4da9 Improve a11y of paragraphs in modal + layout fixes 2024-02-06 16:29:10 +01:00
Andrés Moya
836781be42 🐛 Fix detection of root in a particular case (affects many places) 2024-02-06 14:08:27 +01:00
Andrés Moya
42a0152c3a 🐛 Fix frame-id when adding shapes to a main 2024-02-06 14:08:27 +01:00
Aitor
efddd6c35f 🐛 Fix thumbnail in shared library not updated 2024-02-06 10:09:41 +01:00
alonso.torres
564843b297 Add border to rulers 2024-02-06 10:07:22 +01:00
Eva
1df4118523 ♻️ Add border to UI elements 2024-02-06 10:07:22 +01:00
alonso.torres
4c683bb10c 🐛 Fix problem with numeric inputs 2024-02-05 20:14:52 +01:00
alonso.torres
512e9b2070 🐛 Fix problem with shortcut colors and colorpicker 2024-02-05 20:14:52 +01:00
alonso.torres
b8b40fc7ef 🐛 Fix problem with flex propagation 2024-02-05 20:14:52 +01:00
alonso.torres
a64854bf72 🐛 Fix icon for grid manual position 2024-02-05 20:14:52 +01:00
alonso.torres
6f48f8eceb 🐛 Fix problem with guides when duplicating components 2024-02-05 20:14:52 +01:00
alonso.torres
769aa16cc4 🐛 Fix visual problem with gradient stops 2024-02-05 20:14:52 +01:00
alonso.torres
e97245c762 🐛 Fix shadows color using libraries 2024-02-05 20:14:52 +01:00
alonso.torres
79963d1eab 🐛 Fix problem with cursor disapeering on top toolbar 2024-02-05 20:14:52 +01:00
alonso.torres
c90af362b3 🐛 Fix frame titles clip to the frame width 2024-02-05 20:14:52 +01:00
alonso.torres
7ca30a313d 🐛 Make default border inside 2024-02-05 20:14:52 +01:00
Andrey Antukh
0e380a97cc 💄 Add minor cosmetic improvement to worker ns 2024-02-05 20:11:20 +01:00
Andrey Antukh
275c8b5860 💄 Fix logging level on rpc climit ns 2024-02-05 20:10:57 +01:00
Andrey Antukh
8231890ee4 🔥 Remove unnecesary line on audit ns 2024-02-05 20:10:44 +01:00
Yessenia Villarte Vaca
9126adacde 🌐 Add translations for: Spanish (Latin America).
Currently translated at 10.3% (139 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es_419/
2024-02-02 14:01:50 +01:00
Eva
ced1f60940 ♻️ Fix swap component 2024-02-02 12:03:35 +01:00
Alejandro
532a656daf Merge pull request #4097 from penpot/niwinz-staging-bugfix-11
🐛 Fix incorrect metrics reporting on climit
2024-02-02 11:23:48 +01:00
Andrey Antukh
7db883e8b7 🐛 Fix incorrect metrics reporting on climit 2024-02-02 11:12:23 +01:00
Andrey Antukh
79105e8034 Merge pull request #4067 from penpot/staging-migration
 & 🐛 More fixes and performance enhacements for the migration process
2024-02-02 10:56:49 +01:00
Alejandro Alonso
c6fb211874 🐛 Fix copies of detached elements migration 2024-02-02 10:54:34 +01:00
Andrés Moya
750ea4fe3f 🐛 Add a fix for component heads that are not groups or frames 2024-02-02 10:54:34 +01:00
Andrey Antukh
04fd4e12d7 🐛 Fix invalid transforms on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh
9eb902c682 🐛 Fix broken grids defaults on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh
dba10ffd9b 🐛 Fix broken circle shapes geometry on comp-v2 migration 2024-02-02 10:54:34 +01:00
Andrey Antukh
3a401f69fd Simplify srepl helper for shape deletion 2024-02-02 10:54:34 +01:00
Andrey Antukh
e8c35c2de6 🐛 Fix invalid shape type :icon on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
a8cf072bda Add proper error report on binfile/v1 exportation 2024-02-02 10:54:33 +01:00
Andrey Antukh
3d462e3821 Split geometry fixes form fix-misc fn on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
8528de642f 🐛 Remove :thumbnail prop from all shapes on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrés Moya
fb7d3676d2 🐛 Fix components without id 2024-02-02 10:54:33 +01:00
Andrey Antukh
09ba1c262b 🐛 Add minor adjustment to migration 33 to accept and fix invalid root frames 2024-02-02 10:54:33 +01:00
Andrey Antukh
d4c91ae44b 💄 Print file name on process-file! helper progress report 2024-02-02 10:54:33 +01:00
Andrey Antukh
e216b10716 🐛 Fix raw data export import on debug interface 2024-02-02 10:54:33 +01:00
Andrey Antukh
5e4e706033 Use proper executor for cache on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
7968bffc38 💄 Minor cosmetic change on pages-seq helper 2024-02-02 10:54:33 +01:00
Andrey Antukh
733825edfa Optimize d/mapm helper using reduce-kv 2024-02-02 10:54:33 +01:00
Andrey Antukh
893a8992c3 Add progress reporting on process-files! srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh
f97931647c Add helper for mark for deletion invalid files 2024-02-02 10:54:33 +01:00
Andrey Antukh
13ca5d1f1a Add minor improvements to process-files! srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh
db5946d1ab 🐛 Fix broken points on image shapes in comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
43c13ed432 🐛 Add additional fix to fix-percents function on svg parse 2024-02-02 10:54:33 +01:00
Andrey Antukh
b6d53c9ded 📎 Update devenv logging config 2024-02-02 10:54:33 +01:00
Andrey Antukh
db622cece8 Use better default for svgo on frontend code 2024-02-02 10:54:33 +01:00
Andrey Antukh
a8ab883c07 🐛 Use correct default for r on parsing svg circle 2024-02-02 10:54:33 +01:00
Andrey Antukh
fc0a4fa5b7 🐛 Ignore style attr on fix-percents function 2024-02-02 10:54:33 +01:00
Alejandro Alonso
8cc3669aac Improve validator syntax 2024-02-02 10:54:33 +01:00
Alejandro Alonso
2924791cb0 🐛 Fix non-root copy only allowed inside a copy migration error 2024-02-02 10:54:33 +01:00
Andrey Antukh
7c0a63c7da Add minor improvements to comp-v2 migration srepl helper 2024-02-02 10:54:33 +01:00
Andrey Antukh
26f4082b5f 📎 Add debug helpers for jvm/tap 2024-02-02 10:54:33 +01:00
Andrey Antukh
036bf84ecd 🐛 Set proper order on comp-v2 migration fixes 2024-02-02 10:54:33 +01:00
Andrey Antukh
c4ee88dc66 🐛 Add fix for percent number on style attrs on parsing svg 2024-02-02 10:54:33 +01:00
Andrey Antukh
03eca0d9a2 🐛 Repair shape points if it is possible on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
3ea737deb1 🐛 Remove paths that can't be repaired on comp-v2 migration 2024-02-02 10:54:33 +01:00
Andrey Antukh
0ea623487c Add better validation for point, matrix and rect types 2024-02-02 10:53:29 +01:00
Alejandro Alonso
5baa9e8fb6 🐛 Fix shape should not be component root migration error 2024-02-02 10:53:29 +01:00
Andrey Antukh
e43380ad61 🐛 Properly remove invalid text shapes on comp-v2 migration 2024-02-02 10:53:29 +01:00
Andrey Antukh
9ca7c4280c 💄 Fix minor cosmetic issues on components-v2 feature ns 2024-02-02 10:53:29 +01:00
Andrey Antukh
295d9568c8 🐛 Fix incompatibilities of old file migrations with new code 2024-02-02 10:53:29 +01:00
Andrey Antukh
04be6b13be 🐛 Fix invalid colors on file library on comp-v2 migration 2024-02-02 10:53:29 +01:00
Andrés Moya
e4e566240f 🐛 Add fix for removing v2 remains in v1 files 2024-02-02 10:53:29 +01:00
Andrés Moya
daf77ecc5f 🐛 Enhande handling of detached shapes during migration fixes 2024-02-02 10:53:29 +01:00
Alejandro Alonso
0fd6cacd17 🐛 Fix parent not found, adding migration 2024-02-02 10:53:29 +01:00
Andrey Antukh
6d73685f3a Optimize file validation process 2024-02-02 10:53:29 +01:00
Andrey Antukh
f104cc5477 Improve performance on creating component from graphic
About 25% speed improvement on average on single file migration process
2024-02-02 10:53:29 +01:00
Alejandro
c70acb1570 Merge pull request #4090 from penpot/alotor-drag-component-instance
 Change drag component to instantiate on enter the viewport
2024-02-02 09:42:48 +01:00
Andrey Antukh
60fbcc3e4b Merge pull request #4094 from penpot/ladybenko-6828-fix-text-selection
🐛 Fix text options & font selector in design tab
2024-02-02 08:34:31 +01:00
Alejandro
a980c102be Merge pull request #4068 from penpot/niwinz-staging-bugfix-8
🐛 Fix incorrect behavior of climit subsystem and adapt related code
2024-02-02 07:18:56 +01:00
Andrey Antukh
a005bf63a2 Merge pull request #4095 from penpot/alotor-bufixes-14
Bug fixing
2024-02-01 19:16:01 +01:00
Andrey Antukh
a5c6d78ee5 ♻️ Fix some fundamental bugs on climit module
The climit previously of this commit is heavily used inside a
transactions, so in heavy contention operation such that file thumbnail
creation can cause a db pool exhaust.

This commit fixes this issue setting up a better resource limiting
mechanism that works outside the transactions so, contention will
no longer hold an open connection/transaction.

It also adds general improvement to the traceability to the climit
mechanism: it now properly logs the profile-id that is currently
cause some contention on specific resources.

It also add a general/root climit that is applied to all requests
so if someone start making abussive requests, we can clearly detect
it.
2024-02-01 17:37:49 +01:00
Andrey Antukh
658c26014b 💄 Define a RPC schema as standalone var for create-file-thumbnail 2024-02-01 17:24:42 +01:00
Andrey Antukh
dabb9d0a82 Improve internal API of retry mechanism 2024-02-01 17:24:42 +01:00
Andrey Antukh
16a051d7e0 Improve efficiency of thumbnails creation RPC methods
Moving the retry mechanism out of the transaction
2024-02-01 17:24:42 +01:00
Andrey Antukh
82b10ecb87 Refactor comments RPC methods to use schema instead of spec 2024-02-01 17:24:42 +01:00
Andrey Antukh
5accbd511f Improve quote data structure validation 2024-02-01 17:24:42 +01:00
Andrey Antukh
e7a27759e6 🐛 Fix react warning on isPinned unrecognized prop 2024-02-01 17:24:42 +01:00
Andrey Antukh
3001476dbc Do not wrap in sm/define on rpc methods
Because is redundant operation
2024-02-01 17:24:42 +01:00
Andrey Antukh
a9e7ed57d9 Use proper exceptions on internal db functions 2024-02-01 17:24:41 +01:00
alonso.torres
3a260825b9 🐛 Fix problem with multiplayer cursors 2024-02-01 17:05:12 +01:00
alonso.torres
7fa47d68a8 🐛 Fix problems with text gradients 2024-02-01 17:05:12 +01:00
Belén Albeza
a5239c1cb6 🐛 Fix bad background for new team button in light theme 2024-02-01 16:21:00 +01:00
Belén Albeza
2298252379 🐛 Fix font-selector current font tick being misaligned in full size dropdown 2024-02-01 16:21:00 +01:00
Belén Albeza
669d928bbf 🐛 Fix font-selector not autofocusing and remove its inner drop shadow 2024-02-01 15:09:04 +01:00
Belén Albeza
0b3cff1a9f 🐛 Fix spacing in Design tab / Text options 2024-02-01 14:29:08 +01:00
alonso.torres
f1768c5a07 🐛 Fix problems with inspect and texts 2024-02-01 11:32:35 +01:00
alonso.torres
b0d723282b 🐛 Fix problem when export not getting new change 2024-02-01 10:32:44 +01:00
alonso.torres
497b581576 Change drag component to instantiate on enter the viewport 2024-02-01 10:23:34 +01:00
alonso.torres
334d1fd9b3 🐛 Change order of contraints options panel 2024-02-01 10:23:06 +01:00
alonso.torres
188f5c6167 🐛 Fix problem with snap points 2024-02-01 10:23:06 +01:00
alonso.torres
e474accb61 🐛 Fix problem with components thumbnails single column 2024-02-01 10:23:06 +01:00
Alejandro
f75da999dc Merge pull request #4089 from penpot/niwinz-staging-bugfix-10
🐛 Fix issues with attrs->props function
2024-01-31 17:51:41 +01:00
Andrey Antukh
457feedec4 🐛 Fix many issues svg/attrs->props function 2024-01-31 17:41:29 +01:00
Andrey Antukh
1de9171d50 Add mask-type style parsing (react now supports it) 2024-01-31 17:32:37 +01:00
Andrey Antukh
4a4aabd230 Merge pull request #4088 from penpot/alotor-bugfixes-13
Alotor bugfixes 13
2024-01-31 17:26:20 +01:00
alonso.torres
ace890c809 🐛 Fix problem when changing main component with grid elements 2024-01-31 16:59:35 +01:00
alonso.torres
cea096f06c Add debug renderer for grid-layout cells 2024-01-31 16:59:35 +01:00
alonso.torres
a853314e3f 🐛 Fix problem with text editor alignment 2024-01-31 16:59:35 +01:00
alonso.torres
1f2f70fcd4 New menu entry for change theme 2024-01-31 16:59:35 +01:00
alonso.torres
14584ef920 🐛 Fix problem with debug panel and light theme 2024-01-31 16:59:35 +01:00
alonso.torres
f6b182a3b5 🐛 Fix problem calculating selrect for certain paths 2024-01-31 16:59:35 +01:00
alonso.torres
02ab545cda 🐛 Fix problem with flex layout controls for padding, gap and margin 2024-01-31 16:59:35 +01:00
alonso.torres
2b715851e1 🐛 Fix proportional scaling with grid layout 2024-01-31 16:59:35 +01:00
alonso.torres
994d08b479 🐛 Fix problem refreshing layouts 2024-01-31 16:59:35 +01:00
alonso.torres
051859969c 🐛 Fix problem when creating frames contining paths 2024-01-31 16:59:35 +01:00
Belén Albeza
f7ad3e37a4 🐛 Fix selected text not being visible 2024-01-31 16:59:12 +01:00
Alejandro Alonso
41d6261ef3 🐛 Fix duplicate component 2024-01-31 16:40:17 +01:00
Alejandro
712130495e Merge pull request #4085 from penpot/niwinz-staging-bugfix-9
🐛 Fix team photo handling on binfile/v2 export-import operation
2024-01-31 13:03:05 +01:00
Andrey Antukh
2661d6c122 🐛 Fix team photo handling on binfile/v2 export-import operation 2024-01-31 12:27:31 +01:00
Belén Albeza
d70fc33689 Show loading message in Libraries modal 2024-01-31 11:19:49 +01:00
Pablo Alba
8bd10c3c04 🐛 Fix weird positioning of component mixing undos and cut/paste 2024-01-31 09:32:30 +01:00
Alejandro
4c815998f8 Merge pull request #4082 from penpot/niwinz-staging-binfile-join
📎 Add helper for check not referenced media
2024-01-31 07:27:05 +01:00
Alejandro Alonso
36dce3ddbc 🐛 Fix dotted strokes 2024-01-30 20:32:23 +01:00
Andrey Antukh
4e9b92b857 📎 Add helper for check not referenced media 2024-01-30 19:30:05 +01:00
Alejandro
e1befadc18 Merge pull request #4079 from penpot/hiru-enhance-debug-tool
🔧 Improve debug tool
2024-01-30 18:09:41 +01:00
Andrés Moya
891dab7f06 🔧 Improve debug tool 2024-01-30 18:03:20 +01:00
Alejandro
a6e8d408b5 Merge pull request #4081 from penpot/eva-change-shortcut
♻️ Change shortcut for change theme
2024-01-30 17:00:46 +01:00
Alejandro
24faba67d8 Merge pull request #4080 from penpot/superalex-improve-debug-shape-info
❇️ Allow select text on debug shape info panel
2024-01-30 16:51:09 +01:00
Eva
8f004c0c75 ♻️ Change shortcut for change theme 2024-01-30 16:47:34 +01:00
Alejandro
86f09fa028 Merge pull request #4077 from penpot/niwinz-staging-binfile-join
♻️ Unify binfile exportation code
2024-01-30 16:43:17 +01:00
Alejandro Alonso
208b06d9cb ❇️ Allow select text on debug shape info panel 2024-01-30 16:36:21 +01:00
Andrey Antukh
cdf312fdd9 Add better progress reporting
For components migration and for binfile import process
2024-01-30 16:27:16 +01:00
Andrey Antukh
7f60946204 ♻️ Refactor exportation and duplicate mechanism
Previously the file processing was implemented 3 times using similar
approaches bug each own with its own bugs. This PR unifies the
loging to a single implementation used by the 3 operations.
2024-01-30 16:27:16 +01:00
Eva
153bb752a4 ♻️ Add new exceptions for light theme 2024-01-30 16:08:08 +01:00
Eva
a882d0bf6d ♻️ Update basic color palette 2024-01-30 16:08:08 +01:00
Andrés Moya
a85a7c74c3 Rename "Library backup" to "Main components" 2024-01-30 13:36:25 +01:00
alonso.torres
7aeb5498a1 🐛 Fix problem with grid component synchronization 2024-01-30 11:10:36 +01:00
Pablo Alba
be31371892 🐛 Fix bad page-id on undo delete component 2024-01-30 09:34:33 +01:00
Pablo Alba
3620e6b4d7 🐛 Change the naming convention of some swap things 2024-01-30 09:34:33 +01:00
alonso.torres
440983d2b9 Add new debug panel 2024-01-29 15:26:23 +01:00
Belén Albeza
0a69bc03b0 🐛 Fix pin button color in dashboard/projects 2024-01-29 15:07:24 +01:00
Alejandro
0c302e30c9 Merge pull request #4069 from penpot/niwinz-main-bugfix-1
🐛 Fix incorrect props handling on profile registration
2024-01-29 13:18:43 +01:00
Andrey Antukh
2fa06baa36 🐛 Fix incorrect props handling on profile registration 2024-01-29 10:29:18 +01:00
Oğuz Ersen
4ead40b640 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2024-01-28 12:01:44 +01:00
Aitor Moreno
094d11f972 Merge pull request #4059 from penpot/superalex-fix-canvas-messages
🐛 Fix inspect and edit grid canvas messages
2024-01-26 14:41:11 +01:00
Alejandro Alonso
4537576a6d 🐛 Fix inspect and edit grid canvas messages 2024-01-26 14:17:26 +01:00
Alejandro
4909e8bc74 Merge pull request #4056 from penpot/alotor-bugfixes-11
Bugfixing (general and Safari)
2024-01-26 11:50:33 +01:00
Madalena Melo
f0fc3a5d84 🌐 Deleted translation: Abkhazian. 2024-01-26 10:53:00 +01:00
Madalena Melo
7183b52f4c 🌐 Added translation for: Abkhazian. 2024-01-26 10:52:01 +01:00
alonso.torres
9965fbc92b 🐛 Fix text editor for Safari 17 2024-01-26 09:26:32 +01:00
alonso.torres
919f6d246b 🐛 Fix problem with offset colorpicker in Safari 2024-01-26 09:26:32 +01:00
alonso.torres
c8593b1c18 🐛 Fix get name from file when importing 2024-01-26 09:26:32 +01:00
alonso.torres
50774bebb3 🐛 Fix problem with gradient and rotations in booleans 2024-01-26 09:26:32 +01:00
alonso.torres
46b767ab0b 🐛 Fix fast moving drawing and snap interaction 2024-01-26 09:26:32 +01:00
alonso.torres
7ddfdb1e15 🐛 Fix grid layout controls being clipped by scroll 2024-01-26 09:26:32 +01:00
alonso.torres
a0426d14cc 💄 Remove red debug background 2024-01-26 09:26:32 +01:00
alonso.torres
582ae6a850 🐛 Fix problem with menu and proportional scaling 2024-01-26 09:26:32 +01:00
alonso.torres
47a4c6b0c1 🐛 Fix problem uploading svg files into assets 2024-01-26 09:26:32 +01:00
Andrey Antukh
6bc6f7ae7f Merge pull request #4030 from penpot/azazeln28-bugfixes-4
Azazeln28 bugfixes 4
2024-01-25 23:25:31 +01:00
Andrey Antukh
a10090974e Merge pull request #4053 from penpot/ladybenko-6674-icons
 Use new icons for feedback, pin and download + refactor the pin button
2024-01-25 23:24:14 +01:00
Andrey Antukh
a0a7b0dc7d Merge pull request #4055 from penpot/staging-migration
🐛 Migration bugfixes
2024-01-25 20:59:28 +01:00
Andrey Antukh
623b4a9858 🐛 Remove empty text shapes on comp-v2 migration 2024-01-25 18:05:57 +01:00
Andrey Antukh
b1d33d4c15 🐛 Add missing shape name on comp-v2 migration 2024-01-25 17:58:55 +01:00
Andrey Antukh
1a3c07abdb 🐛 Remove completely broken shapes on comp-v2 migration 2024-01-25 17:31:27 +01:00
Andrey Antukh
adffd1f000 🐛 Fix text shapes content internal data type incosistency 2024-01-25 17:21:05 +01:00
Andrey Antukh
9f80ddd125 🐛 Fix path shapes that does not have :content attr 2024-01-25 17:01:08 +01:00
Andrey Antukh
0e724ac821 🐛 Add better fix for parsing svg-dimensions
That covers more corner cases
2024-01-25 16:43:49 +01:00
Andrey Antukh
a2a61e99a7 🐛 Fix invalid values on colors and typografies on fdata 2024-01-25 16:33:53 +01:00
Belén Albeza
8798ff937d Use new icons for feedback, pin and download + refactor the pin button 2024-01-25 16:25:42 +01:00
Alejandro
d5aa4f3ee4 Merge pull request #4050 from penpot/niwinz-staging-bugfix-8
🐛 Fix incorrect props handling on profile registration
2024-01-25 16:14:19 +01:00
Andrey Antukh
faa4467b02 Merge pull request #4024 from penpot/staging-migration
🐛 Bugfixes and enhancements to the components migration process
2024-01-25 16:11:41 +01:00
Andrey Antukh
0c8aba6be0 🐛 Fix incorrect parsing of svg transform attr 2024-01-25 16:03:31 +01:00
Andrey Antukh
7ae308c8c9 🐛 Remove page background color it it has an invalid rgb color string 2024-01-25 16:03:31 +01:00
Alejandro Alonso
f864424d14 🐛 Fix parent not found 2024-01-25 16:03:31 +01:00
Andrey Antukh
317f83e3ec 🐛 Fix edge case on parsing svg viewbox 2024-01-25 16:03:31 +01:00
Andrey Antukh
75576c341d 🐛 Fix broken bool shapes on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh
70b57f92b4 🐛 Fix broken path content on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh
df4be5106b 🐛 Fix text shapes wrongly converted to path in comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh
66c07e1336 Reapply again all file migrations on comp-v2 migration 2024-01-25 16:03:31 +01:00
Andrey Antukh
e6766bac8f Set correct order of filtering teams on migration function 2024-01-25 16:03:31 +01:00
Andrey Antukh
0d5c1811cf 🐛 Fix edge cases on retrieving href-id on svg to shapes conversion 2024-01-25 16:03:31 +01:00
Andrey Antukh
1b3e68f430 Improve partitioning and graphics error skiping mechanism
On the migration functions
2024-01-25 16:03:31 +01:00
Andrey Antukh
326be0df4f 🐛 Fix incorrect type supposition on attr inheritance on parsing svg 2024-01-25 16:03:31 +01:00
Andrey Antukh
3986543293 📎 Add missing IEquiv implementation for luxon DateTime type 2024-01-25 16:03:31 +01:00
Andrey Antukh
3f97b3a112 🐛 Fix minor issues on migration code 2024-01-25 16:03:30 +01:00
Andrey Antukh
8d0afd8c96 🐛 Add migration for fix invalid shadows 2024-01-25 16:03:30 +01:00
Andrés Moya
17a208d67b 🐛 Add validation fix for false non root copies 2024-01-25 16:03:30 +01:00
Andrés Moya
cceb35b053 🐛 Ensure detach in migration fixes always works 2024-01-25 16:03:30 +01:00
Andrés Moya
3b0d654b6d 💄 Review naming and comments 2024-01-25 16:03:30 +01:00
Andrey Antukh
3b929041f2 🐛 Fix incorrect percent number parsing on reading svg 2024-01-25 16:03:30 +01:00
Andrey Antukh
2950259f97 🐛 Fix invalid text shapes with invalid nodes 2024-01-25 16:03:30 +01:00
Andrey Antukh
e4f4ab9221 🐛 Fix invalid page flows on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh
aaeb8c8868 🐛 Fix components with bool shape as root on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh
4ab4ad96f0 🐛 Resolve objects-map on srepl/get-file helpers 2024-01-25 16:03:30 +01:00
Andrey Antukh
0d33779c95 Add support for reporting and partitions on comp-v2 migration code 2024-01-25 16:03:30 +01:00
Andrés Moya
db21525485 🐛 Add validation check for duplicated children 2024-01-25 16:03:30 +01:00
Andrés Moya
00e894d801 🐛 Add validation fix for duplicated children 2024-01-25 16:03:30 +01:00
Andrés Moya
d69db0b337 🐛 Add one more validation fix in migration 2024-01-25 16:03:30 +01:00
Andrés Moya
02cb75209c 💄 Unify source code style of repair functions 2024-01-25 16:03:30 +01:00
Andrés Moya
c679b04ad5 🐛 Avoid adding empty attributes on update if they doesn't exist 2024-01-25 16:03:30 +01:00
Andrés Moya
1d21bd34f6 🐛 Check orphan copies before affecting later checks 2024-01-25 16:03:30 +01:00
Andrés Moya
1f5991112d 🐛 Add two more fixes to v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh
3bbd2023a4 🐛 Fix incorrect validation of shape geom attrs
Requied validation in a subset of supported shapes
2024-01-25 16:03:30 +01:00
Andrey Antukh
35da01bac9 🐛 Fix pages with shapes with to too big gemetry vals on comp-v2 migration 2024-01-25 16:03:30 +01:00
Andrey Antukh
5b84054eaa 🐛 Fix shape validation schema 2024-01-25 16:03:30 +01:00
Andrey Antukh
166d2b7b68 🐛 Fix broken fills and strokes on comp-v2 migration 2024-01-25 16:03:29 +01:00
Andrey Antukh
6ad6e6f856 🐛 Fix objects-map and pointer-map issues on file crud 2024-01-25 16:03:29 +01:00
Andrey Antukh
3e89a22600 🐛 Remove broken and unfixable image shapes on comp-v2 migration 2024-01-25 16:03:29 +01:00
Andrey Antukh
ba3c42e62c 🐛 Fix broken layout and layout-gap props on migrating to comp-v2 2024-01-25 16:03:29 +01:00
Andrey Antukh
3d84270f50 🐛 Fix invalid ##Inf value on layout-gap on migrating to comp-v2 2024-01-25 16:03:29 +01:00
Andrey Antukh
c7fa7aa7bc 🐛 Add migrations for fix shape geometry missing props 2024-01-25 16:03:29 +01:00
Andrey Antukh
ec1bcada86 🐛 Fix recent colors on components migration 2024-01-25 16:03:29 +01:00
Andrey Antukh
0a5e15b916 ♻️ Simplify components-v2 migration functions impl 2024-01-25 16:03:29 +01:00
Andrey Antukh
02d8208553 📎 Add temporal repl and log4j config 2024-01-25 16:03:29 +01:00
Andrey Antukh
f73ce6572c Improve rollback handlong on db ns 2024-01-25 16:03:29 +01:00
Andrey Antukh
997441eff3 📎 Fix typo on validation log message 2024-01-25 16:03:29 +01:00
Andrey Antukh
c58302ffc4 🔥 Remove unnecessary do on file validation ns 2024-01-25 16:03:27 +01:00
Andrey Antukh
f9d63dba00 🐛 Fix incorrect assumption about parseFloat on fixing percent
on parsing and normalizing svg elements
2024-01-25 15:59:45 +01:00
Andrey Antukh
9b59b92464 🐛 Improve not-found error report on s3 storage backend 2024-01-25 15:59:45 +01:00
Andrey Antukh
b582998228 🐛 Add migration for fix bool shapes which does not have :bool-content attr 2024-01-25 15:59:45 +01:00
Andrey Antukh
33ad2d94fb 🐛 Add proper default to cx and cy when parsing svg circle elements 2024-01-25 15:59:45 +01:00
Andrey Antukh
161a55e166 Optimize general case of without-nils
Performance gains up to x6
2024-01-25 15:59:45 +01:00
Andrey Antukh
944d167bbb Simplify SVGO module API 2024-01-25 15:59:45 +01:00
Andrey Antukh
4fc391763e Prevent unexpected exception raising on closing s3 file 2024-01-25 15:59:45 +01:00
Andrey Antukh
92643b29c1 Improve internal cache api 2024-01-25 15:59:45 +01:00
Aitor
74e10c3629 🐛 Fix viewer header hover 2024-01-25 13:32:22 +01:00
Yessenia Villarte Vaca
5276afe349 🌐 Add translations for: Spanish (Latin America).
Currently translated at 7.4% (100 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es_419/
2024-01-25 13:01:45 +01:00
Yessenia Villarte Vaca
2b8d80a9b2 🌐 Add translations for: Spanish.
Currently translated at 99.4% (1336 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2024-01-25 13:01:45 +01:00
Alejandro
db5c16fb1d Merge pull request #4048 from penpot/niwinz-staging-bugfix-7
🐛 Fix unexpected exception on consecutive delete files with shift key pressed
2024-01-25 13:00:15 +01:00
Eva
a24d5676a6 Add change theme shortcut on help section 2024-01-25 12:37:31 +01:00
Eva
a3a7c597b5 🐛 Fix importzip file modal 2024-01-25 10:33:42 +01:00
Eva
e92932b4f9 🐛 Fix empty state on viewer 2024-01-25 10:33:42 +01:00
Alejandro Alonso
901806e508 🐛 Remove unnecessary println 2024-01-25 06:34:04 +01:00
Alejandro Alonso
a78eb226e2 Add nesting constraints for components 2024-01-24 17:20:17 +01:00
Andrey Antukh
69ffd57447 🐛 Fix incorrect props handling on profile registration 2024-01-24 17:12:41 +01:00
Aitor
748bc45eb7 🐛 Fix viewer left/right arrows when fullscreen 2024-01-24 15:11:06 +01:00
Andrey Antukh
98cae9fe10 🐛 Fix unexpected exception on consecutive delete files with shift key pressed
If you select N files (using shift key), then delete them and continuing
pressing the shift select an other file and proceed to delete it an
exception is raised. This is happens because the previous selection is
not cleared. This commit fixes that.
2024-01-24 11:56:57 +01:00
Alejandro
3c07416c48 Merge pull request #4047 from penpot/niwinz-staging-bugfix-7
🐛 Fix incorrect props transformation on custom strokes component
2024-01-24 11:53:08 +01:00
Andrey Antukh
840753aae3 🐛 Fix react warning about missing key on grid component 2024-01-24 11:28:41 +01:00
Andrey Antukh
22502ff7c8 🐛 Fix incorrect props transformation on custom strokes component 2024-01-24 11:18:08 +01:00
Eva Marco
508af62dc0 Merge pull request #4040 from penpot/ladybenko-6685-font-selector
🎉 Implement full-size font selector
2024-01-24 11:11:35 +01:00
alonso.torres
942f6167b0 🐛 Fix box selection for components and nested frames 2024-01-24 10:51:22 +01:00
alonso.torres
9e24ba7b39 Improved performance for hover shapes 2024-01-24 10:51:22 +01:00
alonso.torres
4f09688af7 🐛 Fix several SVG upload issues 2024-01-24 10:51:22 +01:00
alonso.torres
b6b2a3ec53 🐛 Fix problems with fixed overlays 2024-01-24 10:51:22 +01:00
Belén Albeza
20ce492909 🐛 Fix assets bar not being tall enough (and thus typography dropdown clipped) in some occassions 2024-01-24 10:43:01 +01:00
Belén Albeza
50053b0fc4 🎉 Implement full-size font selector 2024-01-24 10:43:01 +01:00
Eva Marco
f9fe4cd0a5 Merge pull request #4044 from penpot/superalex-fix-export-in-viewer
🐛 Fix export in viewer
2024-01-24 10:29:08 +01:00
Madalena Melo
3ca36a37af 🌐 Added translation for: Spanish (Latin America). 2024-01-24 10:04:24 +01:00
Alejandro
a9415a95d2 Merge pull request #4036 from penpot/niwinz-staging-bugfix-6
🐛 Fix react warning on color-selection components
2024-01-24 09:11:59 +01:00
Alejandro Alonso
de09b10ac2 🐛 Fix export file from workspace 2024-01-24 08:58:52 +01:00
Alejandro Alonso
2091fbca7c 🐛 Fix export in viewer 2024-01-24 08:40:34 +01:00
Eva Marco
c7ac3b0163 Merge pull request #4038 from penpot/ladybenko-6515-fix-privacy-checkbox
🐛 Fix accept privacy terms checkbox
2024-01-23 17:31:25 +01:00
Amerey.eu
87d17897ed 🌐 Add translations for: Czech.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2024-01-23 16:02:13 +01:00
Stas Haas
0cd20db860 🌐 Add translations for: German.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-01-23 16:01:49 +01:00
Stas Haas
b871337920 🌐 Add translations for: Russian.
Currently translated at 56.6% (762 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2024-01-23 16:01:49 +01:00
Aitor Moreno
78443353df Merge pull request #4034 from penpot/eva-bugfixing-ui-9
🐛 Fix some frontend errors
2024-01-23 12:50:39 +01:00
Eva
b440ea5eee 🐛 Fix alert text color 2024-01-23 12:15:55 +01:00
Eva
43737ab528 🐛 Fix component icon on zoom 2024-01-23 12:15:37 +01:00
Aitor
1991b44c00 🐛 Fix toolbar not centered in workspace 2024-01-22 18:34:16 +01:00
Aitor
e6fcb418b1 🐛 Fix toolbar hidden after unfinished path 2024-01-22 18:26:10 +01:00
Belén Albeza
3f23953f83 🐛 Fix accept privacy terms checkbox 2024-01-22 16:46:31 +01:00
Eva
8bc975e717 🐛 Fix border on team selector 2024-01-22 16:10:39 +01:00
Eva
a41841ebf4 🐛 Fix close dropdown when option choosed 2024-01-22 13:20:16 +01:00
Andrey Antukh
f127b5c6ea 🐛 Fix react warning on color-selection components 2024-01-22 11:30:23 +01:00
Aitor Moreno
258969f342 Merge pull request #4033 from penpot/alotor-bugfixes-10
Bugfixes
2024-01-22 11:26:16 +01:00
alonso.torres
97a6095762 🐛 Fix problem with thumbnails size 2024-01-22 11:14:13 +01:00
Eva
b66032f2cc 🐛 Fix create assets group modal 2024-01-22 11:06:32 +01:00
alonso.torres
ff72a9ce70 🐛 Fix problem with nil children 2024-01-22 10:55:57 +01:00
Eva
cedcc15c9d 🐛 Fix padding on design bar 2024-01-22 10:43:03 +01:00
Eva
dfbc449045 🐛 Fix scrollbar on comments section 2024-01-22 10:34:39 +01:00
alonso.torres
02044a8153 🐛 Fix problem in viewer with hidden elements 2024-01-19 15:54:45 +01:00
Eva
844634e8c8 🐛 Fix border color on inputs when hovering 2024-01-19 14:53:38 +01:00
Eva
1c98230487 ♻️ Change flow tag colors on hover 2024-01-19 14:53:38 +01:00
Eva
03f1ba733d 🐛 Fix export component label error 2024-01-19 14:53:38 +01:00
Eva
1e1b13196c 🐛 Fix colors on measurements elements 2024-01-19 14:53:38 +01:00
Eva
3dc45104db 🐛 Fix component icons 2024-01-19 14:53:38 +01:00
Eva
8e456d393f 🐛 Fix icons background on font page 2024-01-19 14:53:38 +01:00
Eva Marco
6e229a4091 Merge pull request #4032 from penpot/ladybenko-6660-fix-assets-layout
🐛 Fix layout of assets bar when importing external libraries
2024-01-19 14:42:01 +01:00
Belén Albeza
4a77fdc887 🐛 Fix layout of assets bar when importing external libraries 2024-01-19 14:11:58 +01:00
Aitor Moreno
1ef8da0414 Merge pull request #4029 from penpot/alotor-bugfixes-9
Alotor bugfixes 9
2024-01-19 14:04:15 +01:00
alonso.torres
e36dce372a 🐛 Make create component children scale 2024-01-19 09:53:07 +01:00
alonso.torres
26af5c7847 🐛 Fix keep cells when create component inside grid layout 2024-01-19 09:53:07 +01:00
alonso.torres
4c7e565f6a 🐛 Fix keep layout-item properties after swap 2024-01-19 09:53:07 +01:00
alonso.torres
800d35a42c Update text name on edit 2024-01-19 09:53:07 +01:00
alonso.torres
abb3a33021 💄 Change rules styles 2024-01-19 09:53:07 +01:00
alonso.torres
e193261d7f Reduce handlers for the flex layout gaps and paddings 2024-01-19 09:53:07 +01:00
alonso.torres
843a3f7f6e 🐛 Fix problem with fix when scrolling 2024-01-19 09:53:07 +01:00
alonso.torres
ce675097b1 🐛 Fix problem with group selrect 2024-01-19 09:53:07 +01:00
alonso.torres
ece11c5958 Adds debug for shapes drawing 2024-01-19 09:53:07 +01:00
Eva Marco
2a7f115266 Merge pull request #4026 from penpot/ladybenko-6571-fix-assets-dropdowns
🐛 Fix assets dropdown (search bar)
2024-01-18 18:35:15 +01:00
Eva Marco
f11a56fb67 Merge pull request #4027 from penpot/ladybenko-6597-update-svg-icon
🐛 Fix icon for raw svg in layers tab
2024-01-18 18:34:57 +01:00
Belén Albeza
fc7f26cbb5 🐛 fix typo in user-select css rule 2024-01-18 15:37:14 +01:00
Belén Albeza
fd397c30ac 🐛 Fix icon for raw svg in layers tab 2024-01-18 12:19:09 +01:00
Eva Marco
04d8a64f63 Merge pull request #4017 from penpot/azazeln28-bugfixes-3
🐛 Bugfixes
2024-01-18 11:15:01 +01:00
Belén Albeza
0570c7fdef 🐛 Fix positioning of dropdown for assets/types 2024-01-18 11:09:12 +01:00
Aitor
1de0014de3 🐛 Fix code block collapsed truncates dropdown 2024-01-18 11:00:46 +01:00
Belén Albeza
4b79424903 🐛 Fix dropdown colors in the right sidebar for typography / recent 2024-01-18 10:55:06 +01:00
Eva
5cfc135791 🐛 Fix typography dropdown menus being clipped out in the left sidebar
Co-authored-by: Belén Albeza <belen@hey.com>
2024-01-18 10:55:06 +01:00
Aitor
658d09ccf8 🐛 Main menu popups are not closed automatically 2024-01-17 13:18:32 +01:00
Aitor
da5847cc4d 🐛 Update module disappears without applying the changes 2024-01-17 13:12:16 +01:00
Aitor
15deeacb5e 🐛 Color name overflows when it is too large 2024-01-17 12:39:54 +01:00
Aitor
f7f077adb3 Change cap stroke icons 2024-01-17 12:29:16 +01:00
Aitor
d09cab49aa 🐛 Asset color long names should show ellipsis 2024-01-17 12:13:54 +01:00
Aitor
6009f6846a 🐛 Comments over toolbar 2024-01-17 12:13:54 +01:00
Aitor
b2bbe12a11 Add tooltipo on colors 2024-01-17 12:13:54 +01:00
Aitor
70ff72a03a 🐛 Fix code block in view mode shows scroll 2024-01-17 12:13:54 +01:00
Aitor
cf569baabd 🐛 Fix colorpicker outside viewport 2024-01-17 12:13:54 +01:00
alonso.torres
a84b23168d 🐛 Fix problem with path editor undoing changes 2024-01-17 12:03:51 +01:00
alonso.torres
72e29e58d2 🐛 Fix problem with non-clip shapes and zoom 2024-01-17 12:03:51 +01:00
alonso.torres
792145353e 🐛 Fix calculate layout with hidden shapes 2024-01-17 12:03:51 +01:00
alonso.torres
c249bd6f22 🐛 Fix problem with deleting component insances 2024-01-17 12:03:51 +01:00
alonso.torres
744c60cdef 🐛 Fix problem when moving svgs 2024-01-17 12:03:51 +01:00
alonso.torres
6c4d757ecb 🐛 Fix problem with not applying colors to boards 2024-01-17 12:03:51 +01:00
alonso.torres
339cdbec2d 🐛 Fix line cap select 2024-01-17 12:03:51 +01:00
Aitor
eeabeadc39 🐛 Wrong component background color 2024-01-17 10:19:30 +01:00
Aitor
d30707a02c 🐛 Bad request error after reloading invitations page 2024-01-17 10:19:30 +01:00
Aitor
8f867c03de 🐛 Card menu is hard to launch after search 2024-01-17 10:19:30 +01:00
Pablo Alba
45072c19a2 🐛 Fix on cut and paste a component, a bad frame-id is set 2024-01-17 09:27:16 +01:00
Eva
0370e8083a 🐛 Fix description title on feedback 2024-01-16 17:59:03 +01:00
Eva
827609db79 🐛 Fix go to library button 2024-01-16 17:59:03 +01:00
Eva
01ad26c084 🐛 Fix component title text 2024-01-16 17:59:03 +01:00
Eva
0a8bbe0b77 🐛 Fix disabled color on path toolbar and alignment buttons 2024-01-16 17:59:03 +01:00
Eva
a51925565a 🐛 Fix uppercase text on text palette 2024-01-16 17:59:03 +01:00
Andrés Moya
ea71bfe6d6 🐛 Fix some possible validation error on migration 2024-01-16 17:20:04 +01:00
Andrés Moya
2664a846e9 🐛 Advance shape-refs of subinstances when detaching a copy 2024-01-16 17:20:04 +01:00
Andrés Moya
a3241d1442 🔧 Improve debug dump-tree 2024-01-16 17:20:04 +01:00
Andrey Antukh
d4d3f9ca81 🎉 Add the ability to export import entire team
For now only available as srepl helper
2024-01-16 17:17:30 +01:00
Andrey Antukh
46070c2987 💄 Use new spread-props helper on submit-button* component 2024-01-16 09:35:49 +01:00
Andrey Antukh
04540c4b0f ⬆️ Update rumext (fix issues) 2024-01-16 09:35:49 +01:00
Aitor Moreno
03931da17a Merge pull request #3989 from penpot/niwinz-staging-bugfix-1
🐛 Bugfixes
2024-01-15 16:03:23 +01:00
Andrés Moya
8b18115b54 🐛 Fix validation error when instantiating a component inside a main 2024-01-15 15:47:52 +01:00
Aitor Moreno
0688f6a4a3 Merge pull request #4011 from penpot/alotor-bugfixes-7
Alotor bugfixes 7
2024-01-15 15:39:35 +01:00
alonso.torres
2fee0254b7 🐛 Fix problem with onboarding form 2024-01-15 15:11:36 +01:00
alonso.torres
e8b4389a1a 🐛 Fix problem with bool to path on svg shapes 2024-01-15 14:25:43 +01:00
alonso.torres
aa7e70141c 🐛 Fix problem with snap to distances 2024-01-15 14:25:43 +01:00
alonso.torres
03f0724dfd 🐛 Fix problem with align self 2024-01-15 14:25:43 +01:00
alonso.torres
5b26e686f3 🐛 Fix gradient handlers for flipped shapes 2024-01-15 14:25:43 +01:00
alonso.torres
c4ce83bb07 🐛 Fix keep index for swap components 2024-01-15 14:25:43 +01:00
alonso.torres
c0a2550485 🐛 Fix enter key on team modal 2024-01-15 14:25:43 +01:00
alonso.torres
9898ad1991 🐛 Fix layout button remove showing always 2024-01-15 14:25:43 +01:00
alonso.torres
f47b5a18c7 🐛 Fix problem in viewer with big screens 2024-01-15 14:25:43 +01:00
Andrés Moya
68a1882a65 🐛 Fix validation error when moving a nested inside a main 2024-01-15 14:05:27 +01:00
Eva
4178be3acf 🐛 Fix login page errors 2024-01-15 11:15:18 +01:00
Eva
706f91db39 🐛 Fix export components typos 2024-01-15 11:15:18 +01:00
Eva
3a859f2347 🐛 Fix typo on UI 2024-01-15 11:15:18 +01:00
Eva
89974f4c95 🐛 Fix scroll on history tab 2024-01-15 11:15:18 +01:00
Eva
1761a16d31 🐛 Fix export dropdown on inspect 2024-01-15 10:35:30 +01:00
Eva
6ecf0f4ca4 🐛 Fix copy button cropped 2024-01-15 10:35:30 +01:00
Eva
af6e808337 🐛 Fix shared modal when link is created and add text color 2024-01-15 10:35:30 +01:00
Eva
aeff50ba9f 🐛 Fix hero image space when the screen is small 2024-01-15 10:35:30 +01:00
Eva
41bccc7213 🐛 Fix icon of focus mode 2024-01-15 10:35:30 +01:00
Eva
0b2ad569a1 🐛 Fix library icons on dashboard 2024-01-15 10:35:30 +01:00
Eva
4f05389a51 🐛 Fix some text without setted color 2024-01-15 10:35:30 +01:00
alonso.torres
19e40175be 🐛 Disable import to v1 from v2 2024-01-15 10:10:13 +01:00
alonso.torres
28981e5d46 🐛 Fix import of zip files from v2 to v2 2024-01-15 10:10:13 +01:00
alonso.torres
9ea440b6f7 🐛 Fix import from components v1 to v2 2024-01-15 10:10:13 +01:00
Geek Squirrel
e044ff3d55 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.1% (1332 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2024-01-13 00:06:21 +01:00
Eva
7f4bc246c6 🐛 Fix checkbox of the file export modal 2024-01-11 17:15:43 +01:00
Eva
cdc8c270dc 🐛 Fix share modal when the file has 1 file only 2024-01-11 17:15:43 +01:00
Eva
6de70ff5b7 🐛 Fix checkbox colors 2024-01-11 17:15:43 +01:00
Eva
b7bfb73134 🐛 Fix spacing in prototype tab 2024-01-11 17:15:43 +01:00
Eva Marco
e8da60b2e7 Merge pull request #4004 from penpot/ladybenko-6566-fix-assets-list
🐛 Fix asset list UI
2024-01-11 16:34:54 +01:00
Pablo Alba
d204ae86f2 🐛 Fix swap styles for groups names too long 2024-01-11 16:32:24 +01:00
Belén Albeza
30a53252f8 🐛 Fix asset list UI 2024-01-11 16:20:53 +01:00
Eva Marco
0d1aed96c8 Merge pull request #4006 from penpot/niwinz-staging-bugfix-5
🐛 Fix issues with forms
2024-01-11 16:07:35 +01:00
alonso.torres
6ef85ef0e8 🐛 Fix problems with data-value keyword 2024-01-11 15:56:31 +01:00
Andrey Antukh
9ed6d5f360 🐛 Use correct jsx handler on team choice form 2024-01-11 15:34:23 +01:00
Andrey Antukh
4d54768875 Add special cases for runtime map to props conversion 2024-01-11 15:23:58 +01:00
Andrey Antukh
9149772ce9 🐛 Add missing mf/deps on form component 2024-01-11 15:23:42 +01:00
Andrey Antukh
6e39c26704 Improve implementation of submit-button* component 2024-01-11 15:23:13 +01:00
Andrey Antukh
6c2f9b7bd3 🐛 Do not forward invalid prop to dom node on form input component 2024-01-11 15:22:42 +01:00
Eva Marco
189d0c107c Merge pull request #4002 from penpot/niwinz-staging-gulp-cache
🐛 Fix gulp cache issue on recompiling transitive scss dependencies
2024-01-11 13:55:02 +01:00
Andrey Antukh
ba864eaa4d 🐛 Fix gulp cache issue on recompiling transitive scss dependencies 2024-01-11 13:02:07 +01:00
Stas Haas
764774ee49 🌐 Add translations for: German.
Currently translated at 99.7% (1340 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2024-01-11 11:06:16 +00:00
Eva Marco
65f7c9cbbf Merge pull request #3997 from penpot/ladybenko-6490-fix-component-hover-ui
🐛 Fix assets UI
2024-01-11 10:24:36 +01:00
Belén Albeza
aed5388bfd 🐛 Fix radio button component 2024-01-11 09:53:22 +01:00
Belén Albeza
34f1f3d103 🐛 Fix hover on assets thumbnails + broken editable label 2024-01-11 09:53:22 +01:00
alonso.torres
21bd59defd 🐛 Fix problems uploading graphics in components v1 2024-01-10 14:43:36 +01:00
alonso.torres
67b3040327 🐛 Fix problem with text content and multiple selection 2024-01-10 14:43:36 +01:00
Eva Marco
08d7f5d8a3 Merge pull request #3996 from penpot/niwinz-staging-bugfix-4
🐛 Bugfixes related to rumext update
2024-01-10 14:42:43 +01:00
Andrey Antukh
b63a8d34b5 🐛 Fix debug reset file version method 2024-01-10 14:36:30 +01:00
Andrey Antukh
3d66a4b7be 💄 Split large lines on onboarding questions compomponent 2024-01-10 14:29:39 +01:00
Andrey Antukh
e856387292 📎 Add better key formatting on radio-buttons react component 2024-01-10 14:28:23 +01:00
Andrey Antukh
5ec1272d68 🐛 Update rumext that fixes issue with :htmlFor prop 2024-01-10 14:28:23 +01:00
Andrey Antukh
d8aba5f645 ⬆️ Update versions on devenv Dockerfile 2024-01-10 14:00:31 +01:00
Andrey Antukh
fede8c9975 Setup better media max file-size on devenv 2024-01-10 14:00:31 +01:00
Andrey Antukh
77564531eb 🐛 Fix incorrect features setup on persist-temp-file rpc method 2024-01-10 13:50:30 +01:00
Aitor Moreno
194d3251a4 Merge pull request #3980 from penpot/niwinz-staging-upgrade-deps
 Add performance enhancements
2024-01-10 11:22:22 +01:00
Eva Marco
4a991ef3f9 Merge pull request #3988 from penpot/ladybenko-fix-your-account-ui
🐛 Fix "Your Account/Give Feedback" UI
2024-01-10 10:20:22 +01:00
Andrey Antukh
a179f73deb Add minor performance improvements to asset-section react component 2024-01-09 23:11:42 +01:00
Andrey Antukh
eeaee5ad42 Add minor optimizations to tab-container react component 2024-01-09 23:11:42 +01:00
Andrey Antukh
e0a1cd6e77 📎 Move import parser from util to worker directory 2024-01-09 23:11:42 +01:00
Andrey Antukh
b6c257bfc5 🐛 Fix incorrect svg-attrs handlng on .zip import process 2024-01-09 23:11:42 +01:00
Andrey Antukh
77472aabea Add path parser js impl more resilent to parse errors 2024-01-09 23:11:42 +01:00
Andrey Antukh
36b5ca7313 Add performance improvements to start-resize 2024-01-09 23:11:42 +01:00
Andrey Antukh
1465ed3607 Improve performance on selection react component
Mainly do more static calls and reduce unnecesary allocation
2024-01-09 23:11:42 +01:00
Andrey Antukh
0ea07469d2 💄 Add minor cosmetic fixes to link react component 2024-01-09 23:11:42 +01:00
Andrey Antukh
870e4f96b2 ⬆️ Update dependencies 2024-01-09 23:11:42 +01:00
Andrey Antukh
5502f317ad 🐛 Fix unexpected exception on incorrect thumbnail gen of root shape 2024-01-09 23:11:09 +01:00
alonso.torres
9e40b4551d 🐛 Fix problem with swap component 2024-01-09 22:31:33 +01:00
Andrey Antukh
04f3d99def 🐛 Fix type inconsistency on gradient type
Normalize to keyword and add migration for ensure that
all shapes uses the correct type
2024-01-09 18:50:50 +01:00
Andrés Moya
b7b7b9d580 🐛 Touch modified file when ignore sync, to avoid ETAG caching 2024-01-09 18:28:32 +01:00
Andrés Moya
4d6c0f3da9 🐛 Fix debug validate single shape 2024-01-09 18:28:32 +01:00
Andrés Moya
9d8628b4cc 🐛 Fix groups without :shapes when converting to frames in migration 2024-01-09 18:28:32 +01:00
Eva
df99ca55f8 🐛 Fix spacing in prototype tab empty state 2024-01-09 18:25:58 +01:00
Eva
a8a784bea4 🐛 Fix icons preview page 2024-01-09 18:25:58 +01:00
Eva
5cb8ce3319 🐛 Fix loader position while verifying token 2024-01-09 18:25:58 +01:00
Eva
443d157dbe 🐛 Fix notification modal styles 2024-01-09 18:25:58 +01:00
alonso.torres
9c35652043 🐛 Fix problem with font loading 2024-01-09 17:54:44 +01:00
alonso.torres
a4796e8db8 🐛 Fix swap component breaks grid layout 2024-01-09 17:54:44 +01:00
alonso.torres
5c3ea37bbe 🐛 Fix problem with create board on cells 2024-01-09 17:54:44 +01:00
Andrey Antukh
8919a7067e 🐛 Fix incorrect thumbnail queries on file related rpc methods 2024-01-09 15:00:23 +01:00
Belén Albeza
fa99d9aaed 🐛 Fix buttons appearance in the feedback form 2024-01-09 14:24:02 +01:00
Belén Albeza
5c2bdfcefe 🐛 Fix icon color for Give Feedback in Your Account sidebar 2024-01-09 13:42:16 +01:00
Aitor Moreno
c7ed642f6a Merge pull request #3946 from penpot/VasilevsVV-penpot/vt/issue-3232-hide-bb-when-editing
 Add set of events for hiding and revealing bounding box for selected shape while transforming
2024-01-09 12:36:08 +01:00
Tsiura Vasyl
97d6214ff4 Add set of events for hiding and revealing bounding box for selected shape
Signed-off-by: Tsiura Vasyl <morfey.rulit@gmail.com>
2024-01-09 12:26:05 +01:00
Eva Marco
419776bf5e Merge pull request #3985 from penpot/niwinz-staging-lipstick-title-bar
💄 Make title-bar component usable externally
2024-01-09 10:08:06 +01:00
alonso.torres
d4f177ffdd 💄 Format code 2024-01-09 09:55:51 +01:00
Aitor
25bd70c86f 🐛 Fix viewer fullscreen not working properly 2024-01-09 09:55:51 +01:00
Aitor
b47cea7ead 🐛 Fix generating unnecessary thumbnails 2024-01-09 09:55:51 +01:00
Aitor
a76e5940af 🐛 Fix imposters loading rect 2024-01-09 09:55:51 +01:00
Eva Marco
a6662f2774 Merge pull request #3978 from penpot/hiru-fix-annotation-focus
Fix annotation textarea steals focus and prevents deleting a component with keyboard
2024-01-09 09:45:56 +01:00
Andrey Antukh
1822103936 💄 Make the title-bar component usable externally
By removing the usage of `?` character on prop names
2024-01-09 09:44:42 +01:00
Eva
e866e99804 🐛 Fix component annotation in new UI 2024-01-09 08:55:51 +01:00
Eva
947cc0ce92 🐛 Fix view only alignment 2024-01-09 08:55:51 +01:00
Eva
4bb93d9c7e 🐛 Fix font button height and fonts dropdown 2024-01-09 08:55:51 +01:00
Eva Marco
5a012d4e33 Merge pull request #3983 from penpot/alotor-bugfixes-4
Alotor bugfixes 4
2024-01-08 18:50:12 +01:00
alonso.torres
2705876c56 🐛 Fix problems with drag/drop in layers 2024-01-08 18:10:18 +01:00
Eva Marco
2290503d4a Merge pull request #3982 from penpot/ladybenko-layer-icon-svg
🐛 Fix wrong icon for SVG
2024-01-08 17:11:01 +01:00
Belén Albeza
0c13764c63 🐛 Fix wrong icon for SVG 2024-01-08 16:43:06 +01:00
alonso.torres
9007371ab5 🐛 Fix visual problems on inspect panel 2024-01-08 15:51:28 +01:00
alonso.torres
5ea414aed6 🐛 Fix problem with alt-duplicate on root frames 2024-01-08 15:20:26 +01:00
alonso.torres
c43458af1d 🐛 Fix problems with z-index 2024-01-08 15:20:26 +01:00
Andrés Moya
790ce27316 🐛 Enable preprocess always when migrating files 2024-01-08 13:23:30 +01:00
Belén Albeza
3c114bd9ef Merge pull request #3977 from penpot/palba-fix-swap-on-deleted-main
🐛 Fix opening the swap panel on a copy of a deleted component fails
2024-01-08 11:16:23 +01:00
Andrés Moya
8085e93a07 🐛 Solve annotation stealing focus when not editing 2024-01-08 11:10:17 +01:00
Pablo Alba
af2e4ca00f 🐛 Fix opening the swap panel on a copy of a deleted component fails 2024-01-08 11:05:37 +01:00
Andrey Antukh
0ab56b38b9 📎 Add fmt checker to the CI 2024-01-08 09:32:50 +01:00
Andrey Antukh
833871df65 💄 Format frontend code 2024-01-08 09:32:50 +01:00
Andrey Antukh
b6ecc8b1be 💄 Format common code 2024-01-08 09:32:50 +01:00
Andrey Antukh
0b29aaecc4 💄 Format backend code 2024-01-08 09:32:50 +01:00
Edgars Andersons
7d2c8aa1c3 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2024-01-06 22:06:20 +00:00
Andrey Antukh
cfe7ba34f7 🐛 Fix validation of validation error on file validate ns 2024-01-05 18:29:16 +01:00
Andrey Antukh
c53e476ba2 Make the dm/get-prop work also with non static fields 2024-01-05 17:59:39 +01:00
Andrey Antukh
260879791b 💄 Add minor cosmetic changes to custom-stroke react component 2024-01-05 17:59:39 +01:00
Andrey Antukh
8b57dcf015 Optimize dasharray generation 2024-01-05 17:59:39 +01:00
Andrey Antukh
2698944ec7 Add proper file iteration on srepl helpers 2024-01-05 17:59:39 +01:00
Alejandro Alonso
a6e802ba2a Refactor style props 2024-01-05 17:59:39 +01:00
alonso.torres
a2fff7e74a 🐛 Fix problem when creating flex layout 2024-01-05 16:38:34 +01:00
alonso.torres
cf3c3cf989 🐛 Fix problem with auto in grid and min sizes 2024-01-05 16:38:34 +01:00
alonso.torres
d0244e0bef 🐛 Fix problem with masks 2024-01-05 16:38:34 +01:00
alonso.torres
1f712c82bf 🐛 Fix problem with icons in select 2024-01-05 16:38:34 +01:00
alonso.torres
3702c054a8 🐛 Fix problem with z-index 2024-01-05 15:32:26 +01:00
alonso.torres
77b886aa1a 🐛 Restored z-index input 2024-01-05 15:32:14 +01:00
alonso.torres
62ffe67838 🐛 Fix problem with disabled buttons visibility 2024-01-05 15:31:55 +01:00
Eva
c14fe661df ♻️ remove new css from other elements 2024-01-05 14:23:14 +01:00
Eva
480251c41c ♻️ Remove new-css-system from viewer 2024-01-05 14:23:14 +01:00
Eva Marco
1433ec5dad Merge pull request #3971 from penpot/ladybenko-swap-panel
:Bug: UI fixes for the swap panel
2024-01-05 13:45:53 +01:00
Belén Albeza
e7d4fc3c4f 🐛 Fix swap panel thumbnail gallery appearance 2024-01-05 13:38:57 +01:00
Alejandro Alonso
492ce43b4a 🎉 Add ha language to the i18n subsystem 2024-01-05 11:46:19 +01:00
Belén Albeza
1576e33564 🐛 Fix color of titles in the swap panel 2024-01-04 17:09:03 +01:00
Alejandro
08cd2ddf1f Merge pull request #3968 from penpot/niwinz-staging-storage-improvements-2
🐛 Fix incorrect pointer deref on validating file on update operation
2024-01-04 16:48:23 +01:00
Andrey Antukh
4899b3af6e 🐛 Fix incorrect pointer deref on validating file on update operation 2024-01-04 16:31:57 +01:00
Alejandro
65b3c62a87 Merge pull request #3959 from penpot/niwinz-staging-storage-improvements-2
 Improvements to components migration
2024-01-04 15:55:31 +01:00
Eva Marco
6982b03ad6 Merge pull request #3967 from penpot/alotor-grid-fix-auto
Fixes some issues with auto cells
2024-01-04 15:42:22 +01:00
alonso.torres
9e52cdb75e 🐛 Change behavior of auto cells 2024-01-04 15:17:12 +01:00
alonso.torres
e3ed198ba1 💄 Redesign debug panel 2024-01-04 15:17:12 +01:00
Andrés Moya
f49cf0b6ae 💄 Style changes on clone-object function (now clone-shape) 2024-01-04 14:40:22 +01:00
Andrés Moya
2fc6290c8f 🐛 Fix invalid frame-id when adding shape to copy 2024-01-04 14:40:22 +01:00
Andrey Antukh
41287d8fc5 Improve migration script performance and api usability 2024-01-04 14:40:22 +01:00
Andrey Antukh
471fd78174 Spawn vthread on s3 internal io completion
Instead of using platform threads
2024-01-04 12:41:16 +01:00
Andrey Antukh
746d898245 Improve the db api efficiency
Mainly setup proper defaults and reduce unnecesary allocations
on every db api call.
2024-01-04 12:41:16 +01:00
Alejandro Alonso
93bf8c1478 🐛 Fix colors with image fill name 2024-01-04 12:01:46 +01:00
Alejandro Alonso
9cfc00ce97 🐛 Fix remap colors on binary import 2024-01-04 11:59:00 +01:00
Belén Albeza
73b8f3fb17 Load debug CSS in local dev only 2024-01-04 10:47:20 +01:00
Alejandro
c77af2000c Merge pull request #3957 from penpot/eva-remove-new-css-phase-3
♻️ Remove new-css-system phase 3
2024-01-04 10:37:35 +01:00
Eva
af99bf05e2 ♻️ Remove new-css-system from dashboard 2024-01-04 10:27:54 +01:00
Eva
3f151f16ce ♻️ Remove new-css-system from modals 2024-01-04 10:27:54 +01:00
Eva
7a3525febc ♻️ Remove new-css-system from right sidebar elements 2024-01-04 10:27:54 +01:00
Belén Albeza
b3684990f1 🐛 Fix sizes of dropdowns in the export section 2024-01-04 10:19:17 +01:00
Belén Albeza
824e7d76ae 🐛 Fix blur icon changing size on hover 2024-01-04 10:19:17 +01:00
Aitor
5ad31a878b 🐛 Fix rasterizer not loading embedded styles 2024-01-04 10:09:37 +01:00
Alejandro Alonso
79c2a6c5d5 🐛 Fix round for both ends of path 2024-01-04 10:07:42 +01:00
Alejandro
7fc77f279b Merge pull request #3963 from penpot/alotor-fix-empty-thumbnails
🐛 Fix problem with thumbnails for empty pages
2024-01-04 09:55:03 +01:00
alonso.torres
3aadf00a6f 🐛 Fix problem with thumbnails for empty pages 2024-01-04 09:52:09 +01:00
Aitor
9474700d09 🐛 Fix color picker not rendering Latin1 svgs 2024-01-03 17:50:46 +01:00
Aitor Moreno
95868416ef Merge pull request #3961 from penpot/alotor-bugfix
Bugfixes
2024-01-03 17:20:27 +01:00
alonso.torres
009556b8f7 Improve grid cell selection 2024-01-03 16:50:44 +01:00
alonso.torres
6068ddc0ff Add delete with content option 2024-01-03 16:50:44 +01:00
alonso.torres
3ae1a97bc9 🐛 Fix problem when duplicating/moving tracks 2024-01-03 14:40:58 +01:00
Alejandro
5159438e5d Merge pull request #3950 from penpot/niwinz-staging-storage-improvements
 Add safety checks on object deletion
2024-01-03 11:46:09 +01:00
Andrey Antukh
addb392ecc Add safety mechanism for direct object deletion
The main objective is prevent deletion of objects that can leave
unreachable orphan objects which we are unable to correctly track.

Additionally, this commit includes:

1. Properly implement safe cascade deletion of all participating
   tables on soft deletion in the objects-gc task;

2. Make the file thumbnail related tables also participate in the
   touch/refcount mechanism applyign to the same safety checks;

3. Add helper for db query lazy iteration using PostgreSQL support
   for server side cursors;

4. Fix efficiency issues on gc related task using server side
   cursors instead of custom chunked iteration for processing data.

   The problem resided when a large chunk of rows that has identical
   value on the deleted_at column and the chunk size is small (the
   default); when the custom chunked iteration only reads a first N
   items and skip the rest of the set to the next run.

   This has caused many objects to remain pending to be eliminated,
   taking up space for longer than expected. The server side cursor
   based iteration does not has this problem and iterates correctly
   over all objects.

5. Fix refcount issues on font variant deletion RPC methods
2024-01-03 10:56:57 +01:00
Andrey Antukh
e6fb96c4c2 📎 Update .gitignore file 2024-01-03 09:40:53 +01:00
Eva
7da949610d ♻️ Remove new-css-system from interaction tab 2024-01-03 09:36:45 +01:00
Eva
452289b726 ♻️ Remove new-css-system from colorpicker 2024-01-03 09:36:45 +01:00
Eva
67c692fdbd ♻️ Remove new-css-system from design tab 2024-01-03 09:36:45 +01:00
Eva
0a123a3917 ♻️ Remove refer css from files 2024-01-03 09:36:45 +01:00
Eva
dc4bf82684 ♻️ Remove new-css-system on assets tab 2024-01-03 09:36:45 +01:00
alonso.torres
c9200f235e ♻️ Changes to update-shape parameters 2024-01-02 18:09:55 +01:00
alonso.torres
48e283812e 🐛 Fix some styles 2024-01-02 18:09:55 +01:00
alonso.torres
40d4a917e1 Context menu for cells 2024-01-02 18:09:55 +01:00
alonso.torres
9ed3ad2f3c Right click options on grid editor 2024-01-02 18:09:55 +01:00
alonso.torres
da358d635b Reorder tracks from grid editor 2024-01-02 18:09:55 +01:00
alonso.torres
7508627dc5 Change defaults for new grid tracks 2024-01-02 18:09:55 +01:00
Andrey Antukh
56ab2aa4ca Merge branch 'staging' into develop 2024-01-02 17:18:07 +01:00
Andrey Antukh
07ce435a91 Merge remote-tracking branch 'weblate/develop' into translations 2024-01-02 17:17:22 +01:00
Alejandro Alonso
802ccf1d2c 🌐 Add translations for: Hausa.
Currently translated at 97.3% (1309 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ha/
2024-01-02 17:16:49 +01:00
Alejandro Alonso
0872058631 🌐 Add translations for: Arabic.
Currently translated at 84.3% (1133 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2024-01-02 17:16:31 +01:00
Andrey Antukh
8421a0fdc6 📎 Increase version on version.txt file 2024-01-02 17:15:24 +01:00
Alejandro
de48ec4cbf Merge pull request #3953 from penpot/niwinz-staging-duplicate-team
 Add internal helper for team duplication
2024-01-02 12:20:39 +01:00
Andrey Antukh
0ebf9564b2 Add internal helper for team duplication 2024-01-02 12:01:07 +01:00
Alejandro Alonso
8e3a73d0bd 🐛 Respect group name when adding layout 2024-01-02 11:57:23 +01:00
Alejandro Alonso
2adb55c67d 🌐 Added translation for: Hausa. 2024-01-02 10:25:00 +01:00
Stephan Paternotte
ae67137e0e 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-29 22:08:58 +01:00
TheScientistPT
4dbe5c504f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1344 of 1344 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-29 22:08:57 +01:00
Andrey Antukh
f5b4ea975e 🐛 Add missing configuration to shadow-cljs.edn file for release build 2023-12-29 17:22:30 +01:00
Andrey Antukh
04dbe5f741 🐛 Fix exception on manifest reading on release build 2023-12-29 17:22:04 +01:00
Andrey Antukh
22b326e2b9 🐛 Fix issue with release build introduced on beicon2 upgrade 2023-12-29 16:13:21 +01:00
Eva
74aaa710bf 🐛 Fix some text and background colors 2023-12-29 15:32:05 +01:00
Eva
7d2da6ef80 ♻️ Remove new-css-system from workspace toolbar 2023-12-29 15:32:05 +01:00
Eva
93a7a8e856 ♻️ Remove new-css-system from workspace palettes 2023-12-29 15:32:05 +01:00
Eva
412343f3de ♻️ Remove new-css-system from workspace header 2023-12-29 15:32:05 +01:00
Eva
c707539f6f ♻️ Remove new-css-system from layers 2023-12-29 15:32:05 +01:00
Eva
831f79d651 ♻️ Remove new-css-system from sitemap 2023-12-29 15:32:05 +01:00
alonso.torres
c439de49a5 ♻️ Changed gulpfile to modules 2023-12-28 12:14:06 +01:00
Andrey Antukh
3da98cbd1e 🔥 Remove unnecesary import 2023-12-28 12:14:06 +01:00
Andrey Antukh
9cba125abe Modularize js-beautify library related code 2023-12-28 12:14:06 +01:00
Andrey Antukh
1318a5c3c8 Move toggle-theme to data.users ns. 2023-12-28 12:14:06 +01:00
Andrey Antukh
caadc43d35 🎉 Add lazy-loading for penpot top-level page components 2023-12-28 12:14:06 +01:00
Andrey Antukh
37a7bb202b Add lazy loading for highlightjs on code-block component
Mainly because highlight.js is a heavy library but only used
on a very concrete situations, so it does not make sense to load
it all the time.
2023-12-28 12:14:06 +01:00
Andrey Antukh
538b8313ed Add more config to condo 2023-12-28 12:14:06 +01:00
Andrey Antukh
4d54d5c455 Extend GCL Deferred to work with promesa abstractions 2023-12-28 12:14:06 +01:00
Andrey Antukh
0b53dc627f Add minor improvements on frontend and exporter builds 2023-12-28 12:14:06 +01:00
Andrey Antukh
bc91c46a9a Improve performance and space efficiency of cursors namespace 2023-12-28 12:14:06 +01:00
Andrey Antukh
127b02922f Add initial vitest test file template 2023-12-28 12:14:06 +01:00
Andrey Antukh
9c969f8b26 Improve code organization for better integration with storybook 2023-12-28 12:14:06 +01:00
Alejandro
5621c2c394 Merge pull request #3942 from penpot/niwinz-staging-svg-parse-fill-fix
🐛 Fix several issues on svg path parsing
2023-12-28 10:41:52 +01:00
Alejandro
a506be2897 Merge pull request #3940 from penpot/eva-bugfixing-ui-1
💄 Fix some frontend bugs
2023-12-28 10:37:07 +01:00
Andrey Antukh
74447442b8 Add several improvements to svg path parser tests
And properly reorganize legacy implementations
2023-12-28 10:30:56 +01:00
Andrey Antukh
62b1dc2a4b 🐛 Fix incorrect arc to curve conversion in some cases 2023-12-28 10:30:56 +01:00
Andrey Antukh
88779dd50b 📎 Fix naming of fills react component 2023-12-28 10:30:56 +01:00
Andrey Antukh
ae4f14ece2 Reduce allocation on custom-shape-strokes react component 2023-12-28 10:30:56 +01:00
Andrey Antukh
ad185c4215 🐛 Assign correct fill to match standard svg behavior when no fils found
On parsing svg
2023-12-28 10:30:56 +01:00
Eva
1a1e9b4ecd 💄 Fix some frontend bugs 2023-12-28 09:49:47 +01:00
Andrey Antukh
63b264b494 🐛 Fix incorrect last command tracing on svg path parser 2023-12-27 15:38:14 +01:00
Andrey Antukh
fca33f8451 📎 Fix incorrect version 2023-12-27 12:15:02 +01:00
Hosted Weblate
d7fded19aa Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-12-27 12:00:17 +01:00
Hosted Weblate
7f47131499 Merge branch 'origin/develop' into Weblate. 2023-12-27 12:00:13 +01:00
Andrey Antukh
85829e53af Merge branch 'staging' into develop 2023-12-27 11:59:31 +01:00
Andrey Antukh
16b37230cc Merge branch 'translations' into staging 2023-12-27 11:59:15 +01:00
Stephan Paternotte
c2f48e4075 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:25 +01:00
Stephan Paternotte
6e5d5cfc50 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:25 +01:00
Stephan Paternotte
32439a52db 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:58:24 +01:00
Stas Haas
ce8c17e589 🌐 Add translations for: German.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Stas Haas
407e7186a4 🌐 Add translations for: German.
Currently translated at 99.6% (1316 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Swapnil C
a589d79043 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Aimee
5ce362df8e 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Locness
2120b40abe 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Louis Chance
705a1c8b10 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Oğuz Ersen
a9cafdfc9d 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-12-27 11:58:24 +01:00
Luigi
0cb80febf0 🌐 Add translations for: French.
Currently translated at 88.2% (1165 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Luigi
804fe018ef 🌐 Add translations for: French.
Currently translated at 87.8% (1159 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-12-27 11:58:24 +01:00
Yaron Shahrabani
026c32fe00 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-12-27 11:58:24 +01:00
Hugo Vermaak
96d9786f83 🌐 Add translations for: Afrikaans.
Currently translated at 7.6% (101 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/af/
2023-12-27 11:58:24 +01:00
Madalena Melo
9a5c220c87 🌐 Added translation for: Afrikaans. 2023-12-27 11:58:24 +01:00
TheScientistPT
4a2fb6facd 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-27 11:58:24 +01:00
AlexTECPlayz
eb575e9daf 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-12-27 11:58:24 +01:00
AlexTECPlayz
a7fc53f325 🌐 Add translations for: Romanian.
Currently translated at 99.3% (1311 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-12-27 11:58:24 +01:00
TheScientistPT
24bb49d0bf 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-12-27 11:58:24 +01:00
Yaron Shahrabani
67d3a7f9c5 🌐 Add translations for: Hebrew.
Currently translated at 98.3% (1298 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-12-27 11:58:24 +01:00
Linerly
1efc40b6c4 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-12-27 11:58:24 +01:00
Stas Haas
304f6ea96e 🌐 Add translations for: German.
Currently translated at 99.3% (1312 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-12-27 11:58:24 +01:00
Merih Güz
2509ab3a5d 🌐 Add translations for: Turkish.
Currently translated at 98.4% (1299 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-12-27 11:58:24 +01:00
Stephan Paternotte
163ce9f3b7 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-27 11:56:54 +01:00
Andrey Antukh
0643ba03a1 Merge branch 'staging' into develop 2023-12-27 11:55:38 +01:00
Andrey Antukh
49d719fb45 🐛 Fix incorrect stream handling on shape move
Bug introduced in the beicon2 upgrade part2 commit
2023-12-27 11:53:05 +01:00
Aitor
4fc892a856 🐛 Fix Update main component thumbnail 2023-12-26 14:51:42 +01:00
Andrey Antukh
88c7ac379b 🐛 Fix unexpected rx scheduler saturation on mouse movement burst
Fixed with custom trailing-edge throttling mechanism
2023-12-26 14:14:20 +01:00
Andrey Antukh
ccf063b8ef ⬆️ Upgrade to beicon2 (part2) 2023-12-26 14:14:20 +01:00
Andrey Antukh
96f5a33f5f ⬆️ Upgrade to beicon2 (part1) 2023-12-26 14:14:20 +01:00
Andrey Antukh
ecee15af5b Improve logging on websocket related code (backend) 2023-12-26 14:14:20 +01:00
Stephan Paternotte
607c3c4517 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-26 14:11:56 +01:00
Alejandro
7648836725 Merge pull request #3931 from penpot/alotor-fix-layout
🐛 Fix problem with absolutes inside grid
2023-12-26 11:41:44 +01:00
Stephan Paternotte
6b12645bfb 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-12-22 16:12:30 +00:00
Andrés Moya
92934c6cdd 🔧 Add data-test to ease selection in e2e tests 2023-12-18 18:17:27 +01:00
alonso.torres
52c849ce4b 🐛 Fix problem with absolutes inside grid 2023-12-15 22:18:23 +01:00
Eva
f8dd86da34 💄 Add new UI to viewer area 2023-12-15 22:15:22 +01:00
Andrey Antukh
15f81e557c 🐛 Fix unexpected exception on importing some binary files 2023-12-15 17:54:26 +01:00
Andrey Antukh
60fc1a48a5 🔥 Remove obsolete entry on devenv log config 2023-12-15 17:54:26 +01:00
Eva Marco
51b3556b45 Merge pull request #3920 from penpot/ladybenko-fix-ui-modal-shared-library
🐛 fix modal text color + remove lines in shared library modal
2023-12-15 17:09:02 +01:00
Eva Marco
89c14b25ab Merge pull request #3915 from penpot/alotor-fixes-ui
Fixes new UI
2023-12-15 16:28:51 +01:00
Alejandro
051c0dce78 Merge pull request #3926 from penpot/niwinz-staging-bugfixes-2
🐛 More features related bugfixes
2023-12-15 16:16:39 +01:00
Andrey Antukh
a9dd55b8d2 🐛 Fix incorrect feature detection on frontend code 2023-12-15 16:09:57 +01:00
Andrey Antukh
ca50486639 Simplify feature handling on duplicate-file 2023-12-15 15:18:04 +01:00
Andrey Antukh
0ad2e8a0f2 Make retrieving fdata for thumbnail to no modify the file
This prevents that file to be considered opened just for creating
the thumbnail for it.
2023-12-15 15:18:04 +01:00
Andrey Antukh
ac20451ae7 Simplify feature handling on get-file 2023-12-15 15:18:04 +01:00
Andrey Antukh
47baa21d53 🐛 Fix some edge cases on feature handling on binfile import process 2023-12-15 15:18:04 +01:00
Andrey Antukh
eee28a5793 Simplify feature handling on components-v2 migration functions 2023-12-15 15:18:04 +01:00
Andrey Antukh
da15924de0 🔥 Remove empty lines on ui.dashboard ns file 2023-12-15 15:18:04 +01:00
Andrey Antukh
eabed4325a Integrate feature handling on file data migration
Make it less error prone
2023-12-15 15:18:04 +01:00
Andrey Antukh
f01cad9ce7 🐛 Fix incorrect error reporting on clone template error 2023-12-15 15:18:04 +01:00
Andrey Antukh
78260fbc42 🐛 Fix no migration are applied on accessing to a file 2023-12-15 15:18:04 +01:00
Belén Albeza
7b36a7df8b 🐛 fix line-height and color of the message text in all modals 2023-12-15 13:15:11 +01:00
Andrey Antukh
74d985db13 Merge remote-tracking branch 'origin/staging' into develop 2023-12-14 15:04:45 +01:00
Alejandro
6b042be65c Merge pull request #3924 from penpot/niwinz-staging-bugfixes-1
🐛 Features bugfixes
2023-12-14 12:17:35 +01:00
Alejandro
86a4833c4a Merge pull request #3923 from penpot/hiru-components-bugfix-1
Some components bugfix
2023-12-14 12:15:36 +01:00
Andrey Antukh
e4d86cbb39 🐛 Fix incorrect feature handling on checking file features 2023-12-14 12:09:31 +01:00
Andrey Antukh
611594a392 Add general features handling improvements 2023-12-14 10:35:24 +01:00
Andrey Antukh
bdb1742d59 🐛 Fix incorrect feature checking on move project 2023-12-14 10:35:24 +01:00
Andrey Antukh
ba01f314dd 🐛 Fix incorrect feature context setup on file update 2023-12-14 10:35:24 +01:00
Andrey Antukh
517c913af9 Improve feature handling on file importation process 2023-12-14 10:35:24 +01:00
Andrey Antukh
08b9178a65 🐛 Fix incorrect behavior on set-file-shared rpc method 2023-12-14 10:35:24 +01:00
Andrey Antukh
b19a6321de 🐛 Fix feature validation on moving projects 2023-12-14 10:35:24 +01:00
Andrey Antukh
2dbe7bca07 Add general improvements to file validation and repair api 2023-12-14 10:35:24 +01:00
Andrés Moya
fd5fd87360 🐛 Fix propagation of changes with nested components 2023-12-14 08:54:00 +01:00
Alejandro Alonso
a4919e3b53 Merge remote-tracking branch 'origin/staging' into develop 2023-12-14 06:43:39 +01:00
Alejandro
47bf817462 Merge pull request #3906 from penpot/palba-bugfixing9
🐛 Bugfixing
2023-12-14 06:41:52 +01:00
Pablo Alba
f5904cee59 🐛 Validate and repair also orphan shapes 2023-12-14 06:36:37 +01:00
Pablo Alba
f213992c09 🐛 Show component name in copies component panel for deleted ones 2023-12-14 06:36:30 +01:00
Alejandro
419cc2e848 Merge pull request #3919 from penpot/palba-bugfixing-10
Bugfixing
2023-12-14 06:34:48 +01:00
Andrey Antukh
db713c2d61 Merge remote-tracking branch 'origin/staging' into develop 2023-12-13 21:28:19 +01:00
Aitor
503852f686 🐛 Fix placeholder being visible behind content 2023-12-13 21:27:53 +01:00
Pablo Alba
b5296613de 🐛 Validate and repair also orphan shapes 2023-12-13 17:59:55 +01:00
Belén Albeza
05614a345d 🐛 fix modal text color + remove lines in shared library modal 2023-12-13 16:32:26 +01:00
alonso.torres
4832b718da 🐛 Fix problem with menu colors 2023-12-13 16:12:41 +01:00
alonso.torres
625f99c933 🐛 Fix tutorial button style 2023-12-13 16:12:41 +01:00
alonso.torres
6ed1d223bf 🐛 Add scroll to login 2023-12-13 16:12:41 +01:00
alonso.torres
39856c8f6a 🐛 Improve inspect tab 2023-12-13 16:12:41 +01:00
alonso.torres
e2446fcc62 🐛 Fix problems in inspect tab 2023-12-13 16:12:41 +01:00
alonso.torres
9834195f0e 🐛 Fix scroll so it's not hidden against palette 2023-12-13 16:12:41 +01:00
alonso.torres
ffa37d26fc 🐛 Add padding to inspect help 2023-12-13 16:12:41 +01:00
alonso.torres
db3d7af0b8 🐛 Hide guides parameters when hiding guides 2023-12-13 16:12:41 +01:00
alonso.torres
85c301c26b 🐛 Change order to create layout panel 2023-12-13 16:12:41 +01:00
alonso.torres
18d954faba 🐛 Fix overflow library name 2023-12-13 16:12:41 +01:00
alonso.torres
7d98833e4e 🐛 Reorder buttons for layout menu 2023-12-13 16:12:41 +01:00
alonso.torres
aa3fe1cd2b 🐛 Fix problems with assets 2023-12-13 16:12:41 +01:00
alonso.torres
e884cba002 🐛 Fix visual problems 2023-12-13 16:12:41 +01:00
alonso.torres
030ff398ed Improved dashboard thumbnails 2023-12-13 16:12:41 +01:00
alonso.torres
5522430afe 🐛 Fix hover style in dashboard 2023-12-13 16:12:41 +01:00
alonso.torres
6969f8be03 🐛 Fix presence widget 2023-12-13 16:12:41 +01:00
alonso.torres
9ac8e72b23 🐛 Fix strange visual in assets 2023-12-13 16:12:41 +01:00
Belén Albeza
bd2a3dc937 🐛 fix substyles and collapsing in imported svg attributes 2023-12-13 16:09:17 +01:00
Belén Albeza
93815e1b0d 🐛 fix text not being truncated with an ellipsis in the interactions panel 2023-12-13 15:43:07 +01:00
Belén Albeza
0a3a896dc9 🐛 fix wrong spacing between interactions in the prototype tab 2023-12-13 15:43:07 +01:00
Belén Albeza
476e5d2358 🐛 Fix text color on interactions panel for light theme 2023-12-13 15:43:07 +01:00
Andrés Moya
02986f81bd 🐛 Avoid linking to remote main, when adding a shape to a copy
For example, when doing a reset overrides after a component switch
2023-12-13 15:37:15 +01:00
Andrey Antukh
936fb2b6f1 🐛 Decouple file validation from file schema validation 2023-12-13 14:20:07 +01:00
Andrey Antukh
d5e3cba92c 🐛 Fix issue on set-file-shared 2023-12-13 14:20:07 +01:00
Andrey Antukh
55f7656b77 🐛 Fix incorrect internal features handling on duplicating a file
Mainly because of incorrect collection of new features on file migration
when a file is duplicated. The original file is not touched.
2023-12-13 14:20:07 +01:00
Andrey Antukh
417366d998 Reorganize fdata/pointer-map feature helpers
Mainly move all pointer-map related helpers from app.rpc.commands.files
to the the app.features.fdata namespace and normalizes codestile around
feature handling on all affected code.

This commit also comes with several features related bugifxes on the
components-v2 migration code:

- properly migrate legacy feature names on apply components-v2 migration
- start using new fdata feature related functions
- prevent generation of a ephimeral pointer on each graphic migration
  operation; on large files this caused a very noticiable overhead of
  creating a big number of completly unused pointer maps
- do persistence after validation and not before
2023-12-13 14:20:07 +01:00
Andrey Antukh
5669bfc260 📎 Add minor improvements to start-dev script 2023-12-13 14:20:07 +01:00
Andrey Antukh
e1adb8fa8c ⬆️ Upgrade shadow-cljs to 2.26.2 2023-12-13 14:20:07 +01:00
Andrey Antukh
d1265a5ea4 📎 Add minor adjustments on CI config 2023-12-13 14:20:07 +01:00
Andrey Antukh
a341a956b8 🐛 Fix warnings on compiling frontend tests 2023-12-13 14:20:07 +01:00
Andrey Antukh
12d7b0521d 📎 Add better approach for set devenv jvm resource limits 2023-12-13 14:20:07 +01:00
Andrey Antukh
2e4a5aee61 🔥 Remove unnecesary call to px/wrap-bindings 2023-12-13 14:20:07 +01:00
Andrey Antukh
1d9481ceb7 💄 Fix formatting issues on backend features components ns 2023-12-13 14:20:07 +01:00
Andrey Antukh
03518a8da1 Add the ability to stream events on rpc methods 2023-12-13 14:20:07 +01:00
Pablo Alba
22f4ee82bb 🐛 Show component name in copies component panel for deleted ones 2023-12-13 13:03:14 +01:00
Alejandro Alonso
600b5ecdb7 📎 Prepare new development cycle 2023-12-13 12:49:55 +01:00
Andrey Antukh
f3e9efa6fe ♻️ Refactor srepl helpers 2023-12-13 11:56:20 +01:00
Andrey Antukh
76a6f077a6 🐛 Fix incorrect feature handling on absorb-library! fn
Used in shared flag assignation and library deletion
2023-12-13 11:56:20 +01:00
Andrey Antukh
0a77bae8a7 Improve options handling on db module 2023-12-13 11:56:20 +01:00
Andrey Antukh
6bff6d24b9 🐛 Fix issue on db/get-connectable impl 2023-12-13 11:56:20 +01:00
Andrey Antukh
2abf151add 🔥 Clean unused stuff on dev/user.clj file 2023-12-13 11:56:20 +01:00
Pablo Alba
b41f63c16e 🐛 Fix component restoration is not notified to files using the library 2023-12-12 23:39:16 +01:00
Pablo Alba
c236091645 🐛 Fix a copy inside a copy shouldn't be able to do an Update Main 2023-12-12 23:39:16 +01:00
Alejandro
653bc97aa1 Merge pull request #3913 from penpot/niwinz-develop-performance-path
 Add huge performance improvement to path parsing
2023-12-12 14:39:42 +01:00
Alejandro Alonso
fd115ae7a1 🎉 Add validation and repair to repl helpers 2023-12-12 14:11:28 +01:00
Alejandro Alonso
ca06263018 🎉 Improve validation and repair 2023-12-12 14:11:28 +01:00
Alejandro Alonso
20d4c67bf3 🐛 Fix importing frame components with fills from V1 to V2 2023-12-12 14:10:51 +01:00
Andrey Antukh
58f6c39d05 ⬆️ Recompile UUIDv8 class with jdk21 target 2023-12-12 09:18:12 +01:00
Andrey Antukh
2dd1858026 Reimplement path parsing using native lang 2023-12-12 09:18:12 +01:00
Andrey Antukh
f7acb9bfb8 📎 Update common repl script 2023-12-12 00:14:08 +01:00
Andrey Antukh
97b4832027 ⬆️ Update common dependencies 2023-12-12 00:13:47 +01:00
Andrey Antukh
51ff9026b1 ⬆️ Change default java compilation target to jdk21 2023-12-12 00:12:38 +01:00
Andrey Antukh
bfc124b907 🐛 Fix incorrect feature checkong on get-viewer-bundle rpc method 2023-12-11 19:00:37 +01:00
Andrey Antukh
afa735a9c1 Add protection for version inconsistency on opening or editing file 2023-12-11 17:14:20 +01:00
Andrey Antukh
ad0378270f Add missing sm/define on some file and file-thumbnails rpc methods 2023-12-11 17:14:20 +01:00
Andrey Antukh
f1d8abf160 Migrate file feature names when fdata migrations are applied 2023-12-11 17:14:20 +01:00
Andrey Antukh
8b92680a82 🐛 Fix incorrect feature checking on movig files between teams 2023-12-11 17:14:20 +01:00
Andrey Antukh
12907771b0 Move paste feature checking function to common/features 2023-12-11 17:14:20 +01:00
Andrey Antukh
ea156198c6 🐛 Use correct error codes on feature checking functions 2023-12-11 17:14:20 +01:00
Andrey Antukh
22757a449f Add minor performance enhancements on template setup service 2023-12-11 17:14:20 +01:00
Andrey Antukh
f5ec818fc7 Use sm/define on management rpc comnand schemas 2023-12-11 17:14:20 +01:00
Andrey Antukh
daec51bb7d Add feature naming migration on file importation 2023-12-11 17:14:20 +01:00
Andrey Antukh
2c8e29d1df 🔥 Remove verbose logging on rasterizer 2023-12-11 17:14:20 +01:00
Andrey Antukh
fe0447e0e5 🐛 Fix issues on rasterizer fallback 2023-12-11 17:14:20 +01:00
Andrey Antukh
efd0ad802c Add minor improvements to CI config 2023-12-11 17:14:20 +01:00
alonso.torres
2a9b99e086 Merge remote-tracking branch 'origin/feature-grid' into develop 2023-12-11 14:55:58 +01:00
Eva Marco
1e7ffb10b9 Merge pull request #3900 from penpot/alotor-grid-improvements
Alotor grid improvements
2023-12-11 14:36:28 +01:00
elhombretecla
cc66182522 Merge pull request #3907 from penpot/alotor-login-styles
💄 Change login UI
2023-12-11 14:26:39 +01:00
alonso.torres
6bbe249773 💄 Change login UI 2023-12-11 14:08:48 +01:00
alonso.torres
a0a479b08c ♻️ Changed layers component to reuse it in viewer 2023-12-11 13:06:17 +01:00
alonso.torres
dfd8ff96b7 🐛 Add change type of layout button 2023-12-07 16:54:48 +01:00
alonso.torres
92dc8ae416 🐛 Select hidden layers on enter key 2023-12-07 16:54:48 +01:00
alonso.torres
dc2c83bb62 🐛 Fix problems with absolute positioning and hidden elements 2023-12-07 16:54:48 +01:00
alonso.torres
f6c2d0646d 🐛 Fix problem with grid components thumbnails 2023-12-07 16:54:48 +01:00
alonso.torres
39b41d7037 Reorder grid tracks moving content 2023-12-07 16:54:48 +01:00
alonso.torres
e75fb67eec 🐛 Remove negative values from the input in teh grid editor 2023-12-07 16:54:48 +01:00
alonso.torres
8b2ae380b0 🐛 Removed locate grid from normal grid menu 2023-12-07 16:54:47 +01:00
alonso.torres
96f2b13d74 ♻️ Refactor the layers css 2023-12-07 16:54:47 +01:00
alonso.torres
aab53b40bd 🐛 Fix problem with highlight and fonts 2023-12-07 16:54:20 +01:00
alonso.torres
c609d2dec6 Select on track row/column selects cells 2023-12-07 16:54:20 +01:00
alonso.torres
88d259a123 Highlight elements on hover in grid editor panel 2023-12-07 16:54:20 +01:00
Pablo Alba
cc9e517720 🐛 Fix validation error detaching copy inside main 2023-12-07 12:58:22 +01:00
Aitor
fd43091d3a 🐛 Fix components assets blend mode not applied 2023-12-07 12:57:27 +01:00
Aitor
e9ae4251ff 🐛 Fix firefox showing old imposter 2023-12-07 12:57:27 +01:00
Aitor
f7c616206a 🐛 Fix cropped imposters 2023-12-07 12:57:27 +01:00
Aitor
4e87341c1e Add imposter placeholders 2023-12-07 12:57:27 +01:00
Alejandro Alonso
4324460b00 🐛 Fix transform a group to boolean in a component with a copy 2023-12-07 12:43:28 +01:00
Alejandro Alonso
9216e3cafd 🐛 Fix images for canvas background 2023-12-07 12:37:54 +01:00
Andrey Antukh
87df30eefe Merge pull request #3892 from penpot/superalex-fix-ungroup-a-copy
🐛 Fix ungroup a component
2023-12-07 12:35:49 +01:00
Alejandro Alonso
a9ba35c0d2 🐛 Fix ungroup a component copy 2023-12-07 12:35:17 +01:00
Pablo Alba
eea55706a4 Merge pull request #3893 from penpot/palba-bugfixing7
Palba bugfixing7
2023-12-05 18:46:15 +01:00
Pablo Alba
a1e810317a 🐛 Old thumbnail invalidation on frames after sync 2023-12-05 18:39:20 +01:00
Pablo Alba
6a5d9402d5 🐛 Fix sometimes sync of adding/removing shapes fails 2023-12-05 18:37:55 +01:00
alonso.torres
fa90403d84 🐛 Fix absolute layout 2023-12-04 19:55:04 +01:00
alonso.torres
b05f48ca5f Rename grid to guides 2023-12-04 19:55:04 +01:00
alonso.torres
c13ec3a1e0 🐛 Fix icon for cell coordinates 2023-12-04 19:55:04 +01:00
alonso.torres
d3b71889ae Add help button to flex options 2023-12-04 19:55:04 +01:00
alonso.torres
23b5eeaf68 🐛 Fix problem when duplicating grid 2023-12-04 19:55:04 +01:00
alonso.torres
edf6ea1cb5 Add locate and help button 2023-12-04 19:55:04 +01:00
alonso.torres
a13ebbaa43 Add dropdown for layout creation 2023-12-04 19:55:04 +01:00
alonso.torres
4f6b21c41c 🐛 Fix problem with align-self in grid 2023-12-04 19:55:04 +01:00
alonso.torres
203f36e064 🐛 Fix negative sizes in tracks grid editor 2023-12-04 19:55:04 +01:00
alonso.torres
41d420234a 🐛 Fix track info overflowing 2023-12-04 19:55:04 +01:00
alonso.torres
b5a9e28d0a 🐛 Fix selection of paths without background 2023-12-04 19:55:04 +01:00
alonso.torres
10324b13ca 🐛 Fix problem when selection shape while grid editing 2023-12-04 19:55:04 +01:00
alonso.torres
f3cd384e8e 🐛 Fix undo/redo in grid editor 2023-12-04 19:55:04 +01:00
Pablo Alba
fc1db9b985 🐛 Enhancement on old thumbnail invalidation after sync 2023-12-04 17:12:33 +01:00
Pablo Alba
3e965c96e7 🐛 Fix when changing order on main+flex, the copies are badly updated 2023-12-04 17:12:33 +01:00
Pablo Alba
76ec610d44 🐛 Fix you can move a shape outside of a copy 2023-12-04 17:12:33 +01:00
Pablo Alba
20a86ad65a 🐛 Fix Old thumbnail present after component sync 2023-12-04 17:12:33 +01:00
Pablo Alba
05a392d093 🐛 Fix name of the component not updating on update main 2023-12-04 17:12:33 +01:00
Pablo Alba
85ac199d81 🐛 Fix user can rename a component with only spaces inside a group 2023-12-04 17:12:33 +01:00
Pablo Alba
d57bfa98a3 Merge pull request #3887 from penpot/hiru-fix-validation
🐛 Fix validation in a main with a nested copy
2023-12-04 13:31:05 +01:00
Andrés Moya
20dbd75f02 🐛 Fix validation in a main with a nested copy 2023-12-04 13:18:22 +01:00
alonso.torres
674d69c92b 🐛 Fix problem duplicating objects with alt 2023-12-04 12:27:40 +01:00
Andrey Antukh
9335ebadb1 🐛 Fix incorrect minio setup on devenv 2023-12-04 11:13:52 +01:00
alonso.torres
f27343fcbd Merge remote-tracking branch 'origin/feature-grid' into develop 2023-12-04 09:59:33 +01:00
alonso.torres
fcbebf0f82 🐛 Fix problem when duplicating grid 2023-12-04 09:58:25 +01:00
Alejandro
573ce0e4ee Merge pull request #3882 from penpot/alotor-new-ui-fixes
New UI Fixes
2023-12-01 16:45:05 +01:00
alonso.torres
e9a42bbc69 💄 Small visual fixes 2023-12-01 15:49:41 +01:00
alonso.torres
76a2f9bc8c Dashboard respect ratio for thumbnails 2023-12-01 15:42:13 +01:00
Andrés Moya
a4f32de9a1 Revert "🐛 Fix synchronization"
This reverts commit dd363c10a0.
2023-12-01 15:31:26 +01:00
Eva Marco
990f63a136 Merge pull request #3873 from penpot/alotor-login-ui
New UI for Login
2023-12-01 13:03:15 +01:00
alonso.torres
668f443149 Add code highlight dark and light modes 2023-12-01 12:52:02 +01:00
alonso.torres
c601cca288 Improve design of input fields 2023-12-01 11:49:55 +01:00
alonso.torres
fa711cdd75 💄 New UI for auth screens 2023-12-01 11:49:55 +01:00
alonso.torres
727d3cfb77 Change css modules resolving 2023-12-01 11:49:55 +01:00
Aitor Moreno
3d5fd49b2e Merge pull request #3859 from penpot/hiru-group-library-backup
Group assests in boards in Library backup page
2023-11-30 17:28:40 +01:00
Aitor
f477de962d Cache rasterizer resources 2023-11-30 17:28:11 +01:00
Andrés Moya
dd363c10a0 🐛 Fix synchronization 2023-11-30 16:33:20 +01:00
Aitor
aa6fdf10f9 🐛 Fix rasterizer log level 2023-11-30 15:43:52 +01:00
Alejandro Alonso
18acc7c7c8 🐛 Fix libraries dashboard view 2023-11-30 13:41:49 +01:00
Aitor
1a831eddc5 Lazy load dashboard grid images 2023-11-30 13:41:05 +01:00
Alejandro
a397f25cb2 Merge pull request #3867 from penpot/niwinz-develop-fmt-clj-backend
💄 Reformat backend clj files
2023-11-29 14:05:57 +01:00
Andrés Moya
204a253635 Group assets inside frames in Library backup page 2023-11-29 13:56:20 +01:00
Andrey Antukh
9fe32bb290 💄 Fix format issues on exporter module 2023-11-29 12:56:11 +01:00
Andrey Antukh
87615ce221 💄 Fix format issues on backend module 2023-11-29 12:55:58 +01:00
Andrey Antukh
99e323dabc Detect if rasterizer iframe is blocked 2023-11-29 12:06:34 +01:00
Aitor
16c8c4bd2a Use subdomain for rasterizer (OOPIF) 2023-11-29 12:06:34 +01:00
Alejandro
7404933e99 Merge pull request #3854 from penpot/niwinz-develop-yetti-update
 Update yetti and simplify internal worker module
2023-11-29 12:01:33 +01:00
Alejandro
d58742bda6 Merge pull request #3857 from penpot/niwinz-develop-cljfmt
🎉 Add clojure fmt linter and fixer
2023-11-29 11:54:30 +01:00
Andrey Antukh
f19298f6b3 🎉 Add clj fmt checking on CI and fmt fix script 2023-11-29 11:48:38 +01:00
Andrey Antukh
d55d248e8d Add cljfmt to devenv docker image 2023-11-29 11:29:21 +01:00
Andrey Antukh
3e7db452b9 🔥 Remove node workspaces 2023-11-29 11:25:27 +01:00
Aitor Moreno
c2b752e560 Merge pull request #3865 from penpot/palba-bugfixing5
Bugfixing
2023-11-29 11:09:41 +01:00
Andrey Antukh
01ab34abc5 📎 Set correct version on package.json file 2023-11-29 10:49:25 +01:00
Andrey Antukh
aa2f7df28f ⬆️ Update yarn to 4.0.2 and start using npm workspaces 2023-11-29 10:44:36 +01:00
Andrey Antukh
f7038cdda7 🔥 Clean frontend package.json and yarn.lock files 2023-11-29 10:44:36 +01:00
Andrey Antukh
89a7a6a414 🔥 Remove cypress directory and related files 2023-11-29 10:44:36 +01:00
Alejandro
3246c196d1 Merge pull request #3863 from penpot/audriu-Ctrl-Plus-to-zoom-into-Canvas
 Override browser zoom with penpot zoom
2023-11-29 09:28:01 +01:00
Andrey Antukh
0977799960 💄 Add minor cosmetic changes to the use-dynamic-grid-item-width hook 2023-11-29 09:15:53 +01:00
Andrey Antukh
82dc1526d4 Add performance oriented refactor for mouse streams 2023-11-29 09:15:53 +01:00
Andrey Antukh
b6ef21e121 Add performance oriented refactor for keyboard streams 2023-11-29 09:15:53 +01:00
Audrius Molis
9bb2c79ef8 Override browser default zoom shortcuts with penpot zoom 2023-11-29 09:15:53 +01:00
Pablo Alba
ac6258043e 🐛 Fix missing empty message on swap panel 2023-11-28 22:06:29 +01:00
Pablo Alba
d30dc6b34b 🐛 Fix cut-paste main component outside another 2023-11-28 21:37:24 +01:00
Pablo Alba
f261cf6e63 🐛 Fix bad switch paths on files migrated to v2 2023-11-28 21:37:12 +01:00
Pablo Alba
9acab2a28a 🐛 Validation error on making a copy of a component that contains a group on a frame 2023-11-28 21:37:12 +01:00
Aitor Moreno
dde27eb736 Merge pull request #3851 from penpot/niwinz-develop-thumbnails-storage-deduplicate
 Add file object thumbnail deduplication mechanism
2023-11-28 17:49:37 +01:00
Aitor Moreno
6ed35ffdc8 Merge pull request #3856 from penpot/niwinz-develop-bugfixes-1
🐛 Add missing retry cancelation when thumbnail is discarded
2023-11-28 17:48:08 +01:00
Andrey Antukh
4a4713ba82 📎 Improve reporting of mc client on start-dev and repl scripts 2023-11-28 17:33:04 +01:00
Aitor
39635cf5df ♻️ Refactor how fonts are passed to raster 2023-11-28 17:33:04 +01:00
Aitor
8f356b679d Don't use data-uris for resources 2023-11-28 17:33:04 +01:00
Andrey Antukh
5486ab43a8 🐛 Add missing retry cancelation when thumbnail is discarded 2023-11-28 16:51:59 +01:00
Pablo Alba
240718f2b2 🐛 Fix Double click on asset to go to main component fail when the library is in a nother project 2023-11-28 15:23:34 +01:00
Pablo Alba
ab8155cec2 🐛 Fix can drag&drop assets of an external library 2023-11-28 15:23:34 +01:00
Pablo Alba
289e4aa7bf 🐛 Fix validation error on making a copy of a component that contains a group 2023-11-28 15:23:34 +01:00
Andrey Antukh
c97362aee4 Merge remote-tracking branch 'origin/staging' into develop 2023-11-28 14:16:57 +01:00
Pablo Alba
1bc9632d4c Merge pull request #3862 from penpot/hiru-fix-duplicate-nested
🐛 Fix validation error on duplicating a component with nested copies
2023-11-28 12:24:36 +01:00
Andrés Moya
1a146dbab7 🐛 Fix validation error on duplicating a component with nested copies 2023-11-28 12:06:13 +01:00
Eva Marco
ffd36df0e1 Merge pull request #3853 from penpot/alotor-dashboard-ui
Refactor Dashboard UI
2023-11-28 10:39:17 +01:00
alonso.torres
a899d94619 Improvements after review 2023-11-28 10:32:50 +01:00
Alejandro
9a5234737e Merge pull request #3861 from penpot/superalex-fix-disable-images-for-selected-colors
🐛 Disable images for selected colors
2023-11-28 10:30:03 +01:00
Alejandro Alonso
78104ecf55 🐛 Disable images for selected colors 2023-11-28 10:19:40 +01:00
Stas Haas
527d7afb00 🌐 Add translations for: German.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-11-28 10:04:03 +01:00
alonso.torres
6b5c75bf6a 💄 Redesign error page 2023-11-28 09:23:38 +01:00
alonso.torres
c1882af124 💄 Cleaned styles for new UI 2023-11-28 09:23:38 +01:00
alonso.torres
e3b096110f 💄 Move styles to modules 2023-11-28 09:23:38 +01:00
alonso.torres
c98f2628f0 Add animate.css as library 2023-11-28 09:23:38 +01:00
alonso.torres
58afa7498e ♻️ Move card width calculation to hook 2023-11-28 09:23:38 +01:00
Alejandro
a9fc46f7e6 Merge pull request #3860 from penpot/superalex-fix-code-gen-when-just-one-fill
🐛 Fix code gen when just one fill
2023-11-28 09:10:13 +01:00
Andrey Antukh
6c8ea5d899 🐛 Fix issues on exporter configuration validation 2023-11-28 08:04:23 +01:00
Andrey Antukh
a91b2f1133 Apply schema improvements to profile rpc methods 2023-11-28 08:04:23 +01:00
Andrey Antukh
9b36ea99e6 Integrate backend rpc handlers to use schema improvements 2023-11-28 08:04:23 +01:00
Andrey Antukh
81dc76bb14 Add performance improvements on schema validation system 2023-11-28 08:04:23 +01:00
Alejandro Alonso
6bf7e95a74 🐛 Fix code gen when just one fill 2023-11-28 07:50:57 +01:00
alonso.torres
87d176fa2f 🎉 Add inline SVG and npm cli tools 2023-11-27 16:18:38 +01:00
Belén Albeza
ebd6cdfe29 🎉 Add Storybook to the project 2023-11-27 16:18:38 +01:00
Andrey Antukh
2295d085d3 Improve performance on error formating and reporting 2023-11-27 14:25:12 +01:00
Andrey Antukh
c64e14859c Simplify internal executor module 2023-11-27 14:25:12 +01:00
Andrey Antukh
1bd32327e5 🔥 Remove executor internal dependency on rpc routes module 2023-11-27 14:25:12 +01:00
Andrey Antukh
da7f88c7ca 🔥 Remove executor internal dependency on storage module 2023-11-27 14:25:12 +01:00
Andrey Antukh
97f8315cd0 🔥 Remove executor internal dependency from http assets module 2023-11-27 14:25:12 +01:00
Andrey Antukh
bc01afe158 🔥 Remove executor internal dependency from debug module 2023-11-27 14:25:12 +01:00
Andrey Antukh
d241b73940 🔥 Remove executor internal dependency on http client module 2023-11-27 14:25:12 +01:00
Andrey Antukh
ca6738d20c Remove executor dependency from awsns handlers 2023-11-27 14:25:12 +01:00
Andrey Antukh
54341d5b22 Make the RPC climit subsystem more robust 2023-11-27 14:25:12 +01:00
Andrey Antukh
bb5a4c0fa5 Update yetti and adapt for ring-2.0 2023-11-27 14:25:12 +01:00
Andrey Antukh
7a33817c22 📎 Fix linter issues on exporter 2023-11-27 14:16:17 +01:00
Alejandro Alonso
aca5289b21 🐛 Fix what happens when user click on an fill image recent color 2023-11-27 13:39:01 +01:00
Aitor Moreno
0528c26b5e Merge pull request #3847 from penpot/niwinz-develop-enhancements-11
 Add enhancements and safety checks to copy paste
2023-11-24 14:25:55 +01:00
Andrey Antukh
d82ebdc034 Add deduplication for file object thumbnails 2023-11-24 11:06:47 +01:00
Andrey Antukh
6d49e1cac5 🐛 Add missing index on file_tagged_object_thumbnail media_id field 2023-11-24 10:41:27 +01:00
Andrey Antukh
925f2dc30f Remove duplicated rpc method for creating file object thumbnails 2023-11-24 10:41:27 +01:00
Aitor
b566abbd04 🐛 Fix unnecessary queue request process 2023-11-24 10:09:57 +01:00
Andrey Antukh
c1bd1a945d 🐛 Fix incorrect bucket assignation on binfile thumbnails import 2023-11-24 08:43:23 +01:00
Aitor
1de2af744f ♻️ Refactor thumbnails queue to priority queue 2023-11-24 08:39:14 +01:00
Andrey Antukh
49203f53aa Merge pull request #3842 from penpot/azazeln28-fix-thumbnail-saved-in-wrong-bucket
🐛 Fix thumbnail saved in wrong bucket
2023-11-24 08:06:32 +01:00
Andrey Antukh
3eb1bb6487 Add logging/tracing improvements to binfile rpc impl 2023-11-24 08:06:01 +01:00
Andrey Antukh
852e7472b7 🐛 Fix thumbnail saved in wrong bucket 2023-11-24 08:06:01 +01:00
Pablo Alba
1adad4dbbc Merge pull request #3846 from penpot/hiru-components-bugfix2
🐛 Fix pasting a nested copy outside a component
2023-11-23 22:15:34 +01:00
Andrey Antukh
783e0470be Add general improvements to copy paste
Cleaning code and adding more safety checks
2023-11-23 17:19:37 +01:00
Andrey Antukh
37e4939af7 Add usability improvements to schema validation subsystem 2023-11-23 17:19:37 +01:00
Andrey Antukh
83c6354a0a Change order of hard and soft validation on file update 2023-11-23 16:58:38 +01:00
Andrey Antukh
79d9d79737 🔥 Remove unnecesary assert on get-profile rpc method 2023-11-23 16:58:38 +01:00
Andrés Moya
1804a9823f 🐛 Fix pasting a nested copy outside a component 2023-11-23 16:37:14 +01:00
Andrés Moya
9773aae5b6 🔧 Enable hard file validation in devenv 2023-11-23 14:00:39 +01:00
Pablo Alba
4be065c957 🐛 Fix moving a component inside another, that is inside another, on the layers tab 2023-11-23 13:38:02 +01:00
Pablo Alba
7e4e10ee08 🐛 Fix validation error on moving a copy or main out of a main 2023-11-23 13:38:02 +01:00
Pablo Alba
3983cb161e 🐛 Fix swap panel keeps open after undo 2023-11-23 13:38:02 +01:00
Pablo Alba
23527b1d19 🐛 Fix create a main component inside another and move one main inside another 2023-11-23 13:38:02 +01:00
Pablo Alba
cee827a97b 🐛 Fix swap is swapping main components on mixed 2023-11-23 13:38:02 +01:00
alonso.torres
58cb7af674 🐛 Fix problem with select 2023-11-23 13:03:30 +01:00
Pablo Alba
a29291e6f2 Merge pull request #3840 from penpot/hiru-bugfix-components-1
Several related bugfixes
2023-11-23 13:01:38 +01:00
Andrés Moya
8d5af748da 🐛 Fix creation of a copy inside a board 2023-11-23 12:45:20 +01:00
Stas Haas
d9fa8bbb06 🌐 Add translations for: German.
Currently translated at 99.6% (1316 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-11-23 11:04:30 +00:00
Andrés Moya
51e50ac301 🐛 Fix validation when pasting a copy into a component 2023-11-23 11:25:40 +01:00
Andrés Moya
b5af51b751 🐛 Fix propagation when adding a shape to a component 2023-11-23 10:31:46 +01:00
Alejandro
dce2eb03c0 Merge pull request #3814 from penpot/azazeln28-fix-color-picker
🐛 Fix color picker
2023-11-23 07:35:50 +01:00
Andrey Antukh
00a7b4fda8 Merge remote-tracking branch 'origin/feature-grid' into develop 2023-11-22 23:29:27 +01:00
Andrey Antukh
4cb69b8cb6 Merge pull request #3843 from penpot/niwinz-feature-grid-hotfix-2
🐛 Bugfixes backport to features-grid
2023-11-22 23:28:00 +01:00
alonso.torres
baa2b11226 🐛 Fix visual problem with sidebar 2023-11-22 23:22:16 +01:00
alonso.torres
9b9a882f43 🐛 Fix problem with exports layout 2023-11-22 23:22:07 +01:00
Alejandro Alonso
37e9d9819b 🐛 Fix repair for child not found situations 2023-11-22 23:16:31 +01:00
Alejandro Alonso
8325818da2 🐛 Fix can't instanciate a component inside a board 2023-11-22 23:16:31 +01:00
Alejandro Alonso
708c615c12 🐛 Fix validate and repair for orphan shapes 2023-11-22 23:16:31 +01:00
Alejandro Alonso
411499942c 🐛 Fix internal error when duplicating board which contains components 2023-11-22 23:16:31 +01:00
Alejandro Alonso
77bb1ff9a6 🐛 Fix internal server error when user wants to upload image in components block via '+' icon 2023-11-22 23:16:31 +01:00
Alejandro Alonso
531b1a93e9 🐛 Fix internal server error occurred when user has swapped the component and made an action 'Show main component' 2023-11-22 23:16:31 +01:00
Alejandro Alonso
c27639d02e 🐛 Fix after making 'Detach instance' in a component the swap sidebar was opened 2023-11-22 23:16:31 +01:00
Pablo Alba
9d8b7bc25c 🐛 Fix swap sidebar keeps opened for main component after making 'Restore main' or 'Show main' 2023-11-22 23:16:31 +01:00
Pablo Alba
34181d2855 🐛 Fix apply changes on components and libraries to Swap section in real time 2023-11-22 23:16:31 +01:00
Pablo Alba
a9d2728fc7 🐛 Fix No tooltip when user is hovering over the component in Swap sidebar 2023-11-22 23:16:31 +01:00
Pablo Alba
a40ddd6959 🐛 Fix impossible to swap component which is located into board 2023-11-22 23:16:31 +01:00
Alejandro Alonso
5285e1a4dd Improving code gen for multiple fills 2023-11-22 23:08:47 +01:00
Eva Marco
9f08e3b9e5 Merge pull request #3835 from penpot/alotor-hotfix-grid-layout
Grid environment fixes
2023-11-22 15:56:54 +01:00
alonso.torres
82cb70efac 🐛 Fix visual problem with sidebar 2023-11-22 09:54:18 +01:00
alonso.torres
427c1fcd6e 🐛 Fix problem with exports layout 2023-11-22 09:54:03 +01:00
Andrey Antukh
bb8c8f5a0c Add minor improvements to error reporting 2023-11-21 23:35:35 +01:00
Andrey Antukh
01a887c68c Merge branch 'feature-grid' into develop 2023-11-21 20:24:56 +01:00
Andrey Antukh
65aeda1dab Merge pull request #3832 from penpot/superalex-fix-child-not-found
🐛 Fix repair for child not found situations
2023-11-21 20:24:12 +01:00
Andrey Antukh
533ec36785 🐛 Prevent full dashboard state refetch on toggle visibility of templates 2023-11-21 20:18:04 +01:00
Andrey Antukh
81f100f012 🐛 Restore the ability to enable or disable onboarding modal with flags 2023-11-21 20:17:57 +01:00
Andrey Antukh
eadb67f728 🐛 Add missing default flag for styles/v2 2023-11-21 20:17:37 +01:00
Andrey Antukh
d12b6eb2b2 Merge pull request #3831 from penpot/niwinz-develop-enhancements-9
🐛 Minor bugfixes
2023-11-21 20:14:02 +01:00
Alejandro Alonso
406303b796 🐛 Fix repair for child not found situations 2023-11-21 20:10:50 +01:00
Eva Marco
a97ec1b6df Merge pull request #3829 from penpot/alotor-hotfix-grid-layout
🐛 Fix overflow in picker select
2023-11-21 19:24:54 +01:00
Andrey Antukh
6b5991ce46 Merge pull request #3822 from penpot/azazeln28-reload-imposter-on-error
 Reload imposter on image error
2023-11-21 17:29:40 +01:00
Andrey Antukh
2a1d8fd09d 🐛 Fix react warning on incorrect style on workspace presence component 2023-11-21 17:28:47 +01:00
Aitor
a73964ed8d Reload imposter on image error 2023-11-21 17:28:35 +01:00
Andrey Antukh
5a9c9dca12 🐛 Fix react key warning on readio-buttons component 2023-11-21 17:10:14 +01:00
Andrey Antukh
b65a013235 🐛 Prevent full dashboard state refetch on toggle visibility of templates 2023-11-21 17:10:14 +01:00
Alejandro Alonso
3a8ce38bdc 🐛 Fix can't instanciate a component inside a board 2023-11-21 16:55:30 +01:00
Alejandro Alonso
dc7bfab7ea 🐛 Fix validate and repair for orphan shapes 2023-11-21 16:55:30 +01:00
Alejandro Alonso
c10b8c81fd 🐛 Fix internal error when duplicating board which contains components 2023-11-21 16:55:30 +01:00
Alejandro Alonso
016ead108d 🐛 Fix internal server error when user wants to upload image in components block via '+' icon 2023-11-21 16:55:30 +01:00
Alejandro Alonso
bc95416592 🐛 Fix internal server error occurred when user has swapped the component and made an action 'Show main component' 2023-11-21 16:55:30 +01:00
Alejandro Alonso
54b5ee1d4d 🐛 Fix after making 'Detach instance' in a component the swap sidebar was opened 2023-11-21 16:55:30 +01:00
Andrey Antukh
243ce3650f 🐛 Restore the ability to enable or disable onboarding modal with flags 2023-11-21 16:38:48 +01:00
Andrey Antukh
a147009e81 🐛 Add missing default flag for styles/v2 2023-11-21 16:37:38 +01:00
alonso.torres
f00f33ad6d 🐛 Disable new ui in auth pages 2023-11-21 16:33:45 +01:00
alonso.torres
9773eeb632 🐛 Fix overflow in picker select 2023-11-21 14:38:55 +01:00
Andrey Antukh
2ebdaa7f75 📎 Enable worker on backend scripts/repl 2023-11-21 14:34:03 +01:00
Andrey Antukh
0766112071 Merge branch 'feature-grid' into develop 2023-11-21 13:54:00 +01:00
Andrey Antukh
264a3cf9a3 📎 Adjust exporter and frontend build scripts 2023-11-21 13:41:17 +01:00
Andrey Antukh
668fe2fc24 Adjust error reporting thresholds 2023-11-21 13:41:17 +01:00
Andrey Antukh
af64c2c46e 📎 Adjust exporter and frontend build scripts 2023-11-21 13:39:31 +01:00
Eva Marco
1f700b4755 Merge pull request #3828 from penpot/alotor-hotfix-grid-layout
Hotfix grid layout
2023-11-21 13:36:55 +01:00
Andrey Antukh
d1fba8982e Adjust error reporting thresholds 2023-11-21 13:35:19 +01:00
Andrey Antukh
c25f240857 🐛 Clean fdata from nils 2023-11-21 12:48:14 +01:00
Andrés Moya
055d8fecea 🐛 Skip validation in files with components v1 2023-11-21 12:47:58 +01:00
Andrés Moya
3dc629d2ad 🐛 Skip validation in files with components v1 2023-11-21 12:46:43 +01:00
Andrés Moya
fc312ee6dc 🔧 Explicitly set components-v2 feature in start scripts 2023-11-21 12:46:43 +01:00
Andrés Moya
391b859948 🐛 Preserve path when migrating graphics and add them in a specific group 2023-11-21 12:46:43 +01:00
alonso.torres
1b312cdfc3 Add collapse button to sources 2023-11-21 12:35:56 +01:00
alonso.torres
e2b28b3b3c Set grid editor shortcuts 2023-11-21 12:35:27 +01:00
Andrey Antukh
f66228c19d 🐛 Clean fdata from nils 2023-11-21 12:11:26 +01:00
Pablo Alba
2e6d57e57d 🐛 Fix swap sidebar keeps opened for main component after making 'Restore main' or 'Show main' 2023-11-21 08:46:45 +01:00
Pablo Alba
9aa80c840b 🐛 Fix apply changes on components and libraries to Swap section in real time 2023-11-21 08:46:45 +01:00
Pablo Alba
dec822de52 🐛 Fix No tooltip when user is hovering over the component in Swap sidebar 2023-11-21 08:46:45 +01:00
Pablo Alba
8fd16ff018 🐛 Fix impossible to swap component which is located into board 2023-11-21 08:46:45 +01:00
Andrey Antukh
d90e184b4d Add file soft validation support 2023-11-20 19:54:53 +01:00
Andrey Antukh
ac3d7f00d5 Make file schema validation configurable using flags 2023-11-20 19:42:46 +01:00
Andrey Antukh
0081db4770 Improve error reporting 2023-11-20 19:42:46 +01:00
Andrey Antukh
acb17b0552 🐛 Fix incorrect usage of mf/deps on layout_container ns 2023-11-20 19:42:46 +01:00
Andrey Antukh
366975f067 📎 Add debug.validate_schema helper 2023-11-20 19:42:46 +01:00
Andrey Antukh
28ce6d2489 🐛 Fix unexpected exception on change grid direction on grid editor 2023-11-20 19:42:46 +01:00
Andrey Antukh
ec8b68721b Improve schema validation handling
And properly honor the file-validation flag
2023-11-20 16:57:05 +01:00
Andrey Antukh
3eb987897a Parametrize exception handling behavior of components migration 2023-11-20 16:57:05 +01:00
Pablo Alba
cfdf7766e3 🐛 Fix restore main component on a copy of a component from a library 2023-11-20 14:23:53 +01:00
Pablo Alba
752b26e063 🐛 Fix go to main component in another file should open it on a new tab 2023-11-20 14:23:53 +01:00
Pablo Alba
29677d8085 🐛 Fix validation on :ref-shape-not-found and :component-not-found for deleted libraries 2023-11-20 14:23:53 +01:00
Pablo Alba
d2b207f306 🐛 Remove 'graphics' option from assets filter on new UI 2023-11-20 14:23:53 +01:00
Andrey Antukh
a0870624b6 📎 Temporary comment file schema validation 2023-11-20 12:03:27 +01:00
Andrey Antukh
6de55ab444 🐛 Fix incorrect changes handling on graphics migration 2023-11-20 11:21:13 +01:00
Andrey Antukh
24fc4d4d54 Add missing console.log on zip export error reporting 2023-11-20 11:21:13 +01:00
Andrey Antukh
344da75088 💄 Add cosmetic improvements on binfile rpc ns logging 2023-11-20 11:21:13 +01:00
Andrey Antukh
a89dcb9e86 Remove react warnings on zip exportation rendering process 2023-11-20 11:21:13 +01:00
Andrey Antukh
6ebcead94f 🐛 Fix incorrect feature checking on backend 2023-11-20 11:21:13 +01:00
Andrey Antukh
d10d8eed2b 🐛 Pass missing optimizer instance to rpc methods 2023-11-20 11:21:13 +01:00
Andrey Antukh
80bb689554 🐛 Fix unexpected value found on changes processing on components migration 2023-11-20 11:21:13 +01:00
Andrey Antukh
08166bcebf Add initial impl for migrate-components-v2 manage.py command 2023-11-20 11:21:13 +01:00
Andrey Antukh
c948f1a087 🐛 Send correct features on synchronous update-file operation 2023-11-20 11:21:13 +01:00
Andrey Antukh
973214ea50 Add proper error reporting on debug.validare fn 2023-11-20 11:21:13 +01:00
Andrey Antukh
f06be2727e 💄 Add minor cosmetic improvements on sitemap ns 2023-11-20 11:21:13 +01:00
Andrey Antukh
f2a4275531 🐛 Fix unexpected nil key on page-index after page creation 2023-11-20 11:21:13 +01:00
Andrey Antukh
63ed9cbbde 🐛 Fix feature handling on standard exportation 2023-11-20 11:21:13 +01:00
Andrey Antukh
e4283ee2e4 ♻️ Refactor dropdown-menu-item component 2023-11-20 11:21:13 +01:00
Andrey Antukh
f5296cafb1 📎 Add rationale comment on dom/get-data helper 2023-11-20 11:21:13 +01:00
Andrey Antukh
4248931dff Fix react warnings on workspace left header menus 2023-11-20 11:21:13 +01:00
Andrey Antukh
2e927d5640 🐛 Fix features handling on viewer 2023-11-20 11:21:13 +01:00
Alejandro
ef9c95a0a6 Merge pull request #3819 from penpot/azazeln28-fix-corrupted-thumbnail-rendering
🐛 Fix corrupted thumbnail rendering
2023-11-20 11:20:15 +01:00
Aitor
3cbb60620a 🐛 Fix corrupted thumbnail rendering 2023-11-20 10:39:07 +01:00
alonso.torres
abcdc78bed 💄 Add shortcut to switch themes 2023-11-20 10:37:44 +01:00
alonso.torres
5f0bf84063 💄 Improve contrast for checkbox 2023-11-20 10:37:44 +01:00
Aitor
91f7874167 🎉 Import/export thumbnails in .penpot files 2023-11-20 10:12:33 +01:00
Eva
617edd0fa8 🐛 Fix small interface errors 2023-11-17 16:17:10 +01:00
Andrés Moya
dcd347ab4f Add a few small enhancements 2023-11-17 15:56:16 +01:00
Pablo Alba
6c1c780758 🐛 Add validation and repair for files with nil in component :objects 2023-11-17 15:56:16 +01:00
Aitor
5375fbf59e 🐛 Fix color picker 2023-11-17 13:34:47 +01:00
Andrés Moya
0eb66464ab Enable file validation by default in devenv 2023-11-17 09:59:20 +01:00
Aitor
c8073c2a37 🐛 Clear rect before rendering pixel overlay 2023-11-16 23:07:00 +01:00
Aitor
3c75cfd9c2 Reduce canvas instancing 2023-11-16 23:07:00 +01:00
Aitor
8fcd5f285d Remove data URIs from image embeds 2023-11-16 23:07:00 +01:00
Aitor
95d73494d6 Do not refetch data: URIs 2023-11-16 23:07:00 +01:00
Swapnil C
780edaac3b 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-16 19:03:41 +01:00
Pablo Alba
b98f693959 🐛 Fix when a component annotation is changed on a library, update dialog appears 2023-11-16 17:14:22 +01:00
Alejandro
463d81745b Merge pull request #3804 from penpot/niwinz-develop-enhancements-5
♻️ & 🐛 Bugfixes
2023-11-16 11:33:36 +01:00
Andrey Antukh
1864896b70 🐛 Fix pointer loading issue on link-file-to-library action 2023-11-16 11:07:36 +01:00
Andrey Antukh
c79e148497 🐛 Fix incorrect schema explain printing 2023-11-16 11:07:36 +01:00
Andrey Antukh
7e302cd21c Add better validation for recent-color change 2023-11-16 11:07:36 +01:00
Andrey Antukh
52fbc678f3 ♻️ Move app.common.pages to app.common.files 2023-11-16 11:07:36 +01:00
Alejandro
8345548a7a Merge pull request #3768 from penpot/eva-new-ui-modals
💄 Add new UI at modals
2023-11-16 10:54:48 +01:00
Pablo Alba
83d786743b Merge pull request #3803 from penpot/niwinz-develop-components-migration-4
🐛 Several bugfixes
2023-11-15 19:59:11 +01:00
Eva
6d64feda36 💄 Add new UI at modals 2023-11-15 17:46:51 +01:00
Eva Marco
59162e4f80 Merge pull request #3805 from penpot/alotor-ui-polish-2
💄 New UI polishing
2023-11-15 17:38:35 +01:00
alonso.torres
71d622bdae 💄 New UI polishing 2023-11-15 17:32:37 +01:00
Eva Marco
fe1a433440 Merge pull request #3800 from penpot/alotor-ui-polish
New UI Polishing
2023-11-15 14:16:56 +01:00
Andrey Antukh
d03577987e Ignore recent colors on importing a library 2023-11-15 14:01:34 +01:00
Andrey Antukh
aee516e642 Unify system binding on devenv repl and nrepl 2023-11-15 14:01:34 +01:00
Andrey Antukh
c022b71b59 Add better error reporting on template clone operation 2023-11-15 14:01:34 +01:00
Andrey Antukh
f1782f746d Add better error reporting on load-pointer function 2023-11-15 14:01:34 +01:00
Andrey Antukh
1457b7cf38 Add performance and reporting improvements to migration script 2023-11-15 14:01:34 +01:00
Andrey Antukh
4c190e385e Make the s3 client io-threads configurable and adaptable 2023-11-15 13:49:26 +01:00
Andrey Antukh
ed1c7dcc12 Set a concrete version of minio on devenv compose file 2023-11-15 13:49:26 +01:00
Andrey Antukh
ecd4f32689 🐛 Add missing features set forwarding on libraries fetching
on workspace initialization
2023-11-15 13:49:26 +01:00
Peter Strömberg
6594a8e8b3 🔧 Add dev deps.edn in the project root
Making clojure-lsp serve the whole repository when opened at the root
in, say, Calva.
2023-11-15 10:55:39 +01:00
Andrés Moya
08f12f4f6c 🐛 Handle correctly pointers when loading libraries 2023-11-15 10:13:24 +01:00
Andrés Moya
0dfe231dc3 🐛 Fix validation error when adding a shape to a main 2023-11-15 10:12:47 +01:00
alonso.torres
1f611dd81a 🐛 Fix disabled icons colors 2023-11-15 09:42:41 +01:00
alonso.torres
e1bbf96766 🐛 Fix problem with placeholder in opacity field 2023-11-15 09:42:41 +01:00
alonso.torres
6c003a4f24 🐛 Fix rounded corners on canvas color 2023-11-15 09:42:41 +01:00
alonso.torres
78332257aa 🐛 Fix problem with color inputs 2023-11-15 09:42:41 +01:00
alonso.torres
89a09091db 🐛 Fix problem with focus styles 2023-11-15 09:42:40 +01:00
Eva Marco
f855f9c46d Merge pull request #3795 from penpot/alotor-redesign-grid
 New UI for grid layout
2023-11-14 17:50:24 +01:00
alonso.torres
7ad747b9d0 New UI for grid layout 2023-11-14 15:58:35 +01:00
Andrés Moya
02612ab4ca 🐛 Avoid creating backup page if no components and no graphics 2023-11-14 14:15:29 +01:00
Andrés Moya
c7fdbe37f1 Report validation errors via log in migration 2023-11-14 14:15:29 +01:00
Andrés Moya
451d6c1d7b Add optional validation when migrating files to components-v2 2023-11-14 14:15:29 +01:00
Andrés Moya
3dfd54d8e2 Allow to analyze files with a function that needs libs 2023-11-14 14:15:29 +01:00
Aitor Moreno
099f9c074d Merge pull request #3611 from penpot/superalex-support-for-images-as-fills
🎉 Support for images as fills
2023-11-14 14:15:20 +01:00
Alejandro Alonso
1913395c47 🎉 Support for images as fills 2023-11-14 12:39:53 +01:00
Alejandro
875e94fad2 Merge pull request #3786 from penpot/niwinz-develop-repl-improvements
 🐛 Enhancements & Bugfixes
2023-11-14 12:30:08 +01:00
Eva Marco
2c9de7edf4 Merge pull request #3787 from penpot/palba-swap-new-ui
💄 New UI for Swap Component
2023-11-14 11:57:42 +01:00
Andrey Antukh
5ebef181ae Add the ability to setup custom tempdir on exporter 2023-11-14 10:55:55 +01:00
Andrey Antukh
26d3d7f1a8 🐛 Fix features related issues with render entrypoint (exporter) 2023-11-14 10:55:55 +01:00
Andrey Antukh
0a656e9e62 📎 Leave commented useful code that causes some warnings on load 2023-11-14 10:55:55 +01:00
Andrey Antukh
d5e34df364 🐛 Fix incorrect frontend error handling on import code 2023-11-14 10:55:55 +01:00
Andrey Antukh
9b3964e6d7 💄 Add naming improvements to some file type predicates 2023-11-14 10:55:55 +01:00
Andrey Antukh
1c75e5b46b 💄 Add minor cosmetic improvement on profile rpc ns 2023-11-14 10:55:55 +01:00
Andrey Antukh
9e4ed0ea92 Improve file validation process on update-file rpc method 2023-11-14 10:55:55 +01:00
Andrey Antukh
31c46a90b4 Add file structure validation on binfile import 2023-11-14 10:55:55 +01:00
Andrey Antukh
19c5d32a89 Improve efficiency and code style of file validate ns 2023-11-14 10:55:55 +01:00
Andrey Antukh
b37acf75ce Add the ability to setup custom tempdir on exporter 2023-11-13 19:09:01 +01:00
Andrey Antukh
3c64955b93 Add efficiency improvements to backend error reporting 2023-11-13 18:33:28 +01:00
Andrey Antukh
9d05e2260c 🐛 Fix incorrect local library indexing on components-v2 migration 2023-11-13 18:33:28 +01:00
Andrey Antukh
76bca216cb Enable by default file validation on start-dev command 2023-11-13 18:33:28 +01:00
Andrey Antukh
22a0aea2a1 📎 Add missing logger config on default log4j2.xml file 2023-11-13 18:33:28 +01:00
Andrey Antukh
34437ea5a5 🐛 Fix default flags on start-dev script 2023-11-13 18:33:28 +01:00
Andrey Antukh
59fe93cb45 🐛 Fix minor issue with pointer-map feature interaction with team features 2023-11-13 18:33:28 +01:00
Andrey Antukh
99f39c9777 Add improved REPL support 2023-11-13 18:33:28 +01:00
Pablo Alba
5cf93e7a3d 💄 New UI for Swap Component 2023-11-13 18:00:14 +01:00
Pablo Alba
de3605356c Merge pull request #3791 from penpot/hiru-fix-duplicated-nested-main
🐛 Convert in copies nested main instances when duplicating
2023-11-13 11:32:06 +01:00
Aimee
0b6633dc44 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Locness
ed2461c3ec 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Louis Chance
ae535b8ea1 🌐 Add translations for: French.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-11 14:34:11 +01:00
Andrés Moya
5fb4703d95 🐛 Convert in copies nested main instances when duplicating 2023-11-10 18:05:30 +01:00
Pablo Alba
69435e32d9 Merge pull request #3758 from penpot/hiru-bugfix-validation
🐛 Fix component-root when createing new component
2023-11-10 15:49:16 +01:00
Aitor
e24309b883 ♻️ Refactor thumbnails persistence 2023-11-10 14:15:54 +01:00
Andrés Moya
82c02634e9 🐛 Redo duplicate main to avoid several bugs 2023-11-10 13:33:37 +01:00
Andrés Moya
f1349facc1 🐛 Fix graphics conversion in migration to components-v2 2023-11-10 10:40:51 +01:00
Andrés Moya
9059663a87 🐛 Fix frame-id on migration to components-v2 2023-11-10 10:40:51 +01:00
Andrés Moya
19379fdd2c 🐛 Fix component-root when createing new component 2023-11-10 10:40:51 +01:00
Alejandro Alonso
a19f5fd305 🐛 Fix blur 2023-11-10 10:30:31 +01:00
Alejandro
a8eb5328a0 Merge pull request #3780 from penpot/niwinz-develop-components-migration-3
🐛 Features related bugfixes and other enhancements
2023-11-08 17:59:22 +01:00
Andrey Antukh
b892242915 🐛 Fix rpc climit initialization 2023-11-08 17:34:50 +01:00
Andrey Antukh
5d93f17efc 🐛 Fix session renewal mechanism 2023-11-08 17:11:42 +01:00
Andrey Antukh
76a2e9609f ⬆️ Update dependencies 2023-11-08 17:11:42 +01:00
Andrey Antukh
da68eae7c6 Add proper climit configuration for file-thumbnails 2023-11-08 17:11:42 +01:00
Andrey Antukh
3b463f334c Add minor improvement to s3 storage upload thread
Start using virtual threads
2023-11-08 17:11:42 +01:00
Andrey Antukh
fbdba39be9 🐛 Fix importation of zip files 2023-11-08 17:11:42 +01:00
Andrey Antukh
aadd312e39 🐛 Fix team image uploading 2023-11-08 14:13:41 +01:00
Andrey Antukh
f370f28ca6 Add improvements to the tmp file deletion scheduling 2023-11-08 14:13:41 +01:00
Andrey Antukh
aaf2179b20 🐛 Fix features related issues on viewer 2023-11-08 14:13:41 +01:00
Andrey Antukh
ec51e0c0d7 Add max-time constraint for migration 2023-11-08 13:18:50 +01:00
Andrey Antukh
8193cea7e1 Add feature-styles-v2 alternative flag for enable new styles 2023-11-08 10:45:28 +01:00
Andrey Antukh
b0418ff5f2 Add file snapshoting on migration 2023-11-08 10:45:08 +01:00
Andrey Antukh
47e877d6c3 Add minor internal db api improvements 2023-11-08 10:44:44 +01:00
Andrey Antukh
b32c8e2a83 🐛 Fix incorrect client features checking on file creation 2023-11-07 22:19:11 +01:00
Pablo Alba
94c834ae5e Merge pull request #3775 from penpot/alotor-fix-layout
Bugfixes
2023-11-07 19:01:18 +01:00
Eva Marco
e64878aef2 Merge pull request #3777 from penpot/alotor-gulp-cache
 Add cache to gulp compilation
2023-11-07 17:43:29 +01:00
Andrés Moya
b7a61aba7c 🐛 Fix validate script in frontend 2023-11-07 17:39:34 +01:00
alonso.torres
41df6fc126 Add cache to gulp compilation 2023-11-07 17:29:17 +01:00
Pablo Alba
64bb322de5 🐛 Fix go to main component in another file 2023-11-07 17:24:16 +01:00
Pablo Alba
3192b55836 🐛 Fix user can set a blank name for the component in assets 2023-11-07 17:24:16 +01:00
Pablo Alba
6b09ebb75d Add validate and repair for component instance head is not a frame 2023-11-07 17:06:39 +01:00
Andrés Moya
8b5b37fe1a 🐛 Fix bad frame-ids on converting components to v2 2023-11-07 17:06:39 +01:00
Andrey Antukh
4af76f9a9a Add backward compatibility layer for features handling 2023-11-07 16:47:32 +01:00
Aitor
7951350762 🐛 Fix db table tagged thumbnails 2023-11-07 16:01:00 +01:00
Pablo Alba
3448259c60 🐛 Fix typo in transducer that prevents component swap from open 2023-11-07 12:55:17 +01:00
Andrey Antukh
00afb841ac Add svg optimization on components migration process 2023-11-07 12:48:31 +01:00
Andrey Antukh
f92c6e5db4 📎 Move svg_optimizer.js under svg directory 2023-11-07 12:48:31 +01:00
Andrey Antukh
bb6fd4107b 🎉 Add migration scripts 2023-11-07 12:48:31 +01:00
Andrey Antukh
6f93b41920 🎉 Add features assignation for teams 2023-11-07 12:48:31 +01:00
Andrey Antukh
7db8d7b7ab 📎 Update backend scripts/repl file 2023-11-07 12:48:31 +01:00
Andrey Antukh
57c83b5d53 ♻️ Refactor internal backend error handling 2023-11-07 12:48:31 +01:00
Andrey Antukh
3ceb4cf895 ♻️ Make svg to shapes conversion code multiplatform
- Move clojure code to common
- Rewrite some native-js code into optimized clojure
2023-11-07 12:48:31 +01:00
Andrey Antukh
44845d5d94 🔥 Remove unused string related functions from common.data 2023-11-07 12:48:31 +01:00
Andrey Antukh
4925ca2de9 ⬆️ Update to clojure 1.12.0-alpha5 2023-11-07 12:48:31 +01:00
Andrey Antukh
93535b7df6 ⬆️ Update to jdk21 on devenv docker image 2023-11-07 12:48:31 +01:00
alonso.torres
6d5af8d6ef 🐛 Fix problem with layout sizing 2023-11-07 11:26:13 +01:00
alonso.torres
bec683d1ef 🐛 Fix problem resizing texts 2023-11-07 11:26:01 +01:00
alonso.torres
b71ed9f6f2 🐛 Fix crash when multiple typographies selected 2023-11-07 11:25:28 +01:00
alonso.torres
aa36d162f2 💄 Show rounded corners when rulers hiden 2023-11-07 11:25:03 +01:00
Andrés Moya
1bcaac1013 🐛 Force repair of some kind of errors 2023-11-07 11:11:14 +01:00
Oğuz Ersen
7c2fa2392f 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-11-06 19:34:48 +01:00
Luigi
736a26a46a 🌐 Add translations for: French.
Currently translated at 88.2% (1165 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-06 19:34:47 +01:00
Aitor Moreno
967c89a2d3 Merge pull request #3760 from penpot/niwinz-develop-styles-macro-fix
🐛 Fix unexpected exception on style related macros
2023-11-06 15:22:08 +01:00
Alonso Torres
ce1bf49606 🐛 Fix problems updating texts (#3765) 2023-11-06 14:29:09 +01:00
Eva Marco
761dd9d6c1 Merge pull request #3769 from penpot/palba-hide-new-css-for-components-sidebar
🐛 Hide new css system for component right sidebar until the new design is done
2023-11-06 12:18:24 +01:00
Pablo Alba
5a3a6e3237 🐛 Hide new css system for component right sidebar until the new design is done 2023-11-06 12:08:56 +01:00
Eva Marco
bd1c6296a9 Merge pull request #3752 from penpot/alotor-redesign-rules
💄 Redesign rulers
2023-11-06 12:05:27 +01:00
Eva Marco
9d6cc1ed4a Merge pull request #3741 from penpot/palba-fix-hover-on-library-preview
🐛 Fix hover on library preview
2023-11-06 12:03:53 +01:00
Belén Albeza
2190616957 Strip extension for uploaded image files 2023-11-06 11:58:12 +01:00
Pablo Alba
c3c667d4b5 Rework of the search function in swap components 2023-11-06 11:55:39 +01:00
Pablo Alba
b07e9bdd37 🐛 Fix 'Reset override' menu option still present after remove library 2023-11-06 10:17:21 +01:00
alonso.torres
d0fa58c66c Touch component on style change 2023-11-06 09:49:30 +01:00
Luigi
23853345cc 🌐 Add translations for: French.
Currently translated at 87.8% (1159 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-11-05 18:33:20 +01:00
Pablo Alba
da4ba3c9fe 🐛 Fix restore component on library with deleted page 2023-11-03 13:41:52 +01:00
Pablo Alba
d938802ecf 🐛 Fix drawing over copy adds the shape to the copy 2023-11-03 13:41:11 +01:00
Andrey Antukh
ab1159741e 🐛 Fix unexpected exception on style related macros
when css json file does not exists
2023-11-03 12:36:05 +01:00
Belén Albeza
ac9c5f4606 🎉 Implement sending comments on ctrl+enter (#3749)
This enables sending comments with ctrl+enter / cmd+enter (in addition to the existing clicking on the "Post" button), in the style of most chat apps.

Signed-off-by: Belén Albeza <belen@hey.com>
2023-11-02 16:33:09 +01:00
alonso.torres
ffcec9ec03 🐛 Fix problem with alignment 2023-11-02 15:27:10 +01:00
alonso.torres
e55c3f3841 💄 Redesign rulers 2023-11-02 15:15:33 +01:00
Aitor Moreno
64a566a0f6 Merge pull request #3744 from penpot/palba-bugfixing
🐛 Bug fixing components
2023-11-02 13:59:43 +01:00
Aitor
bb4d3583e1 🐛 Fix missing schema tag option 2023-11-02 11:06:30 +01:00
alonso.torres
dd8480cd87 Fix problem with garbage collection 2023-11-02 11:06:30 +01:00
Aitor
c28c55bf0b 🎉 Add tag property to thumbnails 2023-11-02 11:06:30 +01:00
Andrés Moya
e568ad0370 🐛 Fix automatic frame assignment in clone-object 2023-11-02 10:25:07 +01:00
Pablo Alba
2e27a5b4b6 🐛 Fix 'Create component' option is absent in context menu when user has selected multiple layers 2023-11-02 10:23:28 +01:00
Andrés Moya
9ff3095568 Hide asterisk for overriden copies, except when debugging 2023-11-02 10:14:58 +01:00
alonso.torres
5111c3f0d2 Improve performanc for ignore-tree function 2023-10-31 17:31:04 +01:00
Aitor Moreno
218e08c919 Merge pull request #3732 from penpot/alotor-improve-inspect-grid
 Add read-only pill to the workspace
2023-10-31 16:34:37 +01:00
Aitor Moreno
2e3bd97d17 Merge pull request #3727 from penpot/alotor-new-grid
 Create grid from selection
2023-10-31 16:20:56 +01:00
Pablo Alba
f267df5c6d Merge pull request #3743 from penpot/hiru-components-bugfix
Hiru components bugfix
2023-10-31 15:35:00 +01:00
Pablo Alba
e01b2e9a5f 🐛 Fix on shared libraries updates popup with several libraries, the update button remains disabled after updating one 2023-10-31 13:24:01 +01:00
Pablo Alba
08c69e751d 🐛 Do not show 'Add annotation' menu entry for components with annotation 2023-10-31 11:56:01 +01:00
Pablo Alba
07bc5d911b 🐛 Fix open path when showing a component in assets 2023-10-31 11:23:31 +01:00
Andrés Moya
1ad3855aef 🔧 Validate frame-id is valid ancestor 2023-10-31 11:22:02 +01:00
Andrés Moya
511d92c6aa 🐛 Fix unneeded detaches when pasting components 2023-10-31 11:01:06 +01:00
Andrés Moya
c69cc9d298 bug: Fix component-root in nested instances when creating new component 2023-10-31 10:48:52 +01:00
Andrés Moya
146cd56ba5 🐛 Fix infite loop in some cases when resetting changes 2023-10-31 10:48:52 +01:00
alonso.torres
e4cadc36b0 🐛 Fix problem when creating child and update component 2023-10-31 09:53:37 +01:00
Pablo Alba
4456b08dae 🐛 Fix After cancel edit annotation its content is not shown in full view 2023-10-31 09:52:28 +01:00
Pablo Alba
3a1f861303 🐛 Do not allow to create an empty annotation 2023-10-31 09:49:21 +01:00
Pablo Alba
dd1200e76f 🐛 Fix hover on library preview 2023-10-30 22:36:18 +01:00
Pablo Alba
0c1f6f8e71 🐛 Fix swap components duplicates component 2023-10-30 11:27:35 +01:00
alonso.torres
351f7fd1bb Create grid from selection 2023-10-25 15:03:09 +02:00
Pablo Alba
02399add7a On swap components do not render miniatures for components outside the screen 2023-10-25 14:05:45 +02:00
alonso.torres
b47c0dd0b7 Add read-only pill to the workspace 2023-10-25 13:25:28 +02:00
alonso.torres
587735a901 🐛 Fix problem with migration numbers 2023-10-25 12:26:01 +02:00
Andrey Antukh
ac207e276c Restore performance optimization of direct prop access
Using safer optional chain operator
2023-10-23 10:00:07 +02:00
Andrey Antukh
b70880420a Add improvements to dbg interface 2023-10-23 10:00:07 +02:00
Andrey Antukh
b6a312815c Add better logging on sendmail task 2023-10-23 10:00:07 +02:00
Eva Marco
a421e39b6f Merge pull request #3720 from penpot/alotor-fix-inspect
🐛 Fix problem with inspect
2023-10-23 09:57:23 +02:00
Pablo Alba
c2b470a4c6 🐛 Fix repair script for invalid-main-instance-page 2023-10-23 09:36:20 +02:00
Andrés Moya
349b6f6fce 🐛 Fix v2 migration when library has already been migrated 2023-10-23 09:20:34 +02:00
Eva Marco
0c84db9350 Merge pull request #3722 from penpot/palba-fix-component-sidebar-style
🐛 Fix component sidebar title style
2023-10-20 17:46:00 +02:00
Pablo Alba
fd75974c2c 🐛 Fix component sidebar title style 2023-10-20 17:39:53 +02:00
Andrés Moya
2fe820304e Add some migrations and fixes to component-v2 migration 2023-10-20 16:13:01 +02:00
Aitor
8f5d315573 Add thumbnail/imposter queue 2023-10-20 16:12:26 +02:00
Eva
b23ea27cb0 💄 Update copy button to new UI in text attributes 2023-10-20 16:01:08 +02:00
alonso.torres
5a9421a1e2 🐛 Fix problem with inspect 2023-10-20 13:04:33 +02:00
Aitor Moreno
69c8845ac8 Merge pull request #3708 from penpot/alotor-grid-performance
Layouts performance
2023-10-20 11:31:17 +02:00
Aitor Moreno
5ed76a474d Merge pull request #3712 from penpot/eva-new-code-ui
💄 Update code section
2023-10-20 11:16:34 +02:00
alonso.torres
9d6e4c9e2f Improve flex layout data calculation 2023-10-20 10:38:29 +02:00
alonso.torres
be68e45f65 🐛 Fix problem with performance on layout calculation 2023-10-20 10:38:29 +02:00
alonso.torres
6507200735 Improve group modifiers calculation 2023-10-20 10:38:28 +02:00
alonso.torres
cafc75259a Refactor and improve performance on auto size layouts 2023-10-20 10:32:37 +02:00
Aitor Moreno
14a3a8a527 Merge pull request #3719 from penpot/alotor-fix-fill-problem
🐛 Fix problem with size 100% and hidden layers
2023-10-20 10:26:41 +02:00
Alejandro Alonso
1f3da97f08 Merge remote-tracking branch 'origin/staging' into develop 2023-10-20 10:26:30 +02:00
alonso.torres
01c3678c6d 🐛 Fix problem with size 100% and hidden layers 2023-10-20 09:54:47 +02:00
Eva Marco
300b6d1758 Merge pull request #3718 from penpot/superalex-improve-onboarding-teams-and-invitations
🎉 Improve onboarding team creation and invite workflow
2023-10-20 09:39:58 +02:00
Alejandro Alonso
96bbc35042 🎉 Improve onboarding team creation and invite workflow 2023-10-20 07:31:10 +02:00
Eva
dfe1022d7b 💄 Update inspect tab in code area 2023-10-19 20:12:20 +02:00
Aitor Moreno
a49bc07259 Merge pull request #3715 from penpot/niwinz-develop-bugfixes-14
🐛 Fix issues on importation version handling and bool shapes initialization
2023-10-19 17:09:22 +02:00
alonso.torres
06c8ada6f7 Improve performance for constraints 2023-10-19 16:19:47 +02:00
Aitor
064dceb8c2 📚 Fix missing bugs in CHANGES.md 2023-10-19 12:50:24 +02:00
Aitor
20e590cdf0 🐛 Fix pixelated thumbnails 2023-10-19 11:59:55 +02:00
Andrey Antukh
da0f51c5a6 🐛 Fix :bool path handling on setup-shape 2023-10-18 14:31:34 +02:00
Andrey Antukh
0547eebf85 🐛 Set correct version on importing 2023-10-18 14:31:34 +02:00
Pablo Alba
9b32a00454 🐛 Do not show deleted components on swap 2023-10-18 11:29:25 +02:00
Pablo Alba
39ed665b93 Allow swap over multiple components 2023-10-17 16:44:15 +02:00
Alejandro Alonso
93fbb0655f Merge remote-tracking branch 'origin/staging' into develop 2023-10-17 11:21:50 +02:00
Alejandro Alonso
16694f005d 🐛 Avoid sending invites to the inviter on the onboarding process 2023-10-17 11:19:47 +02:00
Aitor Moreno
82f0cc7cff Merge pull request #3707 from penpot/eva-comments-new-ui
💄 Update comment UI with new design
2023-10-16 15:13:54 +02:00
Eva Marco
c9ba4aea46 🐛 Fix several fronted errors related with new UI (#3691)
* 🐛 Fix title toggle arrow without content
* 🐛 Fix export dropdowns
* 🐛 Fix colorpicker eyedrop
* 🐛 Fix hover state on color row
* 🐛 Fix color bullet on color row
* 🐛 Fix some css errors in new UI
* 🐛 Fix text and typography component
* 🐛 Fix some icons
* 💄 Update ui in feedback page, webhooks page and access token page
2023-10-16 15:07:36 +02:00
Eva
f4323fd1ac 💄 Update comment UI with new design 2023-10-16 10:04:04 +02:00
Yaron Shahrabani
69cffe43f3 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-10-16 06:09:42 +02:00
Hugo Vermaak
93df5354e5 🌐 Add translations for: Afrikaans.
Currently translated at 7.6% (101 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/af/
2023-10-13 20:01:12 +02:00
Madalena Melo
161e8b01a5 🌐 Added translation for: Afrikaans. 2023-10-12 11:45:43 +02:00
TheScientistPT
958b442b2e 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-10-11 14:01:31 +02:00
Aitor Moreno
25c60f3e0f Merge pull request #3701 from penpot/hiru-migrate-root-shapes
🔧 Add migration to set root shapes as valid objects
2023-10-11 13:21:54 +02:00
Andrés Moya
2c264d6460 🔧 Add migration to set root shapes as valid objects 2023-10-11 12:40:26 +02:00
Pablo Alba
51fe27369b Do not allow the creation of groups, masks nor boolean in copies 2023-10-11 12:24:11 +02:00
Pablo Alba
b4d78d2fd7 Use thumbnails instead of svgs for the list of components on swap 2023-10-11 12:24:11 +02:00
Pablo Alba
fac72a5874 🎉 Component swap 2023-10-11 12:24:11 +02:00
Aitor
917e6425d1 Schedule thumbnail component updates 2023-10-10 15:32:41 +02:00
alonso.torres
f9a1139803 Load current version on file import 2023-10-10 13:42:24 +02:00
AlexTECPlayz
d3404bd359 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-10-10 10:01:12 +00:00
alonso.torres
f609063641 Merge remote-tracking branch 'origin/staging' into develop 2023-10-09 12:21:53 +02:00
Pablo Alba
f88ce0e404 Merge pull request #3699 from penpot/hiru-bugfixes
Hiru bugfixes
2023-10-09 12:02:54 +02:00
alonso.torres
fe3740e329 🐛 Fix problem with alignment performance 2023-10-09 11:58:55 +02:00
alonso.torres
1378e88431 🐛 Fix function signature 2023-10-09 11:49:00 +02:00
AlexTECPlayz
b49ba9572e 🌐 Add translations for: Romanian.
Currently translated at 99.3% (1311 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-10-09 09:00:29 +00:00
Aitor Moreno
e7f05f2efc Merge pull request #3688 from penpot/alotor-grid-codegenn
Grid area attributes for html generation
2023-10-09 10:54:36 +02:00
TheScientistPT
6a397eb262 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-10-07 12:12:03 +00:00
Yaron Shahrabani
c09ca021e9 🌐 Add translations for: Hebrew.
Currently translated at 98.3% (1298 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-10-07 12:12:02 +00:00
Linerly
85fbc0352c 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1320 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-10-07 12:12:02 +00:00
Stas Haas
271384718d 🌐 Add translations for: German.
Currently translated at 99.3% (1312 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-10-07 12:12:01 +00:00
Merih Güz
ff8b6fbd8c 🌐 Add translations for: Turkish.
Currently translated at 98.4% (1299 of 1320 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-10-07 12:12:00 +00:00
Andrés Moya
f140ec4541 🐛 Fix incorrect main instance creation on migration to v2 2023-10-06 17:27:58 +02:00
alonso.torres
59bd9c132e 🐛 Fix fill inside grid layout 2023-10-06 14:56:04 +02:00
Andrés Moya
7d8e43b3d3 🐛 Fix error when converting graphics to components 2023-10-06 14:26:58 +02:00
alonso.torres
0468b6acca 🐛 Improve immediate-children helper 2023-10-06 12:25:44 +02:00
alonso.torres
caee3160f2 🐛 Change to patch-object 2023-10-06 12:22:41 +02:00
alonso.torres
3db04e1e2b 🐛 Fix problem when removing margins 2023-10-06 12:18:55 +02:00
alonso.torres
785b58a6c4 Change behaviour of fill to respect minimum content size 2023-10-06 12:18:55 +02:00
alonso.torres
950fd60917 🐛 Fix code generation for areas 2023-10-06 12:18:55 +02:00
alonso.torres
a45bc0177b 🐛 Fix problem with grid 2023-10-06 12:18:55 +02:00
alonso.torres
d420f30835 Grid area attributes for html generation 2023-10-06 12:18:55 +02:00
Aitor
f639c73d03 🎉 Add component thumbnails 2023-10-06 11:03:47 +02:00
Aitor Moreno
77964604fd Merge pull request #3680 from penpot/eva-redesign-prototype-tab
💄 Update prototype tab desgin with new UI
2023-10-05 16:47:31 +02:00
Eva
6de061159b 💄 Update prototype tab desgin with new UI 2023-10-05 16:23:24 +02:00
Andrés Moya
e8aab8b0bf 🐛 Remove root when creating nested components 2023-10-05 13:32:03 +02:00
Hosted Weblate
65cc025994 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-10-04 13:50:58 +02:00
Andrey Antukh
134abd6831 Merge branch 'translations' into develop 2023-10-04 13:50:36 +02:00
Andrey Antukh
a303738a89 📎 Sort & validate translation strings 2023-10-04 13:49:57 +02:00
Andrey Antukh
0fc0eff962 Merge remote-tracking branch 'weblate/develop' into translations 2023-10-04 13:47:57 +02:00
Sebastiaan Pasma
92ec2289de 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1311 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-10-04 13:47:41 +02:00
Ņikita K
98bbdf3a4e 🌐 Add translations for: Latvian.
Currently translated at 99.1% (1300 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-10-04 13:47:40 +02:00
TheScientistPT
3518cb8d74 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1311 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-10-04 13:47:40 +02:00
AlexTECPlayz
42f95294ce 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1311 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-10-04 13:47:39 +02:00
Eva
d913637290 🐛 Fix several frontend errors related with new UI 2023-10-04 13:11:58 +02:00
Aitor Moreno
828082ea47 Merge pull request #3678 from penpot/alotor-codegen-fixes
Codegen & grid fixes
2023-10-02 12:46:09 +02:00
alonso.torres
a0c79fc038 🐛 Fix some issues with grid 2023-10-02 12:36:47 +02:00
alonso.torres
7fd02022ac 🐛 Improve html generation 2023-10-02 12:36:41 +02:00
Andrés Moya
1f04304210 Add protection to fix script 2023-09-29 13:29:21 +02:00
Stas Haas
3157ca8f07 🌐 Add translations for: German.
Currently translated at 96.4% (1265 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-09-29 11:02:09 +02:00
Andrés Moya
cc07c7a580 Ensure features is always initialized, even after logout 2023-09-28 23:15:15 +02:00
Andrés Moya
4149b681bd 🔧 Deactivate optimization that is causing errors 2023-09-28 23:14:48 +02:00
Andrés Moya
2284c18c2b 🔧 Activate one repair 2023-09-28 17:21:46 +02:00
Aitor
9c9bc8803d 🐛 Fix render-frame when shape is nil 2023-09-28 17:14:18 +02:00
alonso.torres
db149e9c09 🐛 Fix problem with filter in old version 2023-09-28 11:19:10 +02:00
Aitor Moreno
bf623338ff Merge pull request #3668 from penpot/juan-redesign-dashboard
💄 Add new dashboard UI look and feel
2023-09-28 10:38:58 +02:00
Aitor Moreno
a4ba6f06af Merge pull request #3671 from penpot/juan-path-options
💄 Adds new path tools structure
2023-09-28 10:02:21 +02:00
Eva
2cafeddc9a 💄 Update dashboard design with new UI 2023-09-28 09:42:16 +02:00
elhombretecla
7f869ce087 💄 Adds new path tools structure 2023-09-28 09:01:51 +02:00
elhombretecla
84727fb1d9 Update README.md 2023-09-28 07:28:56 +02:00
elhombretecla
d0884e1a22 Update README.md 2023-09-28 07:28:04 +02:00
Aitor Moreno
e39a0bb8b1 Merge pull request #3672 from penpot/hiru-automatic-validation
🎉 Do file validation on each file change
2023-09-27 13:57:44 +02:00
Aitor Moreno
22d7ab9590 Merge pull request #3673 from penpot/alotor-codegen-fixes
🐛 Fix some cases for the html preview
2023-09-27 13:54:11 +02:00
alonso.torres
9d05fdf3df 🐛 Fix some cases for the html preview 2023-09-27 13:27:14 +02:00
Andrés Moya
24efa867e7 🎉 Do file validation on each file change 2023-09-27 13:26:28 +02:00
Andrés Moya
ae793c079b 🐛 Fix small issues in validate functions 2023-09-27 13:25:55 +02:00
Eva Marco
fb36b77bd1 💄 Update desing tab phase 2 (#3621)
* 💄 Update constraint component
* 💄 Update fill and selected color components
* 💄 Update stroke component
* 💄 Update text component
* 💄 Update frame grid component
* 💄 Update export component
* 💄 Update shadow and blur components
* 💄 Update colorpicker component UI
* 💄 Update svg attrs and componets components UI
* 💄 Small UI changes
* 🐛 Fix shadow functions
2023-09-27 12:10:36 +02:00
Andrés Moya
95f1a8b9ee Add more checks to validator and fix some issues 2023-09-26 10:59:43 +02:00
TheScientistPT
4d5c70e261 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.4% (1304 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-09-25 20:02:16 +00:00
Aitor Moreno
6f198a43f7 Merge pull request #3667 from penpot/alotor-codegen-fixes
Codegen fixes
2023-09-25 17:37:39 +02:00
alonso.torres
9994b705d4 🐛 Fix problem with multiple elements in flex 2023-09-25 15:26:49 +02:00
alonso.torres
641f8fb250 Dynamic preview html output 2023-09-25 15:26:49 +02:00
alonso.torres
723c14bef2 🐛 Fix problems with code generation 2023-09-25 15:26:49 +02:00
Aitor Moreno
6e8cfa7be4 Merge pull request #3665 from penpot/niwinz-develop-workspace-thumbnails
♻️ Add another refactor iteration on workspace thumbnails
2023-09-25 14:08:29 +02:00
Andrés Moya
8d5c95dd64 🐛 Micro fix in validate functions 2023-09-25 09:54:10 +02:00
TheScientistPT
f5ddb6501c 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.0% (1298 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2023-09-24 15:02:13 +00:00
Yaron Shahrabani
937f1799f1 🌐 Add translations for: Hebrew.
Currently translated at 98.0% (1286 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-09-24 15:02:12 +00:00
Stas Haas
a112536c88 🌐 Add translations for: German.
Currently translated at 95.0% (1246 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-09-24 15:02:11 +00:00
Andrey Antukh
3ec29273d0 🐛 Fix unexpected bug on snap_disatches when shape is nil
Happens when you move something like svg-dev which for some
reason becomes nil on snap distances code
2023-09-22 14:52:48 +02:00
Andrey Antukh
2bd31dcbd2 Add minor performance optimization to snap-distances components 2023-09-22 14:52:48 +02:00
Andrey Antukh
4b09172b69 Use faster string formating on filters 2023-09-22 14:52:48 +02:00
Andrey Antukh
9fd5306d1b Make filters ID naming consistent with the rest 2023-09-22 14:52:48 +02:00
Andrey Antukh
d0c1a9683a ♻️ Refactor workspace thumbails (again)
We probably need a counter of number of types this
code was refactored hehe
2023-09-22 14:52:48 +02:00
Pablo Alba
4ac2a64a2a 🐛 Fix when duplicating a main component all internal shapes are marked as :main-instance 2023-09-22 11:31:33 +02:00
Andrés Moya
de8758c4ca 🐛 Fix added children detection in fix-touched script 2023-09-22 11:25:48 +02:00
Pablo Alba
e9bd769823 🐛 When duplicating a main component from the assets tab, the new component should be next to it. 2023-09-22 11:21:59 +02:00
Andrey Antukh
afa7931b0e Disable temporary workspace thumbnails 2023-09-22 10:38:08 +02:00
Andrey Antukh
ae08a330fa Add internal improvements to debug related namespaces 2023-09-22 09:48:41 +02:00
Andrey Antukh
a2e3da2c07 🐛 Treat vendor specific props correctly on attrs->props 2023-09-21 12:15:13 +02:00
Andrey Antukh
896602903f 🐛 Fix incorrect value processing on attrs->props
Causes unexpected exception on saving migrated files
2023-09-21 12:15:13 +02:00
Andrés Moya
1fa8888bf3 🐛 Fix validation 2023-09-21 11:12:16 +02:00
Andrey Antukh
1ab690a408 ♻️ Remove duplicate merge operation on svg_raw shapes 2023-09-21 11:00:33 +02:00
Andrey Antukh
91224e5274 Add minor optimizations to data-uri->blob helper 2023-09-21 11:00:33 +02:00
Andrey Antukh
4f23852bca Improve svg shapes attrs handling
And collaterally it improves performance since now the attrs
processing is done in the import and not in the render.
2023-09-21 11:00:33 +02:00
Andrey Antukh
807f475a2d 🐛 Fix incorrect bounds calc on svg-defs 2023-09-21 11:00:33 +02:00
Andrey Antukh
aa8300c085 Move util.svg to common.svg and make it crossplatform 2023-09-21 11:00:33 +02:00
Andrés Moya
878f1d4090 Enhance validation script 2023-09-21 10:16:30 +02:00
Andrey Antukh
003dec6c6b 💄 Add cosmetic changes to several viewer related react components 2023-09-21 09:48:51 +02:00
Andrey Antukh
df2d242746 🐛 Fix unexpected exception on viewer caused by nil objects
This issue is started to happening because of an unrelated change
on frame-shape react component where shapes are looked up directly
on objects having in supposition that objects will be exists but on
viewer there are two objects: fixed and not-fixed, and in some cases
objects map can be empty or don't contain the object.

For solve the issue, we just filter not existing objects before
progragate the children down to the inner react components, avoiding
the exception when an object appears as `nil`.
2023-09-21 09:48:51 +02:00
Eva
9e07999537 🔥 Remove all css.json files 2023-09-21 09:31:42 +02:00
Andrey Antukh
8caeaefa98 Adapt frontend build process to the scss modules 2023-09-21 09:26:46 +02:00
Andrés Moya
836b4538dd Add validate & repair functions 2023-09-20 15:40:43 +02:00
Andrés Moya
973affb259 🐛 Fix touched fixer 2023-09-20 15:40:43 +02:00
alonso.torres
f004aa5efd 🐛 Fix problems with boards 2023-09-20 14:21:49 +02:00
alonso.torres
e5b05eff23 🐛 Fix problem when creating groups inside grid 2023-09-20 14:21:49 +02:00
Stas Haas
49166f5d3c 🌐 Add translations for: German.
Currently translated at 94.8% (1244 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-09-20 14:01:37 +02:00
alonso.torres
9d6bd64027 🐛 Fix problem with changes builder 2023-09-20 09:54:46 +02:00
Andrey Antukh
c23cf2a5a6 🐛 Fix issue with minio setup on devenv 2023-09-19 11:40:12 +02:00
Andrey Antukh
9931232a91 Merge pull request #3636 from penpot/palba-show-info-empty-library-on-dialogs
🎉 Warn about empty libraries on the share library dialog
2023-09-19 09:54:21 +02:00
Pablo Alba
d615fbb282 🎉 Warn about empty libraries on the share library dialog 2023-09-19 09:52:40 +02:00
Pablo Alba
dfb7df1eb9 🎉 Allow to make reset override in bulk 2023-09-18 17:01:28 +02:00
Aitor
0494dc843f ♻️ Refactor thumbnails 2023-09-18 17:00:13 +02:00
Aitor
0721fc9d80 Add lazy loading and async decoding to graphics 2023-09-18 17:00:13 +02:00
Aitor
9ce8c2d580 ♻️ Change pixel overlay inner workings 2023-09-18 17:00:13 +02:00
Aitor
537435372a ♻️ Change pixel overlay rendering to use rasterizer 2023-09-18 17:00:13 +02:00
Aitor
0496b1f4e3 ♻️ Change how thumbnails are rendered 2023-09-18 17:00:13 +02:00
Aitor
51a8e8799b ♻️ Change thumbnail-renderer to rasterizer 2023-09-18 17:00:13 +02:00
Aitor Moreno
e2812391c4 Merge pull request #3635 from penpot/alotor-grid-polishing
Grid polishing
2023-09-18 14:16:50 +02:00
alonso.torres
52cbc7e09d Margins for grid elements 2023-09-18 14:08:51 +02:00
alonso.torres
6f2a459cce Instance component to grid layout 2023-09-18 14:08:34 +02:00
alonso.torres
ea4a3d9e27 🐛 Fix problem with duplicate shapes 2023-09-18 14:08:20 +02:00
alonso.torres
17f35cda15 Multiple cells selection and area 2023-09-18 14:07:53 +02:00
alonso.torres
322767701c Highlight on track hover 2023-09-18 14:07:37 +02:00
alonso.torres
495ba6e4a4 Reorder grid tracks 2023-09-18 14:04:16 +02:00
alonso.torres
de4ef1b19d Merge remote-tracking branch 'origin/staging' into develop 2023-09-18 13:48:41 +02:00
Alejandro
859146ddc2 Merge pull request #3641 from penpot/alotor-hotfix
🐛 Fix problem with z-index field in non-absolute items
2023-09-18 13:24:16 +02:00
alonso.torres
4b5e9997e9 🐛 Fix problem with z-index field in non-absolute items 2023-09-18 13:22:47 +02:00
Alejandro
ae10132a07 Merge pull request #3637 from penpot/niwinz-develop-poc-svgo
🎉 Add svg optimization for export and import
2023-09-18 07:00:24 +02:00
Andrey Antukh
630a347184 Add support for svg optimizations on exporter output
Under `enable-exporter-svgo` flag, disabled by default.
2023-09-15 15:00:58 +02:00
Andrey Antukh
7fe446e9de Add support for svg optimizations on workspace svg import
Under `enable-frontend-svgo` flag, disabled by default.
2023-09-15 15:00:58 +02:00
Andrey Antukh
a2e26b8beb Add bundled svgo library and expose it on common module
The svgo bundle is included directly as esm module, no npm dependency
here because the module is bundled from a custom fork located on penpot
github organization:

   https://github.com/penpot/svgo
2023-09-15 15:00:58 +02:00
Alejandro Alonso
175072f546 Merge remote-tracking branch 'origin/staging' into develop 2023-09-15 12:23:27 +02:00
Andrey Antukh
3f3e3e8a81 Revert " Add bundled svgo library and expose it on common module"
This reverts commit 3877eccc29.
2023-09-15 12:19:34 +02:00
Andrey Antukh
11df5ec15e Revert " Add support for svg optimizations on workspace svg import"
This reverts commit b92fcca17c.
2023-09-15 12:19:26 +02:00
Andrey Antukh
9d090ad3d9 Revert " Add support for svg optimizations on exporter output"
This reverts commit 9fc771292a.
2023-09-15 12:19:17 +02:00
Alejandro
aa62b9d248 Merge pull request #3628 from penpot/niwinz-develop-bugfixes-4
 Don't render not visible shapes on workspace
2023-09-15 11:11:05 +02:00
Alejandro Alonso
826b96ad6c Merge remote-tracking branch 'origin/staging' into develop 2023-09-15 10:51:05 +02:00
Alejandro
8bd92aad82 Merge pull request #3634 from penpot/niwinz-staging-svgo
🎉 Add svg optimization support on import and export
2023-09-15 09:07:13 +02:00
Alejandro
f54df5ba80 Merge pull request #3633 from penpot/niwinz-develop-bugfixes-5
🐛 Minor bugfixes and logging improvements
2023-09-15 08:38:17 +02:00
Alejandro
084e114f75 Merge pull request #3624 from penpot/niwinz-develop-experiments-6
♻️ Refacctor shape attrs extraction helpers
2023-09-15 08:37:38 +02:00
Andrey Antukh
9fc771292a Add support for svg optimizations on exporter output
Under `enable-exporter-svgo` flag, disabled by default.
2023-09-14 19:08:39 +02:00
Andrey Antukh
b92fcca17c Add support for svg optimizations on workspace svg import
Under `enable-frontend-svgo` flag, disabled by default.
2023-09-14 19:08:39 +02:00
Andrey Antukh
3877eccc29 Add bundled svgo library and expose it on common module
The svgo bundle is included directly as esm module, no npm dependency
here because the module is bundled from a custom fork located on penpot
github organization:

   https://github.com/penpot/svgo
2023-09-14 19:08:39 +02:00
Andrey Antukh
ef4bd8c598 🐛 Fix incorrect interaction of library-absorb mechanism and storage-pointes 2023-09-14 17:45:56 +02:00
Andrey Antukh
a3f3e31c73 Add minor logging improvement on binfile 2023-09-14 17:45:26 +02:00
Andrey Antukh
b53f7eaa19 Add file version on binfile import logging 2023-09-14 17:44:01 +02:00
Andrey Antukh
1b889cb141 📎 Add proper logging level for file migrations info 2023-09-14 17:43:19 +02:00
Andrey Antukh
9c8103ce44 📎 Change to info the default logger level of tmp storage on devenv 2023-09-14 17:42:27 +02:00
Alejandro Alonso
3a8123314e Merge remote-tracking branch 'origin/staging' into develop 2023-09-14 11:53:00 +02:00
Eva Marco
59eb11ac3f Merge pull request #3626 from penpot/juan-review-design-tab
💄 Tweaks and review design tab
2023-09-14 10:50:39 +02:00
elhombretecla
28010b786d 💄 Adds new UI elements files and visual changes 2023-09-14 10:45:31 +02:00
Andrey Antukh
813c9de636 Merge pull request #3630 from penpot/superalex-fix-authentication-required-on-dashboard
🐛 Fix authentication required on dashboard
2023-09-14 10:20:00 +02:00
Pablo Alba
c291b632a1 🐛 Fix uppercase translations MAIN and COPY 2023-09-14 09:35:29 +02:00
Alejandro Alonso
33c82e2abe 🐛 Fix authentication required on dashboard 2023-09-14 07:13:37 +02:00
Alejandro
a4754a2106 Merge pull request #3599 from penpot/niwinz-develop-experiments-3
🐛 Replace `:use-for-thumbnail?` with `:use-for-thumbnail`
2023-09-14 06:39:06 +02:00
Andrey Antukh
956da67f84 💄 Add mostly cosmetic improvements to text-svg-position ns 2023-09-13 16:41:45 +02:00
Andrey Antukh
56aa751425 🐛 Fix incorrect react vdom on font-selector component 2023-09-13 16:36:49 +02:00
Andrey Antukh
954e5303f0 🐛 Fix incorrect props passed on workspace shape wrapper 2023-09-13 16:36:49 +02:00
Andrey Antukh
ac4343dafd Don't render not visible shapes on workspace 2023-09-13 16:36:49 +02:00
Alejandro
c667d3ad46 Merge pull request #3627 from penpot/niwinz-develop-bugfixes-4
Revert " Don't render not visible shapes on workspace"
2023-09-13 14:00:53 +02:00
Pablo Alba
0699cce389 Merge pull request #3623 from penpot/hiru-fix-touched
🔧 Add script to fix touched attributes
2023-09-13 14:00:41 +02:00
Andrey Antukh
db5621f4ae Revert " Don't render not visible shapes on workspace"
This reverts commit a01c64ea57.
2023-09-13 13:54:40 +02:00
Andrés Moya
afa14dd847 💄 Replace prn with println 2023-09-13 13:54:26 +02:00
Andrés Moya
507cb9f3de 🔧 Add script to fix touched attributes 2023-09-13 13:54:26 +02:00
Alejandro
ebf60f9279 Merge pull request #3625 from penpot/superalex-fix-selection-hover
🐛 Fix selection hover
2023-09-13 12:53:55 +02:00
Alejandro Alonso
f7e5cb4bb2 🐛 Fix selection hover 2023-09-13 12:38:11 +02:00
Andrey Antukh
307cfa287f 🔥 Remove inneficient obj/without helper 2023-09-13 10:53:24 +02:00
Andrey Antukh
393863b29f 🐛 Fix broken hooks rule on shapes fills component 2023-09-13 10:53:24 +02:00
Andrey Antukh
385fd9c4e6 ♻️ Refactor shape attrs extraction helpers 2023-09-13 10:53:24 +02:00
Andrey Antukh
e6f8022de0 Add obj/array? helper 2023-09-13 10:52:32 +02:00
Andrey Antukh
b1e54a9714 Pass explicitly the render-id on props handling in path and svg-raw shapes 2023-09-13 10:52:32 +02:00
Andrey Antukh
85a1f7d69e Add minor optimizations to fills component (shapes) 2023-09-13 10:52:32 +02:00
Andrey Antukh
281251ff87 Add minor optimizations to rect shape 2023-09-13 10:52:32 +02:00
Andrey Antukh
ad58c97cbd Merge pull request #3605 from penpot/palba-fix-export-detach
🐛 Fix export file with components as basic objects
2023-09-13 10:48:51 +02:00
Pablo Alba
88390432f5 🐛 Fix export file with components as basic objects 2023-09-13 09:50:27 +02:00
Alejandro
026510c204 Merge pull request #3608 from penpot/niwinz-develop-experiments-5
 Add performance oriented refactor of custom-stroke related components
2023-09-13 07:00:26 +02:00
Pablo Alba
b4b5aaafe4 🐛 Fix preview of moving a copy of a flex component into its main 2023-09-12 17:05:50 +02:00
Pablo Alba
fe36a9e958 Assets groups review 2023-09-12 16:19:09 +02:00
Andrey Antukh
b03492e187 Merge pull request #3610 from penpot/palba-add-main-copy-label-to-component
🎉 Add main/copy label on component in right bar
2023-09-12 16:15:50 +02:00
Alejandro
732805bf0e Merge pull request #3622 from penpot/azazeln28-fix-blend-mode-select-click
🐛 Fix blend mode select click
2023-09-12 15:50:15 +02:00
Andrey Antukh
1ffca618f9 🐛 Fix react warning on incorrect hooks usage on shapes components 2023-09-12 15:21:46 +02:00
Aitor
72f20301c4 🐛 Fix blend mode select click 2023-09-12 14:29:32 +02:00
Andrey Antukh
34ddc00c8e Merge pull request #3620 from penpot/alotor-fix-over-shapes
🐛 Improved response time of over shapes
2023-09-12 11:59:51 +02:00
Alejandro Alonso
fbff2f103e Select through stroke only rectangle 2023-09-12 11:59:41 +02:00
alonso.torres
fff98b995f 🐛 Improved response time of over shapes 2023-09-12 11:43:22 +02:00
Andrey Antukh
bf2a546f77 ♻️ Refactor custom-stroke render impl 2023-09-12 11:40:41 +02:00
Andrey Antukh
1b420e55f4 Add more DOM attrs friendly render-id generation hook 2023-09-12 11:40:41 +02:00
Andrey Antukh
645b7e4b8d 🐛 Fix react warning on incorrect hooks usage on shapes components 2023-09-12 11:40:41 +02:00
Andrés Moya
b943a034c9 🐛 Fix CI 2023-09-12 11:15:51 +02:00
Stas Haas
ffd68baaa1 🌐 Add translations for: German.
Currently translated at 91.8% (1204 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-09-12 10:50:03 +02:00
Andrés Moya
51ab11e91e 🐛 Use helper to normalice behavior of component display in dump_tree 2023-09-12 09:53:41 +02:00
Pablo Alba
3228d0a95f Merge pull request #3613 from penpot/hiru-fix-parent-touched
🐛 Fix parent touched detecion when duplicating or copy&paste
2023-09-11 13:50:38 +02:00
Andrés Moya
2f3ae1d520 🐛 Fix parent touched detecion when duplicating or copy&paste 2023-09-11 13:25:07 +02:00
Pablo Alba
79ecdebfee 🎉 Add main/copy label on component in right bar 2023-09-08 12:16:00 +02:00
Alejandro Alonso
bc45b15b79 :bugfix: Fix multiple selection of shapes 2023-09-08 11:04:58 +02:00
Linerly
e5d2d05aa6 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1311 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-09-08 04:03:59 +02:00
Andrey Antukh
5fec6c807b Merge pull request #3571 from penpot/eva-design-tab
💄 Redesign design tab phase one
2023-09-07 14:13:57 +02:00
Eva
9ed06c4483 💄 Redesign design tab phase one 2023-09-07 13:59:06 +02:00
Alejandro
d7dea040af Merge pull request #3601 from penpot/niwinz-develop-experiments-4
  ♻️
2023-09-07 11:38:59 +02:00
Alejandro Alonso
1ba76cb3f8 Merge remote-tracking branch 'origin/staging' into develop 2023-09-07 11:32:03 +02:00
Andrey Antukh
3fea366a04 Merge pull request #3604 from penpot/superalex-fix-log-out-log-in-with-different-acounts-page-not-exist
🐛 Fix logout and login with different accounts show 404 error page
2023-09-07 11:22:17 +02:00
Alejandro Alonso
98b1ac7b60 🐛 Fix logout and login with different accounts show 404 error page 2023-09-07 11:17:00 +02:00
Andrey Antukh
308b6279c2 Merge pull request #3597 from penpot/superalex-improve-selected-colors
 Improve selected colors
2023-09-07 11:15:13 +02:00
Alejandro Alonso
d29aa00155 Improve selected colors 2023-09-07 11:11:30 +02:00
Andrey Antukh
5940e00053 Add minor optimizations to shapes/gradient related components 2023-09-06 16:28:32 +02:00
Andrey Antukh
140cb43681 🔥 Remove duplicated line on gradients/add-metadata helper 2023-09-06 16:28:32 +02:00
Andrey Antukh
efd4a1ffba Fix inconsistencies on shapes/gradient component 2023-09-06 16:28:32 +02:00
Andrey Antukh
cef74377df Add minor optimizations to workspace shapes/group ns 2023-09-06 16:28:32 +02:00
Andrey Antukh
469de48af2 💄 Add cosmetic improvements to workspace shapes/bool ns 2023-09-06 16:28:32 +02:00
Andrey Antukh
c7ae8b6510 Add minor optimizations on workspace/shapes ns 2023-09-06 16:28:32 +02:00
Andrey Antukh
d3c9bf1e76 Move common code on shape props checking to shapes/common ns 2023-09-06 16:28:32 +02:00
Andrey Antukh
d9c496b131 Add minor optimizations to shapes/mask component 2023-09-06 15:38:43 +02:00
Andrey Antukh
7f9e01711f Add minor optimizations to shapes/mask internal helpers 2023-09-06 15:38:43 +02:00
Andrey Antukh
e8808bc8a4 📎 Add improved kondo hook analyzer for rumext/fnc 2023-09-06 15:38:43 +02:00
Andrey Antukh
4dc41724de Add minor optimizations to shapes/group component 2023-09-06 15:38:43 +02:00
Andrey Antukh
c8b42478b0 Add minor optimizations to shapes/circle component 2023-09-06 15:38:43 +02:00
Andrey Antukh
9993d357da Add minor optimizations to shapes/bool component 2023-09-06 15:38:43 +02:00
Andrey Antukh
c3c2d88245 💄 Fix indentation on shapes/bool component 2023-09-06 14:42:31 +02:00
Andrey Antukh
48e5e86b73 ♻️ Remove redundant components rendering for workspace/frame 2023-09-06 14:42:31 +02:00
Andrey Antukh
2e2ce6bcfe 💄 Add cosmetic improvements to some workspace frame related components 2023-09-06 14:42:31 +02:00
Andrey Antukh
ca8e9b871d Add micro optimizations to shapes/frame-thumbail-image component 2023-09-06 14:42:31 +02:00
Andrey Antukh
f311deda1b 💄 Add cosmetic improvements to shapes/frame-shape component 2023-09-06 14:42:31 +02:00
Andrey Antukh
d5d95a1328 🐛 Fix typo on srepl/analyze-files helper 2023-09-06 14:42:31 +02:00
Andrey Antukh
63e250d9d0 Add micro optimization on refs/children-objects 2023-09-06 14:42:31 +02:00
Andrey Antukh
4d2afd483b 🔥 Remove aparently redundant shape-container usage on workspace frame container 2023-09-06 14:42:31 +02:00
Andrey Antukh
e805f11f12 🔥 Remove unnecesary shape processing on root-shape 2023-09-06 14:42:31 +02:00
Andrey Antukh
d0a796124f Add micro optimization to shape-container component 2023-09-06 14:42:31 +02:00
Andrey Antukh
b158a82a84 💄 Fix indentation on page helpers 2023-09-06 14:42:31 +02:00
Linerly
ca0e6d0b13 🌐 Add translations for: Indonesian.
Currently translated at 96.8% (1270 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-09-06 12:56:04 +02:00
Frederik Ring
d06124e378 Allow passing overrides to frontend nginx config 2023-09-06 09:48:06 +02:00
Andrey Antukh
74be76c914 Merge pull request #3600 from penpot/palba-fix-fixes
🐛 Upgrade the fixes functions to avoid corner cases
2023-09-05 16:38:10 +02:00
Pablo Alba
8cb917cf51 🐛 Upgrade the fixes functions to avoid corner cases 2023-09-05 16:16:22 +02:00
Andrey Antukh
2706d1ffd3 Merge pull request #3598 from penpot/palba-fix-duplicate-component
🐛 Fix duplicate component doesn't create a main shape
2023-09-05 12:20:34 +02:00
Pablo Alba
bd1a681e71 🐛 Fix duplicate component doesn't create a main shape 2023-09-05 12:19:57 +02:00
Andrey Antukh
36506ec360 🐛 Replace :use-for-thumbnail? with :use-for-thumbnail 2023-09-05 12:01:40 +02:00
Alejandro
a4ed9e57fb Merge pull request #3590 from penpot/niwinz-develop-experiments-2
🐛 & 
2023-09-05 11:12:55 +02:00
Andrey Antukh
0f133ca431 🐛 Fix more issues on frontend gulpfile 2023-09-05 10:50:54 +02:00
Andrey Antukh
c1117b6da9 🐛 Fix issue on frontend build process caused by deps update 2023-09-05 10:29:19 +02:00
Andrey Antukh
a01c64ea57 Don't render not visible shapes on workspace 2023-09-04 17:37:08 +02:00
Andrey Antukh
5b3e12bb9c ♻️ Refactor change builder for make it more efficient
Mainly replaces the usafe of the inneficient d/preconj helper
with a combination of conj and simple list as data structure whitch
maintains the previous ordering semantics on addition.

Also removes the d/preconj from the codebase.
2023-09-04 15:48:34 +02:00
Andrey Antukh
4e974cd2f3 🐛 Fix typo on has-point? impl 2023-09-04 15:33:04 +02:00
Alejandro
87f085da74 Merge pull request #3594 from penpot/niwinz-develop-experiments-1
🐛 Several bugfixes and other minor imprivements
2023-09-04 12:28:03 +02:00
Andrey Antukh
b68b802b6d 🐛 Fix shape radius type toggle on workspace 2023-09-04 12:04:15 +02:00
Andrey Antukh
c54deb0218 🐛 Fix proportion lock toggle callback
Add missing dependency
2023-09-04 12:04:15 +02:00
Andrey Antukh
bd734c1095 🐛 Fix log level setting on file migrations ns 2023-09-04 12:04:15 +02:00
Andrey Antukh
6a3b963a77 🐛 Add migration that fixes all frames that does not have :shapes attr 2023-09-04 12:04:15 +02:00
Andrey Antukh
a097ed29a9 Fix extensibility and naming of workspace shape fixer 2023-09-04 12:04:15 +02:00
Andrey Antukh
c7f9774524 Add more flexible call flow for db interacting methods 2023-09-04 12:04:15 +02:00
Andrey Antukh
90f7e97d5b Improve kondo analyze function for db/with-atomic
Allow pass options as third argument on params vector
2023-09-04 12:04:15 +02:00
Alejandro Alonso
07562af677 Merge remote-tracking branch 'origin/staging' into develop 2023-09-04 11:47:10 +02:00
Alejandro
1eaf7b2b44 Merge pull request #3593 from penpot/niwinz-staging-bugfixes-9
🐛 Bugfixes and logging improvements
2023-09-04 11:42:27 +02:00
Andrey Antukh
903f064e87 Decrease slightly argon2id cost for improve usability
The previous values are set too high. The current value are still
valid under current recomendation but improves a little bit the
time of password verification.
2023-09-04 11:35:31 +02:00
Andrey Antukh
a23d1908e9 Improve worker logging 2023-09-04 11:35:31 +02:00
Andrey Antukh
1e8226a3fc 🐛 Fix log level setting on file migrations ns 2023-09-04 11:35:31 +02:00
Andrey Antukh
b7459726f5 Merge pull request #3592 from penpot/superalex-remember-last-team-log-out-2
 Remember last team accross logouts and sessions and fix some weird stuff
2023-09-04 11:12:42 +02:00
Alejandro Alonso
b8179d0e35 Remember last team accross logouts and sessions and fix some auth weird stuff 2023-09-04 10:34:30 +02:00
Swapnil C
ce9138d22b 🌐 Add translations for: French.
Currently translated at 87.5% (1148 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-09-03 23:50:09 +02:00
Philippe Accorsi
3972d19419 🌐 Add translations for: French.
Currently translated at 87.5% (1148 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-09-03 23:50:09 +02:00
Louis Chance
6261594a76 🌐 Add translations for: French.
Currently translated at 87.5% (1148 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-09-03 23:50:09 +02:00
Locness
41c296add7 🌐 Add translations for: French.
Currently translated at 87.5% (1148 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-09-03 23:50:08 +02:00
Yaron Shahrabani
843b9b2598 🌐 Add translations for: Hebrew.
Currently translated at 91.9% (1206 of 1311 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-09-02 11:15:31 +02:00
Alejandro
53a9906736 Merge pull request #3589 from penpot/niwinz-develop-debug-import-fix
🐛 Fix clone operaton of dbg handler
2023-09-01 13:15:16 +02:00
Andrey Antukh
7aae12c732 🐛 Fix clone operaton of dbg handler 2023-09-01 13:07:49 +02:00
Alejandro
6080b778d4 Merge pull request #3570 from penpot/niwinz-develop-experiments-1
 Add performance enhancements (part 2)
2023-09-01 12:58:54 +02:00
Andrey Antukh
8a4fcc1d10 Delimit rendering of components when they are visible on workspace assets tab 2023-09-01 12:50:29 +02:00
Andrey Antukh
1e2603f1f5 Add minor improvements to use-visible hook 2023-09-01 12:50:29 +02:00
Andrey Antukh
937d3b4954 Don't perform assets filtering if term is empty 2023-09-01 12:50:29 +02:00
Andrey Antukh
8ff18a2a9e Add asset item full path to the search filtering 2023-09-01 12:50:29 +02:00
Andrey Antukh
e278d042ea Improve usability of assets tab on search
Automatically uncollapse assets groups when a total searched
results is less than a threshold of 60 (current default)
2023-09-01 12:50:29 +02:00
Andrey Antukh
9804bd88c2 Add improvements to css modules related macros 2023-09-01 12:50:29 +02:00
Andrey Antukh
62f15f9b9d Make components assets gropups collapsed by default on assets tab 2023-09-01 12:50:29 +02:00
Andrey Antukh
50a49e5fbf Show by default assets as not visible 2023-09-01 12:50:29 +02:00
Andrey Antukh
b649adf544 💄 Add cosmetic improvements to sidebar assets namespace 2023-09-01 12:50:29 +02:00
Andrey Antukh
c6e248b52f Add correct impl for is-direct-child-of-root? helper
And we restore the previously removed helper and incorrectly replaced by
the `is-direct-child-of-root?`.

In penpot exists two concepts: root and root-frame; root is the
artificially created shape that represents the ROOT, and root-frame
means a frame that is shape of frame type which is a direct children
of ROOT.
2023-09-01 12:47:18 +02:00
Andrey Antukh
1a1e55037b 🔥 Remove unused conditional on root-shape component 2023-09-01 12:47:18 +02:00
Andrey Antukh
82f1b96503 Add micro optimization to is-direct-child-of-root? helper 2023-09-01 12:47:18 +02:00
Andrey Antukh
58f788455f Add experimental equality with exceptions props checking to frames 2023-09-01 12:47:18 +02:00
Andrey Antukh
b28cad2250 Improve efficiency of equiv impl of jvm-custom-record 2023-09-01 12:47:18 +02:00
Andrey Antukh
7f91619075 Add improved text change detection on viewport text renderer 2023-09-01 12:47:18 +02:00
Andrey Antukh
f82c682421 Delimit attrs on update-shape-flags impl 2023-09-01 12:47:18 +02:00
Alejandro Alonso
69f2e7c43f Merge remote-tracking branch 'origin/staging' into develop 2023-09-01 12:40:17 +02:00
Andrey Antukh
2a6022fa18 🐛 Fix importation on debug endpoint 2023-09-01 12:01:11 +02:00
Andrey Antukh
e36b49b4f0 Merge pull request #3587 from penpot/superalex-layer-multiselection-behaviour
 Improve layers multiselection behaviour
2023-09-01 11:20:27 +02:00
Alejandro Alonso
92ff5de538 Improve layers multiselection behaviour 2023-09-01 11:20:10 +02:00
Alejandro Alonso
c83d028466 Colorpicker: remember las color mode 2023-09-01 11:18:45 +02:00
Alejandro
56a0d522dc Merge pull request #3585 from penpot/niwinz-staging-storage-gc-deleted
 Add minor improvements to logging
2023-09-01 06:40:41 +02:00
Andrey Antukh
a3495800b5 Add minor logging improvements to worker namespace 2023-08-31 21:09:18 +02:00
Andrey Antukh
750cf05784 Add minor logging related improvements to binfile namespace 2023-08-31 21:08:23 +02:00
Andrey Antukh
1384219ae7 📎 Update devenv logging file 2023-08-31 21:08:01 +02:00
Andrey Antukh
d2d9aeff25 📎 Reduce log level of worker submit operation
Start logging to as TRACE instead of DEBUG
2023-08-31 20:59:58 +02:00
Andrey Antukh
95d80c9578 Merge pull request #3582 from penpot/superalex-fix-invalid-comments-when-delete-page
🐛 Fix deleted pages comments shown in right sidebar
2023-08-31 20:02:00 +02:00
Alejandro
b523bef8ba Merge pull request #3581 from penpot/niwinz-staging-storage-gc-deleted
 Improve storage-gc-deleted task reliability
2023-08-31 15:18:15 +02:00
Alejandro Alonso
0c5c04e58a 🐛 Fix deleted pages comments shown in right sidebar 2023-08-31 15:16:55 +02:00
Andrey Antukh
a0973b9ddf Improve storage-gc-deleted task reliability 2023-08-31 14:36:31 +02:00
Andrey Antukh
f30732dc7f Merge pull request #3575 from penpot/palba-remove-innecesary-message
📎 Remove innecesary message on delete shared dialog
2023-08-31 14:15:50 +02:00
Pablo Alba
2f8cac83ae 📎 Remove innecesary message on delete shared dialog 2023-08-31 13:52:37 +02:00
Alejandro
c53b6117c0 Merge pull request #3574 from penpot/azazeln28-fix-text-shapes-rendered-with-bad-proportions
🐛 Fix text shapes rendered with bad proportions
2023-08-31 12:10:36 +02:00
Aitor
bd3ddebcc4 🐛 Fix text shapes rendered with bad proportions 2023-08-31 12:06:31 +02:00
Alejandro
0441f28880 Merge pull request #3577 from penpot/hiru-hide-messages-on-exit
🐛 Fix message popup remains open when exiting workspace
2023-08-31 11:45:41 +02:00
Andrés Moya
288030888a 🐛 Fix message popup remains open when exiting workspace 2023-08-31 11:39:46 +02:00
Alejandro
203c0ed87d Merge pull request #3579 from penpot/eva-refix-lock-title
🐛 Fix lock and hide tooltip
2023-08-31 11:38:51 +02:00
Eva
09e28076cd 🐛 Fix lock and hide tooltip 2023-08-31 11:31:58 +02:00
Alejandro
ad4e489312 Merge pull request #3578 from penpot/superalex-fix-list-view-is-discarded-on-tab-change-for-assets-sidebar-tab
🐛 Fix list view is discarded on tab change for assets sidebar
2023-08-31 11:31:13 +02:00
Alejandro Alonso
50932dea54 🐛 Fix list view is discarded on tab change for assets sidebar 2023-08-31 11:25:36 +02:00
Andrey Antukh
da3c829b1b 📎 Fix clj linter issues on backend 2023-08-31 11:24:30 +02:00
Andrey Antukh
d4b4e6be7d 🐛 Fix frontend cljs linter issues 2023-08-31 10:49:09 +02:00
Alejandro
722ad5216f Merge pull request #3576 from penpot/niwinz-develop-update-deps
⬆️ Update dependencies
2023-08-31 10:48:25 +02:00
Andrey Antukh
3a6007d385 📎 Fix clj linter issues on backend 2023-08-31 10:36:20 +02:00
Andrey Antukh
fb1bdd4ce7 🐛 Fix frontend cljs linter issues 2023-08-31 09:31:53 +02:00
Andrey Antukh
63668fb66e 📎 Fix scss linter issues 2023-08-31 09:25:40 +02:00
Andrey Antukh
eb2187daf2 ⬆️ Update dependencies 2023-08-31 09:20:22 +02:00
Andrey Antukh
2cc76a2609 Merge pull request #3573 from penpot/hiru-fix-group-creation
🐛 Correctly initialize geometry when creating a new group
2023-08-30 15:21:20 +02:00
Andrés Moya
2d0b14d483 🐛 Correctly initialize geometry when creating a new group 2023-08-30 13:47:55 +02:00
Andrey Antukh
1c769a13e2 Merge remote-tracking branch 'weblate/develop' into develop 2023-08-30 11:12:26 +02:00
Hosted Weblate
25a4a92f05 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-08-30 11:05:14 +02:00
Hosted Weblate
17274e9341 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-08-30 11:05:04 +02:00
Yaron Shahrabani
877fff1b2c 🌐 Add translations for: Hebrew.
Currently translated at 99.7% (1206 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-08-30 11:04:58 +02:00
AlexTECPlayz
7b5260eedd 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-08-30 11:04:58 +02:00
Kristijan Žic
99b08402da 🌐 Add translations for: Croatian.
Currently translated at 84.9% (1027 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2023-08-30 11:04:57 +02:00
Linerly
2e899f1d9d 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-08-30 11:04:57 +02:00
Amine Gdoura
f39e962250 🌐 Add translations for: Arabic.
Currently translated at 61.4% (743 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2023-08-30 11:04:56 +02:00
Amerey.eu
263a4e32dc 🌐 Add translations for: Czech.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2023-08-30 11:04:56 +02:00
Linerly
7d55df10ab 🌐 Add translations for: Indonesian.
Currently translated at 97.0% (1173 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-08-30 11:04:55 +02:00
Stas Haas
5775129b53 🌐 Add translations for: Russian.
Currently translated at 63.1% (763 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-08-30 11:04:55 +02:00
Mikel Larreategi
05678f5002 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-08-30 11:04:54 +02:00
Stas Haas
853d2a9b29 🌐 Add translations for: German.
Currently translated at 98.6% (1193 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-08-30 11:04:53 +02:00
王世阳
70f7476614 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-08-30 11:04:53 +02:00
Ņikita K
ed0708bcbd 🌐 Add translations for: Latvian.
Currently translated at 96.5% (1167 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-08-30 11:04:52 +02:00
Andrey Antukh
43210e4b5a Merge branch 'staging' into develop 2023-08-30 10:48:49 +02:00
Andrey Antukh
cc5b1c950b Merge branch 'translations' into staging 2023-08-30 10:35:47 +02:00
Andrey Antukh
52851f4c6f 📎 Add dutch language 2023-08-30 10:35:33 +02:00
Andrey Antukh
9bd42be771 Merge remote-tracking branch 'weblate/develop' into translations 2023-08-30 10:26:28 +02:00
Eva Marco
0030447ea8 Merge pull request #3558 from penpot/hiru-show-assets-to-update
🎉 Show changed assets when updating libraries
2023-08-30 07:38:56 +02:00
Andrey Antukh
0d0c5ed96c Add minor performance improvement to get-viewer-frames
Reducing redundant lookups
2023-08-29 17:09:00 +02:00
Andrey Antukh
b7eb20dc44 Reduce unnecesary lookups on get-frame-by-position fn 2023-08-29 17:09:00 +02:00
Andrey Antukh
6b3fa31d68 🔥 Remove unused top-nested-frame-ids helper 2023-08-29 17:09:00 +02:00
Andrey Antukh
48881f218c 📎 Add minor improvements to schema generator helpers 2023-08-29 17:09:00 +02:00
Andrey Antukh
a82ee01d99 Add minor improvement to points->lines helper 2023-08-29 17:09:00 +02:00
Andrey Antukh
a9d2cc227b 💄 Add minor cosmetic improvements on viewport hooks ns 2023-08-29 17:09:00 +02:00
Andrey Antukh
a754d5ae3b Add throttling to over-shapes-stream on viewport 2023-08-29 17:09:00 +02:00
Andrey Antukh
ec1c1fcd2f 📎 Fix function naming
Rename `all-frames-by-position` to `get-frames-by-position`
2023-08-29 17:09:00 +02:00
Andrey Antukh
9cc7f3c600 Add minor performance optimization to all-frames-by-position 2023-08-29 17:09:00 +02:00
Andrey Antukh
80826e58ad Add missing boolean type hints 2023-08-29 17:09:00 +02:00
Andrey Antukh
ad73c449fd Replace mapv with map on get-frame-ids fn 2023-08-29 17:09:00 +02:00
Andrey Antukh
85a1443ada 💄 Add cosmetic improvements to get-frames fn 2023-08-29 17:09:00 +02:00
Andrey Antukh
ce0842ce87 🎉 Add d/unstable-sort helper 2023-08-29 17:09:00 +02:00
Andrey Antukh
59600d07c3 Add type hints to intersect-segments? fn 2023-08-29 17:09:00 +02:00
Andrey Antukh
5b73040696 Add type hints to on-segment? fn 2023-08-29 17:09:00 +02:00
Andrey Antukh
d8c1425daf Add minor perfromance improvement to is-point-inside-evenodd fn
Replace filter with filterv for avoid an other iteration on the
following count operation
2023-08-29 17:09:00 +02:00
Andrey Antukh
64accaa842 Simplify has-point? impl for non-path shapes 2023-08-29 17:09:00 +02:00
Andrés Moya
eed175dfe4 Rework usage of design components and tokens 2023-08-29 16:05:58 +02:00
Alejandro
266e1c7142 Merge pull request #3572 from penpot/eva-fix-layer-name-viewer
🐛 Fix layer name on viewer
2023-08-29 14:18:10 +02:00
Eva
befbb17ee3 🐛 Fix layer name on viewer 2023-08-29 14:11:04 +02:00
Andrey Antukh
1794ea0d9e Merge remote-tracking branch 'origin/staging' into develop 2023-08-29 13:25:51 +02:00
Andrey Antukh
5f65960d42 Merge pull request #3568 from penpot/eva-fix-tooltip-visibility
🐛 Fix tooltip on toggle visibility and toggle lock buttons
2023-08-29 13:15:54 +02:00
Eva
dc813732c3 🐛 Fix tooltip on toggle visibility and toggle lock buttons 2023-08-29 13:15:40 +02:00
Andrey Antukh
661e4a001a Merge pull request #3569 from penpot/superalex-fix-invalid-file-amount-after-moving-files
🐛 Bugfixing
2023-08-29 13:13:36 +02:00
Alejandro Alonso
53d1624f3f 🐛 Fix deleted pages comments shown in right sidebar 2023-08-29 13:13:12 +02:00
Alejandro Alonso
514ba6604b 🐛 Fix invalid file amount after moving files 2023-08-29 13:13:11 +02:00
Andrey Antukh
d8a42bf3c1 Merge pull request #3566 from penpot/superalex-fix-rulers
🐛 Bugfixing
2023-08-29 13:05:48 +02:00
Alejandro
0aa361013a Merge pull request #3551 from penpot/niwinz-bugfixes-1
🐛 Fix unexpected output on get-page when invalid object-id is pro…
2023-08-29 13:04:34 +02:00
Andrey Antukh
ddbc828342 🐛 Fix unexpected output on get-page when invalid object-id is provided 2023-08-29 13:04:23 +02:00
Alejandro
cbcaa582cd Merge pull request #3567 from penpot/eva-frontend-fixes
🐛 Fix some small frontend errors
2023-08-29 12:59:28 +02:00
Alejandro Alonso
67eb305202 🐛 Fix duplicate and copy/paste frames internal error 2023-08-29 11:52:35 +02:00
Andrey Antukh
cf2ee435c0 🐛 Fix incorrect event handling on dropdown menu
Related to react18 event handling new behavior
2023-08-29 11:11:16 +02:00
Eva
a225def708 Fix some small frontend errors 2023-08-29 07:46:19 +02:00
Sebastiaan Pasma
67cff1ed74 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-28 16:57:12 +02:00
Alejandro Alonso
27534702fb 🐛 Fix viewer inspect code 2023-08-28 15:54:10 +02:00
Andrés Moya
5a312fd7b2 Use new css macros and fix link color in new style 2023-08-28 15:09:31 +02:00
Andrés Moya
d8027936b4 Small enhancements 2023-08-28 15:09:31 +02:00
Andrés Moya
ca88314524 🎉 Show changed assets when updating libraries 2023-08-28 15:09:31 +02:00
Alejandro Alonso
2b2d7bc406 🐛 Fix rulers 2023-08-28 13:29:22 +02:00
Sebastiaan Pasma
22c88a19e2 🌐 Add translations for: Dutch.
Currently translated at 83.2% (1007 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-26 15:54:37 +02:00
Andrés Moya
96a5444357 Validate frame-id 2023-08-25 13:13:00 +02:00
Andrey Antukh
159ac92021 Merge pull request #3561 from penpot/superalex-click-flow-tag-open-viewer
 Click on flow tag open viewer
2023-08-25 12:40:10 +02:00
Andrey Antukh
1a92657c7c Merge pull request #3559 from penpot/superalex-fix-alt-l-shortcuts
🐛 Fix alt+l shortcuts
2023-08-25 12:37:10 +02:00
Alejandro Alonso
8669207086 Click on flow tag open viewer 2023-08-25 11:40:56 +02:00
Alejandro Alonso
b82ce671b9 🐛 Fix alt+l shortcuts 2023-08-25 10:54:34 +02:00
Andrey Antukh
629322e505 🐛 Fix snapshot debug utils 2023-08-25 10:02:54 +02:00
Alejandro
90aab03a8f Merge pull request #3556 from penpot/niwinz-develop-enhancements-3
 Improvements on devenv and docker config
2023-08-24 15:07:17 +02:00
Andrey Antukh
cb7fbc2cc4 🐛 Fix cache issues on default nginx configuration on docker images 2023-08-24 14:49:37 +02:00
Andrey Antukh
e998ec7c2d 🐛 Fix cache issues on devevn nginx config 2023-08-24 14:49:37 +02:00
Aitor Moreno
ff14208a95 Merge pull request #3555 from penpot/superalex-navigate-up-in-layer-hierarchy-with-shift-enter-shortcut
 Navigate up in layer hierarchy with Shift+Enter shortcut
2023-08-24 13:42:12 +02:00
Aitor
8593ca1310 🐛 Fix scroll automatically to layer item 2023-08-24 13:31:47 +02:00
Andrey Antukh
b80469c040 ⬆️ Update devenv dependencies 2023-08-24 13:19:02 +02:00
Alejandro Alonso
f69e141ac1 Navigate up in layer lierarchy with Shift+Enter shortcut 2023-08-24 12:25:03 +02:00
Andrey Antukh
496afb0f25 Merge remote-tracking branch 'origin/staging' into develop 2023-08-24 12:02:40 +02:00
Alejandro
b0497f1352 Merge pull request #3554 from penpot/niwinz-staging-bugfixes-8
🐛 Prevent rollback for idle-in-transaction errors on cron tasks
2023-08-24 12:02:13 +02:00
Alejandro Alonso
aaf9c6e50b Enable access tokens by default 2023-08-24 12:00:56 +02:00
Pablo Alba
c3f73ff7aa 🐛 Fix error on press escape while renamming a component 2023-08-24 11:50:59 +02:00
Andrey Antukh
d80aa7593b 🐛 Fix unexpected exception on encoding error response 2023-08-24 11:37:59 +02:00
Andrés Moya
027ef48e66 Add tooltip to library name 2023-08-24 11:34:10 +02:00
Pablo Alba
453c576fdd 💄 Assets tab visual adjustments 2023-08-24 11:34:10 +02:00
Andrey Antukh
5275c35002 🐛 Prevent rollback for idle-in-transaction errors on cron tasks 2023-08-24 11:18:56 +02:00
Alejandro
e1507755ba Merge pull request #3550 from penpot/superalex-fix-union-operations
🐛 Fix union operations
2023-08-24 06:53:39 +02:00
Andrey Antukh
3292e7b923 🐛 Make clj/jvm record impl behave the same as cljs/js 2023-08-23 18:47:26 +02:00
Andrey Antukh
e4ec954b8c 🐛 Fix incorrect impl of without-keys for records 2023-08-23 18:47:26 +02:00
Alejandro Alonso
0782382ee1 🐛 Fix union operations 2023-08-23 18:47:26 +02:00
Alejandro Alonso
f02b5765d7 🐛 Fix safe number max values 2023-08-23 14:59:08 +02:00
Pablo Alba
a6ec73fd4c Merge pull request #3553 from penpot/niwinz-bugfixes-2
🐛 Set proper minimal shape size on draw on click operation
2023-08-23 12:47:18 +02:00
Andrey Antukh
c0422f4e13 🐛 Set proper minimal shape size on draw on click operation 2023-08-23 12:43:28 +02:00
Pablo Alba
9618bd6697 Merge pull request #3538 from penpot/hiru-validate-shapes
 Add function to validate shape referential integrity
2023-08-23 10:03:38 +02:00
Alejandro Alonso
1f31722571 📎 Update version.txt file 2023-08-23 09:38:23 +02:00
Alejandro Alonso
834c18323e Revert "📎 Update version.txt file"
This reverts commit a7f39e89f6.
2023-08-23 09:38:07 +02:00
Andrés Moya
730df04970 Add function to validate shape referential integrity 2023-08-22 17:59:28 +02:00
andy
1d2f5b6c0b 🌐 Add translations for: Norwegian Bokmål.
Currently translated at 12.5% (152 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nb_NO/
2023-08-22 11:49:11 +02:00
Pablo Alba
2ca28721f7 🐛 Fix instanciate an object set it in the top frame of a tree 2023-08-22 11:28:00 +02:00
Alejandro
ab87db099a Merge pull request #3542 from penpot/niwinz-bugfixes-1
🐛 Fix inconsistencies on handlong :file-image attr on import and file-gc task
2023-08-22 06:50:58 +02:00
Andrey Antukh
661a916a5f 🐛 Fix reference counting of file-media objects in :fill-image attr 2023-08-21 19:11:55 +02:00
Andrey Antukh
b8dee17075 🐛 Fix incorrect streams handling on thumbnail_render 2023-08-21 19:11:55 +02:00
Andrey Antukh
1709f84a14 Merge remote-tracking branch 'origin/develop' into develop 2023-08-21 17:26:46 +02:00
Andrey Antukh
e6664013ba Merge remote-tracking branch 'origin/staging' into develop 2023-08-21 17:26:21 +02:00
Pablo Alba
2ada687ecc Show a confirmation dialog when an user tries to publish an empty library 2023-08-21 16:29:53 +02:00
Pablo Alba
1642efbaa4 Merge pull request #3534 from penpot/hiru-fix-absorb-library
🐛 Fix absorb unpublished library
2023-08-21 15:34:59 +02:00
Andrey Antukh
bfff547fdf Merge pull request #3525 from penpot/niwinz-react-update
 Update to React 18
2023-08-21 14:49:34 +02:00
Pablo Alba
7336312b75 New component icon 2023-08-21 14:45:32 +02:00
Aitor
4b8ee8ef84 Update to React 18 2023-08-21 14:34:54 +02:00
Alejandro Alonso
5ea9a52e69 🐛 Fix viewer 2023-08-21 14:18:56 +02:00
Pablo Alba
0ce838fbb6 Merge pull request #3533 from penpot/hiru-update-board-grids
 Board grids are now synced with components
2023-08-21 11:45:25 +02:00
Pablo Alba
3de50986e7 🐛 Fix component context menu 2023-08-21 09:38:29 +02:00
Stas Haas
c8d5e4ef35 🌐 Add translations for: German.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-08-19 13:55:24 +02:00
Alejandro Alonso
a7f39e89f6 📎 Update version.txt file 2023-08-18 10:35:12 +02:00
Andrés Moya
8e2011c755 🐛 Fix absorb unpublished library 2023-08-17 17:50:19 +02:00
Pablo Alba
70bb34118c Merge pull request #3532 from penpot/hiru-fix-component-modified
🐛 Fix component modified date in v1
2023-08-17 17:18:48 +02:00
Andrés Moya
93a0e79167 Board grids are now synced with components 2023-08-17 16:29:47 +02:00
Andrés Moya
f409dfd3d1 🐛 Fix component modified date in v1 2023-08-17 16:05:54 +02:00
Alejandro Alonso
e1954b5dd7 🐛 Fix old files with invalid refs for texts and fills 2023-08-17 09:48:18 +02:00
Pablo Alba
c2a27bb845 🐛 Fix update main targeting remote-shape 2023-08-17 09:38:30 +02:00
Pablo Alba
c5315de91c 🐛 Reset component is now against remote main 2023-08-17 09:38:30 +02:00
Andrés Moya
f8e1a15907 Enhance dump-tree debug command and add dump-subtree 2023-08-17 09:38:30 +02:00
Andrés Moya
8b801b65f6 Enhance synchronization of nested shapes 2023-08-17 09:38:30 +02:00
Sebastiaan Pasma
196d57dd5c 🌐 Add translations for: Dutch.
Currently translated at 74.1% (897 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-15 15:50:00 +02:00
Alejandro
a1ac839b2a Merge pull request #3517 from penpot/niwinz-enhancements-push-notifications
🎉 Add the ability to send push notifications
2023-08-14 12:24:43 +02:00
Andrey Antukh
1e9a4d74eb 🐛 Add safechecks to binfile exportation 2023-08-14 12:13:31 +02:00
Andrey Antukh
7a9777419c Backport db module improvements from develop 2023-08-14 12:13:31 +02:00
Andrey Antukh
28836d82cd Add minor improvements to error report template 2023-08-14 12:13:31 +02:00
Andrey Antukh
da62a6809c Stop report oidc failed operations as exceptions 2023-08-14 12:13:31 +02:00
Andrey Antukh
5d5d238fec 💄 Add minor cosmetic improvements on dashboard ui component 2023-08-14 12:13:31 +02:00
Andrey Antukh
e5dedb1e3d 🎉 Add push notifications support 2023-08-14 12:13:31 +02:00
Alejandro
2e33575f01 Merge pull request #3524 from penpot/juan-ester-ui-review
💄 Adds styling changes to new UI
2023-08-14 08:41:58 +02:00
elhombretecla
bf0a676b83 💄 Adds new modal and toolbar styles 2023-08-14 08:33:49 +02:00
Sebastiaan Pasma
4c7cd02f56 🌐 Add translations for: Dutch.
Currently translated at 54.0% (654 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-12 14:49:53 +02:00
Alejandro Alonso
b3128bd32b 🐛 Fix overlay manual positioning 2023-08-10 11:15:42 +02:00
Alejandro
b3f62d8a82 Merge pull request #3515 from penpot/niwinz-develop-bugfixes-3
🐛 Fix incorrect position data calculation on generating thumbnails
2023-08-10 10:59:55 +02:00
Andrey Antukh
9b61aae216 🐛 Fix incorrect attributes usage on shape 2023-08-10 09:47:25 +02:00
elhombretecla
6420188675 💄 Adds new CSS polishing 2023-08-10 08:57:32 +02:00
Andrey Antukh
d02329115a 🐛 Fix incorrect position data calculation on generating thumbnails
Only one change line, but it took 4 hours of work to find it...
2023-08-09 19:20:55 +02:00
Andrey Antukh
31323703a8 Merge remote-tracking branch 'origin/staging' into develop 2023-08-09 13:36:42 +02:00
Alejandro Alonso
15a9035ed1 🐛 Fix multiple elements export 2023-08-09 12:19:27 +02:00
elhombretecla
8b9781f345 💄 Adds new components styles 2023-08-09 11:31:50 +02:00
elhombretecla
bc14f59153 💄 Fix color assets and styles 2023-08-09 11:11:51 +02:00
elhombretecla
af460536d1 💄 Fix css left-header 2023-08-09 09:08:56 +02:00
Vincas Dundzys
82e51d358b 🌐 Add translations for: Lithuanian.
Currently translated at 10.3% (125 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lt/
2023-08-09 09:04:18 +02:00
Alejandro
6ceb816362 Merge pull request #3460 from penpot/niwinz-develop-enhancements-2
 Several enhancements (performance and code style)
2023-08-09 08:30:00 +02:00
Alejandro
091d1ff5cf Merge pull request #3457 from penpot/niwinz-develop-bugfixes-2
🐛 Fix unexpected exception on viewer when page has no frame
2023-08-09 08:19:53 +02:00
Alejandro
fbcc2494b4 Merge pull request #3509 from penpot/niwinz-staging-bugfixes-7
 Add improvements to api doc
2023-08-09 08:00:02 +02:00
Andrey Antukh
4a016dce14 📎 Add minor improvements on params formating on error logger 2023-08-08 14:53:55 +02:00
Andrey Antukh
53f40043aa 📎 Fix typo on api doc main template 2023-08-08 14:52:39 +02:00
Alejandro Alonso
937dd5a857 🐛 Fix zip importer for none fills 2023-08-08 13:52:09 +02:00
Andrey Antukh
36b167956c Add improvements to api doc 2023-08-08 13:44:47 +02:00
Alejandro
695152274c Merge pull request #3506 from penpot/niwinz-staging-bugfixes-7
 Improve error report of invalid image
2023-08-08 13:17:34 +02:00
Andrey Antukh
486c638076 🐛 Fix image upload issues on safari with drag&drop 2023-08-08 12:58:39 +02:00
Andrey Antukh
81facd58c9 Improve error report of invalid image 2023-08-08 12:57:49 +02:00
Alejandro
2a0031d23c Merge pull request #3505 from penpot/niwinz-staging-bugfixes-7
💄 Add  minor cosmetic improvement on error report template
2023-08-08 11:07:02 +02:00
Andrey Antukh
63a3186e6d 💄 Add minor cosmetic improvement on error report template 2023-08-08 10:42:26 +02:00
Alejandro Alonso
fcdf33b134 🐛 Fix backend api doc generation for auth required endpoints 2023-08-08 10:39:09 +02:00
Alejandro Alonso
19d88cc1a6 🐛 Fix backend api doc generation 2023-08-08 09:55:32 +02:00
Alejandro
1f68c6164a Merge pull request #3501 from penpot/niwinz-staging-bugfixes-7
 Improve get-user-info implementation (oidc)
2023-08-07 16:36:19 +02:00
Andrey Antukh
c39702fbf7 Improve get-user-info implementation (oidc) 2023-08-07 15:55:54 +02:00
Alejandro Alonso
b3f0683d02 🐛 Fix image validation 2023-08-07 15:06:59 +02:00
Andrey Antukh
1979e6f283 Merge remote-tracking branch 'origin/staging' into develop 2023-08-07 13:00:26 +02:00
Andrey Antukh
39741f98c0 Merge remote-tracking branch 'origin/develop' into develop 2023-08-07 12:59:50 +02:00
Andrey Antukh
80bf7cc1e5 Merge remote-tracking branch 'origin/staging' into develop 2023-08-07 12:59:17 +02:00
Alejandro
211de1bb9c Merge pull request #3498 from penpot/niwinz-staging-bugfixes-6
🐛 Allow nil values on bool content params
2023-08-07 12:57:30 +02:00
Alejandro
8ad16f9644 Merge pull request #3465 from penpot/eva-structure-redesign
💄 UI structure redesign
2023-08-07 12:57:21 +02:00
Eva
28a06c99b5 💄 UI structure redesign 2023-08-07 12:52:36 +02:00
Andrey Antukh
fe80aab394 🐛 Allow nil values on bool content params 2023-08-07 11:46:19 +02:00
Alejandro
a494b89bba Merge pull request #3497 from penpot/niwinz-staging-bugfixes-6
🐛 Fix incorrect implementation on error reporting context collection
2023-08-07 11:20:00 +02:00
Andrey Antukh
6e313dff84 🐛 Add workaround for unexpected exception on fix-broken-shapes
which happens when we have a component shape tree with an ephimeral
shape with id ZERO (unused and with invalid children)
2023-08-07 11:12:27 +02:00
Alejandro Alonso
766040198a 🐛 Fix text validation 2023-08-07 09:29:04 +02:00
Andrey Antukh
7afaa9d31f 🐛 Fix incorrect implementation on error reporting context collection 2023-08-04 18:40:47 +02:00
Pablo Alba
b62a149b34 🐛 Fix when component has a long name then its icon and '3 dots' menu are not visible on Design tab 2023-08-04 17:52:51 +02:00
Alejandro Alonso
cf68a9cf1e 🐛 Fix safe number max values 2023-08-04 15:16:43 +02:00
Alejandro
c69f6da2d7 Merge pull request #3493 from penpot/niwinz-staging-bugfixes-6
🐛 Several bugfixes
2023-08-04 13:35:12 +02:00
Alejandro
d02129ef04 Merge pull request #3490 from penpot/niwinz-enhancements-srepl
 Add file snapshot related internal functions
2023-08-04 13:24:49 +02:00
Andrey Antukh
259b05db51 Add more improvements to error reporting 2023-08-04 13:10:36 +02:00
Andrey Antukh
2ba7996116 🐛 Fix unexpected viewport update on leave workspace 2023-08-04 12:58:27 +02:00
Andrey Antukh
66e877ed40 🐛 Fix stroke-width parsing on svg upload
And refactor a bit the stroke parsing function
2023-08-04 12:58:27 +02:00
Pablo Alba
53ea8a7f53 🐛 Fix texts on deleteunpublish library 2023-08-04 11:04:13 +02:00
Andrey Antukh
bc27d9aab2 🎉 Add helpers to frontend debug entry point 2023-08-04 08:28:01 +02:00
Andrey Antukh
13d68a53c0 🎉 Add rpc method for working with file snapshots 2023-08-04 08:28:01 +02:00
Andrey Antukh
d1128a6b1e 🎉 Add helpers for take file snapshots 2023-08-03 17:51:34 +02:00
Andrey Antukh
f039b904f2 Add the ability to skip some rpc methods from api doc 2023-08-03 17:51:34 +02:00
Alejandro
f3bf04e1c9 Merge pull request #3488 from penpot/niwinz-staging-bugfixes-5
 Add better error reporting on response encoding middleware
2023-08-03 16:46:05 +02:00
Andrey Antukh
1190cf837b Add an internal approach to prevent xlog gc to remove file changes 2023-08-03 16:40:42 +02:00
Alejandro Alonso
79e3aadfcf 🐛 Fix undo change for multiple shapes 2023-08-03 16:38:21 +02:00
Andrey Antukh
0527c55398 Add better exception handling on json content type handling 2023-08-03 16:31:35 +02:00
Andrey Antukh
54bb89b2bb ⬆️ Upgrade yetti to v9.16 (fixes exception unwrapping) 2023-08-03 16:31:35 +02:00
Andrey Antukh
9334f935eb Add better error reporting on response encoding middleware 2023-08-03 16:10:41 +02:00
Andrey Antukh
804addfa66 📎 Add srepl helper for process files 2023-08-03 11:49:14 +02:00
Alejandro
fed31d366f Merge pull request #3480 from penpot/azazeln28-bugfixing-1
🐛 Bug fixing
2023-08-03 07:28:28 +02:00
Aitor Moreno
55b7bba944 Merge pull request #3484 from penpot/superalex-fix-duplicate-board
🐛 Fix duplicate board
2023-08-02 18:27:18 +02:00
Alejandro Alonso
3ff13f1d8f 🐛 Fix duplicate board 2023-08-02 18:22:46 +02:00
Aitor
4b28685a6d 🐛 Fix prototype selects preventing ctrl-z 2023-08-02 16:15:08 +02:00
Alejandro
53001921d5 Merge pull request #3481 from penpot/niwinz-staging-hotfix-4
🐛 Bugfixes & Improvements
2023-08-02 16:08:12 +02:00
Andrey Antukh
046f501152 Improve error reporting context 2023-08-02 14:51:12 +02:00
Andrey Antukh
00f7c94377 Improve database error reporter 2023-08-02 13:43:53 +02:00
Andrey Antukh
eae5dfc828 🐛 Don't send empty changes on fix broken shape links 2023-08-02 13:43:53 +02:00
Andrey Antukh
88261c2ec3 Increase network timeout on exporter dockerfile 2023-08-02 13:43:53 +02:00
Andrey Antukh
1bfc28f63d Add missing index on server_error_report table 2023-08-02 13:43:53 +02:00
Alejandro Alonso
e7a82579c1 🐛 Fix paste groups without shapes attr 2023-08-02 11:17:20 +02:00
Alejandro
30c786741f Merge pull request #3478 from penpot/niwinz-staging-hotfix-4
🐛 Fix broken shape relations on workspace initialization
2023-08-02 11:13:39 +02:00
Pablo Alba
1bb3a3a084 🐛 Add script for fix files with bad shape-ref 2023-08-02 10:46:06 +02:00
Andrey Antukh
3eb2569465 Add better exception reporting on commit-changes 2023-08-02 10:45:11 +02:00
Andrey Antukh
7efeeec9b1 Add workspace initialization fix for broken shape references
Is the code that executes at workspace initialization that checks all
the shape children for broken references and proceed to emit a special
event that fixes the shape children references.
2023-08-02 10:45:11 +02:00
Aitor
67f56dd0f8 🐛 Fix color picker not working when using shortcut 2023-08-02 10:18:40 +02:00
Alejandro
2ec5a3ba6a Merge pull request #3476 from penpot/niwinz-staging-hotfix-4
 Improve ws-conn handling on session expiration
2023-08-01 14:41:15 +02:00
Andrey Antukh
958931d264 Improve ws-conn handling on session expiration 2023-08-01 13:09:51 +02:00
Alejandro Alonso
e3f69bcc98 🐛 Fix path validation 2023-08-01 12:39:33 +02:00
Alejandro
9c53a33bac Merge pull request #3472 from penpot/niwinz-staging-hotfix-3
🐛 Ensure :shapes attr on importing an svg with an empty group
2023-07-31 16:33:06 +02:00
Andrey Antukh
f72206bba3 🐛 Ensure :shapes attr on importing an svg with an empty group
This commit should not not be backported to, because the affected
code is already refactored and the issue is already fixed on develop
branch
2023-07-31 16:26:03 +02:00
Alejandro
37a19aa6b5 Merge pull request #3471 from penpot/niwinz-staging-hotfix-3
🐛 Hot Fixes
2023-07-31 16:20:47 +02:00
Andrey Antukh
17ea8300ed 🐛 Accept nil values for :fill-color-gradient attr 2023-07-31 15:58:32 +02:00
Andrey Antukh
aac044fa0a 🐛 Fix incorrect schema on bool-content 2023-07-31 15:49:42 +02:00
Alejandro
e935ccae76 Merge pull request #3469 from penpot/niwinz-staging-hotfix-2
🐛 Allow nil values for x,y,width and height on paths
2023-07-31 13:41:22 +02:00
Andrey Antukh
13312dc467 🐛 Allow nil values for x,y,width and height on paths 2023-07-31 13:36:28 +02:00
Alejandro Alonso
0ec49e5e95 🐛 Fix remove content from boolean 2023-07-31 13:02:52 +02:00
Andrey Antukh
228b09c340 Merge remote-tracking branch 'origin/staging' into develop 2023-07-31 12:33:54 +02:00
Alejandro
a49999186f Merge pull request #3466 from penpot/niwinz-staging-hotfix-1
🐛 Remove limits that can cause unexpected exceptions
2023-07-31 12:09:58 +02:00
Andrey Antukh
fc416ee4af 🐛 Make grid params type optional 2023-07-31 12:06:31 +02:00
Andrey Antukh
37bd537bfd 🐛 Remove limits that can cause unexpected exceptions 2023-07-31 11:54:29 +02:00
Andrey Antukh
a64cb47afb Merge remote-tracking branch 'origin/staging' into develop 2023-07-31 11:13:40 +02:00
Alejandro
17798dbf40 Merge pull request #3459 from penpot/niwinz-staging-bugfixes
🐛 Bugfixes & Enhancements
2023-07-31 10:20:44 +02:00
Alejandro
4e1dfcce32 Merge pull request #3453 from penpot/azazeln28-fix-thumbnail-rendering-flashing
🐛 Fix thumbnail rendering flashing
2023-07-31 09:21:55 +02:00
Aitor
c28da17515 🐛 Fix thumbnail rendering flashing 2023-07-31 09:03:33 +02:00
Alejandro
9f0e65a042 Merge pull request #3450 from penpot/azazeln28-fix-ctrl-z-select-issue
🐛 Fix CTRL+Z in workspace select
2023-07-31 08:46:51 +02:00
Aitor
f1cf5d8ba8 🐛 Fix ctrl+z in workspace select issue 2023-07-31 08:38:48 +02:00
Eva Marco
cc682a382f Merge pull request #3455 from penpot/azazeln28-fix-layers-scroll-breaking-new-css-system
Fix layers scroll breaking new css system
2023-07-31 08:03:34 +02:00
Andrey Antukh
b616a20b28 Add performance oriented refactor to the outline component 2023-07-28 16:38:28 +02:00
Andrey Antukh
c3eb90b1fa ♻️ Add minor refactor to release dialog components 2023-07-28 16:19:27 +02:00
Andrey Antukh
dcd428d3b2 ♻️ Add minor refactor to dashboard export dialog components 2023-07-28 16:18:59 +02:00
Andrey Antukh
9d2fc63780 Merge remote-tracking branch 'origin/staging' into develop 2023-07-28 16:18:37 +02:00
Pablo Alba
340fe75204 🐛 Fix copies have select color wrong 2023-07-28 13:39:16 +02:00
Andrey Antukh
1f98b168ba 🐛 Set correct modification date on projects on file move operation 2023-07-28 13:20:57 +02:00
Andrey Antukh
21430cbd7d Show project modified date consistently 2023-07-28 13:20:57 +02:00
Andrey Antukh
f174264f7f 🎉 Add flex layout playground template to the dashboard carousel 2023-07-28 13:20:57 +02:00
Andrey Antukh
51d0851846 🐛 Fix unexpected exception on viewer when page has no frame 2023-07-28 11:55:42 +02:00
Aitor Moreno
6eaa905f0c Merge pull request #3456 from penpot/niwinz-bugfixes
🐛 Bugfixes & Enhancements
2023-07-28 11:51:36 +02:00
Andrey Antukh
f76f4615cf Merge remote-tracking branch 'origin/staging' into develop 2023-07-28 11:48:50 +02:00
Andrey Antukh
1c23e4e8be 🎉 Add v1.19 release notes dialog 2023-07-28 11:27:23 +02:00
Andrey Antukh
e0ad6c0b95 🐛 Fix unexpected exception on saving boolean shapes 2023-07-28 10:43:03 +02:00
Aitor
f1d73d5662 🐛 Fix layers scroll breaking new css system 2023-07-28 10:37:17 +02:00
Pablo Alba
102e05bdf7 🐛 Fix shape-ref missing in nested components copies 2023-07-28 09:20:17 +02:00
Andrey Antukh
960ae66cbd Improve srelp.helper analyze-files usability 2023-07-27 11:49:41 +02:00
Pablo Alba
456b604937 📎 Add debug functions for shape-ref 2023-07-27 11:23:41 +02:00
Aitor Moreno
bbe3021aed Merge pull request #3448 from penpot/superalex-bugfixing-19
🐛 Bugfixing
2023-07-26 15:16:53 +02:00
Alejandro Alonso
934c6c5aae 🐛 Avoid just white spaces for old password 2023-07-26 15:12:35 +02:00
Alejandro Alonso
7036dddad1 🐛 Fix enable undo just after using pencil 2023-07-26 07:37:23 +02:00
Alejandro Alonso
92ee6320f5 🐛 Fix enable comment mode and insert image keeps on comment mode 2023-07-26 06:18:24 +02:00
Alejandro Alonso
8a3c580d0f 🐛 Fix undo layer mode preview 2023-07-26 06:18:08 +02:00
Aitor Moreno
08a11929ca Merge pull request #3442 from penpot/eva-bugfixing-11
Bugfixing
2023-07-25 17:42:05 +02:00
Alejandro
b460a8f64e Merge pull request #3447 from penpot/superalex-fix-retrieve-unread-comment-threads-extra-calls
🐛 Fix retrieve unread comment threads extra calls
2023-07-25 14:56:21 +02:00
Alejandro Alonso
1aa7960863 🐛 Fix retrieve unread comment threads extra calls 2023-07-25 14:50:42 +02:00
Pablo Alba
577c2b39dc ♻️ Rename helper root-frame? to is-direct-child-of-root? 2023-07-25 13:59:12 +02:00
Alejandro
89edcb5651 Merge pull request #3446 from penpot/niwinz-improve-connection-error-handling-on-save
 Improve connection errors handling on workspace save operation
2023-07-25 13:56:37 +02:00
Eva
653bc66b8f 🐛 Fix dropdown width 2023-07-25 13:27:07 +02:00
Andrey Antukh
bec09fb5d1 Improve connection errors handling on workspace save operation 2023-07-25 12:52:47 +02:00
Eva
9048c01308 🐛 Fix copy color information in several formats 2023-07-25 11:57:41 +02:00
Eva
959e069ea9 🐛 Fix unnecessary button 2023-07-25 11:57:39 +02:00
Eva
955bf0ef9e 🐛 Fix empty reply comments 2023-07-25 11:57:20 +02:00
Alejandro
35f931c05a Merge pull request #3436 from penpot/niwinz-enhancements
 Several enhacements
2023-07-25 10:43:07 +02:00
Eva Marco
9a60ac477f Merge pull request #3434 from penpot/superalex-bugfixing-18
🐛 Superalex bugfixing
2023-07-25 10:36:32 +02:00
Alejandro Alonso
ec131382b3 🐛 Fix error when a user different than the thread creator edits a comment 2023-07-25 10:32:11 +02:00
Alejandro Alonso
ea2e25b46d 🐛 Making old-password non required again 2023-07-25 10:32:11 +02:00
Alejandro Alonso
db7c4a9265 🐛 Fix export multiple images when only one of them has export settings 2023-07-25 10:32:11 +02:00
Alejandro Alonso
1b31a02c14 🐛 Fix when user deletes one file during import it is impossible to finish importing of second file 2023-07-25 10:32:09 +02:00
Alejandro
dcbf57d8d2 Merge pull request #3443 from penpot/palba-fix-incorrect-style-layers-tab-titles
Fix incorrect style for layers tab titles
2023-07-25 09:55:18 +02:00
Pablo Alba
6e73e7cc71 Fix incorrect style for layers tab titles 2023-07-25 09:45:52 +02:00
Aitor
44e31f1890 📚 Add missing change in CHANGES.md 2023-07-25 09:05:59 +02:00
Alejandro Alonso
fc4ed48626 Merge remote-tracking branch 'origin/staging' into develop 2023-07-25 06:57:48 +02:00
Aitor
fb4ee4a355 🐛 Fix text gradient handlers 2023-07-25 06:56:25 +02:00
Alejandro
af368d656d Merge pull request #3440 from penpot/azazeln28-fix-text-gradient-handlers
🐛 Fix text gradient handlers
2023-07-25 06:55:11 +02:00
Yaron Shahrabani
1a92bd0478 🌐 Add translations for: Hebrew.
Currently translated at 99.7% (1206 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-07-24 21:05:43 +02:00
Aitor
d83b8f29b6 🐛 Fix text gradient handlers 2023-07-24 16:06:45 +02:00
Pablo Alba
6c0d57ba03 🐛 Cant't delete copies 2023-07-24 14:59:17 +02:00
Andrey Antukh
08b35e19fb ♻️ Refactor editable-label component 2023-07-24 13:29:01 +02:00
Andrey Antukh
fb942a9620 ♻️ Refactor color-name component 2023-07-24 13:29:01 +02:00
Andrey Antukh
e60be6f262 ♻️ Refactor button-link component 2023-07-24 13:29:01 +02:00
Andrey Antukh
1e9c809b84 Add minor performance optimizations to code-block component 2023-07-24 13:29:01 +02:00
Andrey Antukh
a44f2c5788 ♻️ Add minor refactor to radio buttons components 2023-07-24 13:29:01 +02:00
Andrey Antukh
397ada1f78 ♻️ Refactor color-input naming 2023-07-24 13:29:01 +02:00
Andrey Antukh
5f558d6fdc ♻️ Refactor numeric-input naming 2023-07-24 13:29:00 +02:00
Andrey Antukh
02c853cf57 Prevent unexpected requests on dashboard after logout 2023-07-24 13:27:27 +02:00
Andrey Antukh
98091057f9 ♻️ Refactor fm/submit-button component 2023-07-24 13:27:27 +02:00
Andrey Antukh
9b9c5822d1 📎 Add minor improvement to events ns error logging 2023-07-24 13:27:27 +02:00
Andrey Antukh
27fb4c7ed9 Improve with-atomic macro to accept cfg 2023-07-24 13:27:27 +02:00
Andrey Antukh
d268ff2952 Merge remote-tracking branch 'origin/staging' into develop 2023-07-24 13:26:17 +02:00
Alejandro
d254184057 Merge pull request #3428 from penpot/alotor-bugfixes-6
Bugfixes
2023-07-24 07:42:03 +02:00
AlexTECPlayz
cd55adefb8 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-07-18 15:02:57 +02:00
Andrey Antukh
7e73ac307a Merge pull request #3426 from penpot/alotor-undo-transaction-fixes
Create guard for undo transactions
2023-07-14 17:25:17 +02:00
alonso.torres
f611584bb3 🐛 Create guard for undo transactions 2023-07-14 15:37:49 +02:00
Andrey Antukh
c1013c359d 💄 Add cosmetic improvements to update-position fn 2023-07-14 15:35:33 +02:00
Andrey Antukh
e97aab4c7f 💄 Add cosmetic improvements to align-object-to-parent fn 2023-07-14 15:35:33 +02:00
Andrey Antukh
a3f347c9fd 🐛 Fix object alignment issue 2023-07-14 15:35:33 +02:00
Andrey Antukh
e78edca5a8 🐛 Increase version numbers for ensure execute migrations again 2023-07-14 15:35:33 +02:00
Alejandro Alonso
e9914d5265 Merge remote-tracking branch 'origin/staging' into develop 2023-07-14 15:27:38 +02:00
alonso.torres
e1faba2ddc 🐛 Fix absolute positioned layouts not showing flex properties 2023-07-14 15:06:50 +02:00
Alejandro Alonso
0f60f115f5 🐛 Fix focus list for texts 2023-07-14 14:59:06 +02:00
Eva Marco
13560bc866 Merge pull request #3422 from penpot/palba-fix-library-title-style
🐛 Fix incorrect style for asset libraries titles
2023-07-14 14:43:43 +02:00
alonso.torres
c670089c03 🐛 Fix problem with skew transformations 2023-07-14 14:30:26 +02:00
alonso.torres
b1f0d09501 🐛 Fix assets right click button for multiple selection 2023-07-14 14:30:26 +02:00
alonso.torres
53b4c6383b 🐛 Fix undo when updating several texts 2023-07-14 14:30:26 +02:00
Eva Marco
e9819ab063 Merge pull request #3423 from penpot/fix-invite-cursor-position
🐛 Fix position of text cursor is a bit too high in Invitations se…
2023-07-14 14:05:05 +02:00
Pablo Alba
3af019ca6f Merge pull request #3420 from penpot/hiru-fix-touched
🐛 Fix touched detecion in texts
2023-07-14 13:45:49 +02:00
Pablo Alba
9b9f2c39b9 🐛 Fix duplicate a component copy missing shape-ref 2023-07-14 12:36:13 +02:00
Pablo Alba
203b6c63a4 🐛 Fix incorrect style for asset libraries titles 2023-07-14 12:27:42 +02:00
Pablo Alba
217ca66720 🐛 Fix position of text cursor is a bit too high in Invitations section 2023-07-14 12:25:01 +02:00
Eva Marco
4ab13ed435 Merge pull request #3419 from penpot/niwinz-enhancements-css
💄 Add mainly cosmetic improvements to several components
2023-07-14 11:14:15 +02:00
Stas Haas
3006ed7966 🌐 Add translations for: German.
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-07-14 10:49:25 +02:00
Alejandro Alonso
ab16bba21b Merge remote-tracking branch 'origin/staging' into develop 2023-07-14 07:34:25 +02:00
Alejandro
1106ebc377 Merge pull request #3418 from penpot/alotor-fix-safari-thumbs
🐛 Fix problem with safari thumbnails
2023-07-14 07:34:13 +02:00
Andrés Moya
de7a3bf52c 🐛 Fix touched detecion in texts 2023-07-13 17:10:03 +02:00
alonso.torres
9bcb3e9e7f 🐛 Fix problem with Safari thumbnails 2023-07-13 17:05:25 +02:00
Andrey Antukh
62fb9c3cfe Improve css handling on color-bullet-new component 2023-07-13 16:34:14 +02:00
Andrey Antukh
b5dac770d3 Improve performance of button-link component 2023-07-13 16:32:03 +02:00
Andrey Antukh
6ae58a77ed 💄 Use native destructuring support instead of unchecked-get 2023-07-13 16:31:59 +02:00
Andrey Antukh
00f4abbad9 Improve css handling performance on title-bar component 2023-07-13 15:55:46 +02:00
Andrey Antukh
6c13925930 🐛 Fix bad interaction of file migrations components-v2 and pointer-map feature 2023-07-13 15:00:28 +02:00
Alejandro Alonso
e8de8c2401 Merge remote-tracking branch 'origin/staging' into develop 2023-07-13 13:38:53 +02:00
Alejandro
39b46b3bc7 Merge pull request #3417 from penpot/azazeln28-fix-previous-thumbnail-rendered
🐛 Fix previous thumbnail rendered
2023-07-13 13:34:38 +02:00
Aitor
b0ba06eca8 Set smooth/instant autoscroll depending on distance 2023-07-13 13:32:15 +02:00
Eva
477dc6315e 🐛 Fix create empty comments 2023-07-13 13:31:31 +02:00
Eva
a1b90a8569 🐛 Fix exports menu on viewer mode 2023-07-13 13:31:31 +02:00
Eva
743397323d 🐛 Fix create typography with section closed 2023-07-13 13:31:31 +02:00
Eva
9e15a7548f 🐛 Fix onboarding modal height 2023-07-13 13:30:38 +02:00
Alejandro
529ef75058 Merge pull request #3414 from penpot/azazeln28-improve-layers-autoscroll
  Improve layers autoscroll
2023-07-13 13:14:51 +02:00
Aitor
2977709468 🐛 Fix previous thumbnail being rendered when fill is transparent 2023-07-13 13:14:41 +02:00
Alejandro
c4ca40da16 Merge pull request #3410 from penpot/eva-fix
🐛 Some frontend fixes
2023-07-13 13:13:45 +02:00
Alejandro Alonso
ffc65c3e31 Merge remote-tracking branch 'origin/staging' into develop 2023-07-13 12:59:53 +02:00
Alejandro
a6818a8a55 Merge pull request #3407 from penpot/azazeln28-fix-svg-text-thumbnail-rendering
🐛 Fix SVG text rendering on thumbnails
2023-07-13 12:59:20 +02:00
Aitor
a72e50f674 🐛 Fix SVG text rendering on thumbnails 2023-07-13 12:47:15 +02:00
Eva
965c4fe243 🐛 Fix create empty comments 2023-07-13 12:45:01 +02:00
Eva
13b1762873 🐛 Fix exports menu on viewer mode 2023-07-13 12:45:01 +02:00
Eva
ee73384993 🐛 Fix create typography with section closed 2023-07-13 12:45:01 +02:00
Eva
a940c7e912 🐛 Fix onboarding modal height 2023-07-13 12:44:59 +02:00
Andrey Antukh
875a3cf63c 🐛 Fix bad interaction of file migrations components-v2 and pointer-map feature 2023-07-13 12:19:22 +02:00
Andrey Antukh
8eb64de062 Merge remote-tracking branch 'origin/staging' into develop 2023-07-13 12:13:06 +02:00
Pablo Alba
119b3a405c 🐛 Fix duplicate page with comnponents duplicates the components 2023-07-13 11:42:31 +02:00
Pablo Alba
62cb7e21b8 Merge pull request #3413 from penpot/niwinz-develop-bugfixes
🐛 Fix selection bug on path edition
2023-07-13 11:41:23 +02:00
Alejandro Alonso
fc018b18b3 🐛 Fix rotate several elements in bulk 2023-07-13 11:28:17 +02:00
Aitor
f57ed6a763 Set smooth/instant autoscroll depending on distance 2023-07-13 10:52:49 +02:00
Andrey Antukh
ee7c3ece75 🐛 Fix selection bug on path edition 2023-07-13 10:50:39 +02:00
Eva Marco
233b9a7951 Merge pull request #3411 from penpot/niwinz-fix-css-macros
🐛 Fix CSS related macros backward compatibility
2023-07-13 07:54:03 +02:00
Andrey Antukh
52b7328ef5 💄 Fix indentation on workspace left toolbar ns 2023-07-12 15:26:12 +02:00
Andrey Antukh
b6e9ea1d60 🐛 Fix backward compatibility of css related macros 2023-07-12 15:24:48 +02:00
Aitor Moreno
8b7f791509 Merge pull request #3400 from penpot/alotor-bugfixes-4
Bugfixes
2023-07-12 13:11:16 +02:00
alonso.torres
369192a353 🐛 Locks shapes when moved inside a locked parent 2023-07-12 13:06:42 +02:00
alonso.torres
1b0a6b26ce 🐛 Fix problem with bool contents 2023-07-12 13:06:42 +02:00
alonso.torres
fc35b0b853 🐛 Fix retrieve user comments in dashboard 2023-07-12 13:06:42 +02:00
alonso.torres
872648d393 🐛 Fix new-file button on project not redirecting to the new file 2023-07-12 13:06:42 +02:00
alonso.torres
5631204567 🐛 Fix paste elements at bottom of frame 2023-07-12 13:06:42 +02:00
alonso.torres
9f121cb38b 🐛 Fix problem with comments not sticking 2023-07-12 13:06:42 +02:00
alonso.torres
5072c903c5 🐛 Fix bad frame-id for certain componentes 2023-07-12 13:06:42 +02:00
alonso.torres
66559d3ce3 🐛 Fix error screen on image upload failure 2023-07-12 13:06:42 +02:00
alonso.torres
7e0a612818 🐛 Fix problem when sliding color picker in selected-colors 2023-07-12 13:06:40 +02:00
Alejandro
e9ce327eef Merge pull request #3390 from penpot/hiru-fix-overlay
Fix several bugs related to interaction overlays
2023-07-12 10:57:18 +02:00
Andrés Moya
491251f5ce 🐛 Fix overlay position with elements fixed when scrolling 2023-07-12 09:46:46 +02:00
Andrés Moya
65598aa724 🐛 Fix overlay position when it has shadow or blur 2023-07-12 09:46:46 +02:00
Andrés Moya
e563611c05 🐛 Fix overlay close from an artboard 2023-07-12 09:46:46 +02:00
Andrés Moya
a2d1ce8120 🐛 Fix overlay position in open-overlay 2023-07-12 09:46:45 +02:00
Alejandro
9713f2859f Merge pull request #3322 from penpot/niwinz-performance-custom-rect
 Performance enhancements (part 1)
2023-07-12 07:20:43 +02:00
Andrey Antukh
42aee56c36 💄 Add indentation fixes on frontend tests 2023-07-11 17:27:36 +02:00
Andrey Antukh
dae5e71fa1 Mark new or updated files with new features
for avoid crossversion modifications
2023-07-11 17:27:36 +02:00
Andrey Antukh
dfc2ab56a9 💄 Fix code style consistency on schema declarations on file ns 2023-07-11 17:27:36 +02:00
Andrey Antukh
ab0245279f ♻️ Refactor (again) numeric input component 2023-07-11 17:27:36 +02:00
Andrey Antukh
e96d129ee8 💄 Add minor cosmetic change on workspace drawing ns 2023-07-11 17:27:36 +02:00
Andrey Antukh
42fe47e5f1 Make the frame-id and parent-id always initialized on shape 2023-07-11 17:27:36 +02:00
Andrey Antukh
f246de82f4 💄 Add cosmetic changes to measures menu component 2023-07-11 17:27:36 +02:00
Andrey Antukh
810abe6728 🐛 Fix bug related to path shape initialization 2023-07-11 17:27:35 +02:00
Andrey Antukh
2c61cfd139 Optimize content->points helper 2023-07-11 17:27:35 +02:00
Andrey Antukh
e833e29bd4 📎 Add arity-0 to make-rect function 2023-07-11 17:27:35 +02:00
Andrey Antukh
8dfebc39fe 🔥 Remove duplicate code 2023-07-11 17:27:35 +02:00
Andrey Antukh
fbf89d7f6c Add tests for record macro 2023-07-11 17:27:35 +02:00
Andrey Antukh
0b4b14af9e Add optimized version of apply-transform
using internal mutation
2023-07-11 17:27:35 +02:00
Andrey Antukh
723aab6b80 Use positional constructor for matrix 2023-07-11 17:27:35 +02:00
Andrey Antukh
3ab67e4545 Add lightweight optimization to modifiers handling
Mainly using controlled internal mutation when is possible
2023-07-11 17:27:35 +02:00
Andrey Antukh
4a4423da70 Add micro optimization to cph/root? predicate
accessing directly to the prop instead of using
the lookup operation
2023-07-11 17:27:35 +02:00
Andrey Antukh
8d46271e9d Avoid unnecesary call on math helper 2023-07-11 17:27:35 +02:00
Andrey Antukh
a15a2010b6 Add huge optimization to the transform-points-matrix
it reduces the 90% overhead of this function; in an relative
comparison the same execution is reduced from 350ms to 18ms
2023-07-11 17:27:35 +02:00
Andrey Antukh
4d3064ba6d 💄 Add minor cosmetic improvements to geom shape pixel precision code 2023-07-11 17:27:35 +02:00
Andrey Antukh
0e513f950a 💄 Add minor cosmetic changes to geom shape contraints code 2023-07-11 17:27:35 +02:00
Andrey Antukh
8723116230 Add some minor optimizations to geom shape common helpers 2023-07-11 17:27:35 +02:00
Andrey Antukh
819c7ea814 Add micro optimization to handle-area-selection event impl 2023-07-11 17:27:35 +02:00
Andrey Antukh
23d358aea7 💄 Add cosmetic changes on viewport hooks and actions 2023-07-11 17:27:35 +02:00
Andrey Antukh
ea5b153578 Use new defrecord for geom data structures 2023-07-11 17:27:35 +02:00
Andrey Antukh
3f14308908 Move fressian and transit impl for geom objects to respective nss 2023-07-11 17:27:35 +02:00
Andrey Antukh
f7801f9450 💄 Add minor cosmetic change to dm/get-prop macro impl 2023-07-11 17:27:35 +02:00
Andrey Antukh
f6e9c398b0 Improve performance of absolute-move function 2023-07-11 17:27:35 +02:00
Andrey Antukh
1ddea076e3 Reduce allocation on translate-*-frame functions 2023-07-11 17:27:35 +02:00
Andrey Antukh
121188d921 📎 Update frontend bench tools 2023-07-11 17:27:35 +02:00
Andrey Antukh
7fa24fdc2f 🐛 Fix issues on converting graphics to components 2023-07-11 17:27:35 +02:00
Andrey Antukh
ea47ce30df 💄 Add cosmetic improvements to align-objects event 2023-07-11 17:27:35 +02:00
Andrey Antukh
9b477ca0eb 🐛 Fix issue on transforms/move function related to path shapes
Where shape contains nils for x and y coords
2023-07-11 17:27:35 +02:00
Andrey Antukh
daeaf1548b Add minor performance enhancements to layers-toolbox component 2023-07-11 17:27:35 +02:00
Andrey Antukh
0bc468f434 Optimize layer-item component 2023-07-11 17:27:35 +02:00
Andrey Antukh
f3b856b2af Improve performance and usability of new css styles 2023-07-11 17:27:35 +02:00
Andrey Antukh
b65452cb73 Add performance improvements to use-search hook on layers 2023-07-11 17:27:35 +02:00
Andrey Antukh
0102ca1bcf Add performance improvements to layer-name component 2023-07-11 17:27:35 +02:00
Andrey Antukh
6a1c32bb71 Use native props destructuring on measures menu 2023-07-11 17:27:35 +02:00
Andrey Antukh
03271ce3fc 💄 Add cosmetic improvements on rect options sidebar 2023-07-11 17:27:35 +02:00
Andrey Antukh
6e7595f48c ♻️ Remove ? char from shape attrs 2023-07-11 17:27:35 +02:00
Andrey Antukh
405aa66357 🎉 Add new shape & rect data structures
Also optimizes some functions for faster shape and rect props
access (there is still a lot of work ahead optimizing the rest of
the functions)

Also normalizes shape creation and validation for ensuring
correct setup of all the mandatory properties.
2023-07-11 17:27:35 +02:00
Andrey Antukh
9f5640c1db 📎 Add kondo config for new defrecord macro 2023-07-11 17:27:35 +02:00
Andrey Antukh
c32b1860c4 🎉 Add custom defrecord macro implementation 2023-07-11 17:27:31 +02:00
Aitor Moreno
91037caa55 Merge pull request #3406 from penpot/eva-bugfixing-10
🐛 Fix several frontend errors
2023-07-11 16:21:12 +02:00
Eva
b94885a764 🐛 Fix shortcut translation 2023-07-11 13:31:59 +02:00
Eva
52545692df 🐛 Fix border radius values with decimals 2023-07-11 13:31:59 +02:00
Eva
3dcd640a99 🐛 Fix search bar width on layer tab 2023-07-11 13:31:59 +02:00
Eva
2e461b3070 🐛 Fix text menu order on design tab 2023-07-11 13:31:59 +02:00
Eva
41924246aa 🐛 Fix text decoration on button 2023-07-11 13:31:58 +02:00
Alejandro
2b37a3c613 Merge pull request #3405 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes & Enhancements
2023-07-11 12:55:27 +02:00
Alejandro
d0e407bfea Merge pull request #3399 from penpot/juan-toolbar-redesign
💄 Toolbar redesign
2023-07-11 12:48:18 +02:00
Andrey Antukh
f30ba5876e Add performance oriented changes to dashboard teams section 2023-07-11 12:00:16 +02:00
Andrey Antukh
23c8043f34 🐛 Fix incorrect message on sending invitation to a member 2023-07-11 12:00:16 +02:00
Alejandro
a6fc60a88d Merge pull request #3403 from penpot/palba-fix-library-backup-order
🐛 Fix library backup assets order
2023-07-11 11:12:39 +02:00
Alejandro Alonso
d3b5d577fd Merge remote-tracking branch 'origin/staging' into develop 2023-07-11 10:46:32 +02:00
Alejandro
3c9d3bd5af Merge pull request #3404 from penpot/superalex-fix-select-text-javascript-function
🐛 Fix select text javascript function
2023-07-11 10:42:14 +02:00
Alejandro Alonso
8e1c4238cb 🐛 Fix select text javascript function 2023-07-11 10:17:39 +02:00
Pablo Alba
2d57523e00 Merge pull request #3402 from penpot/superalex-bugfixing-16
🐛 Alex bugfixing
2023-07-11 08:10:56 +02:00
Pablo Alba
8e0c6da1d6 🐛 Fix library backup assets order 2023-07-11 08:05:56 +02:00
Eva
481c67b1f8 💄 Toolbar redesign 2023-07-11 07:56:14 +02:00
Alejandro Alonso
8007794cba 🐛 Fix dissolve interaction 2023-07-11 07:45:29 +02:00
Alejandro Alonso
8b81f700a5 Refactor select all on pending numeric input 2023-07-11 07:45:12 +02:00
Alejandro
b8dbd16b01 Merge pull request #3397 from penpot/juan-history-redesign
💄  History panel redesign
2023-07-11 06:52:40 +02:00
Alejandro
ea753da0ae Merge pull request #3401 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-10 15:19:49 +02:00
Alejandro
6539b7da5b Merge pull request #3396 from penpot/alotor-grid-layout
First grid layout version
2023-07-10 15:08:14 +02:00
Andrey Antukh
d1a7c58c53 Report error on something goes wrong on image processing 2023-07-10 15:07:17 +02:00
Andrey Antukh
e5a7edeaf6 Always fetch fresh library templates 2023-07-10 15:07:17 +02:00
Andrey Antukh
d0a422e8bd 💄 Add cosmetic improvement to backend main ns 2023-07-10 15:07:17 +02:00
Andrey Antukh
7ea92529f9 Make template thumbnails available offline 2023-07-10 15:07:17 +02:00
Andrey Antukh
494c585e2f Make builtin templates download ondemand if cache is not present 2023-07-10 15:07:17 +02:00
alonso.torres
da9fa31c27 Adds grid to the actibable features 2023-07-10 14:56:15 +02:00
alonso.torres
ac184a7c8f Improved codegen 2023-07-10 14:49:25 +02:00
alonso.torres
30d78554c2 Improved code generation 2023-07-10 14:49:25 +02:00
alonso.torres
cb502fc70d Improved code gen 2023-07-10 14:49:25 +02:00
alonso.torres
ecc3b29996 Fix problem with rotated layers 2023-07-10 14:49:25 +02:00
alonso.torres
a70d909a25 Show grid layout on component thumbnails and empty grids 2023-07-10 14:49:25 +02:00
alonso.torres
68c85c8fa5 Changes to transform 2023-07-10 14:49:25 +02:00
alonso.torres
61573dcef5 🐛 Fix problem with validation 2023-07-10 14:49:25 +02:00
alonso.torres
704421fa1f 🐛 Fix scroll problem 2023-07-10 14:49:25 +02:00
alonso.torres
b3482c1d6a 🐛 Fix problem with space-between and only one track 2023-07-10 14:49:25 +02:00
alonso.torres
34575b9413 Resize inspect on viewer 2023-07-10 14:49:25 +02:00
alonso.torres
3741a65276 Moved text styles to css when generating code 2023-07-10 14:49:25 +02:00
alonso.torres
a2c59acfa9 Update info panel 2023-07-10 14:49:25 +02:00
alonso.torres
c3a8c3826d Changes to edit UI 2023-07-10 14:49:25 +02:00
alonso.torres
e01af790f3 Add copy all code button 2023-07-10 14:49:25 +02:00
alonso.torres
600b1a6d8d Improved code generation 2023-07-10 14:49:25 +02:00
alonso.torres
4b8783c104 🐛 Fix problem with paste objects 2023-07-10 14:49:25 +02:00
alonso.torres
9b8ef35603 Grid layers order 2023-07-10 14:49:25 +02:00
alonso.torres
e86939b8ee Improved flex tracks behavior and auto sizing 2023-07-10 14:49:24 +02:00
alonso.torres
06ab577e41 More improvements to layout grid UI 2023-07-10 14:49:24 +02:00
alonso.torres
b13db69cf9 Grid layout polishing 2023-07-10 14:49:24 +02:00
alonso.torres
03c64303f5 Support rotated UI 2023-07-10 14:49:24 +02:00
alonso.torres
b83c35b0dd Refresh grid cells after change static/absolute item 2023-07-10 14:49:24 +02:00
alonso.torres
7b410d46ec Editing on double click 2023-07-10 14:49:24 +02:00
alonso.torres
c0342a2c75 Adds cell to shape options 2023-07-10 14:49:24 +02:00
alonso.torres
f920d4213e Fix problem with zoom 2023-07-10 14:49:24 +02:00
alonso.torres
0c1e83e4a6 Fix problem with effects 2023-07-10 14:49:24 +02:00
alonso.torres
0358eb51e8 Change behavior on empty grid creation 2023-07-10 14:49:24 +02:00
alonso.torres
cf4e2f91d1 Grid layout polishing 2023-07-10 14:49:24 +02:00
alonso.torres
0e152bb7f9 Paste on position in grid 2023-07-10 14:49:24 +02:00
alonso.torres
714b2c8805 Remove tracks update multispan cells 2023-07-10 14:49:24 +02:00
alonso.torres
b0136fef29 🐛 Fix problem with fill width/height and alignment 2023-07-10 14:49:24 +02:00
alonso.torres
b3b984d339 Add import/export svg for grid 2023-07-10 14:49:24 +02:00
alonso.torres
664825a2a6 Fix specs for grid layout 2023-07-10 14:49:24 +02:00
alonso.torres
7e7b642e20 Move objects in grid with keys 2023-07-10 14:49:24 +02:00
alonso.torres
c9b932f954 Position absolute in grid layout 2023-07-10 14:49:24 +02:00
alonso.torres
117a8d09d3 Add space-between/space-around/space evenly to grids 2023-07-10 14:49:24 +02:00
alonso.torres
2177b7ae13 Improved auto/flex size assignment 2023-07-10 14:49:24 +02:00
alonso.torres
8671e9cf8a Child element options 2023-07-10 14:49:24 +02:00
alonso.torres
1c4678ad5d Update grid on child changes 2023-07-10 14:49:24 +02:00
alonso.torres
c31dc94496 Align items in grid layout 2023-07-10 14:49:24 +02:00
alonso.torres
47e927d571 Change column/row from cell options 2023-07-10 14:49:24 +02:00
alonso.torres
f5bb6b05f3 Add grid icons to layers 2023-07-10 14:49:24 +02:00
alonso.torres
5925d2520f Changes to the editor UI 2023-07-10 14:49:24 +02:00
alonso.torres
3c8934e847 Fill size for grid children 2023-07-10 14:49:24 +02:00
alonso.torres
0195165de0 Resize tracks from editor 2023-07-10 14:49:24 +02:00
alonso.torres
4bd15b5de1 Adds child layout options to grid children 2023-07-10 14:49:24 +02:00
alonso.torres
cdebf245e3 Multispan cells auto sizing 2023-07-10 14:49:24 +02:00
alonso.torres
0eff2e8887 Support for multi-track span in cells 2023-07-10 14:49:24 +02:00
alonso.torres
43d1f676ef Move shapes in grid 2023-07-10 14:49:24 +02:00
alonso.torres
2df40ad767 Adds grid column/row sizing without spanned tracks 2023-07-10 14:49:24 +02:00
alonso.torres
4bfe81f771 Enable grid editor 2023-07-10 14:49:24 +02:00
Andrey Antukh
0268964f36 Merge remote-tracking branch 'origin/staging' into develop 2023-07-10 14:47:19 +02:00
Andrey Antukh
02b41abaf8 Improve builtin template fetching management 2023-07-10 13:58:45 +02:00
Andrey Antukh
a665339c98 ♻️ Move dashboard libraries templates to other namespace
And refactor its internal state management
2023-07-10 13:58:45 +02:00
Alejandro
9c0e594294 Merge pull request #3388 from penpot/niwinz-bugfixes-2023-w26-2
 Add backward compatibility layer for v1.20 and other fixes
2023-07-10 12:48:43 +02:00
Andrey Antukh
ad53d0b55a 🐛 Update project modified-at field after file import 2023-07-10 12:44:24 +02:00
Andrey Antukh
decaeda2fe 🐛 Set bigger maximum token length on backend validation 2023-07-10 12:44:24 +02:00
Andrey Antukh
60130d4db2 🐛 Use correct fullname after OICD registration process 2023-07-10 12:44:24 +02:00
Andrey Antukh
f85a9011ee 🐛 Fix excessive data fetching on workspace comments 2023-07-10 12:44:24 +02:00
Andrey Antukh
9dbf6ffd14 🐛 Fix focus handling on comment edition 2023-07-10 12:44:24 +02:00
Andrey Antukh
992dd04b47 💄 Add cosmetic improvements to comments ns 2023-07-10 12:44:24 +02:00
Andrey Antukh
010a3ef3a7 💄 Add minor cosmetic chanes to workspace comments ns 2023-07-10 12:44:24 +02:00
Andrey Antukh
3da0d85d8f 🐛 Set correct project modified-at on moving files between projects
Happens when you use drag and drop on dashboard for moving files between
projects, but also if you use a context menu actions
2023-07-10 12:44:22 +02:00
Andrey Antukh
7a837110f0 Add proper on-accept callback on features related restriction error
Which redirects user to the dashboard if the team-id and project-id
is available in stante; if not just flushes hard refresh
2023-07-10 12:44:07 +02:00
Andrey Antukh
09d28d8583 Add better file feature handling on file retrieval 2023-07-10 12:44:07 +02:00
Andrey Antukh
90f5b4b631 Qualify json encoding warning log messages as errors 2023-07-10 12:44:07 +02:00
Alejandro
52ad26d4e7 Merge pull request #3391 from penpot/alotor-bugfixes-3
Alotor bugfixes 3
2023-07-10 12:39:48 +02:00
Eva
a77d82883f 💄 History panel redesign 2023-07-10 12:34:12 +02:00
Andrey Antukh
5c92ad727d Merge pull request #3398 from penpot/superalex-fix-nginx-locations-with-regex
🐛 Fix nginx locations with regex
2023-07-10 12:22:22 +02:00
Alejandro Alonso
7823a3270a 🐛 Fix nginx locations with regex 2023-07-10 12:00:29 +02:00
Eva
1ff08bfe6a 💄 Make small visual changes on assets tab 2023-07-10 10:53:27 +02:00
alonso.torres
b565e20f1a 🐛 Fix problem with slashes in layers names for exporter 2023-07-10 09:56:06 +02:00
alonso.torres
735170debf 🐛 Fix problem with HSV color picker 2023-07-10 09:56:06 +02:00
alonso.torres
a2fbf93ec1 🐛 Fix problem with importation process 2023-07-07 14:15:14 +02:00
Andrey Antukh
7b887d3188 Merge pull request #3389 from penpot/superalex-bugfixing-15
🐛 bugfixing
2023-07-07 13:03:15 +02:00
Alejandro Alonso
c1dd4e5e6f 🐛 Fix popup 'Create a group' appears each time after single graphics is moving into already existed group 2023-07-07 13:01:56 +02:00
Alejandro Alonso
7d7b4074b2 🐛 Fix picking a gradient color in recent colors for a new color in the assets tab 2023-07-07 13:01:56 +02:00
Alejandro Alonso
51462ba476 🐛 Fix finalize editor state to consider existing position-data 2023-07-07 12:00:23 +02:00
Alejandro Alonso
99693f0fc2 🐛 Fix cut/delete text layer when while creating text 2023-07-07 12:00:22 +02:00
Andrey Antukh
fdbabe49df Merge pull request #3382 from penpot/alotor-bugfixes-2
Bugfixes
2023-07-07 10:54:48 +02:00
alonso.torres
996a614ed7 🐛 Fix grid not being cutted in frames 2023-07-07 10:18:28 +02:00
alonso.torres
7a499bfc90 🐛 Fix problem with images patterns repeating 2023-07-07 10:18:28 +02:00
alonso.torres
647beec1e8 🐛 Fix problem with comments when user left the team 2023-07-07 10:18:28 +02:00
alonso.torres
dd9f637f02 🐛 Fix problem with comments mode not staying 2023-07-07 10:18:28 +02:00
alonso.torres
00450565c8 🐛 Makes height priority for the rows/columns grids 2023-07-07 10:18:27 +02:00
Alejandro Alonso
43dfdbb374 Merge remote-tracking branch 'origin/staging' into develop 2023-07-07 08:49:06 +02:00
Alejandro Alonso
cf9fb7face 🐛 Fix 404 errors 2023-07-06 19:00:10 +02:00
Alejandro Alonso
bd4b4d23b1 Merge remote-tracking branch 'origin/staging' into develop 2023-07-06 18:31:49 +02:00
Alejandro
44514a0961 Merge pull request #3383 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-06 18:27:04 +02:00
Alejandro Alonso
bfc490bd63 🐛 Fix 404 errors 2023-07-06 15:22:55 +02:00
Andrey Antukh
1b387e9fc7 📎 Fix minor issue on CHANGES.md file 2023-07-06 13:54:08 +02:00
Andrey Antukh
4561a87450 Merge remote-tracking branch 'origin/staging' into develop 2023-07-06 13:52:23 +02:00
Andrey Antukh
0a9cad76c3 💄 Add minor cosmetic improvements to typography menu components 2023-07-06 12:46:51 +02:00
Andrey Antukh
26ef8df79c ⬆️ Update frontend dependencies (only bugfixes) 2023-07-06 12:46:51 +02:00
Andrey Antukh
cd2f50fdb4 🐛 Fix react warnings on font-selector 2023-07-06 12:46:51 +02:00
Andrey Antukh
59d02314e2 ⬆️ Update google fonts 2023-07-06 12:46:51 +02:00
Andrey Antukh
88ac27788b 🐛 Fix whitespace handling on color assets name 2023-07-06 12:46:51 +02:00
Andrey Antukh
c16de52b49 ♻️ Add minor refactor to shared-link dialog component
Fixes the issue of creating incorrect link when only non-current pages
are selected on the shared link permissions
2023-07-06 12:46:51 +02:00
Andrey Antukh
8d6d589a0c 💄 Add minor cosmetic change to viewer-page component 2023-07-06 12:29:33 +02:00
Andrey Antukh
0817c4e140 Print js trace on exceptional state error is raised 2023-07-06 12:29:33 +02:00
Andrey Antukh
aad70d9df8 💄 Add minor cosmetic improvement to viewer events ns 2023-07-06 12:29:33 +02:00
Andrey Antukh
bbcf9c00a5 🐛 Remove conditional cache handling from get-view-only-bundle rpc method
The cond/etag handling is the cause of incorrect number of shared links
returned by the endpoint. Because of incorrect cache invalidation.
2023-07-06 12:29:33 +02:00
Eva
49df4a9404 🐛 Fix several frontend validations 2023-07-06 12:28:47 +02:00
Eva
acfeae8638 🐛 Fix select all checkbox on shared link config 2023-07-06 12:28:47 +02:00
Eva
7216a514e6 🐛 Fix context menu z-index 2023-07-06 12:28:47 +02:00
Eva
48d9541d46 🐛 Fix scroll of comment list on viewer 2023-07-06 12:28:47 +02:00
Alejandro Alonso
01ec22d662 🐛 Fix finalize text editor state when blur 2023-07-05 13:22:50 +02:00
Alejandro Alonso
b43d09e5ce 🐛 Fix email change validation 2023-07-05 13:22:50 +02:00
Alejandro Alonso
009236bbe3 🐛 Fix export from shared prototype 2023-07-05 13:22:50 +02:00
Alejandro Alonso
0d87dc5680 🐛 Fix drag and drop in the dashboard generates import file error message 2023-07-05 13:22:50 +02:00
Alejandro
8b0339bbab Merge pull request #3379 from penpot/alotor-bugfixes
Alotor bugfixes
2023-07-05 10:58:48 +02:00
alonso.torres
302bfd3007 🐛 Fix problems with locked frames 2023-07-05 08:44:59 +02:00
alonso.torres
302750bd7e 🐛 Fix issue with paths line to curve and concurrent editing 2023-07-05 08:10:54 +02:00
alonso.torres
66e32e9cbd 🐛 Fix problem with selection shortcuts 2023-07-05 08:10:50 +02:00
alonso.torres
e40245e187 🐛 Fixed problem with styles inside def for svg import 2023-07-05 08:09:48 +02:00
Alejandro
16854e7e83 Merge pull request #3376 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-05 06:25:37 +02:00
Kristijan Žic
53ed1404e7 🌐 Add translations for: Croatian.
Currently translated at 84.9% (1027 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2023-07-05 04:17:05 +02:00
Andrey Antukh
5a8df0dfae Add better validation of profile rpc methods 2023-07-04 19:28:52 +02:00
Andrey Antukh
8f8d90abbc Revert some changes to the audit validation 2023-07-04 19:28:52 +02:00
Alejandro
bf297539ae Merge pull request #3374 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-04 16:27:17 +02:00
Eva
fe8f13ed57 Add new palette UI 2023-07-04 15:35:45 +02:00
Andrey Antukh
be652b909e Add stronger validationt to auth/register rpc methods 2023-07-04 14:36:31 +02:00
Andrey Antukh
068d2f13f4 Add min-max validation to word-string schema 2023-07-04 13:55:58 +02:00
Andrey Antukh
1464f5da90 Ensure that all emails are under 250chars 2023-07-04 13:55:58 +02:00
Andrey Antukh
7b0d3bdcab Add stricter validation on events endpoint 2023-07-04 13:55:58 +02:00
Alejandro
5d42631c7a Merge pull request #3370 from penpot/niwinz-improvements
 Add some improvements to the oidc module
2023-07-04 12:36:39 +02:00
Andrey Antukh
e0c0b251a9 💄 Add minor cosmetic change to CHANGES.md file 2023-07-04 11:19:19 +02:00
Andrey Antukh
a868dcf8e6 🐛 Don't allow empty strings and whitespace-only strings on media name 2023-07-04 11:19:19 +02:00
Andrey Antukh
b64a9f0cf4 🐛 Fix graphic item rename on assets pannel 2023-07-04 11:19:19 +02:00
Alejandro
45a909f5ff Merge pull request #3371 from penpot/niwinz-bugfixes-2023-w26
🐛 Don't allow empty or whitespace-only names on components
2023-07-04 06:52:05 +02:00
Andrey Antukh
dcc15e485d 🐛 Don't allow empty or whitespace-only names on components 2023-07-03 17:03:18 +02:00
Alejandro
6849a5b0e0 Merge pull request #3357 from penpot/eva-bugfixin-8
🐛 Fix some bugs
2023-07-03 14:04:42 +02:00
Eva
ef3fedee59 🐛 Fix some warnings and format some files 2023-07-03 13:58:58 +02:00
Eva
8955f87d5a 🐛 Fix z-index nillable input when static position 2023-07-03 13:58:57 +02:00
Eva
94b5c98042 🐛 Fix context menu outside screen 2023-07-03 13:58:40 +02:00
Eva
82183ec71a 🐛 Fix create and account only with spaces 2023-07-03 13:58:22 +02:00
Eva
e75b53ff8d 🐛 Fix search font visualitation 2023-07-03 13:58:01 +02:00
Eva
9a880f007c 🐛 Fix focus title on layers sidebar 2023-07-03 13:57:48 +02:00
Eva
02466d603c 🐛 Fix allow team name to be all blank 2023-07-03 13:57:47 +02:00
Eva
4d4e9703cc 🐛 Fix drag projects on dahsboard 2023-07-03 13:57:30 +02:00
Eva
a737c125d5 🐛 Fix unpublish more than one library at the same time 2023-07-03 13:57:15 +02:00
Alejandro Alonso
56bee7dd7c 📎 Update CHANGES.md file and version.txt 2023-07-03 13:33:49 +02:00
Alejandro Alonso
d809b972ec Merge remote-tracking branch 'origin/staging' into develop 2023-07-03 13:32:48 +02:00
Alejandro Alonso
e461745479 📎 Update CHANGES.md file and version.txt 2023-07-03 13:32:36 +02:00
Andrey Antukh
8cda8924df Add the ability to select user info source
using the PENPOT_OIDC_USER_INFO_SOURCE environment variable
with two possible values: token and userinfo
2023-07-03 10:46:29 +02:00
Andrey Antukh
dda67af5cc Update oidc impl with latest buddy-sign improvements 2023-07-03 10:46:25 +02:00
Andrey Antukh
cadcc1607d Increase default argon2id iterations 2023-07-03 10:43:26 +02:00
Andrey Antukh
63c8798264 ⬆️ Update backend and common dependencies 2023-07-03 10:43:26 +02:00
Alejandro Alonso
d22c47fc50 Merge remote-tracking branch 'origin/staging' into develop 2023-07-03 09:38:18 +02:00
Alejandro Alonso
74dd4f1ff8 🐛 Fix text content validation 2023-07-03 09:35:55 +02:00
Alejandro Alonso
53cee87701 🐛 Fix deleted fonts present in recent block 2023-07-03 09:35:55 +02:00
Alejandro Alonso
d939a86e75 🐛 Fix null vlaues for grid columns/rows 2023-07-03 09:28:57 +02:00
elhombretecla
38f1e9338a Update README.md 2023-07-03 08:57:53 +02:00
elhombretecla
da19544cbe Update README.md 2023-07-03 08:57:38 +02:00
elhombretecla
711d63c51e Update README.md 2023-07-03 08:55:59 +02:00
elhombretecla
844a9cfbe2 Update README.md 2023-07-03 08:55:04 +02:00
Linerly
f691f8d5b5 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-07-02 19:52:28 +02:00
Amine Gdoura
2c68e8309e 🌐 Add translations for: Arabic.
Currently translated at 61.4% (743 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2023-07-02 19:52:27 +02:00
Amerey.eu
dce8b5b37c 🌐 Add translations for: Czech.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2023-07-01 14:52:54 +02:00
Mikel Larreategi
6546bfc889 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-07-01 14:52:52 +02:00
Linerly
b915abb2d2 🌐 Add translations for: Indonesian.
Currently translated at 97.0% (1173 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-07-01 14:52:51 +02:00
Alejandro Alonso
1afdbcfbaa Merge remote-tracking branch 'origin/staging' into develop 2023-06-28 12:49:26 +02:00
Alejandro
050646506e Merge pull request #3358 from penpot/niwinz-oidc-improvements
 Add the ability to parse OIDC JWT token
2023-06-28 10:17:11 +02:00
Andrey Antukh
6339b07fba Add the ability to parse OIDC JWT token
If jwks-uri is provided or properly discovered, they will be used
for unsign JWT token and get use info data from that token instead
of making an additional call to the userinfo endpoint
2023-06-28 00:25:48 +02:00
Pablo Alba
e61aaaecf3 🐛 Fix libraries are truncated on 'Libraries' page 2023-06-27 14:47:23 +02:00
Alejandro Alonso
a3ab524a8a Merge remote-tracking branch 'origin/staging' into develop 2023-06-27 14:12:44 +02:00
Alejandro
3ea5b1a8de Merge pull request #3356 from penpot/superalex-fix-file-etag-calculation
🐛 fix file etag calculation
2023-06-27 14:10:50 +02:00
Andrey Antukh
17731db28b 🐛 Fix file etag calculation considering the profile id too 2023-06-27 13:55:55 +02:00
Aitor
5b40fdf3f0 🔧 Add VSCode settings 2023-06-27 13:54:07 +02:00
Alejandro Alonso
9ab067b6d8 🐛 Fix add group to graphics and components 2023-06-27 13:53:17 +02:00
Pablo Alba
2648dc3d27 🐛 Fix menu for create annotation appears on components that already have annotation 2023-06-27 13:31:12 +02:00
Pablo Alba
9d06a34df4 🐛 Fix Annotation is not shown on View mode 2023-06-27 13:17:40 +02:00
Pablo Alba
201f6ed96a 🐛 Fix libraries are truncated on 'Libraries' page 2023-06-27 13:16:56 +02:00
Pablo Alba
1770bb995b 🐛 Fix annotations size: adjust textarea height according to annotation content 2023-06-27 13:08:39 +02:00
Pablo Alba
85e1899f6b 🐛 Fix '(...)' is truncated for 'Typographies' section in Library view 2023-06-27 12:47:22 +02:00
Pablo Alba
0716aaeff6 🐛 Fix missing view for empty library on Libraries page 2023-06-27 12:47:22 +02:00
Alejandro Alonso
af114ee9d0 Merge branch 'astudentinearth-astudentinearth-change-radius-tooltips' into staging 2023-06-27 10:53:09 +02:00
Alejandro Alonso
2249bf9745 📎 Update CHANGES.md file 2023-06-27 10:52:56 +02:00
astudentinearth
c3c6112ade 🐛 Change independent corner radius input tooltips
Make the inputs show a tooltip for the relevant corner(e.g. "Top left") instead of "Radius"

Signed-off-by: Burak Yeniçeri <burak.yn.dev@gmail.com>
2023-06-27 10:52:56 +02:00
Alejandro
5ea80c018f Merge pull request #3352 from penpot/niwinz-bugfixes
 Improvements & bugfixes
2023-06-27 10:40:30 +02:00
Alejandro Alonso
287213cfaf Refactor select all on input text click 2023-06-27 10:32:50 +02:00
Andrey Antukh
51d829a4b3 🐛 Fix incorrect handling of SSL param on email sending subsystem
Fixes #3213
2023-06-27 09:50:05 +02:00
Andrey Antukh
f166fe1926 🐛 Add proper validation of registration domain whitelist on oidc
Fixes #3348
2023-06-26 18:14:56 +02:00
Andrey Antukh
f60d09eb8f 🎉 Add uuid->short-id helper
Mainly helps encode a safer subset of bits (96) of an uuid using
a more compact encoding (base62) which is compatible with CSS and
URL's
2023-06-26 18:03:16 +02:00
Andrey Antukh
339903f567 🐛 Fix incorrect handling of error on thumbnail renderer 2023-06-26 14:51:49 +02:00
Andrey Antukh
7f16a79af5 🐛 Fix email printing to the logging subsystem
Fixes #3239
2023-06-26 11:16:37 +02:00
Andrey Antukh
97af5f71eb Merge branch 'staging' into develop 2023-06-26 10:21:34 +02:00
Andrey Antukh
ba4ef66cdc Merge branch 'main' into staging 2023-06-26 10:19:58 +02:00
Alejandro Alonso
7191fe847c Merge remote-tracking branch 'origin/staging' into develop 2023-06-26 09:49:54 +02:00
Alejandro
dad13ed826 Merge pull request #3350 from penpot/superalex-fix-internal-error-on-team-settings
🐛 Fix internal server error occurred when user wants to open team…
2023-06-26 09:49:34 +02:00
Alejandro Alonso
6cab413a8f 🐛 Fix internal server error occurred when user wants to open team settings 2023-06-26 09:41:08 +02:00
Alejandro
a895eaf61c Merge pull request #3347 from penpot/niwinz-fonts-local-caching
🐛 Fix several bugs related to fonts and components migration
2023-06-23 16:36:39 +02:00
Andrey Antukh
7977d75e3d Reduce the dashboard thumbnail size 2023-06-23 16:28:52 +02:00
Andrey Antukh
7746649eb8 🐛 Fix minor issues with fonts caching 2023-06-23 16:28:52 +02:00
Andrey Antukh
840801ea15 🐛 Don't update modified_at field on applying components migration 2023-06-23 16:28:52 +02:00
Andrey Antukh
cacaf2bf95 ⬆️ Update devenv dockerfile 2023-06-23 16:28:52 +02:00
Alejandro
4607d9f210 Merge pull request #3342 from penpot/niwinz-fonts-local-caching
 Add several improvements to fonts loading
2023-06-23 14:07:25 +02:00
Andrey Antukh
8f0a4e8333 🎉 Add local caching of gfonts styles 2023-06-23 13:32:38 +02:00
Andrey Antukh
ef5c9babe1 Merge remote-tracking branch 'origin/staging' into develop 2023-06-23 13:22:33 +02:00
Alejandro Alonso
f75b111564 🐛 Fix impossible to add group to typographies 2023-06-23 13:21:36 +02:00
Alejandro Alonso
a8e058ada6 🐛 Fix add asset color, invalid color appears 2023-06-23 13:21:36 +02:00
Alejandro Alonso
c988d54925 🐛 Fix hide rulers option not working 2023-06-23 13:21:36 +02:00
Alejandro
921ea61e6c Merge pull request #3344 from penpot/alotor-fix-viewer-scroll
🐛 Fix problem with scroll in viewer mode
2023-06-23 13:12:23 +02:00
Alejandro
71a6ee51fa Merge pull request #3343 from penpot/niwinz-onmpremise-improvements
 Add minor improvements for onpremise users
2023-06-23 13:10:14 +02:00
Andrey Antukh
b138550c0d 🐛 Fix issue on awsns http handler 2023-06-23 13:05:48 +02:00
Andrey Antukh
81658c90d1 Add the ability to disable dashboard templates section 2023-06-23 13:05:48 +02:00
alonso.torres
ca1e6c342f 🐛 Fix problem with scroll in viewer mode 2023-06-23 12:55:49 +02:00
Andrey Antukh
7feda98eb3 Add the ability to disable the google fonts provider 2023-06-23 12:55:22 +02:00
Alejandro
33e0e6293b Merge pull request #3341 from penpot/niwinz-bugfix-thumbnails
🐛 Fix thumbnails handling on dashboard libraries
2023-06-23 12:53:18 +02:00
Andrey Antukh
2a81d8563a 🐛 Fix thumbnails handling on dashboard libraries 2023-06-23 12:24:49 +02:00
Alejandro Alonso
ae9d6b627d Merge remote-tracking branch 'origin/staging' into develop 2023-06-22 14:38:12 +02:00
Alejandro
2db5925e60 Merge pull request #3337 from penpot/superalex-fix-text-fills-with-gradient
🐛 Fix text fills with gradient
2023-06-22 14:37:19 +02:00
Alejandro Alonso
d02f3ba011 🐛 Fix text fills with gradient 2023-06-22 14:08:21 +02:00
Alejandro
74e8081574 Merge pull request #3272 from penpot/azazeln28-thumbnail-renderer
🎉 Add thumbnail renderer service
2023-06-22 13:45:07 +02:00
Pablo Alba
1817d4ce38 🐛 It is possible to create empty component annotation (2) 2023-06-22 13:34:27 +02:00
Andrey Antukh
433b1b68c3 🐛 Improve fonts loading related to thumbnals rendering 2023-06-22 13:19:48 +02:00
Pablo Alba
776159c1e8 🐛 It is possible to create empty component annotation 2023-06-22 12:44:44 +02:00
Pablo Alba
45e76bc38b 🐛 Fix delete component annotation 2023-06-22 12:44:44 +02:00
Pablo Alba
54cee6ea72 🐛 Fix annotation is not duplicated together with main component 2023-06-22 12:44:44 +02:00
Pablo Alba
0ae4988908 🐛 Fix Internal server error occurred after clicking on '3 dots' menu of copy component on Design tab 2023-06-22 10:08:26 +02:00
Andrey Antukh
a97929992e Convert to schema some specs on file-thumbnails rpc methods 2023-06-22 09:34:13 +02:00
Alejandro Alonso
a53176489a 🐛 Fix extra line framing dashboard cards 2023-06-22 09:27:46 +02:00
Andrés Moya
d8121364ad 🐛 Fix touched on adding shapes to a component copy and undo 2023-06-22 09:27:27 +02:00
Alejandro Alonso
a66a952573 Merge remote-tracking branch 'origin/staging' into develop 2023-06-22 09:08:56 +02:00
Alejandro Alonso
d4fe810813 🐛 Fix shared link broken 2023-06-22 08:01:15 +02:00
Andrey Antukh
10205e51cc 🔥 Remove atom wrapping on several config props 2023-06-21 20:10:49 +02:00
Andrey Antukh
0aefd044dc Remove atom wrapping on public-uri 2023-06-21 20:10:49 +02:00
Andrey Antukh
d11b007795 Add thumbnail renderer
And integrate the dashboard thumbnails to use that service
2023-06-21 20:10:49 +02:00
Alejandro Alonso
5af2489315 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 17:06:47 +02:00
Alejandro Alonso
64ddfa0c31 📎 Update CHANGES.md file 2023-06-21 17:06:29 +02:00
Alejandro Alonso
6242c62bcb 📎 Update CHANGES.md file 2023-06-21 17:05:09 +02:00
Andrés Moya
e8dde477a5 🐛 Fix restore remote component 2023-06-21 17:04:46 +02:00
Alejandro Alonso
69969d9815 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 17:03:54 +02:00
Alejandro Alonso
1b0848389c 📎 Update CHANGES.md file 2023-06-21 17:03:42 +02:00
Pablo Alba
4f02cc3e86 Merge pull request #3331 from penpot/hiru-restore-comp-missing-lib
🐛 Disallow restore component when the library has been detached
2023-06-21 16:46:16 +02:00
Andrés Moya
749d60be48 🐛 Disallow restore component when the library has been detached 2023-06-21 16:39:17 +02:00
Alejandro Alonso
a0535de30c 📎 Update CHANGES.md file 2023-06-21 12:53:47 +02:00
Alejandro Alonso
bb8a523208 📎 Update CHANGES.md file 2023-06-21 12:52:13 +02:00
Alejandro Alonso
4d3e7f9a75 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 12:50:49 +02:00
Alejandro Alonso
9bd658661d Merge remote-tracking branch 'origin/staging' 2023-06-21 12:50:11 +02:00
Alejandro Alonso
2edbc10851 📎 Update CHANGES.md file 2023-06-21 12:50:04 +02:00
Alejandro Alonso
5fc303a05d Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 12:45:54 +02:00
Alejandro Alonso
50bdad3450 Merge remote-tracking branch 'origin/staging' 2023-06-21 12:44:56 +02:00
Alejandro Alonso
9a45ce80a6 🐛 Fix comments navigation 2023-06-21 12:41:49 +02:00
Pablo Alba
3645d1af20 Merge pull request #3327 from penpot/superalex-fix-right-click-options-over-layer-or-shape
🐛 Fix right click options over layer or shape
2023-06-21 12:22:24 +02:00
Alejandro Alonso
d2bfd98a05 🐛 Fix right click options over layer or shape 2023-06-20 13:29:07 +02:00
Andrey Antukh
ecedf46c2a 📎 Add missing changelog entries for the 1.18.5 2023-06-20 11:21:09 +02:00
Andrey Antukh
73d42c03d5 Allow override the default nginx resolver
using the PENPOT_INTERNAL_RESOLVER environment variable
2023-06-20 11:21:09 +02:00
Pablo Alba
e96bedc1c8 🎉 Create multiple componentes 2023-06-20 11:07:33 +02:00
Aitor Moreno
c5f37fadba Merge pull request #3323 from penpot/alotor-fix-reload
 Not hotreload cursors
2023-06-19 16:15:59 +02:00
Aitor
8052c5f973 📎 Add [data-test] to page-items 2023-06-19 16:13:48 +02:00
Andrés Moya
c499c8a323 🐛 Small fix 2023-06-19 16:09:16 +02:00
alonso.torres
6b9962b2b3 Not hotreload cursors 2023-06-19 14:57:51 +02:00
Eva Marco
0a81ae1ea0 Merge pull request #3313 from penpot/azazeln28-fix-cursors
🐛 Fix creation cursors not being displayed
2023-06-19 13:55:19 +02:00
Stas Haas
5cb5df63d9 🌐 Add translations for: German.
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-19 13:49:09 +02:00
Stas Haas
74552a4989 🌐 Add translations for: Russian.
Currently translated at 63.1% (763 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-06-19 13:49:08 +02:00
Alejandro
c6d71ea902 Merge pull request #3321 from penpot/niwinz-bugfixes-export
Niwinz bugfixes export
2023-06-19 13:16:44 +02:00
Andrey Antukh
4d850ebe6e 🐛 Add proper features initialization on render entrypoint 2023-06-19 13:08:11 +02:00
Andrey Antukh
dac18e876f 🐛 Fix validation error on password recovery submit operation 2023-06-19 13:07:46 +02:00
Andrey Antukh
d016876710 🐛 Add missing file-id validation on get-page rpc method 2023-06-19 13:07:26 +02:00
Andrey Antukh
ddeb540df6 🐛 Fix pointer map related issues on get-page rpc method
mainly used on render.html endpoint which is used by exporter
2023-06-19 13:06:44 +02:00
Pablo Alba
7733bc4419 🐛 Fix ungroup component 2023-06-19 12:29:54 +02:00
Alejandro Alonso
128fe29619 Show interactions on click as default setting at the view mode 2023-06-19 12:00:08 +02:00
Alejandro Alonso
23e200dece 🐛 Fix user select layer mode 2023-06-19 11:05:51 +02:00
Pablo Alba
d9375c1dd1 Fix duplicate shape in a component copy maintains its ref 2023-06-19 10:33:17 +02:00
K.B.Dharun Krishna
b72b8a6d53 🌐 Add translations for: Tamil.
Currently translated at 4.2% (51 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2023-06-17 11:51:35 +02:00
Mikel Larreategi
0a74696874 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-06-17 11:51:35 +02:00
Stas Haas
6548fe069e 🌐 Add translations for: German.
Currently translated at 99.4% (1202 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-17 11:51:33 +02:00
Alejandro Alonso
aeebed6ef7 Merge remote-tracking branch 'origin/staging' into develop 2023-06-16 14:13:51 +02:00
Pablo Alba
498ba257b6 Merge pull request #3290 from penpot/hiru-fix-update-notifications
🐛 Solve error in notification of library changes
2023-06-16 14:07:35 +02:00
Andrés Moya
6edba71c12 🐛 Fix calculation of component modified and remove unneeded check 2023-06-16 13:24:41 +02:00
Andrés Moya
a559e7310a 🐛 Solve error in notification of library changes
(See main.data.workspace.notifications/schema:handle-file-change)
2023-06-16 12:23:11 +02:00
Andrés Moya
ebd172ab05 🐛 Fix detection of libraries needing to update 2023-06-16 12:22:14 +02:00
Pablo Alba
cdc3367d1b Merge pull request #3286 from penpot/superalex-fix-add-flow-option-for-frames
🐛 Fix add flow option in contextual menu for frames
2023-06-16 12:17:48 +02:00
Pablo Alba
8d37d63a27 Merge pull request #3292 from penpot/hiru-fix-export-components
🐛 Fix export components for v2
2023-06-16 12:12:01 +02:00
Aitor
95f0f63276 🐛 Fix creation cursors not being displayed 2023-06-16 12:04:16 +02:00
Pablo Alba
5cab599a06 Merge pull request #3285 from penpot/hiru-fill-problems
🐛 Revert #9de962bb and solve the fill issues in a different way
2023-06-16 11:56:39 +02:00
Alejandro Alonso
24715a85e5 Deleted fonts auto match 2023-06-16 11:07:16 +02:00
Alejandro
559c03550d Merge pull request #3298 from penpot/superalex-improve-invitations-validation
 Improve invitations validation
2023-06-16 10:51:57 +02:00
Alejandro
b8137d80cc Merge pull request #3314 from penpot/superalex-fix-survey-issues-2
🐛 Fix survey select 'other' options
2023-06-16 10:49:58 +02:00
Alejandro Alonso
0d7cac28c4 🐛 Fix survey select 'other' options 2023-06-16 10:35:37 +02:00
Alejandro Alonso
ae4fe73ac9 🐛 Fix survey select default options 2023-06-16 08:40:29 +02:00
Alejandro
1c1397a5d8 Merge pull request #3307 from penpot/eva-fix-color-context
🐛 Fix number of color bullets shown on context menu
2023-06-15 12:17:30 +02:00
Eva
cbebf9a94c 🐛 Fix number of color bullets shown on context menu 2023-06-15 11:51:25 +02:00
Alejandro
119b3e7884 Merge pull request #3306 from penpot/eva-fix-shortcuts
🐛 Fix shortcuts translation error
2023-06-15 11:03:27 +02:00
Eva
13607adf86 🐛 Fix shortcuts translation error 2023-06-15 10:59:40 +02:00
Eva Marco
247c950cce Merge pull request #3304 from penpot/alotor-fix-shape-to-path
🐛 Fix problem when transforming shape to path
2023-06-15 10:36:41 +02:00
Eva Marco
1555d4abaf Merge pull request #3303 from penpot/azazeln28-cursors
 Add CSS cursor classes
2023-06-15 08:10:44 +02:00
Alejandro
77a16a6074 Merge pull request #3301 from penpot/juan-shorcuts-ui-redesign
Shorcuts UI redesign
2023-06-15 08:03:12 +02:00
Alejandro
28b1c9c6d6 Merge pull request #3302 from penpot/superalex-fix-survey-issues
🐛 Fix some onboarding survey issues
2023-06-15 07:38:47 +02:00
Alejandro Alonso
1bb1734448 🐛 Fix some onboarding survey issues 2023-06-15 07:33:11 +02:00
alonso.torres
dd472bee64 🐛 Fix problem when transforming shape to path 2023-06-14 18:07:33 +02:00
Aitor
216454f66f Add CSS cursor classes 2023-06-14 16:27:14 +02:00
elhombretecla
ca85854baf 🎉 Adds basic shortcuts structure 2023-06-14 13:12:50 +02:00
Eva Marco
0682ed101d Merge pull request #3297 from penpot/alotor-global-styles
 Fix new styles leaking for scroll
2023-06-13 11:54:58 +02:00
Alejandro Alonso
8a9a3cbf37 Improve invitations validation 2023-06-13 11:51:03 +02:00
alonso.torres
c74ccfaa8d Fix new styles leaking for scroll 2023-06-13 11:50:21 +02:00
Andrés Moya
f2fcd0f82f 🐛 Fix export components for v2 2023-06-12 17:13:10 +02:00
Andrés Moya
a43d439b31 🐛 Revert #9de962bb and solve the fill issues in a different way 2023-06-09 21:13:43 +02:00
Alejandro
b73ab97556 Merge pull request #3284 from penpot/hiru-fix-blend-mode-validation
🐛 Flix blend mode validation when importing svg
2023-06-09 11:26:02 +02:00
Alejandro Alonso
baca9a8ce5 🐛 Fix survey spanish typo 2023-06-09 10:49:03 +02:00
Alejandro Alonso
bc64fdb1bc 🐛 Fix add flow option in contextual menu for frames 2023-06-09 09:28:27 +02:00
Stas Haas
22d852fca8 🌐 Add translations for: German.
Currently translated at 98.6% (1193 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-09 03:52:52 +02:00
王世阳
17c2f44780 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-06-09 03:52:51 +02:00
Andrés Moya
1d5d5e2499 🐛 Flix blend mode validation when importing svg 2023-06-08 09:52:34 +02:00
Pablo Alba
8b29a50577 Fix paste shapes from another components should detach them 2023-06-07 16:46:52 +02:00
Pablo Alba
55a821f193 🐛 Fix copy paste can produce nested components in copies 2023-06-07 13:08:17 +02:00
Pablo Alba
291180816a 🐛 Fix go to main component on another page 2023-06-07 11:53:56 +02:00
Pablo Alba
27695f5ae1 Merge pull request #3270 from penpot/hiru-bugtixes-3
Hiru bugfixes 3
2023-06-06 16:18:51 +02:00
Pablo Alba
69d3bda01f 🐛 Remove graphics from assets filter for components v2 2023-06-06 16:11:09 +02:00
Alejandro
1632530b21 Merge pull request #3280 from penpot/superalex-fix-develop-2
🐛 Fix align.cljc lint
2023-06-06 14:11:16 +02:00
Alejandro Alonso
c89f2fc627 🐛 Fix align.cljc lint 2023-06-06 14:03:08 +02:00
Alejandro Alonso
d0c68dbc23 🎉 Updage CHANGES.md 2023-06-06 13:23:34 +02:00
Alejandro
e41c36f534 Merge pull request #3267 from dfelinto/fix-distribute
🐛 Distribute vertical spacing failing for overlapped text
2023-06-06 13:21:51 +02:00
Andrés Moya
9de962bbc9 🐛 Do not render fills block when there is no fill. 2023-06-06 13:16:28 +02:00
Sebastiaan Pasma
40286c81d4 🌐 Add translations for: Dutch.
Currently translated at 11.6% (141 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-06-06 10:49:44 +02:00
Aitor Moreno
4947169a7c Merge pull request #3268 from penpot/superalex-file-libraries-colors-order
 Improve file libraries colors order
2023-06-06 10:43:52 +02:00
Andrés Moya
f425a5866b 🐛 Allow empty fills in text content 2023-06-05 17:37:41 +02:00
Andrés Moya
3e30d4776a 🐛 Avoid unneeded component update, that was generating loops 2023-06-05 15:43:57 +02:00
Andrés Moya
bca90c54e9 🐛 Preserve root shape position on parent when create component 2023-06-05 15:43:57 +02:00
Andrés Moya
8c3f90fe36 🐛 Fix erroneous touched state when delete a copy and then undo 2023-06-05 15:43:57 +02:00
Andrés Moya
0b316d6828 🐛 Fix touched erroneously set after a text component sync 2023-06-05 15:43:57 +02:00
alonso.torres
8772e51bd2 🐛 Fix problem with padding input 2023-06-05 11:23:08 +02:00
Alejandro Alonso
7e8afb4228 Merge remote-tracking branch 'origin/staging' into develop 2023-06-05 10:19:43 +02:00
Alejandro
6659ab110c Merge pull request #3273 from penpot/alotor-fix-gap
🐛 Fix problem with undefined gaps
2023-06-05 10:04:26 +02:00
alonso.torres
3b8c3647fa 🐛 Fix problem with undefined gaps 2023-06-05 09:56:03 +02:00
Alejandro Alonso
4fc8ac61f1 ❤️ Add thanks for Dalai Felinto 2023-06-05 06:41:07 +02:00
Alejandro Alonso
5b475f9206 ❤️ Add thanks for Dalai Felinto 2023-06-05 06:40:30 +02:00
Alejandro
c228f2fd68 Merge pull request #3266 from dfelinto/fix-distribute-enable
🐛 Distribute fix enabled when two elements were selected
2023-06-05 06:38:33 +02:00
Stas Haas
3b262f2ae5 🌐 Add translations for: German.
Currently translated at 97.5% (1179 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-04 14:49:45 +02:00
Ņikita K
80dd910d58 🌐 Add translations for: Latvian.
Currently translated at 98.8% (1195 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-06-03 02:50:25 +02:00
王世阳
21a066ec64 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-06-03 02:50:24 +02:00
Dalai Felinto
395fbef19e 🐛 Distribute vertical spacing failing for overlapped text
The code was doing what it was designed to, however there is no
reason to prevent elements with a bit of overlap to also be
equally distributed.

closes #3141

Signed-off-by: Dalai Felinto <dalai@blender.org>
2023-06-02 18:45:35 +02:00
Dalai Felinto
a6155f9f83 🐛 Distribute fix enabled when two elements were selected
The distribute operations only make sense when there are at least 3
selected elements.

-----------------

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

Signed-off-by: Dalai Felinto <dalai@blender.org>
2023-06-02 18:43:37 +02:00
Pablo Alba
a89d47b5c5 🐛 Fix 'upate main component' and 'reset overrides' shows in context menu of untouched copies 2023-06-02 17:56:33 +02:00
andy
29c091a26b 🌐 Added translation for: Dutch. 2023-06-02 17:17:44 +02:00
Alejandro
531d640d38 Merge pull request #3274 from penpot/azazeln28-fix-thankyou
📚 Fix broken THANKYOU.md links
2023-06-02 15:46:56 +02:00
Aitor Moreno
3505834014 Merge pull request #3258 from penpot/superalex-add-color-asset-from-selected-layer
🐛 Fix create color asset from selected layer
2023-06-02 15:26:23 +02:00
Aitor
cc0b981938 📚 Fix broken THANKYOU.md links 2023-06-02 15:15:34 +02:00
Pablo Alba
380b632dd0 🐛 Fix can't add fill color to a component without fill 2023-06-01 15:00:01 +02:00
Pablo Alba
fc038998d5 🐛 Fix copy paste can produce nested components 2023-06-01 13:45:37 +02:00
Alejandro Alonso
b8ef6dffb9 Improve file libraries colors order 2023-06-01 13:28:59 +02:00
Eva
33fb979b2c 🐛 Fix broken file 2023-06-01 12:51:51 +02:00
Ņikita K
b249cd1b72 🌐 Add translations for: Latvian.
Currently translated at 96.5% (1167 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-06-01 08:51:33 +02:00
Andrey Antukh
b87f0bd5e8 🐛 Fix issue on features handling function 2023-06-01 06:28:00 +02:00
Pablo Alba
69069afb0a Merge pull request #3260 from penpot/hiru-component-outline-color
🐛 Detect correctly color of outlines and controls of components
2023-05-31 17:02:08 +02:00
Andrés Moya
9c79c80fd7 🐛 Detect correctly color of outlines and controls of components 2023-05-31 11:36:29 +02:00
Pablo Alba
dcb5194252 🐛 After restore a component, make the action 'go to main component' 2023-05-31 11:27:28 +02:00
Pablo Alba
4582ffb440 🐛 Fix show main component 2023-05-31 11:27:28 +02:00
Alejandro Alonso
3ca7cae6e0 Merge remote-tracking branch 'origin/staging' into develop 2023-05-31 11:15:28 +02:00
Alejandro
2a1619d71e Merge pull request #3263 from penpot/alotor-fix-modifiers-error
🐛 Fix problem with nil child
2023-05-31 11:14:45 +02:00
Alejandro Alonso
893c7a7d2e ⬆️ Update deps 2023-05-31 11:05:21 +02:00
Alejandro Alonso
274a201dba ❤️ Add thanks for Vaibhav Shukla 2023-05-31 10:43:59 +02:00
Alejandro Alonso
917f0d2b20 🐛 Fix create color assets opacity specs 2023-05-31 10:19:38 +02:00
Alejandro Alonso
5a733c84be Merge remote-tracking branch 'origin/staging' into develop 2023-05-31 10:14:45 +02:00
alonso.torres
ffdd4d1ee9 🐛 Fix problem with nil child 2023-05-31 10:04:42 +02:00
Alejandro
2b60c71a4c Merge pull request #3262 from penpot/superalex-fix-color-assets-opacity-specs
🐛 Fix create color assets opacity specs
2023-05-31 09:59:57 +02:00
Alejandro Alonso
6f59c80d86 🐛 Fix create color assets opacity specs 2023-05-31 09:48:35 +02:00
Andrés Moya
d8861bbf48 🐛 Refix commit f3754d0c55, lost in merge conflict 2023-05-30 14:41:54 +02:00
Andrés Moya
63e920828b 🐛 Fix frame components lost fill when migrated to v2 2023-05-30 10:55:12 +02:00
Andrés Moya
eeaee5fd13 🐛 Fix error first time doing a component change operation 2023-05-30 10:55:12 +02:00
Andrés Moya
fd6001090e 🐛 Detach shapes when dragged out of their component 2023-05-30 10:55:12 +02:00
Andrés Moya
968dcefc28 🐛 Maintain ids of main shapes to keep existing copies in sync 2023-05-30 10:55:12 +02:00
Pablo Alba
61cad18bcc 🐛 Use update position for align 2023-05-29 15:40:25 +02:00
Alejandro Alonso
78551cea61 🐛 Fix create color asset from selected layer 2023-05-29 15:27:21 +02:00
Alejandro Alonso
c189b5e638 🐛 Disable old urls when moving files between projects 2023-05-29 11:56:42 +02:00
Pablo Alba
2c007e7303 🐛 Remove duplicate component context menu item 2023-05-29 08:48:23 +02:00
Pablo Alba
610e34e05b Merge pull request #3245 from penpot/hiru-fix-nesting-loop
🐛 Avoid infinite loop nesting copies inside components
2023-05-26 19:00:27 +02:00
Alejandro
bd83292a85 Merge pull request #3252 from penpot/niwinz-bugfix-1
🐛 Fix incorrect impl of go-to-main-component
2023-05-26 15:55:51 +02:00
Andrey Antukh
1a420476c5 🐛 Fix incorrect impl of go-to-main-component 2023-05-26 15:51:29 +02:00
Alejandro Alonso
038d327b50 🐛 Fix project navigation from workspace 2023-05-26 15:11:35 +02:00
Alejandro Alonso
cb5ae99e1d 🐛 Fix svg import making it more resilient 2023-05-26 14:14:04 +02:00
Alejandro Alonso
00d625ee33 🐛 Avoid nil values for position-data 2023-05-26 14:14:04 +02:00
Alejandro Alonso
f3f708ee9d 🐛 Fix svg import with null fill-opacity 2023-05-26 14:14:04 +02:00
diacritica
4d094961b7 💄 Fixed link for penpotfest landing page
A simple github's friendly markdown fix to get link right
2023-05-26 12:31:37 +02:00
diacritica
97b5abb47b 📚 Added Penpot Fest link to README
This is a temporary change to let people know about Penpot Fest's open
registration
2023-05-26 12:24:56 +02:00
Alejandro
3106058637 Merge pull request #3248 from penpot/azazeln28-refactor-unnecessary-encode-decode
♻️ Refactor svg to data-uri code
2023-05-26 11:10:45 +02:00
Aitor
4068413f9f ♻️ Refactor svg to data-uri code 2023-05-26 10:43:12 +02:00
Andrey Antukh
ccafbec485 🔥 Remove testing keys from backend repl script 2023-05-26 10:19:15 +02:00
Alejandro
6000dc251d Merge pull request #3206 from penpot/niwinz-workspace-assets-component-performance
 Improve performance of workspace assets sidebar
2023-05-26 08:10:53 +02:00
Andrey Antukh
b85b479396 Add more improvements to workspace initialization 2023-05-26 08:04:01 +02:00
Andrey Antukh
5d892d14d5 Move sidebar ns to correct location 2023-05-26 08:04:01 +02:00
Andrey Antukh
da5209001b Hide all messages on enter workspace
move the logic from component to event
2023-05-26 08:04:01 +02:00
Andrey Antukh
a6659601f4 Make workspace readiness state more robust 2023-05-26 08:04:01 +02:00
Andrey Antukh
bd834ba840 Improve component renaming process on workspace 2023-05-26 08:04:01 +02:00
Andrey Antukh
0ea07fbe01 ♻️ Refactor selection management on workspace assets component 2023-05-26 08:04:01 +02:00
Andrey Antukh
8f72faf27d 🐛 Fix issues on penpot file import and components-v2 2023-05-26 08:04:01 +02:00
Andrey Antukh
68c0b0e8a7 Add minor perf improvement on components-v2 migration 2023-05-26 08:04:01 +02:00
Andrey Antukh
0078c0e601 🐛 Fix missing pointer persistence on file gc task 2023-05-26 08:04:01 +02:00
Andrey Antukh
1d4bd34dfc Move fressian to common module 2023-05-26 08:04:01 +02:00
Andrey Antukh
ff00043811 Improve workspace initialization flow 2023-05-26 08:04:01 +02:00
Andrey Antukh
8ca6055935 🐛 Fix backend shape validation after changes apply 2023-05-26 08:04:01 +02:00
Andrey Antukh
390f2b35fc 🐛 Ensure verify! works as expected on production builds 2023-05-26 08:04:01 +02:00
Andrey Antukh
02fbce13f0 Add minor performance improvements to workspace left toolbar 2023-05-26 08:04:01 +02:00
Andrey Antukh
5d8562e072 Fix react warnings on workspace shortcuts panel 2023-05-26 08:04:01 +02:00
Andrey Antukh
ca439cf604 Add minor performance improvements to workspace main components 2023-05-26 08:04:01 +02:00
Andrey Antukh
bdb0e24c40 Refactor state management of workspace header 2023-05-26 08:03:59 +02:00
Andrey Antukh
fcc4f4eed8 Refactor state management of workspace assets sidebar 2023-05-26 07:57:28 +02:00
Andrey Antukh
ef27301238 Add arity-1 to d/nilv that returns a transducer 2023-05-26 07:57:28 +02:00
Andrey Antukh
d1e74b0da9 Increase default stacktrace size on cljs 2023-05-26 07:57:28 +02:00
Andrey Antukh
a1819e78e4 ⬆️ Update rumext dependency 2023-05-26 07:57:28 +02:00
Andrey Antukh
a455fc015b 🐛 Fix several issues related to pointer-map and components-v2 2023-05-26 07:57:28 +02:00
Eva Marco
af2c10f2ab Merge pull request #3235 from penpot/akshay-gupta7-akshayg7-preview-blend-modes
🎉 Implement functionality to preview layer blend modes
2023-05-25 14:26:35 +02:00
Andrés Moya
82ba39f99c 🐛 Avoid infinite loops nesting a copy inside its own component 2023-05-25 10:53:01 +02:00
alonso.torres
471c9d5526 🐛 Fix problem with select method 2023-05-25 10:04:56 +02:00
Alejandro Alonso
9df6de2673 Merge branch 'akshay-gupta7-akshayg7-navigate-to-project-new-window' into develop 2023-05-25 09:58:47 +02:00
Alejandro Alonso
1c10bde4b1 🎉 Updage CHANGES.md 2023-05-25 09:58:33 +02:00
Akshay Gupta
64eba585d9 🎉 Add feature to open project name in new tab from workspace
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-25 09:57:49 +02:00
Alejandro Alonso
6eb5c75ad4 🐛 Fix preview layer blend modes on multiselection and avoid
persisting data while previewing
2023-05-25 08:58:52 +02:00
Andrey Antukh
23f0ee9e55 Refactor select and layer-menu components 2023-05-25 07:32:31 +02:00
Akshay Gupta
eec2fd00a2 🎉 Implement ability to preview layer blend modes
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-25 07:32:31 +02:00
Pablo Alba
749fc61885 🐛 Fix right button in frame title produces an internal error 2023-05-24 17:17:35 +02:00
Eva Marco
df1c56da2d Merge pull request #3236 from penpot/akshay-gupta7-akshayg7-add-shadows-reorder
🎉 Add ability to change shadows' order and place new shadows at first
2023-05-24 13:42:52 +02:00
Aitor
48b0df8e75 🐛 Fix thumbnails being rendered with previous size 2023-05-24 13:09:28 +02:00
Pablo Alba
fb3655506f 🐛 Fixes context menu action for duplicate main component 2023-05-24 12:26:27 +02:00
Pablo Alba
6929347da7 🎉 Change main shape name along with component name 2023-05-24 12:17:58 +02:00
Alejandro Alonso
1dab570907 🐛 Fix some limit situations on shadow reorder 2023-05-24 11:40:29 +02:00
Alejandro Alonso
1719f24b57 🐛 Fix develop branch after merge 2023-05-24 11:08:40 +02:00
Alejandro Alonso
2801431fab Merge remote-tracking branch 'origin/staging' into develop 2023-05-24 11:00:54 +02:00
Pablo Alba
8c915d1687 🐛 Fix paste component to another file 2023-05-23 09:10:54 +02:00
Pablo Alba
7d8a62664a Merge pull request #3223 from penpot/hiru-bugfixes
hiru bugfixing
2023-05-22 17:28:35 +02:00
Andrés Moya
9d5b59e9bb 🐛 Fix grouping of undo transactions 2023-05-22 17:26:53 +02:00
Andrés Moya
f73d7111b4 🐛 Avoid crash when renaming a page with double click 2023-05-22 17:26:53 +02:00
Andrés Moya
42a044fd22 🔥 Remove unused code 2023-05-22 17:26:53 +02:00
Andrés Moya
19ea85d9cc 🐛 Launch component sync when adding or removing shapes 2023-05-22 17:26:53 +02:00
Eva
defec189e2 🐛 Fix extra long names on typography assets 2023-05-22 16:32:19 +02:00
Eva
fbfff07dec 🐛 Fix background property changing it for background-color 2023-05-22 16:32:19 +02:00
Aitor Moreno
1a836bd0fc Merge pull request #3227 from penpot/alotor-fix-delete-reflow
🐛 Fix problem with layout not reflowing on shape deletion
2023-05-22 16:18:22 +02:00
alonso.torres
35e3ac5841 🐛 Fix problem with layout not reflowing on shape deletion 2023-05-22 16:11:06 +02:00
Aitor Moreno
19ce4c1cb7 Merge pull request #3219 from penpot/palba-zoom-picking-color
🐛 Fix zooming while color picker breaks UI
2023-05-22 16:00:33 +02:00
Eva
36b016a37b Add new palette UI 2023-05-22 15:59:49 +02:00
Pablo Alba
e8b87b0db1 🐛 Fix zooming while color picker breaks UI 2023-05-22 15:44:06 +02:00
Andrey Antukh
a09dd953ff Add incomplete performance enhancements to shadow menu
It is imposible to make this commponent efficient because of
the design limitations of numeric-input component
2023-05-22 14:15:08 +02:00
Andrey Antukh
73ed37f57a 💄 Add cosmetic changes to stoke related functions frontend 2023-05-22 14:15:08 +02:00
Andrey Antukh
98a6c63ad6 💄 Add cosmetic changes to shadow-add and reorder-shadow fns 2023-05-22 14:15:04 +02:00
Akshay Gupta
1eb6e30369 🎉 Add ability to change shadows order and place new shadows at top by default
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-22 12:57:01 +02:00
Andrey Antukh
68c1d9afaf Merge remote-tracking branch 'origin/staging' into develop 2023-05-22 11:01:47 +02:00
Aitor
42cd9a59b9 🐛 Fix color picker broken images 2023-05-22 10:56:46 +02:00
Andrey Antukh
b7e1e54a92 Add general performance micro optimizations 2023-05-22 10:56:46 +02:00
Andrey Antukh
78f62cc5e1 🐛 Fix incorrect level for debug and trace log messages (cljs only) 2023-05-22 10:56:46 +02:00
Aitor
48834f96d3 ♻️ Refactor thumbnail rendering on workspace 2023-05-22 10:56:46 +02:00
Pablo Alba
1d69da1ca5 🐛 Minor style tweaks for component annotations 2023-05-19 13:01:08 +02:00
Eva Marco
4c17d7d160 Merge pull request #3225 from penpot/alotor-demo-fixes
🐛 Fix problems with position absolute and code generation
2023-05-19 12:55:22 +02:00
alonso.torres
7ee685ca18 🐛 Fix problems with position absolute and code generation 2023-05-19 12:36:23 +02:00
alonso.torres
8ddc7220f7 🐛 Fix problem with file-builder 2023-05-19 12:31:26 +02:00
Pablo Alba
2704c3f3de 🐛 Fix libraries had different sizes 2023-05-19 12:30:41 +02:00
Pablo Alba
65c695e830 🐛 Fix delete page with components 2023-05-19 10:37:10 +02:00
Alejandro Alonso
a1c09057c1 🎉 Move survey to local resources 2023-05-18 12:17:03 +02:00
Pablo Alba
b6d60773e3 Merge pull request #3220 from penpot/hiru-bugfixes
Component bugfixes
2023-05-18 11:09:34 +02:00
Andrés Moya
8636a15f4b 🐛 Fix crash in reset overrides 2023-05-17 16:26:32 +02:00
Alejandro
96782bfa8e Merge pull request #3188 from penpot/niwinz-experiments-6
♻️ Refactor validation subsystem
2023-05-17 16:11:45 +02:00
Andrey Antukh
97d2af048c 🐛 Fix srepl get-file helper (add support for pointer map) 2023-05-17 16:05:31 +02:00
Andrey Antukh
049ebdd542 🐛 Fix intermitent exception on viewport ref ns 2023-05-17 16:05:31 +02:00
Andrey Antukh
bf3888585a Add some minor performance improvements to dashboard components 2023-05-17 16:05:31 +02:00
Andrey Antukh
35969e9f26 🐛 Fix incorrect assertion on dashboard ns 2023-05-17 16:05:31 +02:00
Andrey Antukh
9cb5df31d1 🐛 Fix react warning for missing key on context-menu-a11y component 2023-05-17 16:05:31 +02:00
Andrey Antukh
cf03cb4ca4 🐛 Fix unexpected exception on thumbnails & raf 2023-05-17 16:05:31 +02:00
Andrey Antukh
63f4ef97fb 🐛 Fix pointermap issue on file export 2023-05-17 16:05:31 +02:00
Andrey Antukh
8e0abec876 💄 Add some cosmetic improvements on access-tokens components 2023-05-17 16:05:31 +02:00
Andrey Antukh
5ca3d01ea1 🎉 Add malli based validation and coersion subsystem 2023-05-17 16:05:29 +02:00
Andrey Antukh
dbc08ba80f 📎 Fix linter issues on frontend 2023-05-17 15:47:21 +02:00
Andrey Antukh
47e3279302 ⬆️ Update some frontend dependencies 2023-05-17 15:47:21 +02:00
Andrey Antukh
06f25c3950 ⬆️ Update nodejs on exporter dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
e96fc32cc1 ⬆️ Update devenv dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
444b7d5aae ⬆️ Update to JDK19 on backend dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
01404ba581 🎉 Add the ability to delete and search profiles to manage.py 2023-05-17 15:47:21 +02:00
Andrey Antukh
0dc7f4e07e Add test for orphaned teams deletion 2023-05-17 15:47:21 +02:00
Andrey Antukh
730c26f1e2 📎 Remove worker explicitly from test initialization 2023-05-17 15:47:21 +02:00
Andrey Antukh
e30d1a40bc Avoid vthread pinning on invitations 2023-05-17 15:47:21 +02:00
Andrey Antukh
4e7f32aa88 Improve retry mechanism and macros 2023-05-17 15:47:21 +02:00
Pablo Alba
44a3f651c2 Merge pull request #3189 from penpot/hiru-sync-notifications
 Notify library updates when really needed
2023-05-17 15:35:06 +02:00
Andrés Moya
8a42a53522 Notify library updates when really needed 2023-05-17 14:12:49 +02:00
Andrés Moya
25f7c14f97 🐛 Fix deactivation of show distances when alt-tab is used
Alt key with a shape selected activates show-distances mode.

If you press Alt+tab, in many window managers the window is switched,
and thus the alt keydown event is sent to other app and does not reach
Penpot. So, we need to deactivate the mode also on window blur.
2023-05-17 13:53:22 +02:00
Andrés Moya
568338ad68 🐛 Avoid spec failure if not path or annotations 2023-05-16 12:22:10 +02:00
Andrés Moya
30dd9c5222 🐛 Fix undo when deleting shapes inside instances (ok) 2023-05-16 11:11:47 +02:00
Pablo Alba
68367b002e Components annotations 2023-05-16 11:06:54 +02:00
Andrés Moya
cd1825d97a Revert "🐛 Fix undo when deleting shapes inside instances"
This reverts commit c421059e97.
2023-05-12 16:40:38 +02:00
Andrés Moya
c421059e97 🐛 Fix undo when deleting shapes inside instances 2023-05-12 16:20:48 +02:00
Andrés Moya
58a6f437c4 🐛 Fix display of library view 2023-05-12 13:27:45 +02:00
Andrés Moya
e032736c27 🐛 Fix crash in libraries view 2023-05-12 12:50:16 +02:00
Andrés Moya
eb0d499ddf 🐛 Fix touched detection for texts 2023-05-10 17:21:03 +02:00
Alejandro Alonso
54ab57d8f6 Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 14:39:23 +02:00
Alejandro Alonso
eeb71982c8 Merge remote-tracking branch 'origin/staging' 2023-05-09 14:39:07 +02:00
Alejandro
ee8f071025 Merge pull request #3202 from penpot/superalex-fix-move-file-from-one-team-to-another
🐛 Fix move file between teams
2023-05-09 14:38:46 +02:00
Alejandro Alonso
b6bc8f2a25 🐛 Fix move file between teams 2023-05-09 14:26:09 +02:00
Alejandro Alonso
8352c9c6fd Merge remote-tracking branch 'origin/staging' 2023-05-09 10:22:55 +02:00
Alejandro Alonso
179b23ed6a Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 10:22:17 +02:00
Alejandro Alonso
353de39d4d 📎 Update CHANGES.md file 2023-05-09 10:20:06 +02:00
Alejandro Alonso
d97be7043a Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 09:39:08 +02:00
Alejandro Alonso
517c8f0d24 🐛 Fix typo 2023-05-09 09:38:54 +02:00
Alejandro
2ce676885f Merge pull request #3193 from penpot/niwinz-thumbnails-1
🎉 Allow submit thumbnails using multipart
2023-05-08 16:11:11 +02:00
Alejandro
cf0a42c6eb Merge pull request #3197 from penpot/azazeln28-fix-rules-rendering
🐛 Fix rules rendering
2023-05-08 11:56:28 +02:00
Aitor
0214cfa299 🐛 Fix rules rendering 2023-05-08 09:58:37 +02:00
Alejandro Alonso
81fff2b5e8 Merge branch 'ondrejkonec-ondrej-design-token-implementation' into develop 2023-05-08 08:27:04 +02:00
Ondřej Konečný
e5612a7373 🐛 Fix sidebar collapse icon
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-05-08 08:26:49 +02:00
Alejandro Alonso
969106e2b6 📎 Update CHANGES.md file 2023-05-08 06:16:42 +02:00
Alejandro Alonso
6bad9ac629 Merge branch 'akshay-gupta7-akshayg7-focus-input-search-from-dashboard' into develop 2023-05-08 06:15:04 +02:00
Akshay Gupta
c1187dd457 🎉 Add feature to focus input on search when searching a file at projects dashboard
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-08 06:13:48 +02:00
Andrey Antukh
e8ffcbae69 🎉 Add support for multipart upload of thumbnails
and improve the thumbnails storage to offloading it
to the storage subsystem
2023-05-05 17:00:35 +02:00
Andrey Antukh
c2b6b40554 💄 Add cosmetic changes (and comments) to toggle-file-thumbnail-selected function 2023-05-05 17:00:35 +02:00
Andrey Antukh
541a372f01 💄 Add cosmetic changes to duplicate-page function 2023-05-05 17:00:35 +02:00
Andrey Antukh
64cef9bb7d 📎 Add missing access-token middleware tests 2023-05-05 17:00:35 +02:00
Alejandro Alonso
70be668c1a Merge branch 'ondrejkonec-ondrej-suggestions-for-improvement' into develop 2023-05-05 11:20:25 +02:00
Ondřej Konečný
3ac8bf363a removed sizing variables from radius
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-05-05 11:20:00 +02:00
Alejandro
9e66231218 Merge pull request #3187 from penpot/azazeln28-rules-performance
 better rules performance
2023-05-05 11:07:24 +02:00
Alejandro Alonso
e55cf2bdf9 Merge branch 'ryanbreen-patch-1' into develop 2023-05-05 10:59:45 +02:00
Ryan Breen
0a5263be35 🐛 rect filter bounds math fix
get-rect-filter-bounds was incorrectly applying delta-blur to x1 twice and to y1 never

Signed-off-by: Ryan Breen
2023-05-05 10:59:15 +02:00
Alejandro
5dd1fa0f98 Merge pull request #3171 from penpot/niwinz-enhancements-3
 Improve file-gc task
2023-05-05 10:55:14 +02:00
Alejandro Alonso
82b2f920c1 Merge branch 'akshay-gupta7-akshayg7-click-to-select-full-values-design-sidebar' into develop 2023-05-05 10:49:49 +02:00
Akshay Gupta
1c0e1237c2 🎉 Add feature to select full values on click at the design sidebar 2023-05-05 10:49:25 +02:00
Andrey Antukh
ceeed73dea Merge remote-tracking branch 'origin/staging' into develop 2023-05-04 22:15:18 +02:00
Alejandro Alonso
890583a13a Add mvp access-token support 2023-05-04 22:14:55 +02:00
Alejandro Alonso
21c6730dc7 🐛 Fix emails from header 2023-05-04 15:46:52 +02:00
Aitor
19727a648d better rules performance 2023-05-04 12:46:37 +02:00
Alejandro Alonso
b90aef4e1d Merge branch 'akshay-gupta7-akshayg7-set-line-height-to-auto' into develop 2023-05-04 12:34:28 +02:00
Akshay Gupta
412ffe4b46 🎉 Add feature to set line-height to auto as 1.2 2023-05-04 12:34:10 +02:00
Alejandro Alonso
c5cfe7e2e9 Change libraries and templates order 2023-05-04 08:51:14 +02:00
Akshay Gupta
45356ae1fc 🎉 Add feature to focus input on search when searching a file at projects dashboard 2023-05-03 14:15:59 +02:00
Eva
86b0e95458 :sparkles:Add new layers panel UI design 2023-04-27 12:26:26 +02:00
Pablo Alba
90fb619dfc Fix restore main component when it was inside a group 2023-04-26 13:30:23 +02:00
Andrey Antukh
5e89aa2726 Improve file-gc task
make it more aware of fragments referenced on changes snapshots
2023-04-26 13:28:32 +02:00
Alejandro Alonso
82dad3217b 🐛 Fix translations typo 2023-04-26 12:38:02 +02:00
Alejandro Alonso
47cb228e30 Merge branch 'akshay-gupta7-akshayg7-empty-state-for-color-typographies' into develop 2023-04-26 12:36:39 +02:00
Akshay Gupta
35c0b94e0d 🎉 Add message for empty state for color and typography palettes 2023-04-26 12:36:31 +02:00
Pablo Alba
a7015f2517 Fix restore and instanciate (in copy and paste) components with parent 2023-04-26 11:34:26 +02:00
Pablo Alba
4f471f39da Merge pull request #3166 from penpot/hiru-frame-titles
 Hide frame titles for component copies
2023-04-25 21:33:56 +02:00
Pablo Alba
f14641396f Merge pull request #3165 from penpot/hiru-board-selection
 Give frames that are components more priority on selection
2023-04-25 21:31:01 +02:00
Alejandro
d97bbdf140 Merge pull request #3169 from penpot/niwinz-enhancements-2
 Add the abiltiy to forward command params as query-string
2023-04-25 16:33:03 +02:00
Andrey Antukh
f1c42a698d 📎 Increase http socket backlog 2023-04-25 16:25:49 +02:00
Andrey Antukh
8fb62628d2 Add the abiltiy to forward command params as query-string 2023-04-25 16:25:30 +02:00
Andrey Antukh
5026bfa6c1 📎 Fix linter issues introduced in previous merge 2023-04-25 13:35:26 +02:00
Andrey Antukh
b37a92aaf7 Merge remote-tracking branch 'origin/staging' into develop 2023-04-25 13:34:28 +02:00
Alejandro
c44e2a9526 Merge pull request #3167 from penpot/niwinz-bugfixes-12
 Improve OICD attrs lookup mechanism
2023-04-25 12:26:42 +02:00
Andrey Antukh
c0ccc4a5c5 Improve OICD attrs lookup mechanism 2023-04-25 12:18:06 +02:00
Alejandro
364dadc93f Merge pull request #3164 from penpot/niwinz-bugfixes-10
🎉 Enable several languages
2023-04-25 12:16:59 +02:00
Andrés Moya
b45bdb52b2 Hide frame titles for component copies 2023-04-25 11:55:03 +02:00
Andrés Moya
7c612d8bcf Give frames that are components more priority on selection 2023-04-25 11:21:24 +02:00
Andrey Antukh
3311bf6ac0 📎 Remove duplicated file 2023-04-25 11:11:58 +02:00
Andrey Antukh
b5c160732e 🎉 Add ukranian lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
f8d00c0e7f 🎉 Add latvian lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
42acae3ae3 🎉 Add korean lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
571439871b 🎉 Add faroese lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
e051e26dad 🎉 Add czech lang 2023-04-25 11:11:51 +02:00
Pablo Alba
4ddd3811b2 🐛 Fix copy and paste components between files 2023-04-25 10:27:06 +02:00
Alejandro
da54557aab Merge pull request #3163 from penpot/niwinz-bugfixes-9
🐛 🔥 Fix merge bugs and remove deprecated code
2023-04-25 10:26:47 +02:00
Aitor
52763ceaf7 Merge pull request #3138 from penpot/fix-bad-undo-group-association-in-alt-copy
🐛 Fix bad undo group associations
2023-04-25 09:42:22 +02:00
Andrey Antukh
c0ccbaebaf 🔥 Remove deprecated queries and mutations 2023-04-24 20:18:14 +02:00
Andrey Antukh
36953eef1a 🐛 Use proper commands (instead of queries) on render frontend namespace 2023-04-24 19:47:28 +02:00
Andrey Antukh
84c8a6eced 🐛 Use correct parameters on password update on login 2023-04-24 19:46:42 +02:00
Andrey Antukh
1f023eebeb 🔥 Remove unused code 2023-04-24 18:21:48 +02:00
Hosted Weblate
e2a0a40704 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-04-24 16:55:45 +02:00
Andrey Antukh
6af783ea91 Merge remote-tracking branch 'origin/staging' into develop 2023-04-24 16:55:18 +02:00
Alejandro
cea0c7277c Merge pull request #3161 from penpot/niwinz-bugfixes-8
🎉 Bugfixes and translation updates
2023-04-24 16:43:42 +02:00
Andrey Antukh
8e860ec5a6 🎉 Add Indonesian lang to the supported languages 2023-04-24 16:22:31 +02:00
Andrey Antukh
7b93c0bb09 📎 Sort all translation strings 2023-04-24 16:22:04 +02:00
Andrey Antukh
3ae8da7d22 Merge remote-tracking branch 'weblate/develop' into niwinz-bugfixes-8 2023-04-24 16:10:34 +02:00
Andrey Antukh
c31eb2df42 🐛 Fix OICD auth provider roles checking mechanism 2023-04-24 15:13:24 +02:00
Alejandro Alonso
d657f5df49 Merge remote-tracking branch 'origin/staging' 2023-04-24 09:16:52 +02:00
Alejandro Alonso
e89378453a Merge remote-tracking branch 'origin/staging' into develop 2023-04-24 09:15:22 +02:00
Alejandro
3a57b436a4 Merge pull request #3140 from penpot/azazeln28-fix-project-file-count
🐛 Fix project file count
2023-04-24 09:14:59 +02:00
Aitor
657ce4fa0a 🐛 Fix project file count 2023-04-24 09:14:44 +02:00
Alejandro
dde7063da0 Merge pull request #3145 from penpot/azazeln28-fix-page-context-menu
🐛 Fix page item context menu
2023-04-24 09:11:55 +02:00
Aitor
b3c4ff4dc0 🐛 Fix page item context menu 2023-04-24 09:04:09 +02:00
Alejandro Alonso
b7d1488aa3 Merge branch 'akshay-gupta7-akshayg7-duplicate-with-drag-and-alt' into develop 2023-04-24 08:22:28 +02:00
Akshay Gupta
d586f82da1 🎉 Implement functionality to duplicate objects via drag + alt 2023-04-24 08:22:14 +02:00
Alejandro Alonso
a658493ac5 Merge branch 'akshay-gupta7-akshayg7-typography-palette-order' into develop 2023-04-24 07:44:06 +02:00
Akshay Gupta
eaaeef2335 🎉 Update Typography palette order 2023-04-24 07:43:47 +02:00
Alejandro Alonso
bef9bbaa6a Merge branch 'abstractalgo-patch-1' into develop 2023-04-24 06:39:22 +02:00
Dragan Okanovic
32810f2ecd 🐛 Fix broken link in README 2023-04-24 06:38:17 +02:00
Ally Tiago
8856a635ed 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-04-24 05:54:38 +02:00
Radek Sawicki
d6bd4ac7fd 🌐 Add translations for: Polish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2023-04-21 23:52:22 +02:00
Radek Sawicki
efa5fb609c 🌐 Add translations for: Polish.
Currently translated at 93.5% (1108 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2023-04-20 17:52:11 +02:00
王世阳
2f920ba651 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-04-15 15:47:45 +02:00
Alejandro Alonso
ed164ce69b Merge remote-tracking branch 'origin/staging' into develop 2023-04-14 13:28:26 +02:00
Alejandro Alonso
974bbd5ff4 Merge remote-tracking branch 'origin/staging' 2023-04-14 13:27:34 +02:00
Alejandro Alonso
e1652d17d9 Update material design template to version 3 2023-04-14 13:27:06 +02:00
Pablo Alba
33656f8eb4 Merge pull request #3115 from penpot/hiru-components-boards
🎉 Now all component roots are frames
2023-04-14 12:40:32 +02:00
Andrés Moya
bbd561a772 🔧 Fix test cases 2023-04-14 12:31:04 +02:00
Andrés Moya
2790111405 🎉 Now all component roots are frames 2023-04-14 12:31:03 +02:00
Alejandro Alonso
47b791e938 Board as ruler origin 2023-04-14 09:22:43 +02:00
Pablo Alba
47b432e307 🐛 Fix bad undo group associations 2023-04-13 18:44:40 +02:00
Alejandro Alonso
ce341a05e1 Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 16:34:22 +02:00
Alejandro Alonso
b992c876e9 Merge remote-tracking branch 'origin/staging' 2023-04-13 16:33:27 +02:00
alonso.torres
9a750bad93 🐛 Fix problem with rulers not placing correctly 2023-04-13 16:32:19 +02:00
alonso.torres
d127177029 🐛 Fix problem when "show in view mode" flag 2023-04-13 16:32:02 +02:00
Alejandro
724b8990be Merge pull request #3136 from penpot/alotor-hotfix-1.18.3
Alotor hotfix 1.18.3
2023-04-13 16:28:58 +02:00
Suhwan Kim
9b7506ee8d 🌐 Add translations for: Korean.
Currently translated at 15.5% (184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2023-04-13 14:51:00 +02:00
王世阳
176d48707f 🌐 Add translations for: Chinese (Simplified).
Currently translated at 93.5% (1108 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-04-13 14:50:50 +02:00
alonso.torres
452dcb5eec 🐛 Fix problem when "show in view mode" flag 2023-04-13 14:16:03 +02:00
alonso.torres
ae3de34033 🐛 Fix problem with rulers not placing correctly 2023-04-13 14:15:49 +02:00
Alejandro Alonso
45fc55dee9 Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 12:24:52 +02:00
Alejandro Alonso
c3a4dbb871 Merge remote-tracking branch 'origin/staging' 2023-04-13 12:24:39 +02:00
Alejandro
9a695a76ed Merge pull request #3135 from penpot/palba-fix-first-level-boards-show-in-view-mode2
🐛 Fix first level board "Show in view mode" is automatically unchecked
2023-04-13 12:23:58 +02:00
Pablo Alba
36bd82ceb4 🐛 Fix first level board "Show in view mode" is automatically unchecked 2023-04-13 12:15:08 +02:00
Alejandro
067b76ebd8 Merge pull request #3134 from penpot/niwinz-bugfixes-7
🐛 Fix upload-file-media-object rpc method
2023-04-13 11:07:15 +02:00
Andrey Antukh
cb02b07395 🐛 Fix upload-file-media-object rpc method 2023-04-13 10:55:15 +02:00
Alejandro Alonso
81d718570d 🐛 Fix backend import 2023-04-13 09:21:57 +02:00
Alejandro Alonso
ee1b9e861e Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 09:17:06 +02:00
Alejandro Alonso
3905ba4ce2 Merge remote-tracking branch 'origin/staging' 2023-04-13 09:16:52 +02:00
Alejandro
0f9b50de50 Merge pull request #3127 from penpot/niwinz-bugfixes-6
🐛 Fix inconsistencies on drop datauri images (mainly for firefox …
2023-04-13 09:16:17 +02:00
Andrés Moya
271b83de2e 🐛 Fix features activation by devtools console 2023-04-12 16:14:36 +02:00
Andrey Antukh
7ef07385c6 🐛 Fix inconsistencies on drop datauri images (mainly for firefox browser) 2023-04-12 13:18:24 +02:00
Alejandro Alonso
aaca901fd9 🎉 Create typography style from a selected text layer 2023-04-12 09:30:41 +02:00
Pablo Alba
ccaac2a5c7 Merge pull request #3120 from penpot/superalex-default-naming-of-text-layers
🎉 Default naming of text layers
2023-04-11 17:50:53 +02:00
Pablo Alba
147beb3963 Merge pull request #3100 from penpot/hiru-detach-top-level-only
🎉 Detach component now only affects top instance, not subinstances
2023-04-11 15:19:20 +02:00
Pablo Alba
e481f1cc99 Merge pull request #3081 from penpot/hiru-cancel-remove-graphics
 Allow to cancel and resume later remove graphics
2023-04-11 15:16:05 +02:00
Alejandro
5cec969ee3 Merge pull request #3124 from penpot/niwinz-bugfixes-6
 Improve audit props for upload-file-media-objects rpc method
2023-04-11 13:03:15 +02:00
Andrey Antukh
12ac01a9cb Improve audit props for upload-file-media-objects rpc method 2023-04-11 12:40:59 +02:00
Pablo Alba
c1ed5a5b33 Merge pull request #3097 from penpot/hiru-fix-features-detect
♻️ Enhance features loading to avoid race conditions
2023-04-11 09:55:11 +02:00
Alejandro Alonso
4d8f471eca Merge remote-tracking branch 'origin/staging' into develop 2023-04-11 06:52:35 +02:00
Alejandro Alonso
0dcb3e94ce Merge remote-tracking branch 'origin/staging' 2023-04-11 06:51:09 +02:00
Alejandro
3233c78130 Merge pull request #3123 from penpot/alotor-hotfix
Hotfix page hangs
2023-04-11 06:50:30 +02:00
alonso.torres
dfb1a79179 🐛 Fix problem when closing paths for big imported SVGs 2023-04-11 06:43:53 +02:00
andy
9758b2722e 🌐 Added translation for: Burmese. 2023-04-10 16:45:59 +02:00
Alejandro Alonso
5993b9855e 🎉 Default naming of text layers 2023-04-10 13:16:26 +02:00
Andrey Antukh
6abca96da1 📎 Add improved docstring for penpot_secret_key 2023-04-07 08:57:08 +02:00
Andrey Antukh
6972227b8d 📎 Add improved docstring for penpot_secret_key 2023-04-07 08:55:53 +02:00
Ņikita K
1c13ab6de5 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-04-06 12:35:17 +02:00
Suhwan Kim
7e403c65c2 🌐 Add translations for: Korean.
Currently translated at 5.4% (64 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2023-04-06 12:34:52 +02:00
Alejandro Alonso
08c6ebe10c 🐛 Fix metrics and doc endpoints 2023-04-05 20:08:20 +02:00
Alejandro
73b913065f Merge pull request #3110 from penpot/alotor-fixes
🐛 Fix problem with frame title rotation
2023-04-05 09:28:03 +02:00
alonso.torres
8db3f2b277 🐛 Fix problem with frame title rotation 2023-04-05 09:23:51 +02:00
Alejandro Alonso
408de63ea3 Merge remote-tracking branch 'origin/staging' into develop 2023-04-05 07:35:36 +02:00
Alejandro
6d3baaae47 Merge pull request #3109 from penpot/niwinz-bugfixes-5
🐛 Add missing storage dependency to dbg routes module
2023-04-05 06:59:27 +02:00
Andrey Antukh
30e1c7d54e 🐛 Add missing storage dependency to dbg routes module 2023-04-04 19:20:10 +02:00
Andrey Antukh
28d3402793 Merge branch 'leonekmi-patch-1' into staging 2023-04-04 19:10:38 +02:00
Leon
e9daaa2eb8 🐛 Fix default port for penpot-exporter on nginx entrypoint
By default, penpot-frontend will try to reach penpot-export on port 80,
this is wrong, the exporter listens by default to port 6061.
2023-04-04 19:09:44 +02:00
Andrés Moya
e66f9597a9 Update component copy icon 2023-04-04 15:04:40 +02:00
Alejandro
dc7e62245d Merge pull request #3102 from penpot/alotor-bugfixing-16
SVG Uploading fixes
2023-04-04 10:14:10 +02:00
alonso.torres
da953f0bc0 🐛 Fix problems with imported SVG embedded images and transforms 2023-04-04 09:52:15 +02:00
alonso.torres
4b086ab2bc 🐛 Fix problems with imported SVG shadows 2023-04-04 09:52:15 +02:00
Alejandro
cd9bc1d8d7 Merge pull request #3104 from penpot/niwinz-bugfixes-4
🐛 Enable by default mattermost webhook error reporter
2023-04-04 08:45:10 +02:00
Andrey Antukh
cdaf63afa0 🐛 Enable by default mattermost webhook error reporter 2023-04-04 08:38:05 +02:00
Alejandro
7ebc185b3a Merge pull request #3103 from penpot/niwinz-bugfixes-3
🐛 Fix incorrect metrics reference on rpc methods middleware
2023-04-04 06:46:22 +02:00
Andrey Antukh
3222583a69 🐛 Fix incorrect metrics reference on rpc methods middleware 2023-04-03 23:09:39 +02:00
Ņikita K
85fe0130c3 🌐 Add translations for: Latvian.
Currently translated at 13.0% (154 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-04-03 14:21:30 +02:00
Alejandro Alonso
f7e37924e5 🐛 Fix backend update-profile-password! call 2023-04-03 12:53:04 +02:00
elhombretecla
1afecf23aa 🐛 Fix onboarding slides typo 2023-04-03 12:52:53 +02:00
Alejandro Alonso
68b26d5f41 Merge remote-tracking branch 'origin/staging' into develop 2023-04-03 12:21:12 +02:00
Alejandro Alonso
4926c826af Merge remote-tracking branch 'origin/staging' 2023-04-03 12:09:48 +02:00
Andrés Moya
a27fa8b317 🎉 Detach component now only affects top instance, not subinstances 2023-04-03 11:52:26 +02:00
elhombretecla
6b724d9572 Add new optimized gifs 2023-04-03 11:22:59 +02:00
elhombretecla
2789ecc22a Add new spacing optimized gif 2023-04-03 11:07:37 +02:00
Alejandro
2eba317797 Merge pull request #3099 from penpot/alotor-bugfixing-15
🐛 Fix problem with opacity in imported SVG's
2023-04-03 09:49:52 +02:00
alonso.torres
5856e3cc03 🐛 Fix problem with opacity in imported SVG's 2023-04-03 09:24:54 +02:00
Andrés Moya
8cd59c39ed 🌐 Added translation for: Latvian. 2023-04-03 09:22:22 +02:00
Andrés Moya
18efa4ff2c ♻️ Enhance features loading to avoid race conditions 2023-03-31 16:13:11 +02:00
Aimee
722e95abf2 🌐 Add translations for: French.
Currently translated at 88.5% (1048 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-03-31 15:37:52 +02:00
Alejandro
04b7d8e1e2 Merge pull request #3094 from penpot/hotfix-1.17
🐛 Fix problem with invalid geometry
2023-03-31 14:10:36 +02:00
Pablo Alba
b33e469501 🎉 Copy paste components, even to another page 2023-03-31 14:04:06 +02:00
Alejandro
cc469b116d Merge pull request #3093 from penpot/alotor-bugfixing-14
Alotor bugfixing 14
2023-03-31 13:56:25 +02:00
Andrey Antukh
9fe49b5546 🐛 Fix unexpected responste truncation related to shared links
that contains old data that is not used but can be still present
on the table; we should consider right now to proceed to delete
the row completly
2023-03-31 12:48:24 +02:00
Andrey Antukh
0c89b7cdb1 🐛 Fix some issues on read-only database connection 2023-03-31 12:48:24 +02:00
Andrey Antukh
90d48c1d30 Add the ability to check read-only state of connection
on the db ns helper; previously it only worked with datasource
instances
2023-03-31 12:48:24 +02:00
alonso.torres
2792c22ec9 🐛 Fix problem with overlays positioning 2023-03-31 12:22:16 +02:00
alonso.torres
745cf1c79d 🐛 Fix problem with invalid geometry 2023-03-31 12:05:59 +02:00
alonso.torres
a838dac01b 🐛 Fix problem when calculating group bounds 2023-03-31 11:20:42 +02:00
Alejandro Alonso
d5bbc7b1aa 🐛 Fix hide grid keyboard shortcut 2023-03-31 09:57:24 +02:00
Alejandro
e1e6816544 Merge pull request #3089 from penpot/alotor-bugfixing-13
Alotor bugfixing 13
2023-03-31 08:49:46 +02:00
alonso.torres
64c0273554 🐛 Fix problem when reorder layers removes show in viewer 2023-03-30 16:30:21 +02:00
alonso.torres
532caea169 🐛 Fix relative position overlay positioning 2023-03-30 16:20:37 +02:00
alonso.torres
0c8d8d92ba 🐛 Fix precision for wrap in flex 2023-03-30 16:20:36 +02:00
Alejandro Alonso
af428ab0ae 🐛 Fix view mode header buttons overlapping in small resolutions 2023-03-30 16:16:24 +02:00
Alejandro Alonso
85b3605c33 🐛 Fix dashboard scrolling using 'Page Up' and 'Page Down' 2023-03-30 16:16:24 +02:00
Alejandro
f1431b7b77 Merge pull request #3086 from penpot/release-info-1.18
Add new onboarding slides 1.18 info
2023-03-30 14:37:38 +02:00
elhombretecla
1ea1d53971 Add new 1.18 info 2023-03-30 14:35:10 +02:00
Alejandro Alonso
8bf01858bb 🐛 Fix alt+P combination while left bar buttons focused 2023-03-29 16:26:34 +02:00
Alejandro Alonso
f05f527336 🐛 Fix allow change team image for editor role users 2023-03-29 16:26:34 +02:00
Alejandro Alonso
fa4c7a1eb7 🐛 Fix last update project timer update after creating new file 2023-03-29 16:26:34 +02:00
Alejandro Alonso
3e6b3bcdc4 🐛 Fix unpublish and delete shared library warning messages 2023-03-29 16:26:34 +02:00
Alejandro
aca242046e Merge pull request #3082 from penpot/alotor-bugfixing-12
🐛 Fix problem with invalid SVG shape
2023-03-29 16:05:57 +02:00
alonso.torres
be27ce4914 🐛 Fix problem with invalid SVG shape 2023-03-29 16:00:07 +02:00
Andrés Moya
e8d49fae13 Allow to cancel and resume later remove graphics 2023-03-29 12:57:21 +02:00
Alejandro
190b77ff95 Merge pull request #3080 from penpot/alotor-bugfixing-11
🐛 Fix problem with SVG and flex layout
2023-03-29 11:47:09 +02:00
alonso.torres
6e78745ed5 🐛 Fix problem with SVG and flex layout 2023-03-29 11:22:26 +02:00
Alejandro
f03def32fd Merge pull request #3078 from penpot/alotor-bugfixing-10
Alotor bugfixing 10
2023-03-29 09:32:18 +02:00
alonso.torres
a98ae69a03 🐛 Disable empty names on rename files 2023-03-29 09:18:22 +02:00
alonso.torres
43fe2390c8 🐛 Fix problem with copy/paste shapes 2023-03-29 09:12:03 +02:00
alonso.torres
d54e152a3d 🐛 Fix problem creating files in project page 2023-03-29 09:12:03 +02:00
alonso.torres
ac23c7bb4a 🐛 Remove "show in view mode" flag when moving frame to frame 2023-03-29 09:12:03 +02:00
alonso.torres
66444e27b1 🐛 Fix problem with selection colors and texts 2023-03-29 09:12:03 +02:00
Alejandro Alonso
92baf75ccd 🐛 Fix import typo 2023-03-29 08:53:10 +02:00
Alejandro Alonso
0714dc34c5 🐛 Fix spelling mistake in confirmation after importing only 1 file 2023-03-28 17:25:44 +02:00
Alejandro Alonso
aa068c70c2 🐛 Fix expanded typography on assets sidebar is moving 2023-03-28 17:25:44 +02:00
Alejandro Alonso
70974efc74 🐛 Fix dashboard left sidebar, the [x] overlaps the field 2023-03-28 17:25:44 +02:00
Alejandro Alonso
acccba6ed4 🐛 Fix invalid files amount after moving on dashboard 2023-03-28 17:25:44 +02:00
Alejandro Alonso
2e549b164f 🐛 Fix internal error on imported svgs 2023-03-28 17:25:44 +02:00
Alejandro Alonso
3df2b80427 🐛 Fix rename option is absent in RMB menu for file 2023-03-28 17:25:44 +02:00
Alejandro Alonso
0ec89e8bbe 🐛 Fix enter emails on onboarding new user creating team 2023-03-28 17:25:44 +02:00
Alejandro Alonso
694497803b 🐛 Fix don't show invite user hero to users with editor role 2023-03-28 17:25:44 +02:00
Pablo Alba
b73ce14560 Merge pull request #2967 from penpot/hiru-refactor-instances
🔧 Read component shapes from pages
2023-03-28 12:00:10 +02:00
Alejandro
88db456127 Merge pull request #3075 from penpot/alotor-bugfixes-9
Alotor bugfixes 9
2023-03-28 09:08:45 +02:00
alonso.torres
6832b4a304 🐛 Fix problem with text carring over next line when changing to fixed 2023-03-27 17:06:45 +02:00
alonso.torres
5079582e1f 🐛 Fix problem with round corners scaling 2023-03-27 13:26:24 +02:00
alonso.torres
4313c45870 🐛 Fix sending invitation to existing members 2023-03-27 13:18:52 +02:00
alonso.torres
1f9e7f2ae8 🐛 Fix markdown message 2023-03-27 13:18:52 +02:00
alonso.torres
f7bba745ab 🐛 Changes to the header menu 2023-03-27 13:18:52 +02:00
alonso.torres
391ba77da9 🐛 Fix scaling of texts 2023-03-27 13:18:52 +02:00
alonso.torres
1d7b43ffbc 🐛 Fix problem with outer stroke in texts 2023-03-27 13:18:52 +02:00
alonso.torres
7256759488 🐛 Fix problem with color picker not able to change hue 2023-03-27 13:18:52 +02:00
alonso.torres
f11c782c0f 🐛 Fix problem when copy/pasting shapes 2023-03-27 13:18:52 +02:00
Pablo Alba
26aec7d129 🐛 Fix usiong padding/marging value on updating with shift 2023-03-27 13:18:08 +02:00
Pablo Alba
d61c799846 🐛 Fix padding/gap/margin remain glowing when the shape is deselected and selected again 2023-03-27 13:18:08 +02:00
Pablo Alba
c3c41c5b7d 🐛 Fix rotate board breaks paddings 2023-03-27 13:18:08 +02:00
Pablo Alba
eeb76b1e50 🐛 Fix during scale paddings glow 2023-03-27 13:18:08 +02:00
Pablo Alba
caf462e9b8 🐛 Fix padding prediction does not work with one shape 2023-03-27 13:18:08 +02:00
Pablo Alba
4d70d3b909 🐛 Bad padding gui on nil sizing 2023-03-27 13:18:08 +02:00
Pablo Alba
6a1115ddda 🐛 Fix usiong padding/marging value on updating with shift 2023-03-27 11:55:23 +02:00
Pablo Alba
d3ae53e3ef 🐛 Fix padding/gap/margin remain glowing when the shape is deselected and selected again 2023-03-27 11:55:23 +02:00
Pablo Alba
4774cc4859 🐛 Fix rotate board breaks paddings 2023-03-27 11:55:23 +02:00
Pablo Alba
bc07dad4ae 🐛 Fix during scale paddings glow 2023-03-27 11:55:23 +02:00
Pablo Alba
0f9ad0907e 🐛 Fix padding prediction does not work with one shape 2023-03-27 11:55:23 +02:00
Pablo Alba
300ad15f5a 🐛 Bad padding gui on nil sizing 2023-03-27 11:55:23 +02:00
Andrés Moya
ad786ab95f 🎉 Group component sync changes in a single undo 2023-03-27 10:39:35 +02:00
Andrés Moya
fe898315c3 🐛 Fix absorb libraries 2023-03-27 10:39:35 +02:00
Andrés Moya
96540af2b1 🎉 Instantiate component with duplicate 2023-03-27 10:39:35 +02:00
Pablo Alba
6889440014 🐛 Fix wrong shape-ref on duplicate component 2023-03-27 10:39:35 +02:00
Pablo Alba
e59d106315 🐛 Fix duplicate component in assets generates wrong main copy 2023-03-27 10:39:35 +02:00
Andrés Moya
7391a4086a 🔧 Refactor delete/restore components 2023-03-27 10:39:35 +02:00
Andrés Moya
b91f1959b4 🎉 Update tests 2023-03-27 10:39:35 +02:00
Andrés Moya
0711fa700b 🔧 Read component shapes from pages 2023-03-27 10:39:33 +02:00
Alejandro Alonso
a4dd5fccff 🐛 Fix develop branch after merge 2023-03-24 13:06:16 +01:00
Alejandro Alonso
4fad2ab619 Merge remote-tracking branch 'origin/staging' into develop 2023-03-24 12:33:14 +01:00
Alejandro Alonso
91e81823a5 🐛 Fix deleted files appear in search results 2023-03-24 12:20:00 +01:00
Alejandro Alonso
d0ab0bccb9 🐛 Fix drag and drop files from browser or file explorer under circumstances 2023-03-24 12:20:00 +01:00
Alejandro Alonso
b2b91bfa57 🐛 Fix change email and password for users signed in via social login 2023-03-24 12:20:00 +01:00
Alejandro
fc857aad08 Merge pull request #3068 from penpot/alotor-bugfixes-8
Alotor bugfixes 8
2023-03-24 08:32:38 +01:00
alonso.torres
5874922367 🐛 Fix problem with guides not showing when moving over nested frames 2023-03-23 17:13:04 +01:00
alonso.torres
1657f06a48 🐛 Select children after ungroup action 2023-03-23 16:41:00 +01:00
alonso.torres
2ad9c3cc72 🐛 Forbid empty names for assets 2023-03-23 16:11:23 +01:00
alonso.torres
fae76f6d4e 🐛 Fix problem with geometry of groups 2023-03-23 12:03:25 +01:00
alonso.torres
d0878aa805 🐛 Fix visual problem in select options 2023-03-23 12:03:25 +01:00
alonso.torres
020454e701 🐛 Fix header not showing when exiting fullscreen mode in viewer 2023-03-23 12:03:25 +01:00
alonso.torres
eedb83e863 🐛 Fix problem with text out of borders when changing from auto-width to fixed 2023-03-23 12:03:25 +01:00
alonso.torres
8a6809848e 🐛 Show warning when trying to invite a user that is already in members 2023-03-23 12:03:25 +01:00
Alejandro Alonso
3b2083134e 🐛 Fix multiplayer username sometimes is not displayed correctly 2023-03-23 09:14:58 +01:00
Alejandro Alonso
b5fc074e35 🐛 Fix horizontal margins drag don't always start from place 2023-03-23 09:14:58 +01:00
Alejandro
bc794816db Merge pull request #3066 from penpot/alotor-bugfixes-7
Alotor bugfixes 7
2023-03-22 16:28:19 +01:00
alonso.torres
f1b5ac27a9 🐛 Fix path options not showing when editing rects or ellipses 2023-03-22 14:45:19 +01:00
alonso.torres
ea438d3626 🐛 Add tooltip for text alignment options 2023-03-22 14:25:32 +01:00
alonso.torres
6d93501dc7 🐛 Fix shortcuts for alignment 2023-03-22 14:25:24 +01:00
alonso.torres
09d0a9e3f8 🐛 Fix problem when assigning color from palette or assets 2023-03-22 12:36:40 +01:00
alonso.torres
2fef90e7eb 🐛 Fix problem with selected colors and texts 2023-03-22 11:58:33 +01:00
Alejandro Alonso
c851f60de4 🐛 Fix deleted files appear in search results 2023-03-22 09:47:03 +01:00
Alejandro Alonso
6b4bca50ee bug: Fix manipulate duplicated project 2023-03-22 09:47:03 +01:00
Alejandro Alonso
f05e37590a 🐛 Fix font kerning on export 2023-03-22 09:30:07 +01:00
Alejandro Alonso
fbf06a4de0 Use tabulators to navigate layers 2023-03-22 09:23:06 +01:00
Alejandro
25014a81c3 Merge pull request #3062 from penpot/alotor-bugfixes-6
Bugfixes
2023-03-22 07:29:43 +01:00
Andrés Moya
ce3e30ea02 🐛 Fix linter issues 2023-03-21 17:12:54 +01:00
Andrés Moya
1d026ab085 🎉 Added 'go to main component' to components context menu 2023-03-21 17:12:54 +01:00
alonso.torres
5d77f7e5b1 🐛 Fix linter issues 2023-03-21 17:11:23 +01:00
alonso.torres
131e4f2446 🐛 Fix nested frame interaction created flow in wrong frame 2023-03-21 16:50:59 +01:00
alonso.torres
8ab264af80 🐛 Fix problem in Firefox with scroll jumping when changin pages 2023-03-21 16:43:04 +01:00
Andrey Antukh
60d629a0c6 Merge branch 'connecting-line-height-values-to-variables' into develop 2023-03-19 18:37:56 +01:00
Ondřej Konečný
d337dbfa5d ♻️ Connect line-heigh values to variables and set scale
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-03-19 18:37:40 +01:00
Ally Tiago
e735b9f90e 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-03-18 22:41:11 +01:00
Renan Mayrinck
95fb3dfcd2 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-03-18 22:41:10 +01:00
Andrey Antukh
582ec187f8 Merge remote-tracking branch 'origin/staging' into develop 2023-03-17 10:19:04 +01:00
Alejandro
40ca804d93 Merge pull request #3051 from penpot/niwinz-experiments-2
🐛 Fix many issues related to the concurrency refactor PR
2023-03-17 08:25:31 +01:00
Alejandro
b32e0f458c Merge pull request #3050 from penpot/alotor-fixes-layout
Alotor fixes layout
2023-03-17 08:24:30 +01:00
Alejandro
484a50949a Merge pull request #3049 from penpot/alotor-bugfixes-5
Bugfixes
2023-03-17 08:23:39 +01:00
alonso.torres
a118f34b49 🐛 Add version to presence and fixes off-page updates 2023-03-17 08:23:03 +01:00
Andrey Antukh
2818666a1a 📎 Fix minnor cosmetic issue on instant and duration pretty printing 2023-03-16 22:33:35 +01:00
Andrey Antukh
9143639357 🐛 Fix incorrect webhook url validation 2023-03-16 22:33:35 +01:00
Andrey Antukh
f18d2ea629 🐛 Add missing fragment persistence on creating file
Related with storage/pointer-map feature.
2023-03-16 22:33:35 +01:00
Andrey Antukh
938890c04c 🐛 Fix vthread pining on get-file-data-for-thumbnail rpc method 2023-03-16 22:33:35 +01:00
Andrey Antukh
9173c73eca 🐛 Forward var bindings on climit submit operation 2023-03-16 22:33:35 +01:00
Andrey Antukh
69c8a89dd2 🎉 Add the ability to specify the output format from query string 2023-03-16 22:33:35 +01:00
Andrey Antukh
b462ac019a 🐛 Fix typo on error type 2023-03-16 22:33:35 +01:00
Andrey Antukh
3011d24905 📎 Enable storage features on start-dev and repl scripts 2023-03-16 22:33:35 +01:00
alonso.torres
120d3005ea 🐛 Fix change layer index when moving absolute positioned shape 2023-03-16 17:39:11 +01:00
alonso.torres
2272977d67 🐛 Fix problem when editing gap/margins in layout 2023-03-16 17:11:46 +01:00
alonso.torres
cbe8587db3 🐛 Fix problem with z positioning of elements 2023-03-16 15:08:49 +01:00
alonso.torres
6a4d505033 🐛 Fix problem with alt getting stuck when alt+tab 2023-03-16 15:08:03 +01:00
alonso.torres
bd44f49175 🐛 Fix problem with board titles misplaced 2023-03-15 15:51:30 +01:00
alonso.torres
acdcf82c6c 🐛 Fix filter in layers z-index 2023-03-15 15:48:45 +01:00
Alejandro
afb09919ed Merge pull request #3001 from penpot/niwinz-experiments-2
♻️ Refactor concurrency model (start using JDK19 virtual threads on RPC and WebSockets)
2023-03-15 11:34:25 +01:00
Alejandro Alonso
d685888720 Merge remote-tracking branch 'origin/staging' into develop 2023-03-15 09:44:44 +01:00
Alejandro
bda2468a86 Merge pull request #3046 from penpot/alotor-bugfixes-4
Alotor bugfixes 4
2023-03-15 09:43:48 +01:00
alonso.torres
2dea2d9d27 🐛 Ignore remote changes in size 2023-03-15 09:28:46 +01:00
alonso.torres
107d607d37 🐛 Fix error with empty curves 2023-03-15 09:28:46 +01:00
alonso.torres
2c6513ac85 🐛 Fix problems with touch devices and Wacom tablets 2023-03-15 09:28:46 +01:00
Pablo Alba
8ae1148ef9 🎉 Go to main component from context menu or with double click on the asset 2023-03-14 17:15:53 +01:00
alonso.torres
5bd4be1950 🐛 No select frames without fill should happen only on ctrl click 2023-03-14 15:42:46 +01:00
alonso.torres
dad88cb42e 🐛 Fix close colorpicker on Firefox when mouse-up is outside the picker 2023-03-14 15:42:45 +01:00
Alejandro
b6e01077ed Merge pull request #3044 from penpot/azazeln28-improve-rotate-matrix
Improve rotate matrix
2023-03-14 13:42:31 +01:00
Aitor
538a05b359 improve rotate matrix 2023-03-14 13:05:52 +01:00
Alejandro
1b3281457e Merge pull request #3042 from penpot/azazeln28-fix-scaling-frame-proportionally
Fix scaling frame proportionally
2023-03-14 12:33:04 +01:00
Andrey Antukh
c9ec5234d3 ♻️ Refactor local in-memory cache api 2023-03-14 12:30:27 +01:00
Andrey Antukh
76b931108e Increase strenght of password hashing algorithm
And enable password update mechanism on login
2023-03-14 12:30:27 +01:00
Andrey Antukh
84dc3c8fd9 🔥 Remove debugging prn 2023-03-14 12:30:27 +01:00
Andrey Antukh
2cddc49463 Remove several reflection calls 2023-03-14 12:30:27 +01:00
Andrey Antukh
91b5a0afdd Add missing type hints on matrix type functions 2023-03-14 12:30:27 +01:00
Andrey Antukh
dfdc9c9fa5 ♻️ Refactor storage internal concurrency model 2023-03-14 12:30:27 +01:00
Andrey Antukh
aafbf6bc15 ♻️ Refactor cocurrency model on backend
Mainly the followin changes:

- Pass majority of code to the old and plain synchronous style
  and start using virtual threads for the RPC (and partially some
  HTTP server middlewares).
- Make some improvements on how CLIMIT is handled, simplifying code
- Improve considerably performance reducing the reflection and
  unnecesary funcion calls on the whole stack-trace of an RPC call.
- Improve efficiency reducing considerably the total threads number.
2023-03-14 12:30:27 +01:00
Andrey Antukh
2e717882f1 ♻️ Refactor websockets impl to use virtual threads
Removing the use of core.async code and implement code using
plain old and familiar synchronous code
2023-03-14 12:30:27 +01:00
Andrey Antukh
14b53a4d5e Don't log duplicate traceback 2023-03-14 12:30:27 +01:00
Andrey Antukh
04b321caae Add several improvements to internal worker impl
Mainly for make the cron jobs do not block the scheduled executor
and offload all work to a separate threads
2023-03-14 12:30:27 +01:00
Andrey Antukh
cad1851e95 🔥 Replace own scheduled executor with the one defined in promesa lib 2023-03-14 12:30:27 +01:00
Andrey Antukh
012ead65b5 🎉 Add missing ::us/atom global spec 2023-03-14 12:30:27 +01:00
Andrey Antukh
d549fcb2ae 🐛 Pass a valid executor instance to yetti http server 2023-03-14 12:30:27 +01:00
Andrey Antukh
4c85e55176 📎 Improve tests performance making all tables as unlogged 2023-03-14 12:30:27 +01:00
Andrey Antukh
1eb593703f 📎 Update clj-kondo config 2023-03-14 12:30:27 +01:00
Andrey Antukh
771fc1788c 📎 Update backend repl script 2023-03-14 12:30:27 +01:00
Andrey Antukh
ae9886080e 📎 Add better database configuration for devenv 2023-03-14 12:30:27 +01:00
Andrey Antukh
d76baa3266 ⬆️ Update promesa dependency
And adapt all code for breaking changes
2023-03-14 12:30:27 +01:00
Alejandro
37b20571d2 Merge pull request #3041 from penpot/azazeln28-improve-scale-matrix
Improve scale matrix
2023-03-14 12:27:32 +01:00
Alejandro
4661fb26dc Merge pull request #3039 from penpot/alotor-fix-text-sync
Fix text sync problems
2023-03-14 12:22:14 +01:00
Eva
adffdb31f3 Add css variables and theme switch 2023-03-14 11:48:31 +01:00
Aitor
b9559d99da Improve scale matrix computation 2023-03-14 11:24:15 +01:00
alonso.torres
aa4a3ef940 🐛 Fix apply structure modifiers to children 2023-03-14 11:02:11 +01:00
alonso.torres
3a2e1b5c94 Adapt scale to flex elements 2023-03-14 11:02:10 +01:00
Aitor
44c35e6aee 🐛 Fix scaling frame proportionally 2023-03-14 11:01:57 +01:00
alonso.torres
a56dc25fae 🐛 Fix problems with text synchronization 2023-03-13 13:15:36 +01:00
Pablo Alba
4eeef41ed4 🐛 Fix flex layout gaps showing for nested items 2023-03-13 11:52:00 +01:00
Alejandro Alonso
b77f85b697 📎 Prepare new development cycle 2023-03-13 10:39:58 +01:00
Alejandro Alonso
9cd207595f 📎 Prepare new development cycle 2023-03-13 10:37:34 +01:00
Alejandro
c21e0739f2 Merge pull request #3037 from penpot/alotor-bugfixes-3
Bug fixes
2023-03-13 10:34:35 +01:00
alonso.torres
83367dd519 🐛 Fix viewer layers styles 2023-03-13 10:30:12 +01:00
alonso.torres
0d9695de1d 🐛 Fix shortcuts for zoom now take into account the mouse position 2023-03-13 10:30:12 +01:00
alonso.torres
468e61e1e0 🐛 Fix snap pixel when moving path points on high zoom 2023-03-13 10:30:12 +01:00
alonso.torres
481e9b0d32 🐛 Fix unlink library color when blur color picker input 2023-03-13 10:30:12 +01:00
alonso.torres
ce85a1b1d5 🐛 Fix problem with text editor in Safari 2023-03-13 10:22:57 +01:00
Alejandro Alonso
da74d0d732 🐛 Fix viewer wrong translations 2023-03-13 10:21:53 +01:00
Pablo Alba
e6306e5109 Add visualization and mouse control to paddings, margins and gaps in frames with layout 2023-03-10 13:59:50 +01:00
Alejandro
5fae9526d6 Merge pull request #3028 from penpot/alotor-bugfixes-fixes
Fixes after QA revision
2023-03-09 17:39:23 +01:00
alonso.torres
37f52cafc9 🐛 Fix problem with rules when changing pages 2023-03-09 17:28:21 +01:00
alonso.torres
2a632512b3 🐛 Fix select in area of hidden children elements 2023-03-09 16:15:11 +01:00
alonso.torres
079cff0bc0 🐛 Fix problem with undo transactions 2023-03-09 15:53:10 +01:00
Alejandro
7954ad0edf Merge pull request #3025 from penpot/alotor-bugfixes2
Bug fixes
2023-03-09 13:21:32 +01:00
alonso.torres
2500d192e8 🐛 Changed the text dominant-baseline to use ideographic 2023-03-09 10:57:49 +01:00
Pablo Alba
480a72b6e2 🐛 Fix paddings and gaps prediction on create layout 2023-03-09 09:25:10 +01:00
alonso.torres
b2c3dc1504 🐛 Fix problem when loading fonts 2023-03-08 15:22:31 +01:00
alonso.torres
e170011e3c 🐛 Fix problem on selection numeric inputs on Firefox 2023-03-08 15:22:31 +01:00
alonso.torres
f3f611848c 🐛 Improve deeps selection of nested arboards 2023-03-08 15:22:31 +01:00
Alejandro Alonso
c3ce0eb794 Merge remote-tracking branch 'origin/staging' into develop 2023-03-08 07:25:19 +01:00
alonso.torres
1643287775 🐛 Fix problem with area selection 2023-03-07 15:55:39 +01:00
Alejandro Alonso
9e35229ebd 🐛 Fix components texts not displayed in assets panel 2023-03-07 15:22:24 +01:00
alonso.torres
046bd59726 🐛 Fix style for absolute positioning 2023-03-07 14:16:42 +01:00
Alejandro
e8027d3316 Merge pull request #3010 from penpot/niwinz-docker-frontend-2
🐳 Add backend and exporter uri env vars to frontend docker image
2023-03-07 13:08:59 +01:00
Andrey Antukh
ad34ebff89 🐳 Add backend and exporter uri env vars to frontend docker image 2023-03-07 13:08:38 +01:00
Alvaro Araoz
0ead390ef4 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-03-07 12:37:50 +01:00
Pablo Hinojosa
aefa73a06f 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-03-07 12:37:50 +01:00
Alejandro Alonso
f733497f0f 🐛 Fix some typos on english translation 2023-03-07 10:57:37 +01:00
Alejandro Alonso
ed917fa194 🐛 Fix font translations not detected as markdown 2023-03-07 10:57:37 +01:00
Alejandro Alonso
313df74202 🐛 Fix handle correctly slashes in emails 2023-03-07 10:51:31 +01:00
Alejandro
db7c234053 Merge pull request #3019 from penpot/alotor-bugfixes
Alotor bugfixes
2023-03-07 10:49:57 +01:00
Alejandro Alonso
91c12ca34f 🐛 Fix change colors from selected colors 2023-03-07 10:42:58 +01:00
Alejandro Alonso
9f66e8e5d1 🐛 Fix search field shared styles 2023-03-07 10:37:11 +01:00
alonso.torres
b5be938480 🐛 Improve behavior for undo on text edition 2023-03-07 09:11:51 +01:00
alonso.torres
36583d1171 🐛 Allow selection of empty board by partial rect 2023-03-06 16:27:50 +01:00
alonso.torres
05e13ad05f 🐛 Fix problem when undoing multiple selected colors 2023-03-06 16:27:50 +01:00
alonso.torres
475ce08d3e 🐛 Fix selecting children from hidden parent layers 2023-03-06 16:27:50 +01:00
alonso.torres
6962e15b6d 🐛 Fix error streen when uploading wrong SVG 2023-03-06 16:27:50 +01:00
alonso.torres
7b72906096 🐛 Fix problem on finalize page 2023-03-06 16:27:13 +01:00
Eva Marco
9d43bb4252 Merge pull request #3011 from penpot/alotor-poc-css-modules
 Adds CSS modules to the build pipeline
2023-03-06 15:59:13 +01:00
alonso.torres
7dd24bb79b Merge remote-tracking branch 'origin/staging' into develop 2023-03-06 14:52:43 +01:00
Alejandro
82e402c271 Merge pull request #3012 from penpot/alotor-bug-redo
🐛 Fix problem with redo shortcut
2023-03-06 14:37:28 +01:00
alonso.torres
827ce6c42a 🐛 Fix problem with redo shortcut 2023-03-06 14:23:26 +01:00
alonso.torres
94a98a1866 Adds CSS modules to the build pipeline 2023-03-06 14:20:18 +01:00
Alejandro
0e585cd585 Merge pull request #3002 from penpot/alotor-fixes-rules
🐛 Fix problem with rules position on changing pages
2023-03-06 09:56:50 +01:00
alonso.torres
cd505ecced 🐛 Fix problem with rules position on changing pages 2023-03-03 14:20:53 +01:00
Alejandro
c8360b1994 Merge pull request #2996 from penpot/alotor-grid-layout
Partial merge of the grid layout infrastructure
2023-03-03 11:15:32 +01:00
alonso.torres
a12baf684c Review fixes 2023-03-03 10:53:46 +01:00
Alejandro Alonso
910352280c Merge remote-tracking branch 'origin/staging' into develop 2023-03-03 10:36:29 +01:00
Alejandro Alonso
dec854a012 🐛 Fix full screen not clickable on inspect mode after user entered full screen 2023-03-03 10:31:04 +01:00
Alejandro
03d4e97ad7 Merge pull request #2997 from penpot/alotor-fix-shadow-multi-selection
🐛 Fix problem withs shadows and blur on multiple selection
2023-03-02 16:35:24 +01:00
alonso.torres
e061ba8123 🐛 Fix problem with shadows and blur on multiple selection 2023-03-02 16:32:21 +01:00
alonso.torres
23104b28b6 Edition mode for grid 2023-03-02 14:05:51 +01:00
alonso.torres
b497de0dae UI Integration 2023-03-02 13:56:11 +01:00
Eva
284fc2acbc Add grid cell options 2023-03-02 13:56:11 +01:00
Eva
cc8347a871 Add options to sidebar 2023-03-02 13:56:11 +01:00
alonso.torres
eb425dc4f2 Edit cell panel 2023-03-02 13:56:11 +01:00
alonso.torres
4b7e93ab84 First draft of cell display 2023-03-02 13:56:11 +01:00
alonso.torres
6f99209a62 Grid layout editor interface 2023-03-02 13:51:41 +01:00
alonso.torres
a0cd94cfae Grid layout infrastructure 2023-03-02 13:51:27 +01:00
alonso.torres
2030f987db Performance improvements 2023-03-01 16:38:09 +01:00
Alejandro Alonso
94e87f8a7d Merge remote-tracking branch 'origin/staging' into develop 2023-03-01 16:08:57 +01:00
Alejandro Alonso
9a272f69c7 🐛 Fix height 100% cropped 2023-03-01 14:19:48 +01:00
Alejandro Alonso
fc1f2b2a9f 🐛 Fix some layout tooltips cropped 2023-03-01 14:19:48 +01:00
Alejandro Alonso
89fbe28ed1 🐛 Fix wrap and nowrap spelling issues 2023-03-01 14:19:48 +01:00
Alejandro Alonso
216d101e56 🐛 Fix flex layout min height bigger than board when height is 100% 2023-03-01 14:19:48 +01:00
Aitor
e57262136c Scale content now scales strokes, shadows, blur and corners 2023-03-01 14:11:03 +01:00
Alejandro
0b9bef066b Merge pull request #2989 from penpot/alotor-fix-position-absolute-auto
Fix position absolute auto
2023-03-01 08:38:43 +01:00
alonso.torres
4111cee3d6 🐛 Fix clipping overlay 2023-02-28 15:22:04 +01:00
alonso.torres
0ef5a37e33 🐛 Allow set position when position absolute 2023-02-28 15:22:04 +01:00
alonso.torres
8b5a36a49f 🐛 Fix problem with auto layout an absolute positioning 2023-02-28 15:22:04 +01:00
Eva
c6d1f80af2 🐛 Fix toggle collapse layer icon 2023-02-28 13:09:43 +01:00
Alejandro Alonso
b73b40b23c Merge remote-tracking branch 'origin/staging' into develop 2023-02-28 10:53:09 +01:00
Alejandro Alonso
ccf91a129c 🐛 Fix custom fonts not rendered correctly 2023-02-28 10:43:59 +01:00
Alejandro
1f3f6ce1e9 Merge pull request #2980 from penpot/eva-fix-paste-nested-boards
🐛 Fix copy paste a very nested boards inside itself
2023-02-28 09:51:21 +01:00
Eva
8f2e3d5fe4 🐛 Fix copy paste a very nested boards inside itself 2023-02-28 09:51:12 +01:00
Alejandro
b581752bd5 Merge pull request #2981 from penpot/alotor-small-fixes-flex
🐛 Fix problem when moving absolute positioned element
2023-02-28 09:46:06 +01:00
Alejandro
47481986a1 Merge pull request #2987 from penpot/alotor-fix-layout-from-selected
🐛 Fix problem when creating layout from selection
2023-02-28 09:40:18 +01:00
alonso.torres
9af0e6ca44 🐛 Fix problem when creating layout from selection 2023-02-27 16:43:59 +01:00
Alejandro Alonso
9c419ef114 Merge remote-tracking branch 'origin/staging' into develop 2023-02-27 10:39:11 +01:00
Alejandro Alonso
24fa4f71ad 📎 Update version.txt file 2023-02-27 10:37:39 +01:00
Andrey Antukh
fa21dc4cf9 📎 Fix tests 2023-02-25 10:35:00 +01:00
Andrey Antukh
9b5a321a62 📎 Fix tests 2023-02-25 10:24:41 +01:00
Andrey Antukh
738cf6407c 📎 Fix liner issue 2023-02-25 10:24:22 +01:00
Andrey Antukh
1d21ee7089 Merge remote-tracking branch 'origin/staging' into develop 2023-02-24 18:30:05 +01:00
Alejandro
2460f36bab Merge pull request #2983 from penpot/niwinz-invitations-fixes
Fix issues with invitation user flow
2023-02-24 15:50:40 +01:00
Andrey Antukh
4d627f8993 🐛 Fix incorrect invitation flow 2023-02-24 15:44:29 +01:00
Andrey Antukh
7771467aa0 🐛 Fix missing member-id field on invitation copy-link 2023-02-24 15:41:15 +01:00
Andrey Antukh
01b361fd3c Fix minor issue on contributing.md rendering output 2023-02-24 14:58:56 +01:00
alonso.torres
4d46460f90 🐛 Fix problem when moving absolute positioned element 2023-02-24 14:26:33 +01:00
alonso.torres
e9942e5527 🐛 Fix position absolute showing on first-level flex containers 2023-02-24 13:18:21 +01:00
Alejandro
8aa0e96377 Merge pull request #2979 from penpot/alotor-small-fixes-absolute
🐛 Fix problems with position absolute
2023-02-24 12:05:56 +01:00
alonso.torres
a12fce1c1f Change names for flex items 2023-02-24 11:24:23 +01:00
alonso.torres
e9d50eb10d 🐛 Fix problems with position absolute 2023-02-24 10:57:56 +01:00
Alejandro
0e97182ef0 Merge pull request #2977 from penpot/niwinz-invitations-1
 Add proper audit log for invitations
2023-02-24 10:57:13 +01:00
Andrey Antukh
f0c0e5e43a Add proper audit log for invitations 2023-02-24 10:28:07 +01:00
Alejandro
8c618f95f7 Merge pull request #2976 from penpot/alotor-flex-position-absolute
Flex position absolute & z-index
2023-02-24 07:42:43 +01:00
alonso.torres
d309628e1d Add z-index option to flex items elements 2023-02-24 07:37:37 +01:00
alonso.torres
f3f1dbc2d1 Allow for absolute positioned elements inside layout 2023-02-24 07:37:35 +01:00
alonso.torres
664f73b8a5 🐛 Fix problem when converting an empty frame to layout 2023-02-24 07:37:11 +01:00
Alejandro
94f2681223 Merge pull request #2970 from penpot/palba-layout-padding-display
 Add visualization and mouse control to paddings in frames with layout
2023-02-24 07:32:48 +01:00
Eva
a182ca3ab7 🚑 Fix CI 2023-02-23 11:03:54 +01:00
Ondřej Konečný
be865af1fc ♻️ connect values with variables in CSS and remove unused code
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-02-23 10:58:27 +01:00
Prithvi Tharun
c6ad8ee110 Improves tooltip content for Corner and Padding options (#2971)
Improves tooltip content for Corner and Padding options

Closes #2964

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-02-23 10:41:43 +01:00
Alex Howell
b814a8821c 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-02-22 19:37:28 +01:00
Pablo Alba
4d90d36225 Add visualization and mouse control to paddings in frames with layout 2023-02-22 17:19:29 +01:00
Alejandro
fd673b39a4 Merge pull request #2959 from penpot/azazeln28-visual-feedback-scale-k
 add visual feedback to scale text
2023-02-22 12:39:19 +01:00
Aitor
1758b34eed add visual feedback to scale text 2023-02-22 12:38:55 +01:00
Alejandro Alonso
16bd5e2ebc Merge remote-tracking branch 'origin/staging' into develop 2023-02-22 11:48:41 +01:00
Alejandro
475b6ff6e0 Merge pull request #2969 from penpot/alotor-fix-redo-curve-tool
🐛 Fix problem with redo curve drawings
2023-02-22 11:25:40 +01:00
alonso.torres
a1f41c80a2 🐛 Fix problem with redo curve drawings 2023-02-22 10:43:51 +01:00
Eva Marco
4297b6fda8 Merge pull request #2968 from penpot/alotor-bug-width-fill
🐛 Fix problem with align center and width 100%
2023-02-21 16:25:08 +01:00
Eva
c892411484 📎 Update changes file 2023-02-21 15:56:23 +01:00
alonso.torres
28dce3cc8b 🐛 Fix problem with align center and width 100% 2023-02-21 15:44:13 +01:00
Locness
9dead29ac3 🌐 Add translations for: French.
Currently translated at 85.6% (1014 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-02-20 22:39:47 +01:00
Aitor
96ce475206 Merge pull request #2952 from penpot/eva-ally-context-3
Add new accessibility functionality to the dashboard
2023-02-20 13:30:42 +01:00
Andrey Antukh
788dc9b3f8 Merge branch 'staging' into develop 2023-02-20 13:29:03 +01:00
Andrey Antukh
3c650ae47e Merge branch 'main' into staging 2023-02-20 13:28:51 +01:00
Andrey Antukh
80af0bb148 Merge branch 'main' into develop 2023-02-20 13:28:01 +01:00
Eva
fcb8b15ef2 Add new accessibility functionalities to dashboard 2023-02-17 15:17:24 +01:00
Alejandro
1806200613 Merge pull request #2947 from penpot/alotor-performance-improvement
 Performance improvement
2023-02-16 09:38:05 +01:00
alonso.torres
ed22e2c6d1 Performance improvement 2023-02-15 15:17:50 +01:00
Alejandro
0487539b23 Merge pull request #2946 from penpot/alotor-bug-new-frame
🐛 Fix problem with new frame inside layout
2023-02-15 13:48:57 +01:00
Alejandro
9e190d9810 Merge pull request #2945 from penpot/palba-layout-predictive-gap2
 Adds paddings and gaps prediction on layout creation
2023-02-15 13:43:01 +01:00
alonso.torres
fd15ff940f 🐛 Fix problem with new frame inside layout 2023-02-15 13:38:03 +01:00
Pablo Alba
85a47e36b5 Adds paddings and gaps prediction on layout creation 2023-02-15 12:42:23 +01:00
Alejandro
ece6193260 Merge pull request #2939 from penpot/palba-fix-undo-duplicate-with-alt
Fix duplicate with alt and undo only undo one step
2023-02-15 12:21:00 +01:00
Pablo Alba
813a188e24 🐛 Fix duplicate with alt and undo only undo one step 2023-02-15 12:20:47 +01:00
Alejandro
0f07def536 Merge pull request #2940 from penpot/alotor-layout-improvements
 Add space-evenly option
2023-02-15 12:08:36 +01:00
alonso.torres
490f5f19f1 Add space-evenly option 2023-02-15 12:08:22 +01:00
Alejandro
b3216000fd Merge pull request #2941 from penpot/alotor-fix-frame-opacity
🐛 Fix problem with opacity in frames
2023-02-15 11:57:10 +01:00
Alejandro
2ef3e4b325 Merge pull request #2944 from penpot/alotor-fix-unhandled-error
🐛 Fix crash when resizing frame
2023-02-15 11:49:17 +01:00
alonso.torres
70edd2c290 🐛 Fix crash when resizing frame 2023-02-15 09:59:28 +01:00
alonso.torres
02543b1a4f 🐛 Fix problem with opacity in frames 2023-02-14 17:54:51 +01:00
Alex Howell
0dac87f2bc 🌐 Add translations for: Romanian.
Currently translated at 98.6% (1168 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-02-13 20:36:42 +01:00
Alejandro
4852882c28 Merge pull request #2938 from penpot/alotor-fix-size-auto-center-align
🐛 Fix problem with align center and size auto
2023-02-13 16:58:15 +01:00
Alejandro
094556926e Merge pull request #2932 from penpot/eva-change-onboarding-images
💄 Update onboarding images with new style
2023-02-13 16:54:23 +01:00
alonso.torres
f3c5aed5d0 🐛 Fix problem with align center and size auto 2023-02-13 16:47:28 +01:00
Renan Castro
e4b17bdbcf 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-12 03:37:37 +01:00
Andrey Antukh
c0eb20d31d 🐛 Add missing require on rpc ns 2023-02-11 00:59:08 +01:00
Andrey Antukh
f23d29deb7 🐛 Fix unexpected exception on logger caused by log4j2 plugin 2023-02-11 00:52:23 +01:00
Vin
28b0a8f7d7 🌐 Add translations for: Russian.
Currently translated at 64.3% (762 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-02-10 22:35:42 +01:00
alonso.torres
cdd268afbc Merge remote-tracking branch 'origin/staging' into develop 2023-02-10 15:06:23 +01:00
Andrey Antukh
1ed3b3cf75 📎 Add missing restart policy to some containers
on default compose file
2023-02-10 14:07:12 +01:00
Eva
1637e82018 💄 Update onboarding images with new style 2023-02-10 13:52:53 +01:00
Andrey Antukh
c467d04d50 🐛 Fix permission issue on docker images 2023-02-10 13:37:33 +01:00
Andrey Antukh
8d19c067e8 🐛 Fix incorrect mountpoint on docker compose 2023-02-10 13:23:22 +01:00
Alejandro
a99fb7ada3 Merge pull request #2922 from penpot/palba-fix-middle-button-drags-guides
🐛 Fix middle button panning can drag guides
2023-02-09 14:27:28 +01:00
Alejandro
2f1d1a6c41 Merge pull request #2921 from penpot/eva-fix-invite-members-btn
🐛 Fix invite members text on modal button
2023-02-09 14:23:40 +01:00
Eva
7f963edf9e 🐛 Fix invite members text on modal button 2023-02-09 13:51:43 +01:00
Eva Marco
9c99d86e08 Merge pull request #2927 from penpot/alotor-fix-auto-size
Fix auto size
2023-02-09 13:51:03 +01:00
Eva
6a5bfdd7fb ❤️ Add thanks for ondrejkonec 2023-02-09 13:36:26 +01:00
Ondřej Konečný
a98ba72c12 added width property to avoid shrinking on icons 2023-02-09 13:33:06 +01:00
Eva Marco
b2b224e5a7 Merge pull request #2923 from ondrejkonec/BUG-fix-icon-resizing-on-small-displays
🐛 Add min-width property to avoid shrinking on icons
2023-02-09 13:17:34 +01:00
alonso.torres
ee42dd8b01 🐛 Fix layout on multiple selection 2023-02-09 11:18:37 +01:00
alonso.torres
da209b7507 🐛 Fix problem with auto sizes 2023-02-09 10:41:18 +01:00
Pablo Alba
d49e1f1641 🐛 Fix middle button panning can drag guides 2023-02-09 08:53:42 +01:00
Stas Haas
f9c964b65e 🌐 Add translations for: German.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-08 15:36:48 +01:00
Ondřej Konečný
4b9d6fc794 added width property to avoid shrinking on icons 2023-02-08 12:16:34 +01:00
Pablo Alba
8e35ad0f7f Merge pull request #2896 from penpot/eva-bugfixing-6
🐛 Fix paste a frame inside itself
2023-02-08 12:16:09 +01:00
Eva
be3a973d09 🐛 Fix paste a frame inside itself 2023-02-08 12:01:11 +01:00
Pablo Alba
c3c6e533e3 Merge pull request #2903 from ondrejkonec/a11y-udpate-change-hover-color-for-zoom-widget-button
 Added darker color for hover button in zoom widget to improve a11y
2023-02-08 11:40:38 +01:00
Pablo Alba
af30df58dc Merge pull request #2902 from glippi/drop-shadow-negative-spread
 Allow negative values for shadow spread
2023-02-08 11:31:23 +01:00
Andrey Antukh
78aea0f24e 🐛 Fix incorrect props cleaning on auditlog 2023-02-08 10:35:57 +01:00
Alejandro
3587362c4a Merge pull request #2909 from penpot/niwinz-refactor-remove-legacy
🔥 Remove legacy code and internal refactor of storage module
2023-02-08 10:34:18 +01:00
Andrey Antukh
06a30316c2 🐛 Fix logging initialization on exporter 2023-02-07 19:10:57 +01:00
Andrey Antukh
8161d3ae09 🐛 Fix incorrect props cleaning on auditlog 2023-02-07 18:38:54 +01:00
Andrey Antukh
ea470068bb ⬆️ Update jdk and postgresql-client on devenv 2023-02-07 18:17:36 +01:00
Andrey Antukh
e3378181ee 📎 Update docker log4j config 2023-02-07 18:17:08 +01:00
Andrey Antukh
9162f0e1fd 🐛 Fix auth flag handling on rpc metadata 2023-02-07 18:16:55 +01:00
Andrey Antukh
69556f19ac Add more logging to OIDC providers 2023-02-07 18:16:55 +01:00
Andrey Antukh
ab3b9cba45 ♻️ Refactor storage and assets related modules
- improve internal error handling
- add more specs and more asserts
2023-02-07 18:16:55 +01:00
Andrey Antukh
4b4f78b4cc Add minor change to srepl module options
Replace unqualified attrs with fully qualified
2023-02-07 18:16:55 +01:00
Andrey Antukh
0c48f76911 Add better spec validation on http module 2023-02-07 18:16:55 +01:00
Andrey Antukh
3cf4a3facc Improve db/pool initialization and reusability 2023-02-07 18:16:55 +01:00
Andrey Antukh
41d34de9e1 🔥 Remove zmq mentions on devenv log4j config 2023-02-07 18:16:55 +01:00
Andrey Antukh
dfdebc35c8 💄 Improve readability on error report templates 2023-02-07 18:16:55 +01:00
Andrey Antukh
bd2745d1fe ♻️ Clean email related namespaces
- Remove legacy and outdated mjml directory
- Rename namespace to a proper name
- Add more specs
2023-02-07 18:16:55 +01:00
Andrey Antukh
64f2d874fe Merge remote-tracking branch 'origin/staging' into develop 2023-02-07 18:16:37 +01:00
Andrey Antukh
6e1ce62aad Merge branch 'staging' 2023-02-07 17:06:42 +01:00
Alejandro
070ea135e5 Merge pull request #2919 from penpot/niwinz-docker-oidc-fixes
🐛 Docker & OIDC fixes
2023-02-07 16:56:22 +01:00
Andrey Antukh
5ae1fe5867 📎 Add nano editor to backend docker image 2023-02-07 16:50:58 +01:00
Andrey Antukh
eef2cba976 🐛 Fix incorrect registration flag handling on frontend
registration flag should not prevent include register on the
router because a registration process can be started from oidc
auth process
2023-02-07 16:50:52 +01:00
Andrey Antukh
1c4dcf1574 Add minor improvements to logging on docker images 2023-02-07 15:06:35 +01:00
Andrey Antukh
220b80799d Add more logging to OIDC providers 2023-02-07 14:49:12 +01:00
Andrey Antukh
58668c11f3 Merge remote-tracking branch 'origin/staging' into develop 2023-02-07 14:46:18 +01:00
elhombretecla
bab1a417df Update README.md 2023-02-07 11:55:32 +01:00
elhombretecla
b16718bfe4 Update README.md 2023-02-07 11:54:48 +01:00
elhombretecla
8f58bb4f2c Update README.md 2023-02-07 11:51:16 +01:00
elhombretecla
9cdb25344b Update README.md 2023-02-07 11:49:45 +01:00
Alejandro Alonso
22b6d4241d 📎 Update version.txt file 2023-02-07 11:47:50 +01:00
elhombretecla
96ce631784 review readme 2023-02-07 11:32:59 +01:00
Alejandro
fa02df7106 Merge pull request #2914 from penpot/alotor-small-fixes
Small fixes
2023-02-07 11:23:54 +01:00
Andrey Antukh
5d6462b2a7 🐛 Fix compatibility issues on docker upgrade path 2023-02-07 11:19:46 +01:00
Alejandro
3464842c1e Merge pull request #2917 from penpot/eva-bugfixing-7
🐛 Fix tooltips on left toolbar
2023-02-07 11:18:43 +01:00
Pablo Alba
d74af6ddc1 Revert "🐛 Fix line-height inconsistent"
This reverts commit 3974a4778a.
2023-02-07 11:18:01 +01:00
Alejandro
8cb33dc19c Merge pull request #2908 from penpot/niwinz-bugfix-oidc-autidiscover
🐛 Fix issue with oidc autodiscover
2023-02-07 11:16:00 +01:00
Eva
4912107fcc 🐛 Fix tooltips on left toolbar 2023-02-07 10:03:18 +01:00
alonso.torres
d5c7a6e547 🐛 Fix problem with auto-width and space-around 2023-02-07 00:17:16 +01:00
Andrey Antukh
f1085aadd1 🐛 Fix compatibility issues on docker upgrade path 2023-02-06 19:21:55 +01:00
alonso.torres
ca5b59f102 🐛 Fix sizing when moving shapes into/out of a layout 2023-02-06 17:50:59 +01:00
alonso.torres
a0898fbabd 🐛 Named redis volume 2023-02-06 17:00:42 +01:00
Yaron Shahrabani
bd5f19cbd0 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-02-06 16:38:02 +01:00
Fernando Krik
cf1fa99399 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 96.4% (1142 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-06 16:38:01 +01:00
Alvaro Araoz
4c3025ab24 🌐 Add translations for: Spanish.
Currently translated at 99.8% (1182 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-02-06 16:38:00 +01:00
Andrey Antukh
aaf332ed18 🐛 Fix issue with oidc autodiscover 2023-02-06 14:20:57 +01:00
Christian Clauss
b05ca4bb82 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:19:41 +01:00
Christian Clauss
b46b23b027 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:19:28 +01:00
Andrey Antukh
01d463b4aa Merge branch 'cclauss-patch-1' into develop 2023-02-05 11:19:12 +01:00
Christian Clauss
58001f367a 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:18:01 +01:00
Mario Bašić
29c0190b7a 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:16:34 +01:00
Mario Bašić
f1b09e763e 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:16:07 +01:00
Andrey Antukh
517210eeb5 Merge branch 'mabasic-patch-1' into develop 2023-02-05 11:15:49 +01:00
Mario Bašić
22034c22c6 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:15:01 +01:00
im424
33a67bc61c 🌐 Add translations for: Chinese (Traditional).
Currently translated at 52.5% (622 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-02-04 12:38:27 +01:00
Yaron Shahrabani
b0e89ed563 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-02-04 12:38:27 +01:00
Stas Haas
5eb08d9c4e 🌐 Add translations for: German.
Currently translated at 99.4% (1177 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-04 12:38:26 +01:00
Dias Stebanäk
59ec8c5c78 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 93.6% (1109 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-04 12:38:25 +01:00
Ondřej Konečný
9fae26765a added darker color for hover button in zoom widget to improve a11y 2023-02-03 13:19:21 +01:00
Alejandro
2e5e772392 Merge pull request #2900 from penpot/alotor-fix-space-around-bounds
🐛 Fix problem with space-around
2023-02-02 19:47:41 +01:00
alonso.torres
ecd4bb54c9 🐛 Fix problem with space-around 2023-02-02 19:31:02 +01:00
Alejandro Alonso
3cfc432c23 Merge remote-tracking branch 'origin/staging' 2023-02-02 18:07:20 +01:00
Alejandro Alonso
2ea81c0114 Merge remote-tracking branch 'origin/staging' into develop 2023-02-02 18:06:59 +01:00
Alejandro
a4cef16ef2 Merge pull request #2895 from penpot/niwinz-refactor-logging
♻️ Refactor logging and error reporting
2023-02-02 18:05:47 +01:00
Alejandro
e426425cb5 Merge pull request #2898 from penpot/alotor-fix-safari-thumbnails
🐛 Temporary deactivate thumbnails in Safari
2023-02-02 17:37:25 +01:00
alonso.torres
3a0cc63fa7 🐛 Temporary deactivate thumbnails in Safari 2023-02-02 17:32:12 +01:00
Alejandro
88a8370e8d Merge pull request #2897 from penpot/alotor-pro-fixes
Fixes
2023-02-02 16:08:30 +01:00
alonso.torres
e8972dd802 🐛 Fix problem with thumbnail updating 2023-02-02 15:34:35 +01:00
Andrey Antukh
1325e46192 Improve internal state validation on db module 2023-02-02 14:20:13 +01:00
Andrey Antukh
071ecca875 🐛 Fix internal executor naming issue 2023-02-02 13:38:04 +01:00
Andrey Antukh
d91e6e381e 🔧 Do not compile clj source (allow dynamic instrumentation on runtime) 2023-02-02 13:38:04 +01:00
Andrey Antukh
b54bf2bba4 📎 Add helpers for instrumenting vars 2023-02-02 13:38:04 +01:00
Andrey Antukh
32b8a2c243 ⬆️ Update dependencies on backend and common 2023-02-02 13:38:04 +01:00
Andrey Antukh
bb055a3c84 ♻️ Refactor logging subsystem and error reporting 2023-02-02 13:38:04 +01:00
alonso.torres
3e52bef6d4 🐛 Fix problem with multiple selection of layout items 2023-02-02 13:37:34 +01:00
alonso.torres
7c215dc11b 🐛 Align-items center/end weren't respected when layout was outside bounds 2023-02-02 13:37:34 +01:00
alonso.torres
48c3e3e00b 🐛 Fix problem with Safari canvas behavior 2023-02-02 13:37:34 +01:00
Alejandro
412dcae01a Merge pull request #2894 from penpot/fix-social-urls
🐛 Fix social links broken
2023-02-02 13:20:25 +01:00
Pablo Alba
cc5f245209 🐛 Fix social links broken 2023-02-02 13:13:24 +01:00
Alejandro
dc4aabe263 Merge pull request #2893 from penpot/palba-fix-can-move-shape-with-lens-zoom
🐛 Fix can move shape with lens zoom active
2023-02-02 13:12:34 +01:00
Pablo Alba
708a8ce27b 🐛 Fix can move shape with lens zoom active 2023-02-02 12:59:02 +01:00
Alejandro
7c1d9ce06f Merge pull request #2892 from penpot/alotor-fix-safari-problem
🐛 Fix problem with thumbnails in safari
2023-02-02 11:36:19 +01:00
Aitor
b0cbf09950 Merge pull request #2885 from penpot/eva-bugfixing-5
Some bug fixing
2023-02-02 11:33:25 +01:00
Aitor
f31bc7457f Merge branch 'staging' into eva-bugfixing-5 2023-02-02 11:31:49 +01:00
alonso.torres
e47ce3235e 🐛 Fix problem with thumbnails in safari 2023-02-02 11:31:10 +01:00
Alejandro
fe76e0fab6 Merge pull request #2884 from penpot/alotor-post-release-fixes
Post release fixes
2023-02-02 11:22:53 +01:00
glippi
57a89b733e Allow negative values for shadow spread 2023-02-02 10:56:58 +01:00
Alejandro
297ba10e9d Merge pull request #2886 from penpot/hiru-dashboard-names
🐛 Fix weird numeration creating elements in dashboard
2023-02-02 10:51:26 +01:00
Andrés Moya
dd2321a37b 🐛 Fix weird numeration creating elements in dashboard 2023-02-02 10:19:36 +01:00
Eva
f98630a46b 🐛 Fix invitations input on team management and onboarding modal 2023-02-02 09:37:21 +01:00
Eva
82d6ba790c 🐛 Fix button spacing on delete account modal 2023-02-02 09:37:19 +01:00
Eva
575aec209c 🐛 Fix button spacing on delete acount modal 2023-02-02 09:37:00 +01:00
alonso.torres
00e265695c Change parent/children constraint for problematic configurations 2023-02-02 09:18:53 +01:00
alonso.torres
071ac0366c 🐛 Fix problem with max-size 0 2023-02-02 09:18:53 +01:00
alonso.torres
1a2a90f829 🐛 Fix problems with strange file 2023-02-02 09:18:53 +01:00
alonso.torres
028c084b22 🐛 Add limit to growth fill shapes to the bounds of the layout 2023-02-02 09:18:53 +01:00
alonso.torres
e7e80e99bd 🐛 Fix thumbnail not updating when changing pages 2023-02-02 09:18:53 +01:00
alonso.torres
70fa169d0d 🐛 Fix problem with selection on nested boards 2023-02-02 09:18:53 +01:00
Andrey Antukh
50ee0ad3fd Merge remote-tracking branch 'origin/staging' into develop 2023-02-01 23:25:25 +01:00
Alejandro
6be83fc6d6 Merge pull request #2889 from penpot/palba-fix-commad-z-in-mac
🐛 Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor
2023-02-01 22:45:26 +01:00
Pablo Alba
1e9ece43d0 🐛 Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor 2023-02-01 21:56:30 +01:00
Andrés Moya
b7c55b4700 💄 Move all README images to a subfolder 2023-02-01 21:09:17 +01:00
Alejandro
965c0d6fa2 Merge pull request #2888 from penpot/hiru-move-readme-images
💄 Move all README images to a subfolder
2023-02-01 20:40:14 +01:00
Andrés Moya
950d5dcc2f 💄 Move all README images to a subfolder 2023-02-01 19:31:12 +01:00
Andrey Antukh
43d034798c Merge branch 'staging' 2023-02-01 18:06:50 +01:00
Andrey Antukh
86712f977d 🐛 Skip unnecesary mutation events from audit log 2023-02-01 18:06:12 +01:00
im424
9f52da90c3 🌐 Add translations for: Chinese (Traditional).
Currently translated at 48.2% (571 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-02-01 17:38:09 +01:00
Linerly
fac6e8a20e 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-02-01 17:38:09 +01:00
Stas Haas
38ebf9c3b4 🌐 Add translations for: German.
Currently translated at 99.1% (1174 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-01 17:38:08 +01:00
Andrey Antukh
6240323704 💄 Add minor cosmetic changes to common.spec ns 2023-02-01 16:39:59 +01:00
Andrey Antukh
d666564112 🐛 Fix loading issue on app.rpc ns 2023-02-01 16:39:59 +01:00
Andrey Antukh
f4d4559cd4 💄 Add cosmetic improvemnts on http client validation 2023-02-01 16:39:59 +01:00
Alejandro Alonso
e9c3b0567b Merge remote-tracking branch 'origin/staging' into develop 2023-02-01 13:24:39 +01:00
Alejandro Alonso
707e6c2a33 Merge remote-tracking branch 'origin/staging' 2023-02-01 13:12:34 +01:00
Alejandro
3dfd87eee1 Merge pull request #2883 from penpot/palba-fix-components-groups-names-in-list-mode
🐛 Fix components groups items show the component name in list mode
2023-02-01 10:41:33 +01:00
Alejandro
037ba19e87 Merge pull request #2882 from penpot/niwinz-webhooks-fix
🐛 Fix incorrect state management on webhooks crud
2023-02-01 10:38:33 +01:00
Pablo Alba
cdbab2c098 🐛 Fix components groups items show the component name in list mode 2023-02-01 10:23:51 +01:00
Andrey Antukh
e8ea61ee78 🐛 Fix incorrect state management on webhooks crud 2023-02-01 10:15:25 +01:00
Andrey Antukh
56cf7064f5 Merge remote-tracking branch 'origin/staging' into develop 2023-01-31 23:04:26 +01:00
Andrey Antukh
7ab91f68af Merge branch 'staging' 2023-01-31 23:02:22 +01:00
Andrey Antukh
91ececa59e 🐛 Fix backend flags on docker compose sample file 2023-01-31 23:01:58 +01:00
Andrey Antukh
8758723200 Merge pull request #2874 from penpot/niwinz-hotfix-1
🐛 Fix docker images issues in the latest release
2023-01-31 23:00:30 +01:00
Alejandro Alonso
8a968dc081 🐛 Fix upload team image 2023-01-31 22:29:05 +01:00
Andrey Antukh
f8cb505196 🐛 Fix arguments handling on docker/images/build.sh script 2023-01-31 19:48:41 +01:00
Andrey Antukh
14e3439cae 🔥 Remove admin mention from compose, still not working correctly 2023-01-31 19:08:38 +01:00
Andrey Antukh
7dd55c7f9d Revert JRE/JLINK changes from Dockerfile.backend file 2023-01-31 18:50:53 +01:00
Alejandro Alonso
e8e3398a74 🐛 Fix default nginx configuration for docker images 2023-01-31 17:42:28 +01:00
Alejandro Alonso
95cad24c18 Merge remote-tracking branch 'origin/staging' 2023-01-31 13:57:30 +01:00
Alejandro Alonso
a905f49721 Merge remote-tracking branch 'origin/staging' into develop 2023-01-31 10:29:41 +01:00
im424
9328065954 🌐 Add translations for: Chinese (Traditional).
Currently translated at 43.4% (515 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-01-30 18:46:13 +01:00
nautilusx
c7a8d977ec 🌐 Add translations for: German.
Currently translated at 98.9% (1172 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-01-30 18:46:13 +01:00
Alejandro Alonso
11db7590eb Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 15:39:17 +01:00
Andrés Moya
e1d1ecbc24 Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 12:47:20 +01:00
im424
eb556fab10 🌐 Add translations for: Chinese (Traditional).
Currently translated at 35.5% (421 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-01-28 17:44:53 +01:00
Yaron Shahrabani
bf60fc6d82 🌐 Add translations for: Hebrew.
Currently translated at 94.0% (1114 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-01-26 17:52:24 +01:00
Linerly
53761bf802 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-01-26 17:52:24 +01:00
Stas Haas
3bf4ac6ea1 🌐 Add translations for: German.
Currently translated at 98.1% (1162 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-01-26 17:52:23 +01:00
Oğuz Ersen
45f12de546 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-01-26 17:52:22 +01:00
Hosted Weblate
4a46cf2ab7 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-01-24 15:44:15 +01:00
Andrés Moya
30725af367 📚 Validate translations 2023-01-24 15:42:34 +01:00
Andrés Moya
ece324a76f Merge remote-tracking branch 'weblate/develop' into translations 2023-01-24 15:39:47 +01:00
Amerey.eu
2ea69a84b2 🌐 Add translations for: Czech.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2023-01-24 15:27:43 +01:00
Mikel Larreategi
f2f0d292e0 🌐 Add translations for: Basque.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-01-24 15:27:40 +01:00
Ahmad HosseinBor
fc0fad29d0 🌐 Add translations for: Persian.
Currently translated at 59.9% (728 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2023-01-24 15:27:40 +01:00
Linerly
9a954ab430 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-01-24 15:27:39 +01:00
Vin
90caaaa14a 🌐 Add translations for: Russian.
Currently translated at 68.3% (831 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-01-24 15:27:36 +01:00
GradelerM
98360ed9e8 🌐 Add translations for: French.
Currently translated at 93.1% (1132 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-01-24 15:27:35 +01:00
Rubén
f64a74e7b9 🌐 Add translations for: Catalan.
Currently translated at 95.8% (1164 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2023-01-24 15:27:35 +01:00
Alejandro Alonso
aae78055c8 Merge remote-tracking branch 'origin/staging' into develop 2023-01-24 10:00:51 +01:00
Alejandro Alonso
6b25bf6c4f Merge remote-tracking branch 'origin/staging' into develop 2023-01-23 11:06:05 +01:00
Alejandro
125e6238d1 Merge pull request #2821 from penpot/niwinz-dev-bugfixes
🐛 Bugfixes + unit tests
2023-01-23 10:35:55 +01:00
Andrés Moya
77cd645e25 🔧 Update docker-compose without needing config file 2023-01-23 10:34:00 +01:00
Andrey Antukh
504f75a1cf 🐛 Fix health check http endpoint 2023-01-23 09:59:55 +01:00
Andrey Antukh
fa17ce5d40 📎 Avoid email index change on profile indexes migration 2023-01-23 09:56:21 +01:00
Andrey Antukh
14f39b8028 🎉 Add unit tests for access tokens rpc methods 2023-01-23 09:56:21 +01:00
Andrey Antukh
7e9a5c4a8f Merge remote-tracking branch 'origin/staging' into develop 2023-01-23 09:55:50 +01:00
Alejandro Alonso
b8043a9755 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 15:52:04 +01:00
Alejandro Alonso
da517f2d35 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 13:58:08 +01:00
Andrey Antukh
62aa6569f2 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 09:59:56 +01:00
Alejandro
42e97f8be1 Merge pull request #2793 from penpot/niwinz-access-tokens
🎉 ♻️ Refactor & Access Tokens (part 1)
2023-01-20 09:36:47 +01:00
Andrey Antukh
9a407ab714 🎉 Add namespace with a set of helpers for access throught the BREPL 2023-01-19 12:42:39 +01:00
andrés gonzález
750e00c981 Merge pull request #2803 from iprithvitharun/2791-renaming-export-board-option
 Renamed Export boards to PDF option
2023-01-19 09:55:18 +01:00
Prithvi Tharun
d2847e9507 Renamed Export boards to PDF option
Two instances of this changed

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-18 23:09:39 +05:30
Andrey Antukh
8a5afefc1c 🎉 Add prepl support
And rename the current repl to urepl (user-repl).
2023-01-18 17:14:22 +01:00
Andrey Antukh
3dd65db651 Use commands instead of mutations for assets upload
And properly deprecate media rpc mutations
2023-01-18 11:20:36 +01:00
Andrey Antukh
1e1f551383 Move share link mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
4258a840ac ♻️ Use proper namespace qualified access to pool 2023-01-18 10:51:58 +01:00
Andrey Antukh
bca98f91e4 🎉 Add rpc methods for access tokens 2023-01-18 10:51:58 +01:00
Andrey Antukh
a79d2cf899 🔥 Remove deprecated teams mutations and queries 2023-01-18 10:51:58 +01:00
Andrey Antukh
6a699d7f09 Properly move viewer queries to commands
And change deprecation version on viewer queries
2023-01-18 10:51:58 +01:00
Andrey Antukh
ba2729fa4a Move fonts queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
dba7a9d424 Move projects queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
dc77c6b655 Remove deprecated code and reoganize file related methods 2023-01-18 10:51:58 +01:00
Andrey Antukh
ed87814f50 🐛 Properly handle storage features on binfile import 2023-01-18 10:51:58 +01:00
Andrey Antukh
d8faff47a8 ♻️ Move profile queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
ecb757bcaf 🎉 Move user feedback http handler to RPC command method 2023-01-18 10:51:58 +01:00
Andrey Antukh
73a6f0a347 📎 Update backend scripts/repl file 2023-01-18 10:51:58 +01:00
Andrey Antukh
db689d151e ♻️ Refactor profile and session handling
- makes the profile access more efficient (replace in-app joins to a
  simple select query on profile table
- add partial support for access-tokens (still missing some RPC methods)
- move router definitions to specific modules and simplify the main http
  module definitions to simple includes
- simplifiy authentication code related to access-tokens and sessions
- normalize db parameters with proper namespaced props
- more work on convert all modules initialization to use proper specs
  with fully-qualified keyword config props
2023-01-18 10:51:58 +01:00
Ahmad HosseinBor
6bdd25b5d1 🌐 Add translations for: Persian.
Currently translated at 56.3% (685 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2023-01-18 06:48:14 +01:00
andrés gonzález
a7ec9d7d1f Merge pull request #2790 from iprithvitharun/2789-inconsistent-casing-fixes
  Fixes wrong casing
2023-01-17 08:58:03 +01:00
Alejandro Alonso
7f9911f164 Merge remote-tracking branch 'origin/staging' into develop 2023-01-16 17:14:56 +01:00
Prithvi Tharun
0e07617877 Fixes wrong casing
several casings fixed

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-16 21:04:50 +05:30
Alejandro Alonso
c78cb89943 Merge remote-tracking branch 'origin/staging' into develop 2023-01-16 16:21:35 +01:00
Rubén
42b8c3669f 🌐 Add translations for: Catalan.
Currently translated at 95.5% (1161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2023-01-16 15:50:44 +01:00
Alejandro Alonso
6c0a8afba2 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 15:00:30 +01:00
Alejandro Alonso
19bac6bd10 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 14:37:06 +01:00
andrés gonzález
1f5fb43454 Merge pull request #2771 from iprithvitharun/2770-update-position-x-y-tooltips
 Improves tooltip
2023-01-13 09:48:52 +01:00
Prithvi Tharun
cd3f1d5ded Improves tooltip
X and Y position tooltips updated to communicate more info

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-12 20:57:46 +05:30
Alejandro Alonso
47c983ed88 Merge remote-tracking branch 'origin/staging' into develop 2023-01-12 13:33:23 +01:00
Alejandro Alonso
c39c58198d Merge remote-tracking branch 'origin/staging' into develop 2023-01-12 13:14:25 +01:00
Alejandro Alonso
76c9f11922 Merge remote-tracking branch 'origin/staging' into develop 2023-01-11 12:45:05 +01:00
Alejandro Alonso
a25f069f8e Merge remote-tracking branch 'origin/staging' into develop 2023-01-10 11:27:38 +01:00
andrés gonzález
d87bc5fa1b Merge pull request #2682 from iprithvitharun/2678-updating-custom-fonts-empty-state-content
 Improves empty state content
2023-01-10 11:17:09 +01:00
andrés gonzález
5a482298e8 Merge pull request #2683 from iprithvitharun/2679-updating-empty-state-content-libraries-section
 Improves empty state content
2023-01-10 11:16:00 +01:00
Alejandro Alonso
34d874f56d Merge remote-tracking branch 'origin/staging' into develop 2023-01-09 16:41:40 +01:00
Alejandro
762681a421 Merge pull request #2747 from penpot/azazeln28-fix-import-dialog-react-duplicate-key-warning
🐛 Fix import dialog React duplicate key warning
2023-01-09 12:44:04 +01:00
Aitor Moreno
b73ab37c94 🐛 Fix import dialog React duplicate key warning 2023-01-09 12:28:41 +01:00
Alejandro
04dc9f7881 Merge pull request #2736 from penpot/superalex-fix-text-sync-hotfix
🐛 Fix text content sync and touched detection in shape displacement
2023-01-09 11:35:59 +01:00
K.B.Dharun Krishna
0039585848 🌐 Add translations for: Tamil.
Currently translated at 2.7% (34 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2023-01-06 11:48:00 +01:00
Alejandro Alonso
df5ccb6e77 Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 13:30:16 +01:00
Andrés Moya
0863a96f93 🐛 Fix text content sync and touched detection in shape displacement 2023-01-05 13:26:33 +01:00
Andrés Moya
be5e7f1536 💄 Fix line removed by merge 2023-01-05 09:59:30 +01:00
Andrés Moya
d68f53733d Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 09:58:20 +01:00
Andrés Moya
dba90726c1 💄 Clean up CHANGES.md 2023-01-05 09:54:33 +01:00
Alejandro Alonso
84dcd8f89c Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 09:45:14 +01:00
Alejandro Alonso
3b0bded82c Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 07:40:25 +01:00
Alejandro
216a43cc43 Merge pull request #2731 from penpot/superalex-fix-enter-events-hotfix
🐛 Fix enter events
2023-01-05 07:02:34 +01:00
Alejandro Alonso
05431cc757 🐛 Fix enter events 2023-01-04 13:23:05 +01:00
Alejandro Alonso
dd0ac64e28 Merge remote-tracking branch 'origin/staging' into develop 2023-01-04 09:25:30 +01:00
Alejandro Alonso
aa56e2cdcf Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:18:00 +01:00
Alejandro Alonso
07ac43ec0e Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:07:56 +01:00
Alejandro Alonso
31661d5484 Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 13:48:36 +01:00
Alejandro Alonso
9c44cd343f Merge remote-tracking branch 'origin/staging' into develop 2022-12-30 07:46:38 +01:00
Alejandro Alonso
2d22f575a0 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 14:26:00 +01:00
Alejandro Alonso
87a264ae40 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 13:15:15 +01:00
Alejandro
690090acb4 Merge pull request #2706 from penpot/alotor-flex-improvements
Flex improvements
2022-12-29 12:06:47 +01:00
alonso.torres
3c5be31222 Reorder layers through keys in flex layout 2022-12-29 11:16:54 +01:00
alonso.torres
a66b40d79e Changes to the margin-item and min/max width/height 2022-12-29 11:11:37 +01:00
alonso.torres
7e31c55e37 Support hidden elements in flex layout 2022-12-29 11:11:36 +01:00
Alejandro Alonso
9e30f974ef Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 10:07:20 +01:00
Fernando Krik
5e6d079fea 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.9% (1214 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-12-29 00:47:37 +01:00
Alejandro Alonso
4cc841d629 Merge remote-tracking branch 'origin/staging' into develop 2022-12-28 13:17:11 +01:00
Alejandro Alonso
1497e8ef0f Merge remote-tracking branch 'origin/staging' into develop 2022-12-28 11:55:30 +01:00
Fernando Krik
4c392e3a31 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-12-27 23:22:16 +01:00
Alejandro Alonso
145d6f831a 📎 Prepare new development cycle 2022-12-27 12:04:02 +01:00
matl-17
8aa1f29865 🌐 Add translations for: Czech.
Currently translated at 15.8% (192 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2022-12-22 01:45:30 +01:00
Midka
62b730f5f0 🌐 Add translations for: Finnish (fin_FI).
Currently translated at 5.0% (61 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fin_FI/
2022-12-20 21:48:51 +01:00
Prithvi Tharun
f35095e053 Improves empty state content
Better instructions explaining multiple ways people can add files to library. Also, reads in neutral tone withour blaming and alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-20 23:30:37 +05:30
Prithvi Tharun
9e3515619d Improves empty state content
Reads in neutral content without alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-20 22:35:05 +05:30
andy
de7fb393c9 🌐 Added translation for: Finnish (fin_FI). 2022-12-19 10:22:15 +01:00
Ahmad HosseinBor
fed320be36 🌐 Add translations for: Persian.
Currently translated at 55.3% (673 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-12-17 17:49:47 +01:00
Ahmad HosseinBor
1b30d023ef 🌐 Add translations for: Persian.
Currently translated at 54.9% (668 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-12-10 16:48:15 +01:00
Alex Howell
806a818cb3 🌐 Add translations for: Romanian.
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-12-10 16:48:15 +01:00
GradelerM
4014fec195 🌐 Add translations for: French.
Currently translated at 92.0% (1119 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-12-10 16:48:14 +01:00
Pablo Alba
cae0311db6 🌐 Added translation for: Korean. 2022-12-09 16:36:55 +01:00
María Ozámiz
7c6dfef1c6 🌐 Add translations for: Galician.
Currently translated at 33.9% (412 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-12-06 22:48:04 +01:00
Alex Howell
51440964a7 🌐 Add translations for: Romanian.
Currently translated at 76.4% (929 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-12-06 22:48:04 +01:00
Ally Tiago
f7a819fd57 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.9% (1214 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-12-06 22:48:03 +01:00
Salman Hossain Saif
378b9f3f67 🌐 Add translations for: Bengali.
Currently translated at 1.5% (19 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/bn/
2022-12-03 15:47:26 +01:00
María Ozámiz
cb3a7a1da0 🌐 Add translations for: Galician.
Currently translated at 31.1% (379 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-12-03 15:47:25 +01:00
andy
6f4b533fc7 🌐 Added translation for: Bengali. 2022-12-02 14:10:07 +01:00
GradelerM
dbdc656e3e 🌐 Add translations for: French.
Currently translated at 89.1% (1083 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-12-01 11:47:02 +01:00
Dário
797aa68bfa 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-29 15:48:08 +01:00
HIYIZI
80c17e5dcf 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-29 15:48:07 +01:00
K.B.Dharun Krishna
7083c4e111 🌐 Add translations for: Tamil.
Currently translated at 2.1% (26 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-11-28 15:06:27 +01:00
HIYIZI
e0e0f0a9b1 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-28 15:06:27 +01:00
Maemolee
b57c5ec92a 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-28 15:06:27 +01:00
Bogi Napoleon Wennerstrøm
08eb2bceb1 🌐 Add translations for: Faroese.
Currently translated at 14.1% (172 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-18 20:48:29 +01:00
Tummas Jóhan Sigvardsen
f439d10128 🌐 Add translations for: Faroese.
Currently translated at 13.2% (161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-17 20:21:01 +01:00
Bogi Napoleon Wennerstrøm
b87022ef28 🌐 Add translations for: Faroese.
Currently translated at 13.2% (161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-17 20:21:01 +01:00
Stas Haas
17d1c16d9c 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-11-05 11:09:39 +01:00
Tummas Jóhan Sigvardsen
0e3675ce1f 🌐 Add translations for: Faroese.
Currently translated at 11.6% (141 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-01 15:29:29 +01:00
Bogi Napoleon Wennerstrøm
92cd4693f4 🌐 Add translations for: Faroese.
Currently translated at 11.6% (141 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-01 15:29:28 +01:00
Tatsuto Yamamoto
7905b9fbeb 🌐 Add translations for: Japanese (jpn_JP).
Currently translated at 21.8% (265 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/jpn_JP/
2022-11-01 15:29:28 +01:00
Mikel Larreategi
0b4318b32c 🌐 Add translations for: Basque.
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-10-29 15:03:18 +02:00
Stas Haas
0fd80bedf2 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
Marius
380f297af3 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
Henrik Steffens
f8f0944816 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
nautilusx
a5f833759a 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:16 +02:00
Tummas Jóhan Sigvardsen
7ab90c6b6f 🌐 Add translations for: Faroese.
Currently translated at 9.0% (110 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-27 15:02:46 +02:00
Pablo Alba
a5a0d51ca7 🌐 Add translations for: French.
Currently translated at 87.9% (1069 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-10-27 15:02:46 +02:00
1698 changed files with 229904 additions and 91868 deletions

View File

@@ -11,11 +11,11 @@ jobs:
- image: cimg/redis:7.0.5
working_directory: ~/repo
resource_class: large
resource_class: medium+
environment:
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx4g
JAVA_OPTS: -Xmx4g -Xms100m -XX:+UseSerialGC
NODE_OPTIONS: --max-old-space-size=4096
steps:
- checkout
@@ -28,50 +28,82 @@ jobs:
- v1-dependencies-
- run: cd .clj-kondo && cat config.edn
- run: cat .cljfmt.edn
- run: clj-kondo --version
- run:
name: frontend styles prettier
name: "fmt check backend [clj]"
working_directory: "./backend"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "fmt check exporter [clj]"
working_directory: "./exporter"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "fmt check common [clj]"
working_directory: "./common"
command: |
yarn install
yarn run fmt:clj:check
- run:
name: "fmt check frontend [clj]"
working_directory: "./frontend"
command: |
yarn install
yarn run lint-scss
yarn run fmt:clj:check
- run:
name: common lint
working_directory: "./common"
command: |
clj-kondo --version
clj-kondo --parallel --lint src/
yarn install
yarn run lint:clj
- run:
name: frontend lint
working_directory: "./frontend"
command: |
clj-kondo --version
clj-kondo --parallel --lint src/
yarn install
yarn run lint:scss
yarn run lint:clj
- run:
name: backend lint
working_directory: "./backend"
command: |
clj-kondo --version
clj-kondo --parallel --lint src/
yarn install
yarn run lint:clj
- run:
working_directory: "./common"
name: common tests
name: exporter lint
working_directory: "./exporter"
command: |
yarn install
yarn run lint:clj
- run:
name: "common tests"
working_directory: "./common"
command: |
yarn test
clojure -X:dev:test :patterns '["common-tests.*-test"]'
environment:
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
JVM_OPTS: -Xmx4g
NODE_OPTIONS: --max-old-space-size=4096
- run:
name: "frontend tests"
working_directory: "./frontend"
command: |
yarn install
yarn test
- run:
name: backend test
name: "backend tests"
working_directory: "./backend"
command: |
clojure -X:dev:test :patterns '["backend-tests.*-test"]'
@@ -81,18 +113,6 @@ jobs:
PENPOT_TEST_DATABASE_USERNAME: penpot_test
PENPOT_TEST_DATABASE_PASSWORD: penpot_test
PENPOT_TEST_REDIS_URI: "redis://localhost/1"
JVM_OPTS: -Xmx4g
- run:
name: frontend tests
working_directory: "./frontend"
command: |
yarn install
yarn test
environment:
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
NODE_OPTIONS: --max-old-space-size=4096
- save_cache:
paths:

View File

@@ -2,10 +2,11 @@
{promesa.core/let clojure.core/let
promesa.core/->> clojure.core/->>
promesa.core/-> clojure.core/->
promesa.exec.csp/go-loop clojure.core/loop
rumext.v2/defc clojure.core/defn
rumext.v2/fnc clojure.core/fn
promesa.util/with-open clojure.core/with-open
app.common.schema.generators/let clojure.core/let
app.common.data/export clojure.core/def
app.db/with-atomic clojure.core/with-open
app.common.data.macros/get-in clojure.core/get-in
app.common.data.macros/with-open clojure.core/with-open
app.common.data.macros/select-keys clojure.core/select-keys
@@ -14,16 +15,28 @@
:hooks
{:analyze-call
{app.common.data.macros/export hooks.export/export
potok.core/reify hooks.export/potok-reify
app.util.services/defmethod hooks.export/service-defmethod
app.common.record/defrecord hooks.export/penpot-defrecord
app.db/with-atomic hooks.export/penpot-with-atomic
potok.v2.core/reify hooks.export/potok-reify
rumext.v2/fnc hooks.export/rumext-fnc
rumext.v2/lazy-component hooks.export/rumext-lazycomponent
shadow.lazy/loadable hooks.export/rumext-lazycomponent
}}
:output
{:exclude-files
["data_readers.clj"
"app/util/perf.cljs"
"app/common/logging.cljc"
"app/common/exceptions.cljc"]}
"src/app/util/perf.cljs"
"src/app/common/logging.cljc"
"src/app/common/exceptions.cljc"
"^(?:backend|frontend|exporter|common)/build.clj"
"^(?:backend|frontend|exporter|common)/deps.edn"
"^(?:backend|frontend|exporter|common)/scripts/"
"^(?:backend|frontend|exporter|common)/dev/"
"^(?:backend|frontend|exporter|common)/test/"]
:linter-name true}
:linters
{:unsorted-required-namespaces
@@ -59,4 +72,3 @@
:exclude-destructured-keys-in-fn-args false
}
}}

View File

@@ -37,8 +37,76 @@
(api/token-node rsym)
(api/vector-node [])]
other))]
;; (prn (api/sexpr result))
{:node result})))
(defn penpot-with-atomic
[{:keys [node]}]
(let [[params & body] (rest (:children node))]
(if (api/vector-node? params)
(let [[sym val opts] (:children params)]
(when-not (and sym val)
(throw (ex-info "No sym and val provided" {})))
{:node (api/list-node
(list*
(api/token-node 'let)
(api/vector-node [sym val])
opts
body))})
{:node (api/list-node
(into [(api/token-node 'let)
(api/vector-node [params params])]
body))})))
(defn rumext-fnc
[{:keys [node]}]
(let [[cname mdata params & body] (rest (:children node))
[params body] (if (api/vector-node? mdata)
[mdata (cons params body)]
[params body])]
(let [result (api/list-node
(into [(api/token-node 'fn)
params]
(cons mdata body)))]
{:node result})))
(defn rumext-lazycomponent
[{:keys [node]}]
(let [[cname mdata params & body] (rest (:children node))
[params body] (if (api/vector-node? mdata)
[mdata (cons params body)]
[params body])]
(let [result (api/list-node [(api/token-node 'constantly) nil])]
;; (prn (api/sexpr result))
{:node result})))
(defn penpot-defrecord
[{:keys [:node]}]
(let [[rnode rtype rparams & other] (:children node)
nodes [(api/token-node (symbol "do"))
(api/list-node
(into [(api/token-node (symbol (name (:value rnode)))) rtype rparams] other))
(api/list-node
[(api/token-node (symbol "defn"))
(api/token-node (symbol (str "pos->" (:string-value rtype))))
(api/vector-node
(->> (:children rparams)
(mapv (fn [t]
(api/token-node (symbol (str "_" (:string-value t))))))))
(api/token-node nil)])]
result (api/list-node nodes)]
;; (prn "=====>" (into {} rparams))
;; (prn (api/sexpr result))
{:node result}))
(defn clojure-specify
[{:keys [:node]}]
(let [[rnode rtype & other] (:children node)
@@ -48,7 +116,6 @@
other))]
{:node result}))
(defn service-defmethod
[{:keys [:node]}]
(let [[rnode rtype ?meta & other] (:children node)

9
.cljfmt.edn Normal file
View File

@@ -0,0 +1,9 @@
{:sort-ns-references? true
:remove-multiple-non-indenting-spaces? false
:remove-surrounding-whitespace? true
:remove-consecutive-blank-lines? false
:extra-indents {rumext.v2/fnc [[:inner 0]]
cljs.test/async [[:inner 0]]
promesa.exec/thread [[:inner 0]]
specify! [[:inner 0] [:inner 1]]}
}

13
.editorconfig Normal file
View File

@@ -0,0 +1,13 @@
root = true
[*.{cljs,cljc,clj,js,css,scss,html,yml,yaml,json,mustache}]
charset = utf-8
indent_size = 2
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

11
.gitignore vendored
View File

@@ -1,7 +1,16 @@
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
*-init.clj
*.css.json
*.jar
*.orig
*.penpot
*.css.json
.calva
.clj-kondo
.cpcache
@@ -14,6 +23,7 @@
/*.jpg
/*.md
/*.png
/*.svg
/*.sql
/*.txt
/*.yml
@@ -57,3 +67,4 @@
/web
clj-profiler/
node_modules
frontend/.storybook/preview-body.html

9
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,9 @@
{
"files.exclude": {
"**/.clj-kondo": true,
"**/.cpcache": true,
"**/.lsp": true,
"**/.shadow-cljs": true,
"**/node_modules": true
}
}

11
.yarnrc.yml Normal file
View File

@@ -0,0 +1,11 @@
enableGlobalCache: true
enableImmutableCache: false
enableImmutableInstalls: false
enableTelemetry: false
httpTimeout: 600000
nodeLinker: node-modules

View File

@@ -1,5 +1,500 @@
# CHANGELOG
## 2.0.0 - I Just Can't Get Enough
### :rocket: Epics and highlights
- Grid CSS layout [Taiga #4915](https://tree.taiga.io/project/penpot/epic/4915)
- UI redesign [Taiga #4958](https://tree.taiga.io/project/penpot/epic/4958)
- New components System [Taiga #2662](https://tree.taiga.io/project/penpot/epic/2662)
- Swap components [Taiga #1331](https://tree.taiga.io/project/penpot/us/1331)
- Images as fill [Taiga #2983](https://tree.taiga.io/project/penpot/us/2983)
- HTML code generation [Taiga #5277](https://tree.taiga.io/project/penpot/us/5277)
- Light and dark themes [Taiga #2287](https://tree.taiga.io/project/penpot/us/2287)
### :boom: Breaking changes & Deprecations
- New strokes default to inside border [Taiga #6847](https://tree.taiga.io/project/penpot/issue/6847)
### :heart: Community contributions (Thank you!)
- New Hausa, Yoruba and Igbo translations and update translation files (by All For Tech Empowerment Foundation) [Taiga #6950](https://tree.taiga.io/project/penpot/us/6950), [Taiga #6534](https://tree.taiga.io/project/penpot/us/6534)
- Hide bounding-box when editing shape (by @VasilevsVV) [#3930](https://github.com/penpot/penpot/pull/3930)
- CTRL + "+" to zoom into canvas instead of browser (by @audriu) [#3848](https://github.com/penpot/penpot/pull/3848)
- Add dev deps.edn in the project root (by @PEZ) [#3794](https://github.com/penpot/penpot/pull/3794)
- Allow passing overrides to frontend nginx config (by @m90) [#3602](https://github.com/penpot/penpot/pull/3602)
- Update index.njk to remove typo (by @fdvmoreira) [#155](https://github.com/penpot/penpot-docs/pull/155)
- Typo (by StephanEggermont) [#157](https://github.com/penpot/penpot-docs/pull/157)
### :sparkles: New features
- Send comments with Ctrl+Enter / Cmd + Enter [Taiga #6085](https://tree.taiga.io/project/penpot/issue/6085)
- Select through stroke only rectangle [Taiga #5484](https://tree.taiga.io/project/penpot/issue/5484)
- Stroke default position [Taiga #6847](https://tree.taiga.io/project/penpot/issue/6847)
- Override browser Ctrl+ and Ctrl- zoom with Penpot Zoom [Taiga #3200](https://tree.taiga.io/project/penpot/us/3200)
- Improve the way handlers work on flex layouts [Taiga #6598](https://tree.taiga.io/project/penpot/us/6598)
- Add menu entry for toggle between light/dark theme [Taiga #6829](https://tree.taiga.io/project/penpot/issue/6829)
- Switch themes shortcut [Taiga #6644](https://tree.taiga.io/project/penpot/us/6644)
- Constraints section at design tab new position [Taiga #6830](https://tree.taiga.io/project/penpot/issue/6830)
- [PICKER] File library colors order [Taiga #5399](https://tree.taiga.io/project/penpot/us/5399)
- Onboarding invitations improvements [Taiga #5974](https://tree.taiga.io/project/penpot/us/5974)
- [PERFORMANCE] Workspace thumbnails refactor [Taiga #5828](https://tree.taiga.io/project/penpot/us/5828)
- [PERFORMANCE] Add performance optimizations to shape rendering [Taiga #5835](https://tree.taiga.io/project/penpot/us/5835)
- [PERFORMANCE] Optimize SVG output [Taiga #4134](https://tree.taiga.io/project/penpot/us/4134)
- [PERFORMANCE] Optimize svg on importation [Taiga #5879](https://tree.taiga.io/project/penpot/us/5879)
- [PERFORMANCE] Optimization tasks related to design tab file [Taiga #5760](https://tree.taiga.io/project/penpot/us/5760)
- [INSTALL] Ability to setup features by team [Taiga #6108](https://tree.taiga.io/project/penpot/us/6108)
- [IMAGES] Keep aspect ratio option [Taiga #6933](https://tree.taiga.io/project/penpot/us/6933)
- [INSPECT] UI review [Taiga #5687](https://tree.taiga.io/project/penpot/us/5687)
- [GRID LAYOUT] Phase 1 [Taiga #4303](https://tree.taiga.io/project/penpot/us/4303)
- [GRID LAYOUT] Inspect code for Grid [Taiga #5277](https://tree.taiga.io/project/penpot/us/5277)
- [GRID LAYOUT] Phase 1 polishing [Taiga #5612](https://tree.taiga.io/project/penpot/us/5612)
- [GRID LAYOUT] Improvements & Feedback [Taiga #6047](https://tree.taiga.io/project/penpot/us/6047)
- [COMPONENTS] Naming of the main component [Taiga #5291](https://tree.taiga.io/project/penpot/us/5291)
- [COMPONENTS] Rework inside of components - Library page [Taiga #2918](https://tree.taiga.io/project/penpot/us/2918)
- [COMPONENTS] Update component when updating main instance [Taiga #3794](https://tree.taiga.io/project/penpot/us/3794)
- [COMPONENTS] Main component new behavior [Taiga #3796](https://tree.taiga.io/project/penpot/us/3796)
- [COMPONENTS] Main component look & feel [Taiga #5290](https://tree.taiga.io/project/penpot/us/5290)
- [COMPONENTS] Library view [Taiga #2880](https://tree.taiga.io/project/penpot/us/2880)
- [COMPONENTS] Positioning inside a component should relative, as in boards [Taiga #2826](https://tree.taiga.io/project/penpot/us/2826)
- [COMPONENTS] Update message should show only if affecting at components that are being used at a file [Taiga #1397](https://tree.taiga.io/project/penpot/us/1397)
- [COMPONENTS] Annotations [Taiga #4957](https://tree.taiga.io/project/penpot/us/4957)
- [COMPONENTS] Synchronization order for nested components [Taiga #5439](https://tree.taiga.io/project/penpot/us/5439)
- [COMPONENTS] Libraries modal zero case [Taiga #5294](https://tree.taiga.io/project/penpot/us/5294)
- [COMPONENTS] Contextual menu casuistics [Taiga #5292](https://tree.taiga.io/project/penpot/us/5292)
- [COMPONENTS] Libraries publishing flow review [Taiga #5293](https://tree.taiga.io/project/penpot/us/5293)
- [COMPONENTS] Add loading text to Libraries modal [Taiga #6702](https://tree.taiga.io/project/penpot/us/6702)
- [COMPONENTS] Components rename and organization in bulk [Taiga #2877](https://tree.taiga.io/project/penpot/us/2877)
- [COMPONENTS] Info overlay about components V2 [Taiga #6276](https://tree.taiga.io/project/penpot/us/6276)
- [REDESIGN] New styles basics [Taiga #4967](https://tree.taiga.io/project/penpot/us/4967)
- [REDESIGN] Layers tab redesign [Taiga #4966](https://tree.taiga.io/project/penpot/us/4966)
- [REDESIGN] Design tab phase 1 [Taiga #4982](https://tree.taiga.io/project/penpot/us/4966)
- [REDESIGN] Assets tab redesign [Taiga #4984](https://tree.taiga.io/project/penpot/us/4984)
- [REDESIGN] Palette panels (colors, typographies...) [Taiga #4983](https://tree.taiga.io/project/penpot/us/4983)
- [REDESIGN] Workspace structure [Taiga #4988](https://tree.taiga.io/project/penpot/us/4988)
- [REDESIGN] Shortcut tab [Taiga #4989](https://tree.taiga.io/project/penpot/us/4989)
- [REDESIGN] Toolbar [Taiga #5500](https://tree.taiga.io/project/penpot/us/5500)
- [REDESIGN] History tab [Taiga #5481](https://tree.taiga.io/project/penpot/us/5481)
- [REDESIGN] Path options/toolbar [Taiga #5815](https://tree.taiga.io/project/penpot/us/5815)
- [REDESIGN] Design tab phase 2 [Taiga #5814](https://tree.taiga.io/project/penpot/us/5814)
- [REDESIGN] Design tab phase 3 and dashboard details [Taiga #5920](https://tree.taiga.io/project/penpot/us/5920)
- [REDESIGN] Dashboard [Taiga #5164](https://tree.taiga.io/project/penpot/us/5164)
- [REDESIGN] New Dashboard UI [Taiga #5869](https://tree.taiga.io/project/penpot/us/5869)
- [REDESIGN] Prototype tab [Taiga #4985](https://tree.taiga.io/project/penpot/us/4985)
- [REDESIGN] Code tab [Taiga #4986](https://tree.taiga.io/project/penpot/us/4986)
- [REDESIGN] Modals and alert messages [Taiga #5915](https://tree.taiga.io/project/penpot/us/5915)
- [REDESIGN] Comments page [Taiga #5917](https://tree.taiga.io/project/penpot/us/5917)
- [REDESIGN] View Mode [Taiga #5163](https://tree.taiga.io/project/penpot/us/5163)
- [REDESIGN] Miscellaneous tasks [Taiga #6050](https://tree.taiga.io/project/penpot/us/6050)
- [REDESIGN] Swap components [Taiga #6739](https://tree.taiga.io/project/penpot/us/6739)
- [REDESIGN] Font selector [Taiga #6677](https://tree.taiga.io/project/penpot/us/6677)
- [REDESIGN] Colour system of alerts and notifications [Taiga #6746](https://tree.taiga.io/project/penpot/us/6746)
- [REDESIGN] Review text in paragraphs for accessibility [Taiga #6703](https://tree.taiga.io/project/penpot/us/6703)
- [REDESIGN] Interaction icons [Taiga #6880](https://tree.taiga.io/project/penpot/us/6880)
- [REDESIGN] Panels visual separations [Taiga #6692](https://tree.taiga.io/project/penpot/us/6692)
- [REDESIGN] Onboarding slides [Taiga #6678](https://tree.taiga.io/project/penpot/us/6678)
### :bug Bugs fixed
- Fix pixelated thumbnails [Github #3681](https://github.com/penpot/penpot/issues/3681), [Github #3661](https://github.com/penpot/penpot/issues/3661)
- Fix problem with not applying colors to boards [Github #3941](https://github.com/penpot/penpot/issues/3941)
- Fix problem with path editor undoing changes [Github #3998](https://github.com/penpot/penpot/issues/3998)
- [View mode] Open overlay places frame in the wrong position when paired with a fixed element [Taiga #6385](https://tree.taiga.io/project/penpot/issue/6385)
- Flex Layout: Fit-content not recalculated after deleting an element [Taiga #5968](https://tree.taiga.io/project/penpot/issue/5968)
- Selecting from Color Palette does not work for board when there is no existing fill [Taiga #6464](https://tree.taiga.io/project/penpot/issue/6464)
- Color thumbnails are consistently rounded in the inspect code mode [Taiga #5886](https://tree.taiga.io/project/penpot/issue/5886)
- Adding vector path points before first point of existing open path not working [Taiga #6593](https://tree.taiga.io/project/penpot/issue/6593)
- Some image formats include the extension when importing [Taiga #5485](https://tree.taiga.io/project/penpot/issue/5485)
- Gradient color tool doesn't work properly with flipped items [Taiga #6485](https://tree.taiga.io/project/penpot/issue/6485)
- [TEXT] Align options are not shown when several text are selected [Taiga #5948](https://tree.taiga.io/project/penpot/issue/5948)
- [VIEW MODE] Comments not working properly on multiple pages [Taiga #6281](https://tree.taiga.io/project/penpot/issue/6281)
- [PERFORMANCE] Alignments are slow [Taiga #5865](https://tree.taiga.io/project/penpot/issue/5865)
- [EXPORT] Exporting an element with a non-visible drop shadow displays the shadow either way [Taiga #6768](https://tree.taiga.io/project/penpot/issue/6768)
- [SAFARI] Color picker cursor is not pointing correctly [Taiga #6733](https://tree.taiga.io/project/penpot/issue/6733)
- [Import Files] When user has imported .penpot file with new file name of previously downloaded library file the default library file name is set for it [Taiga #5596](https://tree.taiga.io/project/penpot/issue/5596)
- Issue when resizing a duotone FA icon [Taiga #5935](https://tree.taiga.io/project/penpot/issue/5935)
- "Hide grid" keyboard shortcut broken [Taiga #5102](https://tree.taiga.io/project/penpot/issue/5102)
- Picking a gradient color in recent colors for a new color in the assets tab crashes Penpot [Taiga #5601](https://tree.taiga.io/project/penpot/issue/5601)
- Thumbnails not loading [Taiga #6012](https://tree.taiga.io/project/penpot/issue/6012)
- Don't show signup link/form when registration is disabled. [Taiga #1196](https://tree.taiga.io/project/penpot/issue/1196)
- Registration Page UI UX issue with small resolutions [Taiga #1693](https://tree.taiga.io/project/penpot/issue/1693)
- [LOGIN] "E-Mail-Adress" input field is set to type 'text' instead of 'eMail [Taiga #1921](https://tree.taiga.io/project/penpot/issue/1921)
- Handling correctly slashes "/" in emails [Taiga #4906](https://tree.taiga.io/project/penpot/issue/4906)
- Tab character in texts crashes the app [Taiga #4418](https://tree.taiga.io/project/penpot/issue/4418)
- Text does not match export [Taiga #4129](https://tree.taiga.io/project/penpot/issue/4129)
- Scrollbars cover the layers carets [Taiga #4431](https://tree.taiga.io/project/penpot/issue/4431)
- Horizontal ruler disappear when overlapping a board [Taiga #4138](https://tree.taiga.io/project/penpot/issue/4138)
- Resize shape + Alt key is not working [Taiga #3447](https://tree.taiga.io/project/penpot/issue/3447)
- Libraries images broken on premise [Taiga #4573](https://tree.taiga.io/project/penpot/issue/4573)
- [VIEWER] Cannot scroll down in code </> mode [Taiga #4655](https://tree.taiga.io/project/penpot/issue/4655)
- Strange cursor behavior after clicking viewport with text tool [Taiga #4363](https://tree.taiga.io/project/penpot/issue/4363)
- Selected color affects all of them [Taiga #5285](https://tree.taiga.io/project/penpot/issue/5285)
- Fix problem with shadow negative spread [Github #3421](https://github.com/penpot/penpot/issues/3421)
- Fix problem with linked colors to strokes [Github #3522](https://github.com/penpot/penpot/issues/3522)
- Fix problem with hand tool stuck [Github #3318](https://github.com/penpot/penpot/issues/3318)
- Fix problem with fix scrolling on nested elements [Github #3508](https://github.com/penpot/penpot/issues/3508)
- Fix problem when changing typography assets [Github #3683](https://github.com/penpot/penpot/issues/3683)
- Internal error when you copy and paste some main components between files [Taiga #7397](https://tree.taiga.io/project/penpot/issue/7397)
- Fix toolbar disappearing [Taiga #7411](https://tree.taiga.io/project/penpot/issue/7411)
- Fix long text on tab breaks UI [Taiga Issue #7421](https://tree.taiga.io/project/penpot/issue/7421)
## 1.19.5
### :bug: New features
- Fix problem with alignment performance
## 1.19.4
### :sparkles: New features
- Improve selected colors [Taiga #5805]( https://tree.taiga.io/project/penpot/us/5805)
### :bug: Bugs fixed
- Fix problem with z-index field in non-absolute items
## 1.19.3
### :sparkles: New features
- Remember last color mode in colorpicker [Taiga #5508](https://tree.taiga.io/project/penpot/issue/5508)
- Improve layers multiselection behaviour [Github #5741](https://github.com/penpot/penpot/issues/5741)
- Remember last active team across logouts / sessions [Github #3325](https://github.com/penpot/penpot/issues/3325)
### :bug: Bugs fixed
- List view is discarded on tab change on Workspace Assets Sidebar tab [Github #3547](https://github.com/penpot/penpot/issues/3547)
- Fix message popup remains open when exiting workspace with browser back button [Taiga #5747](https://tree.taiga.io/project/penpot/issue/5747)
- When editing text if font is changed, the proportions of the rendered shape are wrong [Taiga #5786](https://tree.taiga.io/project/penpot/issue/5786)
## 1.19.2
### :sparkles: New features
- Navigate up in layer hierarchy with Shift+Enter shortcut [Taiga #5734](https://tree.taiga.io/project/penpot/us/5734)
- Click on the flow tags open viewer with the selected frame [Taiga #5044](https://tree.taiga.io/project/penpot/us/5044)
- Add Dutch language & update translation files with weblate
### :bug: Bugs fixed
- Fix unexpected output on get-page rpc method when invalid object-id is provided [Github #3546](https://github.com/penpot/penpot/issues/3546)
- Fix Invalid files amount after moving file from Project to Drafts [Taiga #5638](https://tree.taiga.io/project/penpot/us/5638)
- Fix deleted pages comments shown in right sidebar [Taiga #5648](https://tree.taiga.io/project/penpot/us/5648)
- Fix tooltip on toggle visibility and toggle lock buttons [Taiga #5141](https://tree.taiga.io/project/penpot/issue/5141)
## 1.19.1
### :bug: Bugs fixed
- Fix components not registered as updated [Taiga #5725](https://tree.taiga.io/project/penpot/issue/5725)
## 1.19.0
### :boom: Breaking changes & Deprecations
### :sparkles: New features
- Default naming of text layers [Taiga #2836](https://tree.taiga.io/project/penpot/us/2836)
- Create typography style from a selected text layer [Taiga #3041](https://tree.taiga.io/project/penpot/us/3041)
- Board as ruler origin [Taiga #4833](https://tree.taiga.io/project/penpot/us/4833)
- Access tokens support [Taiga #4460](https://tree.taiga.io/project/penpot/us/4460)
- Show interactions setting at the view mode [Taiga #1330](https://tree.taiga.io/project/penpot/issue/1330)
- Improve dashboard performance related to thumbnails; now the thumbnails are
rendered as bitmap images.
- Add the ability to disable google fonts provider with the `disable-google-fonts-provider` flag
- Add the ability to disable dashboard templates section with the `disable-dashboard-templates-section` flag
- Add the ability to use the registration whitelist with OICD [Github #3348](https://github.com/penpot/penpot/issues/3348)
- Add support for local caching of google fonts (this avoids exposing the final user IP to
goolge and reduces the amount of request sent to google)
- Set smooth/instant autoscroll depending on distance [GitHub #3377](https://github.com/penpot/penpot/issues/3377)
- New component icon [Taiga #5290](https://tree.taiga.io/project/penpot/us/5290)
- Show a confirmation dialog when an user tries to publish an empty library [Taiga #5294](https://tree.taiga.io/project/penpot/us/5294)
### :bug: Bugs fixed
- Fix files can be opened from multiple urls [Taiga #5310](https://tree.taiga.io/project/penpot/issue/5310)
- Fix asset color item was created from the selected layer [Taiga #5180](https://tree.taiga.io/project/penpot/issue/5180)
- Fix unpublish more than one library at the same time [Taiga #5532](https://tree.taiga.io/project/penpot/issue/5532)
- Fix drag projects on dahsboard [Taiga #5531](https://tree.taiga.io/project/penpot/issue/5531)
- Fix allow team name to be all blank [Taiga #5527](https://tree.taiga.io/project/penpot/issue/5527)
- Fix search font visualitation [Taiga #5523](https://tree.taiga.io/project/penpot/issue/5523)
- Fix create and account only with spaces [Taiga #5518](https://tree.taiga.io/project/penpot/issue/5518)
- Fix context menu outside screen [Taiga #5524](https://tree.taiga.io/project/penpot/issue/5524)
- Fix graphic item rename on assets pannel [Taiga #5556](https://tree.taiga.io/project/penpot/issue/5556)
- Fix component and media name validation on assets panel [Taiga #5555](https://tree.taiga.io/project/penpot/issue/5555)
- Fix problem with selection shortcuts [Taiga #5492](https://tree.taiga.io/project/penpot/issue/5492)
- Fix issue with paths line to curve and concurrent editing [Taiga #5191](https://tree.taiga.io/project/penpot/issue/5191)
- Fix problems with locked layers [Taiga #5139](https://tree.taiga.io/project/penpot/issue/5139)
- Fix export from shared prototype [Taiga #5565](https://tree.taiga.io/project/penpot/issue/5565)
- Fix email change: validation error displaying even after both fields are identical [Taiga #5514](https://tree.taiga.io/project/penpot/issue/5514)
- Fix scroll on viewer comment list [Taiga #5563](https://tree.taiga.io/project/penpot/issue/5563)
- Fix context menu z-index [Taiga #5561](https://tree.taiga.io/project/penpot/issue/5561)
- Fix select all checkbox on shared link config [Taiga #5566](https://tree.taiga.io/project/penpot/issue/5566)
- Fix validation on full name input on account creation [Taiga #5516](https://tree.taiga.io/project/penpot/issue/5516)
- Fix validation on team name input [Taiga #5510](https://tree.taiga.io/project/penpot/issue/5510)
- Fix incorrect uri generation issues on share-link modal [Taiga #5564](https://tree.taiga.io/project/penpot/issue/5564)
- Fix cache issues with share-links [Taiga #5559](https://tree.taiga.io/project/penpot/issue/5559)
- Makes height priority for the rows/columns grids [#2774](https://github.com/penpot/penpot/issues/2774)
- Fix problem with comments mode not staying [#3363](https://github.com/penpot/penpot/issues/3363)
- Fix problem with comments when user left the team [Taiga #5562](https://tree.taiga.io/project/penpot/issue/5562)
- Fix problem with images patterns repeating [#3372](https://github.com/penpot/penpot/issues/3372)
- Fix grid not being clipped in frames [#3365](https://github.com/penpot/penpot/issues/3365)
- Fix cut/delete text layer when while creating text [Taiga #5602](https://tree.taiga.io/project/penpot/issue/5602)
- Fix picking a gradient color in recent colors for a new color in the assets tab [Taiga #5601](https://tree.taiga.io/project/penpot/issue/5601)
- Fix problem with importation process [Taiga #5597](https://tree.taiga.io/project/penpot/issue/5597)
- Fix problem with HSV color picker [#3317](https://github.com/penpot/penpot/issues/3317)
- Fix problem with slashes in layers names for exporter [#3276](https://github.com/penpot/penpot/issues/3276)
- Fix incorrect modified data on moving files on dashboard [Taiga #5530](https://tree.taiga.io/project/penpot/issue/5530)
- Fix focus handling on comments edition [Taiga #5560](https://tree.taiga.io/project/penpot/issue/5560)
- Fix incorrect fullname use on registring user after OIDC authentication [Taiga #5517](https://tree.taiga.io/project/penpot/issue/5517)
- Fix incorrect modified-at on project after import file [Taiga #5268](https://tree.taiga.io/project/penpot/issue/5268)
- Fix incorrect message after sending invitation to already member [Taiga 5599](https://tree.taiga.io/project/penpot/issue/5599)
- Fix text decoration on button [Taiga #5301](https://tree.taiga.io/project/penpot/issue/5301)
- Fix menu order on design tab [Taiga #5195](https://tree.taiga.io/project/penpot/issue/5195)
- Fix search bar width on layer tab [Taiga #5445](https://tree.taiga.io/project/penpot/issue/5445)
- Fix border radius values with decimals [Taiga #5283](https://tree.taiga.io/project/penpot/issue/5283)
- Fix shortcuts translations not homogenized [Taiga #5141](https://tree.taiga.io/project/penpot/issue/5141)
- Fix overlay manual position in nested boards [Taiga #5135](https://tree.taiga.io/project/penpot/issue/5135)
- Fix close overlay from a nested board [Taiga #5587](https://tree.taiga.io/project/penpot/issue/5587)
- Fix overlay position when it has shadow or blur [Taiga #4752](https://tree.taiga.io/project/penpot/issue/4752)
- Fix overlay position when there are elements fixed when scrolling [Taiga #4383](https://tree.taiga.io/project/penpot/issue/4383)
- Fix problem when sliding color picker in selected-colors [#3150](https://github.com/penpot/penpot/issues/3150)
- Fix error screen on upload image error [Taiga #5608](https://tree.taiga.io/project/penpot/issue/5608)
- Fix bad frame-id for certain componentes [#3205](https://github.com/penpot/penpot/issues/3205)
- Fix paste elements at bottom of frame [Taig #5253](https://tree.taiga.io/project/penpot/issue/5253)
- Fix new-file button on project not redirecting to the new file [Taiga #5610](https://tree.taiga.io/project/penpot/issue/5610)
- Fix retrieve user comments in dashboard [Taiga #5607](https://tree.taiga.io/project/penpot/issue/5607)
- Locks shapes when moved inside a locked parent [Taiga #5252](https://tree.taiga.io/project/penpot/issue/5252)
- Fix rotate several elements in bulk [Taiga #5165](https://tree.taiga.io/project/penpot/issue/5165)
- Fix onboarding slides height [Taiga #5373](https://tree.taiga.io/project/penpot/issue/5373)
- Fix create typography with section closed [Taiga #5574](https://tree.taiga.io/project/penpot/issue/5574)
- Fix exports menu on viewer mode [Taiga #5568](https://tree.taiga.io/project/penpot/issue/5568)
- Fix create empty comments [Taiga #5536](https://tree.taiga.io/project/penpot/issue/5536)
- Fix text changes not propagated to copy [Taiga #5364](https://tree.taiga.io/project/penpot/issue/5364)
- Fix position of text cursor is a bit too high in Invitations section [Taiga #5511](https://tree.taiga.io/project/penpot/issue/5511)
- Fix undo when updating several texts [Taiga #5197](https://tree.taiga.io/project/penpot/issue/5197)
- Fix assets right click button for multiple selection [Taiga #5545](https://tree.taiga.io/project/penpot/issue/5545)
- Fix problem with precision in resizes [Taiga #5623](https://tree.taiga.io/project/penpot/issue/5623)
- Fix absolute positioned layouts not showing flex properties [Taiga #5630](https://tree.taiga.io/project/penpot/issue/5630)
- Fix text gradient handlers [Taiga #4047](https://tree.taiga.io/project/penpot/issue/4047)
- Fix when user deletes one file during import it is impossible to finish importing of second file [Taiga #5656](https://tree.taiga.io/project/penpot/issue/5656)
- Fix export multiple images when only one of them has export settings [Taiga #5649](https://tree.taiga.io/project/penpot/issue/5649)
- Fix error when a user different than the thread creator edits a comment [Taiga #5647](https://tree.taiga.io/project/penpot/issue/5647)
- Fix unnecessary button [Taiga #3312](https://tree.taiga.io/project/penpot/issue/3312)
- Fix copy color information in several formats [Taiga #4723](https://tree.taiga.io/project/penpot/issue/4723)
- Fix dropdown width [Taiga #5541](https://tree.taiga.io/project/penpot/issue/5541)
- Fix enable comment mode and insert image keeps on comment mode [Taiga #5678](https://tree.taiga.io/project/penpot/issue/5678)
- Fix enable undo just after using pencil [Taiga #5674](https://tree.taiga.io/project/penpot/issue/5674)
- Fix 400 error when user changes password [Taiga #5643](https://tree.taiga.io/project/penpot/issue/5643)
- Fix cannot undo layer styles [Taiga #5676](https://tree.taiga.io/project/penpot/issue/5676)
- Fix unexpected exception on boolean shapes [Taiga #5685](https://tree.taiga.io/project/penpot/issue/5685)
- Fix ctrl+z on select not working [Taiga #5677](https://tree.taiga.io/project/penpot/issue/5677)
- Fix thubmnail rendering flashing [Taiga #5675](https://tree.taiga.io/project/penpot/issue/5675)
### :arrow_up: Deps updates
- Update google fonts catalog (at 2023/07/06) [Taiga #5592](https://tree.taiga.io/project/penpot/issue/5592)
### :heart: Community contributions by (Thank you!)
- Update Typography palette order (by @akshay-gupta7) [Github #3156](https://github.com/penpot/penpot/pull/3156)
- Palettes (color, typographies) empty state (by @akshay-gupta7) [Github #3160](https://github.com/penpot/penpot/pull/3160)
- Duplicate objects via drag + alt (by @akshay-gupta7) [Github #3147](https://github.com/penpot/penpot/pull/3147)
- Set line-height to auto as 1.2 (by @akshay-gupta7) [Github #3185](https://github.com/penpot/penpot/pull/3185)
- Click to select full values at the design sidebar (by @akshay-gupta7) [Github #3179](https://github.com/penpot/penpot/pull/3179)
- Fix rect filter bounds math (by @ryanbreen) [Github #3180](https://github.com/penpot/penpot/pull/3180)
- Removed sizing variables from radius (by @ondrejkonec) [Github #3184](https://github.com/penpot/penpot/pull/3184)
- Dashboard search, set focus after shortcut (by @akshay-gupta7) [Github #3196](https://github.com/penpot/penpot/pull/3196)
- Library name dropdown arrow is overlapped by library name (by @ondrejkonec) [Taiga #5200](https://tree.taiga.io/project/penpot/issue/5200)
- Reorder shadows (by @akshay-gupta7) [Github #3236](https://github.com/penpot/penpot/pull/3236)
- Open project in new tab from workspace (by @akshay-gupta7) [Github #3246](https://github.com/penpot/penpot/pull/3246)
- Distribute fix enabled when two elements were selected (by @dfelinto) [Github #3266](https://github.com/penpot/penpot/pull/3266)
- Distribute vertical spacing failing for overlapped text (by @dfelinto) [Github #3267](https://github.com/penpot/penpot/pull/3267)
- bug Change independent corner radius input tooltips #3332 (by @astudentinearth) [Github #3332](https://github.com/penpot/penpot/pull/3332)
## 1.18.6
### :bug: Bugs fixed
- Fix comments navigation from workspace [Taiga #5504](https://tree.taiga.io/project/penpot/issue/5504)
### :sparkles: Enhancements
- Add the ability to overwrite internal resolver with `PENPOT_INTERNAL_RESOLVER` environment
variable [GH #3310](https://github.com/penpot/penpot/issues/3310)
## 1.18.5
### :bug: Bugs fixed
- Fix add flow option in contextual menu for frames
- Fix issues related with invitations
- Fix problem with undefined gaps
- Add deleted fonts auto match mechanism
## 1.18.4
### :bug: Bugs fixed
- Fix zooming while color picker breaks UI [GH #3214](https://github.com/penpot/penpot/issues/3214)
- Fix problem with layout not reflowing on shape deletion [Taiga #5289](https://tree.taiga.io/project/penpot/issue/5289)
- Fix extra long typography names on assets and palette [Taiga #5199](https://tree.taiga.io/project/penpot/issue/5199)
- Fix background-color property on inspect code [Taiga #5300](https://tree.taiga.io/project/penpot/issue/5300)
- Preview layer blend modes (by @akshay-gupta7) [Github #3235](https://github.com/penpot/penpot/pull/3235)
## 1.18.3
### :bug: Bugs fixed
- Fix problem with rulers not placing correctly [Taiga #5093](https://tree.taiga.io/project/penpot/issue/5093)
- Fix page context menu [Taiga #5145](https://tree.taiga.io/project/penpot/issue/5145)
- Fix project file count [Taiga #5148](https://tree.taiga.io/project/penpot/issue/5148)
- Fix OIDC roles checking mechanism [GH #3152](https://github.com/penpot/penpot/issues/3152)
- Import updated translation strings from weblate
### :arrow_up: Deps updates
## 1.18.2
### :bug: Bugs fixed
- Fix problem with frame title rotation
- Fix first level board "Show in view mode" is automatically unchecked [Taiga #5136](https://tree.taiga.io/project/penpot/issue/5136)
## 1.18.1
### :bug: Bugs fixed
- Fix problems with imported SVG shadows [Taiga #4922](https://tree.taiga.io/project/penpot/issue/4922)
- Fix problems with imported SVG embedded images and transforms [Taiga #4639](https://tree.taiga.io/project/penpot/issue/4639)
## 1.18.0
### :sparkles: New features
- Adds more accessibility improvements in dashboard [Taiga #4577](https://tree.taiga.io/project/penpot/us/4577)
- Adds paddings and gaps prediction on layout creation [Taiga #4838](https://tree.taiga.io/project/penpot/task/4838)
- Add visual feedback when proportionally scaling text elements with **K** [Taiga #3415](https://tree.taiga.io/project/penpot/us/3415)
- Add visualization and mouse control to paddings, margins and gaps in frames with layout [Taiga #4839](https://tree.taiga.io/project/penpot/task/4839)
- Allow for absolute positioned elements inside layout [Taiga #4834](https://tree.taiga.io/project/penpot/us/4834)
- Add z-index option for flex layout items [Taiga #2980](https://tree.taiga.io/project/penpot/us/2980)
- Scale content proportionally affects strokes, shadows, blurs and corners [Taiga #1951](https://tree.taiga.io/project/penpot/us/1951)
- Use tabulators to navigate layers [Taiga #5010](https://tree.taiga.io/project/penpot/issue/5010)
### :bug: Bugs fixed
- Fix problem with rules position on changing pages [Taiga #4847](https://tree.taiga.io/project/penpot/issue/4847)
- Fix error streen when uploading wrong SVG [#2995](https://github.com/penpot/penpot/issues/2995)
- Fix selecting children from hidden parent layers [Taiga #4934](https://tree.taiga.io/project/penpot/issue/4934)
- Fix problem when undoing multiple selected colors [Taiga #4920](https://tree.taiga.io/project/penpot/issue/4920)
- Allow selection of empty board by partial rect [Taiga #4806](https://tree.taiga.io/project/penpot/issue/4806)
- Improve behavior for undo on text edition [Taiga #4693](https://tree.taiga.io/project/penpot/issue/4693)
- Improve deeps selection of nested arboards [Taiga #4913](https://tree.taiga.io/project/penpot/issue/4913)
- Fix problem on selection numeric inputs on Firefox [#2991](https://github.com/penpot/penpot/issues/2991)
- Changed the text dominant-baseline to use ideographic [Taiga #4791](https://tree.taiga.io/project/penpot/issue/4791)
- Viewer wrong translations [Github #3035](https://github.com/penpot/penpot/issues/3035)
- Fix problem with text editor in Safari
- Fix unlink library color when blur color picker input [#3026](https://github.com/penpot/penpot/issues/3026)
- Fix snap pixel when moving path points on high zoom [#2930](https://github.com/penpot/penpot/issues/2930)
- Fix shortcuts for zoom now take into account the mouse position [#2924](https://github.com/penpot/penpot/issues/2924)
- Fix close colorpicker on Firefox when mouse-up is outside the picker [#2911](https://github.com/penpot/penpot/issues/2911)
- Fix problems with touch devices and Wacom tablets [#2216](https://github.com/penpot/penpot/issues/2216)
- Fix problem with board titles misplaced [Taiga #4738](https://tree.taiga.io/project/penpot/issue/4738)
- Fix problem with alt getting stuck when alt+tab [Taiga #5013](https://tree.taiga.io/project/penpot/issue/5013)
- Fix problem with z positioning of elements [Taiga #5014](https://tree.taiga.io/project/penpot/issue/5014)
- Fix problem in Firefox with scroll jumping when changin pages [#3052](https://github.com/penpot/penpot/issues/3052)
- Fix nested frame interaction created flow in wrong frame [Taiga #5043](https://tree.taiga.io/project/penpot/issue/5043)
- Font-Kerning does not work on Artboard Export to PNG/JPG/PDF [#3029](https://github.com/penpot/penpot/issues/3029)
- Fix manipulate duplicated project (delete, duplicate, rename, pin/unpin...) [Taiga #5027](https://tree.taiga.io/project/penpot/issue/5027)
- Fix deleted files appear in search results [Taiga #5002](https://tree.taiga.io/project/penpot/issue/5002)
- Fix problem with selected colors and texts [Taiga #5051](https://tree.taiga.io/project/penpot/issue/5051)
- Fix problem when assigning color from palette or assets [Taiga #5050](https://tree.taiga.io/project/penpot/issue/5050)
- Fix shortcuts for alignment [Taiga #5030](https://tree.taiga.io/project/penpot/issue/5030)
- Fix path options not showing when editing rects or ellipses [Taiga #5053](https://tree.taiga.io/project/penpot/issue/5053)
- Fix tooltips for some alignment options are truncated on design tab [Taiga #5040](https://tree.taiga.io/project/penpot/issue/5040)
- Fix horizontal margins drag don't always start from place [Taiga #5020](https://tree.taiga.io/project/penpot/issue/5020)
- Fix multiplayer username sometimes is not displayed correctly [Taiga #4400](https://tree.taiga.io/project/penpot/issue/4400)
- Show warning when trying to invite a user that is already in members [Taiga #4147](https://tree.taiga.io/project/penpot/issue/4147)
- Fix problem with text out of borders when changing from auto-width to fixed [Taiga #4308](https://tree.taiga.io/project/penpot/issue/4308)
- Fix header not showing when exiting fullscreen mode in viewer [Taiga #4244](https://tree.taiga.io/project/penpot/issue/4244)
- Fix visual problem in select options [Taiga #5028](https://tree.taiga.io/project/penpot/issue/5028)
- Forbid empty names for assets [Taiga #5056](https://tree.taiga.io/project/penpot/issue/5056)
- Select children after ungroup action [Taiga #4917](https://tree.taiga.io/project/penpot/issue/4917)
- Fix problem with guides not showing when moving over nested frames [Taiga #4905](https://tree.taiga.io/project/penpot/issue/4905)
- Fix change email and password for users signed in via social login [Taiga #4273](https://tree.taiga.io/project/penpot/issue/4273)
- Fix drag and drop files from browser or file explorer under circumstances [Taiga #5054](https://tree.taiga.io/project/penpot/issue/5054)
- Fix problem when copy/pasting shapes [Taiga #4931](https://tree.taiga.io/project/penpot/issue/4931)
- Fix problem with color picker not able to change hue [Taiga #5065](https://tree.taiga.io/project/penpot/issue/5065)
- Fix problem with outer stroke in texts [Taiga #5078](https://tree.taiga.io/project/penpot/issue/5078)
- Fix problem with text carring over next line when changing to fixed [Taiga #5067](https://tree.taiga.io/project/penpot/issue/5067)
- Fix don't show invite user hero to users with editor role [Taiga #5086](https://tree.taiga.io/project/penpot/issue/5086)
- Fix enter emails on onboarding new user creating team [Taiga #5089](https://tree.taiga.io/project/penpot/issue/5089)
- Fix invalid files amount after moving on dashboard [Taiga #5080](https://tree.taiga.io/project/penpot/issue/5080)
- Fix dashboard left sidebar, the [x] overlaps the field [Taiga #5064](https://tree.taiga.io/project/penpot/issue/5064)
- Fix expanded typography on assets sidebar is moving [Taiga #5063](https://tree.taiga.io/project/penpot/issue/5063)
- Fix spelling mistake in confirmation after importing only 1 file [Taiga #5095](https://tree.taiga.io/project/penpot/issue/5095)
- Fix problem with selection colors and texts [Taiga #5079](https://tree.taiga.io/project/penpot/issue/5079)
- Remove "show in view mode" flag when moving frame to frame [Taiga #5091](https://tree.taiga.io/project/penpot/issue/5091)
- Fix problem creating files in project page [Taiga #5060](https://tree.taiga.io/project/penpot/issue/5060)
- Disable empty names on rename files [Taiga #5088](https://tree.taiga.io/project/penpot/issue/5088)
- Fix problem with SVG and flex layout [Taiga #](https://tree.taiga.io/project/penpot/issue/5099)
- Fix unpublish and delete shared library warning messages [Taiga #5090](https://tree.taiga.io/project/penpot/issue/5090)
- Fix last update project timer update after creating new file [Taiga #5096](https://tree.taiga.io/project/penpot/issue/5096)
- Fix dashboard scrolling using 'Page Up' and 'Page Down' [Taiga #5081](https://tree.taiga.io/project/penpot/issue/5081)
- Fix view mode header buttons overlapping in small resolutions [Taiga #5058](https://tree.taiga.io/project/penpot/issue/5058)
- Fix precision for wrap in flex [Taiga #5072](https://tree.taiga.io/project/penpot/issue/5072)
- Fix relative position overlay positioning [Taiga #5092](https://tree.taiga.io/project/penpot/issue/5092)
- Fix hide grid keyboard shortcut [Github #3071](https://github.com/penpot/penpot/pull/3071)
- Fix problem with opacity in imported SVG's [Taiga #4923](https://tree.taiga.io/project/penpot/issue/4923)
### :heart: Community contributions by (Thank you!)
- To @ondrejkonec: for contributing to the code with:
- Refactor CSS variables [Github #2948](https://github.com/penpot/penpot/pull/2948)
## 1.17.3
### :bug: Bugs fixed
- Fix copy and paste very nested inside itself [Taiga #4848](https://tree.taiga.io/project/penpot/issue/4848)
- Fix custom fonts not rendered correctly [Taiga #4874](https://tree.taiga.io/project/penpot/issue/4874)
- Fix problem with shadows and blur on multiple selection
- Fix problem with redo shortcut
- Fix Component texts not displayed in assets panel [Taiga #4907](https://tree.taiga.io/project/penpot/issue/4907)
- Fix search field has implemented shared styles for "close icon" and "search icon" [Taiga #4927](https://tree.taiga.io/project/penpot/issue/4927)
- Fix Handling correctly slashes "/" in emails [Taiga #4906](https://tree.taiga.io/project/penpot/issue/4906)
- Fix Change text color from selected colors [Taiga #4933](https://tree.taiga.io/project/penpot/issue/4933)
### :sparkles: Enhancements
- Adds environment variables for specifying the export and backend URI for the frontend docker image, thanks to @Supernova3339 for the initial PR and suggestion [Github #2984](https://github.com/penpot/penpot/issues/2984)
## 1.17.2
### :bug: Bugs fixed
- Fix invite members button text [Taiga #4794](https://tree.taiga.io/project/penpot/issue/4794)
- Fix problem with opacity in frames [Taiga #4795](https://tree.taiga.io/project/penpot/issue/4795)
- Fix correct behaviour for space-around and added space-evenly option
- Fix duplicate with alt and undo only undo one step [Taiga #4746](https://tree.taiga.io/project/penpot/issue/4746)
- Fix problem creating frames inside layout [Taiga #4844](https://tree.taiga.io/project/penpot/issue/4844)
- Fix paste board inside itself [Taiga #4775](https://tree.taiga.io/project/penpot/issue/4775)
- Fix middle button panning can drag guides [Taiga #4266](https://tree.taiga.io/project/penpot/issue/4266)
### :heart: Community contributions by (Thank you!)
- To @ondrejkonec: for some code contributions on this release.
## 1.17.1
### :bug: Bugs fixed
- Fix components groups items show the component name in list mode [Taiga #4770](https://tree.taiga.io/project/penpot/issue/4770)
- Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor [Taiga #4778](https://tree.taiga.io/project/penpot/issue/4778)
- Fix white space on small screens [Taiga #4774](https://tree.taiga.io/project/penpot/issue/4774)
- Fix button spacing on delete acount modal [Taiga #4762](https://tree.taiga.io/project/penpot/issue/4762)
- Fix invitations input on team management and onboarding modal [Taiga #4760](https://tree.taiga.io/project/penpot/issue/4760)
- Fix weird numeration creating new elements in dashboard [Taiga #4755](https://tree.taiga.io/project/penpot/issue/4755)
- Fix can move shape with lens zoom active [Taiga #4787](https://tree.taiga.io/project/penpot/issue/4787)
- Fix social links broken [Taiga #4759](https://tree.taiga.io/project/penpot/issue/4759)
- Fix tooltips on left toolbar [Taiga #4793](https://tree.taiga.io/project/penpot/issue/4793)
## 1.17.0
### :sparkles: New features

View File

@@ -101,14 +101,14 @@ Each commit should have:
Examples of good commit messages:
- :bug: Fix unexpected error on launching modal
- :bug: Set proper error message on generic error
- :sparkles: Enable new modal for profile
- :zap: Improve performance of dashboard navigation
- :wrench: Update default backend configuration
- :books: Add more documentation for authentication process
- :ambulance: Fix critical bug on user registration process
- :tada: Add new approach for user registration
- `:bug: Fix unexpected error on launching modal`
- `:bug: Set proper error message on generic error`
- `:sparkles: Enable new modal for profile`
- `:zap: Improve performance of dashboard navigation`
- `:wrench: Update default backend configuration`
- `:books: Add more documentation for authentication process`
- `:ambulance: Fix critical bug on user registration process`
- `:tada: Add new approach for user registration`
## Code of conduct ##

View File

@@ -4,7 +4,7 @@
<h1 align="center">
<br>
<img src="https://penpot.app/images/readme/readme-logo.jpg" alt="PENPOT">
<img src="https://penpot.app/images/readme/git-readme-header.png" alt="PENPOT">
</h1>
<p align="center"><a href="https://www.mozilla.org/en-US/MPL/2.0" rel="nofollow"><img src="https://camo.githubusercontent.com/3fcf3d6b678ea15fde3cf7d6af0e242160366282d62a7c182d83a50bfee3f45e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d504c2d322e302d626c75652e737667" alt="License: MPL-2.0" data-canonical-src="https://img.shields.io/badge/MPL-2.0-blue.svg" style="max-width:100%;"></a>
@@ -26,6 +26,8 @@
![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif)
🎇 **Penpot Fest exceeded all expectations - it was a complete success!** 🎇 Penpot Fest is our first Design event that brought designers and developers from the Open Source communities and beyond. Watch the replay of the talks on our [Youtube channel](https://www.youtube.com/playlist?list=PLgcCPfOv5v56-fghJo2dHNBqL9zlDTslh) or [Peertube channel](https://peertube.kaleidos.net/w/p/1tWgyJTt8sKbWwCEcBimZW)
Penpot is the first **Open Source** design and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open standards (SVG). Penpot invites designers all over the world to fall in love with open source while getting developers excited about the design process in return.
## Table of contents ##
@@ -50,7 +52,7 @@ Being web based, Penpot is not dependent on operating systems or local installat
Using SVG as no other design and prototyping tool does, Penpot files sport compatibility with most of the vectorial tools, are tech friendly and extremely easy to use on the web. We make sure you will always own your work.
<p align="center">
<img src="https://penpot.app/images/open-source.png" alt="Open Source">
<img src="https://penpot.app/images/readme/git-open.png" alt="Open Source" style="width: 65%;">
</p>
@@ -74,7 +76,7 @@ Heres a step-by-step guide on [getting started with Docker.](https://help.pen
If you prefer not to install Penpot in a local environment, [login or register on our Penpot cloud app](https://design.penpot.app). Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** on your own.
<p align="center">
<img src="https://help.penpot.app/img/home-techguide.png" alt="Getting started">
<img src="https://penpot.app/images/readme/git-self-host.png" alt="Getting started" style="width: 65%;">
</p>
## Community ##
@@ -93,7 +95,7 @@ You will find the following categories:
- [Penpot in your language](https://community.penpot.app/c/penpot-in-your-language/12)
<p align="center">
<img src="https://penpot.app/images/cross-teams.webp" alt="Community">
<img src="https://penpot.app/images/readme/git-collaborate.png" alt="Communnity" style="width: 65%;">
</p>
## Contributing ##
@@ -107,11 +109,12 @@ Every sort of contribution will be very helpful to enhance Penpot. How youll
- Create and [share Libraries & templates](https://penpot.app/libraries-templates.html) that will be helpful for the community
- Become a [translator](https://help.penpot.app/contributing-guide/translations)
- Give feedback: [Mail us](mailto:support@penpot.app)
- **Contribute to Penpot's code:** [Watch this video](https://www.youtube.com/watch?v=TpN0osiY-8k) by Alejandro Alonso, CIO and developer at Penpot, where he gives us a hands-on demo of how to use Penpots repository and make changes in both front and back end
To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing-guide](https://help.penpot.app/contributing-guide/).
<p align="center">
<img src="https://help.penpot.app/img/home-contributing.png" alt="Contributing">
<img src="https://penpot.app/images/readme/git-community.png" alt="Contributing" style="width: 65%;">
</p>
## Resources ##
@@ -124,7 +127,7 @@ You can ask and answer questions, have open-ended conversations, and follow alon
✏️ [Tutorials](https://www.youtube.com/playlist?list=PLgcCPfOv5v54WpXhHmNO7T-YC7AE-SRsr)
🏘️ [Architecture](https://help.penpot.app/technical-guide/architecture/)
🏘️ [Architecture](https://help.penpot.app/technical-guide/developer/architecture/)
📚 [Dev Diaries](https://penpot.app/dev-diaries.html)

View File

@@ -5,24 +5,25 @@ We want to thank to the amazing people that help us! Thank you! You're the best!
## Security
* Husnain Iqbal (CEO OF ALPHA INFERNO PVT LTD)
* [Shiraz Ali Khan](https://www.linkedin.com/in/shiraz-ali-khan-1ba508180/)
* Vaibhav Shukla
## Internationalization
* [00ff88](https://hosted.weblate.org/user/00ff88)
* [AhmadHB](https://hosted.weblate.org/user/AhmadHB)
* [Aimee](https://hosted.weblate.org/user/Aimee)
* [alejandro.alonso](alejandro.https://hosted.weblate.org/user/alonso)
* [alejandro.alonso](https://hosted.weblate.org/user/alejandro.alonso)
* [alexpawlak](https://hosted.weblate.org/user/alexpawlak)
* [allytiago](https://hosted.weblate.org/user/allytiago)
* [alonso.torres](alonso.https://hosted.weblate.org/user/torres)
* [andres.moya](andres.https://hosted.weblate.org/user/moya)
* [alonso.torres](https://hosted.weblate.org/user/alonso.torres)
* [andres.moya](https://hosted.weblate.org/user/andres.moya)
* [antoniofsm](https://hosted.weblate.org/user/antoniofsm)
* [ascarida](https://hosted.weblate.org/user/ascarida)
* [Bechii](https://hosted.weblate.org/user/Bechii)
* [Beeby](https://hosted.weblate.org/user/Beeby)
* [bingling-sama](bingling-https://hosted.weblate.org/user/sama)
* [bingling-sama](https://hosted.weblate.org/user/bingling-sama)
* [devadarta](https://hosted.weblate.org/user/devadarta)
* [diacritica](https://hosted.weblate.org/user/diacritica)
* [dundzys.vincas](dundzys.https://hosted.weblate.org/user/vincas)
* [dundzys.vincas](https://hosted.weblate.org/user/dundzys.vincas)
* [Eranot](https://hosted.weblate.org/user/Eranot)
* [erral](https://hosted.weblate.org/user/erral)
* [ersen](https://hosted.weblate.org/user/ersen)

7
backend/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

View File

@@ -16,16 +16,11 @@
{:src-dirs ["src" "resources"]
:target-dir class-dir})
(b/compile-clj
{:basis basis
:src-dirs ["src"]
:class-dir class-dir})
(b/uber
{:class-dir class-dir
:uber-file jar-file
:main 'clojure.main
:exclude [#"goog.*" #"^javasist.*"]
:exclude [#".*Log4j2Plugins\.dat$"]
:basis basis}))
(defn compile [_]

View File

@@ -1,13 +1,12 @@
{:deps
{:mvn/repos
{"sonatype" {:url "https://oss.sonatype.org/content/repositories/snapshots/"}}
:deps
{penpot/common {:local/root "../common"}
org.clojure/clojure {:mvn/version "1.11.1"}
org.clojure/core.async {:mvn/version "1.6.673"}
org.clojure/clojure {:mvn/version "1.12.0-alpha5"}
org.clojure/tools.namespace {:mvn/version "1.4.4"}
;; Logging
org.zeromq/jeromq {:mvn/version "0.5.3"}
com.github.luben/zstd-jni {:mvn/version "1.5.2-5"}
org.clojure/data.fressian {:mvn/version "1.0.0"}
com.github.luben/zstd-jni {:mvn/version "1.5.5-11"}
io.prometheus/simpleclient {:mvn/version "0.16.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}
@@ -18,28 +17,33 @@
io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"}
io.lettuce/lettuce-core {:mvn/version "6.2.2.RELEASE"}
io.lettuce/lettuce-core {:mvn/version "6.3.0.RELEASE"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
funcool/yetti
{:git/tag "v9.12"
:git/sha "51646d8"
{:git/tag "v10.0"
:git/sha "520613f"
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.847"}
metosin/reitit-core {:mvn/version "0.5.18"}
org.postgresql/postgresql {:mvn/version "42.5.1"}
com.zaxxer/HikariCP {:mvn/version "5.0.1"}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.909"}
metosin/reitit-core {:mvn/version "0.6.0"}
nrepl/nrepl {:mvn/version "1.1.0"}
cider/cider-nrepl {:mvn/version "0.44.0"}
org.postgresql/postgresql {:mvn/version "42.7.1"}
org.xerial/sqlite-jdbc {:mvn/version "3.44.1.0"}
com.zaxxer/HikariCP {:mvn/version "5.1.0"}
io.whitfin/siphash {:mvn/version "2.0.0"}
buddy/buddy-hashers {:mvn/version "1.8.158"}
buddy/buddy-sign {:mvn/version "3.4.333"}
buddy/buddy-hashers {:mvn/version "2.0.167"}
buddy/buddy-sign {:mvn/version "3.5.351"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.2"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.8"}
org.jsoup/jsoup {:mvn/version "1.15.3"}
org.jsoup/jsoup {:mvn/version "1.17.2"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
@@ -48,14 +52,13 @@
org.lz4/lz4-java {:mvn/version "1.8.0"}
org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"}
integrant/integrant {:mvn/version "0.8.0"}
dawran6/emoji {:mvn/version "0.1.5"}
markdown-clj/markdown-clj {:mvn/version "1.11.4"}
markdown-clj/markdown-clj {:mvn/version "1.11.7"}
;; Pretty Print specs
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
software.amazon.awssdk/s3 {:mvn/version "2.19.8"}
software.amazon.awssdk/s3 {:mvn/version "2.22.12"}
}
:paths ["src" "resources" "target/classes"]
@@ -63,17 +66,15 @@
{:dev
{:extra-deps
{com.bhauman/rebel-readline {:mvn/version "RELEASE"}
org.clojure/tools.namespace {:mvn/version "RELEASE"}
clojure-humanize/clojure-humanize {:mvn/version "0.2.2"}
org.clojure/data.csv {:mvn/version "RELEASE"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "RELEASE"}
mockery/mockery {:mvn/version "RELEASE"}}
:extra-paths ["test" "dev"]}
:build
{:extra-deps
{io.github.clojure/tools.build {:git/tag "v0.9.0" :git/sha "8c93e0c"}}
{io.github.clojure/tools.build {:git/tag "v0.9.5" :git/sha "24f2894"}}
:ns-default build}
:test
@@ -90,8 +91,8 @@
:jmx-remote
{:jvm-opts ["-Dcom.sun.management.jmxremote"
"-Dcom.sun.management.jmxremote.port=9090"
"-Dcom.sun.management.jmxremote.rmi.port=9090"
"-Dcom.sun.management.jmxremote.port=9091"
"-Dcom.sun.management.jmxremote.rmi.port=9091"
"-Dcom.sun.management.jmxremote.local.only=false"
"-Dcom.sun.management.jmxremote.authenticate=false"
"-Dcom.sun.management.jmxremote.ssl=false"

View File

@@ -7,20 +7,28 @@
(ns user
(:require
[app.common.data :as d]
[app.common.debug :as debug]
[app.common.exceptions :as ex]
[app.common.files.helpers :as cfh]
[app.common.fressian :as fres]
[app.common.geom.matrix :as gmt]
[app.common.logging :as l]
[app.common.perf :as perf]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.schema.desc-js-like :as smdj]
[app.common.schema.desc-native :as smdn]
[app.common.schema.generators :as sg]
[app.common.spec :as us]
[app.common.transit :as t]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[app.config :as cfg]
[app.config :as cf]
[app.db :as db]
[app.main :as main]
[app.srepl.helpers]
[app.srepl.helpers :as srepl.helpers]
[app.srepl.main :as srepl]
[app.util.blob :as blob]
[app.util.fressian :as fres]
[app.util.json :as json]
[app.util.time :as dt]
[clj-async-profiler.core :as prof]
@@ -31,18 +39,28 @@
[clojure.spec.alpha :as s]
[clojure.stacktrace :as trace]
[clojure.test :as test]
[clojure.test.check.generators :as gen]
[clojure.test.check.generators :as tgen]
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]
[criterium.core :as crit]
[cuerdas.core :as str]
[datoteka.core]
[integrant.core :as ig]))
[datoteka.fs :as fs]
[integrant.core :as ig]
[malli.core :as m]
[malli.dev.pretty :as mdp]
[malli.error :as me]
[malli.generator :as mg]
[malli.registry :as mr]
[malli.transform :as mt]
[malli.util :as mu]
[promesa.exec :as px]))
(repl/disable-reload! (find-ns 'integrant.core))
(repl/disable-reload! (find-ns 'app.common.debug))
(set! *warn-on-reflection* true)
(defonce system nil)
(add-tap #'debug/tap-handler)
;; --- Benchmarking Tools
@@ -81,20 +99,14 @@
(defn- start
[]
(try
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> (merge main/system-config main/worker-config)
(ig/prep)
(ig/init))))
(main/start)
:started
(catch Throwable cause
(ex/print-throwable cause))))
(defn- stop
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
nil))
(main/stop)
:stopped)
(defn restart
@@ -107,26 +119,29 @@
(stop)
(repl/refresh-all :after 'user/start))
(defn compression-bench
[data]
(let [humanize (fn [v] (hum/filesize v :binary true :format " %.4f "))
v1 (time (humanize (alength (blob/encode data {:version 1}))))
v3 (time (humanize (alength (blob/encode data {:version 3}))))
v4 (time (humanize (alength (blob/encode data {:version 4}))))
v5 (time (humanize (alength (blob/encode data {:version 5}))))
v6 (time (humanize (alength (blob/encode data {:version 6}))))
]
(print-table
[{
:v1 v1
:v3 v3
:v4 v4
:v5 v5
:v6 v6
}])))
;; (defn compression-bench
;; [data]
;; (let [humanize (fn [v] (hum/filesize v :binary true :format " %.4f "))
;; v1 (time (humanize (alength (blob/encode data {:version 1}))))
;; v3 (time (humanize (alength (blob/encode data {:version 3}))))
;; v4 (time (humanize (alength (blob/encode data {:version 4}))))
;; v5 (time (humanize (alength (blob/encode data {:version 5}))))
;; v6 (time (humanize (alength (blob/encode data {:version 6}))))
;; ]
;; (print-table
;; [{
;; :v1 v1
;; :v3 v3
;; :v4 v4
;; :v5 v5
;; :v6 v6
;; }])))
(defonce debug-tap
(do
(add-tap #(locking debug-tap
(prn "tap debug:" %)))
1))
(defn calculate-frames
[{:keys [data]}]
(->> (vals (:pages-index data))
(mapcat (comp vals :objects))
(filter cfh/is-direct-child-of-root?)
(filter cfh/frame-shape?)
(count)))

View File

@@ -1,18 +1,26 @@
{
"name": "uxbox-back",
"version": "0.1.0",
"description": "The Open-Source prototyping tool",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build-emails": "./scripts/build-email-templates.sh"
},
"name": "backend",
"version": "1.0.0",
"license": "MPL-2.0",
"author": "Kaleidos INC",
"private": true,
"packageManager": "yarn@4.0.2",
"repository": {
"type": "git",
"url": "git+https://github.com/uxbox/uxbox.git"
"url": "https://github.com/penpot/penpot"
},
"dependencies": {
"luxon": "^3.4.2",
"sax": "^1.2.4"
},
"author": "Uxbox",
"license": "SEE LICENSE IN <LICENSE>",
"devDependencies": {
"mjml": "^4.6.3"
"nodemon": "^3.0.1",
"source-map-support": "^0.5.21",
"ws": "^8.13.0"
},
"scripts": {
"fmt:clj:check": "cljfmt check --parallel=false src/ test/",
"fmt:clj": "cljfmt fix --parallel=true src/ test/",
"lint:clj": "clj-kondo --parallel --lint src/"
}
}

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -211,9 +211,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -225,7 +225,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -239,9 +239,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -257,9 +257,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -271,7 +271,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -285,9 +285,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -301,7 +301,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -321,7 +321,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -341,7 +341,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -361,7 +361,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -370,7 +370,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -381,7 +381,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -390,7 +390,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -401,7 +401,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -411,9 +411,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -425,7 +425,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -439,9 +439,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -457,9 +457,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -201,9 +201,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -215,7 +215,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -229,9 +229,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -247,9 +247,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -261,7 +261,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -275,9 +275,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -291,7 +291,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -311,7 +311,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -331,7 +331,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -351,7 +351,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -360,7 +360,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -371,7 +371,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -380,7 +380,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -391,7 +391,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -401,9 +401,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -415,7 +415,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -429,9 +429,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -447,9 +447,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -206,9 +206,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -220,7 +220,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -234,9 +234,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -252,9 +252,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -266,7 +266,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -280,9 +280,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -296,7 +296,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -316,7 +316,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -336,7 +336,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -356,7 +356,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -365,7 +365,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -376,7 +376,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -385,7 +385,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -396,7 +396,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -406,9 +406,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -420,7 +420,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -434,9 +434,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -452,9 +452,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -201,9 +201,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -215,7 +215,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -229,9 +229,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -247,9 +247,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -261,7 +261,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -275,9 +275,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -291,7 +291,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -311,7 +311,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -331,7 +331,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -351,7 +351,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -360,7 +360,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -371,7 +371,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -380,7 +380,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -391,7 +391,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -401,9 +401,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -415,7 +415,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -429,9 +429,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -447,9 +447,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -1,66 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>We received a request to change your current email to {{ pending-email }}.</mj-text>
<mj-text>Click to the link below to confirm the change:</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Confirm email change
</mj-button>
<mj-text>
If you received this email by mistake, please consider changing your password
for security reasons.
</mj-text>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,59 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello!</mj-text>
<mj-text>
{{invited-by}} has invited you to join the team “{{ team }}”.
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Accept invite
</mj-button>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,68 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>
We have received a request to reset your password. Click the link
below to choose a new one:
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/recovery?token={{token}}">
Reset password
</mj-button>
<mj-text>
If you received this email by mistake, you can safely ignore
it. Your password won't be changed.
</mj-text>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,65 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>
Thanks for signing up for your Penpot account! Please verify your
email using the link below and get started building mockups and
prototypes today!
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Verify email
</mj-button>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,36 +1,33 @@
[{:id "tutorial-for-beginners"
:name "Tutorial for beginners"
:thumbnail-uri "https://penpot.app/images/libraries/tutorial-for-beginners.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/tutorial-for-beginners.penpot"}
{:id "penpot-design-system"
:name "Penpot Design System"
:thumbnail-uri "https://penpot.app/images/libraries/cover-ds-penpot.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Penpot-Design-system.penpot"}
{:id "lucide-icons"
:name "Lucide Icons"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Lucide-icons.penpot"}
{:id "font-awesome"
:name "Font Awesome"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Font-Awesome.penpot"}
{:id "plants-app"
:name "Plants app"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Plants-app.penpot"}
{:id "wireframing-kit"
:name "Wireframing Kit"
:thumbnail-uri "https://penpot.app/images/libraries/cover-wireframes.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/wireframing-kit.penpot"}
{:id "ant-design"
:name "Ant Design UI Kit (lite)"
:thumbnail-uri "https://penpot.app/images/libraries/cover-ant-design.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Ant-Design-UI-Kit-Lite.penpot"}
{:id "cocomaterial"
:name "Cocomaterial"
:thumbnail-uri "https://penpot.app/images/libraries/cover-cocomaterial.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Cocomaterial.penpot"}
{:id "circum-icons"
:name "Circum Icons pack"
:thumbnail-uri "https://penpot.app/images/libraries/cover-circum.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/CircumIcons.penpot"}
{:id "coreui"
:name "CoreUI"
:thumbnail-uri "https://penpot.app/images/libraries/cover-coreui.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/main/CoreUI%20DesignSystem%20(DEMO).penpot"}
{:id "black-white-mobile-templates"
:name "Black & White Mobile Templates"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Black-White-Mobile-Templates.penpot"}
{:id "avataaars"
:name "Avataaars"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Avataaars-by-Pablo-Stanley.penpot"}
{:id "ux-notes"
:name "UX Notes"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/UX-Notes.penpot"}
{:id "whiteboarding-kit"
:name "Whiteboarding Kit"
:thumbnail-uri "https://penpot.app/images/libraries/cover-whiteboards.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Whiteboarding-mapping-kit.penpot"}
{:id "material-design-baseline"
:name "Material Design (baseline)"
:thumbnail-uri "https://penpot.app/images/libraries/cover-material.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Material-Design-Kit.penpot"}]
{:id "open-color-scheme"
:name "Open Color Scheme"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Open-Color-Scheme.penpot"}
{:id "flex-layout-playground"
:name "Flex Layout Playground"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Flex-Layout-Playground.penpot"}]

View File

@@ -1,6 +1,5 @@
<li class="rpc-item">
<div class="rpc-row-info">
{# <div class="type">{{item.type}}</div> #}
<div class="module">{{item.module}}:</div>
<div class="name">{{item.name}}</div>
<div class="tags">
@@ -15,19 +14,29 @@
<span>AUTH</span>
</span>
{% endif %}
{% if item.webhook %}
<span class="tag">
<span>WEBHOOK</span>
</span>
{% endif %}
{% if item.params-schema-js %}
<span class="tag">
<span>SCHEMA</span>
</span>
{% endif %}
{% if item.sse %}
<span class="tag">
<span>SSE</span>
</span>
{% endif %}
</div>
</div>
<div class="rpc-row-detail hidden">
<h3>DOCSTRING:</h3>
<h4>DOCSTRING:</h4>
<section class="padded-section">
{% if item.added %}
<p class="small"><strong>Added:</strong> on v{{item.added}}</p>
{% endif %}
@@ -36,13 +45,18 @@
<p class="small"><strong>Deprecated:</strong> since v{{item.deprecated}}</p>
{% endif %}
{% if item.entrypoint %}
<p class="small"><strong>URI:</strong> <a href="{{item.entrypoint}}">{{item.entrypoint}}</a></p>
{% endif %}
{% if item.docs %}
<p class="docstring"> {{item.docs}}</p>
{% endif %}
</section>
{% if item.changes %}
<h3>CHANGES:</h3>
<h4>CHANGES:</h4>
<section class="padded-section">
<ul class="changes">
@@ -53,9 +67,55 @@
</section>
{% endif %}
<h3>SPEC EXPLAIN:</h3>
<section class="padded-section">
<pre class="spec-explain">{{item.spec}}</pre>
</section>
{% if item.spec %}
<h4>PARAMS (SPEC):</h4>
<section class="padded-section">
<pre class="spec-explain">{{item.spec}}</pre>
</section>
{% endif %}
{% if param-style = "js" %}
{% if item.params-schema-js %}
<h4>PARAMS:</h4>
<section class="padded-section">
<pre class="params-schema">{{item.params-schema-js}}</pre>
</section>
{% endif %}
{% if item.result-schema-js %}
<h4>RESPONSE:</h4>
<section class="padded-section">
<pre class="result">{{item.result-schema-js}}</pre>
</section>
{% endif %}
{% if item.webhook-schema-js %}
<h4>WEBHOOK PAYLOAD:</h4>
<section class="padded-section">
<pre class="webhook">{{item.webhook-schema-js}}</pre>
</section>
{% endif %}
{% else %}
{% if item.params-schema-clj %}
<h4>PARAMS:</h4>
<section class="padded-section">
<pre class="params-schema">{{item.params-schema-clj}}</pre>
</section>
{% endif %}
{% if item.result-schema-clj %}
<h4>RESPONSE:</h4>
<section class="padded-section">
<pre class="result">{{item.result-schema-clj}}</pre>
</section>
{% endif %}
{% if item.webhook-schema-clj %}
<h4>WEBHOOK PAYLOAD:</h4>
<section class="padded-section">
<pre class="webhook">{{item.webhook-schema-clj}}</pre>
</section>
{% endif %}
{% endif %}
</div>
</li>

View File

@@ -27,12 +27,78 @@ main {
header {
border-bottom: 1px solid #c0c0c0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
}
.rpc-doc-content {
header .menu {
display: flex;
align-items: center;
margin-top: 5px;
margin-bottom: 10px;
}
header .menu nav {
list-style: none;
padding: 0px;
margin: 0px;
display: flex;
width: 45px;
justify-content: space-between;
}
header .menu nav > a {
list-style: none;
padding: 0px;
margin: 0px;
cursor: pointer;
}
header .menu nav > a.selected {
font-weight: 600;
}
b {
font-weight: 500;
}
h2 {
margin-top: 30px;
}
h3 {
font-weight: 400;
font-size: 11px;
margin-top: 20px;
text-decoration: underline;
}
h4 {
font-weight: 300;
font-size: 11px;
}
.doc-content {
margin-top: 20px;
width: 100%;
display: flex;
flex-direction: column;
/* border: 1px solid red; */
padding: 5px;
}
.doc-content p {
line-height: 22px;
margin-bottom: 0px;
}
.doc-content h3 {
margin-bottom: 0px;
}
.rpc-doc-content {
width: 100%;
display: flex;
flex-direction: column;
@@ -65,7 +131,7 @@ header {
.rpc-row-info {
cursor: pointer;
display: flex;
background-color: #eeeeee;
background-color: #e5e5e5;
padding: 5px 10px;
}
@@ -90,7 +156,7 @@ header {
}
.rpc-row-info > .module {
width: 120px;
width: 150px;
font-weight: bold;
border-right: 1px dotted #777;
text-align: right;
@@ -108,6 +174,8 @@ header {
.rpc-row-detail {
padding: 5px 10px;
padding-bottom: 20px;
border-left: 2px solid #e5e5e5;
border-right: 2px solid #e5e5e5;
}
.rpc-row-detail p {
@@ -143,3 +211,7 @@ header {
p.small strong {
font-size: 10px;
}
p.small a {
font-size: 10px;
}

View File

@@ -20,26 +20,88 @@
<main>
<header>
<h1>Penpot API Documentation (v{{version}})</h1>
<small class="menu">
[
<nav>
<a href="?type=js" {% if param-style = "js" %}class="selected"{% endif %}>JS</a>
<a href="?type=clj" {% if param-style = "cljs" %}class="selected"{% endif %}>CLJ</a>
</nav>
]
</small>
</header>
<section class="doc-content">
<h2>INTRODUCTION</h2>
<p>This documentation is intended to be a general overview of the penpot RPC API.
If you prefer, you can use <a href="/api/openapi.json">OpenAPI</a>
and/or <a href="/api/openapi">SwaggerUI</a> as alternative.</p>
<h2>GENERAL NOTES</h2>
<h3>HTTP Transport & Methods</h3>
<p>The HTTP is the transport method for accesing this API; all
functions can be called using POST HTTP method; the functions
that starts with <b>get-</b> in the name, can use GET HTTP
method which in many cases benefits from the HTTP cache.</p>
<h3>Authentication</h3>
<p>The penpot backend right now offers two way for authenticate the request:
<b>cookies</b> (the same mechanism that we use ourselves on accessing the API from the
web application) and <b>access tokens</b>.</p>
<p>The cookie can be obtained using the <b>`login-with-password`</b> rpc method,
on successful login it sets the <b>`auth-token`</b> cookie with the session
token.</p>
<p>The access token can be obtained on the appropriate section on profile settings
and it should be provided using <b>`Authorization`</b> header with <b>`Token
&lt;token-string&gt;`</b> value.</p>
<h3>Content Negotiation</h3>
<p>The penpot API by default operates indistinctly with: <b>`application/json`</b>
and <b>`application/transit+json`</b> content types. You should specify the
desired content-type on the <b>`Accept`</b> header, the transit encoding is used
by default.</p>
<h3>SSE (Server-Sent Events)</h3>
<p>The methods marked with <b>SSE</b> returns
a <a href="https://html.spec.whatwg.org/multipage/server-sent-events.html"> SSE
formatted</a> stream on the response body, always with status 200. The events are
always encoded using `application/transit+json` encoding (for now no content
negotiation is possible on methods that return SSE streams). </p>
<p>On the javascript side you can use
the <a href="https://github.com/rexxars/eventsource-parser">eventsoure-parser</a>
library for propertly parsing the response body using the
standard <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API">Fetch
API</a></p>
<h3>Limits</h3>
<p>The rate limit work per user basis (this means that different api keys share
the same rate limit). For now the limits are not documented because we are
studying and analyzing the data. As a general rule, it should not be abused, if an
abusive use is detected, we will proceed to block the user's access to the
API.</p>
<h3>Webhooks</h3>
<p>All methods that emit webhook events are marked with flag <b>WEBHOOK</b>, the
data structure defined on each method represents the <i>payload</i> of the
event.</p>
<p>The webhook event structure has this aspect:</p>
<br/>
<pre>
{
"id": "db601c95-045f-808b-8002-362f08fcb621",
"name": "rename-file",
"props": &lt;payload&gt;,
"profileId": "db601c95-045f-808b-8002-361312e63531"
}
</pre>
</section>
<section class="rpc-doc-content">
<h2>RPC COMMAND METHODS:</h2>
<h2>RPC METHODS REFERENCE:</h2>
<ul class="rpc-items">
{% for item in command-methods %}
{% include "app/templates/api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
<h2>RPC QUERY METHODS:</h2>
<ul class="rpc-items">
{% for item in query-methods %}
{% include "app/templates/api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
<h2>RPC MUTATION METHODS:</h2>
<ul class="rpc-items">
{% for item in mutation-methods %}
{% for item in methods %}
{% include "app/templates/api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>

View File

@@ -6,11 +6,17 @@ Debug Main Page
{% block content %}
<nav>
<h1>Debug INDEX:</h1>
<div>[<a href="/dbg/error">ERRORS</a>]</div>
<div class="title">
<h1>ADMIN DEBUG INTERFACE</h1>
</div>
</nav>
<main class="index">
<main class="dashboard">
<section class="widget">
<fieldset>
<legend>Error reports</legend>
<desc><a href="/dbg/error">CLICK HERE TO SEE THE ERROR REPORTS</a> </desc>
</fieldset>
<fieldset>
<legend>Download file data:</legend>
<desc>Given an FILE-ID, downloads the file data as file. The file data is encoded using transit.</desc>
@@ -37,9 +43,42 @@ Debug Main Page
<input type="checkbox" name="reuseid" />
</div>
<input type="submit" value="Upload" />
<div class="row">
<input type="submit" value="Upload" />
</div>
</form>
</fieldset>
<fieldset>
<legend>Profile Management</legend>
<form method="post" action="/dbg/actions/resend-email-verification">
<div class="row">
<input type="email" name="email" placeholder="example@example.com" value="" />
</div>
<div class="row">
<label for="force-verify">Are you sure?</label>
<input id="force-verify" type="checkbox" name="force" />
<br />
<small>
This is a just a security double check for prevent non intentional submits.
</small>
</div>
<div class="row">
<input type="submit" name="resend" value="Resend Verification" />
<input type="submit" name="verify" value="Verify" />
</div>
<div class="row">
<input type="submit" class="danger" name="block" value="Block" />
<input type="submit" class="danger" name="unblock" value="Unblock" />
</div>
</form>
</fieldset>
</section>
<section class="widget">
@@ -107,18 +146,37 @@ Debug Main Page
</div>
<div class="row">
<label>Ignore index errors?</label>
<input type="checkbox" name="ignore-index-errors" checked/>
<br />
<small>
Do not break on index lookup errors (remap operation).
Useful when importing a broken file that has broken
relations or missing pieces.
</small>
<input type="submit" name="upload" value="Upload" />
</div>
</form>
</fieldset>
</section>
<section class="widget">
<fieldset>
<legend>Reset file version</legend>
<desc>Allows reset file data version to a specific number/</desc>
<form method="post" action="/dbg/actions/reset-file-version">
<div class="row">
<input type="text" style="width:300px" name="file-id" placeholder="file-id" />
</div>
<div class="row">
<input type="number" style="width:100px" name="version" placeholder="version" value="32" />
</div>
<div class="row">
<input type="submit" name="upload" value="Upload" />
<label for="force-version">Are you sure?</label>
<input id="force-version" type="checkbox" name="force" />
<br />
<small>
This is a just a security double check for prevent non intentional submits.
</small>
</div>
<div class="row">
<input type="submit" value="Submit" />
</div>
</form>
</fieldset>

View File

@@ -6,13 +6,19 @@ penpot - error list
{% block content %}
<nav>
<h1>Latest error reports:</h1>
<div class="title">
<h1>Error reports (last 200)</h1>
</div>
</nav>
<main class="horizontal-list">
<ul>
{% for item in items %}
<li><a class="date" href="/dbg/error/{{item.id}}">{{item.created-at}}</a>
<span class="title">{{item.hint|abbreviate:150}}</span></li>
<li>
<a class="date" href="/dbg/error/{{item.id}}">{{item.created-at}}</a>
<a class="hint" href="/dbg/error/{{item.id}}">
<span class="title">{{item.hint|abbreviate:150}}</span>
</a>
</li>
{% endfor %}
</ul>
</main>

View File

@@ -0,0 +1,112 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error report v2 {{id}}
{% endblock %}
{% block content %}
<nav>
<div>[<a href="/dbg/error">⮜</a>]</div>
<div>[<a href="#message">message</a>]</div>
<div>[<a href="#props">props</a>]</div>
<div>[<a href="#context">context</a>]</div>
{% if params %}
<div>[<a href="#params">request params</a>]</div>
{% endif %}
{% if data %}
<div>[<a href="#edata">error data</a>]</div>
{% endif %}
{% if spec-explain %}
<div>[<a href="#spec-explain">spec explain</a>]</div>
{% endif %}
{% if spec-problems %}
<div>[<a href="#spec-problems">spec problems</a>]</div>
{% endif %}
{% if spec-value %}
<div>[<a href="#spec-value">spec value</a>]</div>
{% endif %}
{% if trace %}
<div>[<a href="#trace">error trace</a>]</div>
{% endif %}
</nav>
<main>
<div class="table">
<div class="table-row multiline">
<div id="message" class="table-key">MESSAGE: </div>
<div class="table-val">
<h1>{{hint}}</h1>
</div>
</div>
<div class="table-row multiline">
<div id="props" class="table-key">LOG PROPS: </div>
<div class="table-val">
<pre>{{props}}</pre>
</div>
</div>
<div class="table-row multiline">
<div id="context" class="table-key">CONTEXT: </div>
<div class="table-val">
<pre>{{context}}</pre>
</div>
</div>
{% if params %}
<div class="table-row multiline">
<div id="params" class="table-key">REQUEST PARAMS: </div>
<div class="table-val">
<pre>{{params}}</pre>
</div>
</div>
{% endif %}
{% if data %}
<div class="table-row multiline">
<div id="edata" class="table-key">ERROR DATA: </div>
<div class="table-val">
<pre>{{data}}</pre>
</div>
</div>
{% endif %}
{% if spec-explain %}
<div class="table-row multiline">
<div id="spec-explain" class="table-key">SPEC EXPLAIN: </div>
<div class="table-val">
<pre>{{spec-explain}}</pre>
</div>
</div>
{% endif %}
{% if spec-problems %}
<div class="table-row multiline">
<div id="spec-problems" class="table-key">SPEC PROBLEMS: </div>
<div class="table-val">
<pre>{{spec-problems}}</pre>
</div>
</div>
{% endif %}
{% if spec-value %}
<div class="table-row multiline">
<div id="spec-value" class="table-key">SPEC VALUE: </div>
<div class="table-val">
<pre>{{spec-value}}</pre>
</div>
</div>
{% endif %}
{% if trace %}
<div class="table-row multiline">
<div id="trace" class="table-key">TRACE:</div>
<div class="table-val">
<pre>{{trace}}</pre>
</div>
</div>
{% endif %}
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,101 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
Report: {{hint|abbreviate:150}} - {{id}} - Penpot Error Report (v3)
{% endblock %}
{% block content %}
<nav>
<div>[<a href="/dbg/error">⮜</a>]</div>
<div>[<a href="#head">head</a>]</div>
<div>[<a href="#props">props</a>]</div>
<div>[<a href="#context">context</a>]</div>
{% if params %}
<div>[<a href="#params">params</a>]</div>
{% endif %}
{% if data %}
<div>[<a href="#edata">data</a>]</div>
{% endif %}
{% if explain %}
<div>[<a href="#explain">explain</a>]</div>
{% endif %}
{% if value %}
<div>[<a href="#value">value</a>]</div>
{% endif %}
{% if trace %}
<div>[<a href="#trace">trace</a>]</div>
{% endif %}
</nav>
<main>
<div class="table">
<div class="table-row multiline">
<div id="head" class="table-key">HEAD</div>
<div class="table-val">
<h1><span class="not-important">Hint:</span> <br/> {{hint}}</h1>
<h2><span class="not-important">Reported at:</span> <br/> {{created-at}}</h2>
<h2><span class="not-important">Report ID:</span> <br/> {{id}}</h2>
</div>
</div>
<div class="table-row multiline">
<div id="props" class="table-key">LOG PROPS: </div>
<div class="table-val">
<pre>{{props}}</pre>
</div>
</div>
<div class="table-row multiline">
<div id="context" class="table-key">CONTEXT: </div>
<div class="table-val">
<pre>{{context}}</pre>
</div>
</div>
{% if params %}
<div class="table-row multiline">
<div id="params" class="table-key">PARAMS: </div>
<div class="table-val">
<pre>{{params}}</pre>
</div>
</div>
{% endif %}
{% if data %}
<div class="table-row multiline">
<div id="edata" class="table-key">DATA: </div>
<div class="table-val">
<pre>{{data}}</pre>
</div>
</div>
{% endif %}
{% if value %}
<div class="table-row multiline">
<div id="value" class="table-key">VALUE: </div>
<div class="table-val">
<pre>{{value}}</pre>
</div>
</div>
{% endif %}
{% if explain %}
<div class="table-row multiline">
<div id="explain" class="table-key">EXPLAIN: </div>
<div class="table-val">
<pre>{{explain}}</pre>
</div>
</div>
{% endif %}
{% if trace %}
<div class="table-row multiline">
<div id="trace" class="table-key">TRACE:</div>
<div class="table-val">
<pre>{{trace}}</pre>
</div>
</div>
{% endif %}
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="SwaggerUI"
/>
<title>PENPOT Swagger UI</title>
<style>{{swagger-css|safe}}</style>
</head>
<body>
<div id="swagger-ui"></div>
<script>{{swagger-js|safe}}</script>
<script>
window.onload = () => {
window.ui = SwaggerUIBundle({
url: '{{public-uri}}/api/openapi.json',
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
],
});
};
</script>
</body>
</html>

View File

@@ -23,6 +23,10 @@ input[type=text], input[type=submit] {
padding: 3px;
}
pre {
white-space: pre-wrap;
}
main {
margin: 20px;
}
@@ -32,6 +36,11 @@ small {
color: #888;
}
.not-important {
color: #888;
font-weight: 200;
}
small > strong {
font-size: 9px;
}
@@ -46,7 +55,13 @@ nav {
background: #e3e3e3;
}
nav > h1 {
nav > .title {
display: flex;
justify-content: center;
width: 100%;
}
nav > .title > h1 {
padding: 0px;
margin: 0px;
font-size: 11px;
@@ -101,29 +116,50 @@ nav > div:not(:last-child) {
width: unset;
}
.index {
.dashboard {
margin-top: 40px;
display: flex;
}
.index > section {
padding: 10px;
background-color: #e3e3e3;
.widget {
max-width: 400px;
margin: 5px;
height: fit-content;
}
.index fieldset:not(:first-child) {
.widget input[type=submit] {
outline: none;
border: 1px solid gray;
border-radius: 2px;
padding: 3px 5px;
}
.widget input[type=submit].danger {
outline: none;
border: 1px solid red;
border-radius: 2px;
padding: 3px 5px;
}
.widget > fieldset {
padding: 10px;
background-color: #f9f9f9;
}
.widget > fieldset:not(:last-child) {
margin-bottom: 10px;
}
.dashboard fieldset:not(:first-child) {
margin-top: 15px;
}
/* .index > section:not(:last-child) { */
/* margin-bottom: 10px; */
/* } */
.index > section > h2 {
.widget > h2 {
margin-top: 0px;
}
@@ -147,7 +183,6 @@ nav > div:not(:last-child) {
line-height: 18px;
min-width: 210px;
margin: 0px 20px;
cursor: pointer;
display: flex;
border-radius: 3px;
}

View File

@@ -1,9 +1,30 @@
;; Example climit.edn file
;; Required: concurrency
;; Optional: queue-size, ommited means Integer/MAX_VALUE
{:update-file {:concurrency 1 :queue-size 3}
:auth {:concurrency 128}
:process-font {:concurrency 4 :queue-size 32}
:process-image {:concurrency 8 :queue-size 32}
:push-audit-events
{:concurrency 1 :queue-size 3}}
;; Required: permits
;; Optional: queue, ommited means Integer/MAX_VALUE
;; Optional: timeout, ommited means no timeout
;; Note: queue and timeout are excluding
{:update-file/global {:permits 20}
:update-file/by-profile
{:permits 1 :queue 5}
:process-font/global {:permits 4}
:process-font/by-profile {:permits 1}
:process-image/global {:permits 8}
:process-image/by-profile {:permits 1}
:auth/global {:permits 8}
:root/global
{:permits 40}
:root/by-profile
{:permits 10}
:file-thumbnail-ops/global
{:permits 20}
:file-thumbnail-ops/by-profile
{:permits 2}
:submit-audit-events/by-profile
{:permits 1 :queue 3}}

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="debug" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
</Root>
</Loggers>
</Configuration>

View File

@@ -3,22 +3,17 @@
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="false" />
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main.log" filePattern="logs/main-%i.log">
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="false" />
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<JeroMQ name="zmq">
<Property name="endpoint">tcp://localhost:45556</Property>
<JsonLayout complete="false" compact="true" includeTimeMillis="true" stacktraceAsString="true" properties="true" />
</JeroMQ>
</Appenders>
<Loggers>
@@ -26,36 +21,36 @@
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.storage.tmp" level="debug" />
<Logger name="app.worker" level="info" />
<Logger name="app.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="info" />
<Logger name="app.rpc.mutations.files" level="info" />
<Logger name="app.cli" level="debug" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="debug" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="console" level="info" />
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="zmq" level="debug" />
<AppenderRef ref="console" level="debug" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="console" level="info" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
<AppenderRef ref="console" level="info" />
</Root>
</Loggers>
</Configuration>

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main-latest.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
<RollingFile name="reports" fileName="logs/reports-latest.log" filePattern="logs/reports-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="100M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.worker" level="trace" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.http.sse" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="debug" />
<Logger name="app.common.files.migrations" level="info" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
</Logger>
<Logger name="app.features" level="all" additivity="true">
<AppenderRef ref="reports" level="warn" />
</Logger>
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Logger name="user" level="trace" additivity="false">
<AppenderRef ref="main" level="trace" />
</Logger>
<Root level="info">
<AppenderRef ref="main" />
</Root>
</Loggers>
</Configuration>

View File

@@ -11,11 +11,9 @@
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error" />
<Logger name="org.postgresql" level="error" />
<Logger name="app" level="info" additivity="false">
<AppenderRef ref="console" />
<AppenderRef ref="console" level="info" />
</Logger>
<Root level="info">
<AppenderRef ref="console" />
</Root>

View File

@@ -3,8 +3,9 @@
{:default
[[:default :window "200000/h"]]
#{:query/teams}
[[:burst :bucket "5/1/5s"]]
;; #{:command/get-teams}
;; [[:burst :bucket "5/5/5s"]]
#{:query/profile}
[[:burst :bucket "100/60/1m"]]}
;; #{:command/get-profile}
;; [[:burst :bucket "60/60/1m"]]
}

View File

@@ -12,11 +12,14 @@ cp ../CHANGES.md target/classes/changelog.md;
clojure -T:build jar;
mv target/penpot.jar target/dist/penpot.jar
cp resources/log4j2.xml target/dist/log4j2.xml
cp scripts/run.template.sh target/dist/run.sh;
cp scripts/manage.py target/dist/manage.py
chmod +x target/dist/run.sh;
chmod +x target/dist/manage.py
# Prefetch
# Prefetch templates
rm -rf builtin-templates;
mkdir builtin-templates;
bb ./scripts/prefetch-templates.clj resources/app/onboarding.edn builtin-templates/
cp -r builtin-templates target/dist/

View File

@@ -11,6 +11,7 @@ import json
import socket
import sys
from tabulate import tabulate
from getpass import getpass
from urllib.parse import urlparse
@@ -19,10 +20,10 @@ PREPL_URI = "tcp://localhost:6063"
def get_prepl_conninfo():
uri_data = urlparse(PREPL_URI)
if uri_data.scheme != "tcp":
raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
if not isinstance(uri_data.netloc, str):
raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
host, port = uri_data.netloc.split(":", 2)
@@ -43,11 +44,16 @@ def send_eval(expr):
s.send(b":repl/quit\n\n")
with s.makefile() as f:
result = json.load(f)
tag = result.get("tag", None)
if tag != "ret":
raise RuntimeException("unexpected response from PREPL")
return result.get("val", None), result.get("exception", None)
while True:
line = f.readline()
result = json.loads(line)
tag = result.get("tag", None)
if tag == "ret":
return result.get("val", None), result.get("exception", None)
elif tag == "out":
print(result.get("val"), end="")
else:
raise RuntimeError("unexpected response from PREPL")
def encode(val):
return json.dumps(json.dumps(val))
@@ -58,13 +64,17 @@ def print_error(res):
break
def run_cmd(params):
expr = "(app.srepl.ext/run-json-cmd {})".format(encode(params))
res, failed = send_eval(expr)
if failed:
print_error(res)
sys.exit(-1)
try:
expr = "(app.srepl.cli/exec {})".format(encode(params))
res, failed = send_eval(expr)
if failed:
print_error(res)
sys.exit(-1)
return res
return res
except Exception as cause:
print("EXC:", str(cause))
sys.exit(-2)
def create_profile(fullname, email, password):
params = {
@@ -96,6 +106,34 @@ def update_profile(email, fullname, password, is_active):
else:
print(f"No profile found with email {email}")
def delete_profile(email, soft):
params = {
"cmd": "delete-profile",
"params": {
"email": email,
"soft": soft
}
}
res = run_cmd(params)
if res is True:
print(f"Deleted")
else:
print(f"No profile found with email {email}")
def search_profile(email):
params = {
"cmd": "search-profile",
"params": {
"email": email,
}
}
res = run_cmd(params)
if isinstance(res, list):
print(tabulate(res, headers="keys"))
def derive_password(password):
params = {
"cmd": "derive-password",
@@ -107,11 +145,22 @@ def derive_password(password):
res = run_cmd(params)
print(f"Derived password: \"{res}\"")
available_commands = [
def migrate_components_v2():
params = {
"cmd": "migrate-v2",
"params": {}
}
run_cmd(params)
available_commands = (
"create-profile",
"update-profile",
"derive-password"
]
"delete-profile",
"search-profile",
"derive-password",
)
parser = argparse.ArgumentParser(
description=(
@@ -121,10 +170,11 @@ parser = argparse.ArgumentParser(
parser.add_argument("-V", "--version", action="version", version="Penpot CLI %%develop%%")
parser.add_argument("action", action="store", choices=available_commands)
parser.add_argument("-n", "--fullname", help="Fullname", action="store")
parser.add_argument("-e", "--email", help="Email", action="store")
parser.add_argument("-p", "--password", help="Password", action="store")
parser.add_argument("-c", "--connect", help="Connect to PREPL", action="store", default="tcp://localhost:6063")
parser.add_argument("-f", "--force", help="force operation", action="store_true")
parser.add_argument("-n", "--fullname", help="fullname", action="store")
parser.add_argument("-e", "--email", help="email", action="store")
parser.add_argument("-p", "--password", help="password", action="store")
parser.add_argument("-c", "--connect", help="connect to PREPL", action="store", default="tcp://localhost:6063")
args = parser.parse_args()
@@ -165,3 +215,21 @@ elif args.action == "derive-password":
password = getpass("Password: ")
derive_password(password)
elif args.action == "delete-profile":
email = args.email
soft = not args.force
if email is None:
email = input("Email: ")
delete_profile(email, soft)
elif args.action == "search-profile":
email = args.email
if email is None:
email = input("Email: ")
search_profile(email)

3
backend/scripts/nrepl Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
clojure -J-Xms50m -J-Xmx256m -J-XX:+UseSerialGC -Sdeps '{:deps {reply/reply {:mvn/version "0.5.0"}}}' -M -m reply.main --attach localhost:6064 -e "(in-ns 'app.main)"

View File

@@ -4,7 +4,16 @@ export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-login-with-ldap \
enable-login-with-password
enable-login-with-oidc \
enable-login-with-google \
enable-login-with-github \
enable-login-with-gitlab \
enable-backend-worker \
enable-backend-asserts \
enable-feature-fdata-pointer-map \
enable-feature-fdata-objects-map \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
@@ -16,7 +25,18 @@ export PENPOT_FLAGS="\
enable-rpc-rlimit \
enable-soft-rpc-rlimit \
enable-webhooks \
enable-access-tokens";
enable-access-tokens \
enable-file-validation \
enable-file-schema-validation";
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
# Setup default upload media file size to 100MiB
export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
# Setup default multipart upload size to 300MiB
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
# export PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot"
# export PENPOT_DATABASE_USERNAME="penpot"
@@ -31,10 +51,13 @@ export PENPOT_FLAGS="\
# export PENPOT_AUDIT_LOG_ARCHIVE_URI="http://localhost:6070/api/audit"
# Initialize MINIO config
mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin
mc admin user add penpot-s3 penpot-devenv penpot-devenv
mc admin policy set penpot-s3 readwrite user=penpot-devenv
mc mb penpot-s3/penpot -p
mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin -q
mc admin user add penpot-s3 penpot-devenv penpot-devenv -q
mc admin user info penpot-s3 penpot-devenv |grep -F -q "readwrite"
if [ "$?" = "1" ]; then
mc admin policy attach penpot-s3 readwrite --user=penpot-devenv -q
fi
mc mb penpot-s3/penpot -p -q
export AWS_ACCESS_KEY_ID=penpot-devenv
export AWS_SECRET_ACCESS_KEY=penpot-devenv
@@ -45,15 +68,38 @@ export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+UseG1GC \
-J-XX:-OmitStackTraceInFastThrow \
-J-Xms50m -J-Xmx1024m \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2-devenv-repl.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints";
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full"
# Uncomment for use the ImageMagick v7.x
# Enable preview
export OPTIONS="$OPTIONS -J--enable-preview"
# Setup HEAP
# export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m"
# export OPTIONS="$OPTIONS -J-Xms1100m -J-Xmx1100m -J-XX:+AlwaysPreTouch"
# Increase virtual thread pool size
# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16"
# Disable C2 Compiler
# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1"
# Disable all compilers
# export OPTIONS="$OPTIONS -J-Xint"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseG1GC"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseZGC"
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
export OPTIONS_EVAL="nil"

48
backend/scripts/repl-test Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
source /home/penpot/environ
export PENPOT_FLAGS="$PENPOT_FLAGS disable-backend-worker"
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dlog4j2.configurationFile=log4j2-experiments.xml \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full \
-J-XX:+UseTransparentHugePages \
-J-XX:ReservedCodeCacheSize=1g \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J--enable-preview";
# Setup HEAP
export OPTIONS="$OPTIONS -J-Xms320g -J-Xmx320g -J-XX:+AlwaysPreTouch"
export PENPOT_HTTP_SERVER_IO_THREADS=2
export PENPOT_HTTP_SERVER_WORKER_THREADS=2
# Increase virtual thread pool size
# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16"
# Disable C2 Compiler
# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1"
# Disable all compilers
# export OPTIONS="$OPTIONS -J-Xint"
# Setup GC
export OPTIONS="$OPTIONS -J-XX:+UseG1GC -J-Xlog:gc:logs/gc.log"
# Setup GC
#export OPTIONS="$OPTIONS -J-XX:+UseZGC -J-XX:+ZGenerational -J-Xlog:gc:logs/gc.log"
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
export OPTIONS_EVAL="nil"
# export OPTIONS_EVAL="(set! *warn-on-reflection* true)"
set -ex
exec clojure $OPTIONS -M -e "$OPTIONS_EVAL" -m rebel-readline.main

View File

@@ -18,5 +18,9 @@ if [ -f ./environ ]; then
source ./environ
fi
set -x
exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m app.main
export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow -Dpolyglot.engine.WarnInterpreterOnly=false --enable-preview $JVM_OPTS"
ENTRYPOINT=${1:-app.main};
set -ex
exec $JAVA_CMD $JVM_OPTS -jar penpot.jar -m $ENTRYPOINT

View File

@@ -2,24 +2,65 @@
export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="$PENPOT_FLAGS enable-backend-asserts enable-audit-log enable-transit-readable-response enable-demo-users disable-secure-session-cookies enable-smtp enable-webhooks"
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-prepl-server \
enable-urepl-server \
enable-nrepl-server \
enable-webhooks \
enable-backend-asserts \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
enable-feature-fdata-pointer-map \
enable-feature-fdata-objects-map \
disable-secure-session-cookies \
enable-rpc-climit \
enable-smtp \
enable-access-tokens \
enable-file-validation \
enable-file-schema-validation";
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dpolyglot.engine.WarnInterpreterOnly=false \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+EnableDynamicAgentLoading \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints"
# Default deletion delay for devenv
export PENPOT_DELETION_DELAY="24h"
# Setup default upload media file size to 100MiB
export PENPOT_MEDIA_MAX_FILE_SIZE=104857600
# Setup default multipart upload size to 300MiB
export PENPOT_HTTP_SERVER_MAX_MULTIPART_BODY_SIZE=314572800
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
# Initialize MINIO config
mc alias set penpot-s3/ http://minio:9000 minioadmin minioadmin -q
mc admin user add penpot-s3 penpot-devenv penpot-devenv -q
mc admin user info penpot-s3 penpot-devenv |grep -F -q "readwrite"
if [ "$?" = "1" ]; then
mc admin policy attach penpot-s3 readwrite --user=penpot-devenv -q
fi
mc mb penpot-s3/penpot -p -q
export AWS_ACCESS_KEY_ID=penpot-devenv
export AWS_SECRET_ACCESS_KEY=penpot-devenv
export PENPOT_ASSETS_STORAGE_BACKEND=assets-s3
export PENPOT_STORAGE_ASSETS_S3_ENDPOINT=http://minio:9000
export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot
entrypoint=${1:-app.main};
set -ex
if [ "$1" = "--watch" ]; then
echo "Start Watch..."
clojure -A:dev -M -m app.main &
PID=$!
npx nodemon \
--watch src \
--watch ../common \
--ext "clj" \
--signal SIGKILL \
--exec 'echo "(user/restart)" | nc -N localhost 6062'
kill -9 $PID
else
clojure -A:dev -M -m app.main
fi
clojure $OPTIONS -A:dev -M -m $entrypoint;

View File

@@ -6,15 +6,19 @@
(ns app.auth
(:require
[buddy.hashers :as hashers]))
[app.config :as cf]
[buddy.hashers :as hashers]
[cuerdas.core :as str]))
(def default-params
{:alg :argon2id
:memory 32768 ;; 32 MiB
:iterations 3
:parallelism 2})
(defn derive-password
[password]
(hashers/derive password
{:alg :argon2id
:memory 16384
:iterations 20
:parallelism 2}))
(hashers/derive password default-params))
(defn verify-password
[attempt password]
@@ -24,3 +28,16 @@
{:update false
:valid false})))
(defn email-domain-in-whitelist?
"Returns true if email's domain is in the given whitelist or if
given whitelist is an empty string."
([email]
(let [domains (cf/get :registration-domain-whitelist)]
(email-domain-in-whitelist? domains email)))
([domains email]
(if (or (nil? domains) (empty? domains))
true
(let [[_ candidate] (-> (str/lower email)
(str/split #"@" 2))]
(contains? domains candidate)))))

View File

@@ -7,6 +7,7 @@
(ns app.auth.oidc
"OIDC client implementation."
(:require
[app.auth :as auth]
[app.auth.oidc.providers :as-alias providers]
[app.common.data :as d]
[app.common.data.macros :as dm]
@@ -17,28 +18,27 @@
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.http.middleware :as hmw]
[app.http.session :as session]
[app.loggers.audit :as audit]
[app.main :as-alias main]
[app.rpc.queries.profile :as profile]
[app.rpc.commands.profile :as profile]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.json :as json]
[app.util.time :as dt]
[app.worker :as wrk]
[buddy.sign.jwk :as jwk]
[buddy.sign.jwt :as jwt]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.response :as yrs]))
[ring.response :as-alias rres]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- obfuscate-string
(defn obfuscate-string
[s]
(if (< (count s) 10)
(apply str (take (count s) (repeat "*")))
@@ -50,30 +50,30 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- discover-oidc-config
[cfg {:keys [::base-uri] :as opts}]
(let [discovery-uri (u/join base-uri ".well-known/openid-configuration")
response (ex/try! (http/req! cfg
{:method :get :uri (str discovery-uri)}
{:sync? true}))]
(cond
(ex/exception? response)
(do
(l/warn :hint "unable to discover oidc configuration"
:discover-uri (str discovery-uri)
:cause response)
nil)
[cfg {:keys [base-uri] :as opts}]
(let [uri (dm/str (u/join base-uri ".well-known/openid-configuration"))
rsp (http/req! cfg {:method :get :uri uri} {:sync? true})]
(if (= 200 (:status rsp))
(let [data (-> rsp :body json/decode)
token-uri (get data :token_endpoint)
auth-uri (get data :authorization_endpoint)
user-uri (get data :userinfo_endpoint)
jwks-uri (get data :jwks_uri)]
(= 200 (:status response))
(let [data (json/decode (:body response))]
{:token-uri (get data :token_endpoint)
:auth-uri (get data :authorization_endpoint)
:user-uri (get data :userinfo_endpoint)})
(l/debug :hint "oidc uris discovered"
:token-uri token-uri
:auth-uri auth-uri
:user-uri user-uri
:jwks-uri jwks-uri)
:else
{:token-uri token-uri
:auth-uri auth-uri
:user-uri user-uri
:jwks-uri jwks-uri})
(do
(l/warn :hint "unable to discover OIDC configuration"
:uri (str discovery-uri)
:response-status-code (:status response))
:discover-uri uri
:http-status (:status rsp))
nil))))
(defn- prepare-oidc-opts
@@ -84,6 +84,7 @@
:token-uri (cf/get :oidc-token-uri)
:auth-uri (cf/get :oidc-auth-uri)
:user-uri (cf/get :oidc-user-uri)
:jwks-uri (cf/get :oidc-jwks-uri)
:scopes (cf/get :oidc-scopes #{"openid" "profile" "email"})
:roles-attr (cf/get :oidc-roles-attr)
:roles (cf/get :oidc-roles)
@@ -98,8 +99,42 @@
(string? (:user-uri opts))
(string? (:auth-uri opts)))
opts
(some-> (discover-oidc-config cfg opts)
(merge opts {:discover? true}))))))
(try
(-> (discover-oidc-config cfg opts)
(merge opts {:discover? true}))
(catch Throwable cause
(l/warn :hint "unable to discover OIDC configuration"
:cause cause)))))))
(defn- process-oidc-jwks
[keys]
(reduce (fn [result {:keys [kid] :as kdata}]
(let [pkey (ex/try! (jwk/public-key kdata))]
(if (ex/exception? pkey)
(do
(l/warn :hint "unable to create public key"
:kid (:kid kdata)
:cause pkey)
result)
(assoc result kid pkey))))
{}
keys))
(defn- fetch-oidc-jwks
[cfg {:keys [jwks-uri]}]
(when jwks-uri
(try
(let [{:keys [status body]} (http/req! cfg {:method :get :uri jwks-uri} {:sync? true})]
(if (= 200 status)
(-> body json/decode :keys process-oidc-jwks)
(do
(l/warn :hint "unable to retrieve JWKs (unexpected response status code)"
:http-status status
:http-body body)
nil)))
(catch Throwable cause
(l/warn :hint "unable to retrieve JWKs (unexpected exception)"
:cause cause)))))
(defmethod ig/pre-init-spec ::providers/generic [_]
(s/keys :req [::http/client]))
@@ -108,9 +143,9 @@
[_ cfg]
(when (contains? cf/flags :login-with-oidc)
(if-let [opts (prepare-oidc-opts cfg)]
(do
(let [jwks (fetch-oidc-jwks cfg opts)]
(l/info :hint "provider initialized"
:provider :oidc
:provider "oidc"
:method (if (:discover? opts) "discover" "manual")
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts))
@@ -119,10 +154,11 @@
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:roles-attr (:roles-attr opts)
:roles (:roles opts))
opts)
:roles (:roles opts)
:keys (str/join "," (map str (keys jwks))))
(assoc opts :jwks jwks))
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :oidc)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "oidc")
nil))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -144,13 +180,13 @@
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :google
:provider "google"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :google)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "google")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -158,21 +194,23 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- retrieve-github-email
[cfg tdata info]
(or (some-> info :email p/resolved)
(->> (http/req! cfg
{:uri "https://api.github.com/user/emails"
:headers {"Authorization" (dm/str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get})
(p/map (fn [{:keys [status body] :as response}]
(when-not (s/int-in-range? 200 300 status)
(ex/raise :type :internal
:code :unable-to-retrieve-github-emails
:hint "unable to retrieve github emails"
:http-status status
:http-body body))
(->> response :body json/decode (filter :primary) first :email))))))
[cfg tdata props]
(or (some-> props :github/email)
(let [params {:uri "https://api.github.com/user/emails"
:headers {"Authorization" (dm/str (:token/type tdata) " " (:token/access tdata))}
:timeout 6000
:method :get}
{:keys [status body]} (http/req! cfg params {:sync? true})]
(when-not (s/int-in-range? 200 300 status)
(ex/raise :type :internal
:code :unable-to-retrieve-github-emails
:hint "unable to retrieve github emails"
:http-status status
:http-body body))
(->> body json/decode (filter :primary) first :email))))
(defmethod ig/pre-init-spec ::providers/github [_]
(s/keys :req [::http/client]))
@@ -189,20 +227,20 @@
;; Additional hooks for provider specific way of
;; retrieve emails.
:get-email-fn (partial retrieve-github-email cfg)}]
:get-email-fn (partial retrieve-github-email cfg)}]
(when (contains? cf/flags :login-with-github)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :github
:provider "github"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :github)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "github")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -225,20 +263,25 @@
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :gitlab
:provider "gitlab"
:base-uri base
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :gitlab)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "gitlab")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HANDLERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-attr-path
[provider path]
(let [[fitem & items] (str/split path "__")]
(into [(keyword (:name provider) fitem)] (map keyword) items)))
(defn- build-redirect-uri
[{:keys [provider] :as cfg}]
(let [public (u/uri (cf/get :public-uri))]
@@ -263,7 +306,7 @@
{}
props))
(defn retrieve-access-token
(defn fetch-access-token
[{:keys [provider] :as cfg} code]
(let [params {:client_id (:client-id provider)
:client_secret (:client-secret provider)
@@ -275,69 +318,90 @@
"accept" "application/json"}
:uri (:token-uri provider)
:body (u/map->query-string params)}]
(->> (http/req! cfg req)
(p/map (fn [{:keys [status body] :as res}]
(if (= status 200)
(let [data (json/decode body)]
{:token (get data :access_token)
:type (get data :token_type)})
(ex/raise :type :internal
:code :unable-to-retrieve-token
:http-status status
:http-body body)))))))
(defn- retrieve-user-info
[{:keys [provider] :as cfg} tdata]
(letfn [(retrieve []
(http/req! cfg
{:uri (:user-uri provider)
:headers {"Authorization" (str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get}))
(validate-response [response]
(when-not (s/int-in-range? 200 300 (:status response))
(ex/raise :type :internal
:code :unable-to-retrieve-user-info
:hint "unable to retrieve user info"
:http-status (:status response)
:http-body (:body response)))
response)
(l/trace :hint "request access token"
:provider (:name provider)
:client-id (:client-id provider)
:client-secret (obfuscate-string (:client-secret provider))
:grant-type (:grant_type params)
:redirect-uri (:redirect_uri params))
(get-email [info]
(let [{:keys [status body]} (http/req! cfg req {:sync? true})]
(l/trace :hint "access token response" :status status :body body)
(if (= status 200)
(let [data (json/decode body)]
{:token/access (get data :access_token)
:token/id (get data :id_token)
:token/type (get data :token_type)})
(ex/raise :type :internal
:code :unable-to-retrieve-token
:hint "unable to retrieve token"
:http-status status
:http-body body)))))
(defn- process-user-info
[provider tdata info]
(letfn [(get-email [props]
;; Allow providers hook into this for custom email
;; retrieval method.
(if-let [get-email-fn (:get-email-fn provider)]
(get-email-fn tdata info)
(let [attr-kw (cf/get :oidc-email-attr :email)]
(get info attr-kw))))
(get-email-fn tdata props)
(let [attr-kw (cf/get :oidc-email-attr "email")
attr-ph (parse-attr-path provider attr-kw)]
(get-in props attr-ph))))
(get-name [info]
(let [attr-kw (cf/get :oidc-name-attr :name)]
(get info attr-kw)))
(get-name [props]
(let [attr-kw (cf/get :oidc-name-attr "name")
attr-ph (parse-attr-path provider attr-kw)]
(get-in props attr-ph)))]
(process-response [response]
(p/let [info (-> response :body json/decode)
email (get-email info)]
{:backend (:name provider)
:email email
:fullname (or (get-name info) email)
:props (->> (dissoc info :name :email)
(qualify-props provider))}))
(let [props (qualify-props provider info)
email (get-email props)]
{:backend (:name provider)
:fullname (or (get-name props) email)
:email email
:props props})))
(validate-info [info]
(when-not (s/valid? ::info info)
(l/warn :hint "received incomplete profile info object (please set correct scopes)"
:info (pr-str info))
(ex/raise :type :internal
:code :incomplete-user-info
:hint "inconmplete user info"
:info info))
info)]
(defn- fetch-user-info
[{:keys [provider] :as cfg} tdata]
(l/trace :hint "fetch user info"
:uri (:user-uri provider)
:token (obfuscate-string (:token/access tdata)))
(-> (retrieve)
(p/then validate-response)
(p/then process-response)
(p/then validate-info))))
(let [params {:uri (:user-uri provider)
:headers {"Authorization" (str (:token/type tdata) " " (:token/access tdata))}
:timeout 6000
:method :get}
response (http/req! cfg params {:sync? true})]
(l/trace :hint "user info response"
:status (:status response)
:body (:body response))
(when-not (s/int-in-range? 200 300 (:status response))
(ex/raise :type :internal
:code :unable-to-retrieve-user-info
:hint "unable to retrieve user info"
:http-status (:status response)
:http-body (:body response)))
(-> response :body json/decode)))
(defn- get-user-info
[{:keys [provider]} tdata]
(try
(when (:token/id tdata)
(let [{:keys [kid alg] :as theader} (jwt/decode-header (:token/id tdata))]
(when-let [key (if (str/starts-with? (name alg) "hs")
(:client-secret provider)
(get-in provider [:jwks kid]))]
(let [claims (jwt/unsign (:token/id tdata) key {:alg alg})]
(dissoc claims :exp :iss :iat :sid :aud :sub)))))
(catch Throwable cause
(l/warn :hint "unable to get user info from JWT token (unexpected exception)"
:cause cause))))
(s/def ::backend ::us/not-empty-string)
(s/def ::email ::us/not-empty-string)
@@ -349,79 +413,103 @@
::fullname
::props]))
(defn retrieve-info
[{:keys [provider] :as cfg} {:keys [params] :as request}]
(letfn [(validate-oidc [info]
;; If the provider is OIDC, we can proceed to check
;; roles if they are defined.
(when (and (= "oidc" (:name provider))
(seq (:roles provider)))
(let [provider-roles (into #{} (:roles provider))
profile-roles (let [attr (cf/get :oidc-roles-attr :roles)
roles (get info attr)]
(cond
(string? roles) (into #{} (str/words roles))
(vector? roles) (into #{} roles)
:else #{}))]
(defn get-info
[{:keys [provider ::setup/props] :as cfg} {:keys [params] :as request}]
(when-let [error (get params :error)]
(ex/raise :type :internal
:code :error-on-retrieving-code
:error-id error
:error-desc (get params :error_description)))
;; check if profile has a configured set of roles
(when-not (set/subset? provider-roles profile-roles)
(ex/raise :type :internal
:code :unable-to-auth
:hint "not enough permissions"))))
info)
(let [state (get params :state)
code (get params :code)
state (tokens/verify props {:token state :iss :oauth})
tdata (fetch-access-token cfg code)
info (case (cf/get :oidc-user-info-source)
:token (get-user-info cfg tdata)
:userinfo (fetch-user-info cfg tdata)
(or (get-user-info cfg tdata)
(fetch-user-info cfg tdata)))
(post-process [state info]
(cond-> info
(some? (:invitation-token state))
(assoc :invitation-token (:invitation-token state))
info (process-user-info provider tdata info)]
;; If state token comes with props, merge them. The state token
;; props can contain pm_ and utm_ prefixed query params.
(map? (:props state))
(update :props merge (:props state))))]
(l/trace :hint "user info" :info info)
(when-let [error (get params :error)]
(when-not (s/valid? ::info info)
(l/warn :hint "received incomplete profile info object (please set correct scopes)" :info info)
(ex/raise :type :internal
:code :error-on-retrieving-code
:error-id error
:error-desc (get params :error_description)))
:code :incomplete-user-info
:hint "inconmplete user info"
:info info))
(let [state (get params :state)
code (get params :code)
state (tokens/verify (::main/props cfg) {:token state :iss :oauth})]
(-> (p/resolved code)
(p/then #(retrieve-access-token cfg %))
(p/then #(retrieve-user-info cfg %))
(p/then' validate-oidc)
(p/then' (partial post-process state))))))
;; If the provider is OIDC, we can proceed to check
;; roles if they are defined.
(when (and (= "oidc" (:name provider))
(seq (:roles provider)))
(defn- retrieve-profile
[{:keys [::db/pool ::wrk/executor] :as cfg} info]
(px/with-dispatch executor
(with-open [conn (db/open pool)]
(some->> (:email info)
(profile/retrieve-profile-data-by-email conn)
(profile/populate-additional-data conn)
(profile/decode-profile-row)))))
(let [expected-roles (into #{} (:roles provider))
current-roles (let [roles-kw (cf/get :oidc-roles-attr "roles")
roles-ph (parse-attr-path provider roles-kw)
roles (get-in (:props info) roles-ph)]
(cond
(string? roles) (into #{} (str/words roles))
(vector? roles) (into #{} roles)
:else #{}))]
;; check if profile has a configured set of roles
(when-not (set/subset? expected-roles current-roles)
(ex/raise :type :internal
:code :unable-to-auth
:hint "not enough permissions"))))
(cond-> info
(some? (:invitation-token state))
(assoc :invitation-token (:invitation-token state))
;; If state token comes with props, merge them. The state token
;; props can contain pm_ and utm_ prefixed query params.
(map? (:props state))
(update :props merge (:props state)))))
(defn- get-profile
[{:keys [::db/pool] :as cfg} info]
(dm/with-open [conn (db/open pool)]
(some->> (:email info)
(profile/clean-email)
(profile/get-profile-by-email conn))))
(defn- redirect-response
[uri]
(yrs/response :status 302 :headers {"location" (str uri)}))
{::rres/status 302
::rres/headers {"location" (str uri)}})
(defn- generate-error-redirect
[_ error]
(let [uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string {:error "unable-to-auth" :hint (ex-message error)})))]
[_ cause]
(let [data (if (ex/error? cause) (ex-data cause) nil)
code (or (:code data) :unexpected)
type (or (:type data) :internal)
hint (or (:hint data)
(if (ex/exception? cause)
(ex-message cause)
(str cause)))
params {:error "unable-to-auth"
:hint hint
:type type
:code code}
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string params)))]
(redirect-response uri)))
(defn- generate-redirect
[{:keys [::session/session] :as cfg} request info profile]
[cfg request info profile]
(if profile
(let [sxf (session/create-fn session (:id profile))
(let [sxf (session/create-fn cfg (:id profile))
token (or (:invitation-token info)
(tokens/generate (::main/props cfg)
(tokens/generate (::setup/props cfg)
{:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
@@ -434,59 +522,60 @@
(ex/raise :type :restriction
:code :profile-blocked))
(when-let [collector (::audit/collector cfg)]
(audit/submit! collector {:type "command"
:name "login"
:profile-id (:id profile)
:ip-addr (audit/parse-client-ip request)
:props (audit/profile->props profile)}))
(audit/submit! cfg {::audit/type "command"
::audit/name "login-with-oidc"
::audit/profile-id (:id profile)
::audit/ip-addr (audit/parse-client-ip request)
::audit/props (audit/profile->props profile)})
(->> (redirect-response uri)
(sxf request)))
(let [info (assoc info
:iss :prepared-register
:is-active true
:exp (dt/in-future {:hours 48}))
token (tokens/generate (::main/props cfg) info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))))
(if (auth/email-domain-in-whitelist? (:email info))
(let [info (assoc info
:iss :prepared-register
:is-active true
:exp (dt/in-future {:hours 48}))
token (tokens/generate (::setup/props cfg) info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))
(generate-error-redirect cfg "email-domain-not-allowed"))))
(defn- auth-handler
[cfg {:keys [params] :as request}]
(let [props (audit/extract-utm-params params)
state (tokens/generate (::main/props cfg)
state (tokens/generate (::setup/props cfg)
{:iss :oauth
:invitation-token (:invitation-token params)
:props props
:exp (dt/in-future "4h")})
uri (build-auth-uri cfg state)]
(yrs/response 200 {:redirect-uri uri})))
{::rres/status 200
::rres/body {:redirect-uri uri}}))
(defn- callback-handler
[cfg request]
(letfn [(process-request []
(p/let [info (retrieve-info cfg request)
profile (retrieve-profile cfg info)]
(generate-redirect cfg request info profile)))
(handle-error [cause]
(l/error :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))]
(-> (process-request)
(p/catch handle-error))))
(try
(let [info (get-info cfg request)
profile (get-profile cfg info)]
(generate-redirect cfg request info profile))
(catch Throwable cause
(l/warn :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))))
(def provider-lookup
{:compile
(fn [& _]
(fn [handler]
(fn [{:keys [::providers] :as cfg} request]
(fn [handler {:keys [::providers] :as cfg}]
(fn [request]
(let [provider (some-> request :path-params :provider keyword)]
(if-let [provider (get providers provider)]
(handler (assoc cfg :provider provider) request)
@@ -524,23 +613,21 @@
(s/def ::providers (s/map-of ::us/keyword (s/nilable ::provider)))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes
[_]
(s/keys :req [::http/client
::wrk/executor
::main/props
(s/keys :req [::session/manager
::http/client
::setup/props
::db/pool
::providers
::session/session]))
::providers]))
(defmethod ig/init-key ::routes
[_ {:keys [::wrk/executor ::session/session] :as cfg}]
[_ cfg]
(let [cfg (update cfg :provider d/without-nils)]
["" {:middleware [[(:middleware session)]
[hmw/with-dispatch executor]
[hmw/with-config cfg]
[provider-lookup]
]}
["" {:middleware [[session/authz cfg]
[provider-lookup cfg]]}
["/auth/oauth"
["/:provider"
{:handler auth-handler
@@ -548,4 +635,3 @@
["/:provider/callback"
{:handler callback-handler
:allowed-methods #{:get}}]]]))

View File

@@ -0,0 +1,492 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.binfile.common
"A binfile related file processing common code, used for different
binfile format implementations and management rpc methods."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.files.migrations :as fmg]
[app.common.files.validate :as fval]
[app.common.logging :as l]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.features.components-v2 :as feat.compv2]
[app.features.fdata :as feat.fdata]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.util.blob :as blob]
[app.util.pointer-map :as pmap]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.set :as set]
[clojure.walk :as walk]
[cuerdas.core :as str]))
(set! *warn-on-reflection* true)
(def ^:dynamic *state* nil)
(def ^:dynamic *options* nil)
(def xf-map-id
(map :id))
(def xf-map-media-id
(comp
(mapcat (juxt :media-id
:thumbnail-id
:woff1-file-id
:woff2-file-id
:ttf-file-id
:otf-file-id))
(filter uuid?)))
(def into-vec
(fnil into []))
(def conj-vec
(fnil conj []))
(defn collect-storage-objects
[state items]
(update state :storage-objects into xf-map-media-id items))
(defn collect-summary
[state key items]
(update state key into xf-map-media-id items))
(defn lookup-index
[id]
(when id
(let [val (get-in @*state* [:index id])]
(l/trc :fn "lookup-index" :id (str id) :result (some-> val str) ::l/sync? true)
(or val id))))
(defn remap-id
[item key]
(cond-> item
(contains? item key)
(update key lookup-index)))
(defn- index-object
[index obj & attrs]
(reduce (fn [index attr-fn]
(let [old-id (attr-fn obj)
new-id (if (::overwrite *options*) old-id (uuid/next))]
(assoc index old-id new-id)))
index
attrs))
(defn update-index
([index coll]
(update-index index coll identity))
([index coll attr]
(reduce #(index-object %1 %2 attr) index coll)))
(defn decode-row
"A generic decode row helper"
[{:keys [data features] :as row}]
(cond-> row
features (assoc :features (db/decode-pgarray features #{}))
data (assoc :data (blob/decode data))))
(defn get-file
[cfg file-id]
(db/run! cfg (fn [{:keys [::db/conn] :as cfg}]
(binding [pmap/*load-fn* (partial feat.fdata/load-pointer cfg file-id)]
(when-let [file (db/get* conn :file {:id file-id}
{::db/remove-deleted false})]
(-> file
(decode-row)
(update :data feat.fdata/process-pointers deref)
(update :data feat.fdata/process-objects (partial into {}))))))))
(defn get-project
[cfg project-id]
(db/get cfg :project {:id project-id}))
(defn get-team
[cfg team-id]
(-> (db/get cfg :team {:id team-id})
(decode-row)))
(defn get-fonts
[cfg team-id]
(db/query cfg :team-font-variant
{:team-id team-id
:deleted-at nil}))
(defn get-files-rels
"Given a set of file-id's, return all matching relations with the libraries"
[cfg ids]
(dm/assert!
"expected a set of uuids"
(and (set? ids)
(every? uuid? ids)))
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids (db/create-array conn "uuid" ids)
sql (str "SELECT flr.* FROM file_library_rel AS flr "
" JOIN file AS l ON (flr.library_file_id = l.id) "
" WHERE flr.file_id = ANY(?) AND l.deleted_at IS NULL")]
(db/exec! conn [sql ids])))))
(def ^:private sql:get-libraries
"WITH RECURSIVE libs AS (
SELECT fl.id
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
WHERE flr.file_id = ANY(?)
UNION
SELECT fl.id
FROM file AS fl
JOIN file_library_rel AS flr ON (flr.library_file_id = fl.id)
JOIN libs AS l ON (flr.file_id = l.id)
)
SELECT DISTINCT l.id
FROM libs AS l")
(defn get-libraries
"Get all libraries ids related to provided file ids"
[cfg ids]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids' (db/create-array conn "uuid" ids)]
(->> (db/exec! conn [sql:get-libraries ids'])
(into #{} xf-map-id))))))
(defn get-file-object-thumbnails
"Return all file object thumbnails for a given file."
[cfg file-id]
(db/query cfg :file-tagged-object-thumbnail
{:file-id file-id
:deleted-at nil}))
(defn get-file-thumbnail
"Return the thumbnail for the specified file-id"
[cfg {:keys [id revn]}]
(db/get* cfg :file-thumbnail
{:file-id id
:revn revn
:data nil}
{::sql/columns [:media-id :file-id :revn]}))
(def ^:private
xform:collect-media-id
(comp
(map :objects)
(mapcat vals)
(mapcat (fn [obj]
;; NOTE: because of some bug, we ended with
;; many shape types having the ability to
;; have fill-image attribute (which initially
;; designed for :path shapes).
(sequence
(keep :id)
(concat [(:fill-image obj)
(:metadata obj)]
(map :fill-image (:fills obj))
(map :stroke-image (:strokes obj))
(->> (:content obj)
(tree-seq map? :children)
(mapcat :fills)
(map :fill-image))))))))
(defn collect-used-media
"Given a fdata (file data), returns all media references."
[data]
(-> #{}
(into xform:collect-media-id (vals (:pages-index data)))
(into xform:collect-media-id (vals (:components data)))
(into (keys (:media data)))))
(defn get-file-media
[cfg {:keys [data id] :as file}]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [ids (collect-used-media data)
ids (db/create-array conn "uuid" ids)
sql (str "SELECT * FROM file_media_object WHERE id = ANY(?)")]
;; We assoc the file-id again to the file-media-object row
;; because there are cases that used objects refer to other
;; files and we need to ensure in the exportation process that
;; all ids matches
(->> (db/exec! conn [sql ids])
(mapv #(assoc % :file-id id)))))))
(def ^:private sql:get-team-files
"SELECT f.id FROM file AS f
JOIN project AS p ON (p.id = f.project_id)
WHERE p.team_id = ?")
(defn get-team-files
"Get a set of file ids for the specified team-id"
[{:keys [::db/conn]} team-id]
(->> (db/exec! conn [sql:get-team-files team-id])
(into #{} xf-map-id)))
(def ^:private sql:get-team-projects
"SELECT p.id FROM project AS p
WHERE p.team_id = ?
AND p.deleted_at IS NULL")
(defn get-team-projects
"Get a set of project ids for the team"
[{:keys [::db/conn]} team-id]
(->> (db/exec! conn [sql:get-team-projects team-id])
(into #{} xf-map-id)))
(def ^:private sql:get-project-files
"SELECT f.id FROM file AS f
WHERE f.project_id = ?
AND f.deleted_at IS NULL")
(defn get-project-files
"Get a set of file ids for the project"
[{:keys [::db/conn]} project-id]
(->> (db/exec! conn [sql:get-project-files project-id])
(into #{} xf-map-id)))
(defn- relink-shapes
"A function responsible to analyze all file data and
replace the old :component-file reference with the new
ones, using the provided file-index."
[data]
(letfn [(process-map-form [form]
(cond-> form
;; Relink image shapes
(and (map? (:metadata form))
(= :image (:type form)))
(update-in [:metadata :id] lookup-index)
;; Relink paths with fill image
(map? (:fill-image form))
(update-in [:fill-image :id] lookup-index)
;; This covers old shapes and the new :fills.
(uuid? (:fill-color-ref-file form))
(update :fill-color-ref-file lookup-index)
;; This covers the old shapes and the new :strokes
(uuid? (:stroke-color-ref-file form))
(update :stroke-color-ref-file lookup-index)
;; This covers all text shapes that have typography referenced
(uuid? (:typography-ref-file form))
(update :typography-ref-file lookup-index)
;; This covers the component instance links
(uuid? (:component-file form))
(update :component-file lookup-index)
;; This covers the shadows and grids (they have directly
;; the :file-id prop)
(uuid? (:file-id form))
(update :file-id lookup-index)))
(process-form [form]
(if (map? form)
(try
(process-map-form form)
(catch Throwable cause
(l/warn :hint "failed form" :form (pr-str form) ::l/sync? true)
(throw cause)))
form))]
(walk/postwalk process-form data)))
(defn- relink-media
"A function responsible of process the :media attr of file data and
remap the old ids with the new ones."
[media]
(reduce-kv (fn [res k v]
(let [id (lookup-index k)]
(if (uuid? id)
(-> res
(assoc id (assoc v :id id))
(dissoc k))
res)))
media
media))
(defn- relink-colors
"A function responsible of process the :colors attr of file data and
remap the old ids with the new ones."
[colors]
(reduce-kv (fn [res k v]
(if (:image v)
(update-in res [k :image :id] lookup-index)
res))
colors
colors))
(defn embed-assets
[cfg data file-id]
(letfn [(walk-map-form [form state]
(cond
(uuid? (:fill-color-ref-file form))
(do
(vswap! state conj [(:fill-color-ref-file form) :colors (:fill-color-ref-id form)])
(assoc form :fill-color-ref-file file-id))
(uuid? (:stroke-color-ref-file form))
(do
(vswap! state conj [(:stroke-color-ref-file form) :colors (:stroke-color-ref-id form)])
(assoc form :stroke-color-ref-file file-id))
(uuid? (:typography-ref-file form))
(do
(vswap! state conj [(:typography-ref-file form) :typographies (:typography-ref-id form)])
(assoc form :typography-ref-file file-id))
(uuid? (:component-file form))
(do
(vswap! state conj [(:component-file form) :components (:component-id form)])
(assoc form :component-file file-id))
:else
form))
(process-group-of-assets [data [lib-id items]]
;; NOTE: there is a possibility that shape refers to an
;; non-existant file because the file was removed. In this
;; case we just ignore the asset.
(if-let [lib (get-file cfg lib-id)]
(reduce (partial process-asset lib) data items)
data))
(process-asset [lib data [bucket asset-id]]
(let [asset (get-in lib [:data bucket asset-id])
;; Add a special case for colors that need to have
;; correctly set the :file-id prop (pending of the
;; refactor that will remove it).
asset (cond-> asset
(= bucket :colors) (assoc :file-id file-id))]
(update data bucket assoc asset-id asset)))]
(let [assets (volatile! [])]
(walk/postwalk #(cond-> % (map? %) (walk-map-form assets)) data)
(->> (deref assets)
(filter #(as-> (first %) $ (and (uuid? $) (not= $ file-id))))
(d/group-by first rest)
(reduce (partial process-group-of-assets) data)))))
(defn- fix-version
[file]
(let [file (fmg/fix-version file)]
;; FIXME: We're temporarily activating all migrations because a
;; problem in the environments messed up with the version numbers
;; When this problem is fixed delete the following line
(if (> (:version file) 22)
(assoc file :version 22)
file)))
(defn process-file
[{:keys [id] :as file}]
(-> file
(fix-version)
(update :data (fn [fdata]
(-> fdata
(assoc :id id)
(dissoc :recent-colors))))
(fmg/migrate-file)
(update :data (fn [fdata]
(-> fdata
(update :pages-index relink-shapes)
(update :components relink-shapes)
(update :media relink-media)
(update :colors relink-colors)
(d/without-nils))))))
(defn- upsert-file!
[conn file]
(let [sql (str "INSERT INTO file (id, project_id, name, revn, version, is_shared, data, created_at, modified_at) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) "
"ON CONFLICT (id) DO UPDATE SET data=?, version=?")]
(db/exec-one! conn [sql
(:id file)
(:project-id file)
(:name file)
(:revn file)
(:version file)
(:is-shared file)
(:data file)
(:created-at file)
(:modified-at file)
(:data file)
(:version file)])))
(defn persist-file!
"Applies all the final validations and perist the file."
[{:keys [::db/conn ::timestamp] :as cfg} {:keys [id] :as file}]
(dm/assert!
"expected valid timestamp"
(dt/instant? timestamp))
(let [file (-> file
(assoc :created-at timestamp)
(assoc :modified-at timestamp)
(assoc :ignore-sync-until (dt/plus timestamp (dt/duration {:seconds 5})))
(update :features
(fn [features]
(let [features (cfeat/check-supported-features! features)]
(-> (::features cfg #{})
(set/difference cfeat/frontend-only-features)
(set/union features))))))
_ (when (contains? cf/flags :file-schema-validation)
(fval/validate-file-schema! file))
_ (when (contains? cf/flags :soft-file-schema-validation)
(let [result (ex/try! (fval/validate-file-schema! file))]
(when (ex/exception? result)
(l/error :hint "file schema validation error" :cause result))))
file (if (contains? (:features file) "fdata/objects-map")
(feat.fdata/enable-objects-map file)
file)
file (if (contains? (:features file) "fdata/pointer-map")
(binding [pmap/*tracked* (pmap/create-tracked)]
(let [file (feat.fdata/enable-pointer-map file)]
(feat.fdata/persist-pointers! cfg id)
file))
file)
params (-> file
(update :features db/encode-pgarray conn "text")
(update :data blob/encode))]
(if (::overwrite cfg)
(upsert-file! conn params)
(db/insert! conn :file params ::db/return-keys false))
file))
(defn apply-pending-migrations!
"Apply alredy registered pending migrations to files"
[cfg]
(doseq [[feature file-id] (-> *state* deref :pending-to-migrate)]
(case feature
"components/v2"
(feat.compv2/migrate-file! cfg file-id
:validate? (::validate cfg true)
:skip-on-graphic-error? true)
"fdata/shape-data-type"
nil
(ex/raise :type :internal
:code :no-migration-defined
:hint (str/ffmt "no migation for feature '%' on file importation" feature)
:feature feature))))

View File

@@ -0,0 +1,779 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.binfile.v1
"A custom, perfromance and efficiency focused binfile format impl"
(:refer-clojure :exclude [assert])
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.features :as cfeat]
[app.common.fressian :as fres]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.types.file :as ctf]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.media :as media]
[app.rpc :as-alias rpc]
[app.rpc.commands.teams :as teams]
[app.rpc.doc :as-alias doc]
[app.storage :as sto]
[app.storage.tmp :as tmp]
[app.tasks.file-gc]
[app.util.events :as events]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.java.io :as jio]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.io :as io]
[promesa.util :as pu]
[yetti.adapter :as yt])
(:import
com.github.luben.zstd.ZstdIOException
com.github.luben.zstd.ZstdInputStream
com.github.luben.zstd.ZstdOutputStream
java.io.DataInputStream
java.io.DataOutputStream
java.io.InputStream
java.io.OutputStream))
(set! *warn-on-reflection* true)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DEFAULTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Threshold in MiB when we pass from using
;; in-memory byte-array's to use temporal files.
(def temp-file-threshold
(* 1024 1024 2))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOW LEVEL STREAM IO API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
(def ^:const penpot-magic-number 800099563638710213)
;; A maximum (storage) object size allowed: 100MiB
(def ^:const max-object-size
(* 1024 1024 100))
(def ^:dynamic *position* nil)
(defn get-mark
[id]
(case id
:header 1
:stream 2
:uuid 3
:label 4
:obj 5
(ex/raise :type :validation
:code :invalid-mark-id
:hint (format "invalid mark id %s" id))))
(defmacro assert
[expr hint]
`(when-not ~expr
(ex/raise :type :validation
:code :unexpected-condition
:hint ~hint)))
(defmacro assert-mark
[v type]
`(let [expected# (get-mark ~type)
val# (long ~v)]
(when (not= val# expected#)
(ex/raise :type :validation
:code :unexpected-mark
:hint (format "received mark %s, expected %s" val# expected#)))))
(defmacro assert-label
[expr label]
`(let [v# ~expr]
(when (not= v# ~label)
(ex/raise :type :assertion
:code :unexpected-label
:hint (format "received label %s, expected %s" v# ~label)))))
;; --- PRIMITIVE IO
(defn write-byte!
[^DataOutputStream output data]
(l/trace :fn "write-byte!" :data data :position @*position* ::l/sync? true)
(.writeByte output (byte data))
(swap! *position* inc))
(defn read-byte!
[^DataInputStream input]
(let [v (.readByte input)]
(l/trace :fn "read-byte!" :val v :position @*position* ::l/sync? true)
(swap! *position* inc)
v))
(defn write-long!
[^DataOutputStream output data]
(l/trace :fn "write-long!" :data data :position @*position* ::l/sync? true)
(.writeLong output (long data))
(swap! *position* + 8))
(defn read-long!
[^DataInputStream input]
(let [v (.readLong input)]
(l/trace :fn "read-long!" :val v :position @*position* ::l/sync? true)
(swap! *position* + 8)
v))
(defn write-bytes!
[^DataOutputStream output ^bytes data]
(let [size (alength data)]
(l/trace :fn "write-bytes!" :size size :position @*position* ::l/sync? true)
(.write output data 0 size)
(swap! *position* + size)))
(defn read-bytes!
[^InputStream input ^bytes buff]
(let [size (alength buff)
readed (.readNBytes input buff 0 size)]
(l/trace :fn "read-bytes!" :expected (alength buff) :readed readed :position @*position* ::l/sync? true)
(swap! *position* + readed)
readed))
;; --- COMPOSITE IO
(defn write-uuid!
[^DataOutputStream output id]
(l/trace :fn "write-uuid!" :position @*position* :WRITTEN? (.size output) ::l/sync? true)
(doto output
(write-byte! (get-mark :uuid))
(write-long! (uuid/get-word-high id))
(write-long! (uuid/get-word-low id))))
(defn read-uuid!
[^DataInputStream input]
(l/trace :fn "read-uuid!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :uuid)
(let [a (read-long! input)
b (read-long! input)]
(uuid/custom a b))))
(defn write-obj!
[^DataOutputStream output data]
(l/trace :fn "write-obj!" :position @*position* ::l/sync? true)
(let [^bytes data (fres/encode data)]
(doto output
(write-byte! (get-mark :obj))
(write-long! (alength data))
(write-bytes! data))))
(defn read-obj!
[^DataInputStream input]
(l/trace :fn "read-obj!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :obj)
(let [size (read-long! input)]
(assert (pos? size) "incorrect header size found on reading header")
(let [buff (byte-array size)]
(read-bytes! input buff)
(fres/decode buff)))))
(defn write-label!
[^DataOutputStream output label]
(l/trace :fn "write-label!" :label label :position @*position* ::l/sync? true)
(doto output
(write-byte! (get-mark :label))
(write-obj! label)))
(defn read-label!
[^DataInputStream input]
(l/trace :fn "read-label!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)]
(assert-mark m :label)
(read-obj! input)))
(defn write-header!
[^OutputStream output version]
(l/trace :fn "write-header!"
:version version
:position @*position*
::l/sync? true)
(let [vers (-> version name (subs 1) parse-long)
output (io/data-output-stream output)]
(doto output
(write-byte! (get-mark :header))
(write-long! penpot-magic-number)
(write-long! vers))))
(defn read-header!
[^InputStream input]
(l/trace :fn "read-header!" :position @*position* ::l/sync? true)
(let [input (io/data-input-stream input)
mark (read-byte! input)
mnum (read-long! input)
vers (read-long! input)]
(when (or (not= mark (get-mark :header))
(not= mnum penpot-magic-number))
(ex/raise :type :validation
:code :invalid-penpot-file
:hint "invalid penpot file"))
(keyword (str "v" vers))))
(defn copy-stream!
[^OutputStream output ^InputStream input ^long size]
(let [written (io/copy! input output :size size)]
(l/trace :fn "copy-stream!" :position @*position* :size size :written written ::l/sync? true)
(swap! *position* + written)
written))
(defn write-stream!
[^DataOutputStream output stream size]
(l/trace :fn "write-stream!" :position @*position* ::l/sync? true :size size)
(doto output
(write-byte! (get-mark :stream))
(write-long! size))
(copy-stream! output stream size))
(defn read-stream!
[^DataInputStream input]
(l/trace :fn "read-stream!" :position @*position* ::l/sync? true)
(let [m (read-byte! input)
s (read-long! input)
p (tmp/tempfile :prefix "penpot.binfile.")]
(assert-mark m :stream)
(when (> s max-object-size)
(ex/raise :type :validation
:code :max-file-size-reached
:hint (str/ffmt "unable to import storage object with size % bytes" s)))
(if (> s temp-file-threshold)
(with-open [^OutputStream output (io/output-stream p)]
(let [readed (io/copy! input output :offset 0 :size s)]
(l/trace :fn "read-stream*!" :expected s :readed readed :position @*position* ::l/sync? true)
(swap! *position* + readed)
[s p]))
[s (io/read-as-bytes input :size s)])))
(defmacro assert-read-label!
[input expected-label]
`(let [readed# (read-label! ~input)
expected# ~expected-label]
(when (not= readed# expected#)
(ex/raise :type :validation
:code :unexpected-label
:hint (format "unexpected label found: %s, expected: %s" readed# expected#)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; --- HELPERS
(defn zstd-input-stream
^InputStream
[input]
(ZstdInputStream. ^InputStream input))
(defn zstd-output-stream
^OutputStream
[output & {:keys [level] :or {level 0}}]
(ZstdOutputStream. ^OutputStream output (int level)))
(defn- get-files
[cfg ids]
(db/run! cfg (fn [{:keys [::db/conn]}]
(let [sql (str "SELECT id FROM file "
" WHERE id = ANY(?) ")
ids (db/create-array conn "uuid" ids)]
(->> (db/exec! conn [sql ids])
(into [] (map :id))
(not-empty))))))
;; --- EXPORT WRITER
(defmulti write-export ::version)
(defmulti write-section ::section)
(defn write-export!
[{:keys [::include-libraries ::embed-assets] :as cfg}]
(when (and include-libraries embed-assets)
(throw (IllegalArgumentException.
"the `include-libraries` and `embed-assets` are mutally excluding options")))
(write-export cfg))
(defmethod write-export :default
[{:keys [::output] :as options}]
(write-header! output :v1)
(pu/with-open [output (zstd-output-stream output :level 12)
output (io/data-output-stream output)]
(binding [bfc/*state* (volatile! {})]
(run! (fn [section]
(l/dbg :hint "write section" :section section ::l/sync? true)
(write-label! output section)
(let [options (-> options
(assoc ::output output)
(assoc ::section section))]
(binding [bfc/*options* options]
(write-section options))))
[:v1/metadata :v1/files :v1/rels :v1/sobjects]))))
(defmethod write-section :v1/metadata
[{:keys [::output ::ids ::include-libraries] :as cfg}]
(if-let [fids (get-files cfg ids)]
(let [lids (when include-libraries
(bfc/get-libraries cfg ids))
ids (into fids lids)]
(write-obj! output {:version cf/version :files ids})
(vswap! bfc/*state* assoc :files ids))
(ex/raise :type :not-found
:code :files-not-found
:hint "unable to retrieve files for export")))
(defmethod write-section :v1/files
[{:keys [::output ::embed-assets ::include-libraries] :as cfg}]
;; Initialize SIDS with empty vector
(vswap! bfc/*state* assoc :sids [])
(doseq [file-id (-> bfc/*state* deref :files)]
(let [detach? (and (not embed-assets) (not include-libraries))
thumbnails (->> (bfc/get-file-object-thumbnails cfg file-id)
(mapv #(dissoc % :file-id)))
file (cond-> (bfc/get-file cfg file-id)
detach?
(-> (ctf/detach-external-references file-id)
(dissoc :libraries))
embed-assets
(update :data #(bfc/embed-assets cfg % file-id))
:always
(assoc :thumbnails thumbnails))
media (bfc/get-file-media cfg file)]
(l/dbg :hint "write penpot file"
:id (str file-id)
:name (:name file)
:thumbnails (count thumbnails)
:features (:features file)
:media (count media)
::l/sync? true)
(doseq [item media]
(l/dbg :hint "write penpot file media object" :id (:id item) ::l/sync? true))
(doseq [item thumbnails]
(l/dbg :hint "write penpot file object thumbnail" :media-id (str (:media-id item)) ::l/sync? true))
(doto output
(write-obj! file)
(write-obj! media))
(vswap! bfc/*state* update :sids into bfc/xf-map-media-id media)
(vswap! bfc/*state* update :sids into bfc/xf-map-media-id thumbnails))))
(defmethod write-section :v1/rels
[{:keys [::output ::include-libraries] :as cfg}]
(let [ids (-> bfc/*state* deref :files set)
rels (when include-libraries
(bfc/get-files-rels cfg ids))]
(l/dbg :hint "found rels" :total (count rels) ::l/sync? true)
(write-obj! output rels)))
(defmethod write-section :v1/sobjects
[{:keys [::sto/storage ::output]}]
(let [sids (-> bfc/*state* deref :sids)
storage (media/configure-assets-storage storage)]
(l/dbg :hint "found sobjects"
:items (count sids)
::l/sync? true)
;; Write all collected storage objects
(write-obj! output sids)
(doseq [id sids]
(let [{:keys [size] :as obj} (sto/get-object storage id)]
(l/dbg :hint "write sobject" :id (str id) ::l/sync? true)
(doto output
(write-uuid! id)
(write-obj! (meta obj)))
(pu/with-open [stream (sto/get-object-data storage obj)]
(let [written (write-stream! output stream size)]
(when (not= written size)
(ex/raise :type :validation
:code :mismatch-readed-size
:hint (str/ffmt "found unexpected object size; size=% written=%" size written)))))))))
;; --- EXPORT READER
(defmulti read-import ::version)
(defmulti read-section ::section)
(s/def ::profile-id ::us/uuid)
(s/def ::project-id ::us/uuid)
(s/def ::input io/input-stream?)
(s/def ::overwrite? (s/nilable ::us/boolean))
(s/def ::ignore-index-errors? (s/nilable ::us/boolean))
;; FIXME: replace with schema
(s/def ::read-import-options
(s/keys :req [::db/pool ::sto/storage ::project-id ::profile-id ::input]
:opt [::overwrite? ::ignore-index-errors?]))
(defn read-import!
"Do the importation of the specified resource in penpot custom binary
format. There are some options for customize the importation
behavior:
`::bfc/overwrite`: if true, instead of creating new files and remapping id references,
it reuses all ids and updates existing objects; defaults to `false`."
[{:keys [::input ::bfc/timestamp] :or {timestamp (dt/now)} :as options}]
(dm/assert!
"expected input stream"
(io/input-stream? input))
(dm/assert!
"expected valid instant"
(dt/instant? timestamp))
(let [version (read-header! input)]
(read-import (assoc options ::version version ::bfc/timestamp timestamp))))
(defn- read-import-v1
[{:keys [::db/conn ::project-id ::profile-id ::input] :as cfg}]
(db/exec-one! conn ["SET LOCAL idle_in_transaction_session_timeout = 0"])
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"])
(pu/with-open [input (zstd-input-stream input)
input (io/data-input-stream input)]
(binding [bfc/*state* (volatile! {:media [] :index {}})]
(let [team (teams/get-team conn
:profile-id profile-id
:project-id project-id)
features (cfeat/get-team-enabled-features cf/flags team)]
;; Process all sections
(run! (fn [section]
(l/dbg :hint "reading section" :section section ::l/sync? true)
(assert-read-label! input section)
(let [options (-> cfg
(assoc ::bfc/features features)
(assoc ::section section)
(assoc ::input input))]
(binding [bfc/*options* options]
(events/tap :progress {:op :import :section section})
(read-section options))))
[:v1/metadata :v1/files :v1/rels :v1/sobjects])
(bfc/apply-pending-migrations! cfg)
;; Knowing that the ids of the created files are in index,
;; just lookup them and return it as a set
(let [files (-> bfc/*state* deref :files)]
(into #{} (keep #(get-in @bfc/*state* [:index %])) files))))))
(defmethod read-import :v1
[options]
(db/tx-run! options read-import-v1))
(defmethod read-section :v1/metadata
[{:keys [::input]}]
(let [{:keys [version files]} (read-obj! input)]
(l/dbg :hint "metadata readed"
:version (:full version)
:files (mapv str files)
::l/sync? true)
(vswap! bfc/*state* update :index bfc/update-index files)
(vswap! bfc/*state* assoc :version version :files files)))
(defn- remap-thumbnails
[thumbnails file-id]
(mapv (fn [thumbnail]
(-> thumbnail
(assoc :file-id file-id)
(update :object-id #(str/replace-first % #"^(.*?)/" (str file-id "/")))))
thumbnails))
(defn- clean-features
[file]
(update file :features (fn [features]
(if (set? features)
(-> features
(cfeat/migrate-legacy-features)
(set/difference cfeat/backend-only-features))
#{}))))
(defmethod read-section :v1/files
[{:keys [::db/conn ::input ::project-id ::bfc/overwrite ::name] :as system}]
(doseq [[idx expected-file-id] (d/enumerate (-> bfc/*state* deref :files))]
(let [file (read-obj! input)
media (read-obj! input)
file-id (:id file)
file-id' (bfc/lookup-index file-id)
file (clean-features file)
thumbnails (:thumbnails file)]
(when (not= file-id expected-file-id)
(ex/raise :type :validation
:code :inconsistent-penpot-file
:found-id file-id
:expected-id expected-file-id
:hint "the penpot file seems corrupt, found unexpected uuid (file-id)"))
(l/dbg :hint "processing file"
:id (str file-id)
:features (:features file)
:version (-> file :data :version)
:media (count media)
:thumbnails (count thumbnails)
::l/sync? true)
(when (seq thumbnails)
(let [thumbnails (remap-thumbnails thumbnails file-id')]
(l/dbg :hint "updated index with thumbnails" :total (count thumbnails) ::l/sync? true)
(vswap! bfc/*state* update :thumbnails bfc/into-vec thumbnails)))
(when (seq media)
;; Update index with media
(l/dbg :hint "update index with media" :total (count media) ::l/sync? true)
(vswap! bfc/*state* update :index bfc/update-index (map :id media))
;; Store file media for later insertion
(l/dbg :hint "update media references" ::l/sync? true)
(vswap! bfc/*state* update :media into (map #(update % :id bfc/lookup-index)) media))
(let [file (-> file
(assoc :id file-id')
(cond-> (and (= idx 0) (some? name))
(assoc :name name))
(assoc :project-id project-id)
(dissoc :thumbnails)
(bfc/process-file))]
;; All features that are enabled and requires explicit migration are
;; added to the state for a posterior migration step.
(doseq [feature (-> (::bfc/features system)
(set/difference cfeat/no-migration-features)
(set/difference (:features file)))]
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature file-id']))
(l/dbg :hint "create file" :id (str file-id') ::l/sync? true)
(bfc/persist-file! system file)
(when overwrite
(db/delete! conn :file-thumbnail {:file-id file-id'}))
file-id'))))
(defmethod read-section :v1/rels
[{:keys [::db/conn ::input ::bfc/timestamp]}]
(let [rels (read-obj! input)
ids (into #{} (-> bfc/*state* deref :files))]
;; Insert all file relations
(doseq [{:keys [library-file-id] :as rel} rels]
(let [rel (-> rel
(assoc :synced-at timestamp)
(update :file-id bfc/lookup-index)
(update :library-file-id bfc/lookup-index))]
(if (contains? ids library-file-id)
(do
(l/dbg :hint "create file library link"
:file-id (:file-id rel)
:lib-id (:library-file-id rel)
::l/sync? true)
(db/insert! conn :file-library-rel rel))
(l/warn :hint "ignoring file library link"
:file-id (:file-id rel)
:lib-id (:library-file-id rel)
::l/sync? true))))))
(defmethod read-section :v1/sobjects
[{:keys [::sto/storage ::db/conn ::input ::bfc/overwrite ::bfc/timestamp]}]
(let [storage (media/configure-assets-storage storage)
ids (read-obj! input)
thumb? (into #{} (map :media-id) (:thumbnails @bfc/*state*))]
(doseq [expected-storage-id ids]
(let [id (read-uuid! input)
mdata (read-obj! input)]
(when (not= id expected-storage-id)
(ex/raise :type :validation
:code :inconsistent-penpot-file
:hint "the penpot file seems corrupt, found unexpected uuid (storage-object-id)"))
(l/dbg :hint "readed storage object" :id (str id) ::l/sync? true)
(let [[size resource] (read-stream! input)
hash (sto/calculate-hash resource)
content (-> (sto/content resource size)
(sto/wrap-with-hash hash))
params (-> mdata
(assoc ::sto/content content)
(assoc ::sto/deduplicate? true)
(assoc ::sto/touched-at timestamp))
params (if (thumb? id)
(assoc params :bucket "file-object-thumbnail")
(assoc params :bucket "file-media-object"))
sobject (sto/put-object! storage params)]
(l/dbg :hint "persisted storage object"
:old-id (str id)
:new-id (str (:id sobject))
:is-thumbnail (boolean (thumb? id))
::l/sync? true)
(vswap! bfc/*state* update :index assoc id (:id sobject)))))
(doseq [item (:media @bfc/*state*)]
(l/dbg :hint "inserting file media object"
:id (str (:id item))
:file-id (str (:file-id item))
::l/sync? true)
(let [file-id (bfc/lookup-index (:file-id item))]
(if (= file-id (:file-id item))
(l/warn :hint "ignoring file media object" :file-id (str file-id) ::l/sync? true)
(db/insert! conn :file-media-object
(-> item
(assoc :file-id file-id)
(d/update-when :media-id bfc/lookup-index)
(d/update-when :thumbnail-id bfc/lookup-index))
{::db/on-conflict-do-nothing? overwrite}))))
(doseq [item (:thumbnails @bfc/*state*)]
(let [item (update item :media-id bfc/lookup-index)]
(l/dbg :hint "inserting file object thumbnail"
:file-id (str (:file-id item))
:media-id (str (:media-id item))
:object-id (:object-id item)
::l/sync? true)
(db/insert! conn :file-tagged-object-thumbnail item
{::db/on-conflict-do-nothing? overwrite})))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HIGH LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-files!
"Do the exportation of a specified file in custom penpot binary
format. There are some options available for customize the output:
`::include-libraries`: additionally to the specified file, all the
linked libraries also will be included (including transitive
dependencies).
`::embed-assets`: instead of including the libraries, embed in the
same file library all assets used from external libraries."
[{:keys [::ids] :as cfg} output]
(dm/assert!
"expected a set of uuid's for `::ids` parameter"
(and (set? ids)
(every? uuid? ids)))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(satisfies? jio/IOFactory output))
(let [id (uuid/next)
tp (dt/tpoint)
ab (volatile! false)
cs (volatile! nil)]
(try
(l/info :hint "start exportation" :export-id (str id))
(pu/with-open [output (io/output-stream output)]
(binding [*position* (atom 0)]
(write-export! (assoc cfg ::output output))))
(catch java.io.IOException _cause
;; Do nothing, EOF means client closes connection abruptly
(vreset! ab true)
nil)
(catch Throwable cause
(vreset! cs cause)
(vreset! ab true)
(throw cause))
(finally
(l/info :hint "exportation finished" :export-id (str id)
:elapsed (str (inst-ms (tp)) "ms")
:aborted @ab
:cause @cs)))))
(defn import-files!
[cfg input]
(dm/assert!
"expected valid profile-id and project-id on `cfg`"
(and (uuid? (::profile-id cfg))
(uuid? (::project-id cfg))))
(dm/assert!
"expected instance of jio/IOFactory for `input`"
(satisfies? jio/IOFactory input))
(let [id (uuid/next)
tp (dt/tpoint)
cs (volatile! nil)]
(l/info :hint "import: started" :id (str id))
(try
(binding [*position* (atom 0)]
(pu/with-open [input (io/input-stream input)]
(read-import! (assoc cfg ::input input))))
(catch ZstdIOException cause
(ex/raise :type :validation
:code :invalid-penpot-file
:hint "invalid penpot file received: probably truncated"
:cause cause))
(catch Throwable cause
(vreset! cs cause)
(throw cause))
(finally
(l/info :hint "import: terminated"
:id (str id)
:elapsed (dt/format-duration (tp))
:error? (some? @cs))))))

View File

@@ -0,0 +1,442 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.binfile.v2
"A sqlite3 based binary file exportation with support for exportation
of entire team (or multiple teams) at once."
(:refer-clojure :exclude [read])
(:require
[app.binfile.common :as bfc]
[app.common.data :as d]
[app.common.features :as cfeat]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.loggers.audit :as-alias audit]
[app.loggers.webhooks :as-alias webhooks]
[app.media :as media]
[app.storage :as sto]
[app.storage.tmp :as tmp]
[app.util.events :as events]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[clojure.set :as set]
[cuerdas.core :as str]
[datoteka.io :as io]
[promesa.util :as pu])
(:import
java.sql.DriverManager))
(set! *warn-on-reflection* true)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LOW LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- create-database
([cfg]
(let [path (tmp/tempfile :prefix "penpot.binfile." :suffix ".sqlite")]
(create-database cfg path)))
([cfg path]
(let [db (DriverManager/getConnection (str "jdbc:sqlite:" path))]
(assoc cfg ::db db ::path path))))
(def ^:private
sql:create-kvdata-table
"CREATE TABLE kvdata (
tag text NOT NULL,
key text NOT NULL,
val text NOT NULL,
dat blob NULL
)")
(def ^:private
sql:create-kvdata-index
"CREATE INDEX kvdata__tag_key__idx
ON kvdata (tag, key)")
(defn- setup-schema!
[{:keys [::db]}]
(db/exec-one! db [sql:create-kvdata-table])
(db/exec-one! db [sql:create-kvdata-index]))
(defn- write!
[{:keys [::db]} tag k v & [data]]
(db/insert! db :kvdata
{:tag (d/name tag)
:key (str k)
:val (t/encode-str v {:type :json-verbose})
:dat data}
{::db/return-keys false}))
(defn- read-blob
[{:keys [::db]} tag k]
(let [obj (db/get db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [:dat]})]
(:dat obj)))
(defn- read-seq
([{:keys [::db]} tag]
(->> (db/query db :kvdata
{:tag (d/name tag)}
{::sql/columns [::val]})
(map :val)
(map t/decode-str)))
([{:keys [::db]} tag k]
(->> (db/query db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [::val]})
(map :val)
(map t/decode-str))))
(defn- read-obj
[{:keys [::db]} tag k]
(let [obj (db/get db :kvdata
{:tag (d/name tag)
:key (str k)}
{::sql/columns [:val]})]
(-> obj :val t/decode-str)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IMPORT/EXPORT IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare ^:private write-project!)
(declare ^:private write-file!)
(defn- write-team!
[cfg team-id]
(let [team (bfc/get-team cfg team-id)
fonts (bfc/get-fonts cfg team-id)]
(events/tap :progress
{:op :export
:section :write-team
:id team-id
:name (:name team)})
(l/trc :hint "write" :obj "team"
:id (str team-id)
:fonts (count fonts))
(when-let [photo-id (:photo-id team)]
(vswap! bfc/*state* update :storage-objects conj photo-id))
(vswap! bfc/*state* update :teams conj team-id)
(vswap! bfc/*state* bfc/collect-storage-objects fonts)
(write! cfg :team team-id team)
(doseq [{:keys [id] :as font} fonts]
(vswap! bfc/*state* update :team-font-variants conj id)
(write! cfg :team-font-variant id font))))
(defn- write-project!
[cfg project-id]
(let [project (bfc/get-project cfg project-id)]
(events/tap :progress
{:op :export
:section :write-project
:id project-id
:name (:name project)})
(l/trc :hint "write" :obj "project" :id (str project-id))
(write! cfg :project (str project-id) project)
(vswap! bfc/*state* update :projects conj project-id)))
(defn- write-file!
[cfg file-id]
(let [file (bfc/get-file cfg file-id)
thumbs (bfc/get-file-object-thumbnails cfg file-id)
media (bfc/get-file-media cfg file)
rels (bfc/get-files-rels cfg #{file-id})]
(events/tap :progress
{:op :export
:section :write-file
:id file-id
:name (:name file)})
(vswap! bfc/*state* (fn [state]
(-> state
(update :files conj file-id)
(update :file-media-objects into bfc/xf-map-id media)
(bfc/collect-storage-objects thumbs)
(bfc/collect-storage-objects media))))
(write! cfg :file file-id file)
(write! cfg :file-rels file-id rels)
(run! (partial write! cfg :file-media-object file-id) media)
(run! (partial write! cfg :file-object-thumbnail file-id) thumbs)
(when-let [thumb (bfc/get-file-thumbnail cfg file)]
(vswap! bfc/*state* bfc/collect-storage-objects [thumb])
(write! cfg :file-thumbnail file-id thumb))
(l/trc :hint "write" :obj "file"
:thumbnails (count thumbs)
:rels (count rels)
:media (count media))))
(defn- write-storage-object!
[{:keys [::sto/storage] :as cfg} id]
(let [sobj (sto/get-object storage id)
data (with-open [input (sto/get-object-data storage sobj)]
(io/read-as-bytes input))]
(l/trc :hint "write" :obj "storage-object" :id (str id) :size (:size sobj))
(write! cfg :storage-object id (meta sobj) data)))
(defn- read-storage-object!
[{:keys [::sto/storage ::bfc/timestamp] :as cfg} id]
(let [mdata (read-obj cfg :storage-object id)
data (read-blob cfg :storage-object id)
hash (sto/calculate-hash data)
content (-> (sto/content data)
(sto/wrap-with-hash hash))
params (-> mdata
(assoc ::sto/content content)
(assoc ::sto/deduplicate? true)
(assoc ::sto/touched-at timestamp))
sobject (sto/put-object! storage params)]
(vswap! bfc/*state* update :index assoc id (:id sobject))
(l/trc :hint "read" :obj "storage-object"
:id (str id)
:new-id (str (:id sobject))
:size (:size sobject))))
(defn read-team!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} team-id]
(l/trc :hint "read" :obj "team" :id (str team-id))
(let [team (read-obj cfg :team team-id)
team (-> team
(update :id bfc/lookup-index)
(update :photo-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(events/tap :progress
{:op :import
:section :read-team
:id team-id
:name (:name team)})
(db/insert! conn :team
(update team :features db/encode-pgarray conn "text")
::db/return-keys false)
(doseq [font (->> (read-seq cfg :team-font-variant)
(filter #(= team-id (:team-id %))))]
(let [font (-> font
(update :id bfc/lookup-index)
(update :team-id bfc/lookup-index)
(update :woff1-file-id bfc/lookup-index)
(update :woff2-file-id bfc/lookup-index)
(update :ttf-file-id bfc/lookup-index)
(update :otf-file-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(db/insert! conn :team-font-variant font
::db/return-keys false)))
team))
(defn read-project!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} project-id]
(l/trc :hint "read" :obj "project" :id (str project-id))
(let [project (read-obj cfg :project project-id)
project (-> project
(update :id bfc/lookup-index)
(update :team-id bfc/lookup-index)
(assoc :created-at timestamp)
(assoc :modified-at timestamp))]
(events/tap :progress
{:op :import
:section :read-project
:id project-id
:name (:name project)})
(db/insert! conn :project project
::db/return-keys false)))
(defn read-file!
[{:keys [::db/conn ::bfc/timestamp] :as cfg} file-id]
(l/trc :hint "read" :obj "file" :id (str file-id))
(let [file (-> (read-obj cfg :file file-id)
(update :id bfc/lookup-index)
(update :project-id bfc/lookup-index)
(bfc/process-file))]
(events/tap :progress
{:op :import
:section :read-file
:id file-id
:name (:name file)})
;; All features that are enabled and requires explicit migration are
;; added to the state for a posterior migration step.
(doseq [feature (-> (::bfc/features cfg)
(set/difference cfeat/no-migration-features)
(set/difference (:features file)))]
(vswap! bfc/*state* update :pending-to-migrate (fnil conj []) [feature (:id file)]))
(bfc/persist-file! cfg file))
(doseq [thumbnail (read-seq cfg :file-object-thumbnail file-id)]
(let [thumbnail (-> thumbnail
(update :file-id bfc/lookup-index)
(update :media-id bfc/lookup-index))
file-id (:file-id thumbnail)
thumbnail (update thumbnail :object-id
#(str/replace-first % #"^(.*?)/" (str file-id "/")))]
(db/insert! conn :file-tagged-object-thumbnail thumbnail
{::db/return-keys false})))
(doseq [rel (read-obj cfg :file-rels file-id)]
(let [rel (-> rel
(update :file-id bfc/lookup-index)
(update :library-file-id bfc/lookup-index)
(assoc :synced-at timestamp))]
(db/insert! conn :file-library-rel rel
::db/return-keys false)))
(doseq [media (read-seq cfg :file-media-object file-id)]
(let [media (-> media
(update :id bfc/lookup-index)
(update :file-id bfc/lookup-index)
(update :media-id bfc/lookup-index)
(update :thumbnail-id bfc/lookup-index))]
(db/insert! conn :file-media-object media
::db/return-keys false
::sql/on-conflict-do-nothing true))))
(def ^:private empty-summary
{:teams #{}
:files #{}
:projects #{}
:file-media-objects #{}
:team-font-variants #{}
:storage-objects #{}})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUBLIC API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-team!
[cfg team-id]
(let [id (uuid/next)
tp (dt/tpoint)
cfg (-> (create-database cfg)
(update ::sto/storage media/configure-assets-storage))]
(l/inf :hint "start"
:operation "export"
:id (str id)
:path (str (::path cfg)))
(try
(db/tx-run! cfg (fn [cfg]
(setup-schema! cfg)
(binding [bfc/*state* (volatile! empty-summary)]
(write-team! cfg team-id)
(run! (partial write-project! cfg)
(bfc/get-team-projects cfg team-id))
(run! (partial write-file! cfg)
(bfc/get-team-files cfg team-id))
(run! (partial write-storage-object! cfg)
(-> bfc/*state* deref :storage-objects))
(write! cfg :manifest "team-id" team-id)
(write! cfg :manifest "objects" (deref bfc/*state*))
(::path cfg))))
(finally
(pu/close! (::db cfg))
(let [elapsed (tp)]
(l/inf :hint "end"
:operation "export"
:id (str id)
:elapsed (dt/format-duration elapsed)))))))
(defn import-team!
[cfg path]
(let [id (uuid/next)
tp (dt/tpoint)
cfg (-> (create-database cfg path)
(update ::sto/storage media/configure-assets-storage)
(assoc ::bfc/timestamp (dt/now)))]
(l/inf :hint "start"
:operation "import"
:id (str id)
:path (str (::path cfg)))
(try
(db/tx-run! cfg (fn [{:keys [::db/conn] :as cfg}]
(db/exec-one! conn ["SET idle_in_transaction_session_timeout = 0"])
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED"])
(binding [bfc/*state* (volatile! {:index {}})]
(let [objects (read-obj cfg :manifest "objects")]
;; We first process all storage objects, they have
;; deduplication so we can't rely on simple reindex. This
;; operation populates the index for all storage objects.
(run! (partial read-storage-object! cfg) (:storage-objects objects))
;; Populate index with all the incoming objects
(vswap! bfc/*state* update :index
(fn [index]
(-> index
(bfc/update-index (:teams objects))
(bfc/update-index (:projects objects))
(bfc/update-index (:files objects))
(bfc/update-index (:file-media-objects objects))
(bfc/update-index (:team-font-variants objects)))))
(let [team-id (read-obj cfg :manifest "team-id")
team (read-team! cfg team-id)
features (cfeat/get-team-enabled-features cf/flags team)
cfg (assoc cfg ::bfc/features features)]
(run! (partial read-project! cfg) (:projects objects))
(run! (partial read-file! cfg) (:files objects))
;; (run-pending-migrations! cfg)
team)))))
(finally
(pu/close! (::db cfg))
(let [elapsed (tp)]
(l/inf :hint "end"
:operation "import"
:id (str id)
:elapsed (dt/format-duration elapsed)))))))

View File

@@ -1,169 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.cli.manage
"A manage cli api."
(:require
[app.common.logging :as l]
[app.db :as db]
[app.main :as main]
[app.rpc.commands.auth :as cmd.auth]
[app.rpc.mutations.profile :as profile]
[app.rpc.queries.profile :refer [retrieve-profile-data-by-email]]
[clojure.string :as str]
[clojure.tools.cli :refer [parse-opts]]
[integrant.core :as ig])
(:import
java.io.Console))
;; --- IMPL
(defn init-system
[]
(let [data (-> main/system-config
(select-keys [:app.db/pool :app.metrics/metrics])
(assoc :app.migrations/all {}))]
(-> data ig/prep ig/init)))
(defn- read-from-console
[{:keys [label type] :or {type :text}}]
(let [^Console console (System/console)]
(when-not console
(l/error :hint "no console found, can proceed")
(System/exit 1))
(binding [*out* (.writer console)]
(print label " ")
(.flush *out*))
(case type
:text (.readLine console)
:password (String. (.readPassword console)))))
(defn create-profile
[options]
(let [system (init-system)
email (or (:email options)
(read-from-console {:label "Email:"}))
fullname (or (:fullname options)
(read-from-console {:label "Full Name:"}))
password (or (:password options)
(read-from-console {:label "Password:"
:type :password}))]
(try
(db/with-atomic [conn (:app.db/pool system)]
(->> (cmd.auth/create-profile conn
{:fullname fullname
:email email
:password password
:is-active true
:is-demo false})
(cmd.auth/create-profile-relations conn)))
(when (pos? (:verbosity options))
(println "User created successfully."))
(System/exit 0)
(catch Exception _e
(when (pos? (:verbosity options))
(println "Unable to create user, already exists."))
(System/exit 1)))))
(defn reset-password
[options]
(let [system (init-system)]
(try
(db/with-atomic [conn (:app.db/pool system)]
(let [email (or (:email options)
(read-from-console {:label "Email:"}))
profile (retrieve-profile-data-by-email conn email)]
(when-not profile
(when (pos? (:verbosity options))
(println "Profile does not exists."))
(System/exit 1))
(let [password (or (:password options)
(read-from-console {:label "Password:"
:type :password}))]
(profile/update-profile-password! conn (assoc profile :password password))
(when (pos? (:verbosity options))
(println "Password changed successfully.")))))
(System/exit 0)
(catch Exception e
(when (pos? (:verbosity options))
(println "Unable to change password."))
(when (= 2 (:verbosity options))
(.printStackTrace e))
(System/exit 1)))))
;; --- CLI PARSE
(def cli-options
;; An option with a required argument
[["-u" "--email EMAIL" "Email Address"]
["-p" "--password PASSWORD" "Password"]
["-n" "--name FULLNAME" "Full Name"
:id :fullname]
["-v" nil "Verbosity level"
:id :verbosity
:default 1
:update-fn inc]
["-q" nil "Don't print to console"
:id :verbosity
:update-fn (constantly 0)]
["-h" "--help"]])
(defn usage
[options-summary]
(->> ["Penpot CLI management."
""
"Usage: manage [options] action"
""
"Options:"
options-summary
""
"Actions:"
" create-profile Create new profile."
" reset-password Reset profile password."
""]
(str/join \newline)))
(defn error-msg [errors]
(str "The following errors occurred while parsing your command:\n\n"
(str/join \newline errors)))
(defn validate-args
"Validate command line arguments. Either return a map indicating the program
should exit (with a error message, and optional ok status), or a map
indicating the action the program should take and the options provided."
[args]
(let [{:keys [options arguments errors summary] :as opts} (parse-opts args cli-options)]
(cond
(:help options) ; help => exit OK with usage summary
{:exit-message (usage summary) :ok? true}
errors ; errors => exit with description of errors
{:exit-message (error-msg errors)}
;; custom validation on arguments
:else
(let [action (first arguments)]
(if (#{"create-profile" "reset-password"} action)
{:action (first arguments) :options options}
{:exit-message (usage summary)})))))
(defn exit [status msg]
(println msg)
(System/exit status))
(defn -main
[& args]
(let [{:keys [action options exit-message ok?]} (validate-args args)]
(if exit-message
(exit (if ok? 0 1) exit-message)
(case action
"create-profile" (create-profile options)
"reset-password" (reset-password options)))))

View File

@@ -51,7 +51,6 @@
:database-password "penpot"
:default-blob-version 5
:loggers-zmq-uri "tcp://localhost:45556"
:rpc-rlimit-config (fs/path "resources/rlimit.edn")
:rpc-climit-config (fs/path "resources/climit.edn")
@@ -80,6 +79,8 @@
:telemetry-uri "https://telemetry.penpot.app/"
:media-max-file-size (* 1024 1024 30) ; 30MiB
:ldap-user-query "(|(uid=:username)(mail=:username))"
:ldap-attrs-username "uid"
:ldap-attrs-email "mail"
@@ -100,6 +101,8 @@
(s/def ::audit-log-archive-uri ::us/string)
(s/def ::audit-log-http-handler-concurrency ::us/integer)
(s/def ::deletion-delay ::dt/duration)
(s/def ::admins ::us/set-of-valid-emails)
(s/def ::file-change-snapshot-every ::us/integer)
(s/def ::file-change-snapshot-timeout ::dt/duration)
@@ -126,6 +129,7 @@
(s/def ::database-max-pool-size ::us/integer)
(s/def ::quotes-teams-per-profile ::us/integer)
(s/def ::quotes-access-tokens-per-profile ::us/integer)
(s/def ::quotes-projects-per-team ::us/integer)
(s/def ::quotes-invitations-per-team ::us/integer)
(s/def ::quotes-profiles-per-team ::us/integer)
@@ -146,16 +150,18 @@
(s/def ::google-client-id ::us/string)
(s/def ::google-client-secret ::us/string)
(s/def ::oidc-client-id ::us/string)
(s/def ::oidc-user-info-source ::us/keyword)
(s/def ::oidc-client-secret ::us/string)
(s/def ::oidc-base-uri ::us/string)
(s/def ::oidc-token-uri ::us/string)
(s/def ::oidc-auth-uri ::us/string)
(s/def ::oidc-user-uri ::us/string)
(s/def ::oidc-jwks-uri ::us/string)
(s/def ::oidc-scopes ::us/set-of-strings)
(s/def ::oidc-roles ::us/set-of-strings)
(s/def ::oidc-roles-attr ::us/keyword)
(s/def ::oidc-email-attr ::us/keyword)
(s/def ::oidc-name-attr ::us/keyword)
(s/def ::oidc-roles-attr ::us/string)
(s/def ::oidc-email-attr ::us/string)
(s/def ::oidc-name-attr ::us/string)
(s/def ::host ::us/string)
(s/def ::http-server-port ::us/integer)
(s/def ::http-server-host ::us/string)
@@ -174,8 +180,6 @@
(s/def ::ldap-ssl ::us/boolean)
(s/def ::ldap-starttls ::us/boolean)
(s/def ::ldap-user-query ::us/string)
(s/def ::loggers-loki-uri ::us/string)
(s/def ::loggers-zmq-uri ::us/string)
(s/def ::media-directory ::us/string)
(s/def ::media-uri ::us/string)
(s/def ::profile-bounce-max-age ::dt/duration)
@@ -203,6 +207,7 @@
(s/def ::storage-assets-s3-bucket ::us/string)
(s/def ::storage-assets-s3-region ::us/keyword)
(s/def ::storage-assets-s3-endpoint ::us/string)
(s/def ::storage-assets-s3-io-threads ::us/integer)
(s/def ::telemetry-uri ::us/string)
(s/def ::telemetry-with-taiga ::us/boolean)
(s/def ::tenant ::us/string)
@@ -211,6 +216,7 @@
(s/keys :opt-un [::secret-key
::flags
::admins
::deletion-delay
::allow-demo-users
::audit-log-archive-uri
::audit-log-http-handler-concurrency
@@ -243,10 +249,12 @@
::google-client-secret
::oidc-client-id
::oidc-client-secret
::oidc-user-info-source
::oidc-base-uri
::oidc-token-uri
::oidc-auth-uri
::oidc-user-uri
::oidc-jwks-uri
::oidc-scopes
::oidc-roles-attr
::oidc-email-attr
@@ -271,8 +279,6 @@
::ldap-starttls
::ldap-user-query
::local-assets-uri
::loggers-loki-uri
::loggers-zmq-uri
::media-max-file-size
::profile-bounce-max-age
::profile-bounce-threshold
@@ -281,6 +287,7 @@
::public-uri
::quotes-teams-per-profile
::quotes-access-tokens-per-profile
::quotes-projects-per-team
::quotes-invitations-per-team
::quotes-profiles-per-team
@@ -293,6 +300,7 @@
::redis-uri
::registration-domain-whitelist
::rpc-rlimit-config
::rpc-climit-config
::semaphore-process-font
::semaphore-process-image
@@ -318,6 +326,7 @@
::storage-assets-s3-bucket
::storage-assets-s3-region
::storage-assets-s3-endpoint
::storage-assets-s3-io-threads
::telemetry-enabled
::telemetry-uri
::telemetry-referer
@@ -326,9 +335,11 @@
(def default-flags
[:enable-backend-api-doc
:enable-backend-openapi-doc
:enable-backend-worker
:enable-secure-session-cookies
:enable-email-verification])
:enable-email-verification
:enable-v2-migration])
(defn- parse-flags
[config]
@@ -355,7 +366,7 @@
(merge defaults)
(us/conform ::config))
(catch Throwable e
(when (ex/ex-info? e)
(when (ex/error? e)
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")
(println "Error on validating configuration:")
(println (some-> e ex-data ex/explain))
@@ -373,7 +384,8 @@
(defonce ^:dynamic flags (parse-flags config))
(def deletion-delay
(dt/duration {:days 7}))
(or (c/get config :deletion-delay)
(dt/duration {:days 7})))
(defn get
"A configuration getter. Helps code be more testable."

View File

@@ -5,7 +5,7 @@
;; Copyright (c) KALEIDOS INC
(ns app.db
(:refer-clojure :exclude [get])
(:refer-clojure :exclude [get run!])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
@@ -17,9 +17,9 @@
[app.db.sql :as sql]
[app.metrics :as mtx]
[app.util.json :as json]
[app.util.migrations :as mg]
[app.util.time :as dt]
[clojure.java.io :as io]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[next.jdbc :as jdbc]
@@ -32,7 +32,6 @@
io.whitfin.siphash.SipHasherContainer
java.io.InputStream
java.io.OutputStream
java.lang.AutoCloseable
java.sql.Connection
java.sql.Savepoint
org.postgresql.PGConnection
@@ -50,12 +49,9 @@
;; Initialization
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare apply-migrations!)
(s/def ::connection-timeout ::us/integer)
(s/def ::max-size ::us/integer)
(s/def ::min-size ::us/integer)
(s/def ::migrations map?)
(s/def ::name keyword?)
(s/def ::password ::us/string)
(s/def ::uri ::us/not-empty-string)
@@ -64,26 +60,26 @@
(s/def ::read-only? ::us/boolean)
(s/def ::pool-options
(s/keys :opt-un [::uri ::name
::min-size
::max-size
::connection-timeout
::validation-timeout
::migrations
::username
::password
::mtx/metrics
::read-only?]))
(s/keys :opt [::uri
::name
::min-size
::max-size
::connection-timeout
::validation-timeout
::username
::password
::mtx/metrics
::read-only?]))
(def defaults
{:name :main
:min-size 0
:max-size 60
:connection-timeout 10000
:validation-timeout 10000
:idle-timeout 120000 ; 2min
:max-lifetime 1800000 ; 30m
:read-only? false})
{::name :main
::min-size 0
::max-size 60
::connection-timeout 10000
::validation-timeout 10000
::idle-timeout 120000 ; 2min
::max-lifetime 1800000 ; 30m
::read-only? false})
(defmethod ig/prep-key ::pool
[_ cfg]
@@ -93,39 +89,23 @@
(defmethod ig/pre-init-spec ::pool [_] ::pool-options)
(defmethod ig/init-key ::pool
[_ {:keys [migrations read-only? uri] :as cfg}]
(if uri
(let [pool (create-pool cfg)]
(l/info :hint "initialize connection pool"
:name (d/name (:name cfg))
:uri uri
:read-only read-only?
:with-credentials (and (contains? cfg :username)
(contains? cfg :password))
:min-size (:min-size cfg)
:max-size (:max-size cfg))
(when-not read-only?
(some->> (seq migrations) (apply-migrations! pool)))
pool)
(do
(l/warn :hint "unable to initialize pool, missing url"
:name (d/name (:name cfg))
:read-only read-only?)
nil)))
[_ {:keys [::uri ::read-only?] :as cfg}]
(when uri
(l/info :hint "initialize connection pool"
:name (d/name (::name cfg))
:uri uri
:read-only read-only?
:with-credentials (and (contains? cfg ::username)
(contains? cfg ::password))
:min-size (::min-size cfg)
:max-size (::max-size cfg))
(create-pool cfg)))
(defmethod ig/halt-key! ::pool
[_ pool]
(when pool
(.close ^HikariDataSource pool)))
(defn- apply-migrations!
[pool migrations]
(with-open [conn ^AutoCloseable (open pool)]
(mg/setup! conn)
(doseq [[name steps] migrations]
(mg/migrate! conn {:name (d/name name) :steps steps}))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; API & Impl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -135,19 +115,19 @@
"SET idle_in_transaction_session_timeout = 300000;"))
(defn- create-datasource-config
[{:keys [metrics uri] :as cfg}]
[{:keys [::mtx/metrics ::uri] :as cfg}]
(let [config (HikariConfig.)]
(doto config
(.setJdbcUrl (str "jdbc:" uri))
(.setPoolName (d/name (:name cfg)))
(.setPoolName (d/name (::name cfg)))
(.setAutoCommit true)
(.setReadOnly (:read-only? cfg))
(.setConnectionTimeout (:connection-timeout cfg))
(.setValidationTimeout (:validation-timeout cfg))
(.setIdleTimeout (:idle-timeout cfg))
(.setMaxLifetime (:max-lifetime cfg))
(.setMinimumIdle (:min-size cfg))
(.setMaximumPoolSize (:max-size cfg))
(.setReadOnly (::read-only? cfg))
(.setConnectionTimeout (::connection-timeout cfg))
(.setValidationTimeout (::validation-timeout cfg))
(.setIdleTimeout (::idle-timeout cfg))
(.setMaxLifetime (::max-lifetime cfg))
(.setMinimumIdle (::min-size cfg))
(.setMaximumPoolSize (::max-size cfg))
(.setConnectionInitSql initsql)
(.setInitializationFailTimeout -1))
@@ -157,8 +137,8 @@
(PrometheusMetricsTrackerFactory.)
(.setMetricsTrackerFactory config)))
(some->> ^String (:username cfg) (.setUsername config))
(some->> ^String (:password cfg) (.setPassword config))
(some->> ^String (::username cfg) (.setUsername config))
(some->> ^String (::password cfg) (.setPassword config))
config))
@@ -166,16 +146,32 @@
[v]
(instance? javax.sql.DataSource v))
(defn connection?
[conn]
(instance? Connection conn))
(s/def ::conn some?)
(s/def ::nilable-pool (s/nilable ::pool))
(s/def ::pool pool?)
(s/def ::conn-or-pool some?)
(s/def ::pool-or-conn some?)
(defn closed?
[pool]
(.isClosed ^HikariDataSource pool))
(defn read-only?
[pool]
(.isReadOnly ^HikariDataSource pool))
[pool-or-conn]
(cond
(instance? HikariDataSource pool-or-conn)
(.isReadOnly ^HikariDataSource pool-or-conn)
(instance? Connection pool-or-conn)
(.isReadOnly ^Connection pool-or-conn)
:else
(ex/raise :type :internal
:code :invalid-connection
:hint "invalid connection provided")))
(defn create-pool
[cfg]
@@ -227,50 +223,164 @@
(defmacro with-atomic
[& args]
`(jdbc/with-transaction ~@args))
(if (symbol? (first args))
(let [cfgs (first args)
body (rest args)]
`(jdbc/with-transaction [conn# (::pool ~cfgs)]
(let [~cfgs (assoc ~cfgs ::conn conn#)]
~@body)))
`(jdbc/with-transaction ~@args)))
(defn open
[pool]
(jdbc/get-connection pool))
[system-or-pool]
(if (pool? system-or-pool)
(jdbc/get-connection system-or-pool)
(if (map? system-or-pool)
(open (::pool system-or-pool))
(throw (IllegalArgumentException. "unable to resolve connection pool")))))
(defn get-update-count
[result]
(:next.jdbc/update-count result))
(defn get-connection
[cfg-or-conn]
(if (connection? cfg-or-conn)
cfg-or-conn
(if (map? cfg-or-conn)
(get-connection (::conn cfg-or-conn))
(throw (IllegalArgumentException. "unable to resolve connection")))))
(defn connection-map?
"Check if the provided value is a map like data structure that
contains a database connection."
[o]
(and (map? o) (connection? (::conn o))))
(defn get-connectable
"Resolve to a connection or connection pool instance; if it is not
possible, raises an exception"
[o]
(cond
(connection? o) o
(pool? o) o
(map? o) (get-connectable (or (::conn o) (::pool o)))
:else (throw (IllegalArgumentException. "unable to resolve connectable"))))
(def ^:private params-mapping
{::return-keys? :return-keys
::return-keys :return-keys})
(defn rename-opts
[opts]
(set/rename-keys opts params-mapping))
(def ^:private default-insert-opts
{:builder-fn sql/as-kebab-maps
:return-keys true})
(def ^:private default-opts
{:builder-fn sql/as-kebab-maps})
(defn exec!
([ds sv]
(exec! ds sv {}))
([ds sv] (exec! ds sv nil))
([ds sv opts]
(jdbc/execute! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(let [conn (get-connectable ds)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(jdbc/execute! conn sv opts))))
(defn exec-one!
([ds sv] (exec-one! ds sv {}))
([ds sv] (exec-one! ds sv nil))
([ds sv opts]
(jdbc/execute-one! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(let [conn (get-connectable ds)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(jdbc/execute-one! conn sv opts))))
(defn insert!
([ds table params] (insert! ds table params nil))
([ds table params opts]
(exec-one! ds
(sql/insert table params opts)
(merge {:return-keys true} opts))))
"A helper that builds an insert sql statement and executes it. By
default returns the inserted row with all the field; you can delimit
the returned columns with the `::columns` option."
[ds table params & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/insert table params opts)
opts (if (empty? opts)
default-insert-opts
(into default-insert-opts (rename-opts opts)))]
(jdbc/execute-one! conn sql opts)))
(defn insert-multi!
([ds table cols rows] (insert-multi! ds table cols rows nil))
([ds table cols rows opts]
(exec! ds
(sql/insert-multi table cols rows opts)
(merge {:return-keys true} opts))))
(defn insert-many!
"An optimized version of `insert!` that perform insertion of multiple
values at once.
This expands to a single SQL statement with placeholders for every
value being inserted. For large data sets, this may exceed the limit
of sql string size and/or number of parameters."
[ds table cols rows & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/insert-many table cols rows opts)
opts (if (empty? opts)
default-insert-opts
(into default-insert-opts (rename-opts opts)))
opts (update opts :return-keys boolean)]
(jdbc/execute! conn sql opts)))
(defn update!
([ds table params where] (update! ds table params where nil))
([ds table params where opts]
(exec-one! ds
(sql/update table params where opts)
(merge {:return-keys true} opts))))
"A helper that build an UPDATE SQL statement and executes it.
Given a connectable object, a table name, a hash map of columns and
values to set, and either a hash map of columns and values to search
on or a vector of a SQL where clause and parameters, perform an
update on the table.
By default returns an object with the number of affected rows; a
complete row can be returned if you pass `::return-keys` with `true`
or with a vector of columns.
Also it can be combined with the `::many` option if you perform an
update to multiple rows and you want all the affected rows to be
returned."
[ds table params where & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/update table params where opts)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))
opts (update opts :return-keys boolean)]
(if (::many opts)
(jdbc/execute! conn sql opts)
(jdbc/execute-one! conn sql opts))))
(defn delete!
([ds table params] (delete! ds table params nil))
([ds table params opts]
(exec-one! ds
(sql/delete table params opts)
(assoc opts :return-keys true))))
"A helper that builds an DELETE SQL statement and executes it.
Given a connectable object, a table name, and either a hash map of columns
and values to search on or a vector of a SQL where clause and parameters,
perform a delete on the table.
By default returns an object with the number of affected rows; a
complete row can be returned if you pass `::return-keys` with `true`
or with a vector of columns.
Also it can be combined with the `::many` option if you perform an
update to multiple rows and you want all the affected rows to be
returned."
[ds table params & {:as opts}]
(let [conn (get-connectable ds)
sql (sql/delete table params opts)
opts (if (empty? opts)
default-opts
(into default-opts (rename-opts opts)))]
(if (::many opts)
(jdbc/execute! conn sql opts)
(jdbc/execute-one! conn sql opts))))
(defn query
[ds table params & {:as opts}]
(exec! ds (sql/select table params opts) opts))
(defn is-row-deleted?
[{:keys [deleted-at]}]
@@ -279,56 +389,54 @@
(inst-ms (dt/now)))))
(defn get*
"Internal function for retrieve a single row from database that
matches a simple filters."
([ds table params]
(get* ds table params nil))
([ds table params {:keys [check-deleted?] :or {check-deleted? true} :as opts}]
(let [rows (exec! ds (sql/select table params opts))
rows (cond->> rows
check-deleted?
(remove is-row-deleted?))]
(first rows))))
"Retrieve a single row from database that matches a simple filters. Do
not raises exceptions."
[ds table params & {:as opts}]
(let [rows (exec! ds (sql/select table params opts))
rows (cond->> rows
(::remove-deleted opts true)
(remove is-row-deleted?))]
(first rows)))
(defn get
([ds table params]
(get ds table params nil))
([ds table params {:keys [check-deleted?] :or {check-deleted? true} :as opts}]
(let [row (get* ds table params opts)]
(when (and (not row) check-deleted?)
(ex/raise :type :not-found
:code :object-not-found
:table table
:hint "database object not found"))
row)))
"Retrieve a single row from database that matches a simple
filters. Raises :not-found exception if no object is found."
[ds table params & {:as opts}]
(let [row (get* ds table params opts)]
(when (and (not row) (::check-deleted opts true))
(ex/raise :type :not-found
:code :object-not-found
:table table
:hint "database object not found"))
row))
(defn get-by-params
"DEPRECATED"
([ds table params]
(get-by-params ds table params nil))
([ds table params {:keys [check-not-found] :or {check-not-found true} :as opts}]
(let [row (get* ds table params (assoc opts :check-deleted? check-not-found))]
(when (and (not row) check-not-found)
(ex/raise :type :not-found
:code :object-not-found
:table table
:hint "database object not found"))
row)))
(defn plan
[ds sql]
(-> (get-connectable ds)
(jdbc/plan sql sql/default-opts)))
(defn cursor
"Return a lazy seq of rows using server side cursors"
[conn query & {:keys [chunk-size] :or {chunk-size 25}}]
(let [cname (str (gensym "cursor_"))
fquery [(str "FETCH " chunk-size " FROM " cname)]]
;; declare cursor
(exec-one! conn
(if (vector? query)
(into [(str "DECLARE " cname " CURSOR FOR " (nth query 0))]
(rest query))
[(str "DECLARE " cname " CURSOR FOR " query)]))
;; return a lazy seq
((fn fetch-more []
(lazy-seq
(when-let [chunk (seq (exec! conn fquery))]
(concat chunk (fetch-more))))))))
(defn get-by-id
([ds table id]
(get ds table {:id id} nil))
([ds table id opts]
(let [opts (cond-> opts
(contains? opts :check-not-found)
(assoc :check-deleted? (:check-not-found opts)))]
(get ds table {:id id} opts))))
(defn query
([ds table params]
(query ds table params nil))
([ds table params opts]
(exec! ds (sql/select table params opts))))
[ds table id & {:as opts}]
(get ds table {:id id} opts))
(defn pgobject?
([v]
@@ -382,6 +490,10 @@
(.createArrayOf conn ^String type (into-array Object objects))
(.createArrayOf conn ^String type objects))))
(defn encode-pgarray
[data conn type]
(create-array conn type data))
(defn decode-pgpoint
[^PGpoint v]
(gpt/point (.-x v) (.-y v)))
@@ -396,11 +508,78 @@
([^Connection conn label]
(.setSavepoint conn (name label))))
(defn release!
[^Connection conn ^Savepoint sp]
(.releaseSavepoint conn sp))
(defn rollback!
([^Connection conn]
(.rollback conn))
([^Connection conn ^Savepoint sp]
(.rollback conn sp)))
([conn]
(if (and (map? conn) (::savepoint conn))
(rollback! conn (::savepoint conn))
(let [^Connection conn (get-connection conn)]
(l/trc :hint "explicit rollback requested")
(.rollback conn))))
([conn ^Savepoint sp]
(let [^Connection conn (get-connection conn)]
(l/trc :hint "explicit rollback requested (savepoint)")
(.rollback conn sp))))
(defn tx-run!
[system f & params]
(cond
(connection? system)
(tx-run! {::conn system} f)
(pool? system)
(tx-run! {::pool system} f)
(::conn system)
(let [conn (::conn system)
sp (savepoint conn)]
(try
(let [system' (-> system
(assoc ::savepoint sp)
(dissoc ::rollback))
result (apply f system' params)]
(if (::rollback system)
(rollback! conn sp)
(release! conn sp))
result)
(catch Throwable cause
(.rollback ^Connection conn ^Savepoint sp)
(throw cause))))
(::pool system)
(with-atomic [conn (::pool system)]
(let [system' (-> system
(assoc ::conn conn)
(dissoc ::rollback))
result (apply f system' params)]
(when (::rollback system)
(rollback! conn))
result))
:else
(throw (IllegalArgumentException. "invalid system/cfg provided"))))
(defn run!
[system f & params]
(cond
(connection? system)
(run! {::conn system} f)
(pool? system)
(run! {::pool system} f)
(::conn system)
(apply f system params)
(::pool system)
(with-open [^Connection conn (open (::pool system))]
(apply f (assoc system ::conn conn) params))
:else
(throw (IllegalArgumentException. "invalid arguments"))))
(defn interval
[o]

View File

@@ -7,6 +7,7 @@
(ns app.db.sql
(:refer-clojure :exclude [update])
(:require
[app.db :as-alias db]
[clojure.string :as str]
[next.jdbc.optional :as jdbc-opt]
[next.jdbc.sql.builder :as sql]))
@@ -28,11 +29,14 @@
([table key-map opts]
(let [opts (merge default-opts opts)
opts (cond-> opts
(:on-conflict-do-nothing opts)
(::db/on-conflict-do-nothing? opts)
(assoc :suffix "ON CONFLICT DO NOTHING")
(::on-conflict-do-nothing opts)
(assoc :suffix "ON CONFLICT DO NOTHING"))]
(sql/for-insert table key-map opts))))
(defn insert-multi
(defn insert-many
[table cols rows opts]
(let [opts (merge default-opts opts)]
(sql/for-insert-multi table cols rows opts)))
@@ -43,20 +47,30 @@
([table where-params opts]
(let [opts (merge default-opts opts)
opts (cond-> opts
(:for-update opts) (assoc :suffix "FOR UPDATE")
(:for-key-share opts) (assoc :suffix "FOR KEY SHARE"))]
(::order-by opts) (assoc :order-by (::order-by opts))
(::columns opts) (assoc :columns (::columns opts))
(::for-update opts) (assoc :suffix "FOR UPDATE")
(::for-share opts) (assoc :suffix "FOR SHARE"))]
(sql/for-query table where-params opts))))
(defn update
([table key-map where-params]
(update table key-map where-params nil))
([table key-map where-params opts]
(let [opts (merge default-opts opts)]
(let [opts (into default-opts opts)
keys (::db/return-keys opts)
opts (if (vector? keys)
(assoc opts :suffix (str "RETURNING " (sql/as-cols keys opts)))
opts)]
(sql/for-update table key-map where-params opts))))
(defn delete
([table where-params]
(delete table where-params nil))
([table where-params opts]
(let [opts (merge default-opts opts)]
(let [opts (merge default-opts opts)
keys (::db/return-keys opts)
opts (if (vector? keys)
(assoc opts :suffix (str "RETURNING " (sql/as-cols keys opts)))
opts)]
(sql/for-delete table where-params opts))))

View File

@@ -4,7 +4,7 @@
;;
;; Copyright (c) KALEIDOS INC
(ns app.emails
(ns app.email
"Main api for send emails."
(:require
[app.common.exceptions :as ex]
@@ -14,7 +14,7 @@
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.emails.invite-to-team :as-alias emails.invite-to-team]
[app.email.invite-to-team :as-alias email.invite-to-team]
[app.metrics :as mtx]
[app.util.template :as tmpl]
[app.worker :as wrk]
@@ -37,6 +37,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-address
^"[Ljakarta.mail.internet.InternetAddress;"
[v]
(InternetAddress/parse ^String v))
@@ -64,14 +65,14 @@
(some? bcc) (assign-recipient :bcc bcc)))
(defn- assign-from
[mmsg {:keys [default-from]} {:keys [from] :as props}]
[mmsg {:keys [::default-from] :as cfg} {:keys [from] :as params}]
(let [from (or from default-from)]
(when from
(let [from (parse-address from)]
(.addFrom ^MimeMessage mmsg from)))))
(defn- assign-reply-to
[mmsg {:keys [default-reply-to] :as cfg} {:keys [reply-to] :as params}]
[mmsg {:keys [::default-reply-to] :as cfg} {:keys [reply-to] :as params}]
(let [reply-to (or reply-to default-reply-to)]
(when reply-to
(let [reply-to (parse-address reply-to)]
@@ -127,9 +128,8 @@
mmsg))
(defn- opts->props
[{:keys [username tls host port timeout default-from]
:or {timeout 30000}
:as opts}]
[{:keys [::username ::tls ::host ::port ::timeout ::default-from]
:or {timeout 30000}}]
(reduce-kv
(fn [^Properties props k v]
(if (nil? v)
@@ -150,8 +150,9 @@
"mail.smtp.connectiontimeout" timeout}))
(defn- create-smtp-session
[opts]
(let [props (opts->props opts)]
^Session
[cfg]
(let [props (opts->props cfg)]
(Session/getInstance props)))
(defn- create-smtp-message
@@ -171,7 +172,7 @@
;; TEMPLATE EMAIL IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private email-path "app/emails/%(id)s/%(lang)s.%(type)s")
(def ^:private email-path "app/email/%(id)s/%(lang)s.%(type)s")
(defn- render-email-template-part
[type id context]
@@ -283,14 +284,14 @@
(s/def ::default-from ::cf/smtp-default-from)
(s/def ::smtp-config
(s/keys :opt-un [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(s/keys :opt [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(declare send-to-logger!)
@@ -304,12 +305,18 @@
(fn [params]
(when (contains? cf/flags :smtp)
(let [session (create-smtp-session cfg)]
(with-open [transport (.getTransport session (if (:ssl cfg) "smtps" "smtp"))]
(with-open [transport (.getTransport session (if (::ssl cfg) "smtps" "smtp"))]
(.connect ^Transport transport
^String (:username cfg)
^String (:password cfg))
^String (::username cfg)
^String (::password cfg))
(let [^MimeMessage message (create-smtp-message cfg session params)]
(l/dbg :hint "sendmail"
:id (:id params)
:to (:to params)
:subject (str/trim (:subject params))
:body (str/join "," (map :type (:body params))))
(.sendMessage ^Transport transport
^MimeMessage message
(.getAllRecipients message))))))
@@ -319,10 +326,10 @@
(send-to-logger! cfg params))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::sendmail ::mtx/metrics]))
(s/keys :req [::sendmail ::mtx/metrics]))
(defmethod ig/init-key ::handler
[_ {:keys [sendmail]}]
[_ {:keys [::sendmail]}]
(fn [{:keys [props] :as task}]
(sendmail props)))
@@ -340,7 +347,7 @@
(map :content)
first)))
(println "******** end email" (:id email) "**********"))]
(l/info ::l/raw out)))
(l/raw! :info out)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EMAIL FACTORIES
@@ -380,14 +387,14 @@
"Password change confirmation email"
(template-factory ::change-email))
(s/def ::emails.invite-to-team/invited-by ::us/string)
(s/def ::emails.invite-to-team/team ::us/string)
(s/def ::emails.invite-to-team/token ::us/string)
(s/def ::email.invite-to-team/invited-by ::us/string)
(s/def ::email.invite-to-team/team ::us/string)
(s/def ::email.invite-to-team/token ::us/string)
(s/def ::invite-to-team
(s/keys :req-un [::emails.invite-to-team/invited-by
::emails.invite-to-team/token
::emails.invite-to-team/team]))
(s/keys :req-un [::email.invite-to-team/invited-by
::email.invite-to-team/token
::email.invite-to-team/team]))
(def invite-to-team
"Teams member invitation email."

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,122 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.features.fdata
"A `fdata/*` related feature migration helpers"
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.db :as db]
[app.db.sql :as-alias sql]
[app.util.blob :as blob]
[app.util.objects-map :as omap]
[app.util.pointer-map :as pmap]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OBJECTS-MAP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn enable-objects-map
[file]
(let [update-page
(fn [page]
(if (and (pmap/pointer-map? page)
(not (pmap/loaded? page)))
page
(update page :objects omap/wrap)))
update-data
(fn [fdata]
(update fdata :pages-index d/update-vals update-page))]
(-> file
(update :data update-data)
(update :features conj "fdata/objects-map"))))
(defn process-objects
"Apply a function to all objects-map on the file. Usualy used for convert
the objects-map instances to plain maps"
[fdata update-fn]
(if (contains? fdata :pages-index)
(update fdata :pages-index d/update-vals
(fn [page]
(update page :objects
(fn [objects]
(if (omap/objects-map? objects)
(update-fn objects)
objects)))))
fdata))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; POINTER-MAP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn load-pointer
"A database loader pointer helper"
[system file-id id]
(let [{:keys [content]} (db/get system :file-data-fragment
{:id id :file-id file-id}
{::sql/columns [:content]
::db/check-deleted false})]
(l/trc :hint "load pointer"
:file-id (str file-id)
:id (str id)
:found (some? content))
(when-not content
(ex/raise :type :internal
:code :fragment-not-found
:hint "fragment not found"
:file-id file-id
:fragment-id id))
(blob/decode content)))
(defn persist-pointers!
"Given a database connection and the final file-id, persist all
pointers to the underlying storage (the database)."
[system file-id]
(let [conn (db/get-connection system)]
(doseq [[id item] @pmap/*tracked*]
(when (pmap/modified? item)
(l/trc :hint "persist pointer" :file-id (str file-id) :id (str id))
(let [content (-> item deref blob/encode)]
(db/insert! conn :file-data-fragment
{:id id
:file-id file-id
:content content}))))))
(defn process-pointers
"Apply a function to all pointers on the file. Usuly used for
dereference the pointer to a plain value before some processing."
[fdata update-fn]
(let [update-fn' (fn [val]
(if (pmap/pointer-map? val)
(update-fn val)
val))]
(-> fdata
(d/update-vals update-fn')
(update :pages-index d/update-vals update-fn'))))
(defn get-used-pointer-ids
"Given a file, return all pointer ids used in the data."
[fdata]
(->> (concat (vals fdata)
(vals (:pages-index fdata)))
(into #{} (comp (filter pmap/pointer-map?)
(map pmap/get-id)))))
(defn enable-pointer-map
"Enable the fdata/pointer-map feature on the file."
[file]
(-> file
(update :data (fn [fdata]
(-> fdata
(update :pages-index d/update-vals pmap/wrap)
(d/update-when :components pmap/wrap))))
(update :features conj "fdata/pointer-map")))

View File

@@ -6,23 +6,34 @@
(ns app.http
(:require
[app.auth.oidc :as-alias oidc]
[app.common.data :as d]
[app.common.logging :as l]
[app.common.transit :as t]
[app.db :as-alias db]
[app.http.access-token :as actoken]
[app.http.assets :as-alias assets]
[app.http.awsns :as-alias awsns]
[app.http.debug :as-alias debug]
[app.http.errors :as errors]
[app.http.middleware :as mw]
[app.http.session :as session]
[app.http.websocket :as-alias ws]
[app.main :as-alias main]
[app.metrics :as mtx]
[app.worker :as wrk]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.setup :as-alias setup]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec :as px]
[reitit.core :as r]
[reitit.middleware :as rr]
[yetti.adapter :as yt]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[ring.request :as rreq]
[ring.response :as-alias rres]
[yetti.adapter :as yt]))
(declare wrap-router)
(declare router-handler)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP SERVER
@@ -37,140 +48,124 @@
(s/def ::max-body-size integer?)
(s/def ::max-multipart-body-size integer?)
(s/def ::io-threads integer?)
(s/def ::worker-threads integer?)
(defmethod ig/prep-key ::server
[_ cfg]
(merge {:name "http"
:port 6060
:host "0.0.0.0"
:max-body-size (* 1024 1024 30) ; 30 MiB
:max-multipart-body-size (* 1024 1024 120)} ; 120 MiB
(merge {::port 6060
::host "0.0.0.0"
::max-body-size (* 1024 1024 30) ; default 30 MiB
::max-multipart-body-size (* 1024 1024 120)} ; default 120 MiB
(d/without-nils cfg)))
(defmethod ig/pre-init-spec ::server [_]
(s/and
(s/keys :req-un [::port ::host ::name ::max-body-size ::max-multipart-body-size]
:opt-un [::router ::handler ::io-threads ::worker-threads ::wrk/executor])
(fn [cfg]
(or (contains? cfg :router)
(contains? cfg :handler)))))
(s/keys :req [::port ::host]
:opt [::max-body-size
::max-multipart-body-size
::router
::handler
::io-threads]))
(defmethod ig/init-key ::server
[_ {:keys [handler router port name host] :as cfg}]
(l/info :hint "starting http server" :port port :host host :name name)
[_ {:keys [::handler ::router ::host ::port] :as cfg}]
(l/info :hint "starting http server" :port port :host host)
(let [options {:http/port port
:http/host host
:http/max-body-size (:max-body-size cfg)
:http/max-multipart-body-size (:max-multipart-body-size cfg)
:xnio/io-threads (:io-threads cfg)
:xnio/worker-threads (:worker-threads cfg)
:xnio/dispatch (:executor cfg)
:ring/async true}
:http/max-body-size (::max-body-size cfg)
:http/max-multipart-body-size (::max-multipart-body-size cfg)
:xnio/io-threads (or (::io-threads cfg)
(max 3 (px/get-available-processors)))
:xnio/dispatch :virtual
:ring/compat :ring2
:socket/backlog 4069}
handler (if (some? router)
(wrap-router router)
handler (cond
(some? router)
(router-handler router)
handler)
server (yt/server handler (d/without-nils options))]
(assoc cfg :server (yt/start! server))))
(some? handler)
handler
:else
(throw (UnsupportedOperationException. "handler or router are required")))
options (d/without-nils options)
server (yt/server handler options)]
(assoc cfg ::server (yt/start! server))))
(defmethod ig/halt-key! ::server
[_ {:keys [server name port] :as cfg}]
(l/info :msg "stopping http server" :name name :port port)
[_ {:keys [::server ::port] :as cfg}]
(l/info :msg "stopping http server" :port port)
(yt/stop! server))
(defn- not-found-handler
[_ respond _]
(respond (yrs/response 404)))
[_]
{::rres/status 404})
(defn- wrap-router
(defn- router-handler
[router]
(letfn [(handler [request respond raise]
(if-let [match (r/match-by-path router (yrq/path request))]
(letfn [(resolve-handler [request]
(if-let [match (r/match-by-path router (rreq/path request))]
(let [params (:path-params match)
result (:result match)
handler (or (:handler result) not-found-handler)
request (assoc request :path-params params)]
(handler request respond raise))
(not-found-handler request respond raise)))
(partial handler request))
(partial not-found-handler request)))
(on-error [cause request respond]
(on-error [cause request]
(let [{:keys [body] :as response} (errors/handle cause request)]
(respond
(cond-> response
(map? body)
(-> (update :headers assoc "content-type" "application/transit+json")
(assoc :body (t/encode-str body {:type :json-verbose})))))))]
(cond-> response
(map? body)
(-> (update ::rres/headers assoc "content-type" "application/transit+json")
(assoc ::rres/body (t/encode-str body {:type :json-verbose}))))))]
(fn [request respond _]
(try
(handler request respond #(on-error % request respond))
(catch Throwable cause
(on-error cause request respond))))))
(fn [request]
(let [handler (resolve-handler request)]
(try
(handler)
(catch Throwable cause
(on-error cause request)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP ROUTER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::assets map?)
(s/def ::awsns-handler fn?)
(s/def ::debug-routes (s/nilable vector?))
(s/def ::doc-routes (s/nilable vector?))
(s/def ::feedback fn?)
(s/def ::oauth map?)
(s/def ::oidc-routes (s/nilable vector?))
(s/def ::rpc-routes (s/nilable vector?))
(s/def ::session ::session/session)
(s/def ::storage map?)
(s/def ::ws fn?)
(defmethod ig/pre-init-spec ::router [_]
(s/keys :req-un [::mtx/metrics
::ws
::storage
::assets
::session
::feedback
::awsns-handler
::debug-routes
::oidc-routes
::rpc-routes
::doc-routes]))
(s/keys :req [::session/manager
::ws/routes
::rpc/routes
::rpc.doc/routes
::oidc/routes
::setup/props
::assets/routes
::debug/routes
::db/pool
::mtx/routes
::awsns/routes]))
(defmethod ig/init-key ::router
[_ {:keys [ws session metrics assets feedback] :as cfg}]
[_ cfg]
(rr/router
[["" {:middleware [[mw/server-timing]
[mw/format-response]
[mw/params]
[mw/format-response]
[mw/parse-request]
[session/middleware-1 session]
[session/soft-auth cfg]
[actoken/soft-auth cfg]
[mw/errors errors/handle]
[mw/restrict-methods]]}
["/metrics" {:handler (::mtx/handler metrics)
:allowed-methods #{:get}}]
["/assets" {:middleware [[session/middleware-2 session]]}
["/by-id/:id" {:handler (:objects-handler assets)}]
["/by-file-media-id/:id" {:handler (:file-objects-handler assets)}]
["/by-file-media-id/:id/thumbnail" {:handler (:file-thumbnails-handler assets)}]]
(:debug-routes cfg)
(::mtx/routes cfg)
(::assets/routes cfg)
(::debug/routes cfg)
["/webhooks"
["/sns" {:handler (:awsns-handler cfg)
:allowed-methods #{:post}}]]
(::awsns/routes cfg)]
["/ws/notifications" {:middleware [[session/middleware-2 session]]
:handler ws
:allowed-methods #{:get}}]
(::ws/routes cfg)
["/api" {:middleware [[mw/cors]
[session/middleware-2 session]]}
["/feedback" {:handler feedback
:allowed-methods #{:post}}]
(:doc-routes cfg)
(:oidc-routes cfg)
(:rpc-routes cfg)]]]))
["/api" {:middleware [[mw/cors]]}
(::oidc/routes cfg)
(::rpc.doc/routes cfg)
(::rpc/routes cfg)]]]))

View File

@@ -0,0 +1,84 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.http.access-token
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.db :as db]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[ring.request :as rreq]))
(def header-re #"^Token\s+(.*)")
(defn- get-token
[request]
(some->> (rreq/get-header request "authorization")
(re-matches header-re)
(second)))
(defn- decode-token
[props token]
(when token
(tokens/verify props {:token token :iss "access-token"})))
(def sql:get-token-data
"SELECT perms, profile_id, expires_at
FROM access_token
WHERE id = ?
AND (expires_at IS NULL
OR (expires_at > now()));")
(defn- get-token-data
[pool token-id]
(when-not (db/read-only? pool)
(some-> (db/exec-one! pool [sql:get-token-data token-id])
(update :perms db/decode-pgarray #{}))))
(defn- wrap-soft-auth
"Soft Authentication, will be executed synchronously on the undertow
worker thread."
[handler {:keys [::setup/props]}]
(letfn [(handle-request [request]
(try
(let [token (get-token request)
claims (decode-token props token)]
(cond-> request
(map? claims)
(assoc ::id (:tid claims))))
(catch Throwable cause
(l/trace :hint "exception on decoding malformed token" :cause cause)
request)))]
(fn [request]
(handler (handle-request request)))))
(defn- wrap-authz
"Authorization middleware, will be executed synchronously on vthread."
[handler {:keys [::db/pool]}]
(fn [request]
(let [{:keys [perms profile-id expires-at]} (some->> (::id request) (get-token-data pool))]
(handler (cond-> request
(some? perms)
(assoc ::perms perms)
(some? profile-id)
(assoc ::profile-id profile-id)
(some? expires-at)
(assoc ::expires-at expires-at))))))
(def soft-auth
{:name ::soft-auth
:compile (fn [& _]
(when (contains? cf/flags :access-tokens)
wrap-soft-auth))})
(def authz
{:name ::authz
:compile (fn [& _]
(when (contains? cf/flags :access-tokens)
wrap-authz))})

View File

@@ -7,19 +7,16 @@
(ns app.http.assets
"Assets related handlers."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.spec :as us]
[app.common.uri :as u]
[app.db :as db]
[app.metrics :as mtx]
[app.storage :as sto]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.response :as yrs]))
[ring.response :as-alias rres]))
(def ^:private cache-max-age
(dt/duration {:hours 24}))
@@ -27,105 +24,87 @@
(def ^:private signature-max-age
(dt/duration {:hours 24 :minutes 15}))
(defn coerce-id
[id]
(let [res (parse-uuid id)]
(when-not (uuid? res)
(defn get-id
[{:keys [path-params]}]
(or (some-> path-params :id d/parse-uuid)
(ex/raise :type :not-found
:hint "object not found"))
res))
:hunt "object not found")))
(defn- get-file-media-object
[{:keys [pool executor] :as storage} id]
(px/with-dispatch executor
(let [id (coerce-id id)
mobj (db/exec-one! pool ["select * from file_media_object where id=?" id])]
(when-not mobj
(ex/raise :type :not-found
:hint "object does not found"))
mobj)))
[pool id]
(db/get pool :file-media-object {:id id}))
(defn- serve-object-from-s3
[{:keys [::sto/storage] :as cfg} obj]
(let [{:keys [host port] :as url} (sto/get-object-url storage obj {:max-age signature-max-age})]
{::rres/status 307
::rres/headers {"location" (str url)
"x-host" (cond-> host port (str ":" port))
"x-mtype" (-> obj meta :content-type)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}}))
(defn- serve-object-from-fs
[{:keys [::path]} obj]
(let [purl (u/join (u/uri path)
(sto/object->relative-path obj))
mdata (meta obj)
headers {"x-accel-redirect" (:path purl)
"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}]
{::rres/status 204
::rres/headers headers}))
(defn- serve-object
"Helper function that returns the appropriate response depending on
the storage object backend type."
[{:keys [storage] :as cfg} obj]
(let [mdata (meta obj)
backend (sto/resolve-backend storage (:backend obj))]
(case (:type backend)
:s3
(p/let [{:keys [host port] :as url} (sto/get-object-url storage obj {:max-age signature-max-age})]
(yrs/response :status 307
:headers {"location" (str url)
"x-host" (cond-> host port (str ":" port))
"x-mtype" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}))
:fs
(p/let [purl (u/uri (:assets-path cfg))
purl (u/join purl (sto/object->relative-path obj))]
(yrs/response :status 204
:headers {"x-accel-redirect" (:path purl)
"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))})))))
[{:keys [::sto/storage] :as cfg} {:keys [backend] :as obj}]
(let [backend (sto/resolve-backend storage backend)]
(case (::sto/type backend)
:s3 (serve-object-from-s3 cfg obj)
:fs (serve-object-from-fs cfg obj))))
(defn objects-handler
"Handler that servers storage objects by id."
[{:keys [storage executor] :as cfg} request respond raise]
(-> (px/with-dispatch executor
(p/let [id (get-in request [:path-params :id])
id (coerce-id id)
obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
(yrs/response 404))))
(p/bind p/wrap)
(p/then' respond)
(p/catch raise)))
[{:keys [::sto/storage] :as cfg} request]
(let [id (get-id request)
obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
{::rres/status 404})))
(defn- generic-handler
"A generic handler helper/common code for file-media based handlers."
[{:keys [storage] :as cfg} request kf]
(p/let [id (get-in request [:path-params :id])
mobj (get-file-media-object storage id)
obj (sto/get-object storage (kf mobj))]
(if obj
(serve-object cfg obj)
(yrs/response 404))))
[{:keys [::sto/storage] :as cfg} request kf]
(let [pool (::db/pool storage)
id (get-id request)
mobj (get-file-media-object pool id)
sobj (sto/get-object storage (kf mobj))]
(if sobj
(serve-object cfg sobj)
{::rres/status 404})))
(defn file-objects-handler
"Handler that serves storage objects by file media id."
[cfg request respond raise]
(-> (generic-handler cfg request :media-id)
(p/then respond)
(p/catch raise)))
[cfg request]
(generic-handler cfg request :media-id))
(defn file-thumbnails-handler
"Handler that serves storage objects by thumbnail-id and quick
fallback to file-media-id if no thumbnail is available."
[cfg request respond raise]
(-> (generic-handler cfg request #(or (:thumbnail-id %) (:media-id %)))
(p/then respond)
(p/catch raise)))
[cfg request]
(generic-handler cfg request #(or (:thumbnail-id %) (:media-id %))))
;; --- Initialization
(s/def ::storage some?)
(s/def ::assets-path ::us/string)
(s/def ::cache-max-age ::dt/duration)
(s/def ::signature-max-age ::dt/duration)
(s/def ::path ::us/string)
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::handlers [_]
(s/keys :req-un [::storage
::wrk/executor
::mtx/metrics
::assets-path
::cache-max-age
::signature-max-age]))
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::sto/storage ::path]))
(defmethod ig/init-key ::handlers
(defmethod ig/init-key ::routes
[_ cfg]
{:objects-handler (partial objects-handler cfg)
:file-objects-handler (partial file-objects-handler cfg)
:file-thumbnails-handler (partial file-thumbnails-handler cfg)})
["/assets"
["/by-id/:id" {:handler (partial objects-handler cfg)}]
["/by-file-media-id/:id" {:handler (partial file-objects-handler cfg)}]
["/by-file-media-id/:id/thumbnail" {:handler (partial file-thumbnails-handler cfg)}]])

View File

@@ -13,6 +13,7 @@
[app.db.sql :as sql]
[app.http.client :as http]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.worker :as-alias wrk]
[clojure.spec.alpha :as s]
@@ -20,26 +21,27 @@
[integrant.core :as ig]
[jsonista.core :as j]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[ring.request :as rreq]
[ring.response :as-alias rres]))
(declare parse-json)
(declare handle-request)
(declare parse-notification)
(declare process-report)
(defmethod ig/pre-init-spec ::handler [_]
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::http/client
::main/props
::db/pool
::wrk/executor]))
::setup/props
::db/pool]))
(defmethod ig/init-key ::handler
[_ {:keys [::wrk/executor] :as cfg}]
(fn [request respond _]
(let [data (-> request yrq/body slurp)]
(px/run! executor #(handle-request cfg data)))
(respond (yrs/response 200))))
(defmethod ig/init-key ::routes
[_ cfg]
(letfn [(handler [request]
(let [data (-> request rreq/body slurp)]
(px/run! :vthread (partial handle-request cfg data)))
{::rres/status 200})]
["/sns" {:handler handler
:allowed-methods #{:post}}]))
(defn handle-request
[cfg data]
@@ -105,8 +107,7 @@
[cfg headers]
(let [tdata (get headers "x-penpot-data")]
(when-not (str/empty? tdata)
(let [sprops (::main/props cfg)
result (tokens/verify sprops {:token tdata :iss :profile-identity})]
(let [result (tokens/verify (::setup/props cfg) {:token tdata :iss :profile-identity})]
(:profile-id result)))))
(defn- parse-notification

View File

@@ -8,7 +8,6 @@
"Http client abstraction layer."
(:require
[app.common.spec :as us]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[java-http-clj.core :as http]
@@ -21,12 +20,11 @@
(s/keys :req [::client]))
(defmethod ig/pre-init-spec ::client [_]
(s/keys :req [::wrk/executor]))
(s/keys :req []))
(defmethod ig/init-key ::client
[_ {:keys [::wrk/executor] :as cfg}]
(http/build-client {:executor executor
:connect-timeout 30000 ;; 10s
[_ _]
(http/build-client {:connect-timeout 30000 ;; 10s
:follow-redirects :always}))
(defn send!
@@ -40,12 +38,25 @@
(catch Throwable cause
(p/rejected cause))))))
(defn- resolve-client
[params]
(cond
(instance? HttpClient params)
params
(map? params)
(resolve-client (::client params))
:else
(throw (UnsupportedOperationException. "invalid arguments"))))
(defn req!
"A convencience toplevel function for gradual migration to a new API
convention."
([{:keys [::client] :as holder} request]
(us/assert! ::client-holder holder)
(send! client request {}))
([{:keys [::client] :as holder} request options]
(us/assert! ::client-holder holder)
(send! client request options)))
([cfg-or-client request]
(let [client (resolve-client cfg-or-client)]
(send! client request {:sync? true})))
([cfg-or-client request options]
(let [client (resolve-client cfg-or-client)]
(send! client request (merge {:sync? true} options)))))

View File

@@ -7,21 +7,26 @@
(ns app.http.debug
(:refer-clojure :exclude [error-handler])
(:require
[app.binfile.v1 :as bf.v1]
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http.middleware :as mw]
[app.http.session :as session]
[app.rpc.commands.binfile :as binf]
[app.rpc.commands.files.create :refer [create-file]]
[app.rpc.queries.profile :as profile]
[app.main :as-alias main]
[app.rpc.commands.auth :as auth]
[app.rpc.commands.files-create :refer [create-file]]
[app.rpc.commands.profile :as profile]
[app.setup :as-alias setup]
[app.srepl.helpers :as srepl]
[app.storage :as-alias sto]
[app.storage.tmp :as tmp]
[app.util.blob :as blob]
[app.util.template :as tmpl]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.io :as io]
@@ -29,51 +34,41 @@
[integrant.core :as ig]
[markdown.core :as md]
[markdown.transformers :as mdt]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[ring.request :as rreq]
[ring.response :as rres]))
;; (selmer.parser/cache-off!)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn authorized?
[pool {:keys [profile-id]}]
(or (= "devenv" (cf/get :host))
(let [profile (ex/ignoring (profile/retrieve-profile-data pool profile-id))
admins (or (cf/get :admins) #{})]
(contains? admins (:email profile)))))
(defn prepare-response
[body]
(let [headers {"content-type" "application/transit+json"}]
(yrs/response :status 200 :body body :headers headers)))
(defn prepare-download-response
[body filename]
(let [headers {"content-disposition" (str "attachment; filename=" filename)
"content-type" "application/octet-stream"}]
(yrs/response :status 200 :body body :headers headers)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INDEX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn index-handler
[{:keys [pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(yrs/response :status 200
:headers {"content-type" "text/html"}
:body (-> (io/resource "app/templates/debug.tmpl")
(tmpl/render {}))))
[_cfg _request]
{::rres/status 200
::rres/headers {"content-type" "text/html"}
::rres/body (-> (io/resource "app/templates/debug.tmpl")
(tmpl/render {}))})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FILE CHANGES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn prepare-response
[body]
(let [headers {"content-type" "application/transit+json"}]
{::rres/status 200
::rres/body body
::rres/headers headers}))
(defn prepare-download-response
[body filename]
(let [headers {"content-disposition" (str "attachment; filename=" filename)
"content-type" "application/octet-stream"}]
{::rres/status 200
::rres/body body
::rres/headers headers}))
(def sql:retrieve-range-of-changes
"select revn, changes from file_change where file_id=? and revn >= ? and revn <= ? order by revn")
@@ -81,11 +76,7 @@
"select revn, changes, data from file_change where file_id=? and revn = ?")
(defn- retrieve-file-data
[{:keys [pool]} {:keys [params profile-id] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
[{:keys [::db/pool]} {:keys [params ::session/profile-id] :as request}]
(let [file-id (some-> params :file-id parse-uuid)
revn (some-> params :revn parse-long)
filename (str file-id)]
@@ -107,17 +98,22 @@
(prepare-download-response data filename)
(contains? params :clone)
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
data (some-> data blob/decode)]
(create-file pool {:id (uuid/next)
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id
:data data})
(yrs/response 201 "OK CREATED"))
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)]
(db/run! pool (fn [{:keys [::db/conn] :as cfg}]
(create-file cfg {:id file-id
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id})
(db/update! conn :file
{:data data}
{:id file-id})
{::rres/status 201
::rres/body "OK CREATED"})))
:else
(prepare-response (some-> data blob/decode))))))
(prepare-response (blob/decode data))))))
(defn- is-file-exists?
[pool id]
@@ -125,48 +121,51 @@
(-> (db/exec-one! pool [sql id]) :exists)))
(defn- upload-file-data
[{:keys [pool]} {:keys [profile-id params] :as request}]
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
data (some-> params :file :path io/read-as-bytes blob/decode)]
[{:keys [::db/pool]} {:keys [::session/profile-id params] :as request}]
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
data (some-> params :file :path io/read-as-bytes)]
(if (and data project-id)
(let [fname (str "Imported file *: " (dt/now))
overwrite? (contains? params :overwrite?)
file-id (or (and overwrite? (ex/ignoring (-> params :file :filename parse-uuid)))
(uuid/next))]
(let [fname (str "Imported file *: " (dt/now))
reuse-id? (contains? params :reuseid)
file-id (or (and reuse-id? (ex/ignoring (-> params :file :filename parse-uuid)))
(uuid/next))]
(if (and overwrite? file-id
(if (and reuse-id? file-id
(is-file-exists? pool file-id))
(do
(db/update! pool :file
{:data (blob/encode data)}
{:data data
:deleted-at nil}
{:id file-id})
(yrs/response 200 "OK UPDATED"))
{::rres/status 200
::rres/body "OK UPDATED"})
(do
(create-file pool {:id file-id
:name fname
:project-id project-id
:profile-id profile-id
:data data})
(yrs/response 201 "OK CREATED"))))
(db/run! pool (fn [{:keys [::db/conn] :as cfg}]
(create-file cfg {:id file-id
:name fname
:project-id project-id
:profile-id profile-id})
(db/update! conn :file
{:data data}
{:id file-id})
{::rres/status 201
::rres/body "OK CREATED"}))))
(yrs/response 500 "ERROR"))))
{::rres/status 500
::rres/body "ERROR"})))
(defn file-data-handler
[cfg request]
(case (yrq/method request)
(case (rreq/method request)
:get (retrieve-file-data cfg request)
:post (upload-file-data cfg request)
(ex/raise :type :http
:code :method-not-found)))
(defn file-changes-handler
[{:keys [pool]} {:keys [params] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
[{:keys [::db/pool]} {:keys [params] :as request}]
(letfn [(retrieve-changes [file-id revn]
(if (str/includes? revn ":")
(let [[start end] (->> (str/split revn #":")
@@ -202,77 +201,79 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn error-handler
[{:keys [pool]} request]
(letfn [(parse-id [request]
(let [id (get-in request [:path-params :id])
id (parse-uuid id)]
(when (uuid? id)
id)))
(retrieve-report [id]
[{:keys [::db/pool]} request]
(letfn [(get-report [{:keys [path-params]}]
(ex/ignoring
(some-> (db/get-by-id pool :server-error-report id) :content db/decode-transit-pgobject)))
(let [report-id (some-> path-params :id parse-uuid)]
(some-> (db/get-by-id pool :server-error-report report-id)
(update :content db/decode-transit-pgobject)))))
(render-template [report]
(let [context (dissoc report
(render-template-v1 [{:keys [content]}]
(let [context (dissoc content
:trace :cause :params :data :spec-problems :message
:spec-explain :spec-value :error :explain :hint)
params {:context (pp/pprint-str context :width 200)
:hint (:hint report)
:spec-explain (:spec-explain report)
:spec-problems (:spec-problems report)
:spec-value (:spec-value report)
:data (:data report)
:trace (or (:trace report)
(some-> report :error :trace))
:params (:params report)}]
:hint (:hint content)
:spec-explain (:spec-explain content)
:spec-problems (:spec-problems content)
:spec-value (:spec-value content)
:data (:data content)
:trace (or (:trace content)
(some-> content :error :trace))
:params (:params content)}]
(-> (io/resource "app/templates/error-report.tmpl")
(tmpl/render params))))]
(tmpl/render params))))
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(render-template-v2 [{report :content}]
(-> (io/resource "app/templates/error-report.v2.tmpl")
(tmpl/render report)))
(let [result (some-> (parse-id request)
(retrieve-report)
(render-template))]
(if result
(yrs/response :status 200
:body result
:headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"})
(yrs/response 404 "not found")))))
(render-template-v3 [{:keys [content id created-at]}]
(-> (io/resource "app/templates/error-report.v3.tmpl")
(tmpl/render (-> content
(assoc :id id)
(assoc :created-at (dt/format-instant created-at :rfc1123))))))]
(if-let [report (get-report request)]
(let [result (case (:version report)
1 (render-template-v1 report)
2 (render-template-v2 report)
3 (render-template-v3 report))]
{::rres/status 200
::rres/body result
::rres/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}})
{::rres/status 404
::rres/body "not found"})))
(def sql:error-reports
"SELECT id, created_at,
content->>'~:hint' AS hint
FROM server_error_report
ORDER BY created_at DESC
LIMIT 100")
LIMIT 200")
(defn error-list-handler
[{:keys [pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
[{:keys [::db/pool]} _request]
(let [items (->> (db/exec! pool [sql:error-reports])
(map #(update % :created-at dt/format-instant :rfc1123)))]
(yrs/response :status 200
:body (-> (io/resource "app/templates/error-list.tmpl")
(tmpl/render {:items items}))
:headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"})))
{::rres/status 200
::rres/body (-> (io/resource "app/templates/error-list.tmpl")
(tmpl/render {:items items}))
::rres/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EXPORT/IMPORT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-handler
[{:keys [pool] :as cfg} {:keys [params profile-id] :as request}]
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(let [file-ids (->> (:file-ids params)
(remove empty?)
(mapv parse-uuid))
(let [file-ids (into #{}
(comp (remove empty?)
(map parse-uuid))
(:file-ids params))
libs? (contains? params :includelibs)
clone? (contains? params :clone)
embed? (contains? params :embedassets)]
@@ -281,63 +282,144 @@
(ex/raise :type :validation
:code :missing-arguments))
(let [path (-> cfg
(assoc ::binf/file-ids file-ids)
(assoc ::binf/embed-assets? embed?)
(assoc ::binf/include-libraries? libs?)
(binf/export-to-tmpfile!))]
(let [path (tmp/tempfile :prefix "penpot.export.")]
(with-open [output (io/output-stream path)]
(-> cfg
(assoc ::bf.v1/ids file-ids)
(assoc ::bf.v1/embed-assets embed?)
(assoc ::bf.v1/include-libraries libs?)
(bf.v1/export-files! output)))
(if clone?
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)]
(binf/import!
(assoc cfg
::binf/input path
::binf/overwrite? false
::binf/ignore-index-errors? true
::binf/profile-id profile-id
::binf/project-id project-id))
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
cfg (assoc cfg
::bf.v1/overwrite false
::bf.v1/profile-id profile-id
::bf.v1/project-id project-id)]
(bf.v1/import-files! cfg path)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK CLONED"})
(yrs/response
:status 200
:headers {"content-type" "text/plain"}
:body "OK CLONED"))
(yrs/response
:status 200
:headers {"content-type" "application/octet-stream"
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}
:body (io/input-stream path))))))
{::rres/status 200
::rres/body (io/input-stream path)
::rres/headers {"content-type" "application/octet-stream"
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}}))))
(defn import-handler
[{:keys [pool] :as cfg} {:keys [params profile-id] :as request}]
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(when-not (contains? params :file)
(ex/raise :type :validation
:code :missing-upload-file
:hint "missing upload file"))
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
overwrite? (contains? params :overwrite)
migrate? (contains? params :migrate)
ignore-index-errors? (contains? params :ignore-index-errors)]
migrate? (contains? params :migrate)]
(when-not project-id
(ex/raise :type :validation
:code :missing-project
:hint "project not found"))
(binf/import!
(assoc cfg
::binf/input (-> params :file :path)
::binf/overwrite? overwrite?
::binf/migrate? migrate?
::binf/ignore-index-errors? ignore-index-errors?
::binf/profile-id profile-id
::binf/project-id project-id))
(let [path (-> params :file :path)
cfg (assoc cfg
::bf.v1/overwrite overwrite?
::bf.v1/migrate migrate?
::bf.v1/profile-id profile-id
::bf.v1/project-id project-id)]
(bf.v1/import-files! cfg path)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK"})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ACTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- resend-email-notification
[{:keys [::db/pool ::setup/props] :as cfg} {:keys [params] :as request}]
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(let [profile (some->> params
:email
(profile/clean-email)
(profile/get-profile-by-email pool))]
(when-not profile
(ex/raise :type :validation
:code :missing-profile
:hint "unable to find profile by email"))
(cond
(contains? params :block)
(do
(db/update! pool :profile {:is-blocked true} {:id (:id profile)})
(db/delete! pool :http-session {:profile-id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' BLOCKED" (:email profile))})
(contains? params :unblock)
(do
(db/update! pool :profile {:is-blocked false} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' UNBLOCKED" (:email profile))})
(contains? params :resend)
(if (:is-blocked profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "PROFILE ALREADY BLOCKED"}
(do
(auth/send-email-verification! pool props profile)
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "RESENDED FOR '%'" (:email profile))}))
:else
(do
(db/update! pool :profile {:is-active true} {:id (:id profile)})
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body (str/ffmt "PROFILE '%' ACTIVATED" (:email profile))}))))
(defn- reset-file-version
[cfg {:keys [params] :as request}]
(let [file-id (some-> params :file-id d/parse-uuid)
version (some-> params :version d/parse-integer)]
(when-not (contains? params :force)
(ex/raise :type :validation
:code :missing-force
:hint "missing force checkbox"))
(when (nil? file-id)
(ex/raise :type :validation
:code :invalid-file-id
:hint "provided invalid file id"))
(when (nil? version)
(ex/raise :type :validation
:code :invalid-version
:hint "provided invalid version"))
(db/tx-run! cfg srepl/process-file! file-id #(assoc % :version version))
{::rres/status 200
::rres/headers {"content-type" "text/plain"}
::rres/body "OK"}))
(yrs/response
:status 200
:headers {"content-type" "text/plain"}
:body "OK")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OTHER SMALL VIEWS/HANDLERS
@@ -345,15 +427,16 @@
(defn health-handler
"Mainly a task that performs a health check."
[{:keys [pool]} _]
(db/with-atomic [conn pool]
(try
(db/exec-one! conn ["select count(*) as count from server_prop;"])
(yrs/response 200 "OK")
(catch Throwable cause
(l/warn :hint "unable to execute query on health handler"
:cause cause)
(yrs/response 503 "KO")))))
[{:keys [::db/pool]} _]
(try
(db/exec-one! pool ["select count(*) as count from server_prop;"])
{::rres/status 200
::rres/body "OK"}
(catch Throwable cause
(l/warn :hint "unable to execute query on health handler"
:cause cause)
{::rres/status 503
::rres/body "KO"})))
(defn changelog-handler
[_ _]
@@ -362,45 +445,51 @@
(md->html [text]
(md/md-to-html-string text :replacement-transformers (into [transform-emoji] mdt/transformer-vector)))]
(if-let [clog (io/resource "changelog.md")]
(yrs/response :status 200
:headers {"content-type" "text/html; charset=utf-8"}
:body (-> clog slurp md->html))
(yrs/response :status 404 :body "NOT FOUND"))))
{::rres/status 200
::rres/headers {"content-type" "text/html; charset=utf-8"}
::rres/body (-> clog slurp md->html)}
{::rres/status 404
::rres/body "NOT FOUND"})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn authorized?
[pool {:keys [::session/profile-id]}]
(or (= "devenv" (cf/get :host))
(let [profile (ex/ignoring (profile/get-profile pool profile-id))
admins (or (cf/get :admins) #{})]
(contains? admins (:email profile)))))
(def with-authorization
{:compile
(fn [& _]
(fn [handler pool]
(fn [request respond raise]
(fn [request]
(if (authorized? pool request)
(handler request respond raise)
(raise (ex/error :type :authentication
:code :only-admins-allowed))))))})
(handler request)
(ex/raise :type :authentication
:code :only-admins-allowed)))))})
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req-un [::db/pool ::wrk/executor ::session/session]))
(s/keys :req [::db/pool ::session/manager]))
(defmethod ig/init-key ::routes
[_ {:keys [session pool executor] :as cfg}]
[["/readyz" {:middleware [[mw/with-dispatch executor]
[mw/with-config cfg]]
:handler health-handler}]
["/dbg" {:middleware [[session/middleware-2 session]
[with-authorization pool]
[mw/with-dispatch executor]
[mw/with-config cfg]]}
["" {:handler index-handler}]
["/health" {:handler health-handler}]
["/changelog" {:handler changelog-handler}]
;; ["/error-by-id/:id" {:handler error-handler}]
["/error/:id" {:handler error-handler}]
["/error" {:handler error-list-handler}]
["/file/export" {:handler export-handler}]
["/file/import" {:handler import-handler}]
["/file/data" {:handler file-data-handler}]
["/file/changes" {:handler file-changes-handler}]]])
[_ {:keys [::db/pool] :as cfg}]
[["/readyz" {:handler (partial health-handler cfg)}]
["/dbg" {:middleware [[session/authz cfg]
[with-authorization pool]]}
["" {:handler (partial index-handler cfg)}]
["/health" {:handler (partial health-handler cfg)}]
["/changelog" {:handler (partial changelog-handler cfg)}]
["/error/:id" {:handler (partial error-handler cfg)}]
["/error" {:handler (partial error-list-handler cfg)}]
["/actions/resend-email-verification"
{:handler (partial resend-email-notification cfg)}]
["/actions/reset-file-version"
{:handler (partial reset-file-version cfg)}]
["/file/export" {:handler (partial export-handler cfg)}]
["/file/import" {:handler (partial import-handler cfg)}]
["/file/data" {:handler (partial file-data-handler cfg)}]
["/file/changes" {:handler (partial file-changes-handler cfg)}]]])

View File

@@ -7,177 +7,245 @@
(ns app.http.errors
"A errors handling for the http server."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.schema :as-alias sm]
[app.config :as cf]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.session :as-alias session]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[yetti.request :as yrq]
[yetti.response :as yrs]))
(def ^:dynamic *context* {})
[ring.request :as rreq]
[ring.response :as rres]))
(defn- parse-client-ip
[request]
(or (some-> (yrq/get-header request "x-forwarded-for") (str/split ",") first)
(yrq/get-header request "x-real-ip")
(yrq/remote-addr request)))
(or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first)
(rreq/get-header request "x-real-ip")
(rreq/remote-addr request)))
(defn get-context
(defn request->context
"Extracts error report relevant context data from request."
[request]
(let [claims (:session-token-claims request)]
(merge
*context*
{:path (:path request)
:method (:method request)
:params (:params request)
:ip-addr (parse-client-ip request)}
(d/without-nils
{:user-agent (yrq/get-header request "user-agent")
:frontend-version (or (yrq/get-header request "x-frontend-version")
"unknown")
:profile-id (:uid claims)}))))
(let [claims (-> {}
(into (::session/token-claims request))
(into (::actoken/token-claims request)))]
{:request/path (:path request)
:request/method (:method request)
:request/params (:params request)
:request/user-agent (rreq/get-header request "user-agent")
:request/ip-addr (parse-client-ip request)
:request/profile-id (:uid claims)
:version/frontend (or (rreq/get-header request "x-frontend-version") "unknown")
:version/backend (:full cf/version)}))
(defmulti handle-error
(fn [cause _ _]
(-> cause ex-data :type)))
(defmulti handle-exception
(fn [err & _rest]
(let [edata (ex-data err)]
(or (:type edata)
(class err)))))
(fn [cause _ _]
(class cause)))
(defmethod handle-exception :authentication
[err _]
(yrs/response 401 (ex-data err)))
(defmethod handle-error :authentication
[err _ _]
{::rres/status 401
::rres/body (ex-data err)})
(defmethod handle-exception :restriction
[err _]
(yrs/response 400 (ex-data err)))
(defmethod handle-error :authorization
[err _ _]
{::rres/status 403
::rres/body (ex-data err)})
(defmethod handle-exception :rate-limit
[err _]
(defmethod handle-error :restriction
[err _ _]
(let [{:keys [code] :as data} (ex-data err)]
(if (= code :method-not-allowed)
{::rres/status 405
::rres/body data}
{::rres/status 400
::rres/body data})))
(defmethod handle-error :rate-limit
[err _ _]
(let [headers (-> err ex-data ::http/headers)]
(yrs/response :status 429 :body "" :headers headers)))
{::rres/status 429
::rres/headers headers}))
(defmethod handle-exception :validation
[err _]
(defmethod handle-error :concurrency-limit
[err _ _]
(let [headers (-> err ex-data ::http/headers)]
{::rres/status 429
::rres/headers headers}))
(defmethod handle-error :validation
[err request parent-cause]
(let [{:keys [code] :as data} (ex-data err)]
(cond
(= code :spec-validation)
(or (= code :spec-validation)
(= code :params-validation)
(= code :schema-validation)
(= code :data-validation))
(let [explain (ex/explain data)]
(yrs/response :status 400
:body (-> data
(dissoc ::s/problems ::s/value)
(cond-> explain (assoc :explain explain)))))
{::rres/status 400
::rres/body (-> data
(dissoc ::s/problems ::s/value ::s/spec ::sm/explain)
(cond-> explain (assoc :explain explain)))})
(= code :request-body-too-large)
(yrs/response :status 413 :body data)
{::rres/status 413 ::rres/body data}
(= code :invalid-image)
(binding [l/*context* (request->context request)]
(let [cause (or parent-cause err)]
(l/warn :hint "unexpected error on processing image" :cause cause)
{::rres/status 400 ::rres/body data}))
:else
(yrs/response :status 400 :body data))))
{::rres/status 400 ::rres/body data})))
(defmethod handle-exception :assertion
[error request]
(let [edata (ex-data error)
explain (ex/explain edata)]
(l/error :hint (ex-message error)
:cause error
::l/context (get-context request))
(yrs/response :status 500
:body {:type :server-error
:code :assertion
:data (-> edata
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))})))
(defmethod handle-error :assertion
[error request parent-cause]
(binding [l/*context* (request->context request)]
(let [{:keys [code] :as data} (ex-data error)
cause (or parent-cause error)]
(cond
(= code :data-validation)
(let [explain (ex/explain data)]
(l/error :hint "data assertion error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::sm/explain)
(cond-> explain (assoc :explain explain)))}})
(defmethod handle-exception :not-found
[err _]
(yrs/response 404 (ex-data err)))
(= code :spec-validation)
(let [explain (ex/explain data)]
(l/error :hint "spec assertion error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))}})
(defmethod handle-exception :internal
[error request]
(let [{:keys [code] :as edata} (ex-data error)]
(cond
(= :concurrency-limit-reached code)
(yrs/response 429)
:else
(do
(l/error :hint "assertion error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :assertion
:data data}})))))
:else
(do
(l/error :hint (ex-message error)
:cause error
::l/context (get-context request))
(yrs/response 500 {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata})))))
(defmethod handle-error :not-found
[err _ _]
{::rres/status 404
::rres/body (ex-data err)})
(defmethod handle-error :internal
[error request parent-cause]
(binding [l/*context* (request->context request)]
(let [cause (or parent-cause error)]
(l/error :hint "internal error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data (ex-data error)}})))
(defmethod handle-error :default
[error request parent-cause]
(let [edata (ex-data error)]
;; This is a special case for the idle-in-transaction error;
;; when it happens, the connection is automatically closed and
;; next-jdbc combines the two errors in a single ex-info. We
;; only need the :handling error, because the :rollback error
;; will be always "connection closed".
(if (and (ex/exception? (:rollback edata))
(ex/exception? (:handling edata)))
(handle-exception (:handling edata) request error)
(handle-exception error request parent-cause))))
(defmethod handle-exception org.postgresql.util.PSQLException
[error request]
(let [state (.getSQLState ^java.sql.SQLException error)]
(l/error :hint (ex-message error)
:cause error
::l/context (get-context request))
(cond
(= state "57014")
(yrs/response 504 {:type :server-error
:code :statement-timeout
:hint (ex-message error)})
[error request parent-cause]
(let [state (.getSQLState ^java.sql.SQLException error)
cause (or parent-cause error)]
(binding [l/*context* (request->context request)]
(l/error :hint "PSQL error"
:cause cause)
(cond
(= state "57014")
{::rres/status 504
::rres/body {:type :server-error
:code :statement-timeout
:hint (ex-message error)}}
(= state "25P03")
(yrs/response 504 {:type :server-error
:code :idle-in-transaction-timeout
:hint (ex-message error)})
(= state "25P03")
{::rres/status 504
::rres/body {:type :server-error
:code :idle-in-transaction-timeout
:hint (ex-message error)}}
:else
(yrs/response 500 {:type :server-error
:code :unexpected
:hint (ex-message error)
:state state}))))
:else
{::rres/status 500
::rres/body {:type :server-error
:code :unexpected
:hint (ex-message error)
:state state}}))))
(defmethod handle-exception :default
[error request]
(let [edata (ex-data error)]
[error request parent-cause]
(let [edata (ex-data error)
cause (or parent-cause error)]
(cond
;; This means that exception is not a controlled exception.
(nil? edata)
(do
(l/error :hint (ex-message error)
:cause error
::l/context (get-context request))
(yrs/response 500 {:type :server-error
:code :unexpected
:hint (ex-message error)}))
;; This is a special case for the idle-in-transaction error;
;; when it happens, the connection is automatically closed and
;; next-jdbc combines the two errors in a single ex-info. We
;; only need the :handling error, because the :rollback error
;; will be always "connection closed".
(and (ex/exception? (:rollback edata))
(ex/exception? (:handling edata)))
(handle-exception (:handling edata) request)
(binding [l/*context* (request->context request)]
(l/error :hint "unexpected error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :unexpected
:hint (ex-message error)}})
:else
(do
(l/error :hint (ex-message error)
:cause error
::l/context (get-context request))
(yrs/response 500 {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata})))))
(binding [l/*context* (request->context request)]
(l/error :hint "unhandled error" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata}}))))
(defmethod handle-exception java.io.IOException
[cause _ _]
(l/wrn :hint "io exception" :cause cause)
{::rres/status 500
::rres/body {:type :server-error
:code :io-exception
:hint (ex-message cause)}})
(defmethod handle-exception java.util.concurrent.CompletionException
[cause request _]
(let [cause' (ex-cause cause)]
(if (ex/error? cause')
(handle-error cause' request cause)
(handle-exception cause' request cause))))
(defmethod handle-exception java.util.concurrent.ExecutionException
[cause request _]
(let [cause' (ex-cause cause)]
(if (ex/error? cause')
(handle-error cause' request cause)
(handle-exception cause' request cause))))
(defn handle
[cause request]
(cond
(or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(handle-exception (.getCause ^Throwable cause) request)
(if (ex/error? cause)
(handle-error cause request nil)
(handle-exception cause request nil)))
(ex/wrapped? cause)
(let [context (meta cause)
cause (deref cause)]
(binding [*context* context]
(handle-exception cause request)))
:else
(handle-exception cause request)))
(defn handle'
[cause request]
(::rres/body (handle cause request)))

View File

@@ -1,80 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.http.feedback
"A general purpose feedback module."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.emails :as eml]
[app.rpc.queries.profile :as profile]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as yrs]))
(declare ^:private send-feedback)
(declare ^:private handler)
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool ::wrk/executor]))
(defmethod ig/init-key ::handler
[_ {:keys [executor] :as cfg}]
(let [enabled? (contains? cf/flags :user-feedback)]
(if enabled?
(fn [request respond raise]
(-> (px/submit! executor #(handler cfg request))
(p/then' respond)
(p/catch raise)))
(fn [_ _ raise]
(raise (ex/error :type :validation
:code :feedback-disabled
:hint "feedback module is disabled"))))))
(defn- handler
[{:keys [pool] :as cfg} {:keys [profile-id] :as request}]
(let [ftoken (cf/get :feedback-token ::no-token)
token (yrq/get-header request "x-feedback-token")
params (d/merge (:params request)
(:body-params request))]
(cond
(uuid? profile-id)
(let [profile (profile/retrieve-profile-data pool profile-id)
params (assoc params :from (:email profile))]
(send-feedback pool profile params))
(= token ftoken)
(send-feedback cfg nil params))
(yrs/response 204)))
(s/def ::content ::us/string)
(s/def ::from ::us/email)
(s/def ::subject ::us/string)
(s/def ::feedback
(s/keys :req-un [::from ::subject ::content]))
(defn- send-feedback
[pool profile params]
(let [params (us/conform ::feedback params)
destination (cf/get :feedback-destination)]
(eml/send! {::eml/conn pool
::eml/factory eml/feedback
:from destination
:to destination
:profile profile
:reply-to (:from params)
:email (:from params)
:subject (:subject params)
:content (:content params)})
nil))

View File

@@ -12,18 +12,20 @@
[app.config :as cf]
[app.util.json :as json]
[cuerdas.core :as str]
[promesa.core :as p]
[promesa.exec :as px]
[ring.request :as rreq]
[ring.response :as rres]
[yetti.adapter :as yt]
[yetti.middleware :as ymw]
[yetti.request :as yrq]
[yetti.response :as yrs])
[yetti.middleware :as ymw])
(:import
com.fasterxml.jackson.core.JsonParseException
com.fasterxml.jackson.core.io.JsonEOFException
com.fasterxml.jackson.databind.exc.MismatchedInputException
io.undertow.server.RequestTooBigException
java.io.InputStream
java.io.OutputStream))
(set! *warn-on-reflection* true)
(def server-timing
{:name ::server-timing
:compile (constantly ymw/wrap-server-timing)})
@@ -41,17 +43,17 @@
(defn wrap-parse-request
[handler]
(letfn [(process-request [request]
(let [header (yrq/get-header request "content-type")]
(let [header (rreq/get-header request "content-type")]
(cond
(str/starts-with? header "application/transit+json")
(with-open [is (yrq/body request)]
(with-open [^InputStream is (rreq/body request)]
(let [params (t/read! (t/reader is))]
(-> request
(assoc :body-params params)
(update :params merge params))))
(str/starts-with? header "application/json")
(with-open [is (yrq/body request)]
(with-open [^InputStream is (rreq/body request)]
(let [params (json/decode is json-mapper)]
(-> request
(assoc :body-params params)
@@ -60,30 +62,36 @@
:else
request)))
(handle-error [raise cause]
(handle-error [cause]
(cond
(instance? RequestTooBigException cause)
(raise (ex/error :type :validation
:code :request-body-too-large
:hint (ex-message cause)))
(instance? RuntimeException cause)
(if-let [cause (ex-cause cause)]
(handle-error cause)
(throw cause))
(instance? RequestTooBigException cause)
(ex/raise :type :validation
:code :request-body-too-large
:hint (ex-message cause))
(or (instance? JsonEOFException cause)
(instance? JsonParseException cause))
(raise (ex/error :type :validation
:code :malformed-json
:hint (ex-message cause)
:cause cause))
:else
(raise cause)))]
(instance? JsonParseException cause)
(instance? MismatchedInputException cause))
(ex/raise :type :validation
:code :malformed-json
:hint (ex-message cause)
:cause cause)
(fn [request respond raise]
(let [request (ex/try! (process-request request))]
(if (ex/exception? request)
(if (instance? RuntimeException request)
(handle-error raise (or (ex/cause request) request))
(handle-error raise request))
(handler request respond raise))))))
:else
(throw cause)))]
(fn [request]
(if (= (rreq/method request) :post)
(let [request (ex/try! (process-request request))]
(if (ex/exception? request)
(handle-error request)
(handler request)))
(handler request)))))
(def parse-request
{:name ::parse-request
@@ -94,74 +102,70 @@
needed because transit-java calls flush very aggresivelly on each
object write."
[^java.io.OutputStream os ^long chunk-size]
(proxy [java.io.BufferedOutputStream] [os (int chunk-size)]
;; Explicitly do not forward flush
(flush [])
(close []
(proxy-super flush)
(proxy-super close))))
(yetti.util.BufferedOutputStream. os (int chunk-size)))
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
(defn wrap-format-response
[handler]
(letfn [(transit-streamable-body [data opts]
(reify yrs/StreamableResponseBody
(reify rres/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [bos (buffered-output-stream output-stream buffer-size)]
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(let [tw (t/writer bos opts)]
(t/write! tw data)))
(catch java.io.IOException _cause
;; Do nothing, EOF means client closes connection abruptly
nil)
(catch java.io.IOException _)
(catch Throwable cause
(l/warn :hint "unexpected error on encoding response"
:cause cause))
(binding [l/*context* {:value data}]
(l/error :hint "unexpected error on encoding response"
:cause cause)))
(finally
(.close ^OutputStream output-stream))))))
(json-streamable-body [data]
(reify yrs/StreamableResponseBody
(reify rres/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [bos (buffered-output-stream output-stream buffer-size)]
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(json/write! bos data json-mapper))
(catch java.io.IOException _cause
;; Do nothing, EOF means client closes connection abruptly
nil)
(catch java.io.IOException _)
(catch Throwable cause
(l/warn :hint "unexpected error on encoding response"
:cause cause))
(binding [l/*context* {:value data}]
(l/error :hint "unexpected error on encoding response"
:cause cause)))
(finally
(.close ^OutputStream output-stream))))))
(format-response-with-json [response _]
(let [body (yrs/body response)]
(let [body (::rres/body response)]
(if (or (boolean? body) (coll? body))
(-> response
(update :headers assoc "content-type" "application/json")
(assoc :body (json-streamable-body body)))
(update ::rres/headers assoc "content-type" "application/json")
(assoc ::rres/body (json-streamable-body body)))
response)))
(format-response-with-transit [response request]
(let [body (yrs/body response)]
(let [body (::rres/body response)]
(if (or (boolean? body) (coll? body))
(let [qs (yrq/query request)
(let [qs (rreq/query request)
opts (if (or (contains? cf/flags :transit-readable-response)
(str/includes? qs "transit_verbose"))
{:type :json-verbose}
{:type :json})]
(-> response
(update :headers assoc "content-type" "application/transit+json")
(assoc :body (transit-streamable-body body opts))))
(update ::rres/headers assoc "content-type" "application/transit+json")
(assoc ::rres/body (transit-streamable-body body opts))))
response)))
(format-from-params [{:keys [query-params] :as request}]
(and (= "json" (get query-params :_fmt))
"application/json"))
(format-response [response request]
(let [accept (yrq/get-header request "accept")]
(let [accept (or (format-from-params request)
(rreq/get-header request "accept"))]
(cond
(or (= accept "application/transit+json")
(str/includes? accept "application/transit+json"))
@@ -178,12 +182,9 @@
(cond-> response
(map? response) (format-response request)))]
(fn [request respond raise]
(handler request
(fn [response]
(let [response (process-response response request)]
(respond response)))
raise))))
(fn [request]
(let [response (handler request)]
(process-response response request)))))
(def format-response
{:name ::format-response
@@ -191,74 +192,48 @@
(defn wrap-errors
[handler on-error]
(fn [request respond _]
(handler request respond (fn [cause]
(-> cause (on-error request) respond)))))
(fn [request]
(try
(handler request)
(catch Throwable cause
(on-error cause request)))))
(def errors
{:name ::errors
:compile (constantly wrap-errors)})
(defn- with-cors-headers
[headers origin]
(-> headers
(assoc "access-control-allow-origin" origin)
(assoc "access-control-allow-methods" "GET,POST,DELETE,OPTIONS,PUT,HEAD,PATCH")
(assoc "access-control-allow-credentials" "true")
(assoc "access-control-expose-headers" "x-requested-with, content-type, cookie")
(assoc "access-control-allow-headers" "x-frontend-version, content-type, accept, x-requested-width")))
(defn wrap-cors
[handler]
(if-not (contains? cf/flags :cors)
handler
(letfn [(add-headers [headers request]
(let [origin (yrq/get-header request "origin")]
(-> headers
(assoc "access-control-allow-origin" origin)
(assoc "access-control-allow-methods" "GET,POST,DELETE,OPTIONS,PUT,HEAD,PATCH")
(assoc "access-control-allow-credentials" "true")
(assoc "access-control-expose-headers" "x-requested-with, content-type, cookie")
(assoc "access-control-allow-headers" "x-frontend-version, content-type, accept, x-requested-width"))))
(update-response [response request]
(update response :headers add-headers request))]
(fn [request respond raise]
(if (= (yrq/method request) :options)
(-> (yrs/response 200)
(update-response request)
(respond))
(handler request
(fn [response]
(respond (update-response response request)))
raise))))))
(fn [request]
(let [response (if (= (rreq/method request) :options)
{::rres/status 200}
(handler request))
origin (rreq/get-header request "origin")]
(update response ::rres/headers with-cors-headers origin))))
(def cors
{:name ::cors
:compile (constantly wrap-cors)})
(defn compile-restrict-methods
[data _]
(when-let [allowed (:allowed-methods data)]
(fn [handler]
(fn [request respond raise]
(let [method (yrq/method request)]
(if (contains? allowed method)
(handler request respond raise)
(respond (yrs/response 405))))))))
:compile (fn [& _]
(when (contains? cf/flags :cors)
wrap-cors))})
(def restrict-methods
{:name ::restrict-methods
:compile compile-restrict-methods})
(def with-dispatch
{:name ::with-dispatch
:compile
(fn [& _]
(fn [handler executor]
(fn [request respond raise]
(-> (px/submit! executor #(handler request))
(p/bind p/wrap)
(p/then respond)
(p/catch raise)))))})
(def with-config
{:name ::with-config
:compile
(fn [& _]
(fn [handler config]
(fn
([request] (handler config request))
([request respond raise] (handler config request respond raise)))))})
(fn [data _]
(when-let [allowed (:allowed-methods data)]
(fn [handler]
(fn [request]
(let [method (rreq/method request)]
(if (contains? allowed method)
(handler request)
{::rres/status 405}))))))})

View File

@@ -9,17 +9,19 @@
(:require
[app.common.data :as d]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.http.session.tasks :as-alias tasks]
[app.main :as-alias main]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[ring.request :as rreq]
[yetti.request :as yrq]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -45,97 +47,83 @@
(defprotocol ISessionManager
(read [_ key])
(decode [_ key])
(write! [_ key data])
(update! [_ data])
(delete! [_ key]))
(s/def ::session #(satisfies? ISessionManager %))
(s/def ::manager #(satisfies? ISessionManager %))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STORAGE IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::session-params
(s/keys :req-un [::user-agent
::profile-id
::created-at]))
(defn- prepare-session-params
[props data]
(let [profile-id (:profile-id data)
user-agent (:user-agent data)
created-at (or (:created-at data) (dt/now))
token (tokens/generate props {:iss "authentication"
:iat created-at
:uid profile-id})]
{:user-agent user-agent
:profile-id profile-id
:created-at created-at
:updated-at created-at
:id token}))
[key params]
(us/assert! ::us/not-empty-string key)
(us/assert! ::session-params params)
{:user-agent (:user-agent params)
:profile-id (:profile-id params)
:created-at (:created-at params)
:updated-at (:created-at params)
:id key})
(defn- database-manager
[{:keys [::db/pool ::wrk/executor ::main/props]}]
[pool]
(reify ISessionManager
(read [_ token]
(px/with-dispatch executor
(db/exec-one! pool (sql/select :http-session {:id token}))))
(db/exec-one! pool (sql/select :http-session {:id token})))
(decode [_ token]
(px/with-dispatch executor
(tokens/verify props {:token token :iss "authentication"})))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(db/insert! pool :http-session params)
params))
(write! [_ _ data]
(px/with-dispatch executor
(let [params (prepare-session-params props data)]
(db/insert! pool :http-session params)
params)))
(update! [_ data]
(update! [_ params]
(let [updated-at (dt/now)]
(px/with-dispatch executor
(db/update! pool :http-session
{:updated-at updated-at}
{:id (:id data)})
(assoc data :updated-at updated-at))))
(db/update! pool :http-session
{:updated-at updated-at}
{:id (:id params)})
(assoc params :updated-at updated-at)))
(delete! [_ token]
(px/with-dispatch executor
(db/delete! pool :http-session {:id token})
nil))))
(db/delete! pool :http-session {:id token})
nil)))
(defn inmemory-manager
[{:keys [::wrk/executor ::main/props]}]
[]
(let [cache (atom {})]
(reify ISessionManager
(read [_ token]
(p/do (get @cache token)))
(get @cache token))
(decode [_ token]
(px/with-dispatch executor
(tokens/verify props {:token token :iss "authentication"})))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(swap! cache assoc key params)
params))
(write! [_ _ data]
(p/do
(let [{:keys [token] :as params} (prepare-session-params props data)]
(swap! cache assoc token params)
params)))
(update! [_ data]
(p/do
(let [updated-at (dt/now)]
(swap! cache update (:id data) assoc :updated-at updated-at)
(assoc data :updated-at updated-at))))
(update! [_ params]
(let [updated-at (dt/now)]
(swap! cache update (:id params) assoc :updated-at updated-at)
(assoc params :updated-at updated-at)))
(delete! [_ token]
(p/do
(swap! cache dissoc token)
nil)))))
(swap! cache dissoc token)
nil))))
(defmethod ig/pre-init-spec ::manager [_]
(s/keys :req [::db/pool ::wrk/executor ::main/props]))
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::manager
[_ {:keys [::db/pool] :as cfg}]
[_ {:keys [::db/pool]}]
(if (db/read-only? pool)
(inmemory-manager cfg)
(database-manager cfg)))
(inmemory-manager)
(database-manager pool)))
(defmethod ig/halt-key! ::manager
[_ _])
@@ -144,101 +132,113 @@
;; MANAGER IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare assign-auth-token-cookie)
(declare assign-authenticated-cookie)
(declare clear-auth-token-cookie)
(declare clear-authenticated-cookie)
(declare ^:private assign-auth-token-cookie)
(declare ^:private assign-authenticated-cookie)
(declare ^:private clear-auth-token-cookie)
(declare ^:private clear-authenticated-cookie)
(declare ^:private gen-token)
(defn create-fn
[manager profile-id]
[{:keys [::manager ::setup/props]} profile-id]
(us/assert! ::manager manager)
(us/assert! ::us/uuid profile-id)
(fn [request response]
(let [uagent (yrq/get-header request "user-agent")
(let [uagent (rreq/get-header request "user-agent")
params {:profile-id profile-id
:user-agent uagent}]
(-> (write! manager nil params)
(p/then (fn [session]
(l/trace :hint "create" :profile-id profile-id)
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session))))))))
:user-agent uagent
:created-at (dt/now)}
token (gen-token props params)
session (write! manager token params)]
(l/trace :hint "create" :profile-id (str profile-id))
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)))))
(defn delete-fn
[manager]
(letfn [(delete [{:keys [profile-id] :as request}]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (yrq/get-cookie request cname)]
(l/trace :hint "delete" :profile-id profile-id)
(some->> (:value cookie) (delete! manager))))]
(fn [request response]
(p/do
(delete request)
(-> response
(assoc :status 204)
(assoc :body nil)
(clear-auth-token-cookie)
(clear-authenticated-cookie))))))
[{:keys [::manager]}]
(us/assert! ::manager manager)
(fn [request response]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (yrq/get-cookie request cname)]
(l/trace :hint "delete" :profile-id (:profile-id request))
(some->> (:value cookie) (delete! manager))
(-> response
(assoc :status 204)
(assoc :body nil)
(clear-auth-token-cookie)
(clear-authenticated-cookie)))))
(def middleware-1
(letfn [(decode-cookie [manager cookie]
(if-let [value (:value cookie)]
(decode manager value)
(p/resolved nil)))
(defn- gen-token
[props {:keys [profile-id created-at]}]
(tokens/generate props {:iss "authentication"
:iat created-at
:uid profile-id}))
(defn- decode-token
[props token]
(when token
(tokens/verify props {:token token :iss "authentication"})))
(wrap-handler [manager handler request respond raise]
(let [cookie (some->> (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
(yrq/get-cookie request))]
(->> (decode-cookie manager cookie)
(p/fnly (fn [claims _]
(cond-> request
(some? claims) (assoc :session-token-claims claims)
:always (handler respond raise)))))))]
{:name :session-1
:compile (fn [& _]
(fn [handler manager]
(partial wrap-handler manager handler)))}))
(defn- get-token
[request]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (some-> (yrq/get-cookie request cname) :value)]
(when-not (str/empty? cookie)
cookie)))
(def middleware-2
(letfn [(wrap-handler [manager handler request respond raise]
(-> (retrieve-session manager request)
(p/finally (fn [session cause]
(cond
(some? cause)
(raise cause)
(defn- get-session
[manager token]
(some->> token (read manager)))
(nil? session)
(handler request respond raise)
(defn- renew-session?
[{:keys [updated-at] :as session}]
(and (dt/instant? updated-at)
(let [elapsed (dt/diff updated-at (dt/now))]
(neg? (compare default-renewal-max-age elapsed)))))
:else
(let [request (-> request
(assoc :profile-id (:profile-id session))
(assoc :session-id (:id session)))
respond (cond-> respond
(renew-session? session)
(wrap-respond manager session))]
(handler request respond raise)))))))
(defn- wrap-soft-auth
[handler {:keys [::manager ::setup/props]}]
(us/assert! ::manager manager)
(letfn [(handle-request [request]
(try
(let [token (get-token request)
claims (decode-token props token)]
(cond-> request
(map? claims)
(-> (assoc ::token-claims claims)
(assoc ::token token))))
(catch Throwable cause
(l/trace :hint "exception on decoding malformed token" :cause cause)
request)))]
(retrieve-session [manager request]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (yrq/get-cookie request cname)]
(some->> (:value cookie) (read manager))))
(fn [request]
(handler (handle-request request)))))
(renew-session? [{:keys [updated-at] :as session}]
(and (dt/instant? updated-at)
(let [elapsed (dt/diff updated-at (dt/now))]
(neg? (compare default-renewal-max-age elapsed)))))
(defn- wrap-authz
[handler {:keys [::manager]}]
(us/assert! ::manager manager)
(fn [request]
(let [session (get-session manager (::token request))
request (cond-> request
(some? session)
(assoc ::profile-id (:profile-id session)
::id (:id session)))
response (handler request)]
;; Wrap respond with session renewal code
(wrap-respond [respond manager session]
(fn [response]
(p/let [session (update! manager session)]
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)
(respond)))))]
(if (renew-session? session)
(let [session (update! manager session)]
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)))
response))))
{:name :session-2
:compile (fn [& _]
(fn [handler manager]
(partial wrap-handler manager handler)))}))
(def soft-auth
{:name ::soft-auth
:compile (constantly wrap-soft-auth)})
(def authz
{:name ::authz
:compile (constantly wrap-authz)})
;; --- IMPL
@@ -249,6 +249,7 @@
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
secure? (contains? cf/flags :secure-session-cookies)
strict? (contains? cf/flags :strict-session-cookies)
cors? (contains? cf/flags :cors)
name (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
@@ -257,20 +258,23 @@
:expires expires
:value token
:comment comment
:same-site (if cors? :none :lax)
:same-site (if cors? :none (if strict? :strict :lax))
:secure secure?}]
(update response :cookies assoc name cookie)))
(defn- assign-authenticated-cookie
[response {updated-at :updated-at}]
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)
domain (cf/get :authenticated-cookie-domain)
cname (cf/get :authenticated-cookie-name "authenticated")
created-at (or updated-at (dt/now))
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
secure? (contains? cf/flags :secure-session-cookies)
domain (cf/get :authenticated-cookie-domain)
name (cf/get :authenticated-cookie-name "authenticated")
cookie {:domain domain
:expires expires
:path "/"
@@ -280,41 +284,46 @@
:secure secure?}]
(cond-> response
(string? domain)
(update :cookies assoc name cookie))))
(update :cookies assoc cname cookie))))
(defn- clear-auth-token-cookie
[response]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(update response :cookies assoc cname {:path "/" :value "" :max-age -1})))
(update response :cookies assoc cname {:path "/" :value "" :max-age 0})))
(defn- clear-authenticated-cookie
[response]
(let [cname (cf/get :authenticated-cookie-name default-authenticated-cookie-name)
(let [cname (cf/get :authenticated-cookie-name default-authenticated-cookie-name)
domain (cf/get :authenticated-cookie-domain)]
(cond-> response
(string? domain)
(update :cookies assoc cname {:domain domain :path "/" :value "" :max-age -1}))))
(update :cookies assoc cname {:domain domain :path "/" :value "" :max-age 0}))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TASK: SESSION GC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare sql:delete-expired)
(s/def ::tasks/max-age ::dt/duration)
(s/def ::max-age ::dt/duration)
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]
:opt [::tasks/max-age]))
(defmethod ig/pre-init-spec ::gc-task [_]
(s/keys :req-un [::db/pool]
:opt-un [::max-age]))
(defmethod ig/prep-key ::gc-task
(defmethod ig/prep-key ::tasks/gc
[_ cfg]
(merge {:max-age default-cookie-max-age}
(d/without-nils cfg)))
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)]
(merge {::tasks/max-age max-age} (d/without-nils cfg))))
(defmethod ig/init-key ::gc-task
[_ {:keys [pool max-age] :as cfg}]
(def ^:private
sql:delete-expired
"delete from http_session
where updated_at < now() - ?::interval
or (updated_at is null and
created_at < now() - ?::interval)")
(defmethod ig/init-key ::tasks/gc
[_ {:keys [::db/pool ::tasks/max-age] :as cfg}]
(l/debug :hint "initializing session gc task" :max-age max-age)
(fn [_]
(db/with-atomic [conn pool]
@@ -326,9 +335,3 @@
:deleted result)
result))))
(def ^:private
sql:delete-expired
"delete from http_session
where updated_at < now() - ?::interval
or (updated_at is null and
created_at < now() - ?::interval)")

View File

@@ -0,0 +1,67 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.http.sse
"SSE (server sent events) helpers"
(:refer-clojure :exclude [tap])
(:require
[app.common.data :as d]
[app.common.logging :as l]
[app.common.transit :as t]
[app.http.errors :as errors]
[app.util.events :as events]
[promesa.exec :as px]
[promesa.exec.csp :as sp]
[promesa.util :as pu]
[ring.response :as rres])
(:import
java.io.OutputStream))
(defn- write!
[^OutputStream output ^bytes data]
(l/trc :hint "writting data" :data data :length (alength data))
(.write output data)
(.flush output))
(defn- encode
[[name data]]
(try
(let [data (with-out-str
(println "event:" (d/name name))
(println "data:" (t/encode-str data {:type :json-verbose}))
(println))]
(.getBytes data "UTF-8"))
(catch Throwable cause
(l/err :hint "unexpected error on encoding value on sse stream"
:cause cause)
nil)))
;; ---- PUBLIC API
(def default-headers
{"Content-Type" "text/event-stream;charset=UTF-8"
"Cache-Control" "no-cache, no-store, max-age=0, must-revalidate"
"Pragma" "no-cache"})
(defn response
[handler & {:keys [buf] :or {buf 32} :as opts}]
(fn [request]
{::rres/headers default-headers
::rres/status 200
::rres/body (reify rres/StreamableResponseBody
(-write-body-to-stream [_ _ output]
(binding [events/*channel* (sp/chan :buf buf :xf (keep encode))]
(let [listener (events/start-listener
(partial write! output)
(partial pu/close! output))]
(try
(let [result (handler)]
(events/tap :end result))
(catch Throwable cause
(events/tap :error (errors/handle' cause request)))
(finally
(sp/close! events/*channel*)
(px/await! listener)))))))}))

View File

@@ -10,15 +10,18 @@
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[app.common.schema :as sm]
[app.common.uuid :as uuid]
[app.db :as db]
[app.http.session :as session]
[app.metrics :as mtx]
[app.msgbus :as mbus]
[app.util.time :as dt]
[app.util.websocket :as ws]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec.csp :as sp]
[ring.websocket :as rws]
[yetti.websocket :as yws]))
(def recv-labels
@@ -33,71 +36,38 @@
(def state (atom {}))
(defn- on-connect
[{:keys [metrics]} wsp]
(let [created-at (dt/now)]
(swap! state assoc (::ws/id @wsp) wsp)
(mtx/run! metrics
:id :websocket-active-connections
:inc 1)
(fn []
(swap! state dissoc (::ws/id @wsp))
(mtx/run! metrics :id :websocket-active-connections :dec 1)
(mtx/run! metrics
:id :websocket-session-timing
:val (/ (inst-ms (dt/diff created-at (dt/now))) 1000.0)))))
(defn- on-rcv-message
[{:keys [metrics]} _ message]
(mtx/run! metrics
:id :websocket-messages-total
:labels recv-labels
:inc 1)
message)
(defn- on-snd-message
[{:keys [metrics]} _ message]
(mtx/run! metrics
:id :websocket-messages-total
:labels send-labels
:inc 1)
message)
;; REPL HELPERS
(defn repl-get-connections-for-file
[file-id]
(->> (vals @state)
(filter #(= file-id (-> % deref ::file-subscription :file-id)))
(map deref)
(map ::ws/id)))
(defn repl-get-connections-for-team
[team-id]
(->> (vals @state)
(filter #(= team-id (-> % deref ::team-subscription :team-id)))
(map deref)
(map ::ws/id)))
(defn repl-close-connection
[id]
(when-let [wsp (get @state id)]
(a/>!! (::ws/close-ch @wsp) [8899 "closed from server"])
(a/close! (::ws/close-ch @wsp))))
(when-let [{:keys [::ws/close-ch] :as wsp} (get @state id)]
(sp/put! close-ch [8899 "closed from server"])
(sp/close! close-ch)))
(defn repl-get-connection-info
[id]
(when-let [wsp (get @state id)]
{:id id
:created-at (::created-at @wsp)
:profile-id (::profile-id @wsp)
:session-id (::session-id @wsp)
:user-agent (::ws/user-agent @wsp)
:ip-addr (::ws/remote-addr @wsp)
:last-activity-at (::ws/last-activity-at @wsp)
:http-session-id (::ws/http-session-id @wsp)
:subscribed-file (-> wsp deref ::file-subscription :file-id)
:subscribed-team (-> wsp deref ::team-subscription :team-id)}))
:created-at (::created-at wsp)
:profile-id (::profile-id wsp)
:session-id (::session-id wsp)
:user-agent (::ws/user-agent wsp)
:ip-addr (::ws/remote-addr wsp)
:last-activity-at (::ws/last-activity-at wsp)
:subscribed-file (-> wsp ::file-subscription :file-id)
:subscribed-team (-> wsp ::team-subscription :team-id)}))
(defn repl-print-connection-info
[id]
@@ -117,235 +87,239 @@
(fn [_ _ message]
(:type message)))
(defmethod handle-message :connect
[cfg wsp _]
(defmethod handle-message :open
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/output-ch ::ws/state ::profile-id ::session-id] :as wsp} _]
(l/trace :fn "handle-message" :event "open" :conn-id id)
(let [ch (sp/chan :buf (sp/dropping-buffer 16)
:xf (remove #(= (:session-id %) session-id)))]
(let [msgbus (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
;; Subscribe to the profile channel and forward all messages to websocket output
;; channel (send them to the client).
(swap! state assoc ::profile-subscription {:channel ch})
xform (remove #(= (:session-id %) session-id))
channel (a/chan (a/dropping-buffer 16) xform)]
;; Forward the subscription messages directly to the websocket output channel
(sp/pipe ch output-ch false)
(l/trace :fn "handle-message" :event "connect" :conn-id conn-id)
;; Subscribe to the profile topic on msgbus/redis
(mbus/sub! msgbus :topic profile-id :chan ch)
;; Subscribe to the profile channel and forward all messages to
;; websocket output channel (send them to the client).
(swap! wsp assoc ::profile-subscription channel)
(a/pipe channel output-ch false)
(mbus/sub! msgbus :topic profile-id :chan channel)))
;; Subscribe to the system topic on msgbus/redis
(mbus/sub! msgbus :topic (str uuid/zero) :chan ch)))
(defmethod handle-message :disconnect
[cfg wsp _]
(let [msgbus (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
profile-ch (::profile-subscription @wsp)
fsub (::file-subscription @wsp)
tsub (::team-subscription @wsp)
(defmethod handle-message :close
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::profile-id ::session-id]} _]
(l/trace :fn "handle-message" :event "close" :conn-id id)
(let [psub (::profile-subscription @state)
fsub (::file-subscription @state)
tsub (::team-subscription @state)
msg {:type :disconnect
:subs-id profile-id
:profile-id profile-id
:session-id session-id}]
message {:type :disconnect
:subs-id profile-id
:profile-id profile-id
:session-id session-id}]
;; Close profile subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(l/trace :fn "handle-message"
:event :disconnect
:conn-id conn-id)
;; Close team subscription if exists
(when-let [ch (:channel tsub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(a/go
;; Close the main profile subscription
(a/close! profile-ch)
(a/<! (mbus/purge! msgbus [profile-ch]))
;; Close tram subscription if exists
(when-let [channel (:channel tsub)]
(a/close! channel)
(a/<! (mbus/purge! msgbus channel)))
(when-let [{:keys [topic channel]} fsub]
(a/close! channel)
(a/<! (mbus/purge! msgbus channel))
(a/<! (mbus/pub! msgbus :topic topic :message message))))))
;; Close file subscription if exists
(when-let [{:keys [topic channel]} fsub]
(sp/close! channel)
(mbus/purge! msgbus [channel])
(mbus/pub! msgbus :topic topic :message msg))))
(defmethod handle-message :subscribe-team
[cfg wsp {:keys [team-id] :as params}]
(let [msgbus (:msgbus cfg)
conn-id (::ws/id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
prev-subs (get @wsp ::team-subscription)
xform (comp
(remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id team-id)))
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::ws/output-ch ::session-id]} {:keys [team-id] :as params}]
(l/trace :fn "handle-message" :event "subscribe-team" :team-id team-id :conn-id id)
(let [prev-subs (get @state ::team-subscription)
channel (sp/chan :buf (sp/dropping-buffer 64)
:xf (comp
(remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id team-id))))]
channel (a/chan (a/dropping-buffer 64) xform)]
(sp/pipe channel output-ch false)
(mbus/sub! msgbus :topic team-id :chan channel)
(l/trace :fn "handle-message"
:event :subscribe-team
:team-id team-id
:conn-id conn-id)
(let [subs {:team-id team-id :channel channel :topic team-id}]
(swap! state assoc ::team-subscription subs))
(a/pipe channel output-ch false)
;; Close previous subscription if exists
(when-let [ch (:channel prev-subs)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))))
(let [state {:team-id team-id :channel channel :topic team-id}]
(swap! wsp assoc ::team-subscription state))
(a/go
;; Close previous subscription if exists
(when-let [channel (:channel prev-subs)]
(a/close! channel)
(a/<! (mbus/purge! msgbus channel))))
(a/go
(a/<! (mbus/sub! msgbus :topic team-id :chan channel)))))
(defmethod handle-message :subscribe-file
[cfg wsp {:keys [file-id] :as params}]
(let [msgbus (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
prev-subs (::file-subscription @wsp)
xform (comp (remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id file-id)))
channel (a/chan (a/dropping-buffer 64) xform)]
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::ws/output-ch ::session-id ::profile-id]} {:keys [file-id] :as params}]
(l/trace :fn "handle-message" :event "subscribe-file" :file-id file-id :conn-id id)
(let [psub (::file-subscription @state)
fch (sp/chan :buf (sp/dropping-buffer 64)
:xf (comp (remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id file-id))))]
(l/trace :fn "handle-message"
:event :subscribe-file
:file-id file-id
:conn-id conn-id)
(let [subs {:file-id file-id :channel fch :topic file-id}]
(swap! state assoc ::file-subscription subs))
(let [state {:file-id file-id :channel channel :topic file-id}]
(swap! wsp assoc ::file-subscription state))
;; Close previous subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(a/go
;; Close previous subscription if exists
(when-let [channel (:channel prev-subs)]
(a/close! channel)
(a/<! (mbus/purge! msgbus channel))))
(sp/go-loop []
(when-let [{:keys [type] :as message} (sp/take! fch)]
(sp/put! output-ch message)
(when (or (= :join-file type)
(= :leave-file type)
(= :disconnect type))
(let [message {:type :presence
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(mbus/pub! msgbus
:topic file-id
:message message)))
(recur)))
;; Message forwarding
(a/go
(loop []
(when-let [{:keys [type] :as message} (a/<! channel)]
(when (or (= :join-file type)
(= :leave-file type)
(= :disconnect type))
(let [message {:type :presence
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(a/<! (mbus/pub! msgbus :topic file-id :message message))))
(a/>! output-ch message)
(recur))))
;; Subscribe to file topic
(mbus/sub! msgbus :topic file-id :chan fch)
(a/go
;; Subscribe to file topic
(a/<! (mbus/sub! msgbus :topic file-id :chan channel))
;; Notifify the rest of participants of the new connection.
(let [message {:type :join-file
:file-id file-id
:subs-id file-id
:session-id session-id
:profile-id profile-id}]
(a/<! (mbus/pub! msgbus :topic file-id :message message))))))
;; Notifify the rest of participants of the new connection.
(let [message {:type :join-file
:file-id file-id
:subs-id file-id
:session-id session-id
:profile-id profile-id}]
(mbus/pub! msgbus :topic file-id :message message))))
(defmethod handle-message :unsubscribe-file
[cfg wsp {:keys [file-id] :as params}]
(let [msgbus (:msgbus cfg)
conn-id (::ws/id @wsp)
session-id (::session-id @wsp)
profile-id (::profile-id @wsp)
subs (::file-subscription @wsp)
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::session-id ::profile-id]} {:keys [file-id] :as params}]
(l/trace :fn "handle-message" :event "unsubscribe-file" :file-id file-id :conn-id id)
message {:type :leave-file
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(let [subs (::file-subscription @state)
message {:type :leave-file
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(l/trace :fn "handle-message"
:event :unsubscribe-file
:file-id file-id
:conn-id conn-id)
(a/go
(when (= (:file-id subs) file-id)
(let [channel (:channel subs)]
(a/close! channel)
(a/<! (mbus/purge! msgbus channel))
(a/<! (mbus/pub! msgbus :topic file-id :message message)))))))
(when (= (:file-id subs) file-id)
(mbus/pub! msgbus :topic file-id :message message)
(let [ch (:channel subs)]
(sp/close! ch)
(mbus/purge! msgbus [ch])))))
(defmethod handle-message :keepalive
[_ _ _]
(l/trace :fn "handle-message" :event :keepalive)
(a/go :nothing))
(l/trace :fn "handle-message" :event :keepalive))
(defmethod handle-message :broadcast
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::session-id ::profile-id]} message]
(l/trace :fn "handle-message" :event "broadcast" :conn-id id)
(let [message (-> message
(assoc :subs-id profile-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(mbus/pub! msgbus :topic profile-id :message message)))
(defmethod handle-message :pointer-update
[cfg wsp {:keys [file-id] :as message}]
(let [msgbus (:msgbus cfg)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
subs (::file-subscription @wsp)
message (-> message
(assoc :subs-id file-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(a/go
;; Only allow receive pointer updates when active subscription
(when subs
(a/<! (mbus/pub! msgbus :topic file-id :message message))))))
[{:keys [::mbus/msgbus]} {:keys [::ws/state ::session-id ::profile-id]} {:keys [file-id] :as message}]
(when (::file-subscription @state)
(let [message (-> message
(assoc :subs-id file-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(mbus/pub! msgbus :topic file-id :message message))))
(defmethod handle-message :default
[_ wsp message]
(let [conn-id (::ws/id @wsp)]
(l/warn :hint "received unexpected message"
:message message
:conn-id conn-id)
(a/go :none)))
[_ {:keys [::ws/id]} message]
(l/warn :hint "received unexpected message"
:message message
:conn-id id))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::msgbus ::mbus/msgbus)
(s/def ::session-id ::us/uuid)
(defn- on-connect
[{:keys [::mtx/metrics]} {:keys [::ws/id] :as wsp}]
(let [created-at (dt/now)]
(l/trace :fn "on-connect" :conn-id id)
(swap! state assoc id wsp)
(mtx/run! metrics
:id :websocket-active-connections
:inc 1)
(s/def ::handler-params
(s/keys :req-un [::session-id]))
(assoc wsp ::ws/on-disconnect
(fn []
(l/trace :fn "on-disconnect" :conn-id id)
(swap! state dissoc id)
(mtx/run! metrics :id :websocket-active-connections :dec 1)
(mtx/run! metrics
:id :websocket-session-timing
:val (/ (inst-ms (dt/diff created-at (dt/now))) 1000.0))))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::msgbus ::db/pool ::mtx/metrics]))
(defn- on-rcv-message
[{:keys [::mtx/metrics ::profile-id ::session-id]} message]
(mtx/run! metrics
:id :websocket-messages-total
:labels recv-labels
:inc 1)
(assoc message :profile-id profile-id :session-id session-id))
(defmethod ig/init-key ::handler
(defn- on-snd-message
[{:keys [::mtx/metrics]} message]
(mtx/run! metrics
:id :websocket-messages-total
:labels send-labels
:inc 1)
message)
(def ^:private schema:params
(sm/define
[:map {:title "params"}
[:session-id ::sm/uuid]]))
(defn- http-handler
[cfg {:keys [params ::session/profile-id] :as request}]
(let [{:keys [session-id]} (sm/conform! schema:params params)]
(cond
(not profile-id)
(ex/raise :type :authentication
:hint "Authentication required.")
;; WORKAROUND: we use the adapter specific predicate for
;; performance reasons; for now, the ring default impl for
;; `upgrade-request?` parses all requests headers before perform
;; any checking.
(not (yws/upgrade-request? request))
(ex/raise :type :validation
:code :websocket-request-expected
:hint "this endpoint only accepts websocket connections")
:else
(do
(l/trace :hint "websocket request" :profile-id profile-id :session-id session-id)
{::rws/listener (ws/listener request
::ws/on-rcv-message (partial on-rcv-message cfg)
::ws/on-snd-message (partial on-snd-message cfg)
::ws/on-connect (partial on-connect cfg)
::ws/handler (partial handle-message cfg)
::profile-id profile-id
::session-id session-id)}))))
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::mbus/msgbus
::mtx/metrics
::db/pool
::session/manager]))
(s/def ::routes vector?)
(defmethod ig/init-key ::routes
[_ cfg]
(fn [{:keys [profile-id params] :as req} respond raise]
(let [{:keys [session-id]} (us/conform ::handler-params params)]
(cond
(not profile-id)
(raise (ex/error :type :authentication
:hint "Authentication required."))
(not (yws/upgrade-request? req))
(raise (ex/error :type :validation
:code :websocket-request-expected
:hint "this endpoint only accepts websocket connections"))
:else
(do
(l/trace :hint "websocket request" :profile-id profile-id :session-id session-id)
(->> (ws/handler
::ws/on-rcv-message (partial on-rcv-message cfg)
::ws/on-snd-message (partial on-snd-message cfg)
::ws/on-connect (partial on-connect cfg)
::ws/handler (partial handle-message cfg)
::profile-id profile-id
::session-id session-id)
(yws/upgrade req)
(respond)))))))
["/ws/notifications" {:middleware [[session/authz cfg]]
:handler (partial http-handler cfg)}])

View File

@@ -9,30 +9,25 @@
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.loggers.audit.tasks :as-alias tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.main :as-alias main]
[app.metrics :as mtx]
[app.rpc :as-alias rpc]
[app.tokens :as tokens]
[app.util.retry :as rtry]
[app.rpc.retry :as rtry]
[app.setup :as-alias setup]
[app.util.services :as-alias sv]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.request :as yrq]))
[ring.request :as rreq]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
@@ -40,9 +35,9 @@
(defn parse-client-ip
[request]
(or (some-> (yrq/get-header request "x-forwarded-for") (str/split ",") first)
(yrq/get-header request "x-real-ip")
(some-> (yrq/remote-addr request) str)))
(or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first)
(rreq/get-header request "x-real-ip")
(some-> (rreq/remote-addr request) str)))
(defn extract-utm-params
"Extracts additional data from params and namespace them under
@@ -77,31 +72,32 @@
(merge (:props profile))
(d/without-nils)))
(defn clean-props
[{:keys [profile-id] :as event}]
(let [invalid-keys #{:session-id
:password
:old-password
:token}
xform (comp
(remove (fn [kv]
(qualified-keyword? (first kv))))
(remove (fn [kv]
(contains? invalid-keys (first kv))))
(remove (fn [[k v]]
(and (= k :profile-id)
(= v profile-id))))
(filter (fn [[_ v]]
(or (string? v)
(keyword? v)
(uuid? v)
(boolean? v)
(number? v)))))]
(def reserved-props
#{:session-id
:password
:old-password
:token})
(update event :props #(into {} xform %))))
(defn clean-props
[props]
(into {}
(comp
(d/without-nils)
(d/without-qualified)
(remove #(contains? reserved-props (key %))))
props))
;; --- SPECS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; COLLECTOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Defines a service that collects the audit/activity log using
;; internal database. Later this audit log can be transferred to
;; an external storage and data cleared.
(s/def ::profile-id ::us/uuid)
(s/def ::name ::us/string)
(s/def ::type ::us/string)
@@ -114,60 +110,116 @@
(s/or :fn fn? :str string? :kw keyword?))
(s/def ::event
(s/keys :req-un [::type ::name ::profile-id]
:opt-un [::ip-addr ::props]
:opt [::webhooks/event?
(s/keys :req [::type ::name ::profile-id]
:opt [::ip-addr
::props
::webhooks/event?
::webhooks/batch-timeout
::webhooks/batch-key]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; COLLECTOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Defines a service that collects the audit/activity log using
;; internal database. Later this audit log can be transferred to
;; an external storage and data cleared.
(s/def ::collector
(s/keys :req [::wrk/executor ::db/pool]))
(defmethod ig/pre-init-spec ::collector [_]
(s/keys :req [::db/pool ::wrk/executor ::mtx/metrics]))
(s/keys :req [::db/pool ::wrk/executor]))
(defmethod ig/init-key ::collector
[_ {:keys [::db/pool] :as cfg}]
(cond
(db/read-only? pool)
(l/warn :hint "audit: disabled (db is read-only)")
(l/warn :hint "audit disabled (db is read-only)")
:else
cfg))
(defn- persist-event!
[pool event]
(us/verify! ::event event)
(defn prepare-event
[cfg mdata params result]
(let [resultm (meta result)
request (-> params meta ::http/request)
profile-id (or (::profile-id resultm)
(:profile-id result)
(::rpc/profile-id params)
uuid/zero)
props (-> (or (::replace-props resultm)
(-> params
(merge (::props resultm))
(dissoc :profile-id)
(dissoc :type)))
(clean-props))
token-id (::actoken/id request)
context (d/without-nils
{:access-token-id (some-> token-id str)})]
{::type (or (::type resultm)
(::rpc/type cfg))
::name (or (::name resultm)
(::sv/name mdata))
::profile-id profile-id
::ip-addr (some-> request parse-client-ip)
::props props
::context context
;; NOTE: for batch-key lookup we need the params as-is
;; because the rpc api does not need to know the
;; audit/webhook specific object layout.
::rpc/params params
::webhooks/batch-key
(or (::webhooks/batch-key mdata)
(::webhooks/batch-key resultm))
::webhooks/batch-timeout
(or (::webhooks/batch-timeout mdata)
(::webhooks/batch-timeout resultm))
::webhooks/event?
(or (::webhooks/event? mdata)
(::webhooks/event? resultm)
false)}))
(defn- handle-event!
[cfg event]
(let [params {:id (uuid/next)
:name (:name event)
:type (:type event)
:profile-id (:profile-id event)
:ip-addr (:ip-addr event)
:props (:props event)}]
:name (::name event)
:type (::type event)
:profile-id (::profile-id event)
:ip-addr (::ip-addr event)
:context (::context event)
:props (::props event)}
tnow (dt/now)]
(when (contains? cf/flags :audit-log)
;; NOTE: this operation may cause primary key conflicts on inserts
;; because of the timestamp precission (two concurrent requests), in
;; this case we just retry the operation.
(rtry/with-retry {::rtry/when rtry/conflict-exception?
::rtry/max-retries 6
::rtry/label "persist-audit-log-event"}
(let [now (dt/now)]
(db/insert! pool :audit-log
(-> params
(update :props db/tjson)
(update :ip-addr db/inet)
(assoc :created-at now)
(assoc :tracked-at now)
(assoc :source "backend"))))))
(let [params (-> params
(assoc :created-at tnow)
(assoc :tracked-at tnow)
(update :props db/tjson)
(update :context db/tjson)
(update :ip-addr db/inet)
(assoc :source "backend"))]
(db/insert! cfg :audit-log params)))
(when (and (or (contains? cf/flags :telemetry)
(cf/get :telemetry-enabled))
(not (contains? cf/flags :audit-log)))
;; NOTE: this operation may cause primary key conflicts on inserts
;; because of the timestamp precission (two concurrent requests), in
;; this case we just retry the operation.
;;
;; NOTE: this is only executed when general audit log is disabled
(let [params (-> params
(assoc :created-at tnow)
(assoc :tracked-at tnow)
(assoc :props (db/tjson {}))
(assoc :context (db/tjson {}))
(assoc :ip-addr (db/inet "0.0.0.0"))
(assoc :source "backend"))]
(db/insert! cfg :audit-log params)))
(when (and (contains? cf/flags :webhooks)
(::webhooks/event? event))
@@ -180,7 +232,7 @@
:else label)
dedupe? (boolean (and batch-key batch-timeout))]
(wrk/submit! ::wrk/conn pool
(wrk/submit! ::wrk/conn (::db/conn cfg)
::wrk/task :process-webhook-event
::wrk/queue :webhooks
::wrk/max-retries 0
@@ -191,148 +243,19 @@
::webhooks/event
(-> params
(dissoc :ip-addr)
(dissoc :type)))))))
(dissoc :type)))))
params))
(defn submit!
"Submit audit event to the collector."
[{:keys [::wrk/executor ::db/pool] :as collector} params]
(us/assert! ::collector collector)
(->> (px/submit! executor (partial persist-event! pool (d/without-nils params)))
(p/merr (fn [cause]
(l/error :hint "audit: unexpected error processing event" :cause cause)
(p/resolved nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TASK: ARCHIVE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(declare archive-events)
(s/def ::tasks/uri ::us/string)
(defmethod ig/pre-init-spec ::tasks/archive-task [_]
(s/keys :req [::db/pool ::main/props ::http/client]))
(defmethod ig/init-key ::tasks/archive
[_ cfg]
(fn [params]
;; NOTE: this let allows overwrite default configured values from
;; the repl, when manually invoking the task.
(let [enabled (or (contains? cf/flags :audit-log-archive)
(:enabled params false))
uri (cf/get :audit-log-archive-uri)
uri (or uri (:uri params))
cfg (assoc cfg ::uri uri)]
(when (and enabled (not uri))
(ex/raise :type :internal
:code :task-not-configured
:hint "archive task not configured, missing uri"))
(when enabled
(loop [total 0]
(let [n (archive-events cfg)]
(if n
(do
(px/sleep 100)
(recur (+ total n)))
(when (pos? total)
(l/debug :hint "events archived" :total total)))))))))
(def ^:private sql:retrieve-batch-of-audit-log
"select *
from audit_log
where archived_at is null
order by created_at asc
limit 256
for update skip locked;")
(defn archive-events
[{:keys [::db/pool ::uri] :as cfg}]
(letfn [(decode-row [{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
(assoc :props (db/decode-transit-pgobject props))
(db/pgobject? context)
(assoc :context (db/decode-transit-pgobject context))
(db/pgobject? ip-addr "inet")
(assoc :ip-addr (db/decode-inet ip-addr))))
(row->event [row]
(select-keys row [:type
:name
:source
:created-at
:tracked-at
:profile-id
:ip-addr
:props
:context]))
(send [events]
(let [token (tokens/generate (::main/props cfg)
{:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
body (t/encode {:events events})
headers {"content-type" "application/transit+json"
"origin" (cf/get :public-uri)
"cookie" (u/map->query-string {:auth-token token})}
params {:uri uri
:timeout 6000
:method :post
:headers headers
:body body}
resp (http/req! cfg params {:sync? true})]
(if (= (:status resp) 204)
true
(do
(l/error :hint "unable to archive events"
:resp-status (:status resp)
:resp-body (:body resp))
false))))
(mark-as-archived [conn rows]
(db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)"
(->> (map :id rows)
(into-array java.util.UUID)
(db/create-array conn "uuid"))]))]
(db/with-atomic [conn pool]
(let [rows (db/exec! conn [sql:retrieve-batch-of-audit-log])
xform (comp (map decode-row)
(map row->event))
events (into [] xform rows)]
(when-not (empty? events)
(l/trace :hint "archive events chunk" :uri uri :events (count events))
(when (send events)
(mark-as-archived conn rows)
(count events)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GC Task
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private sql:clean-archived
"delete from audit_log
where archived_at is not null")
(defn- clean-archived
[{:keys [::db/pool]}]
(let [result (db/exec-one! pool [sql:clean-archived])
result (:next.jdbc/update-count result)]
(l/debug :hint "delete archived audit log entries" :deleted result)
result))
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::tasks/gc
[_ cfg]
(fn [_]
(clean-archived cfg)))
[cfg params]
(try
(let [event (d/without-nils params)
cfg (-> cfg
(assoc ::rtry/when rtry/conflict-exception?)
(assoc ::rtry/max-retries 6)
(assoc ::rtry/label "persist-audit-log"))]
(us/verify! ::event event)
(rtry/invoke! cfg db/tx-run! handle-event! event))
(catch Throwable cause
(l/error :hint "unexpected error processing event" :cause cause))))

View File

@@ -0,0 +1,140 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.audit.archive-task
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.setup :as-alias setup]
[app.tokens :as tokens]
[app.util.time :as dt]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.exec :as px]))
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(defn- decode-row
[{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
(assoc :props (db/decode-transit-pgobject props))
(db/pgobject? context)
(assoc :context (db/decode-transit-pgobject context))
(db/pgobject? ip-addr "inet")
(assoc :ip-addr (db/decode-inet ip-addr))))
(def ^:private event-keys
[:type
:name
:source
:created-at
:tracked-at
:profile-id
:ip-addr
:props
:context])
(defn- row->event
[row]
(select-keys row event-keys))
(defn- send!
[{:keys [::uri] :as cfg} events]
(let [token (tokens/generate (::setup/props cfg)
{:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
body (t/encode {:events events})
headers {"content-type" "application/transit+json"
"origin" (cf/get :public-uri)
"cookie" (u/map->query-string {:auth-token token})}
params {:uri uri
:timeout 12000
:method :post
:headers headers
:body body}
resp (http/req! cfg params)]
(if (= (:status resp) 204)
true
(do
(l/error :hint "unable to archive events"
:resp-status (:status resp)
:resp-body (:body resp))
false))))
(defn- mark-archived!
[{:keys [::db/conn]} rows]
(let [ids (db/create-array conn "uuid" (map :id rows))]
(db/exec-one! conn ["update audit_log set archived_at=now() where id = ANY(?)" ids])))
(def ^:private xf:create-event
(comp (map decode-row)
(map row->event)))
(def ^:private sql:get-audit-log-chunk
"SELECT *
FROM audit_log
WHERE archived_at is null
ORDER BY created_at ASC
LIMIT 128
FOR UPDATE
SKIP LOCKED")
(defn- get-event-rows
[{:keys [::db/conn] :as cfg}]
(->> (db/exec! conn [sql:get-audit-log-chunk])
(not-empty)))
(defn- archive-events!
[{:keys [::uri] :as cfg}]
(db/tx-run! cfg (fn [cfg]
(when-let [rows (get-event-rows cfg)]
(let [events (into [] xf:create-event rows)]
(l/trc :hint "archive events chunk" :uri uri :events (count events))
(when (send! cfg events)
(mark-archived! cfg rows)
(count events)))))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::db/pool ::setup/props ::http/client]))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [params]
;; NOTE: this let allows overwrite default configured values from
;; the repl, when manually invoking the task.
(let [enabled (or (contains? cf/flags :audit-log-archive)
(:enabled params false))
uri (cf/get :audit-log-archive-uri)
uri (or uri (:uri params))
cfg (assoc cfg ::uri uri)]
(when (and enabled (not uri))
(ex/raise :type :internal
:code :task-not-configured
:hint "archive task not configured, missing uri"))
(when enabled
(loop [total 0]
(if-let [n (archive-events! cfg)]
(do
(px/sleep 100)
(recur (+ total ^long n)))
(when (pos? total)
(l/dbg :hint "events archived" :total total))))))))

View File

@@ -0,0 +1,31 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.audit.gc-task
(:require
[app.common.logging :as l]
[app.db :as db]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(def ^:private sql:clean-archived
"DELETE FROM audit_log
WHERE archived_at IS NOT NULL")
(defn- clean-archived!
[{:keys [::db/pool]}]
(let [result (db/exec-one! pool [sql:clean-archived])
result (db/get-update-count result)]
(l/debug :hint "delete archived audit log entries" :deleted result)
result))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [_]
(clean-archived! cfg)))

View File

@@ -7,16 +7,18 @@
(ns app.loggers.database
"A specific logger impl that persists errors on the database."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.uuid :as uuid]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.loggers.zmq :as lzmq]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.exec :as px]))
[promesa.exec :as px]
[promesa.exec.csp :as sp]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Error Listener
@@ -27,73 +29,91 @@
(defonce enabled (atom true))
(defn- persist-on-database!
[{:keys [::db/pool] :as cfg} {:keys [id] :as event}]
[pool id report]
(when-not (db/read-only? pool)
(db/insert! pool :server-error-report {:id id :content (db/tjson event)})))
(db/insert! pool :server-error-report
{:id id
:version 3
:content (db/tjson report)})))
(defn- parse-event-data
[event]
(reduce-kv
(fn [acc k v]
(cond
(= k :id) (assoc acc k (uuid/uuid v))
(= k :profile-id) (assoc acc k (uuid/uuid v))
(str/blank? v) acc
:else (assoc acc k v)))
{}
event))
(defn record->report
[{:keys [::l/context ::l/message ::l/props ::l/logger ::l/level ::l/cause] :as record}]
(us/assert! ::l/record record)
(if (or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(-> record
(assoc ::trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false))
(assoc ::l/cause (ex-cause cause))
(record->report))
(defn parse-event
[event]
(-> (parse-event-data event)
(assoc :hint (or (:hint event) (:message event)))
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :version (:full cf/version))
(update :id #(or % (uuid/next)))))
(let [data (ex-data cause)
ctx (-> context
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :logger/name logger)
(assoc :logger/level level)
(dissoc :request/params :value :params :data))]
(merge
{:context (-> (into (sorted-map) ctx)
(pp/pprint-str :length 50))
:props (pp/pprint-str props :length 50)
:hint (or (ex-message cause) @message)
:trace (or (::trace record)
(ex/format-throwable cause :data? false :explain? false :header? false :summary? false))}
(when-let [params (or (:request/params context) (:params context))]
{:params (pp/pprint-str params :length 30 :level 12)})
(when-let [value (:value context)]
{:value (pp/pprint-str value :length 30 :level 12)})
(when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))]
{:data (pp/pprint-str data :length 30 :level 12)})
(when-let [explain (ex/explain data :length 30 :level 12)]
{:explain explain})))))
(defn error-record?
[{:keys [::l/level ::l/cause]}]
(and (= :error level)
(ex/exception? cause)))
(defn- handle-event
[cfg event]
[{:keys [::db/pool]} {:keys [::l/id] :as record}]
(try
(let [event (parse-event event)
uri (cf/get :public-uri)]
(let [uri (cf/get :public-uri)
report (-> record record->report d/without-nils)]
(l/debug :hint "registering error on database" :id id
:uri (str uri "/dbg/error/" id))
(l/debug :hint "registering error on database" :id (:id event)
:uri (str uri "/dbg/error/" (:id event)))
(persist-on-database! cfg event))
(persist-on-database! pool id report))
(catch Throwable cause
(l/warn :hint "unexpected exception on database error logger" :cause cause))))
(defn- error-event?
[event]
(= "error" (:logger/level event)))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req [::db/pool ::lzmq/receiver]))
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::reporter
[_ {:keys [::lzmq/receiver] :as cfg}]
(px/thread
{:name "penpot/database-reporter"}
(l/info :hint "initializing database error persistence")
[_ cfg]
(let [input (sp/chan :buf (sp/sliding-buffer 64)
:xf (filter error-record?))]
(add-watch l/log-record ::reporter #(sp/put! input %4))
(let [input (a/chan (a/sliding-buffer 5)
(filter error-event?))]
(px/thread {:name "penpot/database-reporter"}
(l/info :hint "initializing database error persistence")
(try
(lzmq/sub! receiver input)
(loop []
(when-let [msg (a/<!! input)]
(handle-event cfg msg))
(recur))
(when-let [record (sp/take! input)]
(handle-event cfg record)
(recur)))
(catch InterruptedException _
(l/debug :hint "reporter interrupted"))
(catch Throwable cause
(l/error :hint "unexpected error" :cause cause))
(finally
(a/close! input)
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated"))))))
(defmethod ig/halt-key! ::reporter

View File

@@ -1,89 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.loki
"A Loki integration."
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.http.client :as http]
[app.loggers.zmq :as lzmq]
[app.util.json :as json]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec :as px]))
(declare ^:private handle-event)
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req [::http/client
::lzmq/receiver]))
(defmethod ig/init-key ::reporter
[_ cfg]
(when-let [uri (cf/get :loggers-loki-uri)]
(px/thread
{:name "penpot/loki-reporter"}
(l/info :hint "reporter started" :uri uri)
(let [input (a/chan (a/dropping-buffer 2048))
cfg (assoc cfg ::uri uri)]
(try
(lzmq/sub! (::lzmq/receiver cfg) input)
(loop []
(when-let [msg (a/<!! input)]
(handle-event cfg msg)
(recur)))
(catch InterruptedException _
(l/debug :hint "reporter interrupted"))
(catch Throwable cause
(l/error :hint "unexpected exception"
:cause cause))
(finally
(a/close! input)
(l/info :hint "reporter terminated")))))))
(defmethod ig/halt-key! ::reporter
[_ thread]
(some-> thread px/interrupt!))
(defn- prepare-payload
[event]
(let [labels {:host (cf/get :host)
:tenant (cf/get :tenant)
:version (:full cf/version)
:logger (:logger/name event)
:level (:logger/level event)}]
{:streams
[{:stream labels
:values [[(str (* (inst-ms (:created-at event)) 1000000))
(str (:message event)
(when-let [error (:trace event)]
(str "\n" error)))]]}]}))
(defn- make-request
[{:keys [::uri] :as cfg} payload]
(http/req! cfg
{:uri uri
:timeout 3000
:method :post
:headers {"content-type" "application/json"}
:body (json/encode payload)}
{:sync? true}))
(defn- handle-event
[cfg event]
(try
(let [payload (prepare-payload event)
response (make-request cfg payload)]
(when-not (= 204 (:status response))
(l/error :hint "error on sending log to loki (unexpected response)"
:response (pr-str response))))
(catch Throwable cause
(l/error :hint "error on sending log to loki (unexpected exception)"
:cause cause))))

View File

@@ -7,24 +7,40 @@
(ns app.loggers.mattermost
"A mattermost integration for error reporting."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[app.http.client :as http]
[app.loggers.database :as ldb]
[app.loggers.zmq :as lzmq]
[app.util.json :as json]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec :as px]))
[promesa.exec :as px]
[promesa.exec.csp :as sp]))
(defonce enabled (atom true))
(defn- send-mattermost-notification!
[cfg {:keys [host id public-uri] :as event}]
(let [text (str "Exception on (host: " host ", url: " public-uri "/dbg/error/" id ")\n"
(when-let [pid (:profile-id event)]
(str "- profile-id: #uuid-" pid "\n")))
[cfg {:keys [id public-uri] :as report}]
(let [text (str "Exception: " public-uri "/dbg/error/" id " "
(when-let [pid (:profile-id report)]
(str "(pid: #uuid-" pid ")"))
"\n"
"- host: #" (:host report) "\n"
"- tenant: #" (:tenant report) "\n"
"- logger: #" (:logger report) "\n"
"- request-path: `" (:request-path report) "`\n"
"- frontend-version: `" (:frontend-version report) "`\n"
"- backend-version: `" (:backend-version report) "`\n"
"\n"
"```\n"
"Trace:\n"
(:trace report)
"```")
resp (http/req! cfg
{:uri (cf/get :error-report-webhook)
:method :post
@@ -36,32 +52,45 @@
(l/warn :hint "error on sending data"
:response (pr-str resp)))))
(defn record->report
[{:keys [::l/context ::l/id ::l/cause] :as record}]
(us/assert! ::l/record record)
{:id id
:tenant (cf/get :tenant)
:host (cf/get :host)
:public-uri (cf/get :public-uri)
:backend-version (or (:version/backend context) (:full cf/version))
:frontend-version (:version/frontend context)
:profile-id (:request/profile-id context)
:request-path (:request/path context)
:logger (::l/logger record)
:trace (ex/format-throwable cause :detail? false :header? false)})
(defn handle-event
[cfg event]
[cfg record]
(when @enabled
(try
(let [event (ldb/parse-event event)]
(send-mattermost-notification! cfg event))
(let [report (record->report record)]
(send-mattermost-notification! cfg report))
(catch Throwable cause
(l/warn :hint "unhandled error"
:cause cause)))))
(l/warn :hint "unhandled error" :cause cause)))))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req [::http/client
::lzmq/receiver]))
(s/keys :req [::http/client]))
(defmethod ig/init-key ::reporter
[_ cfg]
(when-let [uri (cf/get :error-report-webhook)]
(px/thread
{:name "penpot/mattermost-reporter"}
(l/info :msg "initializing error reporter" :uri uri)
(let [input (a/chan (a/sliding-buffer 128)
(filter #(= (:logger/level %) "error")))]
{:name "penpot/mattermost-reporter"
:virtual true}
(l/info :hint "initializing error reporter" :uri uri)
(let [input (sp/chan :buf (sp/sliding-buffer 128)
:xf (filter ldb/error-record?))]
(add-watch l/log-record ::reporter #(sp/put! input %4))
(try
(lzmq/sub! (::lzmq/receiver cfg) input)
(loop []
(when-let [msg (a/<!! input)]
(when-let [msg (sp/take! input)]
(handle-event cfg msg)
(recur)))
(catch InterruptedException _
@@ -69,7 +98,8 @@
(catch Throwable cause
(l/error :hint "unexpected error" :cause cause))
(finally
(a/close! input)
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated")))))))
(defmethod ig/halt-key! ::reporter

View File

@@ -15,9 +15,9 @@
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.util.json :as json]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.data.json :as json]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
@@ -67,12 +67,10 @@
[_ {:keys [::db/pool] :as cfg}]
(fn [{:keys [props] :as task}]
(let [event (::event props)]
(l/debug :hint "process webhook event"
:name (:name event))
(l/dbg :hint "process webhook event" :name (:name event))
(when-let [items (lookup-webhooks cfg event)]
(l/trace :hint "webhooks found for event" :total (count items))
(l/trc :hint "webhooks found for event" :total (count items))
(db/with-atomic [conn pool]
(doseq [item items]
@@ -88,11 +86,9 @@
(declare interpret-exception)
(declare interpret-response)
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(def json-write-opts
{:key-fn str/camel
:indent true})
(defmethod ig/pre-init-spec ::run-webhook-handler [_]
(s/keys :req [::http/client ::db/pool]))
@@ -111,9 +107,11 @@
" where id=?")
err
(:id whook)]
res (db/exec-one! pool sql {:return-keys true})]
res (db/exec-one! pool sql {::db/return-keys true})]
(when (>= (:error-count res) max-errors)
(db/update! pool :webhook {:is-active false} {:id (:id whook)})))
(db/update! pool :webhook
{:is-active false}
{:id (:id whook)})))
(db/update! pool :webhook
{:updated-at (dt/now)
@@ -134,15 +132,15 @@
whook (::config props)
body (case (:mtype whook)
"application/json" (json/encode-str event json-mapper)
"application/json" (json/write-str event json-write-opts)
"application/transit+json" (t/encode-str event)
"application/x-www-form-urlencoded" (uri/map->query-string event))]
(l/debug :hint "run webhook"
:event-name (:name event)
:webhook-id (:id whook)
:webhook-uri (:uri whook)
:webhook-mtype (:mtype whook))
(l/dbg :hint "run webhook"
:event-name (:name event)
:webhook-id (:id whook)
:webhook-uri (:uri whook)
:webhook-mtype (:mtype whook))
(let [req {:uri (:uri whook)
:headers {"content-type" (:mtype whook)
@@ -160,8 +158,8 @@
(report-delivery! whook req nil err)
(update-webhook! whook err)
(when (= err "unknown")
(l/error :hint "unknown error on webhook request"
:cause cause))))))))))
(l/err :hint "unknown error on webhook request"
:cause cause))))))))))
(defn interpret-response
[{:keys [status] :as response}]
@@ -182,5 +180,4 @@
"invalid-uri"
(instance? java.net.http.HttpConnectTimeoutException cause)
"timeout"
))
"timeout"))

View File

@@ -1,130 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.zmq
"A generic ZMQ listener."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.config :as cf]
[app.loggers.zmq.receiver :as-alias receiver]
[app.util.json :as json]
[app.util.time :as dt]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.exec :as px])
(:import
org.zeromq.SocketType
org.zeromq.ZMQ$Socket
org.zeromq.ZContext))
(declare prepare)
(declare start-rcv-loop)
(defmethod ig/init-key ::receiver
[_ cfg]
(let [uri (cf/get :loggers-zmq-uri)
buffer (a/chan 1)
output (a/chan 1 (comp (filter map?)
(keep prepare)))
mult (a/mult output)
thread (when uri
(px/thread
{:name "penpot/zmq-receiver"
:daemon false}
(l/info :hint "receiver started")
(try
(start-rcv-loop buffer uri)
(catch InterruptedException _
(l/debug :hint "receiver interrupted"))
(catch java.lang.IllegalStateException cause
(if (= "errno 4" (ex-message cause))
(l/debug :hint "receiver interrupted")
(l/error :hint "unhandled error" :cause cause)))
(catch Throwable cause
(l/error :hint "unhandled error" :cause cause))
(finally
(l/info :hint "receiver terminated")))))]
(a/pipe buffer output)
(-> cfg
(assoc ::receiver/mult mult)
(assoc ::receiver/thread thread)
(assoc ::receiver/output output)
(assoc ::receiver/buffer buffer))))
(s/def ::receiver/mult some?)
(s/def ::receiver/thread #(instance? Thread %))
(s/def ::receiver/output some?)
(s/def ::receiver/buffer some?)
(s/def ::receiver
(s/keys :req [::receiver/mult
::receiver/thread
::receiver/output
::receiver/buffer]))
(defn sub!
[{:keys [::receiver/mult]} ch]
(a/tap mult ch))
(defmethod ig/halt-key! ::receiver
[_ {:keys [::receiver/buffer ::receiver/thread]}]
(some-> thread px/interrupt!)
(some-> buffer a/close!))
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)}))
(defn- start-rcv-loop
[output endpoint]
(let [zctx (ZContext. 1)
socket (.. zctx (createSocket SocketType/SUB))]
(try
(.. socket (connect ^String endpoint))
(.. socket (subscribe ""))
(.. socket (setReceiveTimeOut 5000))
(loop []
(let [msg (.recv ^ZMQ$Socket socket)
msg (ex/ignoring (json/decode msg json-mapper))
msg (if (nil? msg) :empty msg)]
(when (a/>!! output msg)
(recur))))
(finally
(.close ^java.lang.AutoCloseable socket)
(.destroy ^ZContext zctx)))))
(s/def ::logger-name string?)
(s/def ::level string?)
(s/def ::thread string?)
(s/def ::time-millis integer?)
(s/def ::message string?)
(s/def ::context-map map?)
(s/def ::thrown map?)
(s/def ::log4j-event
(s/keys :req-un [::logger-name ::level ::thread ::time-millis ::message]
:opt-un [::context-map ::thrown]))
(defn- prepare
[event]
(if (s/valid? ::log4j-event event)
(merge {:message (:message event)
:created-at (dt/instant (:time-millis event))
:logger/name (:logger-name event)
:logger/level (str/lower (:level event))}
(when-let [trace (-> event :thrown :extended-stack-trace)]
{:trace trace})
(:context-map event))
(do
(l/warn :hint "invalid event" :event event)
nil)))

View File

@@ -12,21 +12,40 @@
[app.common.logging :as l]
[app.config :as cf]
[app.db :as-alias db]
[app.email :as-alias email]
[app.http :as-alias http]
[app.http.assets :as-alias http.assets]
[app.http.awsns :as http.awsns]
[app.http.client :as-alias http.client]
[app.http.session :as-alias http.session]
[app.loggers.audit :as-alias audit]
[app.loggers.audit.tasks :as-alias audit.tasks]
[app.http.debug :as-alias http.debug]
[app.http.session :as-alias session]
[app.http.session.tasks :as-alias session.tasks]
[app.http.websocket :as http.ws]
[app.loggers.webhooks :as-alias webhooks]
[app.loggers.zmq :as-alias lzmq]
[app.metrics :as-alias mtx]
[app.metrics.definition :as-alias mdef]
[app.migrations.v2 :as migrations.v2]
[app.msgbus :as-alias mbus]
[app.redis :as-alias rds]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.setup :as-alias setup]
[app.srepl :as-alias srepl]
[app.storage :as-alias sto]
[app.storage.fs :as-alias sto.fs]
[app.storage.gc-deleted :as-alias sto.gc-deleted]
[app.storage.gc-touched :as-alias sto.gc-touched]
[app.storage.s3 :as-alias sto.s3]
[app.svgo :as-alias svgo]
[app.util.time :as dt]
[app.worker :as-alias wrk]
[cider.nrepl :refer [cider-nrepl-handler]]
[clojure.test :as test]
[clojure.tools.namespace.repl :as repl]
[cuerdas.core :as str]
[integrant.core :as ig])
[integrant.core :as ig]
[nrepl.server :as nrepl]
[promesa.exec :as px])
(:gen-class))
(def default-metrics
@@ -91,15 +110,15 @@
::mdef/labels ["name"]
::mdef/type :summary}
:rpc-climit-queue-size
{::mdef/name "penpot_rpc_climit_queue_size"
::mdef/help "Current number of queued submissions on the CLIMIT."
:rpc-climit-queue
{::mdef/name "penpot_rpc_climit_queue"
::mdef/help "Current number of queued submissions."
::mdef/labels ["name"]
::mdef/type :gauge}
:rpc-climit-concurrency
{::mdef/name "penpot_rpc_climit_concurrency"
::mdef/help "Current number of used concurrency capacity on the CLIMIT"
:rpc-climit-permits
{::mdef/name "penpot_rpc_climit_permits"
::mdef/help "Current number of available permits"
::mdef/labels ["name"]
::mdef/type :gauge}
@@ -143,95 +162,76 @@
{::mdef/name "penpot_executors_running_threads"
::mdef/help "Current number of threads with state RUNNING."
::mdef/labels ["name"]
::mdef/type :gauge}
:executors-queued-submissions
{::mdef/name "penpot_executors_queued_submissions"
::mdef/help "Current number of queued submissions."
::mdef/labels ["name"]
::mdef/type :gauge}})
(def system-config
{::db/pool
{:uri (cf/get :database-uri)
:username (cf/get :database-username)
:password (cf/get :database-password)
:read-only (cf/get :database-readonly false)
:metrics (ig/ref ::mtx/metrics)
:migrations (ig/ref :app.migrations/all)
:name :main
:min-size (cf/get :database-min-pool-size 0)
:max-size (cf/get :database-max-pool-size 60)}
{::db/uri (cf/get :database-uri)
::db/username (cf/get :database-username)
::db/password (cf/get :database-password)
::db/read-only? (cf/get :database-readonly false)
::db/min-size (cf/get :database-min-pool-size 0)
::db/max-size (cf/get :database-max-pool-size 60)
::mtx/metrics (ig/ref ::mtx/metrics)}
;; Default thread pool for IO operations
::wrk/executor
{::wrk/parallelism (cf/get :default-executor-parallelism 100)}
::wrk/scheduled-executor
{::wrk/parallelism (cf/get :scheduled-executor-parallelism 20)}
{}
::wrk/monitor
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/name "default"
::wrk/executor (ig/ref ::wrk/executor)}
::wrk/executor (ig/ref ::wrk/executor)
::wrk/name "default"}
:app.migrations/migrations
{}
{::db/pool (ig/ref ::db/pool)}
::mtx/metrics
{:default default-metrics}
:app.migrations/all
{:main (ig/ref :app.migrations/migrations)}
::mtx/routes
{::mtx/metrics (ig/ref ::mtx/metrics)}
::rds/redis
{::rds/uri (cf/get :redis-uri)
::mtx/metrics (ig/ref ::mtx/metrics)}
{::rds/uri (cf/get :redis-uri)
::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
:app.msgbus/msgbus
{:backend (cf/get :msgbus-backend :redis)
:executor (ig/ref ::wrk/executor)
:redis (ig/ref ::rds/redis)}
::mbus/msgbus
{::wrk/executor (ig/ref ::wrk/executor)
::rds/redis (ig/ref ::rds/redis)}
:app.storage.tmp/cleaner
{::wrk/executor (ig/ref ::wrk/executor)
::wrk/scheduled-executor (ig/ref ::wrk/scheduled-executor)}
::sto/gc-deleted-task
{:pool (ig/ref ::db/pool)
:storage (ig/ref ::sto/storage)
:executor (ig/ref ::wrk/executor)}
::sto/gc-touched-task
{:pool (ig/ref ::db/pool)}
::http.client/client
{::wrk/executor (ig/ref ::wrk/executor)}
:app.http.session/manager
::sto.gc-deleted/handler
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::props (ig/ref :app.setup/props)}
::sto/storage (ig/ref ::sto/storage)}
:app.http.session/gc-task
{:pool (ig/ref ::db/pool)
:max-age (cf/get :auth-token-cookie-max-age)}
::sto.gc-touched/handler
{::db/pool (ig/ref ::db/pool)}
:app.http.awsns/handler
{::props (ig/ref :app.setup/props)
::http.client/client
{}
::session/manager
{::db/pool (ig/ref ::db/pool)}
::session.tasks/gc
{::db/pool (ig/ref ::db/pool)}
::http.awsns/routes
{::setup/props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
::wrk/executor (ig/ref ::wrk/executor)}
::http.client/client (ig/ref ::http.client/client)}
:app.http/server
{:port (cf/get :http-server-port)
:host (cf/get :http-server-host)
:router (ig/ref :app.http/router)
:metrics (ig/ref ::mtx/metrics)
:executor (ig/ref ::wrk/executor)
:io-threads (cf/get :http-server-io-threads)
:max-body-size (cf/get :http-server-max-body-size)
:max-multipart-body-size (cf/get :http-server-max-multipart-body-size)}
::http/server
{::http/port (cf/get :http-server-port)
::http/host (cf/get :http-server-host)
::http/router (ig/ref ::http/router)
::http/io-threads (cf/get :http-server-io-threads)
::http/max-body-size (cf/get :http-server-max-body-size)
::http/max-multipart-body-size (cf/get :http-server-max-multipart-body-size)}
::ldap/provider
{:host (cf/get :ldap-host)
@@ -260,180 +260,163 @@
{::http.client/client (ig/ref ::http.client/client)}
::oidc/routes
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::props (ig/ref :app.setup/props)
::wrk/executor (ig/ref ::wrk/executor)
::oidc/providers {:google (ig/ref ::oidc.providers/google)
:github (ig/ref ::oidc.providers/github)
:gitlab (ig/ref ::oidc.providers/gitlab)
:oidc (ig/ref ::oidc.providers/generic)}
::audit/collector (ig/ref ::audit/collector)
::http.session/session (ig/ref :app.http.session/manager)}
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::setup/props (ig/ref ::setup/props)
::oidc/providers {:google (ig/ref ::oidc.providers/google)
:github (ig/ref ::oidc.providers/github)
:gitlab (ig/ref ::oidc.providers/gitlab)
:oidc (ig/ref ::oidc.providers/generic)}
::session/manager (ig/ref ::session/manager)}
;; TODO: revisit the dependencies of this service, looks they are too much unused of them
:app.http/router
{:assets (ig/ref :app.http.assets/handlers)
:feedback (ig/ref :app.http.feedback/handler)
:session (ig/ref :app.http.session/manager)
:awsns-handler (ig/ref :app.http.awsns/handler)
:debug-routes (ig/ref :app.http.debug/routes)
:oidc-routes (ig/ref ::oidc/routes)
:ws (ig/ref :app.http.websocket/handler)
:metrics (ig/ref ::mtx/metrics)
:public-uri (cf/get :public-uri)
:storage (ig/ref ::sto/storage)
:rpc-routes (ig/ref :app.rpc/routes)
:doc-routes (ig/ref :app.rpc.doc/routes)
:executor (ig/ref ::wrk/executor)}
{::session/manager (ig/ref ::session/manager)
::db/pool (ig/ref ::db/pool)
::rpc/routes (ig/ref ::rpc/routes)
::rpc.doc/routes (ig/ref ::rpc.doc/routes)
::setup/props (ig/ref ::setup/props)
::mtx/routes (ig/ref ::mtx/routes)
::oidc/routes (ig/ref ::oidc/routes)
::http.debug/routes (ig/ref ::http.debug/routes)
::http.assets/routes (ig/ref ::http.assets/routes)
::http.ws/routes (ig/ref ::http.ws/routes)
::http.awsns/routes (ig/ref ::http.awsns/routes)}
:app.http.debug/routes
{:pool (ig/ref ::db/pool)
:executor (ig/ref ::wrk/executor)
:storage (ig/ref ::sto/storage)
:session (ig/ref :app.http.session/manager)
::http.debug/routes
{::db/pool (ig/ref ::db/pool)
::session/manager (ig/ref ::session/manager)
::sto/storage (ig/ref ::sto/storage)
::setup/props (ig/ref ::setup/props)}
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::http.ws/routes
{::db/pool (ig/ref ::db/pool)
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::session/manager (ig/ref ::session/manager)}
:app.http.assets/routes
{::http.assets/path (cf/get :assets-path)
::http.assets/cache-max-age (dt/duration {:hours 24})
::http.assets/cache-max-agesignature-max-age (dt/duration {:hours 24 :minutes 5})
::sto/storage (ig/ref ::sto/storage)}
:app.http.websocket/handler
{:pool (ig/ref ::db/pool)
:metrics (ig/ref ::mtx/metrics)
:msgbus (ig/ref :app.msgbus/msgbus)}
:app.http.assets/handlers
{:metrics (ig/ref ::mtx/metrics)
:assets-path (cf/get :assets-path)
:storage (ig/ref ::sto/storage)
:executor (ig/ref ::wrk/executor)
:cache-max-age (dt/duration {:hours 24})
:signature-max-age (dt/duration {:hours 24 :minutes 5})}
:app.http.feedback/handler
{:pool (ig/ref ::db/pool)
:executor (ig/ref ::wrk/executor)}
:app.rpc/climit
{:metrics (ig/ref ::mtx/metrics)
:executor (ig/ref ::wrk/executor)}
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
:app.rpc/rlimit
{:executor (ig/ref ::wrk/executor)
:scheduled-executor (ig/ref ::wrk/scheduled-executor)}
{::wrk/executor (ig/ref ::wrk/executor)}
:app.rpc/methods
{::audit/collector (ig/ref ::audit/collector)
::http.client/client (ig/ref ::http.client/client)
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::props (ig/ref :app.setup/props)
::session/manager (ig/ref ::session/manager)
::ldap/provider (ig/ref ::ldap/provider)
:pool (ig/ref ::db/pool)
:session (ig/ref :app.http.session/manager)
:sprops (ig/ref :app.setup/props)
:metrics (ig/ref ::mtx/metrics)
:storage (ig/ref ::sto/storage)
:msgbus (ig/ref :app.msgbus/msgbus)
:public-uri (cf/get :public-uri)
:redis (ig/ref ::rds/redis)
:http-client (ig/ref ::http.client/client)
:climit (ig/ref :app.rpc/climit)
:rlimit (ig/ref :app.rpc/rlimit)
:executor (ig/ref ::wrk/executor)
:templates (ig/ref :app.setup/builtin-templates)
}
::sto/storage (ig/ref ::sto/storage)
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::rds/redis (ig/ref ::rds/redis)
::svgo/optimizer (ig/ref ::svgo/optimizer)
::rpc/climit (ig/ref ::rpc/climit)
::rpc/rlimit (ig/ref ::rpc/rlimit)
::setup/templates (ig/ref ::setup/templates)
::setup/props (ig/ref ::setup/props)}
:app.rpc.doc/routes
{:methods (ig/ref :app.rpc/methods)}
:app.rpc/routes
{:methods (ig/ref :app.rpc/methods)}
{::rpc/methods (ig/ref :app.rpc/methods)
::db/pool (ig/ref ::db/pool)
::session/manager (ig/ref ::session/manager)
::setup/props (ig/ref ::setup/props)}
::wrk/registry
{:metrics (ig/ref ::mtx/metrics)
:tasks
{:sendmail (ig/ref :app.emails/handler)
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/tasks
{:sendmail (ig/ref ::email/handler)
:objects-gc (ig/ref :app.tasks.objects-gc/handler)
:orphan-teams-gc (ig/ref :app.tasks.orphan-teams-gc/handler)
:file-gc (ig/ref :app.tasks.file-gc/handler)
:file-xlog-gc (ig/ref :app.tasks.file-xlog-gc/handler)
:storage-gc-deleted (ig/ref ::sto/gc-deleted-task)
:storage-gc-touched (ig/ref ::sto/gc-touched-task)
:tasks-gc (ig/ref :app.tasks.tasks-gc/handler)
:telemetry (ig/ref :app.tasks.telemetry/handler)
:session-gc (ig/ref :app.http.session/gc-task)
:audit-log-archive (ig/ref ::audit.tasks/archive)
:audit-log-gc (ig/ref ::audit.tasks/gc)
:storage-gc-deleted (ig/ref ::sto.gc-deleted/handler)
:storage-gc-touched (ig/ref ::sto.gc-touched/handler)
:session-gc (ig/ref ::session.tasks/gc)
:audit-log-archive (ig/ref :app.loggers.audit.archive-task/handler)
:audit-log-gc (ig/ref :app.loggers.audit.gc-task/handler)
:process-webhook-event
(ig/ref ::webhooks/process-event-handler)
:run-webhook
(ig/ref ::webhooks/run-webhook-handler)}}
::email/sendmail
{::email/host (cf/get :smtp-host)
::email/port (cf/get :smtp-port)
::email/ssl (cf/get :smtp-ssl)
::email/tls (cf/get :smtp-tls)
::email/username (cf/get :smtp-username)
::email/password (cf/get :smtp-password)
::email/default-reply-to (cf/get :smtp-default-reply-to)
::email/default-from (cf/get :smtp-default-from)}
:app.emails/sendmail
{:host (cf/get :smtp-host)
:port (cf/get :smtp-port)
:ssl (cf/get :smtp-ssl)
:tls (cf/get :smtp-tls)
:username (cf/get :smtp-username)
:password (cf/get :smtp-password)
:default-reply-to (cf/get :smtp-default-reply-to)
:default-from (cf/get :smtp-default-from)}
:app.emails/handler
{:sendmail (ig/ref :app.emails/sendmail)
:metrics (ig/ref ::mtx/metrics)}
::email/handler
{::email/sendmail (ig/ref ::email/sendmail)
::mtx/metrics (ig/ref ::mtx/metrics)}
:app.tasks.tasks-gc/handler
{:pool (ig/ref ::db/pool)
:max-age cf/deletion-delay}
{::db/pool (ig/ref ::db/pool)}
:app.tasks.objects-gc/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.orphan-teams-gc/handler
{::db/pool (ig/ref ::db/pool)}
:app.tasks.file-gc/handler
{:pool (ig/ref ::db/pool)}
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-xlog-gc/handler
{:pool (ig/ref ::db/pool)}
{::db/pool (ig/ref ::db/pool)}
:app.tasks.telemetry/handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
::props (ig/ref :app.setup/props)}
::setup/props (ig/ref ::setup/props)}
[::srepl/urepl ::srepl/server]
{:port (cf/get :urepl-port 6062)
:host (cf/get :urepl-host "localhost")}
{::srepl/port (cf/get :urepl-port 6062)
::srepl/host (cf/get :urepl-host "localhost")}
[::srepl/prepl ::srepl/server]
{:port (cf/get :prepl-port 6063)
:host (cf/get :prepl-host "localhost")}
{::srepl/port (cf/get :prepl-port 6063)
::srepl/host (cf/get :prepl-host "localhost")}
:app.setup/builtin-templates
{::http.client/client (ig/ref ::http.client/client)}
::setup/templates {}
:app.setup/props
{:pool (ig/ref ::db/pool)
:key (cf/get :secret-key)}
::setup/props
{::db/pool (ig/ref ::db/pool)
::setup/key (cf/get :secret-key)
::lzmq/receiver
;; NOTE: this dependency is only necessary for proper initialization ordering, props
;; module requires the migrations to run before initialize.
::migrations (ig/ref :app.migrations/migrations)}
::svgo/optimizer
{}
::audit/collector
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::mtx/metrics (ig/ref ::mtx/metrics)}
::audit.tasks/archive
{::props (ig/ref :app.setup/props)
:app.loggers.audit.archive-task/handler
{::setup/props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
::audit.tasks/gc
:app.loggers.audit.gc-task/handler
{::db/pool (ig/ref ::db/pool)}
::webhooks/process-event-handler
@@ -444,45 +427,31 @@
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.loki/reporter
{::lzmq/receiver (ig/ref ::lzmq/receiver)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.mattermost/reporter
{::lzmq/receiver (ig/ref ::lzmq/receiver)
::http.client/client (ig/ref ::http.client/client)}
{::http.client/client (ig/ref ::http.client/client)}
:app.loggers.database/reporter
{::lzmq/receiver (ig/ref :app.loggers.zmq/receiver)
::db/pool (ig/ref ::db/pool)}
{::db/pool (ig/ref ::db/pool)}
::sto/storage
{:pool (ig/ref ::db/pool)
:executor (ig/ref ::wrk/executor)
:backends
{::db/pool (ig/ref ::db/pool)
::sto/backends
{:assets-s3 (ig/ref [::assets :app.storage.s3/backend])
:assets-fs (ig/ref [::assets :app.storage.fs/backend])
;; keep this for backward compatibility
:s3 (ig/ref [::assets :app.storage.s3/backend])
:fs (ig/ref [::assets :app.storage.fs/backend])}}
:assets-fs (ig/ref [::assets :app.storage.fs/backend])}}
[::assets :app.storage.s3/backend]
{:region (cf/get :storage-assets-s3-region)
:endpoint (cf/get :storage-assets-s3-endpoint)
:bucket (cf/get :storage-assets-s3-bucket)
:executor (ig/ref ::wrk/executor)}
{::sto.s3/region (cf/get :storage-assets-s3-region)
::sto.s3/endpoint (cf/get :storage-assets-s3-endpoint)
::sto.s3/bucket (cf/get :storage-assets-s3-bucket)
::sto.s3/io-threads (cf/get :storage-assets-s3-io-threads)}
[::assets :app.storage.fs/backend]
{:directory (cf/get :storage-assets-fs-directory)}
})
{::sto.fs/directory (cf/get :storage-assets-fs-directory)}})
(def worker-config
{::wrk/cron
{::wrk/scheduled-executor (ig/ref ::wrk/scheduled-executor)
::wrk/registry (ig/ref ::wrk/registry)
{::wrk/registry (ig/ref ::wrk/registry)
::db/pool (ig/ref ::db/pool)
::wrk/entries
[{:cron #app/cron "0 0 * * * ?" ;; hourly
@@ -494,6 +463,9 @@
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :objects-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :orphan-teams-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-deleted}
@@ -522,7 +494,7 @@
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::default ::wrk/worker]
[::default ::wrk/runner]
{::wrk/parallelism (cf/get ::worker-default-parallelism 1)
::wrk/queue :default
::rds/redis (ig/ref ::rds/redis)
@@ -530,7 +502,7 @@
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::webhook ::wrk/worker]
[::webhook ::wrk/runner]
{::wrk/parallelism (cf/get ::worker-webhook-parallelism 1)
::wrk/queue :webhooks
::rds/redis (ig/ref ::rds/redis)
@@ -551,22 +523,79 @@
(merge worker-config))
(ig/prep)
(ig/init))))
(l/info :hint "welcome to penpot"
:flags (str/join "," (map name cf/flags))
:worker? (contains? cf/flags :backend-worker)
:version (:full cf/version)))
(l/inf :hint "welcome to penpot"
:flags (str/join "," (map name cf/flags))
:worker? (contains? cf/flags :backend-worker)
:version (:full cf/version)))
(defn start-custom
[config]
(ig/load-namespaces config)
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> config
(ig/prep)
(ig/init)))))
(defn stop
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
nil)))
(defn restart
[]
(stop)
(repl/refresh :after 'app.main/start))
(defn restart-all
[]
(stop)
(repl/refresh-all :after 'app.main/start))
(defmacro run-bench
[& exprs]
`(do
(require 'criterium.core)
(criterium.core/with-progress-reporting (crit/quick-bench (do ~@exprs) :verbose))))
(defn run-tests
([] (run-tests #"^backend-tests.*-test$"))
([o]
(repl/refresh)
(cond
(instance? java.util.regex.Pattern o)
(test/run-all-tests o)
(symbol? o)
(if-let [sns (namespace o)]
(do (require (symbol sns))
(test/test-vars [(resolve o)]))
(test/test-ns o)))))
(repl/disable-reload! (find-ns 'integrant.core))
(defn -main
[& _args]
(try
(start)
(let [p (promise)]
(when (contains? cf/flags :nrepl-server)
(l/inf :hint "start nrepl server" :port 6064)
(nrepl/start-server :bind "0.0.0.0" :port 6064 :handler cider-nrepl-handler))
(start)
(when (contains? cf/flags :v2-migration)
(px/sleep 5000)
(migrations.v2/migrate app.main/system))
(deref p))
(catch Throwable cause
(l/error :hint (ex-message cause)
:cause cause)
(binding [*out* *err*]
(println "==== ERROR ===="))
(.printStackTrace cause)
(when-let [cause' (ex-cause cause)]
(binding [*out* *err*]
(println "==== CAUSE ===="))
(.printStackTrace cause'))
(px/sleep 500)
(System/exit -1))))

View File

@@ -10,10 +10,16 @@
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.media :as cm]
[app.common.schema :as sm]
[app.common.schema.generators :as sg]
[app.common.schema.openapi :as-alias oapi]
[app.common.spec :as us]
[app.common.svg :as csvg]
[app.config :as cf]
[app.db :as-alias db]
[app.storage :as-alias sto]
[app.storage.tmp :as tmp]
[app.util.svg :as svg]
[app.util.time :as dt]
[buddy.core.bytes :as bb]
[buddy.core.codecs :as bc]
[clojure.java.shell :as sh]
@@ -41,6 +47,27 @@
(s/keys :req-un [::path]
:opt-un [::mtype]))
(sm/def! ::fs/path
{:type ::fs/path
:pred fs/path?
:type-properties
{:title "path"
:description "filesystem path"
:error/message "expected a valid fs path instance"
:gen/gen (sg/generator :string)
::oapi/type "string"
::oapi/format "unix-path"
::oapi/decode fs/path}})
(sm/def! ::upload
[:map {:title "Upload"}
[:filename :string]
[:size :int]
[:path ::fs/path]
[:mtype {:optional true} :string]
[:headers {:optional true}
[:map-of :string :string]]])
(defn validate-media-type!
([upload] (validate-media-type! upload cm/valid-image-types))
([upload allowed]
@@ -51,6 +78,17 @@
upload))
(defn validate-media-size!
[upload]
(let [max-size (cf/get :media-max-file-size)]
(when (> (:size upload) max-size)
(ex/raise :type :restriction
:code :media-max-file-size-reached
:hint (str/ffmt "the uploaded file size % is greater than the maximum %"
(:size upload)
max-size)))
upload))
(defmulti process :cmd)
(defmulti process-error class)
@@ -161,12 +199,12 @@
(us/assert ::input input)
(let [{:keys [path mtype]} input]
(if (= mtype "image/svg+xml")
(let [info (some-> path slurp svg/pre-process svg/parse get-basic-info-from-svg)]
(let [info (some-> path slurp csvg/parse get-basic-info-from-svg)]
(when-not info
(ex/raise :type :validation
:code :invalid-svg-file
:hint "uploaded svg does not provides dimensions"))
(merge input info))
(merge input info {:ts (dt/now)}))
(let [instance (Info. (str path))
mtype' (.getProperty instance "Mime type")]
@@ -181,7 +219,8 @@
;; any frame.
(assoc input
:width (.getPageWidth instance)
:height (.getPageHeight instance))))))
:height (.getPageHeight instance)
:ts (dt/now))))))
(defmethod process-error org.im4java.core.InfoException
[error]
@@ -297,8 +336,7 @@
"Given storage map, returns a storage configured with the appropriate
backend for assets and optional connection attached."
([storage]
(assoc storage :backend (cf/get :assets-storage-backend :assets-fs)))
([storage conn]
(-> storage
(assoc :conn conn)
(assoc :backend (cf/get :assets-storage-backend :assets-fs)))))
(assoc storage ::sto/backend (cf/get :assets-storage-backend :assets-fs)))
([storage pool-or-conn]
(-> (configure-assets-storage storage)
(assoc ::db/pool-or-conn pool-or-conn))))

View File

@@ -87,13 +87,26 @@
::definitions definitions
::registry registry}))
(defn- handler
[registry _ respond _]
[registry _]
(let [samples (.metricFamilySamples ^CollectorRegistry registry)
writer (StringWriter.)]
(TextFormat/write004 writer samples)
(respond {:headers {"content-type" TextFormat/CONTENT_TYPE_004}
:body (.toString writer)})))
{:headers {"content-type" TextFormat/CONTENT_TYPE_004}
:body (.toString writer)}))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::metrics]))
(defmethod ig/init-key ::routes
[_ {:keys [::metrics]}]
(let [registry (::registry metrics)]
["/metrics" {:handler (partial handler registry)
:allowed-methods #{:get}}]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation

View File

@@ -6,8 +6,12 @@
(ns app.migrations
(:require
[app.common.data.macros :as dm]
[app.common.logging :as l]
[app.db :as db]
[app.migrations.clj.migration-0023 :as mg0023]
[app.util.migrations :as mg]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(def migrations
@@ -302,7 +306,93 @@
{:name "0098-add-quotes-table"
:fn (mg/resource "app/migrations/sql/0098-add-quotes-table.sql")}
])
{:name "0099-add-access-token-table"
:fn (mg/resource "app/migrations/sql/0099-add-access-token-table.sql")}
{:name "0100-mod-profile-indexes"
:fn (mg/resource "app/migrations/sql/0100-mod-profile-indexes.sql")}
(defmethod ig/init-key ::migrations [_ _] migrations)
{:name "0101-mod-server-error-report-table"
:fn (mg/resource "app/migrations/sql/0101-mod-server-error-report-table.sql")}
{:name "0102-mod-access-token-table"
:fn (mg/resource "app/migrations/sql/0102-mod-access-token-table.sql")}
{:name "0103-mod-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0103-mod-file-object-thumbnail-table.sql")}
{:name "0104-mod-file-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0104-mod-file-thumbnail-table.sql")}
{:name "0105-mod-file-change-table"
:fn (mg/resource "app/migrations/sql/0105-mod-file-change-table.sql")}
{:name "0105-mod-server-error-report-table"
:fn (mg/resource "app/migrations/sql/0105-mod-server-error-report-table.sql")}
{:name "0106-add-file-tagged-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0106-add-file-tagged-object-thumbnail-table.sql")}
{:name "0106-mod-team-table"
:fn (mg/resource "app/migrations/sql/0106-mod-team-table.sql")}
{:name "0107-mod-file-tagged-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0107-mod-file-tagged-object-thumbnail-table.sql")}
{:name "0107-add-deletion-protection-trigger-function"
:fn (mg/resource "app/migrations/sql/0107-add-deletion-protection-trigger-function.sql")}
{:name "0108-mod-file-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0108-mod-file-thumbnail-table.sql")}
{:name "0109-mod-file-tagged-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0109-mod-file-tagged-object-thumbnail-table.sql")}
{:name "0110-mod-file-media-object-table"
:fn (mg/resource "app/migrations/sql/0110-mod-file-media-object-table.sql")}
{:name "0111-mod-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0111-mod-file-data-fragment-table.sql")}
{:name "0112-mod-profile-table"
:fn (mg/resource "app/migrations/sql/0112-mod-profile-table.sql")}
{:name "0113-mod-team-font-variant-table"
:fn (mg/resource "app/migrations/sql/0113-mod-team-font-variant-table.sql")}
{:name "0114-mod-team-table"
:fn (mg/resource "app/migrations/sql/0114-mod-team-table.sql")}
{:name "0115-mod-project-table"
:fn (mg/resource "app/migrations/sql/0115-mod-project-table.sql")}
{:name "0116-mod-file-table"
:fn (mg/resource "app/migrations/sql/0116-mod-file-table.sql")}
{:name "0117-mod-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0117-mod-file-object-thumbnail-table.sql")}
{:name "0118-mod-task-table"
:fn (mg/resource "app/migrations/sql/0118-mod-task-table.sql")}
{:name "0119-mod-file-table"
:fn (mg/resource "app/migrations/sql/0119-mod-file-table.sql")}
{:name "0120-mod-audit-log-table"
:fn (mg/resource "app/migrations/sql/0120-mod-audit-log-table.sql")}])
(defn apply-migrations!
[pool name migrations]
(dm/with-open [conn (db/open pool)]
(mg/setup! conn)
(mg/migrate! conn {:name name :steps migrations})))
(defmethod ig/pre-init-spec ::migrations
[_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::migrations
[module {:keys [::db/pool]}]
(when-not (db/read-only? pool)
(l/info :hint "running migrations" :module module)
(some->> (seq migrations) (apply-migrations! pool "main"))))

View File

@@ -0,0 +1,19 @@
DROP TABLE IF EXISTS access_token;
CREATE TABLE access_token (
id uuid NOT NULL DEFAULT uuid_generate_v4() PRIMARY KEY,
profile_id uuid NOT NULL REFERENCES profile(id) ON DELETE CASCADE DEFERRABLE,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
name text NOT NULL,
token text NOT NULL,
perms text[] NULL
);
ALTER TABLE access_token
ALTER COLUMN name SET STORAGE external,
ALTER COLUMN token SET STORAGE external,
ALTER COLUMN perms SET STORAGE external;
CREATE INDEX access_token__profile_id__idx ON access_token(profile_id);

View File

@@ -0,0 +1,31 @@
ALTER TABLE profile
ADD COLUMN default_project_id uuid NULL REFERENCES project(id) ON DELETE SET NULL DEFERRABLE,
ADD COLUMN default_team_id uuid NULL REFERENCES team(id) ON DELETE SET NULL DEFERRABLE;
CREATE INDEX profile__default_project__idx ON profile(default_project_id);
CREATE INDEX profile__default_team__idx ON profile(default_team_id);
with profiles as (
select p.id,
tpr.team_id as default_team_id,
ppr.project_id as default_project_id
from profile as p
join team_profile_rel as tpr
on (tpr.profile_id = p.id and
tpr.is_owner is true)
join project_profile_rel as ppr
on (ppr.profile_id = p.id and
ppr.is_owner is true)
join project as pj
on (pj.id = ppr.project_id)
join team as tm
on (tm.id = tpr.team_id)
where pj.is_default is true
and tm.is_default is true
and pj.team_id = tm.id
)
update profile
set default_team_id = p.default_team_id,
default_project_id = p.default_project_id
from profiles as p
where profile.id = p.id;

View File

@@ -0,0 +1,2 @@
ALTER TABLE server_error_report
ADD COLUMN version integer DEFAULT 1;

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