Compare commits

...
Author SHA1 Message Date
Andrés Moya adc6af129c wip 2023-06-22 11:32:31 +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
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 d4fe810813 🐛 Fix shared link broken 2023-06-22 08:01:15 +02:00
Alejandro Alonso 64ddfa0c31 📎 Update CHANGES.md file 2023-06-21 17:06:29 +02:00
Andrés Moya e8dde477a5 🐛 Fix restore remote component 2023-06-21 17:04:46 +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 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 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 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
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
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
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
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
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
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
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 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 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
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 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 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
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
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
Alejandro Alonso 45fc55dee9 Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 12:24:52 +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 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 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 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
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
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 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 d31138db72 Merge pull request #2868 from penpot/alotor-fix-layout-problems
Fix layout problems
2023-01-31 12:19:20 +01:00
Alejandro Alonso 2c5f35e192 🐛 Fix penpot.app urls 2023-01-31 12:10:06 +01:00
Alejandro Alonso 5a8f8ba349 🐛 Fix create team and invite 2023-01-31 12:09:13 +01:00
alonso.torres 3fe5cd3752 🐛 Fix problem when resizing layout to zero size 2023-01-31 12:07:17 +01:00
alonso.torres da60911d81 🐛 Create new layouts without clip content 2023-01-31 12:03:23 +01:00
Alejandro Alonso a905f49721 Merge remote-tracking branch 'origin/staging' into develop 2023-01-31 10:29:41 +01:00
Alejandro f4f1f80050 Merge pull request #2864 from penpot/alotor-fix-hug-compacting
🐛 Fix problem with size 100% and auto parent
2023-01-31 10:29:06 +01:00
alonso.torres 18445ea5f4 🐛 Fix problem with size 100% and auto parent 2023-01-31 09:40:01 +01:00
Alejandro 2d28e02742 Merge pull request #2865 from penpot/superalex-fix-onboarding-poll
🐛 Fix onboarding poll
2023-01-31 09:30:32 +01:00
Alejandro Alonso b0b963fb7c 🐛 Fix onboarding poll 2023-01-31 09:24:50 +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 5cfee13956 🐛 Remove beta word 2023-01-30 17:35:18 +01:00
Alejandro Alonso 11db7590eb Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 15:39:17 +01:00
Alejandro 7271e98df3 Merge pull request #2862 from penpot/niwinz-multipart-encodign-bugfix
⬆️ Update yetti to v9.12
2023-01-30 15:38:44 +01:00
Andrey Antukh f0386ef7b0 ⬆️ Update yetti to v9.12
Fixes encoding bug on multipart uploads
2023-01-30 15:29:53 +01:00
Alejandro 185cabb2fa Merge pull request #2861 from penpot/alotor-regenerate-empty-thumbnails
🐛 Try to refresh thumbnails on empty stored data in back
2023-01-30 14:05:57 +01:00
alonso.torres 3a19223264 🐛 Try to refresh thumbnails on empty stored data in back 2023-01-30 13:45:56 +01:00
Alejandro Alonso 2c38f31aa9 🐛 Fix clean archived auditlog 2023-01-30 13:11:50 +01:00
Andrés Moya e1d1ecbc24 Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 12:47:20 +01:00
Alejandro a1dcb11261 Merge pull request #2860 from penpot/palba-fix-paste-texts-typos
🐛 Fix copy paste texts with typography assets linked
2023-01-30 12:32:32 +01:00
Pablo Alba 9f8d86a80e 🐛 Fix copy paste texts with typography assets linked 2023-01-30 12:26:31 +01:00
Alejandro Alonso c59fc87fc4 🐛 Fix styling info at the libraries modal 2023-01-30 12:22:50 +01:00
Alejandro Alonso 3421e6ef57 🐛 Fix viewer misalignment when expanding code tab 2023-01-30 11:54:18 +01:00
Alejandro Alonso 40349c8ece 🐛 Fix line-height inconsistent 2023-01-30 11:44:20 +01:00
Alejandro 5a53376b01 Merge pull request #2859 from penpot/alotor-fix-code-generator-hangs
🐛 Fix problem with code view hanging
2023-01-30 11:18:55 +01:00
Alejandro d4dfdaff57 Merge pull request #2854 from penpot/palba-fix-incorrect-state-after-undo-page-creation
🐛 Fix incorrect state after undo page creation
2023-01-30 11:14:17 +01:00
Pablo Alba c7f87d0f26 🐛 Fix incorrect state after undo page creation 2023-01-30 11:13:59 +01:00
alonso.torres c7954990f0 🐛 Fix problem with code view hanging 2023-01-30 11:13:05 +01:00
Alejandro fe118819ce Merge pull request #2858 from penpot/info-release-1.17
Info release 1.17
2023-01-30 10:42:39 +01:00
Alejandro 073ec9ea2b Merge pull request #2856 from penpot/alotor-fix-transform-precision
🐛 Fix problem with transform when a coordinate was very close to …
2023-01-30 09:57:50 +01:00
Alejandro f85a731969 Merge pull request #2855 from penpot/alotor-migration-fix-frame-id
🐛 Add migration to fix problem with frame-id
2023-01-30 09:39:18 +01:00
Alejandro a3a88d7a0a Merge pull request #2850 from penpot/alotor-fix-frame-overlay
🐛 Fix frame overlays in workspace
2023-01-30 07:19:08 +01:00
Alejandro 1660dd634e Merge pull request #2857 from penpot/palba-fix-resend-invitation-doesnt-reset-expiration
🐛 Fix resend invitation doesn't reset the expiration date
2023-01-30 06:55:47 +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
Pablo Alba 6e698110d6 🐛 Fix resend invitation doesn't reset the expiration date 2023-01-27 16:56:19 +01:00
alonso.torres 951c67a2d5 🐛 Fix problem with transform when a coordinate was very close to zero 2023-01-27 16:09:44 +01:00
Alejandro 50b7337b8c Merge pull request #2852 from penpot/eva-bugfixing-4
Eva bugfixing 4
2023-01-27 15:07:20 +01:00
Eva 15e62ff649 🐛 Remove copy all button in fills and strokes 2023-01-27 14:58:53 +01:00
Eva e7ddd6055f ♻️ Improve a case 2023-01-27 14:53:32 +01:00
Eva aa3438f800 ♻️ Improve some functions 2023-01-27 14:53:31 +01:00
Eva a45380a91c 🐛 Fix typo 2023-01-27 14:53:08 +01:00
alonso.torres 86b68aeca4 🐛 Add migration to fix problem with frame-id 2023-01-27 14:43:55 +01:00
alonso.torres d69d392362 🐛 Fix duplicate frames 2023-01-27 13:41:20 +01:00
Andrés Moya 506c2b8d7b 🔧 Add script to rename some layout attrs in existing files 2023-01-27 13:11:46 +01:00
Eva b463ebc17b 🐛 Fix layout spec with proper names 2023-01-27 13:11:46 +01:00
alonso.torres f90fda2c90 🐛 Fix frame overlays in workspace 2023-01-27 11:26:35 +01:00
Eva Marco 87c5aa71a3 Merge pull request #2847 from penpot/superalex-text-weight-inspect-code
🐛 Fix text weight on inspect code
2023-01-27 10:09:11 +01:00
Alejandro Alonso 4f82f6bde4 🐛 Fix text weight on inspect code 2023-01-27 10:00:54 +01:00
Alejandro 545b3860b4 Merge pull request #2844 from penpot/alotor-fix-transparent-thumbnails
🐛 Fix problem with transparent frame thumbnails
2023-01-27 09:29:26 +01:00
alonso.torres d4921c8eb9 🐛 Fix problem with transparent frame thumbnails 2023-01-27 09:27:18 +01:00
Alejandro Alonso 18652d0b6f 🐛 Fix outline corner radius 2023-01-27 09:26:10 +01:00
Alejandro Alonso 2dbeda1d8f 🐛 Fix outline corner radius 2023-01-27 09:14:11 +01:00
elhombretecla 9422d1e9e2 Fix wording 2023-01-27 07:45:31 +01:00
Alejandro e0441bc16a Merge pull request #2845 from penpot/palba-text-shortcuts-multi-layer
 Apply text format shortcuts to several layers
2023-01-27 07:03:11 +01:00
Pablo Alba d7d6166232 Apply text format shortcuts to several layers (even inside groups) 2023-01-26 18:46:16 +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
Alejandro 6fd6205634 Merge pull request #2841 from penpot/alotor-polishing-11
Polishing
2023-01-26 16:27:05 +01:00
Eva 7cd6f5ba70 🐛 User icons are not centered 2023-01-26 15:56:21 +01:00
Eva 9cc3cceb06 💄 Change layout flex by flex layout text 2023-01-26 15:56:21 +01:00
Eva 6f6bcd2f7e 💄 Improve warning message css in fonts 2023-01-26 15:56:21 +01:00
Alejandro Alonso f9f3b3951f 🐛 Fix external borders not considered for thumbnails 2023-01-26 15:43:11 +01:00
Andrés Moya 22ded62000 🐛 Fix paths not flagged as modified when resized 2023-01-26 15:29:20 +01:00
Alejandro Alonso 71d104f768 🐛 Fix fills and strokes on inspect code 2023-01-26 15:18:26 +01:00
alonso.torres 5a36cbceb7 Enter to select children allow for multiselection 2023-01-26 14:27:14 +01:00
Pablo Alba f2033c46f3 🐛 Fix ctrl+z shows zoom icon 2023-01-26 14:07:21 +01:00
alonso.torres 6b225a10b5 🐛 Fix problem with align and flex layout 2023-01-26 13:44:40 +01:00
alonso.torres 38fe6e856a 🐛 Fix problems with content between/around and auto-width 2023-01-26 12:55:40 +01:00
alonso.torres 1984109436 🐛 Fix problem with change frame groups 2023-01-26 12:55:40 +01:00
alonso.torres 9f9d9277a6 🐛 Fix problem with space-around and auto-width/height 2023-01-26 12:55:40 +01:00
alonso.torres e041f93680 🐛 Fix space-between preserves gap distances 2023-01-26 12:55:40 +01:00
alonso.torres 2d779a4414 🐛 Fix problem with empty text rendering 2023-01-26 12:55:40 +01:00
Alejandro 21fc9289a6 Merge pull request #2835 from penpot/palba-fix-multiplayer-shadow
🐛 Fix multiuser - "Shadow" element is not updating immediately
2023-01-26 07:33:47 +01:00
Pablo Alba b40ea3fb2a 🐛 Fix multiuser - "Shadow" element is not updating immediately 2023-01-25 17:48:40 +01:00
Pablo Alba 444e9a3081 Merge pull request #2833 from penpot/hiru-fix-unwanted-popup
🐛 Fix unneeded popup when updating local components
2023-01-25 16:51:29 +01:00
Andrés Moya f93d305545 🐛 Fix unneeded popup when updating local components 2023-01-25 16:50:41 +01:00
Pablo Alba 09a91c87be Merge pull request #2834 from penpot/superalex-fix-ctrl-c-in-inspect-code
🐛 Fix ctrl+c on inspect code
2023-01-25 16:23:38 +01:00
Alejandro Alonso e71d569cda 🐛 Fix ctrl+c on inspect code 2023-01-25 16:11:58 +01:00
alonso.torres a56a9868dc 🐛 Fix error on thumbnail generation 2023-01-25 13:20:06 +01:00
Pablo Alba a09198b46e 🐛 Fix wrong pop on setup shortcuts 2023-01-25 13:05:03 +01:00
Alejandro c7e9c658cd Merge pull request #2827 from penpot/eva-flex-bugfixing-2
🐛 Fix missing flex props on code generation
2023-01-25 11:46:34 +01:00
Alejandro 58d7bc5c14 Merge pull request #2831 from penpot/azazeln28-fix-viewer-all-mouse-wheel-issues
Fix all viewer mouse wheel issues
2023-01-25 11:38:31 +01:00
Alejandro e939db927e Merge pull request #2825 from penpot/palba-text-formatting-shortcuts
🎉 Shortcuts for text formatting
2023-01-25 11:33:17 +01:00
Pablo Alba efe50479de 🎉 Shortcuts for text formatting 2023-01-25 11:32:59 +01:00
Eva ea1b3bd058 🐛 Fix missing flex props on code generation 2023-01-25 08:19:33 +01:00
Aitor 4751d7d385 🐛 Fix all viewer mouse wheel issues 2023-01-24 17:44:15 +01:00
Hosted Weblate bc88e30efa 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 16:17:30 +01:00
Andrés Moya 9623dbfbd6 📚 Validate translations 2023-01-24 16:17:30 +01:00
Andrés Moya f177de6661 Merge remote-tracking branch 'weblate/develop' into translations 2023-01-24 16:17:30 +01:00
Alejandro 43043e2dc1 Merge pull request #2830 from penpot/alotor-polishing-10
Small bugfixes
2023-01-24 15:53:16 +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
alonso.torres 05d21d7d07 🐛 Fix reorder layers with keys not refreshing layout 2023-01-24 15:30:20 +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
alonso.torres 02aab37ee7 🐛 Fix bold typefaces in thumbnails 2023-01-24 15:08:58 +01:00
elhombretecla d3aee1afa3 Add new images 2023-01-24 15:01:18 +01:00
elhombretecla ac361cdb36 Adds new 1.17 onboarding info 2023-01-24 14:53:12 +01:00
Aitor 7ac6f49c08 Merge pull request #2808 from penpot/superalex-fix-font-vertical-metrics
🐛 Fix font vertical metrics
2023-01-24 14:26:14 +01:00
Alejandro Alonso d3e11433bf 🐛 Fix font vertical metrics 2023-01-24 14:21:16 +01:00
Pablo Alba 771d1d9194 🐛 Fix double click and lens zoom 2023-01-24 14:19:14 +01:00
Alejandro 4a3a53182b Merge pull request #2797 from penpot/palba-lens-tool
🎉 Zoom lense tool
2023-01-24 13:34:23 +01:00
Pablo Alba c25cf043fa 🎉 Zoom lense tool 2023-01-24 13:34:04 +01:00
elhombretecla 7440d38c94 Add new login image 2023-01-24 13:19:16 +01:00
Alejandro a8c0d437ce Merge pull request #2828 from penpot/superalex-update-changes
 Update changes
2023-01-24 12:55:35 +01:00
Alejandro 8d683beae4 Merge pull request #2829 from penpot/fix-safari-thumbnails
🐛 Fix thumbnails for Safari browsers
2023-01-24 12:36:15 +01:00
Alejandro Alonso 4007d8713c Update changes 2023-01-24 12:26:17 +01:00
alonso.torres ead64a1820 🐛 Fix thumbnails for Safari browsers 2023-01-24 11:56:59 +01:00
Alejandro Alonso aae78055c8 Merge remote-tracking branch 'origin/staging' into develop 2023-01-24 10:00:51 +01:00
Alejandro 88e2a5c56e Merge pull request #2826 from penpot/alotor-thumbnails-performance
Thumbnails performance
2023-01-24 09:59:20 +01:00
alonso.torres 9782d9077f Improved and fixed thumbnail generation 2023-01-24 09:44:56 +01:00
Alejandro b4c4511d9d Merge pull request #2823 from penpot/alotor-polishing-9
Improved thumbnails behavior
2023-01-23 17:18:53 +01:00
alonso.torres 316b3d4539 🐛 Try to remove cases when the thumbnail could be empty 2023-01-23 14:07:51 +01:00
alonso.torres 1c54e9fa4d Allow debug in for release build 2023-01-23 14:03:28 +01:00
alonso.torres 3d064b804b Improve performance on multiple options 2023-01-23 14:03:02 +01:00
Alejandro Alonso 6b25bf6c4f Merge remote-tracking branch 'origin/staging' into develop 2023-01-23 11:06:05 +01:00
alonso.torres 088a8af345 🐛 Fix problem with empty styles 2023-01-23 11:05:28 +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 8ee7915c1d Merge pull request #2820 from penpot/eva-typos
🐛 Fix some typos on translation
2023-01-23 09:54:24 +01:00
Eva ea8755ce24 🐛 Fix some typos on translation 2023-01-23 09:41:16 +01:00
Prithvi Tharun 381aae735d Improves empty state content
Reads in neutral content without alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-23 09:38:52 +01:00
Prithvi Tharun a4826eddcd 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>
2023-01-23 09:38:52 +01:00
Prithvi Tharun 31e2fff4d4 Improves tooltip
X and Y position tooltips updated to communicate more info

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-23 09:38:52 +01:00
Alejandro 021c714867 Merge pull request #2817 from penpot/niwinz-docker-and-admin
 Improvements on PREPL
2023-01-23 09:12:06 +01:00
Andrey Antukh 231ac00934 🎉 Add manage.py script for docker images 2023-01-20 17:14:32 +01:00
Andrey Antukh 578ff944a6 📎 Use name instead of pr-str of error type 2023-01-20 16:52:58 +01:00
Andrey Antukh bf8a514871 Add more flexible prepl api for external tools 2023-01-20 16:52:58 +01:00
Andrey Antukh 8d60b3fc3e 🐛 Add missing hint on duplicate profile exception 2023-01-20 16:52:58 +01:00
Andrey Antukh 8468e7af24 🎉 Add admin example service to default docker compose file 2023-01-20 16:52:58 +01:00
Alejandro Alonso b8043a9755 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 15:52:04 +01:00
Alejandro 50eee3f597 Merge pull request #2816 from penpot/eva-bugfix-2
Eva polishing
2023-01-20 15:50:59 +01:00
Eva Marco b9b3fcdb6a Merge pull request #2813 from penpot/superalex-fix-svg-import
🐛 Fix svg import
2023-01-20 14:36:59 +01:00
Eva f0d74ab63e 🐛 Fix hsla information in viewer 2023-01-20 14:30:17 +01:00
Alejandro dad5d953ce Merge pull request #2814 from penpot/alotor-polishing-8
Fix some mask issues
2023-01-20 14:04:45 +01:00
Alejandro Alonso da517f2d35 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 13:58:08 +01:00
Alejandro f6058aa71e Merge pull request #2815 from penpot/alotor-debug-names
 Add debug tool to display name and id for shapes
2023-01-20 13:57:18 +01:00
alonso.torres 85d56e6057 Add debug tool to display name and id for shapes 2023-01-20 13:47:40 +01:00
Eva c353d3703b Add some accessibility on shortcuts panel 2023-01-20 12:39:07 +01:00
Andrés Moya 9367788898 Small improvement 2023-01-20 12:04:47 +01:00
Andrés Moya 2b978777d7 🐛 Fix import/export components with boards inside 2023-01-20 12:04:47 +01:00
Eva 2a30c23334 🐛 Fix hidden shapes inside hidden group 2023-01-20 11:15:14 +01:00
Alejandro Alonso 2f188e7fb4 🐛 Fix regression with library svgs 2023-01-20 11:01:22 +01:00
alonso.torres 0743b07667 🐛 Fix problem with mask disappearing in root frame 2023-01-20 10:56:55 +01:00
alonso.torres f38197b227 Remove restriction to move mask layers 2023-01-20 10:56:55 +01:00
alonso.torres bc9be7846a 🐛 Fix problem with empty mask on layout 2023-01-20 10:56:55 +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
Eva Marco 28114b166c Merge pull request #2812 from penpot/hiru-avoid-bad-nested-component
Avoid creating component with shapes that belong to other one
2023-01-20 09:22:25 +01:00
Alejandro Alonso be74cd2c7b 🐛 Fix import svgs with currentColor as stroke fill 2023-01-20 09:17:04 +01:00
Eva Marco b329de6487 Merge pull request #2807 from penpot/hiru-fix-layout-sync
Fix layout attributes sync in components
2023-01-20 09:06:36 +01:00
Alejandro Alonso 9c66998530 🐛 Fix svg import 2023-01-20 07:35:21 +01:00
Eva 8b377ac556 💄 Add entry on changes 2023-01-19 19:33:00 +01:00
Andrés Moya 8c6f07ab65 🐛 Fix right sidebar component options menu 2023-01-19 16:54:30 +01:00
Andrés Moya dc89610d07 🐛 Avoid creating component with shapes that belong to other one 2023-01-19 16:40:27 +01:00
Eva 40195a4f52 🐛 Fix index on layout created over group 2023-01-19 16:16:22 +01:00
Eva 6a257503ae 🐛 Fix create layout over mask destroy mask 2023-01-19 16:16:22 +01:00
Eva Marco a3e583d745 Merge pull request #2809 from penpot/hiru-fix-asset-with-board
🐛 Fix display of components with frame root in assets panel
2023-01-19 15:47:52 +01:00
alonso.torres 685a071e87 🐛 Fix rounding error with matrices 2023-01-19 15:47:25 +01:00
Andrey Antukh 73658c47f3 🐛 Fix issues on rlimit module 2023-01-19 15:41:12 +01:00
Andrey Antukh d98fd76032 🎉 Add namespace with a set of helpers for access throught the BREPL 2023-01-19 15:41:12 +01:00
Andrey Antukh 2fef3dc881 🎉 Add prepl support
And rename the current repl to urepl (user-repl).
2023-01-19 15:41:12 +01:00
Eva Marco a1a0444cc7 Merge pull request #2806 from penpot/alotor-polishing-7
Changes to paths and fixed reorder
2023-01-19 14:42:51 +01:00
Andrés Moya 792c17fe46 🐛 Fix display of components with frame root in assets panel 2023-01-19 14:18:55 +01:00
Andrés Moya 77d71abb5d 🐛 Sync correctly all layout attributes 2023-01-19 13:44:28 +01:00
alonso.torres 75d6e21af8 Show tools on path creation. Change snap while drawing 2023-01-19 13:39:21 +01:00
alonso.torres 0632111e96 🐛 Fix reorder layers with keys 2023-01-19 13:39:21 +01:00
Eva Marco fe77ef4438 Merge pull request #2802 from penpot/alotor-polishing-6
Polishing after confluence test
2023-01-19 12:55:59 +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
alonso.torres e7ac7ff7fb 🐛 Fix problem with disappearing titles 2023-01-19 11:51:53 +01:00
alonso.torres d78ad30e23 Enter on containers selects children 2023-01-19 11:51:53 +01:00
alonso.torres 4b5caf5fb9 Shift+move ignores snap-pixel on the axis moving 2023-01-19 11:51:53 +01:00
alonso.torres 4e1eb2d6e9 🐛 Fix problem when flipping a mask 2023-01-19 11:51:53 +01:00
alonso.torres ab7683f1e3 Improved text layout handling 2023-01-19 11:51:53 +01:00
alonso.torres 89371e10d1 🐛 Fix problem moving shapes inside a group inside a layout 2023-01-19 11:51:53 +01:00
alonso.torres 9fd6c65d93 🐛 Fix problem with empty paths 2023-01-19 11:51:53 +01:00
Eva 1f9c89fb32 🐛 Fix add svg did not update layout 2023-01-19 11:31:46 +01:00
Eva 61e83d7e01 🐛 Add selected colors on rightbar when selecting a board 2023-01-19 11:31:46 +01:00
Eva a1a3d09998 🐛 Remove numbers in layer creation 2023-01-19 11:31:46 +01:00
Eva de7a1d34c0 🐛 Fix board preset size selector css 2023-01-19 11:31:46 +01:00
Eva f93d0e1c4d 🐛 Fix snap to pixel on path creation and edit 2023-01-19 11:31:46 +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
Eva Marco c5d8d77070 Merge pull request #2799 from penpot/alotor-polishing-5
Polishing
2023-01-18 11:38:40 +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
alonso.torres c18d3c66a8 Changes to snap to pixel 2023-01-18 11:04:24 +01:00
alonso.torres 0d96b5b798 🐛 Fix problems with mask elements modifiers when moving child 2023-01-18 11:04:24 +01:00
alonso.torres 24f45fafbf 🐛 Fix problem with disappearing frame titles 2023-01-18 11:04:13 +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
Alejandro ca8df3a8d8 Merge pull request #2788 from penpot/niwinz-bugfix-binfile-import-storage-features
🐛 Properly handle storage features on binfile import
2023-01-18 09:52:51 +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
Eva d14f4c5c4a 🐛 Fix open color palette from colorpicker 2023-01-17 23:28:02 +01:00
Eva f6ff80a3d4 🐛 Fix Apply library colors to gradient points 2023-01-17 23:28:02 +01:00
Eva b2d8f807f9 🐛 Fix alignment inside dropdown 2023-01-17 23:28:02 +01:00
Eva 03b3b441b5 🐛 Fix create mask inside layout 2023-01-17 23:28:02 +01:00
Andrey Antukh 523539e403 🐛 Properly handle storage features on binfile import 2023-01-17 10:14:30 +01:00
Alejandro 3280a6853e Merge pull request #2784 from penpot/palba-fix-undo-in-multiplayer
🐛 Fix undo corner case in multiplayer
2023-01-17 09:32:52 +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
Eva fb060cb806 🐛 Fix padding values and add tooltip 2023-01-16 18:24:48 +01:00
Eva 8892cebb6f 🐛 Fix create layout flex around component 2023-01-16 18:24:48 +01:00
Eva 6fb97e54a9 🐛 Fix context menu when two elements where selected 2023-01-16 18:24:48 +01:00
Eva Marco 1c3470ca53 Merge pull request #2785 from penpot/azazeln28-fix-mousewheel-on-viewer-inspector
🐛 Fix mouse wheel on viewer inspector
2023-01-16 18:00:52 +01:00
alonso.torres 0ae42be851 🐛 Fix pipeline for thumbnails 2023-01-16 17:42:17 +01:00
alonso.torres ff6f0b2744 🐛 Fix debugging util 2023-01-16 17:33:28 +01:00
Aitor a3a2ab1ecd 🐛 Fix mouse wheel on viewer inspector 2023-01-16 17:30:18 +01:00
Alejandro Alonso 7f9911f164 Merge remote-tracking branch 'origin/staging' into develop 2023-01-16 17:14:56 +01:00
Eva Marco 01ba68fd6f Merge pull request #2786 from penpot/alotor-fix-text-loop
Fix problem with text hanging the application
2023-01-16 17:14:01 +01:00
alonso.torres 1ab669cc7b 🐛 Fix problems with texts looping 2023-01-16 17:05:34 +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
Pablo Alba ab421ac3f9 🐛 Fix undo corner case in multiplayer 2023-01-16 11:43:42 +01:00
Pablo Alba 0faa0b21a4 Merge pull request #2776 from penpot/superalex-justify-text-is-stretched
🐛 Fix justify text is stretched
2023-01-16 07:09:24 +01:00
Alejandro Alonso 4ca6a89e6f 🐛 Fix justify text is stretched 2023-01-13 16:55:00 +01:00
Alejandro Alonso 6c0a8afba2 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 15:00:30 +01:00
Eva Marco ab5fd68689 Merge pull request #2777 from penpot/alotor-polishing-4
Polishing
2023-01-13 14:58:38 +01:00
Alejandro Alonso 19bac6bd10 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 14:37:06 +01:00
Alejandro 275eb993ce Merge pull request #2775 from penpot/niwinz-bugfixes-1
🐛 Several backend bugfixes
2023-01-13 14:33:46 +01:00
Alejandro 88143cfb8b Merge pull request #2778 from penpot/palba-filter-gfonts-variants
🐛 Filter gfonts variants for figma exporter plugin
2023-01-13 14:33:32 +01:00
alonso.torres 5f0f3abeae 🐛 Fix problem when dropping indices in flipped frames 2023-01-13 14:23:11 +01:00
alonso.torres b203c87dbb 🐛 Fix problem with rotated texts inside flex layout 2023-01-13 14:23:11 +01:00
alonso.torres 7a796bc83f 🐛 Fix problem with thumbnails when duplicating artboards 2023-01-13 14:23:11 +01:00
alonso.torres 196e193281 🐛 Fix error message when the thumbnail fails to be added 2023-01-13 14:23:11 +01:00
alonso.torres d0a15cda96 🐛 Fix issue when mirroring artboard 2023-01-13 14:23:11 +01:00
Pablo Alba c3733ed2e1 🐛 Filter gfonts variants for figma exporter plugin 2023-01-13 14:19:57 +01:00
Pablo Alba 379623d629 Merge pull request #2773 from penpot/azazeln28-fix-library-list-spacing
🐛 Fix library list spacing
2023-01-13 13:32:13 +01:00
Pablo Alba cb2553a8ca Merge pull request #2772 from penpot/azazeln28-fix-cannot-move-vertical-scroll-in-viewer
🐛 Fixes vertical scroll in viewer (code mode)
2023-01-13 13:30:10 +01:00
Aitor 1b7ea6ed53 Adds method to-fixed to math
Changes matrix/toString to use `to-fixed`
2023-01-13 11:43:50 +01:00
Eva 57a569a07a 🐛 Fix alignment on justify content space between 2023-01-13 11:43:05 +01:00
Andrey Antukh a5006b1687 🐛 Remove www-form encoding from webhooks
It is broken by design, so we just do not support it
2023-01-13 10:34:56 +01:00
Aitor 24dc40a1b0 🐛 Fix library list spacing 2023-01-13 10:34:02 +01:00
Andrey Antukh b4fc39f73c 📎 Disable quotes by default 2023-01-13 10:23:00 +01:00
Andrey Antukh 095dc2ad11 Do not merge path params into params
makes conflict with possible params coming from user
2023-01-13 10:19:39 +01:00
Andrey Antukh fcbbe8e5c7 🐛 Fix incorrect logging context setup 2023-01-13 10:19:39 +01:00
Andrey Antukh bafe3ec087 Revert some changes related to admin that are no longer necessary 2023-01-13 10:19:39 +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
Aitor 5d44d75465 🐛 Fixes vertical scroll in viewer (code mode) 2023-01-12 16:57:15 +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 44102050ee Merge pull request #2768 from penpot/palba-more-undo-tuning
🐛 Fix undo ungroup (shift+g) scrambles positions
2023-01-12 13:31:59 +01:00
Eva Marco cae436f365 Merge pull request #2766 from penpot/alotor-polishing-3
Polishing
2023-01-12 13:24:04 +01:00
alonso.torres e6d80e34b9 Drawing shapes over flex layout checks its drop index 2023-01-12 13:18:38 +01:00
Alejandro Alonso c39c58198d Merge remote-tracking branch 'origin/staging' into develop 2023-01-12 13:14:25 +01:00
Alejandro fbec07bd48 Merge pull request #2767 from penpot/azazeln28-fix-ignore-file-library-sync-status
🐛 Fix ignore file library sync status
2023-01-12 13:13:54 +01:00
Pablo Alba a555028ee2 🐛 Fix undo ungroup (shift+g) scrambles positions 2023-01-12 12:54:07 +01:00
Aitor d91e8c349e 🐛 Fix ignore file library sync status
- Adds missing `update` of `:features` using `db/decode-pgarray`
2023-01-12 12:38:26 +01:00
alonso.torres abe26007d7 🐛 Fix problem with measures for frames 2023-01-12 12:35:20 +01:00
alonso.torres 2da421bb7a 🐛 Fix error on path editing 2023-01-12 12:35:20 +01:00
alonso.torres 7d48b86e46 ❇️ Debugging panel for development 2023-01-12 12:35:20 +01:00
alonso.torres 28663b5ff6 Improved performance of svg paths 2023-01-12 12:29:02 +01:00
Alejandro Alonso 651d4f794b 🐛 Fix copy paste line break 2023-01-12 12:28:05 +01:00
alonso.torres 58aa6b3666 🐛 Fix problem with gap-row/gap-column 2023-01-12 12:17:26 +01:00
Eva 131c2f331e 🐛 Fix gap 2023-01-12 12:17:26 +01:00
Eva 8df861faaa 🐛 Fix some undo while actions in flex 2023-01-12 12:17:26 +01:00
Eva 4f81f9636a ♻️ Change uuid/next for js/Symbol on undo-id for transactions 2023-01-12 12:17:26 +01:00
Eva 31dfdf51c9 🐛 Fix some errors on flex layout 2023-01-12 12:17:26 +01:00
Pablo Alba acf51ea744 💄 Use css color variable instead of fixed value 2023-01-12 09:21:57 +01:00
Pablo Alba a54f5484e8 🎉 Added a tag to mark read only mode (now on pages) 2023-01-11 17:25:49 +01:00
Pablo Alba 3a8486f4b0 🐛 Fix share prototype styles on hover: color and tooltip 2023-01-11 17:16:43 +01:00
Pablo Alba 43c3d67521 🐛 Fix max height in library dialog 2023-01-11 17:10:56 +01:00
Aitor Moreno 4b2d82e100 :fix: react warning duplicate keys 2023-01-11 15:10:53 +01:00
Aitor Moreno f2fd380979 Improves matrix serialization 2023-01-11 15:03:18 +01:00
Alejandro 984187037c Merge pull request #2757 from penpot/palba-fix-expanded-code
🐛 Fix switching tabs produces strange behaviour when "expanded" v…
2023-01-11 12:55:33 +01:00
Alejandro 173e5da98e Merge pull request #2759 from penpot/palba-read-only-tag
🎉 Added a tag to mark read only mode
2023-01-11 12:53:10 +01:00
Alejandro Alonso 76c9f11922 Merge remote-tracking branch 'origin/staging' into develop 2023-01-11 12:45:05 +01:00
Pablo Alba 2ab3ed9ab4 🎉 Added a tag to mark read only mode 2023-01-11 12:06:42 +01:00
Aitor 74e4273549 Merge pull request #2754 from penpot/superalex-fix-move-boards-with-comments
🐛 Fix move boards with comments
2023-01-11 10:28:04 +01:00
Pablo Alba 12392a4038 🐛 Fix switching tabs produces strange behaviour when "expanded" view mode was used for Code 2023-01-10 17:19:45 +01:00
Pablo Alba 987b7f44f4 🐛 Fix layer orders messed up on move, group, reparent and undo 2023-01-10 16:45:08 +01:00
Alejandro 3480d6979b Merge pull request #2755 from penpot/eva-fix-icon
🐛 Fix pin icon in project
2023-01-10 15:55:23 +01:00
Eva 9ca1efc128 🐛 Fix pin icon in project 2023-01-10 14:26:52 +01:00
Alejandro Alonso 81a95d362c 🐛 Fix move boards with comments 2023-01-10 13:55:41 +01:00
Alejandro Alonso a25f069f8e Merge remote-tracking branch 'origin/staging' into develop 2023-01-10 11:27:38 +01:00
Eva Marco a7dfda515b Merge pull request #2753 from penpot/alotor-polishing-2
Fix problems with text positons
2023-01-10 11:26:49 +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
alonso.torres b5c1199f4d 🐛 Fix problem with texts randomly moving 2023-01-10 11:02:40 +01:00
alonso.torres 4aa8baa129 Add debug history overlay 2023-01-10 11:02:40 +01:00
Alejandro 553f2f5576 Merge pull request #2748 from penpot/eva-workspace-visual-changes
Bugfixing
2023-01-10 10:35:32 +01:00
Alejandro b132837432 Merge pull request #2743 from penpot/niwinz-enhancements-2
🐛 Bugfixes
2023-01-10 09:56:45 +01:00
Eva 36bc276d93 🐛 Fix outline in color type selector on view mode 2023-01-10 09:40:24 +01:00
Alejandro Alonso 34d874f56d Merge remote-tracking branch 'origin/staging' into develop 2023-01-09 16:41:40 +01:00
Eva Marco 35aa391129 Merge pull request #2749 from penpot/hiru-fix-ghost-sync
🐛 Fix ghost shapes after sync groups in components
2023-01-09 16:20:20 +01:00
Eva 2c2755b35e 🐛 Fix allow names selection in dashboard 2023-01-09 16:06:00 +01:00
Andrés Moya bedaef961b 🐛 Fix ghost shapes after sync groups in components 2023-01-09 14:21:29 +01:00
Eva fe7f4004f1 🐛 Fix scape key to clear focus on input 2023-01-09 13:01:15 +01:00
Eva eef42acf79 🐛 Fix component list on update 2023-01-09 13:01:15 +01:00
Eva 937713311e 🐛 Fix some visual errors 2023-01-09 13:01:15 +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
Alejandro 94fc067286 Merge pull request #2744 from penpot/alotor-fix-svg-upload
🐛 Fix problem uploading svg with style tag
2023-01-09 12:43:32 +01:00
Alejandro ae6ea7744e Merge pull request #2738 from penpot/alotor-polishing
Polishing
2023-01-09 12:35:43 +01:00
Aitor Moreno b73ab37c94 🐛 Fix import dialog React duplicate key warning 2023-01-09 12:28:41 +01:00
Andrey Antukh f628955a15 🐛 Set the same tenant default on backend and exporter 2023-01-09 11:57:13 +01:00
Andrey Antukh 6cdf696fc4 🐛 Fix issues on ldap provider and rpc method 2023-01-09 11:57:13 +01:00
alonso.torres c42ef7c5b0 🐛 Fix problem uploading svg with style tag 2023-01-09 11:56:02 +01:00
Andrey Antukh 853be27780 🐛 Fix issues on database logger 2023-01-09 11:43:26 +01:00
Andrey Antukh b235d3f0f2 Improve update-file webhook batching
make it per user
2023-01-09 11:43:02 +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
alonso.torres 1fdf09a692 🐛 Fix problem with snap-pixel for very big shapes 2023-01-09 11:06:09 +01:00
alonso.torres c2e0b18f26 🐛 Fix problem with thumbnails uploading 2023-01-09 11:05:31 +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
alonso.torres 672cfa4ecc 🐛 Fix problem when forcing persistence on screen change 2023-01-05 16:20:37 +01:00
alonso.torres c459c56f37 Improved performance of snap to distances 2023-01-05 16:20:37 +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
Andrey Antukh 97a884018f Move media mutations to commands 2023-01-05 13:23:57 +01:00
Andrey Antukh 1718f49a90 💄 Fix code consistency issues on comments rpc methods
related to the ::rpc/profile-id usage.
2023-01-05 13:23:57 +01:00
Alejandro 2c1fb1424c Merge pull request #2734 from penpot/hiru-fix-text-sync
🐛 Fix text content sync and touched detection in shape displacement
2023-01-05 12:13:30 +01:00
Andrés Moya 5e1cabc857 🐛 Fix text content sync and touched detection in shape displacement 2023-01-05 10:23:34 +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 6f72ea0530 💄 Clean up CHANGES.md (staging) 2023-01-05 09:57:10 +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 c2d8c1994c Merge pull request #2671 from penpot/hiru-sync-groups
🐛 Fix group/ungroup shapes inside a component
2023-01-05 09:21:58 +01:00
Andrés Moya 985d5cc20c 🐛 Fix group/ungroup shapes inside a component 2023-01-05 09:21:42 +01:00
Alejandro a0364e8835 Merge pull request #2728 from penpot/eva-bugfixin-flex
🐛 Fix some bugs reported on flex feedback
2023-01-05 08:54:55 +01:00
Alejandro Alonso 3b0bded82c Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 07:40:25 +01:00
Alejandro b273bd44c5 Merge pull request #2733 from penpot/alotor-performance
Performance enhancements
2023-01-05 07:39:57 +01:00
Alejandro ec2fff31a0 Merge pull request #2732 from penpot/palba-create-group-form-enter
🐛 Fix confirm group name with enter doesn't work in assets modal
2023-01-05 07:07:58 +01:00
Pablo Alba 53a8718e8d 🐛 Fix confirm group name with enter doesn't work in assets modal 2023-01-05 07:07:43 +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
alonso.torres 10439934d4 Use the function hypot for distances 2023-01-04 16:21:41 +01:00
alonso.torres 84e9f69213 Improved text rendering performance 2023-01-04 16:12:12 +01:00
alonso.torres 837b52aea1 Improved performand for hug content in layout 2023-01-04 16:12:12 +01:00
alonso.torres 98698cf2db Improved modifiers lens 2023-01-04 16:12:12 +01:00
alonso.torres d5ab0eea1a Removed reflow in viewport 2023-01-04 16:12:12 +01:00
Pablo Alba 333acacbbf Merge pull request #2730 from penpot/superalex-fix-enter-events
🐛 Fix enter events
2023-01-04 14:37:15 +01:00
Eva 598959cd3f 🐛 Fix some bugs reported on flex feedback 2023-01-04 14:00:13 +01:00
Alejandro Alonso 05431cc757 🐛 Fix enter events 2023-01-04 13:23:05 +01:00
Alejandro Alonso f56b8be33d 🐛 Fix enter events 2023-01-04 13:09:39 +01:00
Alejandro Alonso dd0ac64e28 Merge remote-tracking branch 'origin/staging' into develop 2023-01-04 09:25:30 +01:00
alonso.torres 644854a651 Reorder layers through keys in flex layout 2023-01-04 09:24:47 +01:00
alonso.torres e926b11fef Changes to the margin-item and min/max width/height 2023-01-04 09:24:42 +01:00
alonso.torres 40da1c302a Support hidden elements in flex layout 2023-01-04 09:24:35 +01:00
Alejandro Alonso aa56e2cdcf Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:18:00 +01:00
Alejandro Alonso b5e53b57d1 🎉 Dynamic alignment only in sight 2023-01-02 14:12:14 +01:00
Alejandro Alonso 07ac43ec0e Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:07:56 +01:00
Alejandro e8d561ac7f Merge pull request #2724 from penpot/hiru-fix-component-board
Avoid extra group when creating a component from a board
2023-01-02 13:52:14 +01:00
Alejandro Alonso 31661d5484 Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 13:48:36 +01:00
Alejandro cf87c54ed4 Merge pull request #2726 from penpot/palba-error-import-file
🐛 Fix export/import svg + json format isn't working
2023-01-02 13:48:14 +01:00
Pablo Alba 3ce1540331 🐛 Fix export/import svg + json format isn't working 2023-01-02 13:36:49 +01:00
Alejandro cda2dade95 Merge pull request #2725 from penpot/alotor-bug-fixing
Bug fixing
2023-01-02 11:56:51 +01:00
Andrés Moya baf4dfdecc 🐛 Allow to create component from frame 2023-01-02 11:33:58 +01:00
alonso.torres ade13d3bca 🐛 Fix problem with auto-height text resize 2023-01-02 11:25:53 +01:00
alonso.torres ff9b2090cf 🐛 Fix problem with shapes moving randomly 2023-01-02 11:25:53 +01:00
alonso.torres 733b35dd53 ⬆️ Updated potok dependency 2023-01-02 11:25:53 +01:00
Alejandro 466e018411 Merge pull request #2700 from penpot/palba-orphans-st
🐛 Add function to reparent orphan shapes
2023-01-02 11:16:22 +01:00
alonso.torres 32d39c35e4 🐛 Fix problem with flipped shapes 2023-01-02 11:12:59 +01:00
Alejandro 5f77df1996 Merge pull request #2713 from penpot/palba-show-color-name-inspect
🐛 Show color name on inspect
2023-01-02 10:35:36 +01:00
Alejandro 24538add3f Merge pull request #2723 from penpot/eva-a11y-bugfixing
🐛 Fix some visual errors
2023-01-02 10:33:23 +01:00
Eva 407831ffd1 🐛 Fix some visual errors 2023-01-02 09:46:42 +01:00
Alejandro 379997f9db Merge pull request #2716 from penpot/palba-fix-internal-error-set-text-style
🐛 Fix internal error at setting text style
2023-01-02 09:41:48 +01:00
Alejandro b1d99232a9 Merge pull request #2718 from penpot/niwinz-bugfixes
🐛 Bugfixes
2023-01-02 09:23:39 +01:00
Alejandro Alonso 7e21d827c9 🐛 Fix duplicate frame issues 2023-01-02 08:52:45 +01:00
Alejandro 443d8b21c1 Merge pull request #2719 from penpot/niwinz-quotes
🎉 Quotes & Soft Quotes
2023-01-02 08:13:14 +01:00
Andrey Antukh e372e8ba3e 🐛 Fix s3 client issues with s3 compatible services 2022-12-31 16:37:42 +01:00
Andrey Antukh 27451b9796 ♻️ Refactor comments RPC methods and add tests 2022-12-31 12:00:57 +01:00
Andrey Antukh 73a3e0c0ae 🎉 Add usage quotes 2022-12-31 11:22:36 +01:00
Andrey Antukh d68be0869b Improve error report on point constructor 2022-12-31 11:11:22 +01:00
Andrey Antukh 7a8b0e710b Improve trace reporting on unhandled exception 2022-12-31 11:11:17 +01:00
Andrey Antukh 3b61a7dd91 🐛 Fix incorrect arguments to process-changes 2022-12-31 11:11:13 +01:00
Andrey Antukh 941aa6ad5d 🔥 Remove unused configuration attrs 2022-12-31 09:22:57 +01:00
Pablo Alba 42b69df671 🐛 Fix internal error at setting text style 2022-12-30 13:34:47 +01:00
Pablo Alba 4442246e08 Merge pull request #2714 from penpot/superalex-fix-ignoring-boolean-operations-on-ctrl-click-actions
🐛 Fix ignore booleans on ctrl + click selection
2022-12-30 12:11:30 +01:00
Pablo Alba d1dbc3850d 🐛 Show color name on inspect 2022-12-30 11:59:46 +01:00
Alejandro Alonso ed4a5f6c60 🐛 Fix ignore booleans on ctrl + click selection 2022-12-30 11:33:03 +01:00
Alejandro 0144939f34 Merge pull request #2702 from penpot/palba-fix-boolean-shapes-color
🐛 Fix incorrect color in properties of multiple bool shapes
2022-12-30 08:06:48 +01:00
Pablo Alba ede07e4f44 🐛 Fix incorrect color in properties of multiple bool shapes 2022-12-30 08:05:26 +01:00
Alejandro Alonso 9c44cd343f Merge remote-tracking branch 'origin/staging' into develop 2022-12-30 07:46:38 +01:00
Alejandro b2c55c79a4 Merge pull request #2710 from penpot/palba-convert-current-color-in-svg
🐛 Fix "currentColor" is not converted when importing SVG
2022-12-30 07:45:05 +01:00
Pablo Alba 0b2ffbe1fa 🐛 Fix "currentColor" is not converted when importing SVG 2022-12-30 07:44:47 +01:00
Alejandro ebfe651b7d Merge pull request #2711 from penpot/palba-create-component-menu
🐛 Fix missing create component menu for frames
2022-12-30 07:40:20 +01:00
Pablo Alba dac11d1606 🐛 Fix missing create component menu for frames 2022-12-30 07:28:27 +01:00
Alejandro c8bd1e89d6 Merge pull request #2708 from penpot/palba-fix-selection-stroke-on-multiple-fonts
🐛 Fix selection stroke missing in properties of multiple texts
2022-12-30 07:25:50 +01:00
Alejandro Alonso 2d22f575a0 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 14:26:00 +01:00
Alejandro 8111db1110 Merge pull request #2709 from penpot/eva-bugfixing-css
🐛 Fix some visual errors
2022-12-29 14:25:30 +01:00
Eva 0a8dfde0a2 🐛 Fix some visual errors 2022-12-29 14:20:02 +01:00
Pablo Alba 9f6a3cbc23 🐛 Fix selection stroke missing in properties of multiple texts 2022-12-29 13:53:35 +01:00
Alejandro Alonso 87a264ae40 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 13:15:15 +01:00
Alejandro 6592456085 Merge pull request #2707 from penpot/alotor-remove-handoff-references
Remove handoff references
2022-12-29 13:14:55 +01:00
alonso.torres 3bbf632121 ♻️ Changed handoff for inspect everywhere 2022-12-29 13:06:16 +01:00
Alejandro 690090acb4 Merge pull request #2706 from penpot/alotor-flex-improvements
Flex improvements
2022-12-29 12:06:47 +01:00
Alejandro 104059a7b1 Merge pull request #2703 from penpot/palba-add-loading-icon-shared-libraries
🐛 Fix missing loading icon on shared libraries
2022-12-29 11:56:00 +01:00
Pablo Alba f75af88877 🐛 Fix missing loading icon on shared libraries 2022-12-29 11:47:31 +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
Alejandro Alonso d4360be96e 🐛 Fix guides inside frames issues 2022-12-29 09:50:04 +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
Andrey Antukh dcf95a7502 ⬇️ Downgrade promesa library
Causes incorect release build for some unknown reasons
2022-12-28 13:15:35 +01:00
Pablo Alba 4fc3f316e0 🐛 Add function to reparent orphan shapes 2022-12-28 12:49:07 +01:00
Alejandro Alonso 1497e8ef0f Merge remote-tracking branch 'origin/staging' into develop 2022-12-28 11:55:30 +01:00
Alejandro 83c8e7f03a Merge pull request #2699 from penpot/alotor-bugfixes
Alotor bugfixes
2022-12-28 11:53:57 +01:00
alonso.torres 074864a6bf 🐛 Fix problem when drawing boxes won't detect mouse-up 2022-12-28 11:48:38 +01:00
alonso.torres aed7f0ad43 🐛 Fix problem when moving texts with keyboard 2022-12-28 11:48:36 +01:00
alonso.torres cd2df41e87 🐛 Fix problems with transparent frames thumbnails 2022-12-28 11:48:14 +01:00
alonso.torres 00fbfd6e9e 🐛 Fix problem when moving shape inside frame 2022-12-28 11:48:14 +01:00
alonso.torres 93726cf8fe 🐛 Fix wrong interaction between comments and panning modes 2022-12-28 11:48:14 +01:00
Andrey Antukh 1dc6464974 🐛 Fix unexpected behavior of font-variant query
Missing coersion of team-id parameter
2022-12-28 11:30:27 +01:00
Alejandro 81cebb2aa8 Merge pull request #2693 from penpot/palba-fix-non-persistent-display-type-st
🐛 Fix display type of component library not persistent
2022-12-28 11:23:47 +01:00
Pablo Alba 6c8144a18a 🐛 Fix display type of component library not persistent 2022-12-28 11:15:42 +01:00
Alejandro Alonso 47bf758ad7 🐛 Fix guides spec failure 2022-12-28 11:14:51 +01:00
Alejandro 13cfe56301 Merge pull request #2698 from penpot/palba-interaction-bad-positioning-when-fixed
🐛 Fix bad element positioning on interaction with fixed scroll
2022-12-28 11:02:23 +01:00
Pablo Alba 33f7cec933 🐛 Fix bad element positioning on interaction with fixed scroll 2022-12-28 10:57:45 +01:00
Alejandro 1f00d91dd7 Merge pull request #2694 from penpot/niwinz-enhancements-6
🐛 Bugfixes
2022-12-28 09:57:07 +01:00
Andrey Antukh c1a8437b6d Merge pull request #2697 from penpot/palba-outline-rounded-rect
🐛 Fix show outline with rounded corners on rects
2022-12-28 09:33:01 +01:00
Pablo Alba 5cb3aa5dbc 🐛 Fix show outline with rounded corners on rects 2022-12-28 09:23:11 +01:00
Andrey Antukh de72dc5769 🐛 Fix race conditions issues on concurrent edition 2022-12-28 09:10:06 +01:00
Andrey Antukh b827037f90 📎 Add experimental label on admin image on compose file 2022-12-28 09:10:06 +01:00
Andrey Antukh 60fb3f3d0e 🐛 Fix storage/pointer-map support issues on thumbnails and libs loading 2022-12-28 09:10:06 +01:00
Andrey Antukh 84fd952471 Improve storage/* features support on srepl helpers 2022-12-28 09:10:06 +01:00
Andrey Antukh e37fc00351 🐛 Fix pointer-map support issue on get-team-shared-files RPC method 2022-12-28 09:10:06 +01:00
Andrey Antukh 4164c8f012 ⬆️ Update dependencies 2022-12-28 09:10:06 +01:00
Alejandro c86af68349 Merge pull request #2695 from penpot/alotor-safari-fix-texts
🐛 Fix problems with Safari texts
2022-12-28 07:16:05 +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
alonso.torres 4302ab05e4 🐛 Fix problems with Safari texts 2022-12-27 15:22:28 +01:00
Alejandro 777e2fb0a3 Merge pull request #2692 from penpot/palba-fix-style-team-invite
🐛 Fix style for team invite in deutsch
2022-12-27 12:49:05 +01:00
Alejandro Alonso f7412ccbd7 📎 Fix version number and changelog 2022-12-27 12:05:42 +01:00
Alejandro Alonso 145d6f831a 📎 Prepare new development cycle 2022-12-27 12:04:02 +01:00
Alejandro fe11b37b8f Merge pull request #2686 from penpot/niwinz-enhancements-5
General enhancements & Bugfixes
2022-12-27 11:58:22 +01:00
Pablo Alba c469bd5757 🐛 Fix style for team invite in deutsch 2022-12-27 09:10:19 +01:00
Andrey Antukh 7d817eb080 🎉 Add new version of docker-compose.yaml
That not depends on config.env file and has better examples
2022-12-22 16:42:45 +01:00
Andrey Antukh 2840cb893e 🎉 Add login-with-password flag
As replacement to `login` flag
2022-12-22 16:42:45 +01:00
Andrey Antukh 7f5491f45b 💄 Add minor cosmetic changes to manage.sh script 2022-12-22 16:42:45 +01:00
Andrey Antukh ef9dcf391d 🐛 Fix slow exit of exporter docker container 2022-12-22 16:42:45 +01:00
Andrey Antukh 81ecb26f8b Make exporter docker image run on non-root user 2022-12-22 16:42:45 +01:00
Andrey Antukh 35fd3ce150 Make backend docker image run on non-root user 2022-12-22 16:42:45 +01:00
Andrey Antukh 68d2afc75d Add missing type hints on backend code 2022-12-22 16:42:45 +01:00
Andrey Antukh d094eb3595 Use custom jre for backend docker image
Reduces in 230M the image size.
Also updates JRE.
2022-12-22 16:42:45 +01:00
Andrey Antukh f0d4ad4b20 🎉 Add local docker image building to manage.sh 2022-12-22 16:42:45 +01:00
Andrey Antukh b929564fa7 ♻️ Add admin facilities on the code base
- Fix bugs related to orphan teams on profile deletion
- Separate session based profile-id param from api user provided
2022-12-22 16:42:45 +01:00
Andrey Antukh 53d9b547c3 🐛 Fix several rpc events not emiting webhooks 2022-12-22 16:42:45 +01:00
Andrey Antukh 50c17e1261 🐛 Fix invitation link translations issues 2022-12-22 16:42:45 +01:00
Andrey Antukh a113a64554 🐛 Fix invitation link validation issue 2022-12-22 16:42:41 +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
Andrey Antukh c13730dca7 🐛 Fix incorrect request flow handling on session middleware
an issue introduced in previous commits
2022-12-16 16:59:34 +01:00
Prithvi Tharun 498ec29e47 Improves empty state content
Closes #2643 Reads positive and appreciative of their effort to keep up-to-date with the team. Plus, communicates when they'll see new notifications.

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-16 16:12:41 +01:00
Alejandro 880d01368f Merge pull request #2669 from penpot/alotor-layout-fixes
🐛 Fix problem with auto-width and transforms
2022-12-16 14:07:20 +01:00
alonso.torres 1fe1a352c3 🐛 Fix problem with auto-width and transforms 2022-12-16 13:11:20 +01:00
Alejandro 8ffe023d3e Merge pull request #2667 from penpot/hiru-fix-sync-path
🐛 Fix component sync when shape is converted to path
2022-12-16 13:02:06 +01:00
Andrés Moya 16f30316c0 🐛 Fix component sync when shape is converted to path 2022-12-16 12:57:10 +01:00
Alejandro ac7cb3c8c7 Merge pull request #2654 from penpot/eva-a11y-dashboard
 Improve dashboard accessibility
2022-12-16 12:52:53 +01:00
Alejandro 61c1b65072 Merge pull request #2661 from penpot/niwinz-enhancements-3
Enhancements & Bugfixes
2022-12-16 12:09:57 +01:00
Alejandro Alonso ef994548c1 🐛 Fix typos 2022-12-16 12:09:45 +01:00
Alejandro Alonso 159085fd83 Merge branch 'niwinz-enhancements-3' of github.com:penpot/penpot into niwinz-enhancements-3 2022-12-16 11:39:50 +01:00
Andrey Antukh 84bee9fb93 🐛 Fix minor issue on logging when cause is nil 2022-12-16 10:31:48 +01:00
Andrey Antukh 2dcb4a155e Add import, export and management events to webhooks 2022-12-16 10:31:48 +01:00
Andrey Antukh abf397fe5b Remove share-id from comments webhook 2022-12-16 10:31:48 +01:00
Andrey Antukh 0087447b01 Remove nils from audit/webhook props 2022-12-16 10:31:48 +01:00
Andrey Antukh f47c20e079 🐛 Fix params inconsistency between mutation and commands 2022-12-16 10:31:48 +01:00
Andrey Antukh 4b26b6fc02 🐛 Fix incorrect output on webhook internal queries 2022-12-16 10:31:48 +01:00
Andrey Antukh abeec9f869 📎 Add missing doc metadata on comments commands 2022-12-16 10:31:48 +01:00
Andrey Antukh c9c070b5f4 Use new retry mechanism on comment thread creation 2022-12-16 10:31:48 +01:00
Andrey Antukh d80a24b1e3 Add font events to webhooks 2022-12-16 10:31:48 +01:00
Andrey Antukh ae8000df26 🔥 Remove unused code on RPC main ns 2022-12-16 10:31:48 +01:00
Andrey Antukh f239c401e2 🐛 Fix incorrect auth cookie decoding on first stage session middleware 2022-12-16 10:31:48 +01:00
Andrey Antukh f2e2700c79 💄 Change worker logging 2022-12-16 10:31:48 +01:00
Andrey Antukh d38c495807 Add more project events to webhooks 2022-12-16 10:31:44 +01:00
Andrey Antukh 025cd44eae 🐛 Fix incorrect deduplication of tasks on webhooks 2022-12-16 10:31:13 +01:00
Andrey Antukh 8ac96d09cd 🐛 Properly remove qualified keys on audit/replace-props 2022-12-16 10:31:13 +01:00
Andrey Antukh 8f2a02ae72 🎉 Add webhooks to the API doc 2022-12-16 10:31:13 +01:00
Andrey Antukh 710878a667 Improve webhook URI validation 2022-12-16 10:31:13 +01:00
Andrey Antukh 350e4a1d1b Improve default update-file webhook batch timeout 2022-12-16 10:31:13 +01:00
Andrey Antukh 801d926946 💄 Fix linter issues 2022-12-16 10:31:13 +01:00
Andrey Antukh e50ecd70c6 📎 Add some cosmetic changes to kondo config 2022-12-16 10:31:13 +01:00
Andrey Antukh f11da06637 🎉 Add the ability to copy team invitation link 2022-12-16 10:31:13 +01:00
Andrey Antukh a6b26f0563 🔥 Remove deprecated RPC methods 2022-12-16 10:31:13 +01:00
Andrey Antukh dbf743d58a 📎 Add missing doc/added metadata on fonts related RPC methods 2022-12-16 10:31:13 +01:00
Andrey Antukh d35e35acde 🔥 Remove old deprecated method from fonts queries RPC 2022-12-16 10:31:13 +01:00
Andrey Antukh 36f2ca6bb2 Add generic (blocking) retry macro
And use it on audit handling
2022-12-16 10:31:13 +01:00
Andrey Antukh c570557203 ♻️ Move teams queries and mutations to commands 2022-12-16 10:31:13 +01:00
Andrey Antukh 797ae22526 Use the same value for created_at and tracked_at on audit 2022-12-16 10:31:13 +01:00
Andrey Antukh 4e1e67fc3d 🐛 Fix unexpected redirect on invitation acceptation 2022-12-16 10:31:13 +01:00
Alejandro Alonso 76a83bece9 Merge remote-tracking branch 'origin/staging' into develop 2022-12-16 10:29:42 +01:00
Alejandro Alonso 5605ac2769 📎 Increment version number. 2022-12-16 10:28:28 +01:00
Alejandro Alonso e88d6d88a8 🐛 Fix strage cursor behaviour after clicking viewport with text pool 2022-12-16 10:09:20 +01:00
Andrey Antukh 0cc6c76cdb 🐛 Fix minor issue on logging when cause is nil 2022-12-16 09:41:32 +01:00
Andrey Antukh fa7cf70cee Add import, export and management events to webhooks 2022-12-16 09:41:32 +01:00
Andrey Antukh e25cf13783 Remove share-id from comments webhook 2022-12-16 09:41:32 +01:00
Andrey Antukh 6b199bef89 Remove nils from audit/webhook props 2022-12-16 09:41:32 +01:00
Andrey Antukh 74e6c01213 🐛 Fix params inconsistency between mutation and commands 2022-12-16 09:41:32 +01:00
Andrey Antukh 970dc04bc6 🐛 Fix incorrect output on webhook internal queries 2022-12-16 09:41:32 +01:00
Andrey Antukh aefdbfa8ef Merge pull request #2662 from penpot/palba-fix-cant-select-text-assets-inputs
🐛 Fix unable to select text at assets inputs in firefox
2022-12-16 09:35:00 +01:00
Andrey Antukh 1b3976da47 📎 Add missing doc metadata on comments commands 2022-12-16 09:33:55 +01:00
Andrey Antukh c52046d25b Use new retry mechanism on comment thread creation 2022-12-16 09:33:55 +01:00
Andrey Antukh 609fa87fe2 Add font events to webhooks 2022-12-16 09:33:52 +01:00
Andrey Antukh 9ca2450813 🔥 Remove unused code on RPC main ns 2022-12-16 09:33:24 +01:00
Andrey Antukh 408d33bdec 🐛 Fix incorrect auth cookie decoding on first stage session middleware 2022-12-16 09:33:24 +01:00
Andrey Antukh 226afe98e0 💄 Change worker logging 2022-12-15 11:33:10 +01:00
Andrey Antukh db7920435b :sparkless: Add more project events to webhooks 2022-12-15 11:28:18 +01:00
Andrey Antukh bdd00be5e4 🐛 Fix incorrect deduplication of tasks on webhooks 2022-12-15 11:27:43 +01:00
Andrey Antukh 6eedb5315b 🐛 Properly remove qualified keys on audit/replace-props 2022-12-15 11:26:19 +01:00
Eva 7045496a39 Improve dashboard accessibility 2022-12-15 09:17:14 +01:00
Andrey Antukh 02f29ed4d0 🎉 Add webhooks to the API doc 2022-12-15 08:18:29 +01:00
Andrey Antukh 6ea0279c9e Improve webhook URI validation 2022-12-14 16:22:13 +01:00
Andrey Antukh 6a7a25121e Improve default update-file webhook batch timeout 2022-12-14 16:22:13 +01:00
Andrey Antukh a8f65ba69e 💄 Fix linter issues 2022-12-14 16:22:13 +01:00
Andrey Antukh 096b5f096c 📎 Add some cosmetic changes to kondo config 2022-12-14 16:22:13 +01:00
Andrey Antukh 842463ed1b 🎉 Add the ability to copy team invitation link 2022-12-14 16:22:13 +01:00
Andrey Antukh 7d2e3a0864 🔥 Remove deprecated RPC methods 2022-12-14 16:22:13 +01:00
Andrey Antukh c2ced974b1 📎 Add missing doc/added metadata on fonts related RPC methods 2022-12-14 16:22:13 +01:00
Andrey Antukh 653b6bdb42 🔥 Remove old deprecated method from fonts queries RPC 2022-12-14 16:22:13 +01:00
Andrey Antukh c820c49fc5 Add generic (blocking) retry macro
And use it on audit handling
2022-12-14 16:22:13 +01:00
Andrey Antukh 7a9172560d ♻️ Move teams queries and mutations to commands 2022-12-14 16:22:13 +01:00
Andrey Antukh be5053ce22 Use the same value for created_at and tracked_at on audit 2022-12-14 16:22:13 +01:00
Andrey Antukh 44e87e75e6 🐛 Fix unexpected redirect on invitation acceptation 2022-12-14 16:22:13 +01:00
Alejandro c9ad82edc3 Merge pull request #2642 from penpot/niwinz-backend-webhooks-4
🎉 Add webhooks processing & errors UI integration
2022-12-14 15:53:11 +01:00
Alejandro 430752383b Merge pull request #2664 from penpot/alotor-improve-thumbnails
 Improve thumbnail generation
2022-12-14 15:26:41 +01:00
alonso.torres e9064611cf Improve thumbnail generation 2022-12-14 14:38:56 +01:00
alonso.torres 2ce36ce052 Merge remote-tracking branch 'origin/staging' into develop 2022-12-14 13:01:23 +01:00
Alejandro 56870ad68e Merge pull request #2663 from penpot/alotor-hotfix-problem-with-texts
🐛 Fix problem with auto-width/auto-height + lock-proportions
2022-12-14 12:50:18 +01:00
alonso.torres 7507a3b74f 🐛 Fix problem with auto-width/auto-height + lock-proportions 2022-12-14 12:47:12 +01:00
Pablo Alba 84903ae1f2 🐛 Fix unable to select text at assets inputs in firefox 2022-12-14 12:00:06 +01:00
Andrey Antukh 507800ae4e Merge pull request #2659 from penpot/alotor-flex-layout-features
Flex layout features
2022-12-14 09:07:40 +01:00
Andrey Antukh d56082307b 🎉 Add update-file (batched) to webhooks 2022-12-13 23:14:55 +01:00
Andrey Antukh 782f2ed57d 🎉 Enable comments events on webhooks 2022-12-13 23:13:48 +01:00
Andrey Antukh d7459db292 🎉 Add task deduplication by label 2022-12-13 23:13:11 +01:00
Pablo Alba fd7d189bb7 💄 Change style of cancel button on webhooks modal 2022-12-13 22:22:21 +01:00
alonso.torres 5aaaab4f80 Show ghost when moving elemets from/into layout 2022-12-13 17:45:47 +01:00
alonso.torres 03228a9801 🐛 Fix problem with snap pixel 2022-12-13 17:45:47 +01:00
alonso.torres 2fbd1d8078 🐛 Fix problem with hug and item margins 2022-12-13 17:45:47 +01:00
alonso.torres 029efefb62 Import/export layout data 2022-12-13 16:43:28 +01:00
Andrey Antukh ae79ee435e 🎉 Add many rpc calls to webhooks registry 2022-12-13 16:17:31 +01:00
Andrey Antukh 240e480b2e 🎉 Allow application/json on Accept header 2022-12-13 16:17:31 +01:00
Andrey Antukh f2b60261f8 🎉 Add tests for webhooks rpc and logger 2022-12-13 16:17:31 +01:00
Andrey Antukh 21abd98b95 Integrate error handling for webhooks UI 2022-12-13 16:17:31 +01:00
Andrey Antukh edaa62b05b 💄 Replace us/assert with us/assert! on dashboard data ns 2022-12-13 16:17:31 +01:00
Andrey Antukh 5b9f0ed0b1 🎉 Add webhook processing worker 2022-12-13 16:17:31 +01:00
Andrey Antukh d768711caa Improve null handling on more db helpers 2022-12-13 16:17:31 +01:00
Andrey Antukh d584ae5a0f Improve json encode/decode api 2022-12-13 16:17:31 +01:00
Andrey Antukh 9debfa3b27 📎 Minor cange on exception formating 2022-12-13 16:17:31 +01:00
Andrey Antukh c0a4b7dc76 Improve worker queue management
and add specific worker instance for webhooks
2022-12-13 16:17:31 +01:00
Andrey Antukh 7f589b09ca ♻️ Move audit http handler to RPC 2022-12-13 16:17:31 +01:00
Andrey Antukh 27c4cdb5f9 Merge pull request #2658 from penpot/palba-inspect-bugs
Fix inspect bugs
2022-12-13 13:16:27 +01:00
Andrey Antukh fb0cf6fcbc 📎 Revert some hacky code from previous commit 2022-12-13 13:14:44 +01:00
Andrey Antukh 7ca74c0467 📎 Fix unexpected linter issue 2022-12-13 12:58:57 +01:00
Pablo Alba cd6aa8f691 🐛 Fix can't select a board in inspect mode 2022-12-13 12:57:32 +01:00
Pablo Alba 90bc9943bc 🐛 Fix expand right sidebar on workspace inspect 2022-12-13 12:46:53 +01:00
Andrey Antukh fe7b4331d1 Merge pull request #2653 from penpot/alotor-poc-improve-transform
♻️ Changed transform calculation
2022-12-13 12:37:18 +01:00
alonso.torres e1de3ba5e7 ♻️ Changed transform calculation 2022-12-13 12:36:54 +01:00
Eva Marco 5cd108c21a Merge pull request #2657 from penpot/palba-inspect-bugfixing
🐛 Fix flex elemen info doesn't show on inspect tab
2022-12-13 11:59:54 +01:00
Andrey Antukh c53420c1f5 Merge pull request #2655 from penpot/eva-fix-login-icon
🐛 Fix home icon in login page
2022-12-13 08:47:45 +01:00
Pablo Alba 05e437ee06 🐛 Fix flex elemen info doesn't show on inspect tab 2022-12-12 16:56:25 +01:00
Eva d0d63169e2 🐛 Fix home icon in login page 2022-12-12 16:53:05 +01:00
Andrey Antukh c148326d1c Merge pull request #2648 from penpot/palba-empty-inspect
🎉 Add placeholder for empty inspect tab
2022-12-12 15:32:18 +01:00
Pablo Alba 76a19a82c3 🎉 Add placeholder for empty inspect tab 2022-12-12 15:26:36 +01:00
Andrey Antukh 4d1a22bd11 Merge pull request #2606 from penpot/eva-a11y-login
 Improve login accessibility
2022-12-12 13:53:15 +01:00
Eva 95a18fce8d Improve login accessibility 2022-12-12 13:52:58 +01:00
Andrey Antukh 8bc265a598 Merge pull request #2647 from penpot/alotor-flex-ui-changes
 Changes to the flex UI
2022-12-12 13:50:30 +01:00
alonso.torres de6cba8c0b Changes to the flex UI 2022-12-12 13:50:14 +01:00
Andrey Antukh f2fe1dd6f8 Merge pull request #2645 from penpot/palba-webhooks-flag
🎉 Add flag for enabling webhooks
2022-12-12 13:47:33 +01:00
Andrey Antukh 2ec479afd4 Merge pull request #2651 from penpot/alotor-fix-empty-thumbnails
🐛 Fix problems with empty thumbnails
2022-12-12 13:45:03 +01:00
Andrey Antukh 67682fe211 🐛 Fix shape exportation 2022-12-12 07:34:11 +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
Andrey Antukh 79f27a849c Merge pull request #2652 from ryanbreen/fix-duplicate-require
💄 Remove duplicate require in backend/dev/user.clj
2022-12-10 14:21:08 +01:00
Ryan Breen f607540f23 💄 Remove duplicate require in backend/dev/user.clj
Cleanup a duplicate require of srepl

Signed-off-by: Ryan Breen <rbreen@zmags.com>
2022-12-10 07:14:00 -05:00
alonso.torres 8609308cb4 🐛 Fix problems with empty thumbnails 2022-12-10 00:08:01 +01:00
Andrey Antukh 28f1e671cb Merge pull request #2650 from ryanbreen/comment-move-fix
🐛 Fix moving comment threads
2022-12-09 23:31:04 +01:00
Ryan Breen c411ce248e 🐛 Fix moving comment threads
Moving comment threads was failing with assert errors because the speced type is gpt/point whereas update-comment-thread-position was passing a raw map of coordinates.

Signed-off-by: Ryan Breen <rbreen@zmags.com>
2022-12-09 13:35:02 -05:00
Pablo Alba cae0311db6 🌐 Added translation for: Korean. 2022-12-09 16:36:55 +01:00
Pablo Alba d283c6418e 🎉 Add flag for enabling webhooks 2022-12-09 13:00:23 +01:00
alonso.torres 415a3cad7b Calculate selrect from points 2022-12-09 11:01:24 +01:00
Andrey Antukh 36d2f72768 Merge pull request #2640 from penpot/alotor-performance-enhance
Flex layout fixes
2022-12-07 15:39:53 +01:00
alonso.torres a64d92b005 Change default parameters on selection to layout 2022-12-07 15:05:38 +01:00
alonso.torres 172f4c142b Remove unused functions 2022-12-07 15:05:38 +01:00
alonso.torres 4b55c7a8e0 🐛 Fix problem with text not growing the hug container 2022-12-07 15:05:38 +01:00
alonso.torres 7dbe39b1b5 🐛 Fix problems with cache and thumbnails 2022-12-07 15:05:38 +01:00
alonso.torres 6c2d2e142b Improve reflow texts 2022-12-07 15:05:38 +01:00
Andrey Antukh 2183599c8d Merge pull request #2639 from penpot/palba-webhooks-crud
🎉 Add team webhooks section
2022-12-07 14:39:02 +01:00
Pablo Alba cdbfec4f19 🎉 Add team webhooks section 2022-12-07 14:08:14 +01:00
Pablo Alba cb7354a19c Merge pull request #2638 from penpot/superalex-fix-move-the-content-of-a-group-generates-orphan-elements
🐛 Fix move content of a group generates orphan elements
2022-12-07 08:57:19 +01:00
Alejandro Alonso 3157ad79a5 🐛 Fix move content of a group generates orphan elements 2022-12-07 08:38:04 +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
Pablo Alba 02d619ed48 Merge pull request #2635 from penpot/niwinz-backend-webhooks-3
🎉 Add webhook RPC API
2022-12-05 17:06:38 +01:00
Andrey Antukh d97afa0e6d 📎 Add helper/devenv script for kill nonresponsive repl 2022-12-05 15:20:29 +01:00
Andrey Antukh baade567ca 📎 Improve bundle run template script 2022-12-05 15:20:29 +01:00
Andrey Antukh 39b9daa3a7 🎉 Add webhooks rpc API 2022-12-05 15:20:29 +01:00
Pablo Alba d8bb62c498 🐛 Fix layer drag enabled on chrome when is readonly 2022-12-05 10:37:56 +01:00
Alejandro b45a0a979b Merge pull request #2613 from penpot/niwinz-backend-webhooks-2
♻️ Refactor audit and http client module
2022-12-05 10:34:48 +01:00
Andrey Antukh 861328af3e ⬆️ Update promesa library to 10.0.570 2022-12-05 09:06:24 +01:00
Andrey Antukh 8bad9d8340 ♻️ Refactor loggers/audit, auth/oidc, and http/clent modules 2022-12-05 08:53:00 +01:00
Andrey Antukh 7f7efc5760 Improve exception formating on backend 2022-12-05 08:51:54 +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
alonso.torres e43fc0feb0 🐛 Fix masks in layout flex 2022-12-02 10:21:34 +01:00
alonso.torres e53e715861 Disable feature toggle for layout flex 2022-12-02 10:21:34 +01:00
alonso.torres 32350bcf87 Improved performance for auto-width/auto-height texts 2022-12-02 10:21:34 +01:00
alonso.torres 29b1b4dbc9 🐛 Fix problem with hug layout and groups 2022-12-02 10:21:34 +01:00
Andrey Antukh 2c558a6a02 Merge pull request #2625 from penpot/hiru-detect-version-import
 Include features info in exported zipfiles
2022-12-02 09:19:28 +01:00
Andrey Antukh 95876c271c Merge pull request #2619 from penpot/hiru-fix-blank-page-import
🐛 Fix adding an extra blank page on import
2022-12-01 17:55:51 +01:00
Andrey Antukh ccff27ac23 Merge pull request #2628 from penpot/hiru-fix-touched-import
🐛 Avoid setting touched flags in imported components
2022-12-01 17:55:30 +01:00
Andrés Moya 148f6cb3c2 🐛 Fix adding an extra blank page on import 2022-12-01 17:15:20 +01:00
alonso.torres c9dbeec689 🐛 Fix right sidebar style 2022-12-01 17:12:08 +01:00
Andrés Moya 2b7c967920 🐛 Avoid setting touched flags in imported components 2022-12-01 16:01:51 +01:00
Andrés Moya 94cdd4a481 Include features info in exported zipfiles 2022-12-01 15:33:13 +01:00
Andrey Antukh 296b6c646e 🐛 Fix incorrect flag parsing on frontend features 2022-12-01 15:02:56 +01:00
Alejandro Alonso ad491ccc8f Merge remote-tracking branch 'origin/staging' into develop 2022-12-01 14:50:26 +01:00
Andrey Antukh ca7ebdcc8f Merge pull request #2626 from penpot/superalex-fix-paste-svg-leads-to-internal-server-error
🐛 Fix paste svg leads to internal server error
2022-12-01 14:29:33 +01:00
Alejandro efb4b2cb7d Merge pull request #2623 from penpot/niwinz-parse-frontend-features-from-flags
 Parse frontend features from flags
2022-12-01 14:28:19 +01:00
Alejandro Alonso 92403f2afe 🐛 Fix paste svg leads to internal server error 2022-12-01 14:25:35 +01:00
Andrey Antukh 0e949679d9 Parse frontend features from flags
Simplifies setting features on deployments.
2022-12-01 13:43:57 +01:00
Alejandro 1b8e4dfdfa Merge pull request #2621 from penpot/superalex-fix-develop
🐛 Fix develop branch
2022-12-01 11:48:34 +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
Alejandro Alonso afe8883e37 🐛 Fix develop branch 2022-12-01 11:42:18 +01:00
Andrey Antukh d5398e672f Merge pull request #2614 from penpot/superalex-support-library-colors-on-library-build
🎉 Add support assets management via library
2022-12-01 11:32:29 +01:00
Alejandro Alonso 3252088494 🎉 Add support typography management via library 2022-12-01 11:30:37 +01:00
Alejandro Alonso fffacf3552 🎉 Add support media management via library 2022-12-01 11:30:33 +01:00
Alejandro Alonso a19417417a 🎉 Add support components managemente via library 2022-12-01 11:30:29 +01:00
Alejandro Alonso 4c1f2cfded 🎉 Add support color management via library 2022-12-01 11:30:24 +01:00
Alejandro Alonso a907041564 Merge remote-tracking branch 'origin/staging' into develop 2022-12-01 10:57:32 +01:00
Andrey Antukh dff4552549 🐛 Set runtime *assert* value to false on release build 2022-12-01 09:31:38 +01:00
Andrey Antukh a4acdd1886 📎 Explicitly disable features on code 2022-12-01 08:56:23 +01:00
Pablo Alba c1a1120137 Merge pull request #2601 from penpot/superalex-fix-paste-elements-from-outside-penpot-respect-hierarchy
🐛 Fix paste elements from outside penpot respect hierarchy
2022-11-30 16:40:30 +01:00
Andrey Antukh 32cd32649e Merge pull request #2617 from penpot/palba-workspace-inspect-tab
🎉 Add inspect tab to workspace
2022-11-30 14:56:52 +01:00
Andrey Antukh 678b6a285f Merge pull request #2616 from penpot/hiru-pretty-debug
💄 Make cleaner debug logs
2022-11-30 14:56:20 +01:00
Andrés Moya de1a3de433 💄 Make cleaner debug logs 2022-11-30 14:07:56 +01:00
Pablo Alba 412564b418 🎉 Add inspect tab to workspace 2022-11-30 13:55:09 +01:00
Andrey Antukh c451c7bb9d 🐛 Fix regression on worker task handling 2022-11-30 13:13:11 +01:00
alonso.torres be24989eab 🐛 Fix problem with hug layout 2022-11-30 12:21:00 +01:00
alonso.torres a439fb65ce 🐛 Fix multiple selection in layout container and items 2022-11-30 11:49:08 +01:00
Andrey Antukh c98635bca1 Merge pull request #2610 from penpot/alotor-performance-enhance
Alotor performance enhance
2022-11-30 10:42:09 +01:00
alonso.torres 0d2b228eb7 Keep group constraint behaviour inside flex layout 2022-11-30 10:00:30 +01:00
alonso.torres c79d549f53 Change modifiers to records 2022-11-30 10:00:30 +01:00
alonso.torres 600f9ef071 Performance improvements 2022-11-30 10:00:30 +01:00
Andrey Antukh 04243be4a5 📎 Update frontend bench namespace 2022-11-30 10:00:30 +01:00
Andrey Antukh fc4e755f2b Optimize point functions 2022-11-30 10:00:30 +01:00
Andrey Antukh c28534555b 📎 Add minor microptimizations and tests to points->rect 2022-11-30 10:00:30 +01:00
Andrey Antukh 380cba3a72 📎 Add bench namespace to fronend/dev 2022-11-30 10:00:29 +01:00
Andrey Antukh 89a19dec5b 🎉 Add cljs optimized get-prop helper macro 2022-11-30 10:00:29 +01:00
Andrey Antukh f6305db2a8 Reorganize a bit the common.data ns 2022-11-30 10:00:29 +01:00
Andrey Antukh 197eff93e8 📎 Fix nodejs compatibility issue on uuid_impl 2022-11-30 10:00:29 +01:00
Andrey Antukh 12cc5c6c97 Merge pull request #2600 from penpot/palba-workspace-read-only
🎉 Add workspace read-only setting
2022-11-29 17:45:37 +01:00
Pablo Alba cd47c0356a 🎉 Add workspace read-only setting 2022-11-29 17:28:00 +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
Andrey Antukh 1c2a462124 Merge pull request #2596 from penpot/niwinz-backend-webhooks
 Improve scalability of the worker abstraction
2022-11-28 12:46:41 +01:00
Andrey Antukh 329b1eb6f3 📎 Fix on test initialization on CI 2022-11-28 12:37:48 +01:00
Andrey Antukh bcfb4e0f81 🐛 Fix metrics code on rpc.climit 2022-11-28 12:25:30 +01:00
Andrey Antukh 69011007ac Change execution model of storage.tmp cleaner 2022-11-28 12:21:46 +01:00
Andrey Antukh 0600b2abe4 ♻️ Make the worker abstraction more scalable
Start using redis for dispatcher to worker communication
and add the ability to start multiple threads to worker
for increase the concurrency.
2022-11-28 12:21:44 +01:00
Andrey Antukh 13a092b192 ♻️ Normalize internal naming on the worker module 2022-11-28 12:20:58 +01:00
Andrey Antukh 10bf6c5e56 ♻️ Normalize redis api and its usage in msgbus module 2022-11-28 12:20:58 +01:00
Alejandro Alonso 427e43585c 🐛 Fix strokes class 2022-11-28 09:56:52 +01:00
Andrey Antukh 667fabbdc5 Merge pull request #2602 from penpot/alotor-performance-enhance
 Viewport and hug performance enhances
2022-11-28 09:33:12 +01:00
Eva Marco 8413a8eb3e Merge pull request #2599 from penpot/niwinz-restore-search-rpc
🎉 Restore removed by mistake search rpc method
2022-11-28 09:02:05 +01:00
alonso.torres f579bb0c8d Viewport and hug performance enhances 2022-11-25 16:08:41 +01:00
Alejandro Alonso a2b70f227c 🐛 Fix paste elements from outside penpot respect hierarchy 2022-11-25 14:09:23 +01:00
Andrey Antukh 706714d557 🎉 Restore removed by mistake search rpc method 2022-11-25 10:42:17 +01:00
Andrey Antukh 399d57ace0 Merge branch 'iprithvitharun-2588-invitations-page-improvements' into develop 2022-11-24 16:53:16 +01:00
Prithvi Tharun f2525f8159 Add several improvements to invitations page 2022-11-24 16:53:00 +01:00
Andrey Antukh 0fece05cc9 Merge pull request #2598 from penpot/superalex-update-translations-from-develop
 Update translations from develop
2022-11-24 16:45:02 +01:00
Alejandro Alonso 13c7d06353 Update translations from develop 2022-11-24 16:44:36 +01:00
Andrey Antukh 9593ded808 📎 Add missing copy on postgres upgrade script 2022-11-24 13:38:53 +01:00
Andrey Antukh 99adbbe91d 📎 Add postgres-upgrade.sh script 2022-11-24 12:47:41 +01:00
Andrey Antukh 6f1c2f474b 📎 Add missing change on devenv compose 2022-11-24 12:21:58 +01:00
Andrey Antukh 0061b37c13 Merge pull request #2597 from penpot/alotor-performance-enhance
 Improve transforms performance
2022-11-24 11:06:34 +01:00
alonso.torres 69bb4654c9 Improve transforms performance 2022-11-24 10:01:37 +01:00
Eva 694d90d485 Add id functionality to undo transactions 2022-11-24 10:00:32 +01:00
Eva 32746a5960 🐛 Fix some layout errors 2022-11-24 10:00:32 +01:00
Andrey Antukh 7c3f87d7b0 Merge pull request #2585 from penpot/superalex-fix-show-board-miniature-in-manual-overlay-setting
🐛 Fix show board miniature in manual overlay setting
2022-11-24 09:07:17 +01:00
Alejandro Alonso b4e4a5cab4 🐛 Fix show board miniature in manual overlay setting 2022-11-24 09:06:42 +01:00
Andrey Antukh c12c9a4419 Merge pull request #2566 from penpot/hiru-remove-graphics-popup
 Enhance modal of convert graphics into components
2022-11-24 09:06:04 +01:00
Andrés Moya cc60cfc86d Enhance modal of convert graphics into components 2022-11-24 09:05:50 +01:00
Andrey Antukh 879c477ada Merge remote-tracking branch 'origin/staging' into develop 2022-11-24 08:52:35 +01:00
Alejandro 0a72859424 Merge pull request #2594 from penpot/niwinz-compatibility-fixes
🐛 Fix compatibility issue with 1.17.x file table changes
2022-11-23 14:49:16 +01:00
Andrey Antukh 6b7adec617 Merge pull request #2592 from penpot/palba-handoff-improvements
 Add several improvements to handoff
2022-11-23 13:49:36 +01:00
Andrey Antukh e7865b8643 🐛 Fix compatibility issue with 1.17.x file table changes 2022-11-23 12:44:04 +01:00
Pablo Alba 461e5cb376 Add several improvements to handoff 2022-11-23 09:44:04 +01:00
Andrey Antukh 77a397de0c Merge pull request #2586 from penpot/hiru-fix-min-size
🐛 Fix min size when creating shapes
2022-11-23 09:39:18 +01:00
Andrey Antukh c656dd146c Merge pull request #2589 from penpot/alotor-fixes
Flex layout fixes
2022-11-22 17:15:40 +01:00
alonso.torres 441e142349 🐛 Fix reflow layout when changes in paths and texts 2022-11-22 17:08:23 +01:00
alonso.torres 54fd836dd4 🐛 Fix problem when dragging layout children with frames 2022-11-22 16:41:44 +01:00
alonso.torres 7ffdf21657 🐛 Fix paste shapes into layout 2022-11-22 16:40:20 +01:00
Andrés Moya 8a6f1d82e5 🐛 Fix min size when creating shapes 2022-11-22 15:38:04 +01:00
Andrey Antukh 87ebb2e24c ⬆️ Update yetti dependency to v9.11 2022-11-22 14:06:14 +01:00
Andrey Antukh 9334138510 🐛 Fix persistence loop on dev code hot reload 2022-11-22 14:06:14 +01:00
Andrey Antukh 1b9dea01e2 🔥 Remove unused d/update-vals function
Already available as clojure.core/update-vals
2022-11-22 14:06:14 +01:00
Andrey Antukh ccb7c466bf 🎉 Add lazy loading and storage/pointer-map support on viewer 2022-11-22 14:06:14 +01:00
Andrey Antukh c72be4ae2a ⬆️ Update redis and postgresql on devenv docker 2022-11-22 14:06:14 +01:00
Andrey Antukh fbd042d4ee 🐛 Remove not working chrono-units on duration constructor 2022-11-22 14:06:14 +01:00
Andrey Antukh bbf95434d8 🎉 Add lazy loading and storage/pointer-map support on workspace
This also rewrites the workspace load process making it a bit more
efficient independently if lazy loading is used.
2022-11-22 14:06:14 +01:00
alonso.torres 2a46989ec9 🐛 Fix problem with flex direction 2022-11-22 12:06:12 +01:00
alonso.torres baf9124304 🐛 Fix problem with texts in viewer 2022-11-22 12:05:59 +01:00
Andrey Antukh c69d4820cb Merge pull request #2584 from penpot/superalex-add-core-ui-to-libraries-and-templates-carousel 2022-11-22 11:50:36 +01:00
Alejandro Alonso 7d48714aa2 🎉 Add core-ui to libraries and templates carousel 2022-11-22 11:50:15 +01:00
Prithvi Tharun 6565655ac3 🐛 Fix the corners icon name
Closes #2581
2022-11-22 11:46:32 +01:00
Andrey Antukh d886889334 Merge pull request #2578 from penpot/superalex-interaction-open-url-after-delay-duplicate-tab
🐛 Interaction for open url after delay duplicates tab
2022-11-22 11:45:38 +01:00
Alejandro Alonso a95a7b9f90 🐛 Fix interaction for open url after delay duplicates tab 2022-11-22 11:45:18 +01:00
Pablo Alba 3d381b92d9 Merge pull request #2580 from iprithvitharun/2579-updating-login-error-msg
 Login error message updated
2022-11-21 16:45:53 +01:00
Prithvi Tharun 08399ebac1 Error message updated
Updated to be accurate and concise.
2022-11-21 19:31:33 +05:30
Andrey Antukh 6a296a3e52 Merge pull request #2575 from penpot/hiru-reset-changes-deleted-component 2022-11-21 13:59:05 +01:00
Andrés Moya af03f720b0 Allow to reset changes from a deleted component 2022-11-21 13:58:31 +01:00
Andrey Antukh 5400fdb293 Merge pull request #2573 from penpot/hiru-delete-copy-elements
🎉 When deleting a shape inside a component copy, just hide it
2022-11-21 11:56:50 +01:00
Andrés Moya 831839080f 🎉 When deleting a shape inside a component copy, just hide it 2022-11-21 11:56:15 +01:00
Andrey Antukh 8b7310032b Merge pull request #2562 from penpot/hiru-show-main-component
 Improve show main component menu
2022-11-20 20:26:07 +01:00
Andrés Moya 848f5125d8 Improve show main component menu 2022-11-20 20:25:53 +01:00
Andrey Antukh 9fd778f9c1 Merge pull request #2561 from penpot/hiru-bulk-import-graphics 2022-11-20 20:24:55 +01:00
Andrés Moya ce7852329a 🎉 Add the ability to create components in bulk from images 2022-11-20 20:24:33 +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
Pablo Alba 527e4643da Merge pull request #2565 from penpot/eva-autolayout-code
Eva autolayout code
2022-11-18 13:17:13 +01:00
Eva e3616ea2b5 🔧 Update highlight.js library 2022-11-18 09:42:50 +01:00
Eva 2a2b5c7dba Add code block to layout elements 2022-11-18 09:42:50 +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
Alejandro Alonso 93bbe1b2f8 Merge remote-tracking branch 'origin/staging' into develop 2022-11-17 12:21:56 +01:00
Alejandro Alonso dbd8c12ac0 📎 Update changes and version files 2022-11-17 12:14:40 +01:00
Pablo Alba ff0b031c8b 🐛 Fix colorpicker does not close upon switching to Dashboard 2022-11-17 12:11:30 +01:00
Andrey Antukh 9981bc7c9a Merge pull request #2563 from penpot/superalex-add-extra-info-to-add-asset-to-library-event
 Add extra info to add-asset-to-library event
2022-11-17 11:41:01 +01:00
Andrey Antukh 3de217a52e Merge pull request #2537 from penpot/alotor-autolayout-v2
Autolayout & refactor transformations
2022-11-17 11:35:41 +01:00
Alejandro Alonso d5bb486de1 Add extra info to add-asset-to-library event 2022-11-17 10:09:40 +01:00
alonso.torres afa6a97693 Fixes problem with bool shapes 2022-11-17 09:29:47 +01:00
alonso.torres 32756db1c1 Redone the calculus of sizing auto 2022-11-17 09:29:47 +01:00
alonso.torres efc1b87ab0 Performance improvements 2022-11-17 09:29:47 +01:00
alonso.torres 7b2f0303e8 Fixed problems with masks 2022-11-17 09:29:47 +01:00
alonso.torres 4c5e8f42ce Review changes 2022-11-17 09:29:47 +01:00
alonso.torres 6e35b5c6b6 Fixed problem with new modifiers and text auto-heigh 2022-11-17 09:29:47 +01:00
alonso.torres 39041bb63b Fix problem with constraints 2022-11-17 09:29:47 +01:00
Eva 56efb571be Add add flex layout option in context menu 2022-11-17 09:29:47 +01:00
alonso.torres c1affe75e1 Fix problem with fixed constraints 2022-11-17 09:29:47 +01:00
alonso.torres cdaba395c4 Small fixes for flex layout 2022-11-17 09:29:45 +01:00
alonso.torres e61e76a074 Fix problems with flipped layouts 2022-11-17 09:29:31 +01:00
alonso.torres a2e26210d1 Renamed modifiers functions 2022-11-17 09:29:31 +01:00
alonso.torres b5df7bbfc5 Remove constraints when autolayout 2022-11-17 09:29:30 +01:00
alonso.torres 7375eed18f Refactor modifiers 2022-11-17 09:29:03 +01:00
alonso.torres 861eb283e8 Flex layout small fixes 2022-11-17 09:29:03 +01:00
alonso.torres c86d88834e Fix problems moving frames 2022-11-17 09:29:03 +01:00
alonso.torres 7caf4b9136 Removed constraints when layout child 2022-11-17 09:29:03 +01:00
alonso.torres 4ecc166055 Remove fill/auto when resizing 2022-11-17 09:29:03 +01:00
alonso.torres 7f0054959f Hug content to frames 2022-11-17 09:29:03 +01:00
alonso.torres 0274567d83 Visual adjustments 2022-11-17 09:29:03 +01:00
alonso.torres cebda20dd4 Adapt to handoff changes 2022-11-17 09:29:03 +01:00
alonso.torres 94602feab1 Updated translation keys 2022-11-17 09:29:03 +01:00
alonso.torres 503a1dabac Align self and stretch fixes 2022-11-17 09:29:03 +01:00
alonso.torres 81d2f9dd9d Adds align-content options 2022-11-17 09:29:03 +01:00
alonso.torres 4b61e3228f Add min/max width/height for elements 2022-11-17 09:29:03 +01:00
alonso.torres b8c90fdcf3 Refactor flex layout namespace 2022-11-17 09:29:03 +01:00
alonso.torres 58fd20094a Adapted dynamic modifiers and options for new modifiers 2022-11-17 09:29:03 +01:00
alonso.torres af098bb64d Adds integration with new UI 2022-11-17 09:29:03 +01:00
alonso.torres 11f347941e Refactor for new modifiers 2022-11-17 09:29:03 +01:00
alonso.torres c3ed46d3ab Move auto-layout children 2022-11-17 09:29:03 +01:00
alonso.torres 025cac0228 Drop-zone autolayout calculation 2022-11-17 09:29:03 +01:00
alonso.torres 8bcb9e1976 Autofill vectors calculation 2022-11-17 09:29:03 +01:00
alonso.torres bc890a0b33 Refactor frames 2022-11-17 09:29:03 +01:00
alonso.torres 8d9ed4f8af Fill elements in auto-layout 2022-11-17 09:29:03 +01:00
alonso.torres c01c46041d Adds autolayout positions calculations 2022-11-17 09:29:02 +01:00
alonso.torres 5050c35257 Adds layout items options 2022-11-17 09:26:17 +01:00
Pablo Alba 3c424786a7 Show board miniature in manual overlay setting 2022-11-16 14:31:44 +01:00
Pablo Alba 1affb53a26 Better overlays interactions on boards inside boards 2022-11-16 14:31:44 +01:00
Andrey Antukh 58dbe21544 Merge branch 'hiru-remove-graphics' into develop 2022-11-14 14:44:55 +01:00
Andrés Moya 6b1ecfd89c 📎 Add some code enhancements 2022-11-14 14:44:18 +01:00
Andrés Moya 20738545b8 🎉 Transform graphics into components 2022-11-11 09:56:40 +01:00
Pablo Alba 2cd8b65a5c 🐛 Fix colorpicker does not close upon switching to Dashboard 2022-11-10 15:50:43 +01:00
Andrey Antukh 8852ed815f 🐛 Fix unexpected exception on file-gc cron task 2022-11-10 14:54:50 +01:00
Andrey Antukh fde03e21b0 🎉 Add conditional reading to RPC 2022-11-10 14:54:50 +01:00
Andrey Antukh 5192b36669 💄 Add some cosmetic adjustements 2022-11-10 14:54:50 +01:00
Andrey Antukh b20d2badfe Load workspace thumbnails in a separated request 2022-11-10 14:54:50 +01:00
Andrey Antukh dfb73192b8 📎 Change rpc middleware order (minor) 2022-11-10 14:54:50 +01:00
Andrey Antukh 59ba87d9cd Properly report malformed json error 2022-11-10 14:54:50 +01:00
Andrey Antukh 38ed3b076a 🔥 Remove unused config entry 2022-11-10 14:54:50 +01:00
Andrey Antukh f3472fcd79 📚 Add documentation to objects and pointer map namespaces 2022-11-08 13:02:14 +01:00
Andrey Antukh 3ef99c287e ♻️ Refactor tests directory structure 2022-11-08 13:02:14 +01:00
Andrey Antukh 12e2d3ad96 📎 Rename app-tests to backend-tests for naming consistency 2022-11-08 13:02:14 +01:00
Andrey Antukh 0dc3dba428 📎 Set definitive fressian handler ids for objects and pointer map 2022-11-08 13:02:14 +01:00
Andrey Antukh efb0ec46bf 🎉 Add tests for pointer map 2022-11-08 13:02:14 +01:00
Andrey Antukh aa9e125e31 🎉 Add tests for objects map 2022-11-08 13:02:14 +01:00
Andrey Antukh 16afa90b9c Improve internal impl of objects-map 2022-11-08 13:02:14 +01:00
Andrey Antukh fa93e5a1a7 ♻️ Refactor backend tests directory tree 2022-11-08 13:02:14 +01:00
Andrey Antukh 1298956d92 Improve srepl helpers for activate profile 2022-11-08 13:02:14 +01:00
Andrey Antukh 67b4d5a1c7 🐛 Fix issues when RPC returns nil values 2022-11-08 13:02:14 +01:00
Andrey Antukh bfccae2373 🔥 Remove unused namespace 2022-11-08 13:02:14 +01:00
Andrey Antukh 5d9606f4d0 📎 Update .gitignore file 2022-11-08 13:02:14 +01:00
Andrey Antukh 76333cec26 🎉 Integrate storage/pointer-map file feature 2022-11-08 13:02:14 +01:00
Andrey Antukh a42d7164ad 🎉 Add more helpers on srepl ns 2022-11-08 13:02:14 +01:00
Andrey Antukh c027de2592 Make nil safe some decode helpers on db ns 2022-11-08 13:02:14 +01:00
Andrey Antukh ce99ca0aa8 🎉 Add generic PointerMap abstraction 2022-11-08 13:02:14 +01:00
Andrey Antukh 751b99bf47 ⬆️ Update devenv dockerfiles 2022-11-08 13:02:14 +01:00
Andrey Antukh 67fc499001 Merge branch 'niwinz-enhancements' into develop 2022-11-07 16:57:35 +01:00
Andrey Antukh 6713d8eb3f Make metrics more modular 2022-11-07 11:18:22 +01:00
Andrey Antukh e36d611f19 🔥 Remove obsolete code from scripts/repl 2022-11-07 11:17:49 +01:00
Andrey Antukh 111cf54ff6 ♻️ Refactor common module tests and add generative testing for types 2022-11-07 10:22:16 +01:00
Andrey Antukh 1f73558f1b 📎 Fix linter issues 2022-11-07 10:05:56 +01:00
Andrey Antukh 37ad04d2a6 🎉 Add robust concurrency limiter for RPC 2022-11-07 10:05:56 +01:00
Andrey Antukh 6ad9a5aadb 🐛 Fix many bugs on rlimit module 2022-11-07 08:37:43 +01:00
Andrey Antukh 9c33dc529d Improve error report list template 2022-11-07 08:37:43 +01:00
Andrey Antukh 82d72fd388 🐛 Add missing profile-id on the internal error reports 2022-11-07 08:37:43 +01:00
Andrey Antukh 43ab19f690 ♻️ Refactor (minor) of http session code
The rationale behind the refactor:
- Make available profile data to other middlewares without
  the need to access to the database (mainly for error reporting).
- Align with codestyle with the rest of internal modules.
- Simplify code.
2022-11-07 08:37:43 +01:00
Andrey Antukh dbe516f725 ⬆️ Update deps (bugfixes on deps) 2022-11-07 08:37:43 +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
Andrey Antukh 2af28fef80 🐛 Fix autodetect language issues 2022-11-03 16:18:14 +01:00
Andrey Antukh 0548fdb43d 🎉 Backport v5 blob format (lz4 framed, less gc) 2022-11-03 16:18:14 +01:00
Andrés Moya 358d25680b 🐛 Yet some more typos 2022-11-03 15:37:05 +01:00
Andrey Antukh 57e7691e66 Merge remote-tracking branch 'origin/staging' into develop 2022-11-03 14:14:27 +01:00
Andrés Moya ee4f063889 🐛 Fix one more typo 2022-11-03 14:13:31 +01:00
Andrés Moya 38d74b93b3 🐛 Fix some typos in library modals 2022-11-03 14:11:48 +01:00
Andrey Antukh 99aea77355 Merge pull request #2545 from penpot/palba-fix-sleep
🐛 Fix sleep
2022-11-03 09:01:46 +01:00
Pablo Alba 8b988e0f1f 📎 Fix linter (unused line on loki) 2022-11-03 08:57:14 +01:00
Pablo Alba 4be9d58181 🐛 Fix sleep 2022-11-03 08:55:28 +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
Andrey Antukh a85a65a554 Merge branch 'staging' into develop 2022-10-31 10:44:15 +01:00
Andrey Antukh 2f423a9add Merge branch 'main' into staging 2022-10-31 10:38:32 +01:00
Andrey Antukh abbdd13b5d 📎 Update changelog 2022-10-31 10:31:52 +01:00
Andrey Antukh b681e40af0 Merge tag '1.16.0-beta-hotfix-5' 2022-10-31 10:31:25 +01:00
Andrey Antukh b669047f83 📎 Update changelog 2022-10-31 10:29:35 +01:00
Andrey Antukh 29ec7ca0c6 Merge remote-tracking branch 'origin/main' into staging 2022-10-31 10:28:50 +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
Pablo Alba f276910ce3 🐛 fix bad behaviour on hovering and click nested artboards 2022-10-28 11:47:26 +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
Pablo Alba 508f3161b0 Merge pull request #2534 from penpot/eva-nudge-default
Eva nudge default
2022-10-27 13:24:19 +02:00
Eva d663d2bebf Add new handoff flex item section" 2022-10-27 12:17:25 +02:00
Andrés Moya c3fe8c8ebd 🐛 Upgrade gitpod docker file 2022-10-27 11:39:19 +02:00
Eva 21c9c205cb 🐛 Add nudge by default 2022-10-27 09:43:03 +02:00
Pablo Alba afe4250ea9 Merge pull request #2471 from penpot/eva-unpublish-several-libs
🎉 Add unpublish option on context menu
2022-10-27 07:36:33 +02:00
Pablo Alba ed3d24bdb4 Merge pull request #2533 from penpot/eva-fix-nudge
🐛 Fix nudge error
2022-10-27 07:16:05 +02:00
Eva 6eb85b2c8c 🐛 Fix nudge error 2022-10-26 17:53:08 +02:00
Eva 2375f9ab83 🎉 Add unpublish option on context menu 2022-10-26 09:25:13 +02:00
Pablo Alba 8f325e4303 Merge pull request #2485 from penpot/niwinz-new-langs
Add new langs and some fixes
2022-10-25 17:12:20 +02:00
Pablo Alba cc577a21db Merge pull request #2528 from penpot/translations
Translations
2022-10-25 17:08:28 +02:00
Pablo Alba 76b235e608 Update translations 2022-10-25 17:07:07 +02:00
Pablo Alba b98cf29134 🌐 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-25 14:22:23 +02:00
Tummas Jóhan Sigvardsen cc06bb7755 🌐 Add translations for: Faroese.
Currently translated at 7.7% (94 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-25 14:20:35 +02:00
Vin bd1003e383 🌐 Add translations for: Russian.
Currently translated at 67.1% (816 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-10-25 14:20:35 +02:00
Eva Marco 190d67a0cb Merge pull request #2505 from penpot/palba-filter-comments-st
Fix displaying comments settings are not applied via "Comments" menu …
2022-10-25 10:02:00 +02:00
Eva Marco 627f497e7f Merge pull request #2497 from penpot/palba-confirm-unpublish-library
 Confirm unpublish library on libraries popup
2022-10-25 08:59:18 +02:00
Pablo Alba f4a0b304a9 🐛 Fix displaying comments settings are not applied via "Comments" menu drop-down on the top navbar on view mode 2022-10-24 16:29:30 +02:00
Andrey Antukh 72f6905077 📎 Add commented code for easy debug release modal on ui ns 2022-10-24 12:36:43 +02:00
Andrés Moya b191df0351 🐛 Fix bug about decoding :features PgArray 2022-10-24 12:27:31 +02:00
Alejandro 6ac08df63f Merge pull request #2473 from penpot/palba-change-email-wrong-message
Fix wrong email in the info message at change email
2022-10-24 11:41:38 +02:00
Pablo Alba 821981e579 🐛 Fix wrong email in the info message at change email 2022-10-24 11:41:02 +02:00
Alejandro Alonso 02382b95f6 🐛 Fix wrong validation text after interaction with 2 and more files 2022-10-24 10:37:10 +02:00
Alejandro a1c9503fea Merge pull request #2499 from penpot/palba-boards-names-focus-mode
🐛 Fix boards name do not disappear in focus mode
2022-10-24 09:42:47 +02:00
Pablo Alba ab86d5238a 🐛 Fix boards name do not disappear in focus mode 2022-10-24 09:05:04 +02:00
Bogi Napoleon Wennerstrøm 76675e1949 🌐 Add translations for: Faroese.
Currently translated at 6.5% (80 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-22 14:05:04 +02:00
Pablo Alba 66055a0b14 Confirm unpublish library on libraries popup 2022-10-21 16:25:25 +02:00
Alejandro Alonso 2ee15c3147 Merge remote-tracking branch 'origin/staging' into develop 2022-10-21 13:22:34 +02:00
Alejandro 318563858b Merge pull request #2496 from penpot/alotor-hotfix-snap-to-pixel
🐛 Fixed problem with snap to pixel
2022-10-21 13:21:58 +02:00
alonso.torres b8a83a3479 🐛 Fixed problem with snap to pixel 2022-10-21 12:44:43 +02:00
Alejandro Alonso 52239a9670 Merge remote-tracking branch 'origin/staging' into develop 2022-10-20 12:44:58 +02:00
Alejandro 9fddc4611a Merge pull request #2490 from penpot/juan-fix-onboarding-img
🐛 Fix onboarding images
2022-10-20 12:34:05 +02:00
elhombretecla a8b2f8868d 🐛 Fix onboarding images 2022-10-20 12:27:15 +02:00
Alejandro Alonso e6b2c40441 Merge remote-tracking branch 'origin/staging' into develop 2022-10-20 12:12:54 +02:00
Alejandro Alonso 490d295f3a 🐛 Fix auto-width for texts can make text appear stretched 2022-10-20 11:57:18 +02:00
Eva e16da8bd2d 🎉 Add new flex layout menu 2022-10-20 11:53:32 +02:00
Andrey Antukh f51e35aa9c 🐛 Prevent duplicate locale watcher on hot code reload 2022-10-20 00:11:20 +02:00
Andrey Antukh 6323c3ac92 🐛 Fix autodetect language issues 2022-10-20 00:06:50 +02:00
Andrey Antukh 59e6ef5609 🎉 Add new langs (gl, ja_jp, pt_pt, hr) 2022-10-20 00:02:24 +02:00
nautilusx eafb723415 🌐 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-20 00:02:23 +02:00
Andrey Antukh 5463671db1 Merge pull request #2477 from penpot/palba-cleanup-translations
Cleanup translations
2022-10-19 16:32:07 +02:00
Pablo Alba c24596b7f9 📎 Clean old translations 2022-10-19 16:23:24 +02:00
Pablo Alba 47be9a21f4 🎉 New script to find unused translations 2022-10-19 16:23:01 +02:00
Andrey Antukh 4c133ec880 📎 Add commented code for easy debug release modal on ui ns 2022-10-19 11:17:30 +02:00
Andrés Moya 39c601a51f 🐛 Fix small import problem 2022-10-19 11:14:07 +02:00
Elhombretecla 6c2c843f0a 🎉 Fix wording 2022-10-19 11:01:02 +02:00
Elhombretecla e227e49ea6 🎉 Add new release images 2022-10-19 11:00:57 +02:00
Elhombretecla d53741b8fd 🎉 Add new release info 2022-10-19 11:00:57 +02:00
Alejandro Alonso 666631a4bd 🐛 Fix firefox changing layer color type is not applied 2022-10-19 09:58:02 +02:00
Alejandro Alonso 0a529943a2 🐛 Fix text out of borders with "auto width" and center align 2022-10-19 09:29:43 +02:00
Alejandro Alonso 08a5550547 🐛 Fix text justify align text left 2022-10-19 09:29:43 +02:00
Alejandro Alonso 6894d90137 Merge remote-tracking branch 'origin/staging' into develop 2022-10-19 09:06:11 +02:00
Andrey Antukh 3f5ac58c73 🐛 Fix unexpected exception audit archive task 2022-10-19 08:48:23 +02:00
Alejandro Alonso cdb4524c45 Merge remote-tracking branch 'origin/staging' into develop 2022-10-19 07:56:54 +02:00
Alejandro Alonso 3e21b0d8cc 📎 Update CHANGES.md file 2022-10-19 07:55:00 +02:00
Hosted Weblate 89a27e298d Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2022-10-18 20:20:18 +02:00
Hosted Weblate 9df8935d48 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2022-10-18 20:20:15 +02:00
Tummas Jóhan Sigvardsen fb3d6b04af 🌐 Add translations for: Faroese.
Currently translated at 5.5% (67 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 20:20:13 +02:00
Yaron Shahrabani 66c086d4d3 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-10-18 20:20:13 +02:00
nautilusx 5e55dddd87 🌐 Add translations for: German.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 20:20:12 +02:00
Oğuz Ersen bc0f0064ed 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-10-18 20:20:12 +02:00
Tummas Jóhan Sigvardsen ca8919dff0 🌐 Add translations for: Faroese.
Currently translated at 4.7% (58 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 20:20:11 +02:00
Stas Haas 5aeac28f36 🌐 Add translations for: German.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 20:20:11 +02:00
Pablo Alba a6113df552 🐛 Remove unused translation 2022-10-18 20:14:41 +02:00
Andrey Antukh f28b62cd3d 🐛 Fix inconsistencies on common/types specs 2022-10-18 15:49:18 +02:00
Andrey Antukh 8de1ae0478 📎 Add update-file process time log entry 2022-10-18 15:49:18 +02:00
Andrey Antukh 4fe767c169 Add missing type hints on binfile ns 2022-10-18 15:49:18 +02:00
Andrey Antukh e50137d186 Minor improvement on internal RPC metadata api 2022-10-18 15:49:18 +02:00
Andrey Antukh 8e6b93e2a7 📎 Set correct license holder on common module sources 2022-10-18 15:49:18 +02:00
Andrey Antukh 2befad433f Remove unnecesary index building on :mov-objects 2022-10-18 15:49:18 +02:00
Andrey Antukh 96af4e26b0 Improve performance issues on backend shape validation 2022-10-18 15:49:18 +02:00
Andrey Antukh 3dc2c52f64 🐛 Fix compatibility issues with jdk19 on util/async ns 2022-10-18 15:49:18 +02:00
Andrey Antukh b2cbb1e60f Update srepl helpers 2022-10-18 15:49:18 +02:00
Andrey Antukh c0eab96253 Do not return the whole file on file rename 2022-10-18 15:49:18 +02:00
Andrey Antukh 951b3eb4fe Integrate objects-map and introduce file feature flags 2022-10-18 15:49:18 +02:00
Andrey Antukh 69f084e1df Add deleted at index to file table 2022-10-18 15:49:18 +02:00
Andrey Antukh c4104c816b 🎉 Add serialization optimized ObjectsMap data type 2022-10-18 15:49:18 +02:00
Andrey Antukh 4ece0cdeda Make transit module extensible 2022-10-18 15:49:18 +02:00
Andrey Antukh b1296ef765 Make fressian module extensible 2022-10-18 15:49:18 +02:00
Andrey Antukh 5fe3842d1e 🎉 Add v5 blob format (lz4 framed, less gc) 2022-10-18 15:49:18 +02:00
Andrey Antukh d71c5e4105 📎 Add another print preference method 2022-10-18 15:49:18 +02:00
Andrey Antukh 8ad4dfe454 📎 Minor changes on user namespace 2022-10-18 15:49:18 +02:00
Andrés Moya c23167a455 Merge pull request #2474 from penpot/translations
Update Translations
2022-10-18 15:33:11 +02:00
Pablo Alba 5a6b7800d7 Update translation files 2022-10-18 13:05:14 +02:00
Pablo Alba 3e118177d0 Merge remote-tracking branch 'weblate/develop' into translations 2022-10-18 12:58:17 +02:00
Andrey Antukh aaf645bad4 Merge pull request #2459 from penpot/hiru-refactor-types
♻️ Move internal.xxx namespaces to separated files
2022-10-18 11:58:46 +02:00
Bogi Napoleon Wennerstrøm 00e724ce09 🌐 Add translations for: Faroese.
Currently translated at 4.4% (54 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 10:01:34 +02:00
Tummas Jóhan Sigvardsen 8451444861 🌐 Add translations for: Faroese.
Currently translated at 4.4% (54 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 10:01:34 +02:00
Stas Haas ef5bc687ab 🌐 Add translations for: German.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 10:01:34 +02:00
Andrés Moya 8463d501cd ♻️ Remove some undeclared namespaces 2022-10-18 09:54:47 +02:00
Andrey Antukh a59ca5b781 Merge pull request #2443 from penpot/palba-figma-plugin
🎉 Basic changes to use penpot as a library
2022-10-18 09:07:33 +02:00
Pablo Alba 369dc8ffb5 🎉 Basic changes to use penpot as a library 2022-10-18 08:51:28 +02:00
Andrés Moya 04f8bbb1f2 📚 Fix copyright 2022-10-17 16:32:00 +02:00
Alejandro Alonso 10e0cf121b Merge remote-tracking branch 'origin/staging' into develop 2022-10-17 15:21:11 +02:00
Alejandro b23ece88c2 Merge pull request #2434 from penpot/eva-fix-dragging
🐛 Fix draggin projects css
2022-10-17 15:18:51 +02:00
Eva 0765587373 🐛 Fix draggin projects css 2022-10-17 15:05:51 +02:00
Eva Marco 5c8710b8cb Merge pull request #2458 from penpot/palba-upload-font-fails-silent2
🐛 Fix custom font upload fails silently for unsupported formats
2022-10-17 13:16:32 +02:00
Pablo Alba 88cd19d21a 🐛 Fix custom font upload fails silently for unsupported formats 2022-10-17 13:10:45 +02:00
Eva Marco ac3251b29e Merge pull request #2464 from penpot/superalex-remove-imported-and-updated-extra-words
🎉 Remove imported and updated extra words
2022-10-17 13:09:15 +02:00
Alejandro Alonso a8150e1b05 🎉 Remove imported and updated extra words 2022-10-17 13:03:59 +02:00
Eva Marco e2f6274ff2 Merge pull request #2454 from penpot/superalex-fix-assertion-error-trying-to-move-board
🐛 Fix assertion error trying to move board if path tool selected
2022-10-17 12:10:41 +02:00
Alejandro Alonso c670d81a20 🐛 Fix assertion error trying to move board if path tool selected 2022-10-17 12:00:39 +02:00
Eva Marco a8e6516059 Merge pull request #2442 from penpot/superalex-fix-grid-not-syncing-in-multi-user
🐛 Fix grid not syncing in multi user
2022-10-17 09:33:43 +02:00
Alejandro Alonso 87d323bb4c 🐛 Fix grid not syncing in multi user 2022-10-17 09:28:38 +02:00
Eva Marco 4b52612682 Merge pull request #2456 from penpot/superalex-show-spinner-while-loading-viewer-file
🎉 Show spinner while loading viewer file
2022-10-17 09:02:12 +02:00
Bogi Napoleon Wennerstrøm 948bda7cc8 🌐 Add translations for: Faroese.
Currently translated at 1.0% (13 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-16 15:49:43 +02:00
Tummas Jóhan Sigvardsen 8baaae1770 🌐 Add translations for: Faroese.
Currently translated at 1.0% (13 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-16 15:49:43 +02:00
ascarida ea10ec22c2 🌐 Add translations for: Galician.
Currently translated at 30.6% (372 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-10-16 15:49:42 +02:00
Yaron Shahrabani 160e0d218b 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-10-16 15:49:42 +02:00
Andrés Moya 7e70f0ce30 ♻️ Move internal.xxx namespaces to separated files 2022-10-14 18:25:04 +02:00
Pablo Alba 0618aa32a0 Merge pull request #2407 from penpot/hiru-restore-remote-comp
🐛 Make restore component work in external libraries
2022-10-14 18:08:23 +02:00
Pablo Alba e1403d74bd Merge pull request #2453 from penpot/superalex-support-multi-style-texts
🐛 Fix comments section not scrolling
2022-10-14 18:02:49 +02:00
Alejandro Alonso 41f5fb9621 🐛 Fix comments section not scrolling 2022-10-14 18:02:07 +02:00
Alejandro Alonso 563a6da83c 🐛 Fix partially missing english translation 2022-10-14 14:50:40 +02:00
Alejandro Alonso 3395fcb697 🎉 Show spinner while loading viewer file 2022-10-14 14:12:17 +02:00
Pablo Alba b7d5960ec3 Merge pull request #2455 from penpot/superalex-fix-notification-for-newsletter-shown-in-all-cases
🐛 Fix notification for newsletter shown in all cases
2022-10-14 12:38:09 +02:00
Alejandro Alonso c690a71b3e 🐛 Fix notification for newsletter shown in all cases 2022-10-14 12:26:59 +02:00
Eva Marco b5ab9af5c9 Merge pull request #2441 from penpot/palba-gradient-handlers
🐛 Fix gradient handlers are under resize handlers
2022-10-13 16:29:29 +02:00
Pablo Alba 1e07c16633 🐛 Fix gradient handlers are under resize handlers 2022-10-13 15:55:36 +02:00
Eva Marco 9e6f12cb82 Merge pull request #2445 from penpot/palba-boards-grouped-titles
🐛 Fix boards grouped shouldn't show the title
2022-10-13 14:35:19 +02:00
Pablo Alba 00180f4fba 🐛 Fix boards grouped shouldn't show the title 2022-10-13 13:44:39 +02:00
Eva ea15735372 🐛 Fix loading placeholder 2022-10-13 12:53:49 +02:00
Pablo Alba 0f5ba91f44 Merge pull request #2440 from penpot/eva-update-icon
💄 Update action icon
2022-10-13 12:41:09 +02:00
Eva 13cb186c70 💄 Update action icon 2022-10-13 12:24:48 +02:00
Alejandro 8b1e8408f2 Merge pull request #2435 from penpot/eva-fix-loading-placeholder
🐛 Fix loading placeholder
2022-10-11 15:59:17 +02:00
Eva 796211c655 🐛 Fix loading placeholder 2022-10-11 14:16:17 +02:00
Alejandro Alonso 0afef0fa44 Merge remote-tracking branch 'origin/staging' into develop 2022-10-11 14:02:51 +02:00
Alejandro Alonso 1dbaaf12fa Merge remote-tracking branch 'origin/main' into staging 2022-10-11 14:02:38 +02:00
Alejandro adb19d0c83 Merge pull request #2433 from penpot/eva-fix-register-css
🐛 Fix social buttons in register form
2022-10-11 13:56:43 +02:00
Eva d5d1cff420 🐛 Fix social buttons in register form 2022-10-11 13:36:11 +02:00
Alejandro Alonso 5ef390f07e WIP 2022-10-11 09:11:45 +02:00
Stas Haas fca26f4022 🌐 Add translations for: German.
Currently translated at 99.0% (1203 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-10 19:35:00 +02:00
Oğuz Ersen 5caaa2d593 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-10-10 19:34:59 +02:00
Alejandro Alonso c4c419b971 Merge remote-tracking branch 'origin/staging' into develop 2022-10-10 18:10:52 +02:00
Alejandro Alonso 0f7295dd7c Merge remote-tracking branch 'origin/main' into staging 2022-10-10 18:07:05 +02:00
Alejandro 556c0d0c2a Merge pull request #2431 from penpot/niwinz-event-handling-dashboard
 Improve consistency on event handling on dashboard
2022-10-10 18:02:51 +02:00
Andrey Antukh 582a20d369 Improve consistency on event handling on dashboard 2022-10-10 17:50:04 +02:00
Eva Marco bcd9aa7ba7 Merge pull request #2411 from penpot/hiru-bug-sync-undo
🐛 Fix component sync in undo
2022-10-10 17:23:46 +02:00
Alejandro cad2201c54 Merge pull request #2412 from penpot/niwinz-fixes-on-profile-deletion
🐛 Fix issues on profile deletion procedure
2022-10-10 10:54:41 +02:00
Alejandro 274e034033 Merge pull request #2430 from penpot/fix-text
💄 Fix text grammar
2022-10-10 10:47:01 +02:00
Andrés Moya dec9c339cd 💄 Fix text grammar 2022-10-10 10:39:35 +02:00
ascarida 5423999913 🌐 Add translations for: Galician.
Currently translated at 30.2% (366 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-10-10 10:05:33 +02:00
Valentina Chapellu 670365acb7 🌐 Add translations for: Italian.
Currently translated at 43.5% (526 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-10-10 10:05:33 +02:00
Shuaib Zahda 9915990e10 🌐 Add translations for: Arabic.
Currently translated at 66.6% (806 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-10 10:05:32 +02:00
Andrey Antukh 748ab5f75e Merge branch 'translations' into develop 2022-10-10 10:05:11 +02:00
Andrey Antukh b995830693 📎 Sort translation files 2022-10-10 10:04:11 +02:00
Andrey Antukh d47d4c2d58 Merge remote-tracking branch 'weblate/develop' into translations 2022-10-10 09:58:38 +02:00
Andrey Antukh 4b2b7278a7 Merge branch 'luzpaz-source-typos' into develop 2022-10-10 09:52:06 +02:00
Andrey Antukh 85bd44e37b 📎 Update translation files 2022-10-10 09:51:37 +02:00
luz paz 374909e05e 🔧 Fix typos in source code (follow-up)
This is a follow-up to e30bea0b6f but fixes source typos.
2022-10-10 09:48:38 +02:00
Eva Marco ec19ec9280 Merge pull request #2414 from penpot/superalex-fix-artboard-border-radius
🐛 Fix artboard border radius
2022-10-10 09:30:36 +02:00
Eva Marco fe371c088b Merge pull request #2416 from penpot/superalex-fix-viewer-dashboard-link
🐛 Fix viewer dashboard link
2022-10-10 09:20:53 +02:00
Alejandro Alonso e3f0c2eaeb 🌐 Added translation for: Faroese. 2022-10-10 08:47:38 +02:00
K.B.Dharun Krishna 919fb96b34 🌐 Add translations for: Tamil.
Currently translated at 2.0% (25 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-10-07 04:17:08 +02:00
Alejandro Alonso ac5412301e 🐛 Fix viewer dashboard link 2022-10-06 11:12:17 +02:00
Andrey Antukh c0b778b67a 📎 Minor change on changelog file 2022-10-06 10:12:15 +02:00
Andrey Antukh 1309b51320 📎 Update bundle build script 2022-10-06 10:11:19 +02:00
Alejandro Alonso 9391cc9a41 🐛 Fix artboard border radius 2022-10-06 09:17:24 +02:00
Andrey Antukh cc1dff4d3d ⬆️ Update exporter yarn dependencies 2022-10-05 11:39:40 +02:00
Andrey Antukh 6e28bb9df8 🐛 Fix issues on profile deletion procedure 2022-10-05 11:27:11 +02:00
Alejandro Alonso c5ff785ff5 Merge remote-tracking branch 'origin/staging' into develop 2022-10-05 11:17:13 +02:00
Alejandro Alonso 02c0c867d6 Merge remote-tracking branch 'origin/main' into staging 2022-10-05 11:16:41 +02:00
Alejandro Alonso 796fcee1d8 🐛 Fix twitter feedback link 2022-10-05 11:14:53 +02:00
Andrés Moya 66cd60e02c 🐛 Fix component sync in undo 2022-10-05 10:39:32 +02:00
Alejandro Alonso da33d539bf Merge remote-tracking branch 'origin/staging' into develop 2022-10-05 09:34:18 +02:00
Alejandro Alonso 80463536a8 Merge remote-tracking branch 'origin/main' into staging 2022-10-05 09:33:58 +02:00
Andrey Antukh 5a06749664 🐛 Disable broadcast-channel when it is not available (mainly safari) 2022-10-05 09:33:41 +02:00
Alejandro 5ad385cf93 Merge pull request #2409 from penpot/niwinz-hotfix
Fix compatibility issues with safari >=14 & < 16
2022-10-05 09:22:11 +02:00
Andrey Antukh c534a40923 ⬆️ Update versions on default docker compose file 2022-10-05 08:42:14 +02:00
Andrey Antukh 348bc48db4 📎 Minor change on docker build script 2022-10-05 08:41:56 +02:00
Andrey Antukh 7fa44aa256 🐛 Disable broadcast-channel when it is not available (mainly safari) 2022-10-04 23:19:28 +02:00
Andrey Antukh f1c3c41455 🐛 Fix compatibility issues with some bigint api and safari 2022-10-04 21:03:37 +02:00
Denys M c925528212 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 19.6% (238 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2022-10-04 20:22:42 +02:00
Zvonimir Juranko fc44610893 🌐 Add translations for: Croatian.
Currently translated at 93.0% (1125 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2022-10-04 20:22:41 +02:00
Kevin Nowald ccb17e68e2 🌐 Add translations for: Polish.
Currently translated at 94.8% (1147 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2022-10-04 20:22:41 +02:00
Youkho 5bdc2cc25d 🌐 Add translations for: Arabic.
Currently translated at 65.0% (786 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-04 20:22:40 +02:00
Antonio f466d7a484 🌐 Add translations for: Catalan.
Currently translated at 96.2% (1164 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-10-04 20:22:40 +02:00
Alejandro Alonso cbe51fcabd Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 16:00:46 +02:00
Alejandro Alonso 65da328b25 Merge remote-tracking branch 'origin/main' into staging 2022-10-04 15:59:21 +02:00
Andrey Antukh fadb1dfba6 Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 15:33:00 +02:00
Andrés Moya eb7f93d2e6 🐛 Make restore component work in external libraries 2022-10-04 15:26:14 +02:00
Andrey Antukh c53152f027 📎 Update manage.sh 2022-10-04 15:14:25 +02:00
Andrey Antukh 953607fc4a 📎 Update changes and version files 2022-10-04 14:16:36 +02:00
Andrey Antukh 50af997f55 Merge pull request #2386 from penpot/palba-newsletter-subscription-st
 Newsletter suscription
2022-10-04 14:00:22 +02:00
Andrey Antukh fc01acffc7 Merge pull request #2379 from penpot/hiru-gc-deleted-comp
 Add garbage collect of deleted components
2022-10-04 13:59:53 +02:00
Andrés Moya 687e4dce2a 🔧 Adjust code style 2022-10-04 13:50:23 +02:00
Andrés Moya c5b875c925 Add garbage collect of deleted components 2022-10-04 13:50:23 +02:00
Andrey Antukh a08b9adeee 📎 Fix merge issues from staging to develop 2022-10-04 13:31:06 +02:00
Andrey Antukh c2158b0f3c Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 13:29:03 +02:00
Andrey Antukh 97c36ce86c Merge pull request #2405 from penpot/eva-fix-colorpicker-library
🐛 Fix color bullets in colorpicker modal on libraries
2022-10-04 13:17:39 +02:00
Eva b41ca75512 🐛 Fix color bullets in colorpicker modal on libraries 2022-10-04 13:15:36 +02:00
Pablo Alba 5bbfe376cf Merge pull request #2390 from penpot/hiru-delete-comp-assets
🐛 Fix delete component from assets panel in v2
2022-10-04 11:47:28 +02:00
Alejandro d468c74851 Merge pull request #2403 from penpot/niwinz-websockets-internal-fixes
♻️ Refactor internal websocket connection stage management
2022-10-04 11:19:31 +02:00
Alejandro 7d0f2d76e8 Merge pull request #2384 from penpot/hiru-interactions-nested-boards
 Improve interactions with nested boards
2022-10-04 11:15:59 +02:00
Alejandro 8b721d2024 Merge pull request #2382 from penpot/niwinz-lazy-load-graphics-assets
🎉 Add lazy load for graphic assets thumbnails
2022-10-04 11:02:26 +02:00
Alejandro 3044d0abcc Merge pull request #2381 from penpot/niwinz-chunked-exports
 Make the exportation streaming directly to response
2022-10-04 10:55:49 +02:00
Alejandro b2fd13e6bf Merge pull request #2371 from penpot/eva-fix-viewmode-login
🐛 Fix view mode login size
2022-10-04 10:45:12 +02:00
Andrey Antukh c9ba5ff31e Merge branch 'schalkneethling-2395-switch-to-issue-forms' into develop 2022-10-04 10:44:50 +02:00
Schalk Neethling 0c1d04919f 📎 Switch to issue forms (on github)
GitHub launched issue template forms some time ago. These have helped other open source projects I have been involved in. As you can make certain fields required, it also helps cut down on issue spam.

fix #2395
2022-10-04 10:44:18 +02:00
Andrey Antukh 746f492632 Merge branch 'luzpaz-typos' into develop 2022-10-04 10:41:32 +02:00
luz paz e30bea0b6f 🔧 Fix typos in source code
Found via `codespell -q 3 -S *.po,./frontend/yarn.lock -L childs,clen,fpr,inflight,ody,ot,ro,te,trys,ue`
2022-10-04 10:40:34 +02:00
Andrey Antukh ac4218a3c2 Merge branch 'Vesther-fix/feedback-twitter-link' into develop 2022-10-04 10:37:06 +02:00
Kevin Nowald 0680d25fd7 🐛 Fix twitter feedback link
Refers to unexisting PenpotSupport Twitter account

Signed-off-by: Kevin Nowald <kevin@nowald.pl>
2022-10-04 10:35:48 +02:00
Alejandro Alonso 4a3a181403 Merge branch 'lol768-patch-1' into develop 2022-10-04 10:33:04 +02:00
Adam Williams 9ae40b392f 🐛 Fix word-break on comments, changed to break-word 2022-10-04 10:32:05 +02:00
Andrey Antukh 6fc5813182 Merge pull request #2402 from penpot/hiru-fix-touched
🐛 Fix touched detection when moving instances
2022-10-04 10:21:56 +02:00
Eva Marco 6e5ba88240 Merge pull request #2387 from penpot/hiru-new-dashboard
🐛 Show new dashboard only in v2, and fix loading screen
2022-10-03 16:29:00 +02:00
Andrés Moya a6d9a65843 🐛 Show new dashboard only in v2, and fix loading screen 2022-10-03 16:13:29 +02:00
Andrey Antukh 8fae7f7aa6 ♻️ Refactor internal websocket connection stage management 2022-10-03 13:40:33 +02:00
Andrés Moya e9d3e8a643 🐛 Fix touched detection when moving instances 2022-10-03 12:27:00 +02:00
Denys M 8c20890c7b 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 7.5% (91 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2022-10-01 16:17:53 +02:00
Zvonimir Juranko dc863e8b97 🌐 Add translations for: Croatian.
Currently translated at 79.9% (967 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2022-10-01 16:17:52 +02:00
K.B.Dharun Krishna 44241ada56 🌐 Add translations for: Tamil.
Currently translated at 0.5% (7 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-10-01 16:17:48 +02:00
Jacopo Lodovico Trabia f9b7235f8b 🌐 Add translations for: Italian.
Currently translated at 43.0% (520 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-10-01 16:17:48 +02:00
Ahmad HosseinBor cc68eaa9f7 🌐 Add translations for: Persian.
Currently translated at 55.1% (667 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-10-01 16:17:47 +02:00
Shuaib Zahda af640234b5 🌐 Add translations for: Arabic.
Currently translated at 58.3% (706 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-01 16:17:47 +02:00
Youkho 3c1ab1d58a 🌐 Add translations for: Arabic.
Currently translated at 58.3% (706 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-01 16:17:47 +02:00
Andrés Moya 243e29fdb4 🐛 Fix delete component from assets panel in v2 2022-09-30 15:26:29 +02:00
Eva a4bbb43555 🐛 Fix shortcut texts alignment 2022-09-30 13:31:27 +02:00
Pablo Alba 16e8d1fcf2 Newsletter suscription 2022-09-30 12:22:53 +02:00
Andrés Moya 0e49625ebf Improve interactions with nested boards 2022-09-30 11:28:45 +02:00
Alejandro Alonso 98f490703f 🌐 Added translation for: Ukrainian (ukr_UA). 2022-09-30 07:16:21 +02:00
Andrey Antukh fcbb95e8b6 💄 Replace some use-callback with shorter use-fn on sidebar/assets 2022-09-29 15:09:28 +02:00
Andrey Antukh 0fc2442175 🎉 Make the graphics assets thumbnail load lazy 2022-09-29 15:07:57 +02:00
Andrey Antukh 8c39c3af9f Make the exportation streaming directly to response 2022-09-29 14:28:45 +02:00
Alejandro Alonso 8f786407af Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 14:22:05 +02:00
Eva Marco 7dcd362abd Merge pull request #2380 from penpot/juan-dashboard-CSS
🎉 Dashboard new design review
2022-09-29 14:14:38 +02:00
Elhombretecla 23d1087bc5 🎉 Change pin icon 2022-09-29 14:00:11 +02:00
Elhombretecla 8d5a97f6e5 Change team UI dropdown refactor 2022-09-29 12:45:41 +02:00
Elhombretecla 80f49e06cc 🎉 add new css changes 2022-09-29 12:45:41 +02:00
Andrey Antukh 4378d71b70 🐛 Fix error message on login when profile does not have password 2022-09-29 11:42:45 +02:00
Andrey Antukh fd6d72128b Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 10:37:13 +02:00
Andrey Antukh b7206d734b 📎 Minor devenv update 2022-09-29 10:32:18 +02:00
Andrey Antukh 886ab0e152 Improve iteration and add concat-all and fully lazy mapcat helper 2022-09-29 10:32:18 +02:00
elhombretecla f470efc9c7 🎉 Add new contributors to thankyou.md 2022-09-29 09:28:47 +02:00
Eva 055a870c1f 🐛 Fix view mode login size 2022-09-29 09:00:13 +02:00
Andrey Antukh a59a4d9891 Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 08:40:07 +02:00
Andrey Antukh 058727a44b 🐛 Fix wrong spec on config 2022-09-29 08:38:49 +02:00
Andrey Antukh 2a55d2ebdb Merge remote-tracking branch 'origin/staging' into develop 2022-09-28 15:36:12 +02:00
Andrey Antukh a6e14846c7 🐛 Fix inconsistencies on config related to semaphores 2022-09-28 15:33:29 +02:00
Andrey Antukh c2fec03fc7 Increase the auth token timeout 2022-09-28 15:33:07 +02:00
Alejandro Alonso 43ceb6bb44 Merge remote-tracking branch 'origin/main' into develop 2022-09-28 14:30:28 +02:00
Alejandro a5b36fd3f8 Merge pull request #2365 from penpot/eva-fix-texts
🐛 Fix some texts and a typo
2022-09-28 14:25:53 +02:00
Alejandro Alonso 14788846a5 Merge remote-tracking branch 'origin/main' into staging 2022-09-28 14:25:27 +02:00
Alejandro 94a9bc844a Merge pull request #2372 from penpot/eva-empty-viewer
🐛 Fix alignment of 'no boards' message in viewer
2022-09-28 14:22:08 +02:00
Eva 745aa17d8a 🐛 Fix alignment of 'no boards' message in viewer 2022-09-28 14:20:43 +02:00
Alejandro 012315f207 Merge pull request #2367 from penpot/eva-fix-typos
🐛 Fix some typos
2022-09-28 14:12:00 +02:00
Eva ba37168a84 🐛 Fix some typos 2022-09-28 14:10:34 +02:00
Alejandro c68a6cbc10 Merge pull request #2366 from penpot/eva-hotfix-pdf-exportation
🐛 Fix PDF exportation order
2022-09-28 14:09:16 +02:00
Eva Marco 41d5a490d4 Merge pull request #2363 from penpot/palba-accesibility-elements-without-name
 Fix elements-without-names and html-lang-missing accesibility issues
2022-09-28 13:41:57 +02:00
Pablo Alba 6a329fac27 Fix html-lang-missing accesibility issues 2022-09-28 13:16:36 +02:00
Pablo Alba 4ef876bf58 Fix elements-without-names accesibility issues 2022-09-28 12:47:33 +02:00
Andrey Antukh 7303d311d5 Merge remote-tracking branch 'origin/staging' into develop 2022-09-28 12:16:06 +02:00
Alejandro 35a72be4f2 Merge pull request #2346 from penpot/niwinz-hot-improvements
Improvements & Fixes (part 2)
2022-09-28 12:04:55 +02:00
Andrey Antukh 53c358cfd7 🐛 Fix ssl support on email sending module 2022-09-28 11:30:48 +02:00
Eva c2ccdd5680 🐛 Fix PDF exportation order 2022-09-28 10:35:26 +02:00
Lazalatin 3a4563d755 🐛 Fix doubled quotes in frontend config
Docker parses environment variables literally, delivering quoted flags in the $PENPOT_FLAGS variable. This in turn leads to doubled quotes in the resulting config.js in front and after the flags, omitting them completely.

This commit fixes this behaviour.
2022-09-28 09:50:20 +02:00
Andrey Antukh ab22909b6c Merge pull request #2364 from penpot/superalex-fix-resend-invitation
🐛 Fix Internal error when resending invitation email
2022-09-28 09:47:55 +02:00
Andrey Antukh 89e64236b0 Don't log exception on health check fail 2022-09-28 09:47:13 +02:00
Andrey Antukh 748499a26f 🎉 Add lazy loading of thumbnails on dashboard 2022-09-28 09:47:13 +02:00
Alejandro Alonso 8fec5af55e 🐛 Fix cannot take out an element from a group at layers panel by drag 2022-09-28 09:47:11 +02:00
Andrey Antukh 84655c0fa3 🐛 Fix content-length handling on exporter 2022-09-28 09:45:43 +02:00
Andrey Antukh 1dc493c2d5 🔥 Remove assets handler code for :db backend 2022-09-28 09:45:43 +02:00
Andrey Antukh 2753a934aa 📎 Add service result wrapper
Allows attach metadata to values that does not implement the IObj
clojure interface.
2022-09-28 09:45:43 +02:00
Pablo Alba 47363d96f1 Improve invitation token validation 2022-09-28 09:45:43 +02:00
Andrey Antukh b74631bf4a ⬆️ Update shadow-cljs on exporter 2022-09-28 09:45:43 +02:00
Andrey Antukh 99a718e407 🎉 Add openjdk19 on devenv 2022-09-28 09:45:43 +02:00
Andrey Antukh 8bdfd188d8 ⬆️ Upgrade shadow-cljs and rumext dependency 2022-09-28 09:45:43 +02:00
Andrey Antukh 278f6685b6 Improve object deletion process on profile deletion 2022-09-28 09:45:43 +02:00
Andrey Antukh 06bce92cdc 📎 Fix linter issues on backend 2022-09-28 09:45:43 +02:00
Andrey Antukh 757cee67fb 🎉 Add the ability to completly block access to a profile 2022-09-28 09:45:43 +02:00
Andrey Antukh 37e2fe5c65 Allow repeated registers after small delay
Helps users with expired tokens proceed with a new register
2022-09-28 09:45:43 +02:00
Andrey Antukh 395a7096bf Minor improvements on error report template 2022-09-28 09:45:43 +02:00
Andrey Antukh 65afa2a833 ⬆️ Update dependencies 2022-09-28 09:45:43 +02:00
Andrey Antukh 041ecf67fe 🔥 Remove sentry from codebase 2022-09-28 09:45:43 +02:00
Eva 1a7583e6ad 🐛 Fix some texts and a typo 2022-09-28 09:42:08 +02:00
Alejandro Alonso 6ac1d47de1 🐛 Fix Internal error when resending invitation email 2022-09-28 08:43:48 +02:00
andy f2de69e1f3 🌐 Added translation for: Croatian. 2022-09-27 17:35:28 +02:00
andy 2030e845bb 🌐 Added translation for: Tamil. 2022-09-27 17:32:55 +02:00
Dário b1edc53a1c 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-27 17:18:10 +02:00
Youkho 4d56b5f1b9 🌐 Add translations for: Arabic.
Currently translated at 53.1% (642 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-27 17:18:10 +02:00
Oğuz Ersen e1960b4472 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-09-27 17:18:09 +02:00
Alejandro dfae7d30a1 Merge pull request #2362 from penpot/superalex-fix-sort-anidated-objects
🐛 Fix cannot take out an element from a group at layers panel by …
2022-09-27 14:10:24 +02:00
Alejandro Alonso d8f1df0142 🐛 Fix cannot take out an element from a group at layers panel by drag 2022-09-27 14:04:48 +02:00
Alejandro 86993c0e21 Merge pull request #2360 from penpot/eva-a11y-add-title
 Add title to color bullets
2022-09-27 13:54:31 +02:00
Alejandro a471d96b53 Merge pull request #2361 from penpot/niwinz-hotfix-exporter-content-length
🐛 Fix content-lenght calculation on exporter response
2022-09-27 13:22:31 +02:00
Andrey Antukh 51307cdf8d 🐛 Fix content-lenght calculation on exporter response 2022-09-27 13:11:17 +02:00
Alejandro Alonso c373b3741f 📎 Increase version 2022-09-27 13:02:43 +02:00
Alejandro Alonso bc55268a17 📎 Update CHANGES.md file 2022-09-27 12:57:36 +02:00
Eva 494b08b975 Add title to color bullets 2022-09-27 12:57:20 +02:00
Alejandro Alonso 0bc24bb6eb Merge remote-tracking branch 'origin/staging' into develop 2022-09-27 12:42:08 +02:00
Alejandro 1be1e94869 Merge pull request #2344 from penpot/eva-fix-layers
🐛 Fix delete layers in bulk
2022-09-27 12:30:15 +02:00
Eva 3ea3ca3bd9 🐛 Fix delete layers in bulk 2022-09-27 12:24:32 +02:00
Eva Marco 6c09ecbef5 Merge pull request #2329 from penpot/superalex-fix-bounding-box-mask
🐛 Fix bounding box mask
2022-09-27 12:17:28 +02:00
Alejandro Alonso e888b06ec4 Merge remote-tracking branch 'origin/staging' into develop 2022-09-27 09:50:37 +02:00
Alejandro Alonso c1a4ae9d36 Merge remote-tracking branch 'origin/staging' 2022-09-27 09:50:23 +02:00
Alejandro 1a9fbee412 Merge pull request #2352 from penpot/niwinz-mtype-fix
 Ignore S3 object metadata and use our own content-type header
2022-09-27 09:49:10 +02:00
Andrey Antukh 4909d6574e 📎 Remove unnecesary logging on ws io exception 2022-09-27 07:28:29 +02:00
Andrey Antukh 577db35777 Merge pull request #2349 from penpot/palba-add-thankyou
📎 Add THANKYOU file
2022-09-27 07:17:12 +02:00
Pablo Alba f9187cd202 📎 Add THANKYOU file 2022-09-27 07:12:39 +02:00
Andrey Antukh a868840132 Ignore S3 object metadata and use our own content-type header 2022-09-27 00:47:09 +02:00
Alejandro Alonso 33a8c47f6e Merge remote-tracking branch 'origin/staging' into develop 2022-09-26 16:50:41 +02:00
Alejandro Alonso e80ad112b8 Merge remote-tracking branch 'origin/staging' 2022-09-26 16:50:29 +02:00
Alejandro 07601975ac Merge pull request #2347 from penpot/superalex-fix-remove-woff2-from-template
🐛 Fix woff2 reference in font template
2022-09-26 16:50:06 +02:00
Alejandro Alonso c709505733 🐛 Fix woff2 reference in font template 2022-09-26 16:45:52 +02:00
Alejandro Alonso c3f0657652 Merge remote-tracking branch 'origin/staging' into develop 2022-09-26 15:56:21 +02:00
Alejandro Alonso 853b78613d Merge remote-tracking branch 'origin/staging' 2022-09-26 15:31:40 +02:00
Andrey Antukh 0b4a1553b9 Merge pull request #2342 from penpot/superalex-disable-woff2-compress
🐛 Fix woff2 generation
2022-09-26 15:30:32 +02:00
Alejandro Alonso f67c4ddca0 🐛 Fix woff2 generation 2022-09-26 15:25:42 +02:00
Alejandro bc693ad1bb Merge pull request #2345 from penpot/niwinz-hash-and-dblock
🎉 Add better hashing approach for database locking on Uuids
2022-09-26 15:24:13 +02:00
Andrey Antukh fad2e51cbe 🎉 Add better hashing approach for database locking on Uuids 2022-09-26 14:22:52 +02:00
Eva Marco 61d1a3a77b Merge pull request #2343 from penpot/palba-fix-ungroup-typography
🐛 Fix ungroup does not work for typographies
2022-09-26 13:13:05 +02:00
Pablo Alba d060ddaeae 🐛 Fix ungroup does not work for typographies 2022-09-26 09:45:33 +02:00
Hugo Figueira 161a139194 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-25 01:03:26 +02:00
Shuaib Zahda 407423b480 🌐 Add translations for: Arabic.
Currently translated at 52.6% (637 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-25 01:03:25 +02:00
Hugo Figueira aadc3c25db 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-25 01:03:25 +02:00
Hugo Figueira 26b32634f7 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-24 10:30:23 +02:00
Jaziel Cavalcante 836511f5c7 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-24 10:30:23 +02:00
Hugo Figueira 043683775f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 22:54:31 +02:00
Dário f6792ce67f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 22:54:31 +02:00
Dário 84760f940c 🌐 Add translations for: Indonesian.
Currently translated at 9.3% (113 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-23 22:54:30 +02:00
Stas Haas 4faa3db6f8 🌐 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/
2022-09-23 22:54:30 +02:00
Filipe Pessanha 71f2e4cabe 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:30 +02:00
Jaziel Cavalcante 96ef9a3c52 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:29 +02:00
Hugo Figueira 83f734977f 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:29 +02:00
Stas Haas 9d02bbcc1c 🌐 Add translations for: Russian.
Currently translated at 66.5% (805 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-23 22:54:27 +02:00
Dário f4264e47f0 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-09-23 22:54:27 +02:00
Dário 0fa8f54ce4 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.0% (1198 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 16:27:47 +02:00
Hugo Figueira 920cb86849 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 62.7% (759 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 16:27:45 +02:00
Alejandro Alonso d2d7803186 🐛 Fix export bounding box mask 2022-09-23 14:07:04 +02:00
Dário 706bf86c95 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 64.9% (785 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 13:07:40 +02:00
Vik fbaa19d405 🌐 Add translations for: Russian.
Currently translated at 66.5% (804 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-23 13:06:07 +02:00
Eva Marco 38468d7584 Merge pull request #2327 from penpot/superalex-hotfixes
🐛 Hotfixes
2022-09-23 12:09:41 +02:00
Alejandro Alonso a9e8f4eb67 🐛 Fix Terms and Privacy links overlapping 2022-09-23 09:46:39 +02:00
Alejandro Alonso 944cfd0fc4 🐛 Fix font search works only with lowercase letters 2022-09-23 09:46:39 +02:00
Alejandro Alonso 1ef4d42b28 🐛 Fix error after user drags layers in search functionality 2022-09-23 09:46:39 +02:00
Alejandro Alonso 441e9627b5 🐛 Fix Wrong shortcut button tip of Delete function 2022-09-23 09:46:39 +02:00
Alejandro Alonso 5d01a0e24c 🐛 Fix import files with unexpected format or invalid content 2022-09-23 09:46:39 +02:00
Valentina Chapellu 69ab9e9696 🌐 Add translations for: Italian.
Currently translated at 37.7% (456 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-22 23:21:44 +02:00
Jacopo Lodovico Trabia d5fea6100d 🌐 Add translations for: Italian.
Currently translated at 37.7% (456 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-22 23:21:44 +02:00
nautilusx 47ba8383e8 🌐 Add translations for: German.
Currently translated at 99.6% (1205 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-22 23:21:43 +02:00
Ruan Aragão 48e6cc5a6b 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 60.6% (733 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-22 23:21:42 +02:00
Mateus Muller da5fabbc66 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 60.6% (733 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-22 23:21:42 +02:00
Vik 691a9fa877 🌐 Add translations for: Russian.
Currently translated at 65.8% (796 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-22 23:21:42 +02:00
Alejandro b2d0f3cac2 Merge pull request #2324 from penpot/eva-fix-library-colors
🐛 Fix library color selector
2022-09-22 16:48:48 +02:00
andy 2667e515f7 🌐 Added translation for: Portuguese (Portugal). 2022-09-22 16:43:43 +02:00
andy f1552e4091 🌐 Added translation for: Finnish. 2022-09-22 16:40:29 +02:00
Eva 79e35e2608 🐛 Fix precision 2022-09-22 15:32:15 +02:00
Eva 6e33d5b311 🐛 Fix library color selector 2022-09-22 15:32:15 +02:00
Andrey Antukh e1b62805e5 Merge pull request #2323 from 5idereal/patch-1
🐛 Fix language name
2022-09-22 10:59:09 +02:00
5idereal 5cff6eb592 🐛 Fix language name 2022-09-22 16:54:21 +08:00
Eva f3115f8f3a 🐛 Remove gitter information from feedback page 2022-09-21 15:21:17 +02:00
Alejandro Alonso f7cfb5708f Merge remote-tracking branch 'origin/staging' 2022-09-21 14:06:38 +02:00
Alejandro e75c9df17e Merge pull request #2316 from penpot/superalex-fix-colors
🐛 Fix several issues in colors #2303
2022-09-21 14:06:18 +02:00
Alejandro Alonso dfc1b03a60 📎 Update CHANGES.md file 2022-09-21 13:59:12 +02:00
Alejandro Alonso 726baefa25 🐛 Fix add to recent colors when changing fill or opacity manually 2022-09-21 13:54:34 +02:00
Alejandro Alonso 3063725a62 🐛 Fix color type icon doesn't change 2022-09-21 13:54:25 +02:00
Alejandro Alonso aed065eec1 🐛 Fix using gradient for shadow fill 2022-09-21 13:54:25 +02:00
Eva 4961991e18 🐛 Fix gradient colors in recents 2022-09-21 13:54:25 +02:00
Eva 199142045f 🐛 Remove bugged colors from recents 2022-09-21 13:54:25 +02:00
Eva f444d3d01d 🐛 Fix opacity in color picker 2022-09-21 13:54:25 +02:00
Eva bea96cb586 🐛 Fix recent colors 2022-09-21 13:54:25 +02:00
Alejandro cc18f84d62 Merge pull request #2302 from penpot/niwinz-hot-improvements
Enhancements
2022-09-21 10:01:31 +02:00
Alejandro ac75d0cc1b Merge pull request #2310 from penpot/niwinz-onboarding-form-load-improvements
 Improve error handling on onboarding questions form
2022-09-21 09:46:58 +02:00
Andrey Antukh 21683be07b Improve error handling on onboarding questions form 2022-09-21 09:44:08 +02:00
Andrey Antukh 5ac123dc4b Improve error handling on onboarding questions form 2022-09-21 09:35:29 +02:00
Andrey Antukh ec53288b66 Improve test runner 2022-09-21 09:29:48 +02:00
Andrey Antukh 2348146f00 🎉 Add 'email-verification' flag enabled by default
The main idea is deprecating the `insecure-register` flag with the more
general `email-verification` flag.
2022-09-21 09:29:48 +02:00
Andrey Antukh 41134f22e9 📎 Update license header 2022-09-20 23:23:22 +02:00
Andrey Antukh 9bfdcc6277 Make the task retry algorithm use better backoff values 2022-09-20 23:04:37 +02:00
Andrey Antukh d3347a1be0 Allow floats on db/interval constructor 2022-09-20 23:04:37 +02:00
Andrey Antukh ef2918a115 Minor change on how service middleware are applied 2022-09-20 23:04:37 +02:00
Andrey Antukh 92d3015d24 Reset the recovery request form on submit 2022-09-20 23:04:37 +02:00
Andrey Antukh c4aba025c4 Add some srepl helpers for resend email verification 2022-09-20 23:04:37 +02:00
Andrey Antukh 3aac620276 Merge pull request #2298 from penpot/Waishnav-button-gap-fix
 UI improvements in Project section
2022-09-20 17:12:47 +02:00
Valentina Chapellu e2b39c0680 🌐 Add translations for: Italian.
Currently translated at 32.5% (394 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-20 15:46:24 +02:00
Jacopo Lodovico Trabia 58d604a20a 🌐 Add translations for: Italian.
Currently translated at 32.5% (394 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-20 15:46:24 +02:00
Shuaib Zahda dc7e252972 🌐 Add translations for: Arabic.
Currently translated at 48.6% (588 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-20 15:46:23 +02:00
Filipe Pessanha 4433c1136c 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 59.3% (717 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-20 15:46:23 +02:00
Semon Xue 0dbefcc401 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.9% (1208 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-20 15:46:22 +02:00
Vik 051a65c346 🌐 Add translations for: Russian.
Currently translated at 62.2% (752 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-20 15:46:22 +02:00
Swapnil C 449a6c9127 🌐 Add translations for: French.
Currently translated at 88.8% (1074 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-20 15:46:20 +02:00
Andrey Antukh 3c2ba92f6c 🎉 Add srepl helper for sending test email 2022-09-20 13:41:40 +02:00
Andrey Antukh 58319d84ad ♻️ Refactor email namespaces 2022-09-20 13:41:18 +02:00
Andrey Antukh 87691499d7 🐛 Add missing enable-smtp flag on devenv scripts 2022-09-20 13:40:32 +02:00
Andrey Antukh e0112ac3a3 🐛 Fix worker startup on dev REPL 2022-09-20 13:39:47 +02:00
andy f72b94ac9b 🌐 Added translation for: Czech. 2022-09-20 12:34:09 +02:00
Eva Marco ee8b5cc1c5 Merge pull request #2300 from penpot/superalex-fix-change-multiple-colors-with-svg
🐛 Fix change multiple colors with svg
2022-09-20 12:11:05 +02:00
Alejandro Alonso c638ab459f Merge remote-tracking branch 'origin/staging' 2022-09-20 12:05:00 +02:00
Alejandro Alonso 345ae020d6 📎 Update version.txt file 2022-09-20 11:52:36 +02:00
Alejandro Alonso b6b800a8e2 📎 Update CHANGES.md file 2022-09-20 11:44:56 +02:00
Waishnav eeb8d284cc UI improvements in Project section div 2022-09-20 11:44:56 +02:00
Alejandro Alonso 00222499cc 🐛 Fix files translation 2022-09-20 11:43:41 +02:00
Andrés Moya c6067ce336 🐛 Only dangling reset is unavailable, other cases do work 2022-09-20 11:36:32 +02:00
Andrey Antukh 6f42f4ec45 ♻️ Refactor semaphore and executors 2022-09-20 11:32:45 +02:00
Andrey Antukh 12b98c22bc Increase the default db pool size to 60 2022-09-20 11:32:45 +02:00
Andrey Antukh 435c627afd Make the audit log gc more agressive 2022-09-20 11:32:45 +02:00
Alejandro Alonso 4de579f861 🐛 Fix change multiple colors with svg 2022-09-20 11:20:38 +02:00
Andrey Antukh 978b309b04 🐛 Fix issues introduced in previous merge 2022-09-20 08:58:57 +02:00
Andrey Antukh 32b8c17dad Merge remote-tracking branch 'origin/staging' into develop 2022-09-20 08:48:55 +02:00
Andrey Antukh c6e33fa9bc Merge pull request #2260 from penpot/eva-layout-effect
🐛 Fix layout effects in viewer
2022-09-20 07:43:56 +02:00
Alejandro 69c2d95768 Merge pull request #2258 from penpot/alotor-hotfixes
Alotor hotfixes
2022-09-20 07:37:36 +02:00
Wojciech Maj 80cfe6df9d 🎉 Add microsoft variant of woff mimetype on the fonts selection dialog 2022-09-20 07:37:12 +02:00
Martial Garchery 29550add6c 📚 Fix readme typo 2022-09-20 07:34:27 +02:00
Semon Xue 9a4ad38957 🌐 Add translations for: Chinese (Simplified).
Currently translated at 92.5% (1119 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-19 11:17:40 +02:00
Alejandro 780b833a67 Merge pull request #2290 from penpot/superalex-fix-instagram-link
🐛 Fix instagram link
2022-09-19 08:49:37 +02:00
Alejandro Alonso 879041b0bc 🐛 Fix instagram link 2022-09-19 08:44:02 +02:00
Ahmad HosseinBor 1019a037d8 🌐 Add translations for: Persian.
Currently translated at 54.9% (664 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-09-19 06:15:22 +02:00
liimee 9af04c8fbb 🌐 Add translations for: Indonesian.
Currently translated at 9.3% (113 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-19 06:15:22 +02:00
Mikel Larreategi 9d63bc99bf 🌐 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/
2022-09-16 23:18:21 +02:00
Eranot 516735cd0b 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 58.7% (710 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-16 23:18:21 +02:00
Ally Tiago 4497d8842a 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 58.7% (710 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-16 23:18:21 +02:00
Pablo Ruiz Múzquizandelhombretecla 48118a0ff4 Readme 2.0 (#2262)
* Change nav and new intro text

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* minor updates

Co-authored-by: elhombretecla <delacruzgarciajuan@gmail.com>
2022-09-15 17:06:26 +02:00
Beeby Xia be5a232994 🌐 Add translations for: Chinese (Simplified).
Currently translated at 92.4% (1118 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-14 16:15:35 +02:00
Eva 843e1e91c2 " Add new context menu options for components" 2022-09-14 15:05:46 +02:00
alonso.torres ddf8aaf68f 🐛 Fix problem when moving shapes inside nested frames 2022-09-14 13:12:16 +02:00
Eva ffaf5d835d 🐛 Fix layout effects in viewer 2022-09-14 13:09:43 +02:00
Andrey Antukh f94571b3b4 Merge pull request #2256 from penpot/palba-newsletter-subscription
🎉 Newsletter Opt-in options for subscription categories
2022-09-14 12:47:19 +02:00
Andrey Antukh 7832a80f82 Merge pull request #2243 from penpot/add-shortcut-for-clear-undo
🐛 Change shortcut for "Clear undo"
2022-09-14 12:46:27 +02:00
Andrey Antukh 16a0af802a Merge branch 'staging' into add-shortcut-for-clear-undo 2022-09-14 12:45:42 +02:00
alonso.torres 9cb6e71258 🐛 Fix issue when scaling to value 0 2022-09-14 12:28:10 +02:00
alonso.torres c9c2f9e40f Revert "🐛 Fix weird text align"
This reverts commit 726f55bd04.
2022-09-14 12:28:10 +02:00
alonso.torres bdd487adc0 🐛 Fix problem with snap to grids 2022-09-14 12:28:10 +02:00
Andrey Antukh 8e2ccfb4b0 Revert some changes from previous merge 2022-09-14 11:15:29 +02:00
Andrey Antukh 6067498570 ⬆️ Update aws/s3 dependency 2022-09-14 09:26:36 +02:00
Andrey Antukh 3cd9a3254d 🎉 Add /readyz http endpoint for backend & exporter 2022-09-14 09:26:26 +02:00
Andrey Antukh 4af851d4c6 Merge branch 'staging' into develop 2022-09-14 09:16:00 +02:00
Andrey Antukh 8fa49eada8 Merge pull request #2225 from penpot/superalex-viwer-performance-degradation-because-of-fixed-position
🎉 Improve viewer performance degradation because of fixed position
2022-09-14 08:30:53 +02:00
Pablo Alba f921085c72 🎉 Newsletter Opt-in options for subscription categories 2022-09-13 17:10:23 +02:00
Beeby Xia 81a4c6b3f1 🌐 Add translations for: Chinese (Simplified).
Currently translated at 90.4% (1094 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-13 15:19:14 +02:00
Andrey Antukh e58c943f41 ⬆️ Update aws/s3 dependency 2022-09-13 13:25:22 +02:00
Alejandro c43e8bda3c Merge pull request #2255 from penpot/niwinz-healtz-endpoint
🎉 Add /readyz http endpoint for backend & exporter
2022-09-13 11:22:25 +02:00
Andrey Antukh 028e0c5b70 🎉 Add /readyz http endpoint for backend & exporter 2022-09-13 11:03:41 +02:00
Alejandro Alonso 108cdcecbb 🎉 Improve viewer performance degradation because of fixed position 2022-09-13 10:10:50 +02:00
Alejandro 36f30c611e Merge pull request #2244 from penpot/niwinz-docker-devenv-aarch64
🎉 Make the devenv docker image multiplatform
2022-09-12 15:49:25 +02:00
Andrey Antukh 172a39c2e2 Improve storage sharding replacing uuid/next with uuid/random 2022-09-12 15:31:14 +02:00
Stas Haas 4027241bc0 🌐 Add translations for: German.
Currently translated at 99.0% (1197 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-12 15:20:09 +02:00
Andrés Moya f736ec813e 🐛 Fix origin-frame calculation 2022-09-12 11:52:32 +02:00
Eva 7618fcade0 🐛 Fix several transitions on same frame 2022-09-12 11:52:32 +02:00
Eva 7599b7abc6 🐛 Fix overlay close when click 2022-09-12 11:52:32 +02:00
Eva 67cbfc631d 🐛 Fix toggle overlay position 2022-09-12 11:52:32 +02:00
Eva dc6afb46bf 🐛 Fix overlay remain open on frame change 2022-09-12 11:52:32 +02:00
Alejandro f98512242a Merge pull request #2247 from penpot/palba-select-children-on-ungrouping
🐛 Fix when ungrouping, the items previously grouped should ALWAYS…
2022-09-12 08:27:14 +02:00
Pablo Alba 8b29767932 🐛 Fix items selected while ungrouping 2022-09-12 08:26:32 +02:00
Alejandro b5b042e6e4 Merge pull request #2242 from penpot/palba-fix-move-layers
🐛 Fix Move layers fails (sometimes)
2022-09-12 06:50:29 +02:00
Mikel Larreategi 8ac1dfce29 🌐 Add translations for: Basque.
Currently translated at 97.4% (1178 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-09-10 19:20:27 +02:00
Ahmad HosseinBor 8e0e77fd3c 🌐 Add translations for: Persian.
Currently translated at 54.6% (661 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-09-10 19:20:26 +02:00
Yaron Shahrabani 5b92dca270 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-09-10 19:20:26 +02:00
liimee 5454cabf98 🌐 Add translations for: Indonesian.
Currently translated at 7.8% (95 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-10 19:20:25 +02:00
Stas Haas e4e0deeb1c 🌐 Add translations for: German.
Currently translated at 98.9% (1196 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-10 19:20:25 +02:00
Beeby Xia d47d687b43 🌐 Add translations for: Chinese (Simplified).
Currently translated at 89.9% (1088 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-10 19:20:24 +02:00
Philippe Accorsi 0595d6b88d 🌐 Add translations for: French.
Currently translated at 86.3% (1044 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-10 19:20:23 +02:00
Alejandro Alonso 726f55bd04 🐛 Fix weird text align 2022-09-09 12:30:23 +02:00
Andrey Antukh f86f93deea Make the rate limit configuration automatically reloadable 2022-09-09 12:19:49 +02:00
Andrey Antukh e657c1bbfa Start use datoteka.io ns 2022-09-09 12:19:49 +02:00
Andrey Antukh b5e26fe615 🎉 Make the devenv docker image multiplatform
Add support for aarch64
2022-09-08 16:27:40 +02:00
Pablo Alba 73d2aad4db 🐛 Change shortcut for "Clear undo" 2022-09-08 16:24:37 +02:00
Pablo Alba 27aa20f00b 🐛 Fix Move layers fails (sometimes) 2022-09-08 10:27:43 +02:00
Alejandro 643e58c61b Merge pull request #2233 from penpot/palba-fix-grouping-typographies
🐛 Fix Grouping typographies by drag & drop does not work (again)
2022-09-08 08:27:26 +02:00
Pablo Alba f7aba14f76 bug: Fix Grouping typographies by drag & drop does not work (again) 2022-09-08 08:05:06 +02:00
Alejandro 19a9440f11 Merge pull request #2240 from penpot/palba-fix-undo-move-layers
🐛 Fix undo after moving layers will wrongly order the layers
2022-09-08 08:01:27 +02:00
Alejandro 1e2d100c81 Merge pull request #2236 from penpot/niwinz-minor-improvements
Minor improvements
2022-09-08 07:21:06 +02:00
Andrey Antukh 675a07bac6 🔥 Remove internal file data blob format v2 2022-09-08 07:16:44 +02:00
Pablo Alba 21ec8bfdac 🐛 Fix undo after moving layers will wrongly order the layers 2022-09-07 16:57:22 +02:00
Alejandro Alonso de57300fe3 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 12:00:56 +02:00
Alejandro Alonso 2da6732aba Merge remote-tracking branch 'origin/staging' 2022-09-07 11:58:57 +02:00
Alejandro Alonso be18defcb1 📎 Update version.txt file 2022-09-07 11:58:47 +02:00
Alejandro Alonso 52344fdb18 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 11:39:01 +02:00
Alejandro Alonso d632ca3114 Merge remote-tracking branch 'origin/staging' 2022-09-07 11:38:43 +02:00
Alejandro c19237b45a Merge pull request #2238 from penpot/alotor-bug-texts
🐛 Fix problem with texts for non existing fonts
2022-09-07 11:28:21 +02:00
alonso.torres c47f5ca186 🐛 Fix problem with texts for non existing fonts 2022-09-07 11:12:30 +02:00
Alejandro Alonso fb8543c4e4 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 06:32:29 +02:00
Andrey Antukh e0ac583aba 📎 Improve analyze-files helper on srepl ns 2022-09-06 16:53:28 +02:00
Andrey Antukh 5cd0079e7f 📎 Add some utilities on user ns 2022-09-06 16:52:51 +02:00
Andrey Antukh 00a7760c0f Change default task schedule 2022-09-06 12:30:23 +02:00
Alejandro 89732d911b Merge pull request #2234 from penpot/niwinz-tasks-schedule-change
 Change default task schedule
2022-09-06 12:28:58 +02:00
Andrey Antukh c184ab58a3 Change default task schedule 2022-09-06 12:17:28 +02:00
Andrey Antukh 182b572550 Merge pull request #2232 from penpot/alotor-ungroup-frames
 Ungroup frames
2022-09-06 11:59:37 +02:00
Andrey Antukh f394e8dba3 📎 Minor fix on i18n ns 2022-09-06 11:13:01 +02:00
Andrey Antukh 5bcf5ff4bc 🎉 Add it and eu languages to the i18n subsystem 2022-09-06 11:11:30 +02:00
Alejandro d41c2388c1 Merge pull request #2229 from penpot/niwinz-msgbus-improvements
 Improve msgbus internal API
2022-09-06 10:50:42 +02:00
Alejandro 0155ef80b2 Merge pull request #2222 from penpot/niwinz-uuidv8-improvements
 Improve UUIDv8 implementation
2022-09-06 10:44:36 +02:00
Alejandro ad32512980 Merge pull request #2223 from penpot/niwinz-public-uri-improvements
 Improve public-uri handling
2022-09-06 10:43:30 +02:00
Andrey Antukh d082ff0a2b Improve UUIDv8 implementation 2022-09-06 10:37:23 +02:00
alonso.torres c0fc68b9f0 Ungroup frames 2022-09-06 09:31:01 +02:00
Andrey Antukh 82032bedf5 Sort & validate translation files 2022-09-06 08:40:18 +02:00
Andrey Antukh 915d4249a0 Merge branch 'translations' into develop 2022-09-06 08:15:50 +02:00
Andrey Antukh 004334a7c8 Merge remote-tracking branch 'weblate/develop' into translations 2022-09-06 08:15:24 +02:00
Valentina Chapellu 97d5f48ab5 🌐 Add translations for: Italian.
Currently translated at 33.2% (388 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-06 08:05:28 +02:00
Stas Haas 0155c6c5c4 🌐 Add translations for: German.
Currently translated at 93.9% (1095 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-06 08:05:27 +02:00
Andrey Antukh 45adc8a61d Merge pull request #2228 from penpot/hiru-check-v2-viewer
 Disallow to view a file with components-v2
2022-09-05 19:09:01 +02:00
Andrey Antukh a555e13b6a Improve msgbus internal API 2022-09-05 19:08:26 +02:00
Andrés Moya f1b536034a Show error instead of dialog 2022-09-05 16:16:24 +02:00
Andrey Antukh 6018df480e Merge pull request #2227 from penpot/palba-fix-colorpicker
🐛 Fix color-picker recent colors
2022-09-05 15:54:55 +02:00
Andrés Moya 3a6876eeec Disallow to view a file with components-v2 2022-09-05 15:53:19 +02:00
Pablo Alba 7e4b7424a5 🐛 Fix color-picker recent colors 2022-09-05 15:38:37 +02:00
Andrey Antukh ce7eed5ea0 🐛 Fix issues on deleting library which is in use by deleted files 2022-09-05 14:58:05 +02:00
Andrey Antukh 11018581ed Merge pull request #2201 from penpot/hiru-undelete-components
🎉 Allow to restore deleted components
2022-09-05 14:26:14 +02:00
Andrey Antukh 3aa25e7a90 Merge pull request #2224 from penpot/eva-fix-grow-type
🐛 Fix default grow type in texts
2022-09-05 14:19:06 +02:00
Rubén 302c135d51 🌐 Add translations for: Catalan.
Currently translated at 99.4% (1160 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-09-05 14:17:52 +02:00
Alejandro Alonso 9c68432936 Merge remote-tracking branch 'origin/staging' into develop 2022-09-05 12:13:08 +02:00
Alejandro Alonso 851092fc9e Merge remote-tracking branch 'origin/staging' 2022-09-05 11:57:43 +02:00
Eva c69cb20be1 🐛 Fix default grow type in texts 2022-09-05 11:17:51 +02:00
Andrey Antukh a1fccd46ff Improve public-uri handling
This enables use penpot under subdirectory
2022-09-05 09:41:19 +02:00
Valentina Chapellu d75648e6b0 🌐 Add translations for: Italian.
Currently translated at 22.8% (266 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-03 10:15:37 +02:00
liimee 179a77eb05 🌐 Add translations for: Indonesian.
Currently translated at 6.7% (79 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-03 10:15:36 +02:00
Stas Haas 352c044aad 🌐 Add translations for: German.
Currently translated at 92.7% (1081 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-03 10:15:35 +02:00
Aimee 5503e371aa 🌐 Add translations for: French.
Currently translated at 82.5% (962 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-03 10:15:34 +02:00
Andrés Moya 46053b6bbf 🎉 Import & export new components 2022-09-02 13:43:01 +02:00
Andrés Moya 251e7eada2 🎉 Allow to restore deleted components 2022-09-02 13:43:00 +02:00
Andrey Antukh 7e58e2f5eb Merge pull request #2217 from penpot/alotor-fix-nested-boards
Fixes on nested artboards and texts
2022-09-01 13:40:54 +02:00
alonso.torres 04d6e76c6c 🐛 Fix problem editing rotated texts 2022-09-01 12:56:01 +02:00
Alejandro ee1058950e Merge pull request #2214 from penpot/palba-fix-undo-delete-page
🐛 Fix undo on delete page does not preserve its order
2022-09-01 08:16:11 +02:00
Pablo Alba be656bb4ef 🐛 Fix undo on delete page does not preserve its order 2022-09-01 07:57:59 +02:00
alonso.torres d6317297d7 🐛 Fix error when moving nested frames outside 2022-08-31 16:30:30 +02:00
alonso.torres 5820f73b6e 🐛 Fix problem when hovering over nested frames 2022-08-31 16:29:38 +02:00
Andrey Antukh 89e5607d7f Merge pull request #2211 from penpot/niwinz-rate-limit
Rate Limit for RPC methods
2022-08-31 13:19:34 +02:00
Pablo Alba 2ecf33d7bb Merge pull request #2213 from penpot/superalex-fix-export-simple-path
🐛 Fix export simple path
2022-08-31 13:17:58 +02:00
Andrey Antukh 2f21560fe3 🎉 Add improved approach for async flow time measurements 2022-08-31 12:55:48 +02:00
Andrey Antukh fd973d87fd ♻️ Refactor metrics namespace 2022-08-31 12:55:48 +02:00
Andrey Antukh ec3651d85b 🎉 Add optional rate limit support for RPC calls 2022-08-31 12:55:48 +02:00
Alejandro Alonso 8f98b81829 🐛 Fix export simple path 2022-08-31 12:47:46 +02:00
Andrey Antukh 469704def6 Merge pull request #2212 from penpot/palba-fix-move-artboards-on-comments
🐛 Fix artboards moving with comment tool selected
2022-08-31 12:07:18 +02:00
Pablo Alba 3cbb2defb3 🐛 Fix artboards moving with comment tool selected 2022-08-31 11:59:17 +02:00
Andrey Antukh 47b745592b ⬆️ Update shadow-cljs on frontend 2022-08-31 11:01:07 +02:00
Andrey Antukh 819492f453 Remove release build warnings 2022-08-31 11:01:07 +02:00
Andrey Antukh 83905c2f56 📎 Minor change on common repl script 2022-08-31 11:01:07 +02:00
Andrey Antukh d6d9d25fce ♻️ Refactor token generation API 2022-08-31 11:01:07 +02:00
Alejandro Alonso 44f4d9c50c Merge remote-tracking branch 'origin/staging' into develop 2022-08-31 08:58:27 +02:00
Alejandro Alonso 2cb8e7b986 Merge remote-tracking branch 'origin/staging' 2022-08-31 08:56:54 +02:00
Alejandro Alonso 8314e6c17b 📎 Update version.txt file 2022-08-31 08:56:38 +02:00
Alejandro 84d85edc0b Merge pull request #2208 from penpot/alotor-bugfixes
🐛 Fix problem with multi-user text editing
2022-08-31 08:40:13 +02:00
Andrey Antukh 1884a8abe6 Merge pull request #2209 from penpot/palba-protect-profile-url
🐛 Fix opening profile URL while signed out takes to "your account" section
2022-08-30 18:48:30 +02:00
Pablo Alba c54354f143 🐛 Fix opening profile URL while signed out takes to "your account" section 2022-08-30 17:51:41 +02:00
alonso.torres 29f1c8bb4d 🐛 Fix frame titles deforming when resize 2022-08-30 17:12:43 +02:00
alonso.torres a301856c0d 🐛 Fix path tools blocking elements underneath 2022-08-30 15:47:45 +02:00
alonso.torres 4e6a5ffa69 🐛 Fix problem with multi-user text editing 2022-08-30 15:08:55 +02:00
Alejandro Alonso 199541aeee Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:51:08 +02:00
Alejandro Alonso 0268e8594d Merge remote-tracking branch 'origin/staging' 2022-08-30 13:50:35 +02:00
Alejandro Alonso 9f1540cd00 📎 Update version.txt file 2022-08-30 13:50:16 +02:00
Alejandro Alonso 28a721ce9c Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:31:11 +02:00
Alejandro Alonso 1e62b72769 Merge remote-tracking branch 'origin/staging' 2022-08-30 13:29:51 +02:00
Alejandro ab94968648 Merge pull request #2206 from penpot/palba-fix-color-picker
🐛 Fix on color-picker, click+drag adds lots of recent colors
2022-08-30 13:29:23 +02:00
Alejandro 4ba5be4450 Merge pull request #2193 from penpot/palba-avoid-bring-file-libraries-on-export
🐛 Fix bringing complete file data when launching the export dialog
2022-08-30 13:28:57 +02:00
Pablo Alba 1bb83b3019 🐛 Fix bringing complete file data when launching the export dialog 2022-08-30 13:18:40 +02:00
Pablo Alba d175c96871 🐛 Fix on color-picker, click+drag adds lots of recent colors 2022-08-30 13:14:57 +02:00
Alejandro Alonso 24a56f029a Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:09:02 +02:00
Alejandro Alonso a2d368636b Merge remote-tracking branch 'origin/staging' 2022-08-30 13:03:30 +02:00
Andrey Antukh ecfc20f514 Merge pull request #2205 from penpot/superalex-fix-jittering-on-firefox-scroll-fixed-elements
🐛 Fix jittering on firefox scroll fixed elements
2022-08-30 12:32:42 +02:00
Alejandro Alonso c69bf9fd35 🐛 Fix jittering on firefox scroll fixed elements 2022-08-30 12:26:56 +02:00
Alejandro 77118a3cc7 Merge pull request #2204 from penpot/alotor-bugfixes
🐛 Fix problems with texts
2022-08-30 12:23:16 +02:00
alonso.torres 282941d284 🐛 Fix problems with texts 2022-08-30 12:12:32 +02:00
Alejandro d034b61318 Merge pull request #2199 from penpot/palba-shadow-nested-artboard
🐛 Fix Shadows doesn't work on nested artboards
2022-08-30 11:58:04 +02:00
Alejandro 02f3809b89 Merge pull request #2175 from penpot/hiru-dashboard-libraries
🎉 Add new dashboard libraries screen
2022-08-30 11:32:44 +02:00
Pablo Alba 1c033fd9f6 Merge pull request #2200 from penpot/alotor-fix-selection
🐛 Fix problems with double-click and selection
2022-08-29 13:45:31 +02:00
alonso.torres 40130d1ca7 🐛 Fix problems with double-click and selection 2022-08-29 12:27:43 +02:00
Pablo Alba 5376c4aa23 🐛 Fix Shadows doesn't work on nested artboards 2022-08-29 12:18:56 +02:00
Stas Haas 3c759a46ec 🌐 Add translations for: German.
Currently translated at 80.5% (939 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-29 10:20:04 +02:00
Andrés Moya 1675d945d9 Add some small enhancements 2022-08-29 09:50:04 +02:00
Andrey Antukh 12ba46642c Merge pull request #2198 from Windfarer/fix-devenv-nginx
🐛 Fix nginx user for devenv
2022-08-29 07:24:09 +02:00
Qizhao Yang acb9432f61 🐛 Fix nginx user for devenv
Signed-off-by: Qizhao Yang <windfarer@gmail.com>
2022-08-29 09:32:06 +08:00
Mikel Larreategi ff3b6fc0c8 🌐 Add translations for: Basque.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-28 23:15:03 +02:00
Amine Gdoura 60d8486f24 🌐 Add translations for: Arabic.
Currently translated at 47.2% (551 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-08-28 23:15:01 +02:00
Stas Haas 99050af903 🌐 Add translations for: German.
Currently translated at 80.2% (936 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-28 23:15:00 +02:00
Rubén c488efa515 🌐 Add translations for: Catalan.
Currently translated at 98.3% (1147 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-08-28 23:15:00 +02:00
Alejandro 396d35840e Merge pull request #2189 from penpot/palba-componentsv2-publish-from-popup
🎉 Publish file library from libraries popup
2022-08-26 13:30:25 +02:00
Pablo Alba d1550ebb2a 🎉 Publish file library from libraries popup 2022-08-26 13:14:27 +02:00
Alejandro edc88458d3 Merge pull request #2191 from penpot/palba-componentsv2-library-name-assets-panel
🎉 Library name in assets panel
2022-08-26 13:06:39 +02:00
Mikel Larreategi 517d47f016 🌐 Add translations for: Basque.
Currently translated at 60.8% (709 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-25 17:42:32 +02:00
Mikel Larreategi 70f6a6cecc 🌐 Add translations for: Basque.
Currently translated at 4.3% (51 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-25 15:21:25 +02:00
Ahmad HosseinBor 07ce252d60 🌐 Add translations for: Persian.
Currently translated at 55.8% (651 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-08-25 15:21:24 +02:00
Andrey Antukh a055a31286 Merge remote-tracking branch 'origin/staging' into develop 2022-08-25 14:51:58 +02:00
Alejandro Alonso 1b33b0dcef Merge remote-tracking branch 'origin/staging' 2022-08-25 13:55:07 +02:00
Pablo Alba 01d99222e0 Merge pull request #2192 from penpot/superalex-fix-viewer-scroll-problems
🐛 Fix viewer scroll problems
2022-08-25 12:09:11 +02:00
Andrey Antukh 85ec1668f3 🐛 Add missing rpc-command definition on metrics 2022-08-25 11:47:14 +02:00
Alejandro Alonso a1654aeb0e 🐛 Fix viewer scroll problems 2022-08-25 09:12:50 +02:00
Pablo Alba 00e9195af8 🎉 Library name in assets panel 2022-08-24 14:41:39 +02:00
Alejandro Alonso f7186fa781 Merge remote-tracking branch 'origin/staging' 2022-08-24 14:27:02 +02:00
Ahmad HosseinBor 2974125e8f 🌐 Add translations for: Persian.
Currently translated at 51.5% (601 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-08-24 14:18:24 +02:00
Andrey Antukh e705a333a9 Merge pull request #2190 from penpot/superalex-fix-drag-and-drop-boards
🐛 Fix drag and drop boards
2022-08-24 14:14:17 +02:00
Alejandro Alonso 08ccd7be70 🐛 Fix drag and drop boards 2022-08-24 14:03:38 +02:00
Pablo Alba aa4344a76f 🐛 Fix drag and drop graphic assets in groups 2022-08-24 13:15:59 +02:00
Alejandro Alonso 581843f99b Merge remote-tracking branch 'origin/staging' 2022-08-24 12:18:41 +02:00
Andrey Antukh 02efffceb4 Merge pull request #2188 from penpot/superalex-fix-permissions-when-moving-comments
🐛 Fix permissions when moving comments
2022-08-24 12:17:57 +02:00
Alejandro Alonso 44330ffb3b 🐛 Fix permissions when moving comments 2022-08-24 12:16:54 +02:00
Alejandro Alonso 8a33a63f91 🐛 Fix permissions when moving comments 2022-08-24 12:08:38 +02:00
Pablo Alba 3c492f03d1 Merge pull request #2181 from penpot/hiru-select-instance
🎉 Select main instance when selecting a component
2022-08-24 11:18:21 +02:00
Andrés Moya e8990caefb 🎉 Select main instance when selecting a component 2022-08-24 11:17:26 +02:00
Alejandro Alonso d2cd29bf76 Merge remote-tracking branch 'origin/staging' 2022-08-24 11:10:08 +02:00
Andrés Moya c1942ef408 💄 Change libraries label 2022-08-24 11:07:53 +02:00
Alejandro 35c1008b37 Merge pull request #2187 from penpot/niwinz-viewer-comments-positioning-bug
Viewer comments positioning regression
2022-08-24 11:07:42 +02:00
Andrés Moya b072c1d1d1 🐛 Fix delete library color 2022-08-24 11:00:26 +02:00
Andrés Moya 5a0ec9525b 🎉 Add new dashboard libraries screen 2022-08-24 11:00:26 +02:00
Andrey Antukh 8ce8b3fdef 📎 Update docker images related files 2022-08-24 10:59:56 +02:00
Andrés Moya f0e521b8d5 🐛 Fix compilation of exporter 2022-08-24 10:59:53 +02:00
Andrey Antukh be1c19e718 🐛 Fix comments positioning on viewer (regression) 2022-08-24 10:59:38 +02:00
Andrey Antukh 1e9fb6e391 Merge pull request #2186 from penpot/superalex-fix-permissions-when-moving-comments
🐛 fix permissions when moving comments
2022-08-24 10:42:00 +02:00
Eva 8dfd74547a 💄 Change some styles in viewer mode 2022-08-24 10:36:38 +02:00
Alejandro Alonso cb064358f8 🐛 Fix permissions when moving comments 2022-08-24 10:26:08 +02:00
andy a6210be63a 🌐 Added translation for: Basque. 2022-08-24 09:18:04 +02:00
Alejandro Alonso 1fdd3b85ab 🐛 Fix typo in releases 1.15 2022-08-24 09:00:28 +02:00
Alejandro Alonso 8d8e4c5e22 Merge remote-tracking branch 'origin/staging' 2022-08-24 08:11:22 +02:00
Alejandro 595700f8b3 Merge pull request #2184 from penpot/palba-fix-multiselection-assets
🐛 Fix multiselection with shift not working inside a library group
2022-08-24 08:00:30 +02:00
Pablo Alba 29223e8db8 🐛 Fix multiselection with shift not working inside a library group 2022-08-23 17:29:36 +02:00
Andrés Moya 4e319fd9ef Merge pull request #2182 from penpot/niwinz-viewer-performance
Viewer performance issues
2022-08-23 14:01:25 +02:00
Andrey Antukh c1348189d4 🐛 Fix path with images on binfile importation 2022-08-23 13:57:31 +02:00
Andrey Antukh 1b42e324a2 Avoid recursive rerender and react warning 2022-08-23 13:57:31 +02:00
Andrey Antukh 7af914eef0 📎 Properly print on console UI related errors 2022-08-23 13:57:31 +02:00
Andrey Antukh 1649ca4ff7 📎 Fix linter issues 2022-08-23 13:57:31 +02:00
Andrey Antukh f9b44ccc5c Refactor viewer shape-container component
Still need a rething for the fixed position shapes
feature because watching scroll position on all shapes
is killing viewer performance.
2022-08-23 13:57:31 +02:00
Andrey Antukh b9f767a614 Rename active-frames-ctx to active-frames 2022-08-23 13:57:31 +02:00
Andrey Antukh 3e3a10b5dd Rename render-ctx to render-id 2022-08-23 13:57:31 +02:00
Andrey Antukh 082bcd2bde 🔥 Remove unused def-ctx react context var 2022-08-23 13:57:31 +02:00
Andrey Antukh 10bb75c1a1 🔥 Remove unused code related to remap colors of fo-text component 2022-08-23 13:57:31 +02:00
Andrey Antukh a37c1f7fca ♻️ Refactor viewer comments related components 2022-08-23 13:57:31 +02:00
Andrey Antukh 50d371c14b ♻️ Refactor viewer state management (partial) 2022-08-23 13:57:31 +02:00
Andrey Antukh 48de242a2d 🐛 Fix z-index on viewer sidebar 2022-08-23 13:57:31 +02:00
Andrey Antukh 9722e6ea97 📎 Update gitignore file 2022-08-23 13:57:30 +02:00
Andrey Antukh f9502315ec Remove duplicate helper from page helpers 2022-08-23 13:57:30 +02:00
Alejandro dbd2b8527a Merge pull request #2180 from penpot/palba-carousel-misaligment
🐛 Fix Libraries & Templates carousel misalingments
2022-08-23 10:50:46 +02:00
Alejandro Alonso eb797f37a7 🐛 Fix hide html options on handoff 2022-08-23 09:34:13 +02:00
Alejandro Alonso 36af303850 🐛 Fix share prototypes overlay and stroke 2022-08-23 09:34:13 +02:00
Alejandro Alonso d16761772b 🐛 Fix border radious on boolean operations 2022-08-23 09:34:13 +02:00
Andrey Antukh b3d6b4b402 Merge remote-tracking branch 'origin/staging' into develop 2022-08-23 08:11:58 +02:00
Pablo Alba b6e17a0f09 🐛 Fix Libraries & Templates carousel misalingments 2022-08-22 12:00:30 +02:00
Alejandro Alonso 7325322ebf 🐛 Fix text alignment undefined after paste text 2022-08-19 15:15:29 +02:00
Alejandro Alonso a5975864fb 🎉 Update login methods translations 2022-08-19 15:02:54 +02:00
Alejandro Alonso 4a655c863a 🐛 Fix typo in manage.sh 2022-08-19 07:21:51 +02:00
andy 9b642b6055 🌐 Add translations for: Romanian.
Currently translated at 54.4% (635 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-08-18 18:16:49 +02:00
andy 17c5eeb740 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 43.8% (511 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-08-18 18:16:49 +02:00
Oğuz Ersen 54f19564d4 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-08-18 18:16:48 +02:00
andy c3219d1de5 🌐 Add translations for: Russian.
Currently translated at 45.3% (529 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-08-18 18:16:48 +02:00
andy f279e54f2f 🌐 Add translations for: Greek.
Currently translated at 48.5% (566 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/el/
2022-08-18 18:16:48 +02:00
andy da18314e37 🌐 Add translations for: French.
Currently translated at 65.9% (769 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-08-18 18:16:47 +02:00
andy f689d2f84f 🌐 Add translations for: Catalan.
Currently translated at 92.0% (1073 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-08-18 18:16:47 +02:00
andy a43f76bb3f 🌐 Add translations for: English.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2022-08-18 18:16:47 +02:00
Andrés Moya 0c717c579b 🐛 Some small fixes
* Remove an unneeded condition in sync.
* Correctly duplicate main instances.
* Slightly enhance sync logging.
2022-08-17 16:22:04 +02:00
Eva bf63e9da95 🎉 Add new hero projects 2022-08-17 15:50:24 +02:00
Alejandro Alonso 7f7032aaa5 🐛 Fix inconsistent representation of rectangles 2022-08-17 13:03:03 +02:00
Alejandro 61cb43f2f0 Merge pull request #2169 from penpot/hiru-create-nested-component
🎉 Allow to create a nested component in one step
2022-08-17 12:24:38 +02:00
andy de8d693292 🌐 Add translations for: German.
Currently translated at 78.5% (916 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-17 12:18:31 +02:00
Alejandro 5c5ec8ef56 Merge pull request #2152 from penpot/niwinz-colorpicker-state-management-refactor
♻️ Refactor state management on colorpicker and gradients
2022-08-17 11:12:22 +02:00
Andrés Moya 9725dd5fff 🎉 Allow to create a nested component in one step 2022-08-16 15:15:02 +02:00
Andrey Antukh d6faf68dce 📎 Add entry to the changelog 2022-08-12 15:11:20 +02:00
Andrey Antukh 9950c5dc0f 🎉 Add shared state hook and broadcast channel api 2022-08-12 15:11:20 +02:00
Andrey Antukh 756b6d4fbd 💄 Minor cosmetic changes on resize and thumbnail render 2022-08-12 15:11:20 +02:00
Andrey Antukh 8d06227d1e ♻️ Refactor state management of colorpicker & gradients 2022-08-12 15:11:20 +02:00
Andrey Antukh 4ad27c3fca Merge remote-tracking branch 'origin/staging' into develop 2022-08-12 12:49:36 +02:00
Andrey Antukh 4cc88bf84f Merge pull request #2162 from penpot/release-1.15
🎉 Add new release info
2022-08-12 12:48:25 +02:00
Andrey Antukh d8332e62d1 Merge pull request #2161 from penpot/superalex-fix-text-edit-when-using-certain-fonts
🐛 Fix text edition when using certain fonts
2022-08-12 12:48:08 +02:00
Andrey Antukh 86389256a9 📎 Fix linter issues 2022-08-12 09:50:33 +02:00
Andrey Antukh 4f0cc3d0d8 Merge remote-tracking branch 'origin/staging' into develop 2022-08-12 09:45:58 +02:00
Alejandro 95335e64b1 Merge pull request #2160 from penpot/niwinz-enhancements
Enhancements on tasks
2022-08-12 09:37:21 +02:00
Alejandro Alonso c219d1cc89 🐛 Fix text edition when using certain fonts 2022-08-12 09:30:12 +02:00
Andrey Antukh 7fa609d5f4 Allow disable worker 2022-08-12 08:52:36 +02:00
Andrey Antukh 95bb3f31af Fix all tasks related tests 2022-08-12 08:35:04 +02:00
Andrey Antukh 8d7baa75de Improve tasks-gc task 2022-08-12 08:35:04 +02:00
Andrey Antukh 5867e64d36 Improve objects-gc task 2022-08-12 08:34:57 +02:00
Andrey Antukh fee264007f Merge pull request #2157 from penpot/superalex-add-audit-log-for-team-up-hero
🎉 Add audit log for team up hero
2022-08-12 08:21:03 +02:00
Andrey Antukh df00760ffa Improve file-xlog-gc task 2022-08-11 17:31:32 +02:00
Andrey Antukh ac8ef1d622 🔥 Remove completly unused file-offload task 2022-08-11 17:31:32 +02:00
Andrey Antukh ec2a3c0de1 Improve the file-gc task logging and params 2022-08-11 17:31:32 +02:00
Andrey Antukh d533e37ae0 Improve logging on gc-deleted storage task 2022-08-11 17:31:32 +02:00
Andrey Antukh 6ee6e5e23e Improve logging on gc-touched storage task 2022-08-11 17:31:32 +02:00
Andrey Antukh 7626d912b9 🎉 Add srepl helpers for run and print available tasks 2022-08-11 17:31:32 +02:00
Andrey Antukh ada0938e27 Remove key warning on import dialog 2022-08-11 17:31:32 +02:00
Andrey Antukh 918d2ab4a9 🎉 Add more helpers on srepl ns 2022-08-11 17:31:32 +02:00
Andrey Antukh b3623ed14c 🎉 Add migration for remove on cascade action on file-media-object table 2022-08-11 17:31:32 +02:00
Alejandro 94c3dfbfe8 Merge pull request #2158 from penpot/eva-modal-animations
💄 Improve onboarding modal animations
2022-08-11 12:05:17 +02:00
Alejandro Alonso f360958c66 🎉 Add audit log for team up hero 2022-08-11 11:59:07 +02:00
Eva c9885d757a 💄 Improve onboarding modal animations 2022-08-11 11:17:28 +02:00
Andrey Antukh 4a054dec25 Merge remote-tracking branch 'origin/staging' into develop 2022-08-11 09:41:41 +02:00
Alejandro 0b9546c541 Merge pull request #2155 from penpot/eva-onboarding-team-up
🎉 Eva onboarding team up
2022-08-11 09:24:29 +02:00
Eva 0e513a4a25 🎉 Add new team hero 2022-08-11 08:55:52 +02:00
Andrey Antukh a77f9eae7c 🎉 Backport binfile improvements from develop 2022-08-11 07:44:47 +02:00
Alejandro 678a163b01 Merge pull request #2156 from penpot/niwinz-binfile-improvements
♻️ Refactor binfile implementation
2022-08-11 06:44:31 +02:00
Tatsuto Yamamoto 3b57e7a583 🌐 Add translations for: Japanese (jpn_JP).
Currently translated at 22.5% (263 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/jpn_JP/
2022-08-11 04:17:13 +02:00
Andrey Antukh dd73152afd ♻️ Refactor binfile implementation 2022-08-10 20:07:24 +02:00
Andrey Antukh 99ed610dde Merge remote-tracking branch 'origin/staging' into develop 2022-08-10 14:10:57 +02:00
elhombretecla b38f99b2f6 🎉 Add new release info 2022-08-10 12:26:14 +02:00
Alejandro 6df2089a60 Merge pull request #2154 from penpot/niwinz-upload-size-config
 Make the upload media size configurable
2022-08-10 12:22:13 +02:00
Andrey Antukh b9b53258c1 Make the upload media size configurable 2022-08-10 12:10:45 +02:00
Eva Marco 5b5fe8ebbc Merge pull request #2145 from penpot/palba-templates-carousel
🎉 Add Libraries & Templates carousel
2022-08-10 11:52:21 +02:00
Pablo Alba edb46b2080 🎉 Add Libraries & Templates carousel 2022-08-10 11:44:51 +02:00
Alejandro 2d24529165 Merge pull request #2148 from penpot/eva-onboarding-zoom-url
🎉 Add zoom style to share link url
2022-08-10 11:24:23 +02:00
Eva 0a939185d2 🎉 Add zoom style to share link url 2022-08-10 11:00:37 +02:00
Andrey Antukh 2211fea976 🚑 Fix tests in develop
Caused of bad merge conflict resolution from mergin
staging to develop.
2022-08-10 09:14:11 +02:00
Alejandro b404246f8a Merge pull request #2153 from penpot/eva-fix-shared-placeholder
 Fix shared libraries placehoder
2022-08-10 09:09:23 +02:00
Eva 6f415cc046 Fix shared libraries placehoder 2022-08-10 08:54:34 +02:00
Andrey Antukh 84ee6555a3 Merge remote-tracking branch 'origin/staging' into develop 2022-08-10 08:27:25 +02:00
Alejandro 0471df36ef Merge pull request #2142 from penpot/niwinz-session-management-refactor
♻️ Refactor session management
2022-08-10 08:06:49 +02:00
Alejandro 37f5b41486 Merge pull request #2147 from penpot/niwinz-enhancements-20220808
Enhancements & Fixes
2022-08-10 07:46:02 +02:00
andy 29ff06dc6a 🌐 Added translation for: Japanese (jpn_JP). 2022-08-09 16:04:34 +02:00
Alejandro 42dd38b4ee Merge pull request #2151 from penpot/eva-show-next-btn-viewer
🎉 Make prev and next buttons fixed in viewer
2022-08-09 12:50:50 +02:00
Eva 5791ddda49 🎉 Make prev and next buttons fixed in viewer 2022-08-09 12:35:48 +02:00
Andrey Antukh 36def65c87 Merge pull request #2150 from penpot/eva-fix-recent-fonts
🐛 Fix recent fonts info
2022-08-09 12:25:32 +02:00
Eva 763877b713 🐛 Fix recent fonts info 2022-08-09 12:07:16 +02:00
Eva Marco b560c07243 Merge pull request #2149 from penpot/superalex-review-onboarding-questions
🎉 Review onboarding questions
2022-08-09 11:55:45 +02:00
Alejandro Alonso e6dcfec90c 🎉 Review onboarding questions 2022-08-09 11:39:55 +02:00
Andrey Antukh 58a06b8cf3 🐛 Ignore invalid file references on importing file-media-object 2022-08-08 12:16:31 +02:00
Andrey Antukh c30d4d313c 🐛 Force file-id association with file-media-object on exportation
This is needed because we may have situation when a file
is using a file-media-object reference from other file (probably
a library that is not included in the exportation); in this case
we need to forcely embed it.
2022-08-08 12:09:16 +02:00
Andrey Antukh 183e0bf985 Simplify select all implementation 2022-08-08 10:51:08 +02:00
Andrey Antukh aceefc0485 ♻️ Move comments mutations to commands 2022-08-08 10:36:15 +02:00
Andrey Antukh 0b3d25a890 Make frontend use new cmd based repo methods for comments queries 2022-08-08 09:51:11 +02:00
Andrey Antukh 173f0d68bb 📎 Properly deprecate comments related queries 2022-08-08 09:42:45 +02:00
Andrey Antukh 61f2799e49 🐛 Fix unexpected response truncation on viewer 2022-08-08 09:28:31 +02:00
Andrey Antukh 7611aec4c6 🐛 Fix unexpected response truncation on viewer 2022-08-08 09:00:27 +02:00
Andrey Antukh adbadc8743 ♻️ Refactor session management 2022-08-08 07:54:15 +02:00
Alejandro 6d61f75db6 Merge pull request #2144 from penpot/eva-improve-team-icon
💄 Improve team icon
2022-08-05 12:56:38 +02:00
Eva efa382c906 💄 Improve team icon 2022-08-05 11:24:34 +02:00
Eva Marco a54e0900d0 Merge pull request #2137 from penpot/superalex-fix-clipped-elements-affect-artboards-centering
🐛 Fix clipped elements affect artboards centering
2022-08-05 08:25:01 +02:00
Eva e1972692ab 👷 fix CI 2022-08-04 16:00:20 +02:00
Alejandro Alonso 9ffd00d821 🐛 Fix clipped elements affect artboards centering 2022-08-04 15:12:33 +02:00
Eva 33706e0bda 🎉 Add ellipsis to text 2022-08-04 13:54:35 +02:00
Alejandro 57ec9f8218 Merge pull request #2139 from penpot/eva-review-onboarding
🎉 Improve dashboard and onboarding css
2022-08-04 12:33:09 +02:00
Eva e863ef7dbf 🎉 Improve dashboard and onboarding css 2022-08-04 12:28:53 +02:00
Andrey Antukh 390ad34b13 Merge remote-tracking branch 'origin/staging' into develop 2022-08-04 10:43:12 +02:00
Andrey Antukh 29fa36ad2d Merge pull request #2140 from penpot/superalex-link-to-binary-versions-for-files-used-in-libraries-and-templates-carousel
🎉 Add binary file links to onboarding.edn
2022-08-04 09:24:14 +02:00
Alejandro Alonso fe7c01323a 🎉 Add binary file links to onboarding.edn 2022-08-04 09:22:36 +02:00
Andrew Zhurov 5febd35cfe 🐛 Fix layers get out of their group when moved
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-04 07:11:43 +02:00
Andrey Antukh 1df9f0b29e Merge pull request #2131 from penpot/andrewzhurov-3932-layers-get-out-of-the-group-when-moved
🐛 Fix layers get out of the group when moved
2022-08-04 07:09:29 +02:00
Andrey Antukh 74c6556ad6 ♻️ Refactor some page helpers usage 2022-08-04 07:08:18 +02:00
Andrew Zhurov d270c9670e 🐛 Fix layers get out of their group when moved
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-04 07:08:18 +02:00
Alejandro b926409fa2 Merge pull request #2135 from penpot/eva-bugfixes-1.15
🐛 Bugfixes Eva
2022-08-04 06:52:33 +02:00
Pablo Alba 87419d63a5 Merge pull request #2138 from penpot/niwinz-builtin-templates
Builtin Templates Load & RPC command for clone
2022-08-03 17:44:53 +02:00
Andrey Antukh 53d7c4332d 🎉 Add prefetch builtin templates script 2022-08-03 17:06:53 +02:00
Andrey Antukh 6981d92b11 🎉 Add RPC method for retrieve the list of builtin templates 2022-08-03 14:46:51 +02:00
Andrey Antukh 052404b1b4 🎉 Add complete list of onboarding builtin files 2022-08-03 14:41:32 +02:00
Andrey Antukh b8b60d9208 🎉 Add RPC command for clone builtin template 2022-08-03 14:28:33 +02:00
Andrey Antukh ed701fd9c5 ♻️ Move management mutations to commands 2022-08-03 14:28:33 +02:00
Andrey Antukh d832482dae 🎉 Add builtin template loading mechanism 2022-08-03 14:28:33 +02:00
Andrey Antukh fd08511514 Merge pull request #2129 from penpot/palba/select-all-group
 Select all inside a group select only the objects at this …
2022-08-03 13:37:42 +02:00
Pablo Alba 812131fdbc Add new image to onboarding welcome 2022-08-03 13:35:44 +02:00
Pablo Alba 52cc91f4c4 Select all inside a group select only the objects at this group level 2022-08-03 11:37:33 +02:00
Andrey Antukh f455580cf7 Merge pull request #2124 from penpot/3799-dashboard-rework
3799 dashboard rework
2022-08-03 11:06:52 +02:00
Andrey Antukh 15d7b94940 🎉 Add convenience helper for http client 2022-08-03 09:49:24 +02:00
Andrey Antukh d30b6ac5b9 Reorganize resources directory 2022-08-03 09:49:24 +02:00
Alejandro 39fb391128 Merge pull request #2130 from penpot/niwinz-uuid-improvements
🎉 Replace current uuidv1 with custom v8
2022-08-03 09:38:23 +02:00
Andrey Antukh 77b1ebfcc6 Merge pull request #2132 from penpot/eva-modify-design-onboarding-modal
💄 Modify label in input
2022-08-03 09:34:42 +02:00
Andrey Antukh f5df0eacef Merge remote-tracking branch 'origin/staging' into develop 2022-08-03 09:33:48 +02:00
Andrey Antukh fdc01cfed5 Merge branch 'andrew-fixes-backports' into staging 2022-08-03 09:27:09 +02:00
Andrey Antukh 0cc51db533 📎 Update changelog 2022-08-03 09:26:29 +02:00
Andrey Antukh 4266d9be83 📎 Add missing entry on changelog 2022-08-03 09:25:38 +02:00
Eva 8795e134c1 🐛 Fix intro action in multi input 2022-08-03 09:23:36 +02:00
Andrew Zhurov 732755066e 🐛 Fix text alignment becoming undefined on pasting text from clipboard
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-03 09:23:07 +02:00
Andrew Zhurov 424e9faa8e 🐛 Fix paste frame removes all guides
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-03 09:22:57 +02:00
Andrey Antukh 8fe98b1f7a Merge pull request #2133 from penpot/superalex-add-audit-log-for-new-onboarding
🎉 Add audit log for new onboarding
2022-08-03 09:05:51 +02:00
Andrey Antukh 5c6212d7a2 📎 Comment not passing test of experimental code of new components
It should be revisited by @andres.moya
2022-08-03 09:05:28 +02:00
Andrey Antukh ed5ce777b9 📎 Uncomment frontend tests on common module 2022-08-03 09:05:28 +02:00
Andrey Antukh d477f74d13 📎 Change output feature set to :es2020 on test compiler options 2022-08-03 09:05:28 +02:00
Andrey Antukh fbfcb827ed 🎉 Replace current uuidv1 with custom v8 2022-08-03 09:05:28 +02:00
Alejandro Alonso b4d5ff3452 🎉 Add audit log for new onboarding 2022-08-03 08:55:34 +02:00
elhombretecla 4c03450b88 🎉 Add new CSS dashboard viewpoints 2022-08-03 08:32:24 +02:00
Eva 10e0a662e4 💄 Modify label in input 2022-08-02 11:00:43 +02:00
Andrey Antukh c62427501e Merge pull request #2128 from penpot/palba-copy-paste-layers-order
🐛 Fix copy and paste layers order
2022-08-02 10:27:55 +02:00
Pablo Alba 64217b34ca 🐛 Fix copy and paste layers order 2022-08-02 10:23:25 +02:00
Eva 140731cf34 🐛 Change default team image in config 2022-08-02 08:30:07 +02:00
Andrew Zhurov 39ae2ed98d 🐛 Fix svg upload
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-01 16:43:59 +02:00
Andrey Antukh 5336db4456 Merge pull request #2123 from andrewzhurov/3885-assets-library-not-showing-graphics
🐛 Fix svg upload
2022-08-01 16:42:17 +02:00
Andrey Antukh f301ec5d2f Merge pull request #2121 from andrewzhurov/3629-text-alignment-becomes-undefined-after-pasting-text-from-clipboard
🐛 Fix text alignment becoming undefined on pasting text from clipboard
2022-08-01 15:30:45 +02:00
Andrey Antukh 6237829445 📎 Add additional reformating to specs naming 2022-08-01 15:03:45 +02:00
Andrey Antukh abfca5c89a 📎 Add additional reformating to specs naming 2022-08-01 15:01:03 +02:00
Andrey Antukh d54ebaa0d7 Merge pull request #2125 from penpot/eva-component-delete-modal-plr
🎉 Add plurals to delete or unpublish lib modal
2022-08-01 14:42:49 +02:00
Andrey Antukh 5e57fb4023 📎 Fix linter issues introduced in the latest merges 2022-08-01 14:41:30 +02:00
Andrey Antukh c1daa4a4c4 Merge remote-tracking branch 'origin/staging' into develop 2022-08-01 14:38:09 +02:00
Andrey Antukh ddc7f412a4 📎 Mainly reformat specs code 2022-08-01 14:27:11 +02:00
Andrey Antukh f25222e441 Merge remote-tracking branch 'origin/staging' into develop 2022-08-01 14:05:04 +02:00
Eva ae20a06e97 🎉 Add plurals to delete or unpublish lib modal 2022-08-01 13:51:27 +02:00
Andrey Antukh 18970cb233 Merge pull request #2108 from penpot/hiru-main-instance
Components v2 (first PR)
2022-08-01 13:25:06 +02:00
Andrey Antukh 5cd12ac710 ⬆️ Update shadow-cljs to 2.19.8 2022-08-01 13:11:44 +02:00
Andrey Antukh 91baae3580 📎 Minor change on session internal timestamp handling 2022-08-01 13:10:01 +02:00
Andrew Zhurov a6ee1617ab 🐛 Fix svg upload
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-01 11:23:08 +03:00
Pablo Alba 01306841a9 Merge pull request #2084 from penpot/eva-alex-move-comments
❇️ Comments positioning
2022-08-01 10:03:03 +02:00
Eva 1c446a011e Move comments 2022-08-01 09:53:55 +02:00
Andrew Zhurov 0aa60b22b0 🐛 Fix text alignment becoming undefined on pasting text from clipboard
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-31 10:33:10 +03:00
Pablo Alba bcc7be16ad Merge pull request #2119 from penpot/eva-onboaring-teams
🎉  Improve team up invitation flow
2022-07-29 14:34:02 +02:00
Andrés Moya f4482eb5a7 Allow to set features by config file 2022-07-29 14:00:36 +02:00
Andrés Moya 0667089833 🔧 Some style enhancements and mini bug fix 2022-07-29 14:00:36 +02:00
Eva c108974ad2 Add info in modal 2022-07-29 14:00:36 +02:00
Eva dd5a6f7f50 🎉 Improve team up invitation flow 2022-07-29 13:02:07 +02:00
Andrés Moya a5bf1c03e7 🎉 Make components-v2 an optional feature 2022-07-29 09:29:25 +02:00
Andrés Moya 1ef37281e6 🎉 Auto sync when changing main instance 2022-07-29 09:29:24 +02:00
Andrés Moya eebd596fca ♻️ Use main-instance? attribute 2022-07-29 09:29:24 +02:00
Andrés Moya dcf18b3aee 🔧 Refactor sync-file for performance 2022-07-29 09:29:24 +02:00
Andrés Moya 43e0b5cfa5 🎉 Absorb colors and typographies 2022-07-29 09:29:24 +02:00
Andrés Moya 7da159d52a 🎉 Absorb components when deleting or unpublishing a library 2022-07-29 09:29:24 +02:00
Andrés Moya 54e0071c9c 🎉 Scaffolding to write unit tests of common types 2022-07-29 09:29:24 +02:00
Andrés Moya 165cdd871f 🎉 Allow to duplicate components with main instance 2022-07-29 09:29:24 +02:00
Andrés Moya ce09ea6eb5 🎉 Add library page for components on migration 2022-07-29 09:29:24 +02:00
Andrés Moya bdcbe46d0d ♻️ Move component instantiation to new types module 2022-07-29 09:29:24 +02:00
Andrés Moya 5dc7bc213f 🎉 Add the concept of 'main instance' 2022-07-29 09:29:22 +02:00
Andrey Antukh 758d0d8943 📎 Update changelog 2022-07-29 08:22:33 +02:00
Andrey Antukh f8fbb7abba Merge pull request #2113 from andrewzhurov/3887-paste-frame-removes-all-guides
🐛 Fix paste frame removes all guides
2022-07-29 08:21:04 +02:00
Andrey Antukh c6f74692ba Merge pull request #2111 from andrewzhurov/1962-double-click-icon-in-navigation-pane-to-focus-on-object-or-artboard
🎉 Add zoom to shape on double click upon its icon in navigation pane
2022-07-29 08:17:30 +02:00
Andrew Zhurov 98402ae1db 🎉 Add zoom to shape on double click upon its icon in navigation pane
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-28 20:40:49 +03:00
Andrew Zhurov 902c746dbb 🐛 Fix paste frame removes all guides
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-28 19:59:12 +03:00
Andrey Antukh 26fd1a261c Merge pull request #2116 from penpot/palba-review-info-slides
🎉 New style and content for onboarding slides
2022-07-28 15:24:30 +02:00
Pablo Alba b93b8a8966 🎉 Add new style and content for onboarding slides 2022-07-28 15:17:24 +02:00
Andrey Antukh 4e2dbdbebe Merge remote-tracking branch 'origin/staging' into develop 2022-07-28 11:58:30 +02:00
Alejandro 8379cc3625 Merge pull request #2094 from penpot/niwinz-enhancements-20220713
Bugfixes & Enhancements
2022-07-28 11:56:08 +02:00
Alejandro aa95114860 Merge pull request #2114 from penpot/andrewzhurov-2645-hovering-layers-bounding-box
Layer outlines hightlight on hovering
2022-07-28 11:43:43 +02:00
Andrey Antukh d084f17430 Add ssh client to devenv dockerfile 2022-07-28 11:14:59 +02:00
Andrey Antukh e3f878ef2f ♻️ Move doc ns from http to rpc ns 2022-07-28 11:14:59 +02:00
Andrey Antukh 7a3f1a36e9 📎 Fix linter issues 2022-07-28 10:53:23 +02:00
Andrey Antukh b3415d0d52 📎 Update changelog 2022-07-28 10:53:21 +02:00
Andrey Antukh 10f8d1365c 📎 Add todo about equality checks on refs ns 2022-07-28 10:52:40 +02:00
Andrey Antukh a48db277b9 Avoid recursive rerender and react warning 2022-07-28 10:52:40 +02:00
Andrey Antukh 9263f70d6a Use properly the react hook
We can't use hooks in a condition, the condition should be inside
the hook.
2022-07-28 10:52:40 +02:00
Andrey Antukh d2aa985714 Properly use use-fn hook on layer-item component on sidebar 2022-07-28 10:52:40 +02:00
Andrey Antukh b5796b4cdb Efficiency improvements on outlines component 2022-07-28 10:52:40 +02:00
Andrey Antukh c3f67e6358 💄 Many cosmetic and indentation changes on outlines component 2022-07-28 10:52:40 +02:00
Andrey Antukh 1477837cbf 💄 Use concat-vec helper instead of set + into 2022-07-28 10:52:40 +02:00
Andrey Antukh 5834e29b39 🔥 Remove unnecesary ref, viewport already has access to all local data 2022-07-28 10:52:40 +02:00
Andrew Zhurov 1fa25060a0 🎉 Add shape outline on hover upon layers in workspace contextual menu
Signed-off-by: Andrew Zhurov <zhurov.andrew@gmail.com>
2022-07-28 10:52:40 +02:00
Andrew Zhurov c354c560d4 🎉 Add shape outline on hover upon layers in the left sidebar of workspace
Signed-off-by: Andrew Zhurov <zhurov.andrew@gmail.com>
2022-07-28 10:52:40 +02:00
Alejandro 4b2729b041 Merge pull request #2112 from penpot/eva-viewer-full-screen
💄 Change some styles in viewer mode
2022-07-28 10:31:34 +02:00
Eva 5b658c2f8a 💄 Change some styles in viewer mode 2022-07-28 09:47:52 +02:00
Andrey Antukh 05a86581a5 Reorganize comments related rpc methods
Mutations becomes deprecated and queries moved to commands. The
old queries still maintained with deprecated flag.
2022-07-27 21:41:38 +02:00
Andrey Antukh 8237805cf5 🐛 Fix minor issues on page helpers 2022-07-27 21:41:38 +02:00
Andrey Antukh 8fd908a59f 💄 Add mainly cosmetic improvements to delete-shapes event impl 2022-07-27 21:41:38 +02:00
Andrey Antukh 07eab923f0 Improve doc endpoint
Add changes, added and deprecation notices
2022-07-27 21:41:38 +02:00
Andrey Antukh 2e077e3ea9 🐛 Fix awsns endpoint 2022-07-27 21:41:38 +02:00
Andrey Antukh 99dea51eea ⬆️ Update yetti to v9.3 (bugfixing) 2022-07-27 21:41:38 +02:00
Andrey Antukh e7ae8f5c58 🐛 Fix unexpected null pointer exception on decoding pgarray 2022-07-27 21:41:38 +02:00
Andrey Antukh ee51e8c719 Always assoc :iat claim to tokens for better traceability 2022-07-27 21:41:38 +02:00
Andrey Antukh b4ad907c73 📎 Improve clj-kondo hook impl for defservice 2022-07-27 21:41:38 +02:00
Andrey Antukh 8285cb8f62 🐛 Fix unexpected text positioning 2022-07-27 15:28:50 +02:00
Andrey Antukh 7f611c89e1 Merge branch 'staging' into develop 2022-07-27 15:10:51 +02:00
Andrey Antukh 00b6d76164 Merge remote-tracking branch 'origin/eva-new-file-placeholder' into develop 2022-07-27 14:36:41 +02:00
Andrey Antukh 333e1d32a2 Merge pull request #2097 from penpot/palba-fix-drag-drop-fonts
🐛 Fix drag and drop font assets in groups
2022-07-27 14:17:28 +02:00
Pablo Alba 58f93d2177 🐛 Fix drag and drop font assets in groups 2022-07-27 14:17:02 +02:00
Andrey Antukh 08c0070f22 Merge branch 'niwinz-scripts-and-fixes' into staging 2022-07-27 13:16:48 +02:00
Pablo Alba 6408689d4c Merge pull request #2110 from penpot/niwinz-scripts-and-fixes
Scripts & Fixes
2022-07-27 13:13:34 +02:00
Alejandro Alonso bfe54fe5e1 Improve audit log for create files 2022-07-27 13:07:28 +02:00
Andrey Antukh 14c28ccce7 Merge pull request #2095 from penpot/alotor-bugfixes
Alotor bugfixes
2022-07-27 12:59:31 +02:00
Andrey Antukh dece149c9e 🎉 Add migration for fix legacy storage object backend names 2022-07-27 12:55:43 +02:00
Andrey Antukh 9275f5e5ce Reorganize migrations directory 2022-07-27 12:55:43 +02:00
Andrey Antukh 483da5248f 🎉 Add internal script for move some legacy files stored on fs backend to s3 2022-07-27 12:55:43 +02:00
Andrey Antukh 4bf05c8a42 Minor reorganization of srepl namespace 2022-07-27 12:55:43 +02:00
Eva 1eede8442d Add new file creation button on placeholder 2022-07-27 10:54:05 +02:00
Ahmad HosseinBor 3778bb4b1d 🌐 Add translations for: Persian.
Currently translated at 50.6% (590 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-07-27 10:17:11 +02:00
Andrey Antukh 1174502cb8 Merge remote-tracking branch 'origin/staging' into develop 2022-07-26 11:54:16 +02:00
Andrey Antukh cd8578480f 🐛 Fix unexpected exception on i18n autodetect code 2022-07-26 11:52:43 +02:00
Andrey Antukh e5ebe0a295 Merge branch 'staging' into develop 2022-07-26 08:26:34 +02:00
Yaron Shahrabani d3dd2644ae 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-07-19 08:21:57 +02:00
alonso.torres d2a5344407 🐛 Fix problem with snap-pixel on resize 2022-07-15 14:48:05 +02:00
alonso.torres 48615ca5b2 🐛 Round coordinates in viewport and paths 2022-07-15 14:48:05 +02:00
Yaron Shahrabani b49348ff86 🌐 Add translations for: Hebrew.
Currently translated at 93.3% (1088 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-07-15 13:18:50 +02:00
Oğuz Ersen d9cc76f8ba 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-07-15 13:18:50 +02:00
alonso.torres f89ccac567 🐛 Fix problems with nested boards 2022-07-15 11:11:12 +02:00
alonso.torres b57ddf9dca 🐛 Fix problem with 180 degree rotations 2022-07-15 11:11:12 +02:00
alonso.torres 8e9ab32a9f 🐛 Fix moving frame-guides outside frames 2022-07-15 11:11:12 +02:00
alonso.torres fdbcf977f5 🐛 Fix problem with line-height and texts 2022-07-15 11:11:12 +02:00
alonso.torres cc6b3dcec6 🐛 Fix problem with group coordinates 2022-07-15 11:11:12 +02:00
alonso.torres 7abbcdf226 Move text position calculation outside foreign object 2022-07-15 11:11:12 +02:00
alonso.torres 4088e55c9f 🐛 Fix problem with span overflow 2022-07-15 11:03:13 +02:00
Andrey Antukh 54d9b02b4d Add specific font for persian and arabic locales
And remove deprecated and not used font files, simplifying
the font-face mixin.
2022-07-15 11:03:13 +02:00
Andrey Antukh b2da41720e ⬆️ Update npm dependencies on frontend submodule 2022-07-15 09:52:25 +02:00
Andrey Antukh 2b70331630 🐛 Fix custom fonts loading on dashboard thumbnails 2022-07-15 09:52:25 +02:00
Andrey Antukh 05c8ad8bf9 💄 Minor cosmetic changes on fonts loading code 2022-07-15 09:52:25 +02:00
Andrey Antukh 18ca2aca15 🐛 Fix font loading when text is only rendered as svg 2022-07-15 09:52:25 +02:00
Andrey Antukh 51023396bc 🎉 Add new version of gfonts reference file 2022-07-15 09:52:25 +02:00
Andrey Antukh 3e7b9805c9 Merge pull request #2099 from penpot/superalex-fix-worker-synchronize-cron-entries
🐛 Fix worker synchronize cron entries
2022-07-15 09:42:55 +02:00
Alejandro Alonso be0c810c5f 🐛 Fix worker synchronize cron entries 2022-07-15 08:03:06 +02:00
Andrey Antukh dd180d93f4 Merge pull request #2088 from penpot/alotor-autolayout
Autolayout basics
2022-07-14 09:54:49 +02:00
alonso.torres 3ac1760141 🎉 Add layout items options and feature toggle 2022-07-14 09:53:59 +02:00
alonso.torres 28abe785e8 Allow for rotated auto-layout 2022-07-14 09:53:59 +02:00
alonso.torres 5e5355230c 🎉 Add support for wrap layout 2022-07-14 09:53:59 +02:00
alonso.torres 6e5a23c190 Allows groups to reflow the layout on transform 2022-07-14 09:53:59 +02:00
alonso.torres 84c0825893 🐛 Fix problems with nested groups 2022-07-14 09:53:53 +02:00
Eva 51e8eea795 Changes in the layout UI 2022-07-14 09:53:53 +02:00
alonso.torres 7176bb6f1a 🎉 Add support for nested layouts 2022-07-14 09:53:53 +02:00
alonso.torres 1c8aef6fa8 🎉 Add packed basic layout positions 2022-07-14 09:53:33 +02:00
alonso.torres aeb8fa1896 🎉 Add basic left-right layout 2022-07-14 09:48:51 +02:00
alonso.torres 3c3664535e Store layout info in shape 2022-07-14 09:29:21 +02:00
Alejandro a958aed058 Merge pull request #2093 from penpot/niwinz-minor-release-1.14.2
Prepare the 1.14.2 minor release
2022-07-14 07:26:58 +02:00
Andrey Antukh e662a7090f Merge branch 'staging' into develop 2022-07-14 07:11:01 +02:00
Andrey Antukh 2e2b05a7a4 📎 Sort translations files 2022-07-14 07:10:05 +02:00
Andrey Antukh 4e5146c210 Merge remote-tracking branch 'weblate/develop' into translations 2022-07-14 07:08:42 +02:00
Andrey Antukh 4bac2f15a2 ⬆️ Use correct version of im4java (fixes tests) 2022-07-13 11:39:36 +02:00
Andrey Antukh 1c09328d0e 📎 Update version.txt file 2022-07-13 11:22:06 +02:00
alonso.torres 06905d5fa6 🐛 Fix SVG texts positioning inconsistencies 2022-07-13 11:22:06 +02:00
Andrey Antukh 46c9fc1c5f 🐛 Normalize return value from parse-client-ip function 2022-07-13 11:18:33 +02:00
Andrey Antukh b901a10aaa 🐛 Fix typographies grouping 2022-07-13 11:17:55 +02:00
Pablo Alba 9022520334 Merge pull request #2091 from penpot/eva-bugfix-share
🐛 Fix overlay and shadows of modal body
2022-07-13 11:10:32 +02:00
Andrey Antukh c4bdb84d70 Merge pull request #2089 from penpot/palba-create-shared-link-log
 Add audit log for create shared link
2022-07-13 11:03:18 +02:00
Eva edad00ad95 🐛 Fix overlay and shadows of modal body 2022-07-13 08:15:03 +02:00
Pablo Alba 8ac32fc3c2 Add audit log for create shared link 2022-07-12 13:07:51 +02:00
Andrey Antukh 641ebf8b8e 📎 Increase version 2022-07-12 11:57:51 +02:00
Andrey Antukh 8c84cc7fa0 📎 Update changelog 2022-07-12 11:56:35 +02:00
Andrey Antukh 40415bb0d8 Merge branch 'develop' into staging 2022-07-12 11:55:13 +02:00
alonso.torres f2bd6a552f Feature toggle 2022-07-11 11:45:26 +02:00
Josep Ponsà 62bb3d9087 🌐 Add translations for: Catalan.
Currently translated at 99.5% (1105 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-07-09 13:14:47 +02:00
Alejandro 374f52a819 Merge pull request #2080 from penpot/superalex-set-project-on-binary-file-import
🐛 Fix set project on binary file import
2022-07-08 08:00:54 +02:00
Alejandro Alonso d140f15f37 🐛 Fix set project on binary file import 2022-07-08 07:43:44 +02:00
Alejandro f32bb56b95 Merge pull request #2079 from penpot/superalex-set-project-on-binary-file-import
🐛 Fix set project on binary file import
2022-07-08 06:47:22 +02:00
Alejandro Alonso 37e9adc6b6 🐛 Fix set project on binary file import 2022-07-08 06:43:04 +02:00
Alejandro 602cead4ae Merge pull request #2077 from penpot/niwinz-asserts-improvements
Asserts & binfile cosmetic refactor
2022-07-07 13:19:02 +02:00
Andrey Antukh aadb7cb1bf Don't call rp/command internal method 2022-07-07 13:12:38 +02:00
Andrey Antukh d60f849089 💄 Cosmetic refactor of binfile internal API impl 2022-07-07 13:08:18 +02:00
Andrey Antukh 98190ed92d ♻️ Improve the asserts framework 2022-07-07 12:29:13 +02:00
Andrey Antukh c02e8ff883 Print the spec error explain to logging message 2022-07-07 12:29:13 +02:00
Andrey Antukh 4d55ed4860 Ensure vector ids on export debug handler 2022-07-07 12:29:13 +02:00
Andrey Antukh 5e2c1fb4cd 🎉 Add missing predicate on util/bytes ns 2022-07-07 12:29:13 +02:00
Andrey Antukh f9447029f3 🔥 Remove some deprecated config attrs 2022-07-07 12:28:13 +02:00
Andrey Antukh 2a9c8eb9af 📎 Print parsed flags on start 2022-07-07 12:28:13 +02:00
Andrey Antukh cdcf3facd2 🐛 Fix flags parsing order 2022-07-07 12:28:13 +02:00
Alejandro Alonso 5c696851bf 📎 Update CHANGES.md file 2022-07-07 11:48:41 +02:00
Andrey Antukh c8051633d9 Merge pull request #2076 from penpot/superalex-frontend-binary-file-support
  Frontend binary file support
2022-07-07 11:42:46 +02:00
Alejandro Alonso 17645bb2a7 Frontend support for binary files 2022-07-07 11:37:34 +02:00
Alejandro 2fe770e0bb Merge pull request #2075 from penpot/niwinz-export-embed-assets
Embed assets and multiple files support for binfile export
2022-07-07 07:31:05 +02:00
Andrey Antukh d032953121 Enable exporte multiple files in binfile format 2022-07-06 16:05:10 +02:00
Andrey Antukh f4f58bc163 Add parameters validation to binfile write-export! fn 2022-07-06 16:05:10 +02:00
Andrey Antukh d90b4370fb 📎 Update default devenv logging configuration 2022-07-06 16:05:10 +02:00
Andrey Antukh ade41f77f3 📎 Add some notes to assets ns in sidebar 2022-07-06 16:05:10 +02:00
Andrey Antukh c405e9a7a3 🔥 Remove unused code 2022-07-06 16:05:10 +02:00
Andrey Antukh 50f30eb12f Add the ability to embed assets on export binfile 2022-07-06 16:01:21 +02:00
Alejandro 6b8ab7aa72 Merge pull request #2072 from penpot/niwinz-update-ubuntu-and-openjdk-on-docker-images
⬆️ Update docker images system dependencies
2022-07-06 11:18:10 +02:00
Alejandro 0dac3f7845 Merge pull request #2071 from penpot/niwinz-improve-api-documentation-output
 Improve _doc endpoint output format
2022-07-06 11:17:22 +02:00
Andrey Antukh 537fff4c80 ⬆️ Update docker images system dependencies 2022-07-05 11:51:36 +02:00
Andrey Antukh dd130615a1 Improve _doc endpoint output format 2022-07-05 11:04:37 +02:00
Andrey Antukh 356ff4683d Revert "📎 Allow set statement timeout on db module"
This reverts commit 70028e1371.
2022-07-04 14:04:56 +02:00
Andrey Antukh 70028e1371 📎 Allow set statement timeout on db module 2022-07-04 13:34:17 +02:00
Andrey Antukh a3580a5ab9 📎 Update log4j2 default configuration 2022-07-04 12:41:55 +02:00
Alejandro 6bb5fb0361 Merge pull request #2068 from penpot/niwinz-fix-worker-cron-locking-mechanism
🐛 Fix cron scheduler locking mechanism
2022-07-04 12:30:10 +02:00
Andrey Antukh f2140a1421 🐛 Fix cron scheduler locking mechanism
And add improved logging to the worker/cron code
2022-07-04 11:32:36 +02:00
Alejandro f7f9ba99f7 Merge pull request #2067 from penpot/niwinz-auth-improvements
♻️ Refactor auth code
2022-07-04 11:28:26 +02:00
Andrey Antukh 14d1cb90bd ♻️ Refactor auth code 2022-07-04 11:23:33 +02:00
Lucie Lesage 11f7efb850 🌐 Add translations for: French.
Currently translated at 71.3% (792 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-07-02 11:14:04 +02:00
Locness a16606c8e3 🌐 Add translations for: French.
Currently translated at 71.3% (792 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-07-01 10:17:03 +02:00
Lucie Lesage 7fe7b234bf 🌐 Add translations for: French.
Currently translated at 71.3% (792 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-07-01 10:17:03 +02:00
Alejandro Alonso ba4f558f62 Merge remote-tracking branch 'origin/staging' into develop 2022-07-01 08:21:02 +02:00
Alejandro 8446df2056 Merge pull request #2065 from penpot/eva-bugfix-selected
🐛 Fix color indicators from unlinked libraries
2022-07-01 08:20:21 +02:00
Alejandro 8f22c421de Merge pull request #2064 from penpot/palba-signin-register-from-shared-link
 Signin/Signup from shared link
2022-07-01 08:17:57 +02:00
Eva 2c0725a9d2 🐛 Fix color indicators from unlinked libraries 2022-07-01 08:05:27 +02:00
Pablo Alba 288dab3fe7 Signin/Signup from shared link 2022-07-01 07:39:57 +02:00
Eranot 672c52b369 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 47.9% (532 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-07-01 03:20:21 +02:00
Alejandro e458e3adb7 Merge pull request #2063 from penpot/alotor-refactor-data
♻️ Refactor workspace common
2022-06-30 13:15:10 +02:00
alonso.torres b38ffdcf30 ♻️ Refactor workspace common 2022-06-30 13:09:35 +02:00
Andrey Antukh 09a3cf4b58 Merge pull request #2062 from penpot/circleci-experiments
📎 Add additional CI step to circleci config
2022-06-30 07:55:24 +02:00
Alejandro 7406aac0c7 Merge pull request #2058 from penpot/niwinz-exporter-tmp-files
 Put all temporal files under the same directory
2022-06-30 07:31:14 +02:00
Andrey Antukh e44fb2cdbf 📎 Add additional CI step to circleci config 2022-06-29 23:00:45 +02:00
Andrey Antukh bfb0ba47f5 💄 Fix linter issues on exporter 2022-06-29 14:53:57 +02:00
Andrey Antukh 9c194ee3cb 🐛 Fix websocket unexpected exception on exportation module
A regression caused by the previous commit that refactos
the websockets API and its state management.
2022-06-29 14:39:56 +02:00
Andrey Antukh ebe8fdcba8 ♻️ Refactor temporal files management on exporter 2022-06-29 14:39:40 +02:00
Andrey Antukh d021ac0226 🐛 Fix share link migration for backward compatibilty 2022-06-29 12:30:17 +02:00
Alejandro Alonso 7256bdbcd5 Merge remote-tracking branch 'origin/staging' into develop 2022-06-29 12:00:52 +02:00
Alejandro 27d81ee47d Merge pull request #2060 from penpot/community-nav-link
🎉 Add new community link to dashboard and workspace menus
2022-06-29 12:00:13 +02:00
elhombretecla be304811d5 🎉 Add new community link to dashboard and workspace menus 2022-06-29 11:52:24 +02:00
Alejandro bd4548cd25 Merge pull request #2046 from penpot/niwinz-20220624-websockets-fixes
Websocket protocol diagnostic info & Some deps updates
2022-06-29 11:05:37 +02:00
Andrey Antukh cbc5811290 Improve websockets impl
Make it more extensible and move all the websocket unrelated stuff
to the new hooks API. Also adds observability from repl.
2022-06-29 11:01:16 +02:00
Andrey Antukh 935639411c ⬆️ Update devenv to use latest ubuntu lts and jdk18 2022-06-29 10:59:50 +02:00
Andrey Antukh 6de78cabd4 ⬆️ Update shadow-cljs cljs compiler on frontend and common 2022-06-29 10:59:50 +02:00
Andrey Antukh 73f1418c95 🐛 Normalize return value from parse-client-ip function 2022-06-29 10:59:50 +02:00
Alejandro cf2de3cfac Merge pull request #2030 from penpot/eva-palba-share-link
Eva palba share link
2022-06-29 10:55:16 +02:00
Alejandro Alonso 481c45ee60 Merge remote-tracking branch 'origin/staging' into develop 2022-06-29 10:38:35 +02:00
Alejandro 716b0639f2 Merge pull request #2057 from penpot/3565-community-access
🎉 Add new community links
2022-06-29 10:37:52 +02:00
elhombretecla ced3830d7a 🎉 Add new coomunity info 2022-06-29 10:34:41 +02:00
Pablo Alba 115314e97c In view mode allow comment/inspect to non-team users (by shared link permissions) 2022-06-29 09:41:30 +02:00
Alejandro Alonso d2250274f2 Merge remote-tracking branch 'origin/staging' into develop 2022-06-29 09:37:31 +02:00
Eva 0f04398e61 💄 Improve shared link modal 2022-06-29 09:31:41 +02:00
Eva Marco 72979e4535 Merge pull request #2056 from penpot/alotor-fix-resize
🐛 Fix problem with resize groups
2022-06-29 08:51:41 +02:00
alonso.torres a271a285ad 🐛 Fix problem with resize groups 2022-06-29 08:48:00 +02:00
Andrey Antukh b68407a6c0 Merge pull request #2054 from penpot/superalex-update-auth-urls-navigation
 Update auth urls navigation
2022-06-29 08:35:41 +02:00
Alejandro Alonso 5136eef4bc Update auth urls navigation 2022-06-29 08:05:22 +02:00
Alejandro f132651175 Merge pull request #2055 from penpot/hiru-types
♻️ Rename specs -> types
2022-06-29 06:33:21 +02:00
Andrés Moya 6f94745aed ♻️ Rename specs -> types
NO FUNCTIONALITY IS CHANGED in this commit, only moving things around
2022-06-29 06:25:06 +02:00
Ahmad HosseinBor 7052f64547 🌐 Add translations for: Persian.
Currently translated at 53.4% (593 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-06-28 15:16:38 +02:00
Alejandro Alonso 29220cd0d3 Merge remote-tracking branch 'origin/staging' into develop 2022-06-28 12:24:42 +02:00
Eva Marco ec55d64454 Merge pull request #2052 from penpot/superalex-fix-fill-information-not-complete-when-paste-plain-text
🐛 Fix fill information not complete when paste plain text
2022-06-28 12:21:54 +02:00
Alejandro Alonso e4eb8004e2 🐛 Fix fill information not complete when paste plain text 2022-06-28 12:18:31 +02:00
Andrey Antukh b1e6a8b1e9 Merge pull request #2051 from penpot/eva-component-name
 Show shape name in right toolbar
2022-06-28 11:37:09 +02:00
Eva da2214379c Show shape name in right toolbar 2022-06-28 11:33:28 +02:00
Alejandro 4d19ceff8d Merge pull request #2016 from penpot/niwinz-experiments-custom-export-import
Experimental support for binary file format for exportation/importation of penpot files
2022-06-27 13:23:06 +02:00
Andrey Antukh b944d977bb 🎉 Add binfile import/export internal functionality 2022-06-27 11:12:00 +02:00
Alejandro Alonso 07881eed65 Merge remote-tracking branch 'origin/staging' into develop 2022-06-27 09:28:54 +02:00
Alejandro f2862b6c16 Merge pull request #2039 from penpot/niwinz-hotfix-exporter-uri-param
🐛 Remove unused setting on exporter
2022-06-27 08:44:39 +02:00
Andrey Antukh ccae7cc2d4 📎 Clean and improve default docker config.env file 2022-06-27 07:40:06 +02:00
Pablo Alba c6de41421e Merge pull request #2033 from penpot/circleci-changes
Circleci changes
2022-06-27 07:16:40 +02:00
Andrey Antukh fa06da36ac 🐛 Remove unused setting on exporter
That causes many troubles on configuring exporter on the onpremise
instances but serves for nothing because it is completly unused.
2022-06-24 16:37:27 +02:00
Alejandro 03c019ded0 Merge pull request #2034 from wodin/wodin/fix-spelling-of-peek
📚 Fix spelling of 'sneak peek'
2022-06-24 13:31:21 +02:00
Alejandro 248ab953b2 Merge pull request #2038 from penpot/eva-bugfix-3
🐛 Fix color change in a row
2022-06-24 13:12:45 +02:00
Eva 14754aae05 🐛 Fix color change in a row 2022-06-24 12:35:23 +02:00
Alejandro dc7464220d Merge pull request #2028 from penpot/alotor-frames
 Improved nested boards thumbnail handling
2022-06-24 11:49:58 +02:00
Alejandro 7396410267 Merge pull request #2037 from penpot/niwinz-fix-region-spec-on-s3-storage-backend
Fix spec on S3 storage backend region parameter
2022-06-24 11:07:19 +02:00
Alejandro 9bd3cba58c Merge pull request #2035 from penpot/eva-bugfix-shortcuts
🐛 Fix shortcut acction in main menu
2022-06-24 10:59:56 +02:00
Andrey Antukh b08b1a546a 🐛 Fix region spec on s3 storage backend
This allows users use different region
2022-06-24 10:58:42 +02:00
alonso.torres 639eaa2458 Improved nested boards thumbnail handling 2022-06-24 10:47:33 +02:00
Eva ab1405b79c 🐛 Fix shortcut acction in main menu 2022-06-24 09:55:29 +02:00
Michael Wood ce14acac2c 📚 Fix spelling of 'sneak peek'
https://theoatmeal.com/comics/sneak_peek
2022-06-24 08:41:32 +02:00
Andrey Antukh 826bd29327 📎 Disable :non-arg-vec-return-type-hint linter on clj-kondo 2022-06-24 08:33:20 +02:00
Andrey Antukh 5151a7bd49 📎 Ignore linter issues on single function on frontend
Because it happens to the `new` function previuously defined
clash with the instance creation (probably linter bug).
2022-06-24 07:34:34 +02:00
Andrey Antukh 0ad0a65fa9 📎 Minor changes on circleci config 2022-06-24 07:29:14 +02:00
Alejandro 10a33fb102 Merge pull request #2027 from penpot/eva-bugfix-selected-colors
🐛 Fix modify colors in a row in selected colors
2022-06-23 15:57:34 +02:00
Alejandro b0c0c6ed43 Merge pull request #2026 from penpot/niwinz-hotfix-20220623
Minor fixes
2022-06-23 15:53:54 +02:00
Eva e31fbb5c5f 🐛 Fix modify colors in a row in selected colors 2022-06-23 15:07:40 +02:00
andy e2bdf1a155 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-06-23 14:19:39 +02:00
Andrey Antukh 5e2ff2cf6f 📎 Minor update on telemetry task 2022-06-23 14:17:26 +02:00
Andrey Antukh c211e84498 🐛 Fix incorrect register-profile audit log handling 2022-06-23 14:17:26 +02:00
alonso.torres 75dc9e64a7 Merge remote-tracking branch 'origin/staging' into develop 2022-06-23 13:55:24 +02:00
Alejandro Alonso 69810750c5 📎 Tag new minor release 2022-06-23 13:47:27 +02:00
Alejandro 4549281b6c Merge pull request #2025 from penpot/alotor-fix-path-performance
 Improved performance when rendering paths
2022-06-23 13:46:59 +02:00
alonso.torres 90532b760a Improved performance when rendering paths 2022-06-23 13:24:03 +02:00
Alejandro eb190296d7 Merge pull request #2021 from penpot/alotor-frames
 Fix shadows in frames for dashboard and viewer
2022-06-22 11:45:29 +02:00
Andrey Antukh 46d075611d ♻️ Adapt media & fonts handling to new tmp service
And storage backend changes
2022-06-22 11:39:57 +02:00
Andrey Antukh ebcb385593 ♻️ Minor refactor on storages
Fix many issues on FS & S3 backend; removes the unused and broken
DB backend. Normalize operations on bytes and byte streams on a
separated namespace: app.util.bytes
2022-06-22 11:37:45 +02:00
alonso.torres 8e60834292 Fix shadows in frames for dashboard and viewer 2022-06-22 11:18:55 +02:00
Eva Marco 6469a543ba Merge pull request #2023 from penpot/niwinz-hotfix-20220622
🚑 Fix unexpected exception on typography asset context menu
2022-06-22 09:39:07 +02:00
Andrey Antukh 666b9fa4d4 🚑 Fix unexpected exception on typography asset context menu 2022-06-22 09:36:34 +02:00
Eva Marco 137c10f631 Merge pull request #2018 from penpot/eva-fix-double-click-viewer
🐛 Fix double click crash on viewer layers
2022-06-22 09:34:22 +02:00
Eva ac1167d0c9 🐛 Fix double click crash on viewer layers 2022-06-22 09:31:13 +02:00
Eva Marco e1d6cded62 Merge pull request #2019 from penpot/palba-view-mode-improvements-2
On view mode only show arrows on hover
2022-06-21 11:52:52 +02:00
Pablo Alba 53df0f7585 On view mode only show arrows on hover 2022-06-21 11:10:05 +02:00
Alejandro 95829ff3de Merge pull request #2014 from penpot/3487-release-1.14
🎉 Adds new release info and images
2022-06-21 10:22:09 +02:00
alonso.torres 6d4e898f79 Merge remote-tracking branch 'origin/staging' into develop 2022-06-21 09:30:54 +02:00
Alejandro 2bed06de64 Merge pull request #2017 from penpot/hiru-fix-asset-names
🐛 Fix display of asset names and console warning
2022-06-21 06:46:22 +02:00
Andrés Moya a08c1b1278 🐛 Fix display of asset names and console warning 2022-06-20 18:15:26 +02:00
Alejandro 3053e867cb Merge pull request #2006 from penpot/alotor-fix-thumbnails-viewer
🐛 Fix thumbnails in viewer thumbnails
2022-06-20 16:24:57 +02:00
Andrey Antukh 3a55f07f45 🐛 Remove duplicate work on storing already existing files in storage 2022-06-20 14:17:31 +02:00
Alejandro 408f73396f Merge pull request #2000 from penpot/alotor-frames
Nested/Rotated Boards
2022-06-20 11:51:03 +02:00
Andrey Antukh 7cdbadc5b7 Merge pull request #2015 from penpot/alotor-fix-text-problem
🐛 Fix problem with empty text boxes events
2022-06-20 11:34:25 +02:00
alonso.torres fb1dbd6f31 🐛 Fix problem with empty text boxes events 2022-06-20 11:29:52 +02:00
elhombretecla 9dabe2959f 🎉 Adds new release info and images 2022-06-20 06:47:08 +02:00
Ahmad HosseinBor 2d61497159 🌐 Add translations for: Persian.
Currently translated at 51.2% (569 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-06-19 06:19:08 +02:00
Wang Jiaxiang c582ae667b 🌐 Add translations for: Chinese (Simplified).
Currently translated at 85.7% (952 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-06-19 06:19:06 +02:00
alonso.torres 529fb350fa 🐛 Fix thumbnails in viewer thumbnails 2022-06-17 14:39:07 +02:00
alonso.torres e638475a67 Handoff handling nested frames 2022-06-17 14:26:32 +02:00
alonso.torres 1bde183c50 🐛 Fix thumbnails in viewer thumbnails 2022-06-17 14:24:37 +02:00
alonso.torres 45b690ed05 Fix shadows and thumbnails 2022-06-17 13:15:27 +02:00
alonso.torres 2799c09294 Fix interaction targets 2022-06-17 12:54:51 +02:00
alonso.torres a774f4d4fa Fix guides, grids and constraints for nested frames 2022-06-17 12:54:51 +02:00
alonso.torres 2e3f443758 Fix problems with shadows and strokes for nested frames 2022-06-17 12:54:51 +02:00
alonso.torres e0a1da6bca 🐛 Fix problems with thumbnails 2022-06-17 12:54:51 +02:00
alonso.torres 108291337d Improved frame indices 2022-06-17 12:54:51 +02:00
alonso.torres ca326ac231 Fix dashboard thumbnails for nested frames 2022-06-17 12:54:51 +02:00
alonso.torres 566dde21a5 Fix viewer for new frames 2022-06-17 12:54:51 +02:00
alonso.torres cab2b8469e Fix nested frames with thumbnails 2022-06-17 12:54:51 +02:00
alonso.torres a37233be1e 🐛 Improved thumbnails rendering 2022-06-17 12:54:51 +02:00
alonso.torres b4e218c13a Fix copy/paste for multiple frames 2022-06-17 12:54:51 +02:00
alonso.torres 9bd382f833 Fixed export/import for nested frames 2022-06-17 12:54:51 +02:00
alonso.torres a4cc57886b Thumbnails for clipped and nested artboards 2022-06-17 12:54:51 +02:00
alonso.torres 0bb0063be4 Fix comments for nested frames 2022-06-17 12:54:51 +02:00
alonso.torres 79a46efa35 Create nested frames from selection 2022-06-17 12:54:51 +02:00
alonso.torres c8ad379bf8 Adapted viewer for new frames 2022-06-17 12:54:50 +02:00
alonso.torres 8c5cc446b0 Improved hover behavior 2022-06-17 12:51:24 +02:00
alonso.torres 688ec2589a Changes in selection feedback 2022-06-17 12:51:24 +02:00
alonso.torres aa584e6d35 ♻️ Refactor transform matrix 2022-06-17 12:51:24 +02:00
alonso.torres a9303c37c4 Allow for nested frames 2022-06-17 12:51:24 +02:00
Alejandro 0bbd898173 Merge pull request #2002 from penpot/palba-improvements-view-mode
🎉 Improvements on view mode
2022-06-17 11:33:19 +02:00
Pablo Alba ae468ecdf2 🎉 Improvements on view mode 2022-06-17 11:05:43 +02:00
Pablo Alba 0654741e28 🎉 Navigate to the original link after log in 2022-06-17 10:22:11 +02:00
Andrey Antukh c60c04f167 Merge pull request #2004 from penpot/alotor-bugfixing
1.14 Bugfixes
2022-06-17 08:22:02 +02:00
Eva 8f7fd21454 New layout and layout item menur 2022-06-16 18:55:35 +02:00
alonso.torres 24d23d9e5a 🐛 Fix visual glitch with thumbnails 2022-06-16 18:50:01 +02:00
alonso.torres 66cec51c44 🐛 Fix text problem 2022-06-16 10:40:33 +02:00
Alejandro 65b6d1e07b Merge pull request #2001 from penpot/niwinz-telemetry-enhacements-2
Minor improvements
2022-06-15 12:29:04 +02:00
Andrey Antukh adf2d82a52 🎉 Add proper logging reports on audit-log-archive task 2022-06-15 12:21:23 +02:00
Andrey Antukh dce479bc4b Make the pool initialization process and defaults reusable
And add the ability to skip pool initialization if no enough data is
provided. Mainly for initialize pools based on configuration for not
essential/dynamic services.
2022-06-15 12:19:16 +02:00
Andrey Antukh 199360efa6 📎 Update default repl script 2022-06-15 12:18:39 +02:00
Alejandro Alonso 943fa880a7 Merge remote-tracking branch 'origin/staging' into develop 2022-06-15 12:00:31 +02:00
Alejandro Alonso 5e2a7e76f3 Merge remote-tracking branch 'origin/main' into staging 2022-06-15 12:00:14 +02:00
Andrey Antukh e0bd3425bc Merge pull request #1999 from penpot/superalex-add-project-ids-to-create-file-audit-log
 Add project ids to create-file mutation for audit log
2022-06-15 10:53:33 +02:00
Locness 963df4b44f 🌐 Add translations for: French.
Currently translated at 70.2% (780 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-06-15 10:19:07 +02:00
Alexandre Pawlak 32b2b46df7 🌐 Add translations for: French.
Currently translated at 70.2% (780 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-06-15 10:19:07 +02:00
Alejandro Alonso 667598a0eb Add project ids to create-file mutation for audit log 2022-06-15 07:49:05 +02:00
Alejandro 58a1060ed8 Merge pull request #1997 from penpot/niwinz-make-s3-storace-region-optional
 Make the region param optional on s3 storage backend
2022-06-14 13:33:10 +02:00
Alejandro b3f8d98c34 Merge pull request #1996 from penpot/niwinz-im4java-fix
⬆️ Update im4java version to our internal fork version
2022-06-14 13:11:07 +02:00
Andrey Antukh 20f357d75d Make the region param optional on s3 storage backend
Defaulting to the eu-central-1
2022-06-14 12:13:47 +02:00
Alejandro Alonso 310c322883 🐛 Fix show baground on export arboards 2022-06-14 11:26:19 +02:00
Andrey Antukh 9ae5528355 ⬆️ Update im4java version to our internal fork version
It fixes the v7 compatibility issues. Now, adding the -Dim4java.useV7=true
property to the java command when executing the penpot backend bundle it
switches to use the `magick` (ImageMagick v7 CLI) instead of `convert`
and `identify`.
2022-06-14 11:09:48 +02:00
Alexandre Pawlak e7e231b719 🌐 Add translations for: French.
Currently translated at 67.5% (750 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-06-14 09:44:28 +02:00
Alejandro Alonso 69cb626cab Merge remote-tracking branch 'origin/staging' into develop 2022-06-14 09:14:07 +02:00
Alejandro Alonso 7f9d070692 Merge remote-tracking branch 'origin/main' into staging 2022-06-14 09:13:33 +02:00
Andrey Antukh 206ffcc6e8 Merge pull request #1995 from penpot/superalex-add-team-and-project-ids-to-update-file-audit-log
 Add team and project ids to update-file mutation for audit log
2022-06-14 09:12:21 +02:00
Alejandro Alonso 6b5ee24010 Add team and project ids to update-file mutation for audit log 2022-06-14 09:08:06 +02:00
Andrey Antukh 2132bad898 🐛 Add missing resolver to frontend docker image 2022-06-13 15:54:28 +02:00
Andrey Antukh 189d33221e 🐛 Add missing resolver to frontend docker image 2022-06-13 15:54:03 +02:00
Alejandro 5870d25bec Merge pull request #1993 from penpot/niwinz-update-deps
⬆️ Update deps & linter fixes
2022-06-13 15:53:40 +02:00
Andrey Antukh 6190ce9b35 🐛 Add missing resolver to frontend docker image 2022-06-13 14:44:40 +02:00
Andrey Antukh 65753cdc17 ⬆️ Update yetti dep (fix multipart field size validation params handling) 2022-06-13 13:42:32 +02:00
Andrey Antukh 1174590af4 📎 Add hack for devtools unhandled rejection 2022-06-13 13:10:36 +02:00
Andrey Antukh e5cb5860a8 ⬆️ Update cuerdas dep (fixes dm/str nil handling) 2022-06-13 13:01:31 +02:00
Andrey Antukh 65e99cabbf 📎 Fix linter issues
Related to the linter update on devenv
2022-06-13 11:18:35 +02:00
Andrey Antukh 97bf20dd4c ⬆️ Update dependencies 2022-06-13 11:18:02 +02:00
Alejandro Alonso a3fd5d6516 📚 Update changelog 2022-06-13 10:16:10 +02:00
ascarida c26273c9b3 🌐 Add translations for: Galician.
Currently translated at 12.7% (142 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-06-11 11:14:34 +02:00
Alexandre Pawlak 7e1a771e24 🌐 Add translations for: French.
Currently translated at 67.3% (748 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-06-11 11:14:33 +02:00
Locness fa7b0d3b35 🌐 Add translations for: French.
Currently translated at 67.3% (748 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-06-11 11:14:33 +02:00
Alejandro Alonso 85f2804af8 📎 Tag new minor release 2022-06-10 08:24:13 +02:00
Alejandro Alonso d9420081c4 Merge remote-tracking branch 'origin/staging' into develop 2022-06-09 13:45:25 +02:00
Alejandro Alonso 424dd5c41a Merge remote-tracking branch 'origin/main' into staging 2022-06-09 13:45:13 +02:00
Alejandro Alonso 97f5f54d1c 📎 Tag new minor release 2022-06-09 13:44:22 +02:00
Alejandro e6b80bf73e Merge pull request #1988 from penpot/superalex-fix-exporter-to-frontend-communication
🐛 fix exporter to frontend communication
2022-06-09 13:43:49 +02:00
Alejandro Alonso bc3914e7e0 🐛 Fix exporter to frontend communication 2022-06-09 13:39:59 +02:00
Alejandro Alonso e6b1c578d4 Merge remote-tracking branch 'origin/staging' into develop 2022-06-09 08:55:23 +02:00
Alejandro Alonso 801cdd940a Merge remote-tracking branch 'origin/main' into staging 2022-06-09 08:55:05 +02:00
Alejandro Alonso 28b6175943 📎 Tag new minor release 2022-06-09 08:47:55 +02:00
Alejandro Alonso ba85dcf1a3 🐛 Fix orientation artboard preset does not work with differently sized artboards 2022-06-08 13:11:59 +02:00
Alejandro Alonso c3486c566a 🐛 Fix exporter to frontend communication 2022-06-08 13:09:16 +02:00
andy 437e352bf4 🌐 Added translation for: Galician. 2022-06-08 08:05:32 +02:00
Andrés Moya 71501d966c 🐛 Fix resize parents when there are nested groups 2022-06-07 14:36:26 +02:00
alonso.torres 288e6e1ea1 Merge remote-tracking branch 'origin/staging' into develop 2022-06-07 13:02:32 +02:00
alonso.torres 8bb2f20eae 🐛 Fix problem with shadow spec 2022-06-07 12:53:48 +02:00
alonso.torres a8c3ac630d ⬆️ Update to version 1.15.0-beta 2022-06-06 15:27:55 +02:00
alonso.torres 0fcd414792 📚 Update changelog 2022-06-06 15:27:24 +02:00
alonso.torres da6675c91e 📚 Update changelog 2022-06-06 15:26:40 +02:00
alonso.torres 9eba666c31 Merge remote-tracking branch 'origin/main' into develop 2022-06-06 15:23:22 +02:00
alonso.torres 1764d965c1 📚 Upgrade to version 1.13.4-beta 2022-06-06 15:22:23 +02:00
Alejandro Alonso a120630a7f 🐛 Fix environment import for exporter at docker 2022-06-06 13:23:40 +02:00
Alejandro f33ad5e8fa Merge pull request #1972 from penpot/hiru-fix-orphaned-shapes
 Add script to fix broken objects
2022-06-06 13:18:07 +02:00
Andrés Moya f04859f8a6 Add script to fix broken objects 2022-06-06 12:56:37 +02:00
Alejandro Alonso 31aed2aaa4 🐛 Fix base background not visible for imported svg 2022-06-06 12:34:19 +02:00
Alejandro 18109b2387 Merge pull request #1976 from penpot/hiru-fix-scrollintoview
🐛 Fix auto scroll layers panel in firefox
2022-06-06 11:05:35 +02:00
Andrés Moya a0cc8a06b6 🐛 Fix auto scroll layers panel in firefox 2022-06-06 10:21:32 +02:00
Oğuz Ersen 3b26ec6b8c 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-06-05 15:15:47 +02:00
Ahmad HosseinBor 71ce0b66e0 🌐 Add translations for: Persian.
Currently translated at 28.4% (316 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-06-03 21:13:58 +02:00
Pablo Alba 4c1903b4e8 💄 Change text properties position at the sidebar 2022-06-03 12:42:35 +02:00
Pablo Alba 462ec0c12a Merge pull request #1973 from penpot/alotor-more-hotfixes
Hotfixes
2022-06-03 10:59:26 +02:00
Alejandro Alonso 2b61b1768f 🐛 Fix exporter white list domains configuration 2022-06-03 07:43:19 +02:00
alonso.torres 424630a67f 📚 Update changelog 2022-06-02 22:53:50 +02:00
alonso.torres 14b1970a8a 🐛 Fix concurrent thumbnail modification 2022-06-02 22:37:33 +02:00
alonso.torres 541168aee4 🐛 Fix problem with some data and text input 2022-06-02 22:35:59 +02:00
alonso.torres 6e9a77edcd 🐛 Fix undo for drawing curves 2022-06-02 22:31:27 +02:00
Pablo Alba 8d1cd2f56d 🐛 Empty groups were not deleted 2022-06-02 16:53:01 +02:00
Pablo Alba 65cda41245 Merge pull request #1970 from penpot/eva-shortcuts2
 Shortcuts improvements
2022-06-02 16:50:42 +02:00
Eva c029948cce Shortcuts improvements 2022-06-02 16:40:46 +02:00
Pablo Alba 32540f1ba5 🐛 Components groups were not exported 2022-06-02 16:40:00 +02:00
alonso.torres 5d20815776 Merge remote-tracking branch 'origin/main' into develop 2022-06-01 10:42:59 +02:00
alonso.torres 0b149dd302 ⬆️ Update to 1.13.3-beta 2022-06-01 10:41:08 +02:00
Pablo Alba 662fc073df Merge pull request #1966 from penpot/alotor-fix-font-loading
🐛 Fix problem with font loading
2022-06-01 10:37:30 +02:00
alonso.torres 46be4ca6d1 🐛 Fix problem with font loading 2022-06-01 09:38:27 +02:00
Ahmad HosseinBor 784365f45c 🌐 Add translations for: Persian.
Currently translated at 27.4% (305 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-05-31 15:14:29 +02:00
alonso.torres 23d3e88214 Merge remote-tracking branch 'origin/main' into develop 2022-05-31 11:15:10 +02:00
Alejandro Alonso c356ae6de8 🐛 Fix github auth without name 2022-05-31 10:26:13 +02:00
Pablo Alba c5e872b81d 🐛 Remove default font on team change 2022-05-30 14:19:34 +02:00
Alejandro Alonso 0307e58fbe 🐛 Fix old texts with opacity and no fill 2022-05-30 12:40:07 +02:00
Alejandro 5c14c3fafc Merge pull request #1960 from penpot/alotor-fixes
🐛 Fix thumbnails. Add safety text position
2022-05-30 12:21:40 +02:00
alonso.torres 321c3fb34b 🐛 Fix problem with missplaced texts 2022-05-30 12:09:04 +02:00
alonso.torres 4764674374 🐛 Fix thumbnails. Add safety text position 2022-05-30 12:09:04 +02:00
Pablo Alba 0416988913 Set invitations expiration to 7 days 2022-05-30 10:41:23 +02:00
Eva Marco 72251f57b1 Merge pull request #1957 from yarons/patch-1
Typo fix
2022-05-30 10:21:45 +02:00
Vincas Dundzys 05aee3507a 🌐 Add translations for: Lithuanian.
Currently translated at 8.9% (99 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lt/
2022-05-28 23:16:02 +02:00
Radek Sawicki f651b7585d 🌐 Add translations for: Polish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2022-05-28 23:16:02 +02:00
Yaron Shahrabani 68e603a86c 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-05-28 23:16:01 +02:00
Andrés Moya 52adf7eaf1 🌐 Add translations for: English.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2022-05-28 23:16:00 +02:00
Andrés Moya ec884787f1 🔧 Fix docker dependencies 2022-05-27 13:57:33 +02:00
alonso.torres c08ad5c8c0 ⬆️ Update version 1.13.2-beta 2022-05-27 10:29:39 +02:00
alonso.torres 3d8c41cd69 Merge remote-tracking branch 'origin/main' into develop 2022-05-27 09:25:22 +02:00
alonso.torres 2ce766c49e 🐛 Fix performance issue with focus mode 2022-05-26 17:55:19 +02:00
Alejandro bb18a69394 Merge pull request #1958 from penpot/alotor-improved-thumbnail-generation
 Improved frame generation performance
2022-05-26 16:51:13 +02:00
alonso.torres 96ed66d86e Improved frame generation performance 2022-05-26 16:33:16 +02:00
Yaron Shahrabani be7733a2cf Typo fix
intertactions -> interactions
2022-05-26 15:38:49 +03:00
Eva 57ccb18517 💄 remove console 2022-05-26 13:58:00 +02:00
Andrés Moya d5df465992 🌐 Add Norwegian, Persian and Chinese (Traditional) 2022-05-26 12:48:36 +02:00
Alejandro Alonso ea6c34f6b2 🐛 Fix github auth without public email 2022-05-26 11:16:09 +02:00
Andrés Moya 36390be72a 🌐 Add new Polish language 2022-05-26 11:10:16 +02:00
alonso.torres 3c41693787 :docs: Update changelog 2022-05-25 21:45:21 +02:00
alonso.torres b25806b172 🐛 Fix problem with auto-width initial text 2022-05-25 21:43:50 +02:00
Alejandro 0828d43f8f Merge pull request #1954 from penpot/alotor-fix-cache-embeds
🐛 Fix problems with embed data cache
2022-05-25 18:16:15 +02:00
alonso.torres 402212c808 🐛 Fix problems with embed data cache 2022-05-25 18:00:23 +02:00
Andrés Moya 8d51e32c5a 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-05-25 17:29:50 +02:00
Andrés Moya 11b2144274 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-05-25 17:20:51 +02:00
Andrés Moya 8c51d1ac95 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1110 of 1110 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-05-25 17:17:58 +02:00
Eva Marco 64e2fa9e2f Merge pull request #1951 from penpot/palba-change-emails-footer
💄 Update footer in emails
2022-05-25 17:14:16 +02:00
Eva Marco 216dbc8e0d Merge pull request #1950 from penpot/palba-invitations-validation
Palba invitations validation
2022-05-25 17:01:21 +02:00
Pablo Alba fa5b0ed6ac 💄 Update footer in emails 2022-05-25 16:56:40 +02:00
Eva Marco 67b81fbe67 Merge pull request #1949 from penpot/palba-fix-importing-old-penpot-files-frames
Palba fix importing old penpot files frames
2022-05-25 16:50:29 +02:00
Andrés Moya 89f485a674 🌐 Revise translations file format 2022-05-25 16:32:10 +02:00
Hosted Weblate fcafe66bd8 🌐 Cherry-pick texts from Weblate for main branch 2022-05-25 16:07:05 +02:00
Pablo Alba 931759f468 🎉 Activate invitations validation 2022-05-25 12:03:05 +02:00
Pablo Alba f33360a22b 🐛 Importing old penpot files generates frames with 0.01 as width and height
https://tree.taiga.io/project/penpot/issue/3455
2022-05-25 11:58:46 +02:00
Alejandro 910fb55b69 Merge pull request #1948 from penpot/fix-issue-hang-file
🐛 Fix problem with hanging file
2022-05-25 11:33:34 +02:00
alonso.torres 18849307e9 🐛 Fix linting issue 2022-05-25 11:29:49 +02:00
alonso.torres 0f2b2d4590 🐛 Fix problem with hanging file 2022-05-25 11:24:07 +02:00
Hosted Weblate 68e38271fb Merge branch 'origin/develop' into Weblate. 2022-05-25 11:24:03 +02:00
Vincas Dundzys 066d53b81b 🌐 Add translations for: Lithuanian.
Currently translated at 8.7% (84 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lt/
2022-05-25 11:24:03 +02:00
Andrés Moya ef37abcbbd 🐛 Allow debug load file with random uuid 2022-05-25 09:52:32 +02:00
alonso.torres 02427285ef 📚 Update changelog 2022-05-25 09:25:51 +02:00
Alejandro 38bc3b061a Merge pull request #1940 from penpot/repair-idless-components
🔧 Add a function to manually repair components without :id
2022-05-25 09:04:19 +02:00
Alejandro 047b3f0987 Merge pull request #1944 from penpot/hiru-dbg-update-file
Hiru dbg update file
2022-05-25 09:04:05 +02:00
Alejandro 6a8f3c7283 Merge pull request #1947 from penpot/alotor-hotfix-1.13
Alotor hotfix 1.13
2022-05-25 08:18:00 +02:00
alonso.torres 525da266b8 🐛 Creates a migration to invalidate texts-position-data 2022-05-24 23:34:23 +02:00
alonso.torres 97c9035cfd 🐛 Fix problems with font initialization 2022-05-24 23:34:23 +02:00
alonso.torres 35681c3af8 🐛 Fix problem with multiple users and texts positions 2022-05-24 23:34:23 +02:00
alonso.torres 8a6f01404c 🐛 Fix hide artboard 2022-05-24 23:34:23 +02:00
alonso.torres 6901431f8a Add debugging tool 2022-05-24 23:34:23 +02:00
Alejandro Alonso 2261bde6f1 🐛 Fix fills priority over imported svg attributes 2022-05-24 14:17:23 +02:00
elhombretecla 40e1d5a2a1 tada: Remove discussions and add twitter to form 2022-05-24 13:58:08 +02:00
Pablo Alba ffbc098af8 🐛 Prototype connection should be under the rules
https://tree.taiga.io/project/penpot/issue/3384
2022-05-24 13:42:10 +02:00
Andrés Moya d52c4541ae 🔧 Preserve id when downloading file with dbg 2022-05-24 13:34:42 +02:00
Pablo Alba e8f61df710 🐛 Remove deprecated menu options 2022-05-24 12:49:41 +02:00
Eva Marco 3604d0cfc9 Merge pull request #1933 from penpot/palba-fix-file-menu-not-accessible
🐛 Fix menu file not accessible in certain conditions
2022-05-24 12:39:42 +02:00
Andrés Moya b0c3b38cc5 🔧 Add a function to manually repair components without :id 2022-05-24 12:26:21 +02:00
Eva Marco 393d959289 Merge pull request #1929 from penpot/hiru-remove-emitf
♻️ Remove obsolete st/emitf macro
2022-05-24 12:21:29 +02:00
Eva Marco 494e2df49f Merge pull request #1937 from penpot/superalex-fix-add-stroke-for-text-with-shortcut
🐛 Fix adding string for texts with shortcut
2022-05-24 11:01:32 +02:00
andy a453f1a648 🌐 Added translation for: Lithuanian. 2022-05-24 11:00:01 +02:00
Alejandro Alonso dcac6d9ea4 🐛 Fix adding string for texts with shortcut 2022-05-24 07:17:15 +02:00
Pablo Alba cdd6801360 🐛 Fix menu file not accessible in certain conditions
https://tree.taiga.io/project/penpot/issue/3385
2022-05-23 17:08:30 +02:00
Alejandro f5128d8d43 Merge pull request #1932 from penpot/fix-div-by-zero
🐛 Fix problem with division by zero
2022-05-23 13:52:17 +02:00
alonso.torres 4c2182dd0b 🐛 Fix problem with division by zero 2022-05-23 13:46:36 +02:00
alonso.torres cca5ddb81a Merge remote-tracking branch 'origin/main' into develop 2022-05-23 12:17:56 +02:00
Alejandro c83affe351 Merge pull request #1931 from penpot/alotor-bugfix-initialize-texts
🐛 Fix problem when initializing texts
2022-05-23 12:15:21 +02:00
alonso.torres 51a9b10d51 🐛 Fix problem when initializing texts 2022-05-23 12:00:46 +02:00
alonso.torres 28e2d64ac6 Merge remote-tracking branch 'origin/main' into develop 2022-05-23 10:58:29 +02:00
alonso.torres 0fc2c312d5 🐛 Fix problem with fonts and thumbnails 2022-05-23 10:26:07 +02:00
Eva Marco 6eb24bd1b7 Merge pull request #1928 from penpot/palba-fix-wrong-not-found-message
🐛 Fix wrong 'no assets found' message
2022-05-23 10:17:50 +02:00
Pablo Alba 79467b7b72 🐛 Fix wrong 'no assets found' message 2022-05-23 10:10:06 +02:00
Locness e14c6e5a6f 🌐 Add translations for: French.
Currently translated at 72.8% (703 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-05-23 00:15:40 +02:00
Andrés Moya 2be432e1d4 ♻️ Remove obsolete st/emitf macro 2022-05-20 16:37:33 +02:00
alonso.torres eb07350cac 🐛 Fix problem with typographies 2022-05-20 13:00:50 +02:00
Pablo Alba ba139d7d2c 🐛 Fix unathorized redirect 2022-05-20 12:37:57 +02:00
alonso.torres 235d3dbf3d Merge remote-tracking branch 'origin/main' into develop 2022-05-20 11:10:14 +02:00
Alejandro 426758d9b2 Merge pull request #1924 from penpot/fix-sync
🐛 Fix some component shapes not synced
2022-05-20 10:39:22 +02:00
alonso.torres 542fb9c754 🐛 Fix problem with nested constraints and text 2022-05-20 10:26:41 +02:00
Andrés Moya 13492f5ac7 🐛 Fix orphaned component instances 2022-05-20 09:17:55 +02:00
Andrés Moya 43d3b06c30 🐛 Fix some component shapes not synced 2022-05-19 17:52:31 +02:00
alonso.torres d8a7402046 🐛 Fix problems with text position data 2022-05-19 16:33:43 +02:00
alonso.torres 93b582c385 🐛 Fix problem with small with texts 2022-05-19 15:02:50 +02:00
alonso.torres d45bb0ace1 🐛 Fix dirty text modifiers when changing pages 2022-05-19 15:02:50 +02:00
alonso.torres 25ff15c62e 🐛 Fix rendering thumbnail with pending images/fonts 2022-05-19 15:02:50 +02:00
Andrés Moya 30bcdda90e 🐛 Add a protection for some corner cases 2022-05-19 09:49:42 +02:00
alonso.torres e22ef536ed 🐛 Fix problem with Safari and text resize 2022-05-18 22:27:21 +02:00
Eva b5e696c6b4 🐛 Fix ungroup typographies on edit 2022-05-18 17:23:26 +02:00
alonso.torres 2b1e126ff8 🐛 Fix problem with thumbnails 2022-05-18 17:04:59 +02:00
Alejandro 1690f1ee23 Merge pull request #1919 from penpot/alotor-buf-export
🐛 Fix problem when exporting penpot files
2022-05-18 15:59:21 +02:00
alonso.torres 6a74f29f96 🐛 Fix problem when exporting penpot files 2022-05-18 15:52:45 +02:00
Andrés Moya d666755159 🐛 Synchronize text positions in components 2022-05-18 13:45:03 +02:00
Alejandro fa00d674eb Merge pull request #1914 from penpot/alotor-performance-improvements
Performance improvements
2022-05-18 11:15:40 +02:00
Pablo Alba 7c23b7ea79 Merge pull request #1916 from penpot/superalex-fix-undo-drawing-curve
🐛 Fix undo when drawing curve
2022-05-18 10:57:07 +02:00
Alejandro Alonso 919ca68a77 🐛 Fix undo when drawing curve 2022-05-18 10:49:55 +02:00
Alejandro 684805067a Merge pull request #1915 from JamieSlome/develop
Create SECURITY.md
2022-05-18 09:39:18 +02:00
Jamie Slome db7761b742 Create SECURITY.md 2022-05-17 19:35:14 +01:00
Pablo Alba 29010453e6 Merge pull request #1913 from penpot/eva-fix-scroll-into-view
🐛 Fix scroll into view with big groups
2022-05-17 19:44:40 +02:00
alonso.torres a8cc9ace72 Improved text move performance 2022-05-17 17:02:45 +02:00
alonso.torres 9ab922a0fa Improved snap-pixel performance 2022-05-17 17:02:28 +02:00
alonso.torres c9dadce12a Skip calculate children modifiers on move 2022-05-17 17:02:11 +02:00
Eva eabfa7a541 🐛 Fix scroll into view with big groups 2022-05-17 16:38:24 +02:00
Andrés Moya 95a2da5ebc Rework multi edit of measures values 2022-05-17 14:42:16 +02:00
Pablo Alba 180c355340 Merge pull request #1911 from penpot/alotor-fix-texts
Fix problems with texts and thumbnails
2022-05-17 14:26:24 +02:00
alonso.torres 01664a04fc 🐛 Problem recalculating thumbnails 2022-05-17 14:09:03 +02:00
alonso.torres edce45095e 🐛 Remove xlinkHref to resolve Safari problem 2022-05-17 14:09:03 +02:00
alonso.torres 5a07599fc7 🐛 Fix problem with thumbnail re-rendering 2022-05-17 14:09:03 +02:00
alonso.torres d684970bfb 🐛 Fix problem with single line texts 2022-05-17 14:09:03 +02:00
Alejandro Alonso 216b510900 🐛 Fix security concern 2022-05-17 13:03:04 +02:00
Alejandro 5c2b5f7cda Merge pull request #1909 from penpot/eva-fix-typo
🐛 Fix typo
2022-05-17 12:57:25 +02:00
Eva 712c68fc77 🐛 Fix typo 2022-05-17 12:43:44 +02:00
Alejandro f290465edd Merge pull request #1908 from penpot/eva-no-rotation-in-paths
🐛 Fix rotation value when path is not rotated
2022-05-17 12:09:53 +02:00
Eva 141bcdd25e 🐛 Fix rotation value when path is not rotated 2022-05-17 11:59:48 +02:00
Pablo Alba f68a4eb84a Merge pull request #1907 from penpot/eva-fix-layers-when-group
🐛 Fix change layer position on group or component creation
2022-05-17 10:48:08 +02:00
Eva a240fbdf5b 🐛 Fix change layer position on group or component creation 2022-05-17 10:29:19 +02:00
Alejandro Alonso 799bb87398 🐛 Fix security concern 2022-05-17 10:25:13 +02:00
Alejandro 2b5282025c Merge pull request #1904 from penpot/alotor-fix-text-problems
Fix text issues
2022-05-17 06:41:39 +02:00
Joseph V M 08beb57ff1 🌐 Add translations for: Malayalam.
Currently translated at 7.1% (69 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2022-05-16 23:16:12 +02:00
alonso.torres a2de5f8fb4 🐛 Fix center alignment with new lines 2022-05-13 16:17:05 +02:00
alonso.torres 080139cd56 🐛 Improved performance for text resize 2022-05-13 16:17:05 +02:00
alonso.torres 570f038062 🐛 Disable stroke style for texts 2022-05-13 16:17:05 +02:00
alonso.torres ae84f3cbe8 🐛 Fix typo in debug option 2022-05-13 16:17:05 +02:00
alonso.torres abdc9b2cbd 🐛 Fix problem with center vertical align and auto-height 2022-05-13 16:17:05 +02:00
Pablo Alba 92d7521ec7 Merge pull request #1898 from penpot/superalex-fix-paste-svg-with-empty-space
🐛 Fix paste svg with empty space
2022-05-13 16:16:16 +02:00
alonso.torres 4730273ad3 🐛 Rollback thumbnail problem 2022-05-13 13:32:22 +02:00
Alejandro a3935953f7 Merge pull request #1902 from penpot/palba-fix-artboards-thumbnail-another-page
🐛 Fix artboards thumbnail in another page
2022-05-13 13:17:46 +02:00
alonso.torres ea50622bf7 🐛 Fine tune thumbnails 2022-05-13 13:16:58 +02:00
Alejandro 4b0b7463c7 Merge pull request #1903 from penpot/eva-bugfix-handoff
🐛 Show strokes and fills for texts when in handoff
2022-05-13 13:11:23 +02:00
Alejandro Alonso 95d4018074 🐛 Fix paste svg with empty space 2022-05-13 13:05:49 +02:00
Eva 3f413e4920 🐛 Show strokes and fills in text when in handoff 2022-05-13 12:44:11 +02:00
Alejandro Alonso db8e829339 🐛 Fix remove time debug info 2022-05-13 12:00:18 +02:00
Pablo Alba 448e0dd415 🐛 Fix artboards thumbnail in another page 2022-05-13 11:29:46 +02:00
Alejandro 15418a252e Merge pull request #1893 from penpot/superalex-fix-thumbnail-blur
🐛 Fix Thumbnail blur on mouse movements
2022-05-13 09:18:30 +02:00
Alejandro 21d845d254 Merge pull request #1896 from penpot/superalex-multiple-fills-with-texts-are-not-working-properly
🐛 Fix multiple fills with texts are not working properly
2022-05-13 09:17:47 +02:00
Alejandro Alonso c84017eb72 🐛 Fix multiple fills with texts are not working properly 2022-05-13 07:58:02 +02:00
Alejandro 431e42c80a Merge pull request #1895 from penpot/release-1.13
💄 Release 1.13 onboarding texts
2022-05-13 06:46:49 +02:00
elhombretecla ca2eb1ac12 💄 Add new onboarding texts 2022-05-13 06:42:22 +02:00
alonso.torres d2983c1110 🐛 Improve active frame behaviour for thumbnails 2022-05-13 06:20:31 +02:00
Alejandro Alonso 74612178d7 🐛 Fix Thumbnail blur on mouse movements 2022-05-13 06:20:31 +02:00
Eva Marco af519b3f89 Merge pull request #1892 from penpot/alotor-bugfixing-2
Change text disposition on resize
2022-05-12 16:52:27 +02:00
alonso.torres d8d4ce7a46 🐛 Fix linter 2022-05-12 16:32:25 +02:00
alonso.torres 3930be5d9e 🐛 Remove warnings from external library 2022-05-12 16:23:45 +02:00
alonso.torres d85a4d6539 🐛 Minor improvements on refs 2022-05-12 16:23:45 +02:00
alonso.torres 7446fe77b3 🐛 Change text disposition on resize 2022-05-12 16:23:45 +02:00
alonso.torres 8b1f8d1418 🐛 Fix error in view mode 2022-05-12 15:18:23 +02:00
Pablo Alba d387ca81d8 Merge pull request #1894 from penpot/superalex-fix-scrollbars-not-shown
Fix Scrollbars not shown
2022-05-12 14:25:51 +02:00
Alejandro Alonso b7b5f3b4c2 Fix Scrollbars not shown 2022-05-12 14:18:26 +02:00
Eva Marco 698dd872e4 Merge pull request #1886 from penpot/superalex-multiple-fills-with-texts-are-not-working-properly
🐛 Fix multiple fills with texts are not working properly
2022-05-12 09:43:21 +02:00
Alejandro Alonso 767f0fe16b 🐛 Fix multiple fills with texts are not working properly 2022-05-12 09:30:37 +02:00
Alejandro a19c56c0ce Merge pull request #1885 from penpot/eva-bugfix
🐛 Avoid scroll behind fixed element in layers
2022-05-12 09:05:04 +02:00
Eva b9e984300c 🐛 Avoid scroll behind fixed element in layers 2022-05-12 08:43:53 +02:00
Alejandro 0727757eb1 Merge pull request #1884 from penpot/superalex-fix-import-svg-shapes-without-fill
🐛 Fix import svg shapes without fill
2022-05-12 06:57:05 +02:00
Eva Marco 50037a6a88 Merge pull request #1890 from penpot/alotor-bugfixing-2
🐛 Fix problem with RTL texts
2022-05-11 17:08:51 +02:00
Eva Marco 5bdea086e9 Merge pull request #1889 from penpot/palba-canceled-invitation-page
🎉 Show an error page when the user uses a cancelled/invalid/expired invitation
2022-05-11 16:39:39 +02:00
alonso.torres fef69cb707 🐛 Fix problem with RTL texts 2022-05-11 15:53:50 +02:00
Eva Marco 20211101b7 Merge pull request #1888 from penpot/alotor-bugfixing-2
Fix problem with frame resize
2022-05-11 14:23:58 +02:00
Pablo Alba ce41a38098 🎉 Show an error page when the user uses a cancelled/invalid/expired invitation 2022-05-11 13:46:43 +02:00
alonso.torres c14ece9f8d 🐛 Fix problems with thumbnails 2022-05-11 13:44:47 +02:00
Alejandro Alonso f2bb59fd77 🐛 Fix Paths have a black fill while being drawn 2022-05-11 13:11:55 +02:00
alonso.torres af6a687187 🐛 Fix performance problem with import SVG 2022-05-11 11:29:32 +02:00
alonso.torres 40de8781ef 🐛 Improved zoom responsiveness 2022-05-11 11:29:32 +02:00
alonso.torres 33e776fefe 🐛 Fix path handler radius 2022-05-11 11:29:32 +02:00
Alejandro Alonso efcabe7ffb 🐛 Fix import svg shapes without fill 2022-05-11 11:04:04 +02:00
Pablo Alba 77e9b8aa70 Merge pull request #1873 from penpot/superalex-import-svg-with-exterior-strokes
🐛  Import svg with exterior strokes
2022-05-11 09:23:40 +02:00
Alejandro 238cd14eb8 Merge pull request #1881 from penpot/hirunatan-fix-pdf-page-size
🐛 Fix page size at pdf export
2022-05-10 17:38:27 +02:00
Eva Marco 22193635d6 Merge pull request #1880 from penpot/palba-no-copy-use-for-thumbnail-on-duplicate
🐛 Do not copy the atribute use-for-thumbnail on frame duplicate
2022-05-10 16:04:40 +02:00
Andrés Moya 8432e970cb 🐛 Fix page size at pdf export
https://tree.taiga.io/project/penpot/issue/3371
2022-05-10 15:54:01 +02:00
Alejandro Alonso 55df28d5dc 🐛 Fix change username if not subscribed to newsletter 2022-05-10 15:12:17 +02:00
Eva Marco 33882f44ef Merge pull request #1875 from penpot/alotor-bugfixing-2
Bugfixes
2022-05-10 14:23:39 +02:00
Radek Sawicki accba56b89 🌐 Add translations for: Polish.
Currently translated at 100.0% (965 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2022-05-10 14:15:08 +02:00
Pablo Alba c06042c91b 🐛 Do not copy the atribute use-for-thumbnail on frame duplicate
https://tree.taiga.io/project/penpot/issue/3362
2022-05-10 13:26:19 +02:00
alonso.torres 2976c5c572 🐛 Fix problem with flipped texts 2022-05-10 11:58:44 +02:00
alonso.torres 8df93c2707 🐛 Fix problem when exporting single text 2022-05-10 11:58:21 +02:00
Eva 0c26dad3b2 🐛 Show selrect in paths 2022-05-10 10:51:47 +02:00
Alejandro Alonso 8d399cb562 🐛 Fix import svg shapes without fill 2022-05-10 10:49:50 +02:00
alonso.torres 82d744b94a 🐛 Fix problem with scrolling on already visible layers 2022-05-09 17:50:34 +02:00
alonso.torres 94d3f66ef1 🐛 Fix problem with rotated shapes and auto-width/auto-height 2022-05-09 17:37:37 +02:00
alonso.torres 40a38cbd38 🐛 Fix problem when pasting frame and selected shape 2022-05-09 17:01:42 +02:00
alonso.torres 644c796772 🐛 Fix problem with path edition 2022-05-09 16:46:52 +02:00
alonso.torres 81dac233a7 🐛 Fix problem with text edition selection area 2022-05-09 16:46:52 +02:00
alonso.torres 6bbd76f350 🐛 Fix problem with text shapes in components 2022-05-09 16:46:52 +02:00
alonso.torres 3a6072bc8f 🐛 Fix problem with RTL 2022-05-09 16:46:52 +02:00
Alejandro 0bcf3d99a0 Merge pull request #1872 from penpot/alotor-fix-thumbnail-problem
Fix thumbnails problem
2022-05-09 15:44:05 +02:00
alonso.torres 8cd7f61150 🐛 Fix problem with duplicated ids for thumbnails 2022-05-09 15:37:47 +02:00
Alejandro Alonso 96aa756eb6 🐛 Fix import svg with exterior strokes 2022-05-09 12:46:52 +02:00
Eva Marco c5ba399bcd Merge pull request #1856 from penpot/palba-onboarding-multiple-invitations
 Multiple team invitations on onboarding
2022-05-09 09:45:05 +02:00
Pablo Alba fb879660d0 Multiple team invitations on onboarding 2022-05-09 09:40:44 +02:00
Eva Marco 4cdf8cec4e Merge pull request #1866 from penpot/palba-add-icon-to-artboard-thumbnail
Palba add icon to artboard thumbnail
2022-05-09 09:21:27 +02:00
Pablo Alba d9a9eb3729 Add icon to artboard thumbnail 2022-05-06 19:12:05 +02:00
Eva Marco 8298d460e6 Merge pull request #1865 from penpot/alotor-bugfixing
Alotor bugfixing
2022-05-06 14:10:12 +02:00
Eva 462eabd8a1 🐛 Show '--' when multiple rotations 2022-05-06 13:31:24 +02:00
Eva afa1af6dc2 🐛 Fix comments in viewer mode 2022-05-06 13:31:24 +02:00
Eva 37fdf51eaf 🐛 Fix copying layout values with only multiple decimals 2022-05-06 13:31:24 +02:00
Eva 1102bc9cba 🐛 Activate button when input change in account 2022-05-06 13:31:24 +02:00
Eva 18afb701fb 🐛 Fix apply color to groups from assets panel 2022-05-06 13:31:24 +02:00
Eva Marco 15a26d10f0 Merge pull request #1867 from penpot/hirunatan-bugfixing
Hirunatan bugfixing
2022-05-06 13:09:44 +02:00
Andrés Moya 9b8b6134c5 🐛 Allow images to adjust to the shape size
https://tree.taiga.io/project/penpot/issue/3329
2022-05-06 12:07:19 +02:00
Andrés Moya 7e05b7e6d9 🐛 Fix group typographies
https://tree.taiga.io/project/penpot/issue/3338
2022-05-06 10:56:20 +02:00
Andrés Moya b86ea5b5e2 🐛 Fix notifications of external library changes
https://tree.taiga.io/project/penpot/issue/3348
2022-05-06 10:56:20 +02:00
Andrés Moya 1729fe7312 🌐 Add translations for: Spanish.
Currently translated at 98.9% (955 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-05-06 10:05:46 +02:00
alonso.torres 66f7d35510 🐛 Fix problem with multi-line text and strokes 2022-05-05 17:21:28 +02:00
Andrés Moya 8fb22b8eee 🐛 Add a protection for some possible race condition 2022-05-05 17:16:27 +02:00
alonso.torres 5b37c11221 🐛 Fix letter spacing for svg texts 2022-05-05 17:16:05 +02:00
alonso.torres 1723ff1da5 🐛 Numeric input for font size 2022-05-05 17:04:03 +02:00
alonso.torres 9099403421 🐛 Improved resilience for thumbnail generation 2022-05-05 16:46:21 +02:00
alonso.torres baf3f7ea15 🐛 Fix problem with outerstrokes for frames 2022-05-05 14:24:14 +02:00
Pablo Alba 1d39bbaa3c 🐛 Do not show team-up modal for users already on a team 2022-05-05 14:08:51 +02:00
alonso.torres 0db2f87e3e 🐛 Fix problems with thumbnails generation 2022-05-05 13:11:03 +02:00
alonso.torres 430ccda02c 🐛 Fix problem with black frame background 2022-05-05 13:03:36 +02:00
Pablo Alba fe6e62482a 🐛 Fix bad texts in layers filter pills 2022-05-05 09:25:51 +02:00
Pablo Alba 82185794a8 🐛 Fix shapes filter 2022-05-05 09:25:19 +02:00
Pablo Alba 053975ef82 Fix members menu popup is not correctly aligned 2022-05-05 09:24:34 +02:00
Pablo Alba 7185199d05 🐛 Fix feedback crash 2022-05-05 09:24:21 +02:00
Eva bd7ea210f5 💄 Add changes line 2022-05-05 09:13:22 +02:00
Eva 9cacca4802 Add shortcut panel 2022-05-04 16:36:47 +02:00
Ahmad HosseinBor 9fab2fc24a 🌐 Add translations for: Persian.
Currently translated at 31.3% (303 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-05-04 12:14:36 +02:00
Pablo Alba 9dcad7ebef 🐛 Round the size values on handoff to two decimals 2022-05-03 10:42:37 +02:00
alonso.torres 4363e32aae Merge remote-tracking branch 'origin/staging' into develop 2022-05-03 10:29:19 +02:00
alonso.torres 39e4651374 📚 Update changelog 2022-05-03 09:49:37 +02:00
Alejandro Alonso fe1ae7dbb4 🐛 Fix import svg shapes without fill 2022-05-03 09:30:36 +02:00
Ahmad HosseinBor 28fc7178f1 🌐 Add translations for: Persian.
Currently translated at 21.4% (207 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-05-02 19:14:48 +02:00
alonso.torres 39b0de1ced 🐛 Fix thumbnails problem 2022-04-29 14:56:14 +02:00
Alejandro Alonso 2f0e85f619 🐛 Fix scroll bars 2022-04-29 14:55:05 +02:00
Andrés Moya 151de33586 🔧 Small fix of debug functions 2022-04-29 11:05:04 +02:00
Alejandro 4d106d9e15 Merge pull request #1849 from penpot/alotor-bugfixing
Bugfixes
2022-04-29 10:46:02 +02:00
elhombretecla e5ccf36c07 add new release info and images 2022-04-29 10:30:47 +02:00
alonso.torres d92df31b3e 🐛 Fix problem with horizontal scroll 2022-04-28 16:51:27 +02:00
alonso.torres 8b3062be0b 🐛 Fix problem when resizing a group with texts with auto-width/height 2022-04-28 15:32:41 +02:00
alonso.torres c7e23c1b58 🐛 Fix problem when export/importing guides attached to frame 2022-04-28 14:43:44 +02:00
alonso.torres 9923268589 🐛 Fix issue with paste ordering sometimes not being respected 2022-04-28 14:43:44 +02:00
alonso.torres a8103cbc3e ⬆️ Update potok 2022-04-28 14:43:44 +02:00
alonso.torres 26a074768f 🐛 Fix path editing 2022-04-28 14:43:44 +02:00
alonso.torres 1c87195fa6 🐛 Fix error when drawing curves with only one point 2022-04-28 14:43:44 +02:00
alonso.torres 2a1ca07554 🐛 Fix problem when changing group size with decimal values 2022-04-28 14:43:44 +02:00
alonso.torres c3be87ed30 🐛 Fix problem with thumbnail refresh 2022-04-28 14:27:23 +02:00
alonso.torres 0afbf02443 💄 Fix linter 2022-04-28 11:22:36 +02:00
Ahmad HosseinBor eb143c8399 🌐 Add translations for: Persian.
Currently translated at 21.3% (206 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-04-28 11:14:38 +02:00
Locness 85f1cb47a7 🌐 Add translations for: French.
Currently translated at 72.7% (702 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-04-28 11:14:38 +02:00
alonso.torres 609ce1c106 🐛 Fix poblems with SVG transformations 2022-04-27 14:37:53 +02:00
alonso.torres f7dbb4f944 Merge remote-tracking branch 'origin/staging' into develop 2022-04-27 12:24:16 +02:00
Andrey Antukh 5b2d1b310a Merge pull request #1845 from penpot/alotor-performance
Loading time improvement
2022-04-27 12:15:05 +02:00
Andrey Antukh a7ded66eab Merge pull request #1846 from penpot/alotor-bugfixes
Fix focus mode problem
2022-04-27 11:59:28 +02:00
alonso.torres 74d195c745 🐛 Fix style issue with focus mode 2022-04-27 11:08:18 +02:00
alonso.torres 1705954b07 🐛 Fix problem with transforms 2022-04-27 09:17:35 +02:00
alonso.torres 71bb34efc5 Improved first load time 2022-04-27 09:17:35 +02:00
Alejandro 32d61eaf70 Merge pull request #1844 from penpot/superalex-fix-duplicate-artobard-without-guides
:bug Fix duplicate artboard without whithout guides
2022-04-27 06:42:02 +02:00
Alejandro Alonso 20badb7676 :bug Fix duplicate artboard without whithout guides 2022-04-26 17:37:10 +02:00
Andrey Antukh b90a308d66 Merge remote-tracking branch 'origin/staging' into develop 2022-04-26 17:11:00 +02:00
Andrey Antukh dbfa0e7a4b 🐛 Fix unexpected exception on workspace libraries modal 2022-04-26 17:08:02 +02:00
Andrey Antukh 95c73585d2 Merge pull request #1843 from penpot/remove-backend-only-devenv
🔥 Remove backend-only devenv container
2022-04-26 17:01:06 +02:00
Andrés Moya c4939c152d 🔥 Remove backend-only devenv container
(disable requirement of using cors and secure cookies in devenv)
2022-04-26 16:47:14 +02:00
Pablo Alba 7560e32911 Merge pull request #1840 from penpot/alotor-improved-filter-layers
 Improved filter layers
2022-04-26 16:16:00 +02:00
alonso.torres d50299bdbb Improved performance for layers filtering 2022-04-26 16:15:34 +02:00
Andrey Antukh c34c1c4375 📎 Update docker files 2022-04-26 13:28:05 +02:00
Alejandro Alonso b62f387ff4 :bug Fix blend modes are ignored in component updates 2022-04-26 09:57:28 +02:00
Alejandro Alonso b3847cafa8 Merge remote-tracking branch 'origin/staging' into develop 2022-04-26 06:17:27 +02:00
Alejandro Alonso d28b4092d9 🐛 Fix guides are not duplicated with the artboard 2022-04-25 17:43:39 +02:00
Pablo Alba 658e3b7aee 🐛 Fix mouse leave in handoff close overlay animation breaks 2022-04-25 17:20:24 +02:00
Eva Marco d18c96360f Merge pull request #1836 from penpot/alotor-more-performance-changes
Alotor more performance changes
2022-04-25 15:32:14 +02:00
Alejandro c83bb70074 Merge pull request #1834 from penpot/hirunatan-update-color-library
Synchronize library colors in all parts of a shape
2022-04-25 14:00:05 +02:00
Andrés Moya 02157cbeb9 🎉 Synchronize library colors in all parts of a shape 2022-04-25 12:18:51 +02:00
Andrés Moya 7581230b6e 🔧 Small refactor of sync helper 2022-04-25 12:18:51 +02:00
Andrey Antukh 049f4ce784 ♻️ Refactor persistence flow 2022-04-25 12:07:26 +02:00
Andrey Antukh c01e4e52f8 ♻️ Reorganize workspace persistence related namespace 2022-04-25 12:07:26 +02:00
Andrey Antukh 3ab3ea68b4 📎 Change namespace alias naming on persistence ns 2022-04-25 12:07:26 +02:00
alonso.torres 41948ff86b 🐛 Changes after review 2022-04-25 11:41:05 +02:00
alonso.torres 01ca538c72 Debounce update indices event 2022-04-25 10:47:47 +02:00
alonso.torres 2b9badfd4e Debounce update position-data event 2022-04-25 10:47:47 +02:00
alonso.torres 6ad591eb23 🐛 Fix problem with export texts and fonts 2022-04-25 10:47:47 +02:00
alonso.torres 581c50b5ff Improved copy objects performance 2022-04-25 10:47:47 +02:00
Radek Sawicki a18e067d7a 🌐 Add translations for: Polish.
Currently translated at 33.7% (326 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2022-04-23 21:14:43 +02:00
Locness 036fe44471 🌐 Add translations for: French.
Currently translated at 72.6% (701 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-04-23 21:14:41 +02:00
Andrey Antukh b008835d43 Merge remote-tracking branch 'origin/staging' into develop 2022-04-22 14:50:04 +02:00
alonso.torres fc95443cc4 Merge remote-tracking branch 'origin/staging' into develop 2022-04-22 14:46:22 +02:00
Andrey Antukh 9492dd7856 Merge branch 'main' into staging 2022-04-22 14:40:41 +02:00
Andrey Antukh b239a9b09e Merge pull request #1819 from penpot/alotor-performance-improvements
Frames performance improvements
2022-04-22 14:20:27 +02:00
Andrey Antukh e0aeb3b5ac 📎 Reduce default chunk size of the audit log archive task 2022-04-22 12:08:29 +02:00
Andrey Antukh 58cfd61997 🐛 Don't send url on file-media-upload 2022-04-22 12:08:29 +02:00
alonso.torres a82bcd0ab2 🐛 Fixes after review 2022-04-22 11:33:40 +02:00
alonso.torres dfc9d0709d 🐛 Fix problems with masks 2022-04-22 11:09:59 +02:00
alonso.torres b7d33041e8 Improved performand for text editing 2022-04-22 11:09:59 +02:00
alonso.torres f945a6e649 Changed thumbnails to webp format 2022-04-22 11:09:59 +02:00
alonso.torres 6a3a460203 Advanced frame thumbnail handling 2022-04-22 11:09:59 +02:00
alonso.torres b576ef02af Performance improvements 2022-04-22 11:09:58 +02:00
Alejandro Alonso 814042909a 🐛 Import svg with exterior stroke 2022-04-22 11:06:59 +02:00
Alejandro Alonso 9856da4a1f 🐛 Fix black background while drawing a path 2022-04-22 11:05:01 +02:00
andy 2061018742 🌐 Added translation for: Polish. 2022-04-22 08:31:21 +02:00
Andrey Antukh 202e7eb3f2 Merge pull request #1823 from penpot/superalex-drop-shadow-not-working-on-fill-less-strokes
🐛 Fix drop shadow not working on fill-less strokes
2022-04-21 15:52:12 +02:00
Eva Marco 38deacdf31 Merge pull request #1826 from penpot/superalex-internal-error-when-hoverin-over-shape
🐛 Internal error when hoverin over shape
2022-04-21 13:31:37 +02:00
Alejandro Alonso c809890cfd 🐛 Fix black background while drawing a path 2022-04-21 13:31:19 +02:00
Alejandro Alonso 224d466122 Fix internal error when hoverin over shape 2022-04-21 13:27:40 +02:00
Alejandro Alonso 08c6e9b702 🐛 Fix different behaviour during image drag 2022-04-21 12:13:12 +02:00
Andrey Antukh 9e940dc042 Improve dm/get-in macro to be fully compliant with core/get-in 2022-04-21 09:43:54 +02:00
Alejandro Alonso 6fda156164 🐛 Fix drop shadow not working on fill-less strokes 2022-04-21 07:16:48 +02:00
Andrey Antukh 5eb53da374 Merge pull request #1824 from penpot/alotor-fix-problem-with-texts
Fix problem with texts
2022-04-20 15:46:55 +02:00
alonso.torres 68e0b3e756 🐛 Fix problem with text and blank spaces 2022-04-20 14:16:51 +02:00
Alejandro Alonso cfe374b08c 📎 Tag new minor release 2022-04-20 11:26:01 +02:00
alonso.torres cc046555a3 🐛 Fix problem with zoom with wheel in Firefox 2022-04-20 10:40:07 +02:00
Andrey Antukh 31ec4092ed Improve logging performance
Delay the message building until it really needed to be
printed.
2022-04-20 10:03:04 +02:00
Andrey Antukh d9d47b2c65 🐛 Fix missing key properties and react warnings 2022-04-20 10:03:04 +02:00
Andrey Antukh 506f63317a Merge pull request #1805 from penpot/hirunatan-set-html-theme
Hirunatan set html theme
2022-04-20 09:20:46 +02:00
Andrey Antukh d658145450 Merge pull request #1813 from penpot/superalex-prototype-connection-handler-is-extremely-hard-to-use
🐛 Prototype connection handler is extremely hard to use
2022-04-20 09:19:35 +02:00
Andrey Antukh b2d13f277a Merge pull request #1815 from penpot/superalex-bullet-colors-from-pasted-shapes-with-library-colors
🐛 Fix bullet colors from pasted shapes with library colors
2022-04-20 09:18:31 +02:00
Andrey Antukh 59310cdd71 Merge pull request #1822 from penpot/superalex-multiselected-elements-drag-problem-on-empty-areas
🐛 Multiselected elements drag problem on empty areas
2022-04-20 09:16:13 +02:00
Andrey Antukh 121b5af5d0 Merge pull request #1820 from penpot/palba-handoff-size-round-two-decimals
🐛 Round the size values on handoff to two decimals
2022-04-20 09:11:10 +02:00
Alejandro Alonso 1d69cb2580 Merge remote-tracking branch 'origin/staging' into develop 2022-04-20 06:31:19 +02:00
Pablo Alba e68689aa4f 🐛 Round the size values on handoff to two decimals 2022-04-19 19:29:11 +02:00
Andrey Antukh 989ff8db7a Merge pull request #1796 from penpot/fixed-scroll
 Add fixed position in viewer
2022-04-19 14:54:24 +02:00
Andrés Moya b68fdee946 Add fixed position in viewer 2022-04-19 14:41:19 +02:00
Alejandro Alonso c8d3975680 🐛 Fix multiselected elements drag problem on empty areas 2022-04-19 14:20:42 +02:00
alonso.torres b6f2800aa3 🐛 Fix pinch to zoom on mac 2022-04-19 13:22:50 +02:00
alonso.torres a579ea3c25 🐛 Fix pinch to zoom on mac 2022-04-19 13:21:45 +02:00
Andrey Antukh 7b3ab2287a 🎉 Backport pprint module to common 2022-04-19 12:08:47 +02:00
Andrey Antukh 81df2ca355 Merge pull request #1794 from penpot/palba-group-assets-by-drag-drop
 Group assets by drag and drop
2022-04-19 10:30:29 +02:00
Andrey Antukh b78d9dcc52 Merge pull request #1814 from penpot/alotor-backports
Backport 1.13.4
2022-04-19 08:52:29 +02:00
Andrey Antukh caa81b4fe2 Merge pull request #1812 from penpot/release-1.12.4
Release 1.12.4
2022-04-19 08:52:15 +02:00
Alejandro Alonso b9ab00c549 🐛 Fix bullet colors from pasted shapes with library colors 2022-04-19 07:33:55 +02:00
alonso.torres 2707903f8a 🐛 Fix start script in local environment 2022-04-18 19:04:24 +02:00
alonso.torres 28031a247a 🐛 Fix problem with ctrl+click context menu in mac 2022-04-18 19:03:25 +02:00
Pablo Alba 56cdd1ffeb Group assets by drag and drop 2022-04-18 17:36:20 +02:00
alonso.torres 175f4b57f5 🐛 Fix problem with ctrl+click context menu in mac 2022-04-18 16:41:35 +02:00
Andrey Antukh 2ae2877f45 Improve email console logging
And invitation console logging
2022-04-18 14:10:52 +02:00
Alejandro Alonso 5e7a609b3d 🐛 Fix prototype connection handler is extremely hard to use 2022-04-18 14:07:08 +02:00
alonso.torres 9ffe406d0d 🐛 Fix shift+2 shortcut in MacOS with non-english keyboards 2022-04-18 11:36:03 +02:00
alonso.torres adfc0902a2 🐛 Fix problems with CTRL in MacOS 2022-04-18 11:36:03 +02:00
alonso.torres 620efcb5cb 🐛 Fix problem with copy/paste in Safari 2022-04-18 11:36:03 +02:00
alonso.torres 0ed23f94c7 🐛 Fix problems with trackpad zoom and scroll in MacOS 2022-04-18 11:36:03 +02:00
alonso.torres 1cac7d55d0 🐛 Fix crash on iOS when displaying viewer 2022-04-18 11:36:03 +02:00
Andrey Antukh c9937f6b91 Merge remote-tracking branch 'origin/staging' into develop 2022-04-18 11:16:08 +02:00
alonso.torres 875fd78f73 🐛 Fix rounding problem with texts 2022-04-18 10:49:50 +02:00
Andrey Antukh 7e37aca5ee Merge remote-tracking branch 'origin/staging' into develop 2022-04-18 08:59:19 +02:00
Yaron Shahrabani 070886bbf6 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (965 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-04-13 18:08:55 +02:00
nautilusx c00168b61d 🌐 Add translations for: German.
Currently translated at 98.2% (948 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-04-13 18:08:54 +02:00
Oğuz Ersen 0e9119d603 🌐 Add translations for: Turkish.
Currently translated at 100.0% (965 of 965 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-04-13 18:08:54 +02:00
Andrés Moya df39e9baf4 🌐 Disable italian for now 2022-04-11 16:00:15 +02:00
Andrés Moya 668aca725c 🌐 Update translations 2022-04-11 15:52:01 +02:00
Andrés Moya c865082a6a Merge remote-tracking branch 'weblate/develop' into translations 2022-04-11 15:44:55 +02:00
Alejandro Alonso 82ae4e60f8 🐛 Texts with center align and fixed width are not shown 2022-04-11 15:28:09 +02:00
Alejandro Alonso 5fc27a7594 🐛 Blur not working 2022-04-11 14:03:55 +02:00
Andrés Moya 6ad06d9665 🎉 Show Penpot color in Safari tab bar 2022-04-11 12:51:24 +02:00
Alejandro Alonso c766e08027 🐛 [LIBRARIES & TEMPLATES] Missing fills and texts 2022-04-11 12:45:37 +02:00
Andrey Antukh 62f55a47c5 ⬆️ Update okulary dependency 2022-04-11 01:05:06 +02:00
Eva Marco b1edcba0c2 Merge pull request #1798 from penpot/palba-dashboard-import-file-name-hidden
Palba dashboard import file name hidden
2022-04-08 09:20:41 +02:00
Pablo Alba f7d2f6ec51 🐛 Fix hidden file name on import 2022-04-08 09:13:43 +02:00
Andrey Antukh 3a95a1cea1 Merge pull request #1797 from penpot/palba-unnecessary-scrollbars-color-list
Palba unnecessary scrollbars color list
2022-04-08 00:12:35 +02:00
Andrey Antukh 4143573868 🐛 Fix okulary and tab component 2022-04-07 23:52:27 +02:00
Pablo Alba 26daf507b3 🐛 Fix unneccessary scrollbars at the color list 2022-04-07 22:15:28 +02:00
Eva f2c0683803 Revert "🐛 Fix gap between contiguous shapes"
This reverts commit 39fa939f58.
2022-04-07 16:21:01 +02:00
andy 395f23dec8 🌐 Added translation for: Italian. 2022-04-07 11:34:14 +02:00
Andrey Antukh 58905f0b99 Merge remote-tracking branch 'origin/staging' into develop 2022-04-07 10:16:29 +02:00
Pablo Alba aa2bb75f95 Merge pull request #1792 from penpot/niwinz-minor-enhancements
Enhancements
2022-04-07 10:10:40 +02:00
Pablo Alba 004fddfcf4 Merge pull request #1789 from penpot/superalex-show-in-exports-is-showing-in-multiselections
🐛 'Show in exports' is showing in multiselections
2022-04-06 13:58:21 +02:00
Andrés Moya a61301c698 🐛 Fix call to exporter and exporter setup in devenv 2022-04-06 12:54:05 +02:00
Andrey Antukh b2607b28ff 🎉 Add build date and changelog to the bundle 2022-04-06 11:20:48 +02:00
Andrey Antukh c2c01831fb Merge pull request #1791 from penpot/alotor-bug-fixing
Bug fixes
2022-04-06 10:49:21 +02:00
Eva Marco bf70719899 Merge pull request #1787 from penpot/superalex-fix-selected-colors-doesnt-work-for-shadows
🐛 Selected colors doesn't work for shadows
2022-04-06 10:39:11 +02:00
alonso.torres ea38d12a73 🐛 Fix problem with exported text 2022-04-06 10:08:35 +02:00
alonso.torres 76abd6796e 🐛 Fix import problems 2022-04-06 10:08:35 +02:00
alonso.torres 0bb20197f1 Improved performance of refs 2022-04-06 10:08:35 +02:00
Andrey Antukh 2af057a79f ⬆️ Update backend and docker dependencies 2022-04-06 09:54:40 +02:00
Andrey Antukh fd9b442075 Improve email console logging
And invitation console logging
2022-04-06 09:40:20 +02:00
Alejandro Alonso 5edbebcfec 🐛 'Show in exports' is showing in multiselections 2022-04-06 09:37:12 +02:00
Andrey Antukh e62f0603b5 Merge pull request #1788 from penpot/hirunatan-fix-multi-user
Hirunatan fix multi user
2022-04-06 09:20:27 +02:00
Andrés Moya 654e12a2c3 🐛 Fix multi user not working 2022-04-06 09:16:22 +02:00
Alejandro Alonso 5299465864 🐛 Setting in-progress to false when export fails 2022-04-06 08:28:57 +02:00
Alejandro Alonso 18855ef2ef 🐛 Selected colors doesn't work for shadows 2022-04-06 08:05:58 +02:00
Eva 39fa939f58 🐛 Fix gap between contiguous shapes 2022-04-05 13:53:03 +02:00
Andrey Antukh 4adc5d25a7 📎 Fix review issues 2022-04-05 13:23:39 +02:00
Andrey Antukh 7a38b08506 🐛 Fix default configuration 2022-04-05 13:23:39 +02:00
Andrey Antukh df4b92fb6b Improve logging ordering of message parts 2022-04-05 13:23:39 +02:00
Andrey Antukh ca02999ae9 Improve error reporting 2022-04-05 13:23:39 +02:00
Andrey Antukh 701a98fab6 Improve backend and worker error handling 2022-04-05 13:23:39 +02:00
Andrey Antukh c026d05bc3 Set consistent max body size
And make it configurable
2022-04-05 13:23:39 +02:00
Andrey Antukh 602b736163 📎 Update default scripts 2022-04-05 13:23:39 +02:00
Andrey Antukh c5b1b67c50 📎 Add TODO comment on changes ns 2022-04-05 13:23:39 +02:00
Andrey Antukh 8eae892983 🔥 Remove old and already deprecated utils.data ns 2022-04-05 13:23:39 +02:00
Andrey Antukh 7d32d03156 💄 Add cosmetic changes on workspace/changes ns 2022-04-05 13:23:39 +02:00
Andrey Antukh f9e83f2cc7 Improve implementation of without-keys helper 2022-04-05 13:23:39 +02:00
Andrey Antukh 20d3251a93 🎉 Add generic file object thumbnail abstraction
As replacement to the file frame thumbnail mechanism
2022-04-05 13:23:39 +02:00
Andrey Antukh 147f56749e ⬆️ Update some dependencies 2022-04-05 13:23:39 +02:00
Andrey Antukh 9140fc71b9 ♻️ Refactor exportation process, make it considerably faster 2022-04-05 13:23:39 +02:00
alonso.torres d6abd2202c 🐛 Revert pixel grid color change 2022-04-05 13:04:44 +02:00
Alejandro Alonso 911d4edb9f 🐛 Import a file with image background won't show the background 2022-04-05 12:09:06 +02:00
Andrey Antukh e9e5b07bdb Merge pull request #1782 from penpot/superalex-fix-edit-file-name-navigates-to-the-file-workspace
🐛 Fix edit file name navigates to the file workspace
2022-04-05 11:16:18 +02:00
Alejandro Alonso cef1c0d1d1 🐛 Edit file name navigates to the file workspace 2022-04-05 11:15:51 +02:00
Andrey Antukh 0fb54a5edd Merge pull request #1777 from penpot/eva-fix_scroll_into_view
🐛 fix scroll into view behind fixed Element
2022-04-05 11:13:39 +02:00
Eva abd7a88ba0 🐛 Fix scroll into view behing fixed element 2022-04-05 11:03:04 +02:00
Andrey Antukh d37457dc10 Merge pull request #1783 from penpot/eva-fix-sidebar-icon-in-viewer
🐛 Fix sidebar icon in viewer mode
2022-04-05 10:56:46 +02:00
Eva fc7707ad3e 🐛 Fix sidebar icon in viewer mode 2022-04-05 10:35:26 +02:00
Andrés Moya f43c6ab3c5 🐛 Fix resize for rotated shapes with top&down constraints 2022-04-05 09:58:04 +02:00
Andrey Antukh 8ae05ff7b6 🐛 Fix issue with password persistence 2022-04-04 23:55:05 +02:00
Andrey Antukh 11c3b6cfe2 🐛 Fix issue with password persistence 2022-04-04 23:54:54 +02:00
Andrey Antukh b4a997cde9 🐛 Fix issue with password persistence 2022-04-04 23:46:42 +02:00
Andrey Antukh 9e4650cbb6 Merge remote-tracking branch 'origin/staging' into develop 2022-04-04 23:18:29 +02:00
Andrey Antukh 7105255212 Merge branch 'us/newsletter_subscription' into staging 2022-04-04 23:12:03 +02:00
Andrey Antukh 1338491616 Make the subscription modal configurable 2022-04-04 23:10:41 +02:00
Andrey Antukh 0afb47ade0 Update telemetry task for handle user subscriptions 2022-04-04 22:57:27 +02:00
Andrey Antukh 88292f2f3b Properly initialize options and profile forms 2022-04-04 22:57:27 +02:00
Andrey Antukh d389dab8d2 Mark form as touched on changing the checkbox or radio buttons 2022-04-04 22:57:27 +02:00
Andrey Antukh 1205bdcaae Make the update-profile operation atomic with prop update 2022-04-04 22:57:27 +02:00
Eva 5e7e055539 🎉 Add newsletter subscription modal 2022-04-04 22:57:27 +02:00
Eva 3822be76a8 🐛 Fix send to back several shapes at a time 2022-04-04 17:44:50 +02:00
Eva Marco b904237c5a Merge pull request #1773 from penpot/eva-fix_artboard_fills
🐛 Fix add fill to artboard modify children
2022-04-04 16:58:12 +02:00
Eva df930cb879 🐛 Fix add fill to artboard modify children 2022-04-04 16:54:35 +02:00
Alejandro Alonso 327331475e 🐛 Hide the drop shadow also hides the shape 2022-04-04 16:39:17 +02:00
Eva 91a8386ba4 🐛 Fix duplicate multiselected elements 2022-04-04 16:24:50 +02:00
Andrés Moya b7e0619e9a 🐛 Fix order of undo operations 2022-04-04 14:05:01 +02:00
Oğuz Ersen 3b75d9b362 🌐 Add translations for: Turkish.
Currently translated at 100.0% (949 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-04-04 13:11:35 +02:00
Andrey Antukh 0b984a44d7 🐛 Fix default configuration 2022-04-04 10:54:40 +02:00
Andrey Antukh c9ddc83eef Merge remote-tracking branch 'origin/staging' into develop 2022-04-01 11:58:07 +02:00
Alejandro b2b221516c Merge pull request #1768 from penpot/alotor/bugfixes
Bugfixing
2022-04-01 11:06:59 +02:00
bingling_sama 5170634b90 🌐 Add translations for: Chinese (Simplified).
Currently translated at 93.8% (891 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-04-01 09:10:00 +02:00
Oğuz Ersen 01c92c04cf 🌐 Add translations for: Turkish.
Currently translated at 99.7% (947 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-04-01 09:10:00 +02:00
Andrés Moya 1bcb0128f0 🐛 Fix paste shapes while editing text 2022-03-31 14:35:33 +02:00
alonso.torres 5633291ab0 🐛 Fix problem when alt+drag duplicate frames 2022-03-31 12:44:56 +02:00
alonso.torres 785ae01a51 🐛 Fix problem rendering some SVG filters 2022-03-31 11:21:15 +02:00
alonso.torres 34fd9d0d88 🐛 Fix problem with fonts in viewer 2022-03-31 11:18:28 +02:00
alonso.torres 9f19676dc2 🐛 Fix problem with wheel-zoom on an editing text 2022-03-31 11:18:28 +02:00
alonso.torres 4a3fb55b30 🐛 Fix issue with drag-select shapes 2022-03-31 11:11:44 +02:00
alonso.torres eaa6327663 🐛 Fix issue with drag-select shapes 2022-03-31 11:06:19 +02:00
Andrey Antukh 13ca506015 Improve migrate-data function (file data migrations)
This will enable the ability to apply some migration to a specific
file from the Server REPL.
2022-03-31 10:40:15 +02:00
Andrey Antukh 59d0bafdc9 📎 Add analyze-file helper to srepl.main namespace 2022-03-31 10:40:15 +02:00
Andrey Antukh cee85942e6 📎 Set explicit clojure version on frontend and backend 2022-03-31 10:40:15 +02:00
Andrey Antukh f303d3c45d 🐛 Fix wrong type hints 2022-03-31 10:40:15 +02:00
Andrey Antukh 6f7f74f7c6 🐛 Add migrations to fix wrongly migrated data
Also port the migration introduced in main branch
for the recent hotfix
2022-03-31 10:40:15 +02:00
Alejandro Alonso ba398569c1 🐛 Fix shapes with no fill 2022-03-31 08:13:46 +02:00
Eva Marco a8a47dca8f Merge pull request #1760 from penpot/fix-name-component
Fix name component
2022-03-30 16:51:42 +02:00
Andrés Moya f782a7027a 🐛 Fix error when deleting all children of a nested group 2022-03-30 16:46:29 +02:00
Andrés Moya a434318535 🐛 Fix show component name in sidebar 2022-03-30 16:39:47 +02:00
Eva 134265094c 🐛 Avoid numeric inputs to allow big numbers 2022-03-30 16:35:36 +02:00
Eva 4909e7861f 🐛 FIx the context menu of component widget 2022-03-30 16:35:36 +02:00
Andrey Antukh ad9a7fdce8 📎 Set explicit clojure version on frontend and backend 2022-03-30 15:10:28 +02:00
Andrés Moya 97e97d0984 🐛 Fix undo after rotating a group 2022-03-30 15:07:56 +02:00
Andrey Antukh 4c6433b0f1 Improve migration 14
Remove frame thumbnail if the migration modifies a shape.
2022-03-30 14:38:36 +02:00
Andrey Antukh f0d956f71c 📎 Update version.txt file 2022-03-30 13:43:46 +02:00
Alejandro Alonso 3a9d348cab 🐛 Add shadow to artboard make it lose the fill 2022-03-30 13:35:52 +02:00
alonso.torres 586bd13cc2 🐛 Fix issue with shift+select to deselect shapes 2022-03-30 13:28:25 +02:00
alonso.torres e601e2acca 🐛 Fix linter problem 2022-03-30 13:23:59 +02:00
Alejandro Alonso 2a3c0e11da 🐛 Fixing export styles prettier 2022-03-30 13:13:29 +02:00
alonso.torres bee40ae35c 🐛 Fix issue with shift+select to deselect shapes 2022-03-30 13:06:54 +02:00
Andrey Antukh 0392a1649f 🐛 Remove default fill-color and fill-opacity on image shapes 2022-03-30 12:27:30 +02:00
Andrey Antukh 3cb15df08d Merge remote-tracking branch 'origin/staging' into develop 2022-03-30 11:50:03 +02:00
Alejandro Alonso d4b52ad4f1 🐛 Fixing export styles 2022-03-29 18:25:11 +02:00
Alejandro Alonso 91249bc892 🐛 Weird stroke behaviour on duplicate 2022-03-29 16:27:33 +02:00
Eva 87f5efeadb Add Selected colors menu 2022-03-29 11:56:18 +02:00
Eva 369eab3b5f 🐛 Avoid rotating shape when scrolling 2022-03-29 10:56:17 +02:00
alonso.torres 6780d17d2e 🐛 Fix drag guides to delete target area 2022-03-29 09:55:38 +02:00
alonso.torres af22fee0c1 🐛 Fix problem with boolean and children objects 2022-03-29 09:55:38 +02:00
alonso.torres 61c111d5ae 🐛 Some fixes to SVG imports 2022-03-29 09:55:38 +02:00
Rodolfo Carvalho 6897c0c3fe Remove duplicate require of clojure.test 2022-03-29 09:54:58 +02:00
Andrey Antukh 4010fb7d1e Merge remote-tracking branch 'origin/staging' into develop 2022-03-28 20:27:19 +02:00
Eva 3301148da6 🐛 Fix comments modal remains open on page change 2022-03-28 17:31:53 +02:00
Eva 09c57bdb86 🐛 Fix comments modal remains open on page change 2022-03-28 17:26:20 +02:00
Andrey Antukh 9ce0497f00 Add proper error handlings on http middleware 2022-03-28 17:24:52 +02:00
Andrey Antukh 36027583cd 📎 Minor change on create team instrumentation 2022-03-28 17:24:52 +02:00
Andrey Antukh 9abf4b126c Improve error handling 2022-03-28 17:24:52 +02:00
Andrey Antukh ec5a4d09b8 🐛 Fix possible issue that causes exception on node tests 2022-03-28 17:24:52 +02:00
Andrey Antukh 2832736826 🎉 Add garbage collection task for file thumbnails
And additionally, rename the current task to file-gc
to match the real purpose of the task.
2022-03-28 17:24:52 +02:00
Andrey Antukh b87e3c22b3 Improve worker error handling
Use the global error handlers for handle
also the worker errors.
2022-03-28 17:24:52 +02:00
Andrey Antukh 9582cc0211 🔥 Remove unused code 2022-03-28 17:24:52 +02:00
Andrey Antukh 1943877b21 Simplify d/group-by impl 2022-03-28 17:24:52 +02:00
Andrey Antukh c876534c85 Move the dashboard grid thumbnails to backend cache 2022-03-28 17:24:52 +02:00
Andrey Antukh b91c42e186 Add performance improvements to file thumbnails
Mainly addresing unnecesary object transmission. The new code strips
unnecesary data to be transferred from back to front.

Additionally it removes some legacy code and simplifies other
parts of code.
2022-03-28 17:24:52 +02:00
Alejandro Alonso 27c8f883ff 🐛 Fix ctrl-click on assets 2022-03-28 09:16:38 +02:00
Yaron Shahrabani d28bbdaaf7 🌐 Add translations for: Hebrew.
Currently translated at 99.8% (948 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-03-28 01:09:43 +02:00
Alejandro Alonso 5817b5fe19 🐛 Fix completed export text not shown 2022-03-25 14:50:13 +01:00
Alejandro Alonso 1db9b04bfd 🐛 Fix error when adding gradient stroke to shape 2022-03-25 14:49:42 +01:00
Andrey Antukh 00d851998b Merge pull request #1744 from penpot/multiexport-checkbox-fixes
🐛 Fix export multiple styles
2022-03-25 14:48:41 +01:00
Alejandro Alonso 927dbbfe82 🐛 Fix precission on export modal 2022-03-25 13:37:38 +01:00
Alejandro Alonso d73ed95719 🐛 Fix export multiple styles 2022-03-25 13:20:46 +01:00
alonso.torres 01194d5e25 Add dashboard to shortcuts 2022-03-25 12:18:33 +01:00
alonso.torres 32d31da0da Show shortcuts debugging command 2022-03-25 12:00:58 +01:00
Alejandro Alonso 655afa088d 🐛 Fix copy paste inside a text layer leaves pasted text transparent 2022-03-25 10:08:41 +01:00
Andrey Antukh 0355e1bfc7 Merge branch 'alotor/bugfixes' into staging 2022-03-25 09:33:03 +01:00
Andrey Antukh a44f1df0d4 Merge pull request #1728 from penpot/alotor/bugfixes
Safari/MacOS Fixes
2022-03-25 09:30:33 +01:00
Yaron Shahrabani 3e745ff45d 🌐 Add translations for: Hebrew.
Currently translated at 99.4% (944 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-03-25 08:03:09 +01:00
bingling_sama bc87e3d6d0 🌐 Add translations for: Chinese (Simplified).
Currently translated at 80.6% (765 of 949 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-03-25 08:03:08 +01:00
alonso.torres 5aa68c7052 🐛 Fix problem with text displacement in Safari 2022-03-24 18:03:14 +01:00
alonso.torres 6e36f66dde 🐛 Fix shift+2 shortcut in MacOS with non-english keyboards 2022-03-24 18:03:14 +01:00
alonso.torres 32e4569495 🐛 Fix problems with CTRL in MacOS 2022-03-24 18:03:14 +01:00
alonso.torres 5a591d2acd 🐛 Fix paste ordering for frames not being respected 2022-03-24 17:25:43 +01:00
alonso.torres e8980fbbfe 🐛 Fix problem with copy/paste in Safari 2022-03-24 17:25:43 +01:00
alonso.torres 8e68781a1b 🐛 Fix problems with trackpad zoom and scroll in MacOS 2022-03-24 17:25:43 +01:00
alonso.torres ad19d64ce8 🐛 Fix problem with localhost register in Safari 2022-03-24 17:25:43 +01:00
Andrey Antukh c1a67c0097 Merge remote-tracking branch 'origin/staging' into develop 2022-03-24 17:03:43 +01:00
Andrey Antukh 5ed84e3ae5 🐛 Set proper extension on download exported asset 2022-03-24 17:02:38 +01:00
Pablo Alba 5264863863 🐛 Fix enter on empty search page 2022-03-24 16:36:49 +01:00
Andrey Antukh 9c5c2ac8bf Merge pull request #1725 from penpot/multiexport-fixes
🐛 Multiexport fixes
2022-03-24 16:36:01 +01:00
Alejandro Alonso 1bbcf67396 🐛 Fix paths with no fill 2022-03-24 16:35:18 +01:00
Andrey Antukh 8b44b4d8f1 🐛 Fix unexpected decoding of fresian data 2022-03-24 15:15:42 +01:00
Andrey Antukh 4ef9d4d5f6 🐛 Fix unexpected decoding of fresian data 2022-03-24 15:14:43 +01:00
alonso.torres ea7266dc3b 🐛 Fix performance problem with new texts 2022-03-24 13:50:08 +01:00
Alejandro Alonso effb76c8db 🐛 Fix export multiple styles 2022-03-24 12:38:31 +01:00
Alejandro Alonso 2d52c4f4f5 🐛 Fix export translation 2022-03-24 12:19:06 +01:00
Andrey Antukh 4ed093f28f Merge remote-tracking branch 'origin/staging' into develop 2022-03-24 11:41:33 +01:00
Alejandro Alonso a753037178 🐛 Fix migration of fills and strokes for components 2022-03-24 11:39:01 +01:00
Alejandro Alonso 0d449f1292 🐛 Fix constraints assignation on multi-selection 2022-03-23 16:21:54 +01:00
Andrés Moya 2e3addc6da 🎉 Add more unit tests 2022-03-23 15:44:55 +01:00
Andrey Antukh a0762aca45 🐛 Fix pdf print on exporter 2022-03-23 14:46:04 +01:00
Andrey Antukh 80549bda9b Merge remote-tracking branch 'origin/staging' into develop 2022-03-23 14:16:15 +01:00
Andrey Antukh 88ad68069c 📚 Update contributing file 2022-03-23 14:16:03 +01:00
Alejandro Alonso 80ef69c710 🐛 Fix sorting on multiple export 2022-03-23 14:08:33 +01:00
Andrey Antukh 1d5d597103 📎 Set correct version on version.txt file 2022-03-23 13:24:08 +01:00
Andrey Antukh 6b164e10f2 📎 Update version.txt file 2022-03-23 13:23:16 +01:00
Andrey Antukh b3d70f2556 🐛 Fix many issues related to exportation process 2022-03-23 13:21:52 +01:00
Pablo Alba 8fa708d573 Merge pull request #1715 from penpot/add-translations-terms-privacy
🐛 Translations missing on login/register for 'Terms of service an…
2022-03-23 13:20:18 +01:00
Pablo Alba a68612ca2b 🐛 Translations missing on login/register for 'Terms of service and Privacy policy' 2022-03-23 13:10:53 +01:00
Alejandro 7d483b36d0 Merge pull request #1713 from penpot/keep-pencil-cursor
🐛 Pencil cursor changes when activated
2022-03-23 11:47:18 +01:00
Pablo Alba 61e409a09e 🐛 Pencil cursor changes when activated 2022-03-23 11:40:29 +01:00
Alejandro 5564d93d59 Merge pull request #1712 from penpot/revert-not-allow-edits-on-prototype-mode
🐛 Revert d2590c7: 🐛 [Prototype] Prototype mode should not all…
2022-03-23 11:22:49 +01:00
Pablo Alba 6674135c74 🐛 Revert d2590c7: 🐛 [Prototype] Prototype mode should not allow edits 2022-03-22 19:21:04 +01:00
Andrey Antukh a4fbc050cc Merge remote-tracking branch 'origin/staging' into develop 2022-03-22 15:01:43 +01:00
Andrey Antukh 205b6d9881 Merge pull request #1708 from penpot/alotor/bugfixes
Alotor/bugfixes
2022-03-22 15:01:30 +01:00
alonso.torres f2d1a4190a Don't stop SVG import when an image cannot be imported 2022-03-22 15:01:16 +01:00
alonso.torres 6008dc12d3 🐛 Fix clickable area in layers 2022-03-22 15:01:16 +01:00
alonso.torres 118b4367e7 🐛 Parametrized render to embed objects. Fix problem with fonts when exporting to SVG 2022-03-22 15:01:16 +01:00
alonso.torres e6f8269c0b 🐛 Fix problem with inconsistency with border-radius 2022-03-22 15:01:16 +01:00
alonso.torres 928128ba2d 🐛 Fix problem when changing page while editing text 2022-03-22 15:01:16 +01:00
alonso.torres 444567faac 🐛 Fix problem when importing SVG's with uses with overriding properties 2022-03-22 15:01:16 +01:00
alonso.torres eaa6ea80e6 🐛 Fix problem when adding shadows to imported text 2022-03-22 15:01:16 +01:00
alonso.torres a4d362d43d 🐛 Fix problem when importing a SVG with text 2022-03-22 15:01:16 +01:00
alonso.torres 89e2f4a481 🐛 Fix crash on iOS when displaying viewer 2022-03-22 15:01:16 +01:00
Andrey Antukh 8acc9af1f5 📎 Add more events instrumentation 2022-03-22 14:48:10 +01:00
Andrey Antukh 0ebc1a766e Merge remote-tracking branch 'origin/staging' into develop 2022-03-22 14:34:25 +01:00
Andrey Antukh bf6211903c 🐛 Fix issue on logging (backend) 2022-03-22 14:34:00 +01:00
Andrey Antukh ad262f6fb3 Merge remote-tracking branch 'origin/library-changes-builder' into staging 2022-03-22 13:14:53 +01:00
Andrey Antukh 0a7d1831d2 Merge pull request #1701 from penpot/library-changes-builder
Library changes builder
2022-03-22 13:13:25 +01:00
Andrés Moya ca56e08459 🎉 Add more test cases, and some fixes 2022-03-22 13:12:19 +01:00
Andrés Moya 31bfe3930d Prepare debug functions to be used in unit tests 2022-03-22 13:12:19 +01:00
Andrés Moya 48624b1db6 🔧 Refactor frontend unit tests and some fixes 2022-03-22 13:12:19 +01:00
Andrés Moya 5a33a002e4 🔧 Use changes-builder in library synchronization module 2022-03-22 13:12:19 +01:00
Andrey Antukh 43d3cc36e9 📎 Start new development cycle 2022-03-22 12:59:34 +01:00
Andrey Antukh ee813abdc1 📎 Update changelog file 2022-03-22 12:58:33 +01:00
Andrey Antukh 411acc0a2f 📎 Sort translation files 2022-03-22 12:54:11 +01:00
Andrey Antukh 28cd649db3 Merge remote-tracking branch 'weblate/develop' into translations 2022-03-22 12:53:31 +01:00
bingling_sama 94f2269ff2 🌐 Add translations for: Chinese (Simplified).
Currently translated at 79.0% (714 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-03-22 12:53:14 +01:00
Andrey Antukh c106b74239 Merge remote-tracking branch 'weblate/develop' into translations 2022-03-22 12:52:43 +01:00
Alejandro Alonso 3ae7c42afa Exporting big files flow 2022-03-22 12:31:34 +01:00
Andrey Antukh 0d4de50f13 📎 Minor fix on docker image files 2022-03-22 11:47:18 +01:00
Andrey Antukh d4c1e2fc36 📎 Minor cosmetic fixes 2022-03-22 11:34:32 +01:00
Andrey Antukh 903a9356a9 🐛 Fix many issues after PR review 2022-03-22 11:34:32 +01:00
Alejandro Alonso 2f6018c35c 📎 Update changelog 2022-03-22 11:34:32 +01:00
Alejandro Alonso 0e0fb68c38 🎉 Add assets exportation in bulk (multiple)
And adapt to the websocket changes on backend and
exporter.
2022-03-22 11:34:32 +01:00
Andrey Antukh f60d8c6c96 ♻️ Refactor websockets subsystem (on backend)
- Refactor msgbus subsystem, simplifying many parts.
- Enable persistent websocket connection for the all session duration.
2022-03-22 11:34:32 +01:00
Andrey Antukh 4a9e38a221 ♻️ Refactor exporter
- Migrate from puppeteer to playwright
- Fix many lifecycle and resource usage issues
- Add redis integration
- Enable multiple exportation
- Enable asynchronos exportation (with progress reporting)
2022-03-22 11:34:32 +01:00
Pablo Alba f0a9889f33 🐛 Remove a decimal sets value to 0 (refactor) 2022-03-22 10:07:32 +01:00
Alejandro aa386e12bc Merge pull request #1705 from penpot/fix/minus_placement
🐛 fix alignement of icon
2022-03-22 10:02:41 +01:00
Eva ba46ab7361 🐛 fix alignement of icon 2022-03-22 09:51:52 +01:00
Alejandro 5ce3ce06c6 Merge pull request #1704 from penpot/fix/scroll_comments
🐛 Fix scroll in comment section
2022-03-22 09:49:48 +01:00
Eva e95d940b5d 🐛 Fix scroll in comment section 2022-03-22 09:36:19 +01:00
Pablo Alba 14ed83fb31 🐛 Remove a decimal sets value to 0 2022-03-21 21:41:32 +01:00
Ahmad HosseinBor 497d42b822 🌐 Add translations for: Persian.
Currently translated at 22.7% (205 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-03-21 14:56:12 +01:00
Pablo Alba 3bae4839bd Search and filter layers 2022-03-21 11:21:12 +01:00
Andrey Antukh 81adcd03fb Minor fixes on devenv dockerfile 2022-03-20 13:37:37 +01:00
Andrey Antukh 7f3c67724e 🐛 Fix svg media asset upload internal server error 2022-03-20 13:04:12 +01:00
Andrey Antukh 741ad29d82 🎉 Add missing rlimit metadata and configuration 2022-03-18 17:12:12 +01:00
Ahmad HosseinBor 374de57e15 🌐 Add translations for: Persian.
Currently translated at 21.4% (194 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-03-18 16:58:06 +01:00
Andrey Antukh ff30d505af ⬆️ Update CircleCI config 2022-03-18 15:16:08 +01:00
Alejandro Alonso d4dc32a5e5 🐛 Go to style library file to edit in a new tab 2022-03-18 13:20:30 +01:00
Alejandro Alonso c073a66e7e 🐛 Inner shadow with border not working properly 2022-03-18 10:55:55 +01:00
Andrés Moya 4d2de63374 Merge pull request #1690 from penpot/feat/pixel-precision
Pixel precision
2022-03-18 10:49:01 +01:00
Andrey Antukh fa33c5852c Add missing rlimits on team and profile rpc mutations 2022-03-18 09:59:10 +01:00
Eva 510d9ab4d8 🐛 Fix overflow in color picker 2022-03-18 09:09:34 +01:00
alonso.torres 4f07613154 After review changes 2022-03-17 14:53:21 +01:00
alonso.torres d2b5283489 🐛 Revert debugging text utilities 2022-03-16 17:52:38 +01:00
alonso.torres aec68c52ab Improved snap to grids 2022-03-16 17:46:38 +01:00
alonso.torres b5e965cf1a Improved behaviour for horizontal/vertical lines 2022-03-16 17:46:38 +01:00
alonso.torres 640723a4e7 Improved options input 2022-03-16 17:46:38 +01:00
alonso.torres ccca3a38f0 🐛 Fix problem with multiple values in inputs 2022-03-16 17:46:38 +01:00
alonso.torres 9b862b672f Show pixel grid 2022-03-16 17:46:38 +01:00
alonso.torres ad4c1aae45 🐛 Fix problem with flip rotations 2022-03-16 17:46:38 +01:00
alonso.torres 099d1259b2 Pixel/half-pixel on path drawing 2022-03-16 17:46:38 +01:00
alonso.torres e5206e65e7 Pixel precision on modifiers 2022-03-16 17:46:38 +01:00
alonso.torres 9332d6f36c Improved resize/rotation handlers for shapes with tiny height/width 2022-03-16 17:46:38 +01:00
alonso.torres f4be3aa9de Improvements over selrect generation 2022-03-16 17:46:38 +01:00
alonso.torres 0f54e85b36 ♻️ Refactor selrec generation 2022-03-16 17:46:38 +01:00
alonso.torres ed9400912c Fix problems with extreme values 2022-03-16 17:46:38 +01:00
Alejandro Alonso 999af63118 🐛 Fixing dbg file upload with new http implementation 2022-03-16 13:07:01 +01:00
Alejandro b0e2200166 Merge pull request #1686 from penpot/artboard-fixed
 Set the artboard layer fixed at the top side of the layers
2022-03-15 11:37:20 +01:00
alonso.torres 43d4acc94b 🐛 Fix linter issue 2022-03-15 11:27:12 +01:00
alonso.torres 7a253dc9e4 🐛 Fix problem with thumbnails not working 2022-03-15 11:17:06 +01:00
andy b587f88968 🌐 Added translation for: Persian. 2022-03-15 10:29:41 +01:00
alonso.torres 491748af9f 🐛 Fix problem with import old files 2022-03-15 09:46:17 +01:00
alonso.torres 10e981d034 🐛 Fix problem with strokes and texts 2022-03-14 17:21:26 +01:00
Andrey Antukh e188ae732a Merge remote-tracking branch 'origin/main' into develop 2022-03-14 14:34:58 +01:00
Andrey Antukh 7e8d8eef5a 🐛 Fix minor issues on event instumentation module 2022-03-14 13:56:32 +01:00
Andrey Antukh e6d6b60b63 🐛 Properly filter complex data on events payload 2022-03-14 12:39:37 +01:00
Eva 70beb6c60c 🐛 Add ellipsis in long page names 2022-03-14 12:39:27 +01:00
alonso.torres 1990722f18 Merge remote-tracking branch 'origin/main' into develop 2022-03-14 12:17:06 +01:00
alonso.torres aa416a782d 🐛 Fix problem with handlers over rules 2022-03-14 10:23:13 +01:00
Pablo Alba 7f2d5f4d69 Set the artboard layer fixed at the top side of the layers 2022-03-14 09:54:08 +01:00
Rodion Borisov 4fa6d37d6f 🌐 Add translations for: Russian.
Currently translated at 61.7% (558 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-03-13 00:56:28 +01:00
Rubén b061844530 🌐 Add translations for: Catalan.
Currently translated at 99.4% (898 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-03-13 00:56:26 +01:00
Andrey Antukh 5add196d88 🐛 Don't instrument events with complex data 2022-03-11 18:11:59 +01:00
Andrey Antukh 1e580638d2 Merge pull request #1656 from penpot/social-logins-redesign
Authentication page and OIDC flows improvements
2022-03-11 17:22:03 +01:00
Andrey Antukh f33d6610e7 📎 Properly log error on audit archive task fail 2022-03-11 16:21:11 +01:00
alonso.torres a592f37593 Merge remote-tracking branch 'origin/main' into develop 2022-03-11 16:18:15 +01:00
Andrey Antukh 51dd869874 Merge pull request #1682 from penpot/alotor/hotfixes
Hotfixes
2022-03-11 15:56:45 +01:00
alonso.torres 5347409804 🐛 Fix problem with shift+ctrl+click to select 2022-03-11 15:38:48 +01:00
alonso.torres aa6f82c31f 🐛 Fix issue with guides over shape handlers 2022-03-11 15:38:48 +01:00
Andrey Antukh d9bd63d34f 📎 Reduce audit log archive task chunk size 2022-03-11 15:14:40 +01:00
Andrey Antukh a8f5604718 📎 Improve http server configuration 2022-03-11 15:01:49 +01:00
Andrey Antukh cf4f999b6a 📎 Improve api ergonomy of http server module 2022-03-11 09:50:49 +01:00
Andrey Antukh 52029f83ef 📎 Disable by default terms and privacy links
And make them configurable
2022-03-10 18:26:00 +01:00
Andrey Antukh 0c9a06789a 📎 Add correct copys and icons to login page 2022-03-10 17:45:20 +01:00
Alejandro 5709d2e757 Merge pull request #1677 from penpot/fix-select-color-for-stroke-from-palette
🐛 Fixing select color for stroke from palette
2022-03-10 17:13:02 +01:00
Andrey Antukh 11a0e01f08 Merge pull request #1670 from penpot/more-changes-builder
More changes builder
2022-03-10 16:50:55 +01:00
Alejandro Alonso 553c0e6d6a 🐛 Fixing select color for stroke from palette 2022-03-10 16:34:55 +01:00
Andrés Moya 7b81bb3fc2 💄 Change some code styles 2022-03-10 16:12:22 +01:00
Andrés Moya e609670a41 🔧 Use changes-builder in many places 2022-03-10 15:37:10 +01:00
Andrés Moya a7b455fb9a 🔧 Use changes-builder in workspace common operations 2022-03-10 15:21:58 +01:00
Andrés Moya 8ed857b4b9 🔧 Move :reg-objects operation to frontend 2022-03-10 15:21:58 +01:00
Eva 2bb8c535bd 🐛 Fix palette selection in color picker 2022-03-10 14:40:37 +01:00
Eva e09884af60 🐛 Add ellipsis in long page names 2022-03-10 14:02:47 +01:00
Andrey Antukh 57399aeab2 🎉 Add the ability to specify email attr on oidc integration 2022-03-10 13:35:23 +01:00
Andrey Antukh 33c3e86e66 Add tests and improve impl of registration with invitation 2022-03-10 13:32:06 +01:00
Andrey Antukh a7e77c3ea6 Minor fixes on login and register page structure 2022-03-10 13:32:06 +01:00
Andrey Antukh 2d76364b09 Enable login flag and disable demo-users by default 2022-03-10 13:32:06 +01:00
Andrey Antukh 36eaa18749 Enable register by invitation when register is disabled 2022-03-10 13:32:06 +01:00
Andrey Antukh f7bb08382c Fix issues from previous refactor peer review 2022-03-10 13:32:06 +01:00
Andrey Antukh 9841a39d04 🐛 Fix issues on github oauth integration 2022-03-10 13:32:06 +01:00
Andrey Antukh edf53840de 🐛 Fix issues with gitlab oidc provider 2022-03-10 13:32:06 +01:00
Andrey Antukh 6bd2dcff2a Minor improvements on error reporting 2022-03-10 13:32:06 +01:00
Andrey Antukh 73117f6f27 🐛 Set correct scopes for gitlab auth integration 2022-03-10 13:32:06 +01:00
Pablo Alba 3d588a88e2 💄 Social login redesign 2022-03-10 13:32:04 +01:00
Andrey Antukh 636dbd4e57 Merge pull request #1672 from penpot/set-artboard-as-thumbnail
 Set an artboard as the file thumbnail
2022-03-10 09:27:20 +01:00
Pablo Alba 0a04a856da Set an artboard as the file thumbnail 2022-03-10 09:05:41 +01:00
Andrey Antukh e139284a98 Merge remote-tracking branch 'origin/main' into develop 2022-03-09 17:51:48 +01:00
Andrés Moya a04980b251 Merge pull request #1660 from penpot/niwinz-async-refactor-2
Refactor backend (part3)
2022-03-09 17:20:12 +01:00
Andrey Antukh 8120a0cb9c 📎 Change backend repl script default env options 2022-03-09 17:18:06 +01:00
Andrey Antukh c84f8808cb ♻️ Refactor loki integration
Make it implemented as worker thread instead of async
process just for simplify it.
2022-03-09 17:18:06 +01:00
Andrey Antukh 1b444a42f2 ♻️ Refactor http server layer
Make it fully asynchronous.
2022-03-09 17:18:06 +01:00
Andrey Antukh a7e79b13f9 🐛 Fix library selection on color palette 2022-03-09 15:12:07 +01:00
Andrey Antukh 3e6be7e04c Merge pull request #1658 from penpot/fix-get-attrs-multi
🐛 Fix multiple edition
2022-03-08 15:25:15 +01:00
Andrés Moya aa1e3f59ed 🔧 Small refactors 2022-03-08 15:17:02 +01:00
Andrés Moya a13fb1f94f 🐛 Fix multiple edition 2022-03-08 15:10:23 +01:00
Andrey Antukh 19f4faa03f ♻️ Refactor workspace layout initialization and persistence 2022-03-08 12:59:56 +01:00
Andrey Antukh 965148f3a6 📎 Port fixes from main branch 2022-03-08 12:59:56 +01:00
alonso.torres a0c0ab1871 🐛 Fix problem with handoff css 2022-03-08 11:53:56 +01:00
Alejandro 43cbe2dd39 Merge pull request #1665 from penpot/fix/bool-with-multiple-shapes
🐛 Fix problem with booleans and new fills/strokes
2022-03-08 10:02:20 +01:00
alonso.torres 9c00de047a 🐛 Fix problem with booleans and new fills/strokes 2022-03-08 09:52:20 +01:00
Andrey Antukh 49649a8814 Merge pull request #1662 from penpot/niwinz-hotfix-event-tracing-improvements
Minor improvements (hotfix)
2022-03-07 15:52:26 +01:00
Andrey Antukh 18a67a80bc 🔥 Remove unused code 2022-03-07 15:50:31 +01:00
Andrey Antukh 867669cc98 Add missing origin meta on left-toolbar events 2022-03-07 15:19:51 +01:00
Andrey Antukh 0158a93391 📎 Fix linter issues on staging branch 2022-03-07 15:10:03 +01:00
Andrey Antukh fdb6533149 Minor improvement on workspace flags and modal event tracing 2022-03-07 15:10:03 +01:00
Andrey Antukh 6f32d721c2 📎 Minor changes on default values on devenv docker compose 2022-03-07 15:10:03 +01:00
Andrey Antukh 5f49656e30 Add proper event tracing on nudge modal
And ♻️ refactor data event handling, moving
some logic from component to the event.
2022-03-07 15:10:03 +01:00
Andrey Antukh 8114b165d9 📎 Update version.txt file 2022-03-07 13:13:41 +01:00
Andrey Antukh dd39cb5a1c Merge pull request #1661 from penpot/fix/viewer-performance
🐛 Fix problems with viewer performance
2022-03-07 13:13:11 +01:00
Andrey Antukh 7f8c217e7c Merge remote-tracking branch 'origin/main' into staging 2022-03-07 13:11:38 +01:00
Andrey Antukh d731a095c6 Merge branch 'main' into staging 2022-03-07 13:08:20 +01:00
alonso.torres 6630899d6e 🐛 Fix problems with viewer performance 2022-03-07 12:40:27 +01:00
Andrey Antukh 0cfd5095a7 🐛 Fix stack trace reporting on loki 2022-03-07 11:31:36 +01:00
Andrey Antukh a588267fc2 Merge remote-tracking branch 'origin/main' into develop 2022-03-07 11:22:02 +01:00
Andrey Antukh 4f379821b5 🐛 Fix labels on loki logger 2022-03-07 11:09:06 +01:00
Eva 9eea7dabc2 🐛 Fix length of names in sidebar 2022-03-07 11:07:15 +01:00
Joseph V M ca85a9a2a5 🌐 Add translations for: Malayalam.
Currently translated at 7.5% (68 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2022-03-05 21:57:58 +01:00
Pablo Alba e34885de9b 🐛 Fix error on frame with border 2022-03-04 15:38:46 +01:00
Andrey Antukh 192b9213ac Merge pull request #1655 from penpot/multiple-members-invitations
 Allow send multiple team invitations at once
2022-03-04 15:20:51 +01:00
Pablo Alba 7e26e2bc21 Small changes on multi-input behaviour and styles 2022-03-04 15:06:58 +01:00
Eva f9c0482949 Show actual coordinates while modifying and creating a shape 2022-03-04 13:16:57 +01:00
Eva 7e0d7ef727 🐛 avoid show rotation options with frames 2022-03-04 09:43:45 +01:00
Alejandro Alonso d6820a69d4 🐛 Fixing texts with multiple strokes and fills 2022-03-04 07:56:47 +01:00
Pablo Alba cf09ff8dc3 📎 Change spanish translation of pin-unpin 2022-03-03 22:02:36 +01:00
Pablo Alba bda941746b Add '_' as zoom out shortcut 2022-03-03 21:54:30 +01:00
Andrey Antukh f638a2ff49 Add revision fixes 2022-03-03 16:05:52 +01:00
Andrey Antukh b348a882f4 🎉 Add minio client to devenv
And minor fix the nginx config.
2022-03-03 16:05:52 +01:00
Andrey Antukh 9e4a50fb15 ♻️ Refactor backend to be more async friendly 2022-03-03 16:05:52 +01:00
Andrey Antukh cfe657d853 Make the multi-input more generic 2022-03-03 14:49:10 +01:00
Andrey Antukh a1c3789ec2 🎉 Add parse email helper function 2022-03-03 14:49:10 +01:00
Pablo Alba 1cf9ad55c6 Allow send multiple team invitations at once 2022-03-03 14:49:09 +01:00
Andrés Moya 087d896569 🔧 Fix multiple edition 2022-03-03 11:36:25 +01:00
alonso.torres 17fc15138a Add suport to export/import frames with radius 2022-03-03 11:36:25 +01:00
Eva d4af28c52b Add border radius to artboards 2022-03-03 11:36:25 +01:00
nautilusx 767a162077 🌐 Add translations for: German.
Currently translated at 97.8% (884 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-03-02 19:54:23 +01:00
alonso.torres 78d7fe3e10 New focus mode in workspace 2022-03-02 10:41:13 +01:00
Andrey Antukh dc18a6c3bc 📎 Fix linter issues 2022-03-01 15:30:58 +01:00
Andrey Antukh 03cb738e55 Merge remote-tracking branch 'origin/main' into develop 2022-03-01 15:10:33 +01:00
Andrey Antukh d1c834e647 🐛 Fix minor issue on executors monitor 2022-03-01 14:34:13 +01:00
Andrey Antukh 03a082fe40 🐛 Fix metrics on websocket connections 2022-03-01 14:19:26 +01:00
Pablo Alba 7691377c1b Persist color palette and color picker across refresh 2022-03-01 14:06:13 +01:00
alonso.torres 0534570784 🐛 Fix typo in text palette 2022-03-01 13:00:48 +01:00
Andrey Antukh f2e389593a 🐛 Fix graphic asset rename 2022-03-01 12:50:10 +01:00
Alejandro 2037c3b202 Merge pull request #1649 from penpot/fixing-default-path-for-strokes
🐛 Fixing default path for strokes
2022-03-01 11:53:22 +01:00
Alejandro Alonso 1dc7db4456 🐛 Fixing default path for strokes 2022-03-01 11:23:20 +01:00
Andrey Antukh fae79d67e6 Merge branch 'staging' 2022-03-01 11:10:27 +01:00
Andrey Antukh 271f69d59d Merge branch 'release-1.12' into staging 2022-03-01 11:08:21 +01:00
elhombretecla 6563cd9c8b 🎉 Add new release info dialog 2022-03-01 11:07:50 +01:00
alonso.torres 8d700491da 🐛 Fix 404 error on fills 2022-03-01 09:52:17 +01:00
Alejandro Alonso 7962c104b6 Adding specs for fills and strokes 2022-03-01 09:14:23 +01:00
Andrey Antukh 505d0f4768 📎 Update clj-kondo config 2022-02-28 22:11:42 +01:00
Andrey Antukh e60b8a7aef 🐛 Minor fix on worker executors monitor 2022-02-28 17:21:36 +01:00
Andrey Antukh cb65eca062 🐛 Fix double deref 2022-02-28 17:17:54 +01:00
alonso.torres d6a5913086 Merge remote-tracking branch 'origin/staging' into develop 2022-02-28 16:10:30 +01:00
alonso.torres a644599b16 🐛 Fix problem when disabling grid snap 2022-02-28 16:07:43 +01:00
alonso.torres 52def43f5a 🐛 Fix issue with react hooks 2022-02-28 15:46:11 +01:00
Andrey Antukh 5d2715dd32 Improve monitors monitor 2022-02-28 15:29:30 +01:00
Alejandro Alonso 13af98e5ad 📎 Removing unncesary TODO 2022-02-28 15:13:59 +01:00
Andrey Antukh d14e907954 Merge remote-tracking branch 'origin/staging' into develop 2022-02-28 12:54:02 +01:00
alonso.torres 3f804339b9 🐛 Fix linter issues 2022-02-28 12:38:57 +01:00
Alejandro Alonso a73a393e26 Ability to add multiple strokes to a shape 2022-02-28 12:38:57 +01:00
Andrey Antukh 1bad233e2f 📎 Fix linter issues on staging branch 2022-02-28 12:09:59 +01:00
Andrey Antukh f64b1d3651 🐛 Properly handle invitations on login 2022-02-28 12:08:31 +01:00
Andrey Antukh eb57c2f980 💄 Cosmetic changes on mutation profile ns 2022-02-28 12:08:05 +01:00
Andrey Antukh ecd491cd09 🐛 Don't mark as touched temporal file 2022-02-28 12:07:44 +01:00
Andrey Antukh dead3138b3 Reduce the size of the default thread pool 2022-02-28 12:07:21 +01:00
Andrey Antukh 0416082d4d 🐛 Fix awsns handler, convert it ot async 2022-02-28 12:06:47 +01:00
Joseph V M 98d1fd85fb 🌐 Add translations for: Malayalam.
Currently translated at 6.5% (59 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2022-02-25 21:56:12 +01:00
Andrey Antukh 719aacd6f8 🎉 Add new fmt macro 2022-02-25 14:57:37 +01:00
Andrey Antukh 4ee2ca2a33 🐛 Backport some fixes from staging 2022-02-25 13:18:51 +01:00
Andrey Antukh 45f9d5bb81 Merge remote-tracking branch 'origin/staging' into develop 2022-02-25 12:56:30 +01:00
Andrey Antukh 9f2d87d7d7 📎 Fix linter issues related to clj-kondo update 2022-02-25 12:54:29 +01:00
Andrey Antukh d5b163f04d 🐛 Fix naming consistency and page background forwarding 2022-02-25 12:54:29 +01:00
alonso.torres 05c77d0248 🐛 Fix problem with collapsing pages 2022-02-25 12:53:22 +01:00
Alejandro Alonso 2fc4c30bed 🐛 [Prototype] Prototype mode should not allow edits 2022-02-25 12:41:19 +01:00
Alejandro Alonso d2590c7651 🐛 [Prototype] Prototype mode should not allow edits 2022-02-25 12:24:09 +01:00
alonso.torres 237af505f9 🐛 Fix problem when editing texts 2022-02-25 11:41:55 +01:00
Andrey Antukh 7b4f522a33 📎 Minor fixes on frontend test code. 2022-02-25 11:07:40 +01:00
Andrey Antukh 0e7ce55f9a 📎 Fix linter issues and linter config 2022-02-25 11:07:40 +01:00
Andrey Antukh fe43b3494c 🐛 Fix minor issues on es6 imports 2022-02-25 11:07:40 +01:00
Andrey Antukh 4c00c8f3ec Minor performance enhancement on str concat opetations
And proper stringify of :key prop of react components
2022-02-25 11:07:40 +01:00
Andrey Antukh f05518e357 ♻️ Refactor workspace state organization
Move many local to a specific global prop.
2022-02-25 11:07:40 +01:00
Andrey Antukh 6e667e078c 🎉 Add cljs benchmark code under dev directory 2022-02-25 11:07:40 +01:00
Andrey Antukh 84a36624a6 🎉 Add specific namespace for data macros
And additionally add optimized macros for get-in,
select-keys and str.
2022-02-25 11:07:40 +01:00
Andrey Antukh 165c551e39 ⬆️ Update dependencies 2022-02-25 11:07:40 +01:00
Andrey Antukh fe6ed2ceae Merge pull request #1631 from penpot/fix/color_palette_animation
🐛 Fix color palette animation
2022-02-25 09:15:39 +01:00
Andrey Antukh 92bcd549ef ⬆️ Update dependencies on devenv docker 2022-02-25 08:46:38 +01:00
Andrés Maldonado 5216471226 🐳 Fix run-devenv on systems with SELinux
This sets the selinux label on bind mounts (https://docs.docker.com/storage/bind-mounts/#configure-the-selinux-label), which is necessary so that containers can read the files.

Signed-off-by: Andrés Maldonado <maldonado@codelutin.com>
2022-02-24 22:31:33 +01:00
Joseph V M 6497ee02fb 🌐 Add translations for: Malayalam.
Currently translated at 5.3% (48 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2022-02-24 20:53:58 +01:00
Yaron Shahrabani 859e26cf8f 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (903 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-02-24 20:53:58 +01:00
alonso.torres 9964360656 📚 Updated changelog 2022-02-24 18:11:12 +01:00
Andrey Antukh 73f5e7c2ef Merge pull request #1623 from penpot/feat/svg-texts
Render Text as native SVG elements
2022-02-24 14:34:11 +01:00
alonso.torres 64ffa9bb3f 🐛 Fix problems with old texts 2022-02-24 14:05:01 +01:00
alonso.torres ec63d23666 Multiple fills in text shapes 2022-02-24 14:05:01 +01:00
alonso.torres a3063eb46d Add support for multiple shapes 2022-02-24 14:05:00 +01:00
alonso.torres 40b7cafacc Fix problems with strokes 2022-02-24 14:05:00 +01:00
alonso.torres 82c6b8daae Fix problems with export/import 2022-02-24 14:05:00 +01:00
alonso.torres 3228582cbe Fix problems when migrating old texts 2022-02-24 14:05:00 +01:00
alonso.torres d0e008665f Fix masks for Firefox 2022-02-24 14:05:00 +01:00
alonso.torres 96eacb6efe Changed update text flow 2022-02-24 14:05:00 +01:00
alonso.torres e183d67e2a Add spec for new text data 2022-02-24 14:05:00 +01:00
alonso.torres bbf91a8957 Improved text selection 2022-02-24 14:05:00 +01:00
alonso.torres 618d22d214 Changes to text editor 2022-02-24 14:05:00 +01:00
alonso.torres d83459f674 ❇️ Change mutation listener 2022-02-24 14:05:00 +01:00
alonso.torres 6cb6adc134 Allows svg text on test edit and creation 2022-02-24 14:05:00 +01:00
alonso.torres 18dded1a00 Fix editor and bounds for new texts 2022-02-24 14:05:00 +01:00
alonso.torres 1c2785f34e Adds borders to SVG texts 2022-02-24 14:05:00 +01:00
alonso.torres a411cbc640 Initial SVG text support 2022-02-24 14:05:00 +01:00
alonso.torres b4c87ad0b9 🐛 Fix font for guides and rulese 2022-02-24 11:45:56 +01:00
Andrey Antukh 37a35b1827 Minor improvements on telemetry task 2022-02-24 11:02:05 +01:00
Eva ddae26b48b 🐛 Fix color palette animation 2022-02-24 09:46:19 +01:00
Andrey Antukh c3f57cf900 Merge pull request #1619 from penpot/use-changes-builder
🔧 Refactor to use changes-builder
2022-02-24 09:19:51 +01:00
Andrés Moya 56b74c6ff2 🔧 Refactor shape ordering to use changes-builder 2022-02-23 14:16:45 +01:00
Andrés Moya 8682c07148 🔧 Small refactor changes-builder 2022-02-23 14:16:45 +01:00
Andrés Moya 96870c3fee 🔧 Refactor page actions to use changes-builder 2022-02-23 14:16:45 +01:00
Eva 24a0b4445e Open feedback page in a new tab 2022-02-23 12:51:02 +01:00
Eva e139cba621 Scroll to selected font size or closest in font size selector 2022-02-23 12:50:23 +01:00
Andrey Antukh 07e8d110a2 🐛 Fix incorrect error id reporting on mattermost webhook 2022-02-23 12:41:33 +01:00
Andrey Antukh 87c1bc4bdb 🐛 Fix incorrect error id reporting on mattermost webhook 2022-02-23 12:40:28 +01:00
Andrey Antukh 31b13f3551 🐛 Fix issues with not authenticated requests
Related to concurrency model refactor.
2022-02-23 12:34:59 +01:00
Andrey Antukh e15f5bb432 🐛 Fix issues with not authenticated requests
Related to concurrency model refactor.
2022-02-23 12:34:08 +01:00
Andrey Antukh 340ee859f9 📎 Fix linter issues 2022-02-23 12:17:18 +01:00
Andrey Antukh 496ba433e9 📎 Fix linter issues 2022-02-23 12:16:51 +01:00
Andrey Antukh b183dc3e62 Merge remote-tracking branch 'origin/staging' into develop 2022-02-23 12:00:50 +01:00
Andrey Antukh 0b0ae756a3 🐛 Minor fix on audit http handler 2022-02-23 11:59:17 +01:00
Andrey Antukh 0ade0405f5 🐛 Fix feedback and audit-log http handlers 2022-02-23 11:49:25 +01:00
Eva fcf8ad0611 ♻️ Rearrange changelog 2022-02-23 09:34:01 +01:00
Andrey Antukh e0cb6d32ea Merge remote-tracking branch 'origin/staging' into develop 2022-02-23 09:14:51 +01:00
Andrey Antukh aeed535f1b Minor improvement on reference handling on touched-gc task 2022-02-23 09:13:48 +01:00
Andrey Antukh 974084a9ca 🐛 Add missing executor dependency to auth handlers 2022-02-23 09:13:48 +01:00
Alejandro Alonso 88706534c2 🐛 Fixing fil typo 2022-02-23 08:33:03 +01:00
Eva 70def21153 ♻️ Improve file menu usage 2022-02-22 13:36:01 +01:00
Eva 941174a9fa 🐛 Show code icon on preview hover 2022-02-22 13:11:59 +01:00
Andrés Moya 46bfb2aacd 🐛 Fixed alignment of layers with children 2022-02-22 13:10:59 +01:00
Andrey Antukh a4ef3f770c Merge remote-tracking branch 'origin/staging' into develop 2022-02-22 13:06:09 +01:00
Andrey Antukh 7cf27ac86d ♻️ Refactor general resource and concurrency model on backend 2022-02-22 13:05:41 +01:00
Joseph V M 823e5ca058 🌐 Add translations for: Malayalam.
Currently translated at 2.4% (22 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ml/
2022-02-22 12:57:50 +01:00
John Terroa b7a182129d 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 56.0% (506 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-02-22 12:57:50 +01:00
Alejandro Alonso 10b147a25d 🐛 Importing shapes without fills 2022-02-22 10:53:47 +01:00
alonso.torres 6550631003 📚 Updated changelog 2022-02-22 10:52:58 +01:00
Migara 9d04dc7d9a 🎉 Add invitation section to dashboard 2022-02-22 09:20:31 +01:00
Andrey Antukh 486d89c5d0 Merge pull request #1607 from penpot/duplicate-flow
Duplicate flow
2022-02-22 08:48:20 +01:00
alonso.torres d24f16563f Use remove to delete guides 2022-02-21 17:30:08 +01:00
Eva Marco bb68838fa4 Merge pull request #1620 from penpot/fix_double_click
🐛 Fix problem with double click
2022-02-21 17:27:46 +01:00
alonso.torres aed6a8a5ff 🐛 Fix problem with double click 2022-02-21 16:57:35 +01:00
Andrey Antukh e13bceeb59 Merge remote-tracking branch 'origin/staging' into develop 2022-02-21 16:29:45 +01:00
Alejandro Alonso 1dab89f7ae 🌐 Added translation for: Malayalam. 2022-02-21 12:18:44 +01:00
Andrey Antukh 96facc5100 ♻️ Refactor invitation flow
Enfoces security and make the flow more deterministic.
2022-02-21 11:38:28 +01:00
Rubén 43d94d208f 🌐 Add translations for: Catalan.
Currently translated at 97.5% (881 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-02-19 22:58:21 +01:00
Yaron Shahrabani 741ee99e6b 🌐 Add translations for: Hebrew.
Currently translated at 99.6% (900 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-02-18 18:56:07 +01:00
Oğuz Ersen 6f2cff2f33 🌐 Add translations for: Turkish.
Currently translated at 99.7% (901 of 903 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-02-18 18:56:06 +01:00
Andrés Moya 0035827209 🎉 Duplicate shapes must create new flows if needed 2022-02-18 17:46:26 +01:00
Andrés Moya c626b1d106 ♻️ Refactor duplicate objects 2022-02-18 13:14:20 +01:00
Andrés Moya 9c895cb8bb ♻️ Reorder some functions 2022-02-18 13:14:20 +01:00
Alejandro Alonso 23a9c74297 Ability to add multiple fills to a shape 2022-02-17 11:19:21 +01:00
Andrés Moya aecb8a1464 🐛 Fix some broken tests 2022-02-17 11:19:21 +01:00
Andrés Moya b9e3426532 🔧 Refactor calculation of multi selection attributes 2022-02-17 11:19:21 +01:00
Andrey Antukh 809d7ab7f4 Merge remote-tracking branch 'origin/staging' into develop 2022-02-17 11:16:00 +01:00
Andrey Antukh 6486b24c8b ⬆️ Update shadow-cljs version 2022-02-17 11:15:19 +01:00
Alejandro e11d78d37a Merge pull request #1589 from penpot/us/team_members_redesing
Redesign Team members
2022-02-17 09:22:56 +01:00
Eva 3a34b3ae5f Team member redesign 2022-02-17 09:04:29 +01:00
Pablo Alba 75a8f85ebb Do not show the templates modal on onboarding 2022-02-16 21:34:47 +01:00
Andrés Moya 3d8f757712 🐛 Fixed cannot align objects inside a group but not inside a frame 2022-02-16 17:07:28 +01:00
Andrey Antukh b37d6ec500 Merge remote-tracking branch 'origin/staging' into develop 2022-02-16 16:30:45 +01:00
Alejandro Alonso 4efd8b7d3f 🐛 Select All (CTRL+A) fails 2022-02-16 16:24:00 +01:00
Andrés Moya 5d17933593 🐛 Fix touched component marker appearing when it's not needed 2022-02-16 16:23:31 +01:00
Andrey Antukh 277d8f8b93 📎 Increase version on develop branch. 2022-02-16 14:01:30 +01:00
Andrey Antukh f2c5add752 📎 Add new ongoing release to CHANGES.md file 2022-02-16 14:01:00 +01:00
Andrey Antukh 60d37b6de0 Merge branch 'staging' into develop 2022-02-16 14:00:46 +01:00
Andrey Antukh 206778021f 📎 Update changes.md file 2022-02-16 14:00:25 +01:00
Andrey Antukh 4a262de550 Merge branch 'niwinz-storage-transactionality-refactor' into staging 2022-02-16 13:58:36 +01:00
Andrey Antukh 350663b7ce 🎉 Add support for alternative S3 compatible services
And also add support for all AWS regions (prevoiosly onlu eu-central-1)
was supported.
2022-02-16 13:58:19 +01:00
Andrey Antukh f1db0fea03 ♻️ Refactor storage transaction management 2022-02-16 13:58:15 +01:00
Pablo Alba 1990232adc 🎉 Add team invitations API 2022-02-16 13:52:31 +01:00
Andrey Antukh 256ed7410f Add unique id (uuid) on each log entry 2022-02-16 11:58:43 +01:00
Andrey Antukh 09a4cb30ec 🐛 Fix unresolved symbol error introduced in prev merge 2022-02-16 11:29:30 +01:00
Andrey Antukh aa3826c389 📎 Sort translations 2022-02-16 11:26:13 +01:00
Andrey Antukh b91042c1e5 Merge remote-tracking branch 'weblate/develop' into translations 2022-02-16 11:24:56 +01:00
Andrey Antukh 7eed8c5ee5 Merge remote-tracking branch 'origin/main' into develop 2022-02-16 11:23:26 +01:00
Andrey Antukh 3207860374 🐛 Fix compatibility issues of some requires and shadow-cljs 2022-02-15 16:01:46 +01:00
Keunes b3bb8b6692 📎 Update bug_report.md file
Make clearer what information should be provided when filing a bug report.
2022-02-15 15:54:59 +01:00
Andrey Antukh 5b8b13c94c ⬆️ Update shadow-cljs to 2.17.2 2022-02-15 15:07:29 +01:00
Andrey Antukh e8426006e3 Update version.txt file 2022-02-15 13:27:08 +01:00
Andrey Antukh 116fafd0e1 📎 Minor log param naming change 2022-02-15 13:25:46 +01:00
Andrey Antukh e9fe1800e0 Fix minor issues on session expiration handling 2022-02-15 13:25:06 +01:00
Andrey Antukh 82796822d1 🐛 Fix possible race condition on component rename and deletion 2022-02-15 12:26:36 +01:00
Andrey Antukh ce61b783fb Minor improvements on telemetry task 2022-02-15 12:26:36 +01:00
Andrey Antukh 9b78b2a432 Improve error reporting on background tasks 2022-02-15 12:26:36 +01:00
Andrey Antukh 321b2c7c23 🐛 Fix error handling on s3 delete-in-bulk operation 2022-02-15 12:26:36 +01:00
Andrey Antukh dee397615c 📎 Update changelog file 2022-02-15 12:26:36 +01:00
Andrey Antukh ef9339f6f1 🐛 Fix unexpected exception on handling empty state on boolean calc 2022-02-15 12:26:36 +01:00
Alejandro f7f32408fc Merge pull request #1577 from penpot/fix/radial-gradients
 Changed radial gradients to use objectBoundingBox
2022-02-14 12:26:43 +01:00
Andrey Antukh d4e6992442 Merge remote-tracking branch 'origin/main' into develop 2022-02-12 17:36:19 +01:00
Andrey Antukh 420ece7005 📎 Increase *print-level* on error reporting. 2022-02-12 17:35:29 +01:00
Andrey Antukh 741d2b3f3c Merge remote-tracking branch 'origin/main' into develop 2022-02-12 17:33:28 +01:00
Andrey Antukh c8bf319b39 Merge pull request #1567 from penpot/frame-snapshot-api
 Frame snapshot api
2022-02-12 16:09:03 +01:00
Pablo Alba 34df52be5f 🎉 Add frame thumbnail API 2022-02-12 16:08:46 +01:00
Pablo Alba fc2399a885 Rotation to snap to 15º intervals with shift 2022-02-11 12:42:43 +01:00
alonso.torres 699ec93ca4 Changed radial gradients to use objectBoundingBox 2022-02-11 12:33:13 +01:00
Andrés Moya 10598063d1 🔧 Provisional change menu to staging landing page 2022-02-11 12:32:57 +01:00
Eva Marco db1e9574cd Merge pull request #1568 from penpot/fix/gradient-problem
🐛 Fix problem with gradient handlers
2022-02-11 11:27:01 +01:00
Andrés Moya af74a1575b 🐛 Clear authentication cookies when logged out 2022-02-11 10:07:03 +01:00
Eva 03242e1a9c 🐛 Fix ungroup typography when editing 2022-02-10 16:20:13 +01:00
Andrey Antukh dcbd89ff7c Increase default max connection pool size to 60. 2022-02-10 15:12:35 +01:00
Andrey Antukh 2312561041 Temporaly disable parallel uploading of files on import 2022-02-10 15:12:35 +01:00
Andrey Antukh b591fbecf0 🎉 Add health check api endpoint 2022-02-10 15:12:35 +01:00
Andrey Antukh 3fbb440436 Handle EOF on websocket write/ping operations 2022-02-10 15:12:35 +01:00
Andrey Antukh d358185a04 💄 Minor cosmetic change on database logger processor 2022-02-10 15:12:35 +01:00
Andrey Antukh 8babb59f75 Process audit log events only if profile-id is known 2022-02-10 15:12:35 +01:00
Andrey Antukh 3461ec2281 Ignore EOF errors on writting streamed response 2022-02-10 15:12:35 +01:00
Andrey Antukh 3dd94bd362 🐛 Log correct deleted number value on recheck task 2022-02-10 15:12:35 +01:00
Andrey Antukh 827c2140b7 ♻️ Refactor error reporting and logging context formatting
The prev approach uses clojure.pprint without any limit extensivelly
for format error context data and all this is done on the calling
thread. The clojure.pprint seems very inneficient in cpu and memory
usage on pprinting large data structures.

This is improved in the following way:

- All formatting and pretty printing is moved to logging thread,
  reducing unnecesary blocking and load on jetty http threads.
- Replace the clojure.pprint with fipp.edn that looks considerably
  faster than the first one.
- Add some safe limits on pretty printer for strip printing some
  data when the data structure is very large, very deep or both.
2022-02-10 15:12:35 +01:00
Andrés Moya 5a5222a97a 🐛 Fix error getting file library 2022-02-10 13:17:57 +01:00
Andrés Moya bea3699451 🐛 Fix error instantiating a component 2022-02-10 12:27:44 +01:00
alonso.torres 93174f54a3 Change menu to add show/hide ui 2022-02-10 09:41:50 +01:00
Eva e1348725c1 🐛 fix error when posting an empty comment 2022-02-10 09:28:05 +01:00
Andrey Antukh 528839cde2 Merge pull request #1569 from penpot/dashboard-user-menu
Dashboard user menu and session cookie
2022-02-09 23:51:14 +01:00
Andrés Moya c5c331ee30 Refactor user menu in dashboard 2022-02-09 15:52:04 +01:00
Eva Marco 69effa37a3 Merge pull request #1570 from penpot/fix/problem-with-typographies
🐛 Fix problem with typographies in assets
2022-02-09 15:48:34 +01:00
alonso.torres 4c7a781228 🐛 Fix problem with typographies in assets 2022-02-09 15:26:45 +01:00
Andrés Moya 62a67bdb94 🎉 Set a domain cookie to check for logged from landing page 2022-02-09 15:25:40 +01:00
alonso.torres c5c0b36f28 Improved mouse collision detection for groups and text shapes 2022-02-09 15:17:59 +01:00
Andrés Moya 0d48c758df 📚 Add new contributor change 2022-02-09 15:16:19 +01:00
Andrés Moya 4856413b24 Merge branch 'rhcarvalho-zopflipng' into develop 2022-02-09 15:13:53 +01:00
Rodolfo Carvalho a1586280a9 Compress PNG images using zopflipng
Add a helper script and compress existing PNG images with zopflipng.

Before
552K    total

After
428K    total

Signed-off-by: Rodolfo Carvalho
2022-02-09 15:11:46 +01:00
Andrés Moya 00950b2c97 📚 Add new contributor change 2022-02-09 15:07:05 +01:00
Andrés Moya 79666bd51a Merge branch 'rhcarvalho-remove-dangling-png' into develop 2022-02-09 14:48:07 +01:00
Rodolfo Carvalho ca284a86a3 Remove dangling images
Clean up images that are no longer in use.

Removed in 50eb744c3b:
- frontend/resources/images/color-bar-library.png
- frontend/resources/images/color-bar-options.png

Removed in 0de4f9074d:
- frontend/resources/images/color-gamma.png

Removed in 196b4dd89b:
- frontend/resources/images/colorspecrum-400x300.png

Added in 35c172a06b but maybe never used:
- frontend/resources/images/favicon-preview.png

Removed in d93fa72e48:
- frontend/resources/images/pot.png
2022-02-09 13:55:19 +01:00
alonso.torres ee5b341d0e 🐛 Fix problem with gradient handlers 2022-02-09 13:04:16 +01:00
Alejandro 85cab5031d Merge pull request #1564 from penpot/fix/missing_translation
🐛 Fixed missing translation texts
2022-02-09 11:26:35 +01:00
Eva 2f7029516b 🐛 Fixed missing translation texts 2022-02-09 11:14:24 +01:00
Andrey Antukh a1da4d4233 ♻️ Refactor common.page.helpers namespace. 2022-02-08 15:30:13 +01:00
Andrey Antukh 24724e3340 📎 Add helpful require on user ns 2022-02-08 15:30:13 +01:00
Eva 048ab9a0fc 🐛 fix missing translace string 2022-02-08 15:17:40 +01:00
Eva 40b005f46e 🐛 fix color palette overflow 2022-02-08 15:11:06 +01:00
Alejandro ae2a99acb0 Merge pull request #1558 from penpot/fix/problem-svg-import
🐛 Fix problem with svg icons
2022-02-08 12:49:52 +01:00
alonso.torres a81b6db093 🐛 Fix problem with svg icons 2022-02-08 12:30:52 +01:00
alonso.torres 39b05f5f9f 🐛 Fix problem with selection rect 2022-02-08 12:11:56 +01:00
Andrey Antukh 979f61df99 Merge remote-tracking branch 'origin/main' into develop 2022-02-08 09:12:13 +01:00
Andrey Antukh e665f4e285 🐛 Log correct deleted number value on recheck task 2022-02-08 00:18:48 +01:00
Andrey Antukh 2c25dfcf1b 📎 Add exec perms to build script 2022-02-07 23:42:26 +01:00
Andrey Antukh 0632028579 📎 Set version to 1.11.1-beta 2022-02-07 23:26:21 +01:00
Andrey Antukh 95b9085258 Merge pull request #1555 from penpot/fix/thumbnails_firefox_problem
🐛 Fix Firefox problem when rendering frames
2022-02-07 18:03:33 +01:00
alonso.torres cdc91feb28 🐛 Fix Firefox problem when rendering frames 2022-02-07 17:48:51 +01:00
alonso.torres 4caf278da5 🐛 Fix problems with handoff layout 2022-02-07 16:34:31 +01:00
Andrey Antukh 809a3420c1 Merge pull request #1554 from penpot/feat/tablet-improvements
Tablet improvements
2022-02-07 15:42:55 +01:00
alonso.torres af8e9058a3 Move selection with space 2022-02-07 15:32:27 +01:00
alonso.torres 2b1c8cafe9 Improved color picker 2022-02-07 15:18:30 +01:00
alonso.torres 1abcd5819b Enter in dashboard to open files 2022-02-07 15:18:30 +01:00
alonso.torres 76b34bb600 Workspace interactions improvements 2022-02-07 15:18:30 +01:00
alonso.torres 67c6a042a0 Improved incremental selection 2022-02-07 15:18:30 +01:00
alonso.torres 72c2a213b4 Curve tool improvements 2022-02-07 15:18:30 +01:00
alonso.torres ec1cc8ec64 Adds new shortcut for zoom in 2022-02-07 15:18:30 +01:00
alonso.torres fbbb079599 ♻️ Remove rx/first calls and replaced by safer rx/take 1 2022-02-07 15:18:30 +01:00
Eva b8f2f3e34d Show recent fonts only on text edition area not in typographies 2022-02-07 15:06:05 +01:00
Alejandro 39b29ee3f0 Merge pull request #1552 from penpot/fix/shadow_type_text
🐛 Fix shadow type text in handoff section
2022-02-07 13:15:46 +01:00
Eva 5f6cb1e0d7 🐛 Fix shadow type text in handoff section 2022-02-07 13:04:52 +01:00
Andrey Antukh 46250e6fab ⬆️ Update nodejs version on docker images. 2022-02-07 11:40:53 +01:00
Alejandro Alonso fc2a26f249 🎉 Add border radius support to image shapes 2022-02-07 11:33:23 +01:00
Andrey Antukh 341caa3489 🎉 Add docker images auxiliar build script. 2022-02-07 11:21:54 +01:00
Eva 38b7474f0b Add a little improvent in recent fonts selector 2022-02-07 09:34:22 +01:00
Andrey Antukh c91e2d13c0 📎 Add temporal workaround on config.env file 2022-02-06 23:40:04 +01:00
Pablo Alba 7134bbf484 Disallow using same password as user email 2022-02-04 17:41:01 +01:00
Andrey Antukh 6b18b258a4 🐛 Set proper default http server host. 2022-02-04 16:02:51 +01:00
Eva 86e4826e48 Add configurable nudge amount 2022-02-04 15:15:48 +01:00
Andrey Antukh 6461ebe2b8 🔥 Remove unreachable code. 2022-02-04 15:04:47 +01:00
Andrey Antukh bfb23ad60b ⬆️ Update backend and frontend clojure deps 2022-02-04 15:04:47 +01:00
Andrey Antukh 637d6a0076 ⬆️ Update common module deps 2022-02-04 15:04:47 +01:00
Andrey Antukh cbb8d13570 ⬆️ Update frontend npm dependencies 2022-02-04 15:04:47 +01:00
Andrey Antukh 2a6ba79e9a Ignore EOF errors on writting streamed response 2022-02-04 15:04:47 +01:00
Andrey Antukh 1e0dacfe9b Add reusable helper for expound pretty printing 2022-02-04 15:04:47 +01:00
Andrey Antukh b194c0c5d8 Merge pull request #1534 from penpot/feat/toolbars-redesign
Toolbars Redesign
2022-02-04 09:26:22 +01:00
alonso.torres 9789b7081a Post-review changes 2022-02-03 18:27:12 +01:00
alonso.torres 03052ddd28 Fixed hover on sidebar 2022-02-03 18:27:12 +01:00
alonso.torres 779f685f72 Update strings for the new tabs 2022-02-03 18:27:12 +01:00
alonso.torres 1dee767762 Selection area on rules 2022-02-03 18:27:12 +01:00
alonso.torres 5cac5eb26b New text typographies palette 2022-02-03 18:27:12 +01:00
alonso.torres b26cbeccca Resizable color palette 2022-02-03 18:27:12 +01:00
alonso.torres 8d4612c683 🐛 Fix some problems with scroll into view for layers 2022-02-03 18:27:12 +01:00
alonso.torres e352c70013 Move layers and assets to tabs 2022-02-03 18:27:12 +01:00
alonso.torres 8c3c9a8ca4 Refactor workspace header 2022-02-03 18:27:12 +01:00
alonso.torres ada837f7e4 New rules styles, resize pages 2022-02-03 18:27:12 +01:00
alonso.torres 1599b2644a Resizeable panels 2022-02-03 18:27:12 +01:00
Alejandro Alonso acc3d00fd5 🎉 Add stroke properties to image shape 2022-02-03 17:23:26 +01:00
Alejandro Alonso 0f459ede50 🐛 Fix issue in viewport-scrollbars 2022-02-03 13:24:51 +01:00
Pablo Alba 105cb6fa13 Enhance the behaviour of the artboards list on view mode 2022-02-03 11:52:04 +01:00
Pablo Alba 1797c702a7 Automatically open comments from dashboard notifications 2022-02-03 11:38:30 +01:00
Pablo Alba 5f580f10ca On user settings, hide the theme selector as long as we only have one theme 2022-02-03 11:26:45 +01:00
Andrey Antukh bd359f42f5 📎 Add package-lock.json to .gitignore file 2022-02-02 19:17:51 +01:00
Andrey Antukh 34bf73210e 🔥 Remove package-lock.json file. 2022-02-02 19:14:12 +01:00
Andrey Antukh f1db4aae35 Merge branch 'main' into develop 2022-02-02 16:23:11 +01:00
Andrey Antukh 7710ffcbf1 🐛 Fix issue on 400 error handler. 2022-02-02 15:31:54 +01:00
Andrey Antukh e9f45a0d0a 🐛 Fix release modal. 2022-02-02 15:02:47 +01:00
Andrey Antukh 743c2c3385 Merge branch 'staging' 2022-02-02 14:29:30 +01:00
Andrey Antukh 6f714facf9 🐛 Fix many minor issues on telemetry task 2022-02-01 17:49:18 +01:00
Andrey Antukh 5f81c7bc2d Merge remote-tracking branch 'origin/staging' into develop 2022-02-01 16:14:52 +01:00
Pablo Alba 72b00fa9af On team settings set color of members count to black 2022-02-01 15:35:51 +01:00
Andrés Moya 449756a0e4 🐛 Fix ungroup a component leaves asterisk in layers 2022-02-01 15:32:50 +01:00
Andrey Antukh 75930a0ce9 📚 Minor changes on commit guidelines on CONTRIBUTING.md file 2022-02-01 14:25:50 +01:00
Eva a2c3b0926b Add recent used fonts in font selection widget 2022-02-01 14:11:54 +01:00
Andrey Antukh 57666e9173 Minor improvements on http reporting on 400 responses 2022-02-01 13:53:10 +01:00
alonso.torres 37f4b83d96 🐛 Fix problem with hover shapes 2022-02-01 13:09:51 +01:00
elhombretecla 5576b7568c 🎉 Add new content for release dialog. 2022-02-01 13:03:02 +01:00
Eva Marco 99e067b863 Merge pull request #1523 from penpot/test-e2e-enter-dashboard
👷 e2e tests for dashboard
2022-02-01 12:47:29 +01:00
Pablo Alba 5103624fe0 👷 e2e tests for dashboard
Including test for signing/singup, projects, files, teams, and misc
2022-02-01 11:50:33 +01:00
Andrey Antukh 26e5d57ced 🐛 Fix incorrect alias on shape-attrs spec on workspace. 2022-01-28 16:19:30 +01:00
Andrey Antukh b586f2552c Merge branch 'staging' into develop 2022-01-28 13:58:22 +01:00
Andrey Antukh 0fbcec667c 📎 Minor format change on changelog file. 2022-01-28 13:57:11 +01:00
Eva f40c58c64a 💄 Remove dots at the end of each line in changes file in actual sprint 2022-01-28 11:40:22 +01:00
Eva d66619fe6d 💄 Remove dots at the end of each line in changes file 2022-01-28 11:36:47 +01:00
Eva 5c1b007c1b Align item to it's parent 2022-01-28 10:54:31 +01:00
Pablo Alba 86c394f4ce Merge pull request #1514 from penpot/enhacement/add-profile-e2e-tests
👷 Add e2e test to profile area
2022-01-28 10:32:49 +01:00
Andrés Moya 90d130a3bc 📚 Remove unneeded section in changelog 2022-01-28 10:21:36 +01:00
Eva f185836fd4 👷 Add e2e test to profile area 2022-01-28 10:20:48 +01:00
Andrey Antukh 4c851856ff Emit warning when an error is raised on formating body. 2022-01-27 17:40:03 +01:00
Andrey Antukh bc2a0432b9 Allow connect to read-only databases. 2022-01-27 16:11:32 +01:00
Alejandro Alonso f72e140327 Graphic tablet use improvements: add scroll bars 2022-01-27 16:02:40 +01:00
Andrey Antukh a633ed3c9a More tweaks on the error reporter. 2022-01-27 15:17:44 +01:00
Andrey Antukh a8a6882708 💄 Minor changes on repl script. 2022-01-27 15:00:42 +01:00
Andrés Moya 1b76ed97e1 🐛 Fix rotation when set to 0 again 2022-01-27 14:57:26 +01:00
Andrey Antukh 04f7169aef ♻️ Refactor and modularize all specs. 2022-01-27 13:03:44 +01:00
Andrés Moya d83b362c9f 🐛 Fix "move to" menu when duplicated team or project names 2022-01-27 11:39:18 +01:00
Andrey Antukh b1d55348dc Merge remote-tracking branch 'origin/staging' into develop 2022-01-26 18:13:48 +01:00
Andrey Antukh f8a46c56e9 🎉 Add helper for offline validate files with specs. 2022-01-26 18:12:17 +01:00
Andrey Antukh 420525cdf0 🐛 Make the path command params optional. 2022-01-26 18:11:20 +01:00
Andrey Antukh 686cacd5ae Add truncate function to time ns on backend. 2022-01-26 18:10:47 +01:00
Andrey Antukh 0092806dda Prevent high cpu usage on reporting big errors. 2022-01-26 18:09:59 +01:00
Andrey Antukh 2f8c63505f 💄 Fix linter issues. 2022-01-26 14:45:22 +01:00
Andrey Antukh d892be4971 💄 Fix linter issues. 2022-01-26 14:44:01 +01:00
Andrey Antukh 59ed833abc Merge remote-tracking branch 'origin/staging' into develop 2022-01-26 14:24:34 +01:00
Andrey Antukh 110fb2e8db Minor improvements on error reporting.
Add missing expound.
2022-01-26 14:18:44 +01:00
Andrey Antukh 9f7a04e330 🐛 Fix unexpected exception on handling export data validation. 2022-01-26 14:08:54 +01:00
Andrey Antukh ccbc519c04 💄 Minor cosmetic changes on internal spec naming. 2022-01-26 12:59:26 +01:00
Eva 036860b91b 🐛 fix typo in zoom options 2022-01-26 12:59:02 +01:00
Eva 7ac2a55315 🐛 Fix header z-index in viewer mode fullscreen 2022-01-26 12:58:27 +01:00
Andrey Antukh f6cf8d2b1b 🐛 Relax text shape content spec validation.
Allow to be null in some circumstances.
2022-01-26 12:56:42 +01:00
Andrey Antukh 16788d7ab7 🐛 Make a path command params property nilable on spec. 2022-01-26 12:41:54 +01:00
Andrey Antukh 3142d48f3c 💄 Minor cosmetic change on changelog file. 2022-01-26 12:19:10 +01:00
Andrey Antukh e1a88ae899 Merge branch 'staging' into develop 2022-01-26 12:16:50 +01:00
Andrey Antukh a2e80cee47 📚 Update changelog file. 2022-01-26 12:09:27 +01:00
alonso.torres 5f14769abc 🐛 Fix problem with hover-ids 2022-01-26 11:49:01 +01:00
Eva 406c4063de Add select layer to contest menu 2022-01-26 11:49:01 +01:00
Andrey Antukh b4bc30e56f Improve shape specs and add missing specs for content. 2022-01-26 11:30:50 +01:00
Eva 3482d6c303 Add Update component in bulk option 2022-01-26 10:53:31 +01:00
Andrés Moya 9dfd5c0bcc 🐛 Avoid empty names in projects, files and pages 2022-01-26 09:31:55 +01:00
Eva b2b3de2782 🐛 fix typo in zoom options 2022-01-26 09:30:10 +01:00
Eva 50c20e2290 🐛 Fix header z-index in viewer mode fullscreen 2022-01-26 09:30:10 +01:00
Andrey Antukh a10dcbd918 Merge pull request #1508 from penpot/feat/guides
Guides
2022-01-25 14:58:36 +01:00
alonso.torres 6e0433a34b Review changes 2022-01-25 14:54:13 +01:00
alonso.torres 8833e19c7f 🐛 Small fixes for guides 2022-01-25 14:17:13 +01:00
alonso.torres 663358bdae 📚 Update changelog 2022-01-25 14:17:13 +01:00
alonso.torres d9b1c0e2e6 More tests for snap data 2022-01-25 14:17:13 +01:00
alonso.torres 39334b81ac Guides cursors 2022-01-25 14:17:13 +01:00
alonso.torres 62f7323acf Move frames with guides move the guides 2022-01-25 14:17:13 +01:00
alonso.torres 3f89baa1fe Move guides together with frames 2022-01-25 14:17:13 +01:00
alonso.torres f0fd1bb40c Add menu option for guides 2022-01-25 14:17:13 +01:00
alonso.torres f303d7b33e Add support to export/import guides 2022-01-25 14:17:13 +01:00
alonso.torres d356a3fa56 Spec definition for guides 2022-01-25 14:17:13 +01:00
alonso.torres 64e7cad292 ♻️ Redone the snap calculation and added guides 2022-01-25 14:17:13 +01:00
alonso.torres 0766938f98 Add guides UI 2022-01-25 14:17:13 +01:00
alonso.torres 918829ad0a Improve import with parallel media upload 2022-01-25 11:30:32 +01:00
Pablo Alba 540e1fc492 🐛 Fix missing entry of e2e fixtures on gitignore 2022-01-25 11:11:51 +01:00
alonso.torres ac30754a96 🐛 Fix problem with import 2022-01-25 10:28:04 +01:00
Andrey Antukh b470a0ebbf 🐛 Add missing dependency update (lost in some merge). 2022-01-24 22:22:43 +01:00
Andrey Antukh 69daee4137 Merge branch 'staging' into develop 2022-01-24 16:21:01 +01:00
Andrey Antukh 3d6c903273 Improve path rendering performance. 2022-01-24 16:14:28 +01:00
Andrey Antukh bc04a0b9f0 🐛 Fix incorrect behavior of trim-file-data. 2022-01-24 16:08:52 +01:00
Andrey Antukh bfef94dbfb Merge branch 'main' into staging. 2022-01-24 16:07:47 +01:00
Andrey Antukh 9e06275945 🐛 Prevent exception on broken path. 2022-01-24 15:41:44 +01:00
Andrey Antukh 6410bcf3c8 Minor change on debug endpoint. 2022-01-24 15:13:02 +01:00
Andrés Moya 20baf02726 🐛 Normalize zoom levels in workspace and viewer 2022-01-24 13:30:11 +01:00
Andrey Antukh 8f6fdf361b Improve path rendering performance. 2022-01-24 13:23:09 +01:00
Andrey Antukh ffa134f824 🐛 Fix incorrect behavior of trim-file-data. 2022-01-24 13:23:09 +01:00
Andrés Moya b4bf6b9235 🐛 Fix zoom in/out after fit or fill in viewer 2022-01-24 11:04:01 +01:00
Andrés Moya c3e37b0e04 🐛 Fix auto hide header in viewer full screen 2022-01-24 11:04:01 +01:00
Andrés Moya 374bba763b 🐛 Fix edit blur attributes for multiselection 2022-01-24 11:04:01 +01:00
Pablo Alba 2d00e68b78 👷 Tests e2e for drawing basic forms 2022-01-24 10:56:56 +01:00
Andrey Antukh 9a965dc693 Merge remote-tracking branch 'origin/staging' into develop 2022-01-21 14:54:32 +01:00
Andrey Antukh b96ad5b37f 💄 Minor cosmetic change on get-parents fn. 2022-01-21 14:47:13 +01:00
Andrey Antukh 07a0f67b32 💄 Minor cosmetic change on reg-object. 2022-01-21 14:47:13 +01:00
Andrey Antukh c754a757eb Upgrade rumext and add some examples of syntax sugar. 2022-01-21 14:47:13 +01:00
Andrey Antukh dcd53183a8 📎 Simplify distribute-objects fn impl. 2022-01-21 14:47:13 +01:00
Andrés Moya 5641132eb9 Reload viewer and reset starting frame from workspace 2022-01-21 14:42:11 +01:00
Andrés Moya b4c23f3554 🐛 Display animations only for allowed actions 2022-01-21 14:41:21 +01:00
Andrés Moya 7385445aa8 💄 Format translation files and remove unneeded script 2022-01-21 14:40:37 +01:00
Eva 5409f83167 Divide file menu options in semantically groups 2022-01-21 12:36:09 +01:00
Voxybuns 43951aad69 🌐 Add translations for: French.
Currently translated at 79.9% (694 of 868 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-01-20 21:55:48 +01:00
Rubén 9681d8c805 🌐 Add translations for: Catalan.
Currently translated at 98.8% (858 of 868 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-01-20 21:55:48 +01:00
Andrey Antukh ff4d3cfeac 🐛 Fix issue on fressian blob encoding. 2022-01-20 16:57:20 +01:00
Andrey Antukh 8e4338c1c9 🐛 Minor fix on version parsing impl. 2022-01-20 14:47:28 +01:00
Andrey Antukh c27d709b6b Merge remote-tracking branch 'origin/staging' into develop 2022-01-20 14:30:16 +01:00
Andrey Antukh 8caa289586 Fix version logging on exporter. 2022-01-20 14:27:03 +01:00
Andrey Antukh f7568f6348 Minor improvements on exporter. 2022-01-20 14:16:58 +01:00
Pablo Alba 6a6f079a84 👷 Create firsts e2e tests 2022-01-20 14:10:48 +01:00
Andrey Antukh 0f04b86316 Improve performance on import .penpot files. 2022-01-20 11:47:17 +01:00
Andrey Antukh 1dae8a0771 📎 Minor improvement on error logging on worker. 2022-01-20 11:47:17 +01:00
Andrey Antukh 9bc816fc1c 🐛 Remove duplicate audit action reporting. 2022-01-20 11:47:17 +01:00
Andrey Antukh 11ea4c7aec 🐛 Fix raw logging on cljs. 2022-01-20 11:47:17 +01:00
Andrey Antukh 0c53aa158b 🐛 Fix profile image generation issue. 2022-01-20 11:47:17 +01:00
Andrey Antukh 072e4a4f98 Revert some memoizes on page/helpers.
And improves base performance of get-children and
remove duplicated code. Also optimize the use
of get-children on react components with corresponding
use-memo hook.
2022-01-20 11:47:17 +01:00
Andrey Antukh 1b3b3b0ee6 Minor naming change on page query parameters. 2022-01-20 11:47:17 +01:00
Andrey Antukh d1e4f0de3e Improve performance and resolve render issues on exporter. 2022-01-20 11:47:17 +01:00
Andrey Antukh fd3f304e07 📎 Increase default devenv jvm heapsize. 2022-01-20 11:47:17 +01:00
alonso.torres 9e7551551f 🐛 Fix problem with SVG's import/export 2022-01-19 16:07:44 +01:00
Andrés Moya 36bb5cbe01 🐛 Fix several questions about frame background export 2022-01-19 11:01:23 +01:00
Alejandro Alonso f754c12e8c Limit pasted object position to container boundaries 2022-01-18 17:07:46 +01:00
Andrey Antukh 6f5916e334 ♻️ Minor reorganization on export & render namespaces. 2022-01-18 16:48:17 +01:00
Andrés Moya 13dd1cb6b6 🐛 Disable embed images in export 2022-01-18 16:48:17 +01:00
Andrey Antukh eb4e7e0f0c 🐛 Fix dashboard grid thumbnails cache invalidation. 2022-01-18 16:48:17 +01:00
Andrey Antukh 7afb3e2c6d Stream transit encoding to the response output-stream.
Instead of in-memmory encoding. This will prevent many OOM errors.
2022-01-18 16:48:17 +01:00
Andrey Antukh 9cf5258053 Improve logging on worker and import process. 2022-01-18 16:48:17 +01:00
Andrey Antukh 56dfdaecb7 💄 Add cosmetic improvements on project_menu component. 2022-01-18 16:48:17 +01:00
Andrey Antukh 1d174a4379 🐛 Fix unexpected exception on time equiv impl. 2022-01-18 16:48:17 +01:00
Andrés Moya 2aeded1940 🐛 Show view mode buttons correctly centered in viewer 2022-01-18 13:26:09 +01:00
Andrés Moya c23691284c 🐛 Show correctly group types label in handoff 2022-01-18 13:26:09 +01:00
Andrey Antukh f7f6515561 ⬆️ Update exporter dependencies. 2022-01-18 11:25:06 +01:00
Andrey Antukh 438c14d29d ⬆️ Update exporter dependencies. 2022-01-18 10:58:45 +01:00
Andrés Moya 87351000ae 🐛 Avoid marking component as touched when moving into a group 2022-01-18 09:39:02 +01:00
Pablo Alba 0895a69bac Add an option to hide artboards names on the viewport 2022-01-18 09:38:03 +01:00
Eva 4285972e41 Add new zoom options in workspace and viewer mode 2022-01-17 17:18:12 +01:00
Pablo Alba d33542c4dc Allow decimals on stroke width and positions 2022-01-17 15:52:32 +01:00
Andrey Antukh bda97adf4f Fix minor issues on error reporting. 2022-01-17 13:09:15 +01:00
Andrey Antukh b6f460940f ⬆️ Update dependencies. 2022-01-17 13:09:15 +01:00
Alejandro Alonso aa0e8ed8d6 Pressing enter to exit the fields 2022-01-17 10:00:28 +01:00
Yaron Shahrabani b99fa16b96 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (868 of 868 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-01-15 17:53:28 +01:00
Oğuz Ersen 630d7a3220 🌐 Add translations for: Turkish.
Currently translated at 99.7% (866 of 868 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-01-15 17:53:27 +01:00
Andrey Antukh 03c91664cb 🐛 Fix session invalidation issue on password change. 2022-01-14 13:44:58 +01:00
Andrey Antukh 13773d829a Merge pull request #1473 from penpot/alotor/bugfixes_fixes
Bugfixes
2022-01-14 13:33:23 +01:00
Alejandro Alonso d9e6e9b017 Ability to ignore background when exporting an artboard 2022-01-14 13:31:28 +01:00
alonso.torres 5d8982c734 🐛 Fix transform text 2022-01-14 12:10:55 +01:00
alonso.torres f13c82da2a 🐛 Fix tab to apply changes in inputs 2022-01-14 11:58:56 +01:00
alonso.torres 363b0ba997 🐛 Fix problems with gradient and libraries 2022-01-14 11:57:07 +01:00
Alejandro Alonso a4c45942c9 Fixing show color hex or name on hover 2022-01-14 11:57:07 +01:00
Andrey Antukh a86e3a8636 📎 Sort translation files. 2022-01-14 11:32:43 +01:00
Andrey Antukh db61d579e6 Merge remote-tracking branch 'weblate/develop' into translations 2022-01-14 11:30:25 +01:00
Andrey Antukh e6e3f2cbd5 Add debugging pages for download/upload file data. 2022-01-14 10:54:57 +01:00
Andrey Antukh ffdd539233 Minor improvements on error reporting mechanism. 2022-01-14 10:54:57 +01:00
Andrey Antukh ef17af38a1 🎉 Add jvm-repl script to frontend directory. 2022-01-14 10:54:57 +01:00
Andrey Antukh 6dedfaea2f 📎 Minor changes on :reg-objects impl. 2022-01-14 10:54:57 +01:00
Andrey Antukh cbb3783d84 📎 Add performance related helpers. 2022-01-14 10:54:57 +01:00
Eva 327c095d79 add V as shortcut to exit path editor 2022-01-13 22:39:05 +01:00
Andrey Antukh 88e222420c Merge pull request #1470 from penpot/alotor/bugfixes
Bugfixes
2022-01-13 18:33:32 +01:00
alonso.torres 045eec072b 🐛 Fix import/export with SVG edge cases 2022-01-13 18:28:47 +01:00
alonso.torres 5f3c381f88 🐛 Fix thumbnail not taking frame blending mode 2022-01-13 15:56:01 +01:00
alonso.torres 6090cf6c68 🐛 Fix problem with imported svgs with filters 2022-01-13 15:15:55 +01:00
alonso.torres 9ac4239c11 🐛 Restored rules color 2022-01-13 10:09:03 +01:00
alonso.torres da2a3b6883 🐛 Fix handoff text with opacity 2022-01-13 09:56:46 +01:00
alonso.torres b4accaad07 🐛 Fix scroll jumps in handoff mode 2022-01-13 09:56:46 +01:00
alonso.torres edaef0096a 🐛 Improved copy for import/export files 2022-01-13 09:56:46 +01:00
alonso.torres afba5ff083 🐛 Fix issues when updating selrect in paths 2022-01-13 09:56:46 +01:00
alonso.torres 8b8d614150 🐛 Fixed problem with stroke 2022-01-13 09:30:21 +01:00
Alejandro Alonso 090dbfda10 Upload/dismiss all custom fonts at once 2022-01-12 20:00:24 +01:00
Alejandro Alonso 04f5a6a9f9 Show color hex or name on hover 2022-01-12 18:20:31 +01:00
Andrey Antukh d8311ac3fa Merge pull request #1462 from penpot/adding-prettier-to-ci
 Adding prettier to ci
2022-01-12 14:25:50 +01:00
Andrey Antukh 9c7f4dfd98 Merge pull request #1452 from penpot/bugfixes
Bugfixes
2022-01-12 14:24:24 +01:00
alonso.torres 8da66e1599 🐛 Fix problem when importing a file with grids 2022-01-12 13:47:50 +01:00
alonso.torres 2927b0cfc6 🐛 Fix default page id in workspace 2022-01-12 13:30:52 +01:00
alonso.torres 4663c296cd 🐛 Fix blur input field when click on viewport 2022-01-12 13:30:52 +01:00
alonso.torres 9403f8fd6e 🐛 Fix lossing changes when changing selection and an input was already changed 2022-01-12 13:13:28 +01:00
alonso.torres badb5c6a9b 🐛 Fix keep name of component equal to the shape name 2022-01-12 13:13:27 +01:00
alonso.torres e5430259e9 🐛 Changing pages while comments activated will not close the panel 2022-01-12 13:12:54 +01:00
alonso.torres 50fd44d3f2 🐛 Fix division by zero in bool operation 2022-01-12 13:12:16 +01:00
Andrés Moya a8249b73b6 🐛 Fix nav to comments in a different page 2022-01-12 13:09:11 +01:00
Andrey Antukh a15f867059 🐛 Fix open in new tab action on dashboard. 2022-01-12 13:00:50 +01:00
Andrey Antukh 4216e2e92b Properly set host on http server. 2022-01-12 12:42:11 +01:00
Alejandro Alonso 8ef20be9bd Adding prettier to ci 2022-01-12 12:32:06 +01:00
Alejandro Alonso 6413c9dddd Apply prettier to resources styles 2022-01-12 11:49:03 +01:00
Andrey Antukh eb10f075b9 📎 Add some excludes to uber task. 2022-01-12 11:21:25 +01:00
Andrey Antukh cd55ed7c8d 📎 Minor improvement on css on error report template. 2022-01-12 10:55:47 +01:00
Andrey Antukh 2fb96a1b7d 📎 Add debug to ws messages. 2022-01-12 10:55:47 +01:00
Andrey Antukh c48da3d316 ♻️ Refactor backend bundle build process.
Now the final artifact is a single, compiled uberjar.
It considerably improves startup speed.
2022-01-12 10:55:47 +01:00
Andrey Antukh 9488a9a1ad Increase default upload size on docker imates. 2022-01-12 10:55:47 +01:00
Andrey Antukh 2feb22d3bd 🐛 Fix unexpected default cookies behavior on redirectiong to penpot.
The SameSite=Strict on chrome behaves differently than in Firefox and
makes the top-level url redirect not sending cookies if the user is
redirected from other page to penpot. The SameSite=Lax fixes the issue.
2022-01-12 10:55:47 +01:00
Andrey Antukh f74569506e ⬆️ Update devenv dockerfile. 2022-01-12 10:55:47 +01:00
Andrés Moya 6633d0b4fb Right click on frame title to open its menu 2022-01-11 16:02:50 +01:00
Andrey Antukh 6fb35b40d7 Merge pull request #1445 from penpot/add-artboard-selection
 Add artboard selection
2022-01-11 16:02:12 +01:00
Alejandro Alonso 614d699098 Add artboard selection 2022-01-11 14:03:07 +01:00
Andrés Moya 8f4fbff40f 💄 Set consistent Login label 2022-01-10 16:58:15 +01:00
Andrés Moya aaf8d2a233 🐛 Correct animations overflow 2022-01-10 16:02:36 +01:00
Andrey Antukh 0eb2336bc6 Merge pull request #1449 from penpot/bugfixes
Bugfixes
2022-01-10 15:36:59 +01:00
Andrey Antukh f9cc9164b3 Merge pull request #1450 from penpot/fix-interactions-header
🐛 Fix viewer header controls when navigating from workspace
2022-01-10 15:31:28 +01:00
Andrés Moya 238ec60f89 🐛 Fix viewer header controls when navigating from workspace 2022-01-10 14:10:29 +01:00
alonso.torres 363a82d068 🐛 Fix decimal numbers in export viewbox 2022-01-10 13:32:29 +01:00
alonso.torres 4360c1fe4b 🐛 Improved behaviour on text options when not text is selected 2022-01-10 13:32:29 +01:00
alonso.torres 1d575ece06 🐛 Allow import to continue from recoverable failures 2022-01-10 13:32:29 +01:00
alonso.torres d246788a35 🐛 Fix default state in viewer 2022-01-10 13:32:29 +01:00
alonso.torres e9fa04dd1b 🐛 Fix problem with styles in the viewer 2022-01-10 13:32:29 +01:00
alonso.torres 8e57932966 🐛 Fix problem with multiple exports 2022-01-10 13:32:29 +01:00
alonso.torres 51ea354bcb 🐛 Fix problem when resizing texts inside groups 2022-01-10 13:32:29 +01:00
alonso.torres 6334520c66 🐛 Fix dotted style in strokes 2022-01-10 13:32:29 +01:00
alonso.torres 6354883a6f 🐛 Fix line-height/letter-spacing inputs behaviour 2022-01-10 13:32:29 +01:00
alonso.torres 477f553675 🐛 Fix problem with booleans 2022-01-10 13:32:29 +01:00
Eva 1ded4b2b28 🐛 Remove gradient if any when applyin solid color from library 2022-01-10 12:33:21 +01:00
eva 16c4116c15 🐛 fix enter key as a way to exit path editing mode 2022-01-07 15:51:50 +01:00
eva f5cfbce1c2 🐛 Fix add fill and stroke color from palette to groups and components 2022-01-07 15:51:50 +01:00
eva 7bbf98dfb1 🐛 Fix default project name in dashboard Move to option 2022-01-07 15:51:50 +01:00
eva 533cac7881 🐛 Fix text inputs to allow negative values 2022-01-07 15:51:50 +01:00
eva 6afc734e91 🐛 Fix typo in handoff tooltip 2022-01-07 15:51:50 +01:00
eva c4fb826d89 🐛 Fix crash when pressing Shift 1 in an empty file 2022-01-07 15:51:50 +01:00
Alejandro Alonso 1321bdeac5 Add opacity shortcuts 2022-01-07 11:31:21 +01:00
Alejandro Alonso e0b7001a09 🐛 Fix default color fill for textx 2022-01-05 11:19:25 +01:00
eva 88120b83bd change reference to issue 2022-01-03 17:29:51 +01:00
eva a952f7369c Add move shortcut 2022-01-03 17:16:03 +01:00
eva d4fab3b46c Add alt as mod-key to add stroke color to a shape from color in menu library 2022-01-03 16:39:40 +01:00
eva 06b3499e7d Add detach components in bulk option 2022-01-03 13:43:11 +01:00
Eva Marco fdd66bd513 Merge pull request #1430 from penpot/bugfixes
Bugfixes
2022-01-03 10:46:22 +01:00
alonso.torres 3b5aaf21fa 🐛 Fix problem when resizing texts 2022-01-03 10:00:17 +01:00
eva 59c46833ed Add penpot look and feel to multiuser pointers 2022-01-03 09:35:46 +01:00
alonso.torres aee35cb456 🐛 Fix lock/hide elements in context menu when multiples shapes selected 2022-01-03 09:14:58 +01:00
alonso.torres 4a55ee2965 🐛 Fix problem exporting shapes from handoff mode 2022-01-03 09:14:58 +01:00
alonso.torres 4b490e3ca4 🐛 After team onboarding importing a file will import into the team drafts 2022-01-03 09:14:58 +01:00
alonso.torres 6727717d1a 🐛 Fix problem with join nodes 2022-01-03 09:14:58 +01:00
alonso.torres d08891cffa 🐛 Disable running frontend tests in node 2022-01-03 09:10:18 +01:00
Andrey Antukh 799a83ba73 🔥 Remove unused import. 2021-12-31 13:47:49 +01:00
Andrey Antukh 261724e555 📎 Fix common tests. 2021-12-31 13:46:13 +01:00
Andrey Antukh 10e7d660ef Merge branch 'main' into develop 2021-12-31 13:23:42 +01:00
Andrey Antukh bdfea7cda5 📎 Update version.txt file. 2021-12-31 13:04:15 +01:00
Andrey Antukh fdb1c5e1f9 📎 Minor changes on error report http handler. 2021-12-31 12:24:46 +01:00
alonso.torres 71734df489 Backport changes from develop. 2021-12-31 12:06:15 +01:00
Andrey Antukh 071b81eadd ⬆️ Update dependencies. 2021-12-31 00:21:38 +01:00
Andrey Antukh 2abe3fde71 Remove unused stacktrace from commit-chages event. 2021-12-31 00:02:19 +01:00
Andrey Antukh 27e64ccaa8 🔥 Remove unused code. 2021-12-30 23:53:33 +01:00
Andrey Antukh c9185f265c Add error report list template. 2021-12-30 23:51:39 +01:00
Andrey Antukh 79e5716f36 📎 Fix linter issues. 2021-12-30 19:43:05 +01:00
Andrey Antukh 9f0e156916 Improve error reporting. 2021-12-30 19:39:32 +01:00
Andrey Antukh d24d45f4cb Terminate connection if incoming message cant be parsed. 2021-12-30 16:28:08 +01:00
Andrey Antukh bf55250ae9 :sparkles Minor changes on websockets error handling. 2021-12-30 16:25:50 +01:00
Andrey Antukh 36016ad9ef Store changes on file_change table as vector. 2021-12-30 16:02:06 +01:00
Andrey Antukh bf66b81702 Move dbg error http entrypoint handler to debug ns. 2021-12-30 16:01:36 +01:00
Andrey Antukh 758ffbf217 Add authentication to dbg entry points. 2021-12-30 16:00:55 +01:00
Andrey Antukh f24563503a Parametrice file change snapshoting. 2021-12-30 13:03:49 +01:00
alonso.torres a2dbc40571 🐛 Fixes problem with mov-objects 2021-12-30 13:03:49 +01:00
Andrey Antukh a096b0777f 📎 Minor changes on debug ns. 2021-12-30 13:03:28 +01:00
Andrey Antukh 87690a534c 🎉 Add missing files. 2021-12-30 11:45:44 +01:00
Andrey Antukh a70e416b0b Add more debug handlers. 2021-12-30 11:37:09 +01:00
alonso.torres cd1170c543 Add a debug option to apply changes 2021-12-30 11:19:46 +01:00
Andrey Antukh 2962dc1faa Merge pull request #1429 from penpot/cache-thumbnails-v2
 Cache thumbnails with browser cache
2021-12-29 13:03:40 +01:00
alonso.torres 535c1fd007 Cache thumbnails with browser cache 2021-12-29 12:59:17 +01:00
Andrey Antukh 2bd94aff0e 🐛 Fix wring metrics usage on websocket module. 2021-12-29 12:55:41 +01:00
Andrey Antukh 9ea90c3400 🐛 Fix unexpected exception on websockets. 2021-12-29 12:16:48 +01:00
alonso.torres 0ac5d85117 🐛 Rollback thumbnail cache 2021-12-29 11:40:37 +01:00
Andrey Antukh d3a83142ae Merge pull request #1428 from penpot/performance
 Improved thumbnails handling
2021-12-29 11:33:39 +01:00
alonso.torres d5886123d8 Improved thumbnails handling 2021-12-29 11:21:57 +01:00
Andrey Antukh dea090e7d3 📚 Update version.txt file. 2021-12-29 11:17:55 +01:00
Andrey Antukh ba5e345677 Merge branch 'staging' 2021-12-29 11:17:06 +01:00
Andrey Antukh 13ae7b0976 📚 Update changelog. 2021-12-29 11:16:04 +01:00
Andrey Antukh 39c7bfb49f ⬆️ Finally update the prometheus client dependency. 2021-12-29 09:52:32 +01:00
Andrey Antukh 8479a6581d Make matrix use native doubles.
Increases 300x the performance of multiply on the JVM platform.
2021-12-29 09:52:32 +01:00
Andrey Antukh e5885e83eb Add missing type hints on Matrix multiply function. 2021-12-29 09:52:32 +01:00
Andrey Antukh 914b41fcd4 🐛 Properly handle missing log/error id on database logger. 2021-12-29 09:52:32 +01:00
Andrey Antukh 224aa5b89a 🐛 Properly handle errors on body parsing middleware. 2021-12-29 09:52:32 +01:00
Andrey Antukh 01c89f6554 🐛 Set proper return value on validation error handler. 2021-12-29 09:52:32 +01:00
Andrey Antukh f0e1bc1d59 🔥 Remove unused code. 2021-12-29 09:52:32 +01:00
Andrey Antukh 7b487e1bc3 📎 Fix unrelated linter issues. 2021-12-29 09:52:32 +01:00
Andrey Antukh c394495a26 ♻️ Refactor websocket layer.
This commit replaces rj9a with funcool/yetti ring adapter.
Cleans the websocket api and makes it fully asynchronous.
Also a common websocket protocol abstraction that will allow
more easy path for creating new websocket based services.
2021-12-29 09:52:32 +01:00
eva 6dae420254 Add open components, and scroll into view to show main component acction 2021-12-28 16:19:07 +01:00
Andrey Antukh c69d7f50a3 Merge remote-tracking branch 'origin/staging' into develop 2021-12-28 13:48:16 +01:00
elhombretecla e9c654f30d Minor enhacements on onboarding modal. 2021-12-28 11:34:21 +01:00
Andrey Antukh ae9b95f81b Merge pull request #1424 from penpot/performance
Performance improvements
2021-12-28 11:32:55 +01:00
Andrey Antukh c240b69b5a 📎 Minor changes on error report template. 2021-12-28 11:19:38 +01:00
alonso.torres 493a7680e0 Improve interactions and after-review fixes 2021-12-28 11:12:33 +01:00
alonso.torres c28a2acfc7 🐛 Fixes tests 2021-12-28 09:18:33 +01:00
alonso.torres 60af960f42 Thumbnail cache on dashboard 2021-12-28 09:18:33 +01:00
alonso.torres 4c86d5cfe3 🐛 Fixes some issues with bool shapes 2021-12-28 09:18:33 +01:00
alonso.torres 99a6142134 Improves boolean performance 2021-12-28 09:18:33 +01:00
alonso.torres b2211aec59 Change resize to use DOM transformations 2021-12-28 09:18:33 +01:00
alonso.torres fa09fff2b5 Performance improvements 2021-12-28 09:18:33 +01:00
Andrey Antukh 0204cdab83 🐛 Revert rj9a dep update. 2021-12-28 09:15:31 +01:00
Andrey Antukh 445195e9eb ⬆️ Update dependencies. 2021-12-27 11:55:42 +01:00
Andrey Antukh 7f5b0f359c Merge remote-tracking branch 'origin/staging' into develop 2021-12-27 11:42:44 +01:00
Andrey Antukh d8f4176487 📎 Minor fixes on versions. 2021-12-27 11:41:13 +01:00
Andrey Antukh 220ab22115 🐛 Fix error reporting hook. 2021-12-27 11:30:22 +01:00
Andrey Antukh 67776c46d6 🐛 Fix NPE on email complains checking. 2021-12-27 11:13:08 +01:00
Andrey Antukh 2d118ecc65 Merge remote-tracking branch 'origin/staging' into develop 2021-12-27 09:50:15 +01:00
Andrey Antukh 4bc2d7444d 📎 Minor changes on dev tools. 2021-12-27 09:32:20 +01:00
Andrey Antukh 5c6d72b353 Improve logging performance and format. 2021-12-24 12:40:44 +01:00
Andrey Antukh 1839397ebc Minor enhacements on log processing. 2021-12-23 18:36:58 +01:00
Andrey Antukh 0ee34637f5 💄 Improve json namespace API (and fix linter). 2021-12-23 00:06:10 +01:00
Andrey Antukh c6054f7ab2 💄 Improve json namespace API (and fix linter). 2021-12-23 00:04:37 +01:00
Andrey Antukh 9554dfbc5e :lisptick: Cosmetic changes. 2021-12-22 19:04:32 +01:00
Andrey Antukh 98d5789b1b :lisptick: Cosmetic changes. 2021-12-22 19:04:03 +01:00
Andrey Antukh 0cad1a1e7e Merge remote-tracking branch 'origin/staging' into develop 2021-12-22 18:49:46 +01:00
Andrey Antukh 31c07274cd 📎 Increase default session expiration to 15 days. 2021-12-22 18:44:49 +01:00
Andrey Antukh 37a736339e 🔥 Remove ALPHA and BETA batges. 2021-12-22 18:41:06 +01:00
Andrey Antukh 869abcc835 🐛 Fix incorrect grid calculation when size is 1. 2021-12-22 18:38:22 +01:00
Andrey Antukh a6f05ea8c2 💄 Minor syntax cosmetic changes. 2021-12-22 18:37:29 +01:00
Andrey Antukh 6812099900 Simplify frames selection mechanism. 2021-12-22 18:37:08 +01:00
Andrey Antukh 53e6d7ef2a 🐛 Fix numeric-input component. 2021-12-22 17:06:59 +01:00
Andrey Antukh c2f604cd01 Properly use take-until on shape movement streams. 2021-12-22 17:06:16 +01:00
Andrey Antukh 888ffa1bcd Merge remote-tracking branch 'origin/staging' into develop 2021-12-22 16:10:24 +01:00
Andrey Antukh d06cfed50e 🐛 Add missing import. 2021-12-22 15:01:46 +01:00
Andrey Antukh e06d063946 📎 Remove ALPHA label from feedback button. 2021-12-22 14:59:39 +01:00
Andrey Antukh 634ec1b113 Ensure valid messages on zmq listener. 2021-12-22 14:28:09 +01:00
Andrey Antukh 0bf883d5b2 📎 More updates to logging deps. 2021-12-22 14:09:23 +01:00
Andrey Antukh c6d0e0124f ⬆️ Update log4j2 dependency to 2.17.0 2021-12-22 11:34:07 +01:00
Andrey Antukh ce115c53e2 📎 Minor fixes on repl script. 2021-12-22 11:33:53 +01:00
Andrey Antukh 7014bc7a3c 🐛 Fix issue when typography name is empty. 2021-12-22 11:03:11 +01:00
Andrey Antukh 219f9c478d 🎉 Add version 4 of blob encoding.
The version 4 starts using the hight performance fressian
binary encoding with very lightweight compression layer.
2021-12-21 16:19:25 +01:00
Andrey Antukh a9904c6ada Merge pull request #1386 from penpot/animations
Animations
2021-12-21 15:47:51 +01:00
Andrés Moya 81cbc33dbb 🎉 Add animations to interactions 2021-12-21 15:46:52 +01:00
eva 24062beebe 🐛 fix minor errors 2021-12-20 16:18:33 +01:00
eva f3548aff8c Add shortcuts to viewer btns 2021-12-20 16:18:33 +01:00
eva 771bb20976 Add shortcuts for dashboard viewer and path 2021-12-20 16:18:33 +01:00
eva 8072caeff1 Add more workspace shortcuts 2021-12-20 16:18:33 +01:00
eva d5568fcc25 Add alignement shortcuts 2021-12-20 16:18:33 +01:00
Andrey Antukh eb1bcfba83 🎉 Backport questions form integration.
Among other related that need to be ported.
2021-12-20 16:16:29 +01:00
Andrey Antukh a2d3616171 📎 Update changelog. 2021-12-20 11:55:32 +01:00
Andrey Antukh a83e37493a ⬆️ Update log4j2 dependency. 2021-12-20 11:52:32 +01:00
Andrey Antukh 0feccc9d1c ⬆️ Update log4j2 dependency. 2021-12-20 11:49:30 +01:00
Andrey Antukh e18ecb8c49 ⬆️ Update devenv (deps). 2021-12-20 11:16:26 +01:00
Andrés Moya f5b87a9865 📚 Add docs contributor 2021-12-19 17:56:37 +01:00
Andy Li 3b93434dd3 🌐 Add translations for: Chinese (Traditional).
Currently translated at 33.5% (283 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-12-18 02:51:35 +01:00
Muhammad Insan Al-Amin d522096caf 🌐 Add translations for: Indonesian.
Currently translated at 7.3% (62 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2021-12-18 02:51:35 +01:00
Andrey Antukh 6c67110dde 🐛 Fix middleware order that prevents multipart requests. 2021-12-10 15:06:42 +01:00
Andrey Antukh 963efc369b Merge branch 'main' into develop 2021-12-10 14:45:02 +01:00
Andrey Antukh 384f0a05c6 🐛 Fix race condition issues on workspace. 2021-12-10 12:32:10 +01:00
Andrey Antukh a3016b8400 Make the media uploading idempotent. 2021-12-10 12:19:12 +01:00
Andrey Antukh 0df219c3ad 📎 Fix frontend tests. 2021-12-10 12:00:29 +01:00
Andrey Antukh a0d527f795 📎 Add some minor changes to package.json scripts section. 2021-12-10 12:00:29 +01:00
Andrey Antukh e44ea47497 🐛 Fix issue when typography name is empty. 2021-12-10 12:00:29 +01:00
Andrey Antukh 9ee5a3159c 💄 Add cosmetic changes on ungroup event. 2021-12-10 12:00:29 +01:00
Andrey Antukh 06d41c552b Simplify debuging information used on commit-changes. 2021-12-10 12:00:29 +01:00
Andrey Antukh 7874971550 🐛 Fix race condition issues on workspace. 2021-12-10 12:00:29 +01:00
Andrey Antukh 9925716134 💄 Add syntax improvements on libraries helpers. 2021-12-10 12:00:29 +01:00
Andrey Antukh 64c456678b Merge pull request #1401 from penpot/fix-destination
🐛 Fix error importing file with null destination in one interaction
2021-12-10 11:21:27 +01:00
Andrés Moya 16ed09a303 🐛 Fix error importing file with null destination in one interaction 2021-12-10 10:50:18 +01:00
Andy Li 1359a1aa7a 🌐 Add translations for: Chinese (Traditional).
Currently translated at 31.4% (265 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-12-10 09:52:18 +01:00
Andy Li 6ae36982b6 🌐 Add translations for: Chinese (Traditional).
Currently translated at 30.6% (258 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-12-09 05:50:27 +01:00
Maemolee 136d269605 🌐 Add translations for: Chinese (Simplified).
Currently translated at 80.6% (680 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2021-12-09 05:50:27 +01:00
Rubén 932c0ed4ad 🌐 Add translations for: Spanish.
Currently translated at 98.5% (831 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2021-12-09 05:50:26 +01:00
Andy Li 371875440f 🌐 Add translations for: Chinese (Traditional).
Currently translated at 25.7% (217 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-12-07 09:12:57 +01:00
Rubén b01a9f2f95 🌐 Add translations for: Catalan.
Currently translated at 99.6% (840 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2021-12-06 12:26:52 +01:00
李安峻 0d2def102f 🌐 Add translations for: Chinese (Traditional).
Currently translated at 23.4% (198 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-12-04 03:52:36 +01:00
Andrey Antukh beff3fe843 📎 Fix common tests. 2021-12-03 16:00:56 +01:00
Andrey Antukh 7a97c94f2b Merge branch 'main' into develop 2021-12-03 15:53:20 +01:00
Andrey Antukh ce81908f02 📎 Minor changes on devenv. 2021-12-03 15:05:36 +01:00
Andrey Antukh f8cecfd61f 🐛 Fix unexpected behavior of grid options on right sidebar. 2021-12-03 14:52:40 +01:00
Andrey Antukh 8a2a1d6d70 ♻️ Ensure a correct usage of concat/into operations. 2021-12-03 14:52:40 +01:00
Andrey Antukh 76dafea8a6 Add the abilty to enable verbose output using query param (api). 2021-12-03 11:13:08 +01:00
Andrey Antukh 86bbfde19e 📎 More fixes on ci config. 2021-12-03 11:09:01 +01:00
Andrey Antukh 71d6f7b1a2 📎 Fix linter issues. 2021-12-03 09:43:02 +01:00
Andrey Antukh 0c0ab612c0 📎 Minor fixes to previous commits. 2021-12-03 09:36:39 +01:00
Andrey Antukh 73042115e0 🎉 Add benchmark helper function (cljs only). 2021-12-03 09:30:33 +01:00
Andrey Antukh 0f7166d34a 📎 More fixes on CI. 2021-12-02 18:20:45 +01:00
Andrey Antukh f35f2c95f0 📎 Fix issues with jvm on CI. 2021-12-02 18:15:44 +01:00
Andrey Antukh 4d280bdb6d Merge branch 'test-e2e' into develop 2021-12-01 16:14:46 +01:00
Andrey Antukh 47acab766d ⬆️ Update to OpenJDK17. 2021-12-01 16:13:46 +01:00
Andrés Moya 1cc3819e65 🧪 Add e2e tests with Cypress 2021-12-01 16:13:46 +01:00
Andrey Antukh 16fa6259ea 🚧 Update docker deps and start working on test coverage. 2021-12-01 16:13:46 +01:00
Andrey Antukh 95717c4c32 Merge pull request #1378 from penpot/performance
Performance Improvements
2021-12-01 14:43:43 +01:00
alonso.torres 7564f27f95 Improvements after review 2021-12-01 14:39:20 +01:00
alonso.torres 565046aaa6 Memoize transform-shape 2021-12-01 14:39:20 +01:00
alonso.torres fb9b023fae Improve selection performance 2021-12-01 14:39:20 +01:00
alonso.torres b05908a760 Improved performance for options and area selection 2021-12-01 14:39:20 +01:00
alonso.torres 3bbcd235e1 Improved selection rect calculation 2021-12-01 14:39:20 +01:00
alonso.torres 9d66984c62 Improved set-modifiers-recursive and some utils memoization 2021-12-01 14:39:20 +01:00
alonso.torres 9024408ed2 Improved frame defered handling 2021-12-01 14:39:20 +01:00
alonso.torres 2b32e864fd Performance improvements 2021-12-01 14:39:20 +01:00
alonso.torres 626d0cba46 🐛 Add to spec opacity and blend-mode 2021-12-01 14:39:20 +01:00
alonso.torres 2a11e9962d ♻️ Moved debug utils to debug namespace 2021-12-01 14:39:20 +01:00
Andrés Moya 7dffddd437 📖 Add doc contributors to CHANGES.md 2021-12-01 12:48:48 +01:00
Andrey Antukh 6a7600fd52 ♻️ Ensure a correct usage of concat/into operations. 2021-12-01 11:30:48 +01:00
Andrey Antukh b897f202dd 📎 Minor changes on exporter shadow-cljs config. 2021-11-30 13:11:52 +01:00
Andrey Antukh eb396f2367 🐛 Properly show message on password recovery request.
Additionally, add the ability to reset form passing `nil`
on `reset!` function of Atom interface.
2021-11-30 09:44:03 +01:00
Andrey Antukh 95bf3e3af4 🐛 Fix issues related to signup questions form. 2021-11-30 09:44:03 +01:00
Andrey Antukh 19944202fb Handle properly the user redirect after login. 2021-11-30 09:44:03 +01:00
Andrey Antukh 2596ad27c3 ♻️ Minor refactor of auth data-flow.
This fixes many issues related to using penpot on-premise
instances on different domain than localhost. This changes
ensures correct data flow of authenticated and not authenticated
sessions.
2021-11-30 09:44:03 +01:00
Andrey Antukh ece914303a ⬆️ Update exporter dependencies. 2021-11-29 15:53:24 +01:00
eva 7a0c12e073 ♻️ Create a colors file to save constants of color that can no be refactored into sass variables 2021-11-29 11:21:12 +01:00
eva 14b23b491f use those new css variables in our cljs files 2021-11-29 11:21:12 +01:00
eva 039b03249b Create css variables fron our sass varibles to use them in cljs files 2021-11-29 11:21:12 +01:00
Andrés Moya 3919cf4f86 🐛 Fix resize behavior of masked groups 2021-11-25 15:53:09 +01:00
Yaron Shahrabani 319a9fd2de 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (843 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2021-11-25 14:50:58 +01:00
Oğuz Ersen cf1f9f93aa 🌐 Add translations for: Turkish.
Currently translated at 99.7% (841 of 843 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2021-11-25 14:50:57 +01:00
Andrey Antukh 0dd805da7f Improve team deletion process. 2021-11-25 14:19:06 +01:00
Andrey Antukh e7a1833c44 🐛 Add missing "solid" font-weight parsing style.
Related issue: #1338
2021-11-25 14:19:06 +01:00
Andrey Antukh 54f8487b46 Make team leave & reassing as atomic operation. 2021-11-25 14:19:06 +01:00
alonso.torres b68d721b39 🐛 Fix problem when importing in shared libraries 2021-11-25 13:28:37 +01:00
Andrey Antukh b9ccb4e52c 🐛 Fix issues on login being logged. 2021-11-25 13:24:40 +01:00
Andrey Antukh c4a11f73a0 ⬆️ Update deps. 2021-11-25 13:24:40 +01:00
Andrey Antukh f96d4198c3 📎 Add scripts/repl to common. 2021-11-25 13:24:40 +01:00
Andrey Antukh fe6a0ec5b8 📎 Fix linter issues. 2021-11-25 13:24:40 +01:00
Andrey Antukh e7b4010eba 🐛 Fix undo on page relocate/sorting. 2021-11-25 13:24:40 +01:00
elhombretecla c4947d3737 Add basic css sf structure 2021-11-25 13:24:40 +01:00
Andrey Antukh 8a8d677f85 🎉 Integrate questions form. 2021-11-25 13:24:40 +01:00
eva baf4393310 🔨 Fix some spanish terms 2021-11-24 16:42:48 +01:00
eva 723916d930 Allow ungroup groups in bulk and unmask mask in group 2021-11-24 16:42:48 +01:00
Andrey Antukh 591d66564d 📎 Set develop branch to version 1.11.0-beta. 2021-11-24 13:23:36 +01:00
Andrey Antukh 79a2d522bf Merge remote-tracking branch 'origin/main' into develop 2021-11-24 13:23:14 +01:00
Andrey Antukh 4ad34ab5c8 📎 Update version number. 2021-11-24 13:06:36 +01:00
Andrey Antukh 33c7847dfc 🐛 Fix team deletion flow on dashboard. 2021-11-24 13:05:54 +01:00
alonso.torres 7a04f15710 🐛 Fix problems with team management. 2021-11-24 13:05:48 +01:00
Andrey Antukh 7e5b10eb3e 🐛 Fix team deletion flow on dashboard. 2021-11-24 12:45:06 +01:00
alonso.torres 896a07fa9a 🐛 Fix problems with team management 2021-11-24 12:27:14 +01:00
Andrey Antukh 07e8bb00fb Improve debug information of oidc provider. 2021-11-23 16:41:31 +01:00
Andrey Antukh 5d2742dd37 📎 Sort translation files. 2021-11-23 14:29:09 +01:00
Andrey Antukh 9ae3f1eb68 Merge remote-tracking branch 'weblate/develop' into translations 2021-11-23 14:27:29 +01:00
Andrey Antukh 8c6e0cf43a Merge branch 'jsoref-spelling' into develop 2021-11-23 14:23:29 +01:00
Andrey Antukh 1e220fd506 📎 Update changes.md file. 2021-11-23 14:22:46 +01:00
Andrey Antukh 4ff7855fd4 📎 Adapt translation files to spelling fixes. 2021-11-23 14:21:05 +01:00
Andrey Antukh eb57354109 📎 Adapt migrations file. 2021-11-23 14:19:48 +01:00
Andrey Antukh a82a33cecf Merge branch 'spelling' of https://github.com/jsoref/penpot into jsoref-spelling 2021-11-23 14:02:16 +01:00
Andrés Moya c90fc2a9bf :white-check-mark: Add tests for interaction model and some fixes 2021-11-23 13:58:43 +01:00
Paul Schulz c1a40e4aeb Add preset for ReMarkable 2 screen size
Logged in issue: https://tree.taiga.io/project/penpot/issue/2298

This page size (840x1120)(for the ReMarkable2 was tested with an exported PDF
test page, and does not appear to correspond directly to the resolution of the
device.

Signed-off-by: Paul Schulz <paul@mawsonlakes.org>
2021-11-23 13:57:26 +01:00
Andrey Antukh 9999b8bfab 📎 Update email on contributing file. 2021-11-22 15:42:50 +01:00
Andrey Antukh cf62008acf Merge remote-tracking branch 'origin/main' into develop 2021-11-22 08:59:48 +01:00
Andrey Antukh 1c959a6653 📎 Add commented keycloak docker compose entry. 2021-11-22 08:57:20 +01:00
Andrey Antukh b8043a2432 📎 Update ci config. 2021-11-18 17:19:55 +01:00
Andrey Antukh ed5de525aa 📎 Increase default db pool size to 50. 2021-11-18 17:19:55 +01:00
Andrey Antukh 8105d9388b ♻️ Refactor rlimit usage (backend). 2021-11-18 17:19:55 +01:00
Andrey Antukh 8151dcc05f 📎 Improve services defmethod linter hook. 2021-11-18 17:19:55 +01:00
Andrés Moya f566d2a0da 🐛 Remove unneeded style causing visual glitch 2021-11-17 14:06:15 +01:00
Andrey Antukh 0be2b2791f ♻️ Refactor error handling on exporter browser module. 2021-11-17 10:09:36 +01:00
Andrey Antukh bf51e3db60 Invalidate all other sessions on password change. 2021-11-17 10:09:36 +01:00
Andrey Antukh abca69f408 🐛 Fix tab reuse issue (viewer <-> workspace). 2021-11-17 10:09:36 +01:00
Andrey Antukh 6eac9102c9 🐛 Prevent conflict errors just ignoring repeated requests.
On media image uploading.
2021-11-17 10:09:36 +01:00
Andrey Antukh 0a7da1b7f2 🔥 Remove unused var. 2021-11-17 10:09:36 +01:00
Andrey Antukh b4361cb202 📎 Increase idle-in-transaction default timeout. 2021-11-17 10:09:36 +01:00
Andrey Antukh d2d4090e27 🐛 Don't raise exception when profile is not found. 2021-11-17 10:09:36 +01:00
Josh Soref 583eb53c9d 🐛 Fix typos 2021-11-15 09:54:36 -05:00
Josh Soref 39246f2beb 🐛 Fix typos in common 2021-11-15 09:53:42 -05:00
Josh Soref cd2d3d5fa3 🐛 Fix typos in backend 2021-11-15 09:53:10 -05:00
Josh Soref 589e646023 🐛 Fix typos in frontend 2021-11-15 09:51:34 -05:00
Maciek Baron b7ba3098ae 🐛 Fix typo in workspace.scss
Correct the spelling of 'width' to ensure it is set to '100%' properly and does not default to 'auto'.
2021-11-15 12:50:52 +01:00
Andrés Moya 631c5ecae3 💄 Change word in german for a shorter one 2021-11-15 12:50:07 +01:00
Andrés Moya 4962e45bd9 Change tool for exporting artboards and fix some issues 2021-11-15 11:55:58 +01:00
Andrey Antukh c57219a356 📎 Allow specify the build optimization leven using env vars. 2021-11-12 13:31:28 +01:00
Andrey Antukh 03e6a187c5 Merge branch 'main' into develop 2021-11-12 13:31:13 +01:00
Andrey Antukh 66b0039566 📎 Fix linter issues. 2021-11-12 12:36:32 +01:00
Andrey Antukh 17da51440c 📎 Change loggling level on oauth ns. 2021-11-12 12:34:50 +01:00
曹恩逢 40326177fd 🌐 Add translations for: Chinese (Traditional).
Currently translated at 23.2% (192 of 826 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2021-11-01 04:34:53 +01:00
Yaron Shahrabani 4ab0272fa6 🌐 Add translations for: Hebrew.
Currently translated at 99.8% (825 of 826 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2021-11-01 04:34:52 +01:00
Marius fb33366c91 🌐 Add translations for: German.
Currently translated at 99.3% (821 of 826 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2021-11-01 04:34:51 +01:00
Oğuz Ersen 75352c9afe 🌐 Add translations for: Turkish.
Currently translated at 99.7% (824 of 826 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2021-11-01 04:34:50 +01:00
Yaron Shahrabani bfb30fe68d 🌐 Add translations for: Hebrew.
Currently translated at 95.8% (792 of 826 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2021-10-27 11:49:02 +02:00
1497 changed files with 222168 additions and 506455 deletions

No files matched your search

+50 -40
View File
@@ -2,26 +2,20 @@ version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: penpotapp/devenv:latest
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
- image: circleci/postgres:13.3-ram
- image: cimg/postgres:14.5
environment:
POSTGRES_USER: penpot_test
POSTGRES_PASSWORD: penpot_test
POSTGRES_DB: penpot_test
- image: circleci/redis:6.0.8
- image: cimg/redis:7.0.5
working_directory: ~/repo
resource_class: large
environment:
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx1g
JVM_OPTS: -Xmx4g
steps:
- checkout
@@ -33,56 +27,72 @@ jobs:
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: cd .clj-kondo && cat config.edn
- run:
name: frontend styles prettier
working_directory: "./frontend"
command: |
yarn install
yarn run lint-scss
- run:
name: common lint
working_directory: "./common"
command: "clj-kondo --parallel --lint src/"
command: |
clj-kondo --version
clj-kondo --parallel --lint src/
- run:
name: frontend lint
working_directory: "./frontend"
command: "clj-kondo --parallel --lint src/"
command: |
clj-kondo --version
clj-kondo --parallel --lint src/
- run:
name: backend lint
working_directory: "./backend"
command: "clj-kondo --parallel --lint src/"
# run backend test
- run:
name: backend test
working_directory: "./backend"
command: "clojure -X:dev:test"
environment:
PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test"
PENPOT_TEST_DATABASE_USERNAME: penpot_test
PENPOT_TEST_DATABASE_PASSWORD: penpot_test
PENPOT_TEST_REDIS_URI: "redis://localhost/1"
- run:
name: frontend tests
working_directory: "./frontend"
command: |
yarn install
clojure -M:dev:shadow-cljs compile test
node target/tests.js
environment:
JAVA_HOME: /usr/lib/jvm/openjdk16
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin:/usr/lib/jvm/openjdk16/bin
clj-kondo --version
clj-kondo --parallel --lint src/
- run:
working_directory: "./common"
name: common tests
command: |
yarn install
clojure -M:dev:shadow-cljs compile test
node target/tests.js
clojure -X:dev:test
yarn test
clojure -X:dev:test :patterns '["common-tests.*-test"]'
environment:
JAVA_HOME: /usr/lib/jvm/openjdk16
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin:/usr/lib/jvm/openjdk16/bin
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
JVM_OPTS: -Xmx4g
NODE_OPTIONS: --max-old-space-size=4096
- run:
name: backend test
working_directory: "./backend"
command: |
clojure -X:dev:test :patterns '["backend-tests.*-test"]'
environment:
PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test"
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:
+23 -5
View File
@@ -1,15 +1,21 @@
{:lint-as
{promesa.core/let clojure.core/let
rumext.alpha/defc clojure.core/defn
rumext.alpha/fnc clojure.core/fn
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
app.common.data/export clojure.core/def
app.db/with-atomic clojure.core/with-open}
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
app.common.logging/with-context clojure.core/do}
:hooks
{:analyze-call
{app.common.data/export hooks.export/export
{app.common.data.macros/export hooks.export/export
potok.core/reify hooks.export/potok-reify
cljs.core/specify! hooks.export/clojure-specify
app.util.services/defmethod hooks.export/service-defmethod
}}
@@ -34,9 +40,21 @@
:single-key-in
{:level :warning}
:non-arg-vec-return-type-hint
{:level :off}
:redundant-do
{:level :off}
:earmuffed-var-not-dynamic
{:level :off}
:dynamic-var-not-earmuffed
{:level :off}
:used-underscored-binding
{:level :warning}
:unused-binding
{:exclude-destructured-as true
:exclude-destructured-keys-in-fn-args false
+34 -13
View File
@@ -51,18 +51,39 @@
(defn service-defmethod
[{:keys [:node]}]
(let [[rnode rtype & other] (:children node)
(let [[rnode rtype ?meta & other] (:children node)
rsym (gensym (name (:k rtype)))
result (api/list-node
[(api/token-node (symbol "do"))
(api/list-node
[(api/token-node (symbol "declare"))
(api/token-node rsym)])
(api/list-node
(into [(api/token-node (symbol "defmethod"))
(api/token-node rsym)
rtype]
other))])]
[?docs other] (if (api/string-node? ?meta)
[?meta other]
[nil (cons ?meta other)])
[?meta other] (let [?meta (first other)]
(if (api/map-node? ?meta)
[?meta (rest other)]
[nil other]))
nodes [(api/token-node (symbol "do"))
(api/list-node
[(api/token-node (symbol "declare"))
(api/token-node rsym)])
(when ?docs
(api/list-node
[(api/token-node (symbol "comment")) ?docs]))
(when ?meta
(api/list-node
[(api/token-node (symbol "reset-meta!"))
(api/token-node rsym)
?meta]))
(api/list-node
(into [(api/token-node (symbol "defmethod"))
(api/token-node rsym)
rtype]
other))]
result (api/list-node (filterv some? nodes))]
;; (prn "=====>" rtype)
;; (prn (api/sexpr result))
{:node result}))
+89
View File
@@ -0,0 +1,89 @@
description: Create a report to help us improve
labels: ["bug"]
name: Bug report
title: "bug: "
body:
- type: markdown
attributes:
value: |
## Before you start
Please search our [existing issues](https://github.com/penpot/penpot/issues) and open [pull requests](https://github.com/penpot/penpot/pulls) to lessen the change of filing duplicate issues or feature requests. Thank you.
---
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
validations:
required: true
- type: textarea
id: expected
attributes:
description: A clear and concise description of what you expected to happen.
label: Expected behavior
validations:
required: true
- type: textarea
id: actual
attributes:
description: A clear and concise description of what happens instead; what the bug is.
label: Actual behavior
validations:
required: true
- type: textarea
id: screenshots
attributes:
description: If applicable, add screenshots to help explain your problem.
label: Screenshots or video
- type: textarea
id: desktop
attributes:
label: Desktop (please complete the following information)
placeholder: |
- OS (e.g. iOS):
- Browser & version (e.g. Chrome 89.0):
- type: textarea
id: mobile
attributes:
label: Smartphone (please complete the following information)
placeholder: |
- Device & model (e.g. iPhone 6):
- OS & version (e.g. iOS 8.1):
- Browser & version (e.g. stock browser 22):
- type: textarea
id: environment
attributes:
label: Environment (please complete the following information)
placeholder: |
- Host (e.g. https://design.penpot.app, local instance):
*If self-hosted:*
- OS Version (e.g. Ubuntu 16.04):
- Docker / Docker-compose version (e.g. Docker version 18.03.0-ce, build 0520e24):
- Image version (e.g. Alpine):
Docker commands or docker-compose file (if possible and if proceed.x):
```
```
- type: textarea
id: frontend-trace
attributes:
label: Frontend Stack Trace
render: console
- type: textarea
id: backend-trace
attributes:
label: Backend Stack Trace
render: console
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Any other context about the problem.
-73
View File
@@ -1,73 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: (e.g. iOS)
- Browser (e.g. chrome, safari)
- Version (e.g. 22)
**Smartphone (please complete the following information):**
- Device: (e.g. iPhone6)
- OS: (e.g. iOS8.1)
- Browser (e.g. stock browser, safari)
- Version (e.g. 22)
**Environment (please complete the following information):**
Specify if using SAAS (https://design.penpot.app) or self-hosted instance.
If self-hosted instance, add OS and runtime information to help explain your problem.
- OS Version: (e.g. Ubuntu 16.04)
Also provide Docker commands or docker-compose file if possible and if proceed.x
- Docker / Docker-compose Version: (e.g. Docker version 18.03.0-ce, build 0520e24)
- Image (e.g. alpine)
**Frontend Stack Trace (if self-hosted)**
<details>
```
```
</details>
**Backend Stack Trace (if self-hosted)**
<details>
```
```
</details>
**Additional context**
Add any other context about the problem here.
@@ -0,0 +1,37 @@
description: Suggest an idea for this project.
labels: ["needs triage", "enhancement"]
name: "Feature request"
title: "feature: "
body:
- type: markdown
attributes:
value: |
## Before you start
Please search our [existing issues](https://github.com/penpot/penpot/issues) and open [pull requests](https://github.com/penpot/penpot/pulls) to lessen the change of filing duplicate issues or feature requests. Thank you.
---
- type: textarea
id: problem
attributes:
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
label: Is your feature request related to a problem? Please describe.
validations:
required: true
- type: textarea
id: solution
attributes:
description: A clear and concise description of what you want to happen.
label: Describe the solution you'd like.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered.
description: A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.
-21
View File
@@ -1,21 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+55 -41
View File
@@ -1,45 +1,59 @@
figwheel_server.log
*jar
*-init.clj
.lein-deps-sum
.lein-failures
.lein-repl-history
.lein-plugins/
.repl
.nrepl-port
.cpcache
.rebel_readline_history
/vendor/**/target
/cd.md
node_modules
/backend/target/
/backend/resources/public/media
/backend/resources/public/assets
/backend/assets/
/backend/dist/
/backend/logs/
/backend/-
/telemetry/
/frontend/npm-debug.log
/frontend/target/
/frontend/dist/
/frontend/out/
/frontend/.shadow-cljs
/frontend/resources/public/*
/frontend/resources/fonts/experiments
/exporter/target
/exporter/.shadow-cljs
/docker/images/bundle*
/common/.shadow-cljs
/common/target
/.clj-kondo/.cache
/bundle*
/media
/deploy
/web
/_dump
/vendor/svgclean/bundle*.js
*.jar
*.orig
*.penpot
.calva
.clj-kondo
.cpcache
.lsp
.nrepl-port
.nyc_output
.rebel_readline_history
.repl
.shadow-cljs
/*.jpg
/*.md
/*.png
/*.sql
/*.txt
/*.yml
/*.zip
/.clj-kondo/.cache
/_dump
/backend/*.md
/backend/*.sql
/backend/*.txt
/backend/assets/
/backend/builtin-templates
/backend/dist/
/backend/logs/
/backend/resources/public/assets
/backend/resources/public/media
/backend/target/
/bundle*
/cd.md
/clj-profiler/
/common/coverage
/common/target
/deploy
/docker/images/bundle*
/exporter/target
/frontend/cypress/fixtures/validuser.json
/frontend/cypress/videos/*/
/frontend/cypress/videos/*/
/frontend/dist/
/frontend/npm-debug.log
/frontend/out/
/frontend/package-lock.json
/frontend/resources/fonts/experiments
/frontend/resources/public/*
/frontend/target/
/other/
/scripts/
/telemetry/
/tmp/
/vendor/**/target
/vendor/svgclean/bundle*.js
/web
clj-profiler/
node_modules
+1044 -126
View File
File diff suppressed because it is too large. Load diff
+21 -9
View File
@@ -19,9 +19,9 @@ If you found a bug, please report it, as far as possible with:
- a browser and the browser version used
- a dev tools console exception stack trace (if it is available)
If you found a bug that you consider better discuse in private (for
If you found a bug that you consider better discuss in private (for
example: security bugs), consider first send an email to
`info@penpot.app`.
`support@penpot.app`.
**We don't have formal bug bounty program for security reports; this
is an open source application and your contribution will be recognized
@@ -54,7 +54,7 @@ We will use the `easy fix` mark for tag for indicate issues that are
easy for beginners.
## Commit Message Guidelines ##
## Commit Guidelines ##
We have very precise rules over how our git commit messages can be formatted.
@@ -78,7 +78,6 @@ Where type is:
- :ambulance: `:ambulance:` a commit that fixes critical bug
- :books: `:books:` a commit that improves or adds documentation
- :construction: `:construction:`: a wip commit
- :construction_worker: `:construction_worker:` a commit with CI related stuff
- :boom: `:boom:` a commit with breaking changes
- :wrench: `:wrench:` a commit for config updates
- :zap: `:zap:` a commit with performance improvements
@@ -91,12 +90,25 @@ More info:
- https://gist.github.com/parmentf/035de27d6ed1dce0b36a
- https://gist.github.com/rxaviers/7360908
The subject should be:
Each commit should have:
- Use the imperative mood.
- Capitalize the first letter.
- Don't put a period at the end of the subject line.
- Put a blank line between the subject line and the body.
- A concise subject using imperative mood.
- The subject should have capitalized the first letter, without period
at the end and no larger than 65 characters.
- A blank line between the subject line and the body.
- An entry on the CHANGES.md file if applicable, referencing the
github or taiga issue/user-story using the these same rules.
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`
## Code of conduct ##
+90 -41
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>
@@ -12,76 +12,124 @@
<a href="https://tree.taiga.io/project/penpot/" title="Managed with Taiga.io" rel="nofollow"><img src="https://camo.githubusercontent.com/4a1d1112f0272e3393b1e8da312ff4435418e9e2eb4c0964881e3680f90a653c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d616e61676564253230776974682d54414947412e696f2d3730396631342e737667" alt="Managed with Taiga.io" data-canonical-src="https://img.shields.io/badge/managed%20with-TAIGA.io-709f14.svg" style="max-width:100%;"></a>
<a href="https://gitpod.io/#https://github.com/penpot/penpot" rel="nofollow"><img src="https://camo.githubusercontent.com/daadb4894128d1e19b72d80236f5959f1f2b47f9fe081373f3246131f0189f6c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974706f642d72656164792d2d746f2d2d636f64652d626c75653f6c6f676f3d676974706f64" alt="Gitpod ready-to-code" data-canonical-src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" style="max-width:100%;"></a></p>
![PENPOT](https://penpot.app/images/readme/home-ui.jpg)
<p align="center">
<a href="https://penpot.app/"><b>Website</b></a> •
<a href="https://help.penpot.app/technical-guide/getting-started/"><b>Getting Started</b></a> •
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a> •
<a href="https://help.penpot.app/user-guide/introduction/info/"><b>Tutorials & Info</b></a> •
<a href="https://community.penpot.app/"><b>Community</b></a> •
<a href="https://twitter.com/penpotapp"><b>Twitter</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a> •
<a href="https://www.youtube.com/channel/UCAqS8G72uv9P5HG1IfgnQ9g"><b>Youtube</b></a>
</p>
![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif)
## What is Penpot? ##
**:tada: [Important Notice!] :tada:** Our very first **Penpot Fest** is happening on June 28-30, Barcelona (Spain). **Secure yourself a ticket** to know everything about the present and future of Penpot and be part of the conversation! See details on the amazing venue and speakers lineup at [penpotfest.org](https://penpotfest.org)! :zap:
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 web standards (SVG). For all and empowered by the community.
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.
- [How to use](#how-to-use)
- [Help center](#help-center)
- [Contributing](#contributing)
- [Give feedback](#give-feedback)
- [Tutorials](#tutorials)
## Table of contents ##
- [Why Penpot](#why-penpot)
- [Getting Started](#getting-started)
- [Community](#community)
- [Resources](#resources)
- [License](#license)
## How to use ##
## Why Penpot ##
Login or Register on our Penpot cloud app. Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** by your own.
Penpot makes design and prototyping accessible to every team in the world.
✏️ [Start using Penpot](https://design.penpot.app)
### For cross-domain teams ###
We have a clear focus on design and code teams and our capabilities reflect exactly that. The less hand-off mindset, the more fun for everyone.
You can also install Penpot in a local environment. This section details everything you need to know to get Penpot up and running in production environments. Although it can be installed in many ways, the recommended approach is using **docker** and **docker-compose**.
### Multiplatform ###
Being web based, Penpot is not dependent on operating systems or local installations, you will only need to run a modern browser.
🐳 [Install docker](https://help.penpot.app/technical-guide/getting-started/)
### Open Standards ###
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.
## Help center ##
<p align="center">
<img src="https://penpot.app/images/readme/git-open.png" alt="Open Source" style="width: 65%;">
</p>
In this documentation you will find (almost) everything you need to know about how to work with Penpot. From the interface basics to advanced functionality.
📖 [User guide](https://help.penpot.app/user-guide/)
## Getting started ##
❓ [FAQs](https://help.penpot.app/faqs/)
### Install with Elestio ###
[Elestio](https://elest.io/) offers a fully managed service for on-premise instances of a selection of open-source software! This means you can deploy a dedicated instance of Penpot in just 3 minutes with no technical knowledge needed.
🖥️ [Technical guide](https://help.penpot.app/technical-guide/)
You dont need to worry about DNS configuration, SMTP, backups, SSL certificates, OS & Penpot upgrades, and much more.
❤️ [Contributing guide](https://help.penpot.app/contributing-guide/)
[Get started with Elestio.](https://help.penpot.app/technical-guide/getting-started/#install-with-elestio)
![User guide](https://penpot.app/images/readme/help-center.jpg)
### Install with Docker ###
You can also get started with Penpot locally or self-host it with **docker** and **docker-compose**.
Heres a step-by-step guide on [getting started with Docker.](https://help.penpot.app/technical-guide/getting-started/#install-with-docker)
### Penpot cloud app ###
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://penpot.app/images/readme/git-self-host.png" alt="Getting started" style="width: 65%;">
</p>
## Community ##
We love the open source software community. Contributing is our passion and if its yours too, [participate](https://community.penpot.app/) and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your ideas and code are welcome!
If you need help or have any questions; if youd like to share your experience using Penpot or get inspired; if youd rather meet our community of developers and designers, [join our Community](https://community.penpot.app/)!
You will find the following categories:
- [Ask the Community](https://community.penpot.app/c/ask-for-help-using-penpot/6)
- [Troubleshooting](https://community.penpot.app/c/technical/8)
- [Help us Improve Penpot](https://community.penpot.app/c/help-us-improve-penpot/7)
- [#MadeWithPenpot](https://community.penpot.app/c/madewithpenpot/9)
- [Events and Announcements](https://community.penpot.app/c/announcements/5)
- [Inside Penpot](https://community.penpot.app/c/inside-penpot/21)
- [Penpot in your language](https://community.penpot.app/c/penpot-in-your-language/12)
<p align="center">
<img src="https://penpot.app/images/readme/git-collaborate.png" alt="Communnity" style="width: 65%;">
</p>
## Contributing ##
Every sort of contribution will be very helpful to enhance Penpot. How youll participate? All your ideas, designs and code are welcome:
- Invite your [team to join](https://design.penpot.app/#/auth/register)
- Star this repo and follow us on Social Media: [Twitter](https://twitter.com/penpotapp), [Instagram](https://instagram.com/penpot.app), [Youtube](https://www.youtube.com/c/Penpot) or [Mastodon](https://fosstodon.org/@penpot/).
- Participate in the [Community](https://community.penpot.app/) asking and answering questions, reacting to others articles or opening your own conversations.
- Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues)
- 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)
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://penpot.app/images/open-source.png" alt="Open Source">
<img src="https://penpot.app/images/readme/git-community.png" alt="Contributing" style="width: 65%;">
</p>
**Open to you!**
We love the open source software community. Contributing is our
passion and because of this, we'll be glad if you want to participate
and improve Penpot. All your awesome ideas and code are welcome!
Please refer to the [Contributing Guide](./CONTRIBUTING.md)
## Give feedback ##
## Resources ##
You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project.
✉️ [Mail us](mailto:info@penpot.app)
💾 [Documentation](https://help.penpot.app/technical-guide/)
💬 [Github discussions](https://github.com/penpot/penpot/discussions)
🚀 [Getting Started](https://help.penpot.app/technical-guide/getting-started/)
🐞 [Github issues](mailto:info@penpot.apphttps://github.com/penpot/penpot/issues)
✏️ [Tutorials](https://www.youtube.com/playlist?list=PLgcCPfOv5v54WpXhHmNO7T-YC7AE-SRsr)
✍️ [Gitter](https://gitter.im/penpot/community)
🏘 [Architecture](https://help.penpot.app/technical-guide/developer/architecture/)
## Tutorials ##
📚 [Dev Diaries](https://penpot.app/dev-diaries.html)
You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project.
Would you like to know more about Penpot? We recommend you to visit our youtube channel and learn more about the functionalities and possibilities of Penpot with our video tutorials.
🎞️ [Youtube channel](https://www.youtube.com/channel/UCAqS8G72uv9P5HG1IfgnQ9g)
## License ##
@@ -90,5 +138,6 @@ 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) UXBOX Labs SL
Copyright (c) KALEIDOS INC
```
Penpot is a Kaleidos [open source project](https://kaleidos.net/products)
+5
View File
@@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Please report security issues to `support@penpot.app`
+98
View File
@@ -0,0 +1,98 @@
# THANK YOU
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](https://hosted.weblate.org/user/alejandro.alonso)
* [alexpawlak](https://hosted.weblate.org/user/alexpawlak)
* [allytiago](https://hosted.weblate.org/user/allytiago)
* [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](https://hosted.weblate.org/user/bingling-sama)
* [devadarta](https://hosted.weblate.org/user/devadarta)
* [diacritica](https://hosted.weblate.org/user/diacritica)
* [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)
* [filipepessanha](https://hosted.weblate.org/user/filipepessanha)
* [fortx](https://hosted.weblate.org/user/fortx)
* [foxbit](https://hosted.weblate.org/user/foxbit)
* [georgelemon](https://hosted.weblate.org/user/georgelemon)
* [girafic](https://hosted.weblate.org/user/girafic)
* [gizemb](https://hosted.weblate.org/user/gizemb)
* [greench](https://hosted.weblate.org/user/greench)
* [guidimas](https://hosted.weblate.org/user/guidimas)
* [hfigueira_1](https://hosted.weblate.org/user/hfigueira_1)
* [hifiaz](https://hosted.weblate.org/user/hifiaz)
* [httpsterio](https://hosted.weblate.org/user/httpsterio)
* [humteus](https://hosted.weblate.org/user/humteus)
* [iblueer](https://hosted.weblate.org/user/iblueer)
* [insan](https://hosted.weblate.org/user/insan)
* [Iphi](https://hosted.weblate.org/user/Iphi)
* [iWangJiaxiang](https://hosted.weblate.org/user/iWangJiaxiang)
* [jancborchardt](https://hosted.weblate.org/user/jancborchardt)
* [jazz](https://hosted.weblate.org/user/jazz)
* [johnterroa](https://hosted.weblate.org/user/johnterroa)
* [jponsa](https://hosted.weblate.org/user/jponsa)
* [kapler](https://hosted.weblate.org/user/kapler)
* [kingu](https://hosted.weblate.org/user/kingu)
* [KnahkAmath](https://hosted.weblate.org/user/KnahkAmath)
* [laminne](https://hosted.weblate.org/user/laminne)
* [lenildoleite](https://hosted.weblate.org/user/lenildoleite)
* [liimee](https://hosted.weblate.org/user/liimee)
* [lixeix](https://hosted.weblate.org/user/lixeix)
* [locness3](https://hosted.weblate.org/user/locness3)
* [maiwann](https://hosted.weblate.org/user/maiwann)
* [MidooDj](https://hosted.weblate.org/user/MidooDj)
* [Mohamed_amine_gdoura](https://hosted.weblate.org/user/Mohamed_amine_gdoura)
* [myfunnyandy](https://hosted.weblate.org/user/myfunnyandy)
* [NampoinaRal](https://hosted.weblate.org/user/NampoinaRal)
* [nautilusx](https://hosted.weblate.org/user/nautilusx)
* [niwinz](https://hosted.weblate.org/user/niwinz)
* [pablo.alba](pablo.https://hosted.weblate.org/user/alba)
* [PhilippeAccorsi](https://hosted.weblate.org/user/PhilippeAccorsi)
* [rnarius](https://hosted.weblate.org/user/rnarius)
* [rnd](https://hosted.weblate.org/user/rnd)
* [RuanAragao](https://hosted.weblate.org/user/RuanAragao)
* [ruben](https://hosted.weblate.org/user/ruben)
* [semonxue](https://hosted.weblate.org/user/semonxue)
* [shahab](https://hosted.weblate.org/user/shahab)
* [shuaib85](https://hosted.weblate.org/user/shuaib85)
* [SiderealArt](https://hosted.weblate.org/user/SiderealArt)
* [swapnil.cx](swapnil.https://hosted.weblate.org/user/cx)
* [syuza](https://hosted.weblate.org/user/syuza)
* [th3ph4nt0m](https://hosted.weblate.org/user/th3ph4nt0m)
* [tiwb](https://hosted.weblate.org/user/tiwb)
* [tommi](https://hosted.weblate.org/user/tommi)
* [val](https://hosted.weblate.org/user/val)
* [vikt](https://hosted.weblate.org/user/vikt)
* [VinLin](https://hosted.weblate.org/user/VinLin)
* [vintprox](https://hosted.weblate.org/user/vintprox)
* [Voxybuns](https://hosted.weblate.org/user/Voxybuns)
* [winie](https://hosted.weblate.org/user/winie)
* [Yaron](https://hosted.weblate.org/user/Yaron)
* [yrd](https://hosted.weblate.org/user/yrd)
* [YukiYuigishi](https://hosted.weblate.org/user/YukiYuigishi)
* [zcraber](https://hosted.weblate.org/user/zcraber)
## Libraries & templates
* systxema
* plumilla
* victor crespo
* xtech
* candidexmedia
* merih güz
* klarr agency
+31
View File
@@ -0,0 +1,31 @@
(ns build
(:refer-clojure :exclude [compile])
(:require
[clojure.tools.build.api :as b]
[clojure.java.io]))
(def class-dir "target/classes")
(def basis (b/create-basis {:project "deps.edn"}))
(def jar-file "target/penpot.jar")
(defn clean [_]
(b/delete {:path "target"}))
(defn jar [_]
(b/copy-dir
{:src-dirs ["src" "resources"]
:target-dir class-dir})
(b/uber
{:class-dir class-dir
:uber-file jar-file
:main 'clojure.main
:exclude [#".*Log4j2Plugins\.dat$"]
:basis basis}))
(defn compile [_]
(b/javac
{:src-dirs ["dev/java"]
:class-dir class-dir
:basis basis
:javac-opts ["-source" "17" "-target" "17"]}))
+55 -49
View File
@@ -1,81 +1,87 @@
{
;; :mvn/repos
;; {"central" {:url "https://repo1.maven.org/maven2/"}
;; "clojars" {:url "https://clojars.org/repo"}
;; "jcenter" {:url "https://jcenter.bintray.com/"}
;; }
{:mvn/repos
{"sonatype" {:url "https://oss.sonatype.org/content/repositories/snapshots/"}}
:deps
{penpot/common
{:local/root "../common"}
{penpot/common {:local/root "../common"}
org.clojure/clojure {:mvn/version "1.11.1"}
org.clojure/core.async {:mvn/version "1.6.673"}
;; Logging
org.zeromq/jeromq {:mvn/version "0.5.2"}
com.github.luben/zstd-jni {:mvn/version "1.5.2-5"}
com.taoensso/nippy {:mvn/version "3.1.1"}
com.github.luben/zstd-jni {:mvn/version "1.5.0-4"}
io.prometheus/simpleclient {:mvn/version "0.16.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}
io.prometheus/simpleclient_jetty
{:mvn/version "0.16.0"
:exclusions [org.eclipse.jetty/jetty-server
org.eclipse.jetty/jetty-servlet]}
;; NOTE: don't upgrade to latest version, breaking change is
;; introduced on 0.10.0 that suffixes counters with _total if they
;; are not already has this suffix.
io.prometheus/simpleclient {:mvn/version "0.9.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.9.0"}
io.prometheus/simpleclient_jetty {:mvn/version "0.9.0"
:exclusions [org.eclipse.jetty/jetty-server
org.eclipse.jetty/jetty-servlet]}
io.prometheus/simpleclient_httpserver {:mvn/version "0.9.0"}
io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"}
io.lettuce/lettuce-core {:mvn/version "6.1.5.RELEASE"}
io.lettuce/lettuce-core {:mvn/version "6.2.2.RELEASE"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
info.sunng/ring-jetty9-adapter {:mvn/version "0.15.2"}
com.github.seancorfield/next.jdbc {:mvn/version "1.2.709"}
metosin/reitit-ring {:mvn/version "0.5.15"}
org.postgresql/postgresql {:mvn/version "42.2.23"}
com.zaxxer/HikariCP {:mvn/version "5.0.0"}
funcool/yetti
{:git/tag "v9.15"
:git/sha "aa9b967"
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
funcool/datoteka {:mvn/version "2.0.0"}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.847"}
metosin/reitit-core {:mvn/version "0.5.18"}
buddy/buddy-core {:mvn/version "1.10.1"}
buddy/buddy-hashers {:mvn/version "1.8.1"}
buddy/buddy-sign {:mvn/version "3.4.1"}
org.postgresql/postgresql {:mvn/version "42.6.0"}
com.zaxxer/HikariCP {:mvn/version "5.0.1"}
io.whitfin/siphash {:mvn/version "2.0.0"}
buddy/buddy-hashers {:mvn/version "1.8.158"}
buddy/buddy-sign {:mvn/version "3.4.333"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.5"}
org.jsoup/jsoup {:mvn/version "1.15.3"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
:git/url "https://github.com/penpot/im4java"}
org.jsoup/jsoup {:mvn/version "1.14.2"}
org.im4java/im4java {:mvn/version "1.4.0"}
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"}
io.sentry/sentry {:mvn/version "5.1.2"}
dawran6/emoji {:mvn/version "0.1.5"}
markdown-clj/markdown-clj {:mvn/version "1.11.4"}
;; Pretty Print specs
fipp/fipp {:mvn/version "0.6.24"}
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
software.amazon.awssdk/s3 {:mvn/version "2.19.29"}
}
software.amazon.awssdk/s3 {:mvn/version "2.17.40"}}
:paths ["src" "resources"]
:paths ["src" "resources" "target/classes"]
:aliases
{:dev
{:extra-deps
{com.bhauman/rebel-readline {:mvn/version "RELEASE"}
org.clojure/tools.namespace {:mvn/version "RELEASE"}
org.clojure/test.check {:mvn/version "RELEASE"}
org.clojure/data.csv {:mvn/version "1.0.0"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "0.5.1"}
criterium/criterium {: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"]}
:kaocha
{:extra-deps {lambdaisland/kaocha {:mvn/version "1.0.887"}}
:main-opts ["-m" "kaocha.runner"]}
:build
{:extra-deps
{io.github.clojure/tools.build {:git/tag "v0.9.3" :git/sha "e537cd1"}}
:ns-default build}
:test
{:extra-deps {io.github.cognitect-labs/test-runner
{:git/url "https://github.com/cognitect-labs/test-runner.git"
:git/sha "dd6da11611eeb87f08780a30ac8ea6012d4c05ce"}}
{:extra-paths ["test"]
:extra-deps
{io.github.cognitect-labs/test-runner
{:git/tag "v0.5.1" :git/sha "dfb30dd"}}
:main-opts ["-m" "cognitect.test-runner"]
:exec-fn cognitect.test-runner.api/test}
:outdated
+114
View File
@@ -0,0 +1,114 @@
;; 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
;; This is an example on how it can be executed:
;; clojure -Scp $(cat classpath) -M dev/script-fix-sobjects.clj
(require
'[app.common.logging :as l]
'[app.common.data :as d]
'[app.common.pprint]
'[app.db :as db]
'[app.storage :as sto]
'[app.storage.impl :as impl]
'[app.util.time :as dt]
'[integrant.core :as ig])
;; --- HELPERS
(l/info :hint "initializing script" :args *command-line-args*)
(def noop? (some #(= % "noop") *command-line-args*))
(def chunk-size 10)
(def sql:retrieve-sobjects-chunk
"SELECT * FROM storage_object
WHERE created_at < ? AND deleted_at is NULL
ORDER BY created_at desc LIMIT ?")
(defn get-chunk
[conn cursor]
(let [rows (db/exec! conn [sql:retrieve-sobjects-chunk cursor chunk-size])]
[(some->> rows peek :created-at) (seq rows)]))
(defn get-candidates
[conn]
(->> (d/iteration (partial get-chunk conn)
:vf second
:kf first
:initk (dt/now))
(sequence cat)))
(def modules
[:app.db/pool
:app.storage/storage
[:app.main/default :app.worker/executor]
[:app.main/assets :app.storage.s3/backend]
[:app.main/assets :app.storage.fs/backend]])
(def system
(let [config (select-keys app.main/system-config modules)
config (-> config
(assoc :app.migrations/all {})
(assoc :app.metrics/metrics nil))]
(ig/load-namespaces config)
(-> config ig/prep ig/init)))
(defn update-fn
[{:keys [conn] :as storage} {:keys [id backend] :as row}]
(cond
(= backend "s3")
(do
(l/info :hint "rename storage object backend"
:id id
:from-backend backend
:to-backend :assets-s3)
(assoc row :backend "assets-s3"))
(= backend "assets-s3")
(do
(l/info :hint "ignoring storage object" :id id :backend backend)
nil)
(or (= backend "fs")
(= backend "assets-fs"))
(let [sobj (sto/row->storage-object row)
path (-> (sto/get-object-path storage sobj) deref)]
(l/info :hint "change storage object backend"
:id id
:from-backend backend
:to-backend :assets-s3)
(when-not noop?
(-> (impl/resolve-backend storage :assets-s3)
(impl/put-object sobj (sto/content path))
(deref)))
(assoc row :backend "assets-s3"))
:else
(throw (IllegalArgumentException. "unexpected backend found"))))
(try
(db/with-atomic [conn (:app.db/pool system)]
(let [storage (:app.storage/storage system)
storage (assoc storage :conn conn)]
(loop [items (get-candidates conn)]
(when-let [item (first items)]
(when-let [{:keys [id] :as row} (update-fn storage item)]
(db/update! conn :storage-object (dissoc row :id) {:id (:id item)}))
(recur (rest items))))
(when noop?
(throw (ex-info "explicit rollback" {})))))
(catch Throwable cause
(cond
(= "explicit rollback" (ex-message cause))
(l/warn :hint "transaction aborted")
:else
(l/error :hint "unexpected exception" :cause cause))))
(ig/halt! system)
(System/exit 0)
+104 -22
View File
@@ -2,30 +2,56 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns user
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[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.uuid :as uuid]
[app.config :as cfg]
[app.main :as main]
[app.srepl.helpers]
[app.srepl.main :as srepl]
[app.util.blob :as blob]
[app.util.json :as json]
[app.util.time :as dt]
[app.util.transit :as t]
[clj-async-profiler.core :as prof]
[clojure.contrib.humanize :as hum]
[clojure.java.io :as io]
[clojure.pprint :refer [pprint print-table]]
[clojure.repl :refer :all]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as sgen]
[clojure.test :as test]
[clojure.stacktrace :as trace]
[clojure.test :as test]
[clojure.test.check.generators :as tgen]
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]
[criterium.core :refer [quick-bench bench with-progress-reporting]]
[integrant.core :as ig]))
[criterium.core :as crit]
[cuerdas.core :as str]
[datoteka.core]
[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]))
(repl/disable-reload! (find-ns 'integrant.core))
(set! *warn-on-reflection* true)
(defonce system nil)
@@ -33,24 +59,24 @@
(defmacro run-quick-bench
[& exprs]
`(with-progress-reporting (quick-bench (do ~@exprs) :verbose)))
`(crit/with-progress-reporting (crit/quick-bench (do ~@exprs) :verbose)))
(defmacro run-quick-bench'
[& exprs]
`(quick-bench (do ~@exprs)))
`(crit/quick-bench (do ~@exprs)))
(defmacro run-bench
[& exprs]
`(with-progress-reporting (bench (do ~@exprs) :verbose)))
`(crit/with-progress-reporting (crit/bench (do ~@exprs) :verbose)))
(defmacro run-bench'
[& exprs]
`(bench (do ~@exprs)))
`(crit/bench (do ~@exprs)))
;; --- Development Stuff
(defn- run-tests
([] (run-tests #"^app.*-test$"))
([] (run-tests #"^backend-tests.*-test$"))
([o]
(repl/refresh)
(cond
@@ -65,19 +91,22 @@
(defn- start
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> main/system-config
(ig/prep)
(ig/init))))
:started)
(try
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> (merge main/system-config main/worker-config)
(ig/prep)
(ig/init))))
:started
(catch Throwable cause
(ex/print-throwable cause))))
(defn- stop
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
nil))
:stoped)
:stopped)
(defn restart
[]
@@ -91,7 +120,60 @@
(defn compression-bench
[data]
(print-table
[{:v1 (alength (blob/encode data {:version 1}))
:v2 (alength (blob/encode data {:version 2}))
:v3 (alength (blob/encode data {:version 3}))}]))
(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))
(sm/def! ::test
[:map {:title "Foo"}
[:x :int]
[:y {:min 0} :double]
[:bar
[:map {:title "Bar"}
[:z :string]
[:v ::sm/uuid]]]
[:items
[:vector ::dt/instant]]])
(sm/def! ::test2
[:multi {:title "Foo" :dispatch :type}
[:x
[:map {:title "FooX"}
[:type [:= :x]]
[:x :int]]]
[:y
[:map
[:type [:= :x]]
[:y [::sm/one-of #{:a :b :c}]]]]
[:z
[:map {:title "FooZ"}
[:z
[:multi {:title "Bar" :dispatch :type}
[:a
[:map
[:type [:= :a]]
[:a :int]]]
[:b
[:map
[:type [:= :b]]
[:b :int]]]]]]]])
-101
View File
@@ -1,101 +0,0 @@
* {
font-family: "JetBrains Mono", monospace;
font-size: 12px;
}
pre {
margin: 0px;
}
body {
margin: 0px;
padding: 0px;
padding-top: 20px;
padding-bottom: 20px;
display: flex;
justify-content: center;
}
main {
display: flex;
flex-direction: column;
align-items: center;
min-width: 900px;
width: 900px;
}
header {
border-bottom: 1px solid #c0c0c0;
display: flex;
justify-content: center;
width: 100%;
}
.rpc-doc-content {
margin-top: 20px;
width: 100%;
display: flex;
flex-direction: column;
/* border: 1px solid red; */
padding: 5px;
}
.rpc-doc-content > h2:not(:first-child) {
margin-top: 30px;
}
.rpc-items {
list-style: none;
padding: 0px;
margin: 0px;
}
.rpc-item {
/* border: 1px solid red; */
cursor: pointer;
display: flex;
flex-direction: column;
}
.rpc-item:not(:last-child) {
margin-bottom: 3px;
}
.rpc-row-info {
cursor: pointer;
display: flex;
background-color: #eeeeee;
padding: 5px 10px;
}
.rpc-row-info > *:not(:last-child) {
margin-right: 10px;
}
.rpc-row-info > * {
/* border: 1px solid green; */
}
.rpc-row-info > .type {
font-weight: bold;
width: 70px;
}
.rpc-row-info > .name {
width: 280px;
/* font-weight: bold; */
}
.rpc-row-info > .tags > .tag > span:first-child {
font-weight: bold;
}
.hidden {
display: none;
}
.rpc-row-detail {
padding: 5px 10px;
padding-bottom: 20px;
}
-80
View File
@@ -1,80 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>Builtin API Documentation - Penpot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono">
<style>
{% include "api-doc.css" %}
</style>
<script>
{% include "api-doc.js" %}
</script>
</head>
<body>
<main>
<header>
<h1>Penpot API Documentation</h1>
</header>
<section class="rpc-doc-content">
<h2>RPC QUERY METHODS:</h2>
<ul class="rpc-items">
{% for item in query-methods %}
<li class="rpc-item">
<div class="rpc-row-info">
{# <div class="type">{{item.type}}</div> #}
<div class="name">{{item.name}}</div>
<div class="tags">
<span class="tag">
<span>Auth:</span>
<span>{% if item.auth %}YES{% else %}NO{% endif %}</span>
</span>
</div>
</div>
<div class="rpc-row-detail hidden">
{% if item.docs %}
<h3>DOCSTRING:</h3>
<p>{{item.docs}}</p>
{% endif %}
<h3>SPEC EXPLAIN:</h3>
<pre>{{item.spec}}</pre>
</div>
</li>
{% endfor %}
</ul>
<h2>RPC MUTATION METHODS:</h2>
<ul class="rpc-items">
{% for item in mutation-methods %}
<li class="rpc-item">
<div class="rpc-row-info">
{# <div class="type">{{item.type}}</div> #}
<div class="name">{{item.name}}</div>
<div class="tags">
<span class="tag">
<span>Auth:</span>
<span>{% if item.auth %}YES{% else %}NO{% endif %}</span>
</span>
</div>
</div>
<div class="rpc-row-detail hidden">
{% if item.docs %}
<h3>DOCSTRING:</h3>
<p>{{item.docs}}</p>
{% endif %}
<h3>SPEC EXPLAIN:</h3>
<pre>{{item.spec}}</pre>
</div>
</li>
{% endfor %}
</ul>
</section>
</main>
</body>
</html>
File diff suppressed because one or more lines are too long.
File diff suppressed because one or more lines are too long.
@@ -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;"
>
@@ -250,16 +250,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source prototyping platform that will be embraced by multidisciplinary teams.</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</td>
</tr>
</table>
</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;"
>
@@ -450,16 +450,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot @ 2021 | Made with &lt;3 and Open Source</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -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;"
>
@@ -240,16 +240,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source prototyping platform that will be embraced by multidisciplinary teams.</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</td>
</tr>
</table>
</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;"
>
@@ -440,16 +440,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot @ 2021 | Made with &lt;3 and Open Source</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -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;"
>
@@ -245,16 +245,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source prototyping platform that will be embraced by multidisciplinary teams.</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</td>
</tr>
</table>
</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;"
>
@@ -445,16 +445,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot @ 2021 | Made with &lt;3 and Open Source</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -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;"
>
@@ -240,16 +240,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source prototyping platform that will be embraced by multidisciplinary teams.</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</div>
</td>
</tr>
</table>
</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;"
>
@@ -440,16 +440,16 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
<tr>
<td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot @ 2021 | Made with &lt;3 and Open Source</div>
<div style="font-family:Source Sans Pro, sans-serif;font-size:14px;line-height:150%;text-align:center;color:#64666A;">Penpot | Made with &lt;3 and Open Source</div>
</td>
</tr>
</table>
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
+36
View File
@@ -0,0 +1,36 @@
[{:id "material-design-3"
:name "Material Design 3"
:thumbnail-uri "https://penpot.app/images/libraries/cover-md3.jpg"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Material%20Design%203.penpot"}
{: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 "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 "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"}]
@@ -0,0 +1,119 @@
<li class="rpc-item">
<div class="rpc-row-info">
<div class="module">{{item.module}}:</div>
<div class="name">{{item.name}}</div>
<div class="tags">
{% if item.deprecated %}
<span class="tag">
<span>DEPRECATED</span>
</span>
{% endif %}
{% if item.auth %}
<span class="tag">
<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>SC</span>
</span>
{% else %}
<span class="tag">
<span>SP</span>
</span>
{% endif %}
</div>
</div>
<div class="rpc-row-detail hidden">
<h4>DOCSTRING:</h4>
<section class="padded-section">
{% if item.added %}
<p class="small"><strong>Added:</strong> on v{{item.added}}</p>
{% endif %}
{% if item.deprecated %}
<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 %}
<h4>CHANGES:</h4>
<section class="padded-section">
<ul class="changes">
{% for change in item.changes %}
<li><strong>{{change.0}}</strong> - {{change.1}}</li>
{% endfor %}
</ul>
</section>
{% endif %}
{% 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>
+217
View File
@@ -0,0 +1,217 @@
* {
font-family: "JetBrains Mono", monospace;
font-size: 12px;
}
pre {
margin: 0px;
}
body {
margin: 0px;
padding: 0px;
padding-top: 20px;
padding-bottom: 20px;
display: flex;
justify-content: center;
}
main {
display: flex;
flex-direction: column;
align-items: center;
min-width: 900px;
width: 900px;
}
header {
border-bottom: 1px solid #c0c0c0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
}
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;
/* border: 1px solid red; */
padding: 5px;
}
.rpc-doc-content > h2:not(:first-child) {
margin-top: 30px;
}
.rpc-items {
list-style: none;
padding: 0px;
margin: 0px;
}
.rpc-item {
/* border: 1px solid red; */
/* cursor: pointer; */
display: flex;
flex-direction: column;
}
.rpc-item:not(:last-child) {
margin-bottom: 3px;
}
.rpc-row-info {
cursor: pointer;
display: flex;
background-color: #e5e5e5;
padding: 5px 10px;
}
.rpc-row-info > *:not(:last-child) {
margin-right: 10px;
}
.rpc-row-info > * {
/* border: 1px solid green; */
}
.rpc-row-info > .type {
font-weight: bold;
width: 70px;
}
.rpc-row-info > .name {
width: 280px;
/* font-weight: bold; */
border-right: 1px dotted #777;
padding-right: 10px;
}
.rpc-row-info > .module {
width: 120px;
font-weight: bold;
border-right: 1px dotted #777;
text-align: right;
padding-right: 10px;
}
.rpc-row-info > .tags > .tag > span:first-child {
font-weight: bold;
}
.hidden {
display: none;
}
.rpc-row-detail {
padding: 5px 10px;
padding-bottom: 20px;
border-left: 2px solid #e5e5e5;
border-right: 2px solid #e5e5e5;
}
.rpc-row-detail p {
font-weight: 200;
}
.rpc-row-detail p.small {
margin-top: 2px;
margin-bottom: 2px;
font-size: 10px;
}
.rpc-row-detail p.small {
margin-top: 2px;
margin-bottom: 2px;
font-size: 10px;
}
.rpc-row-detail strong {
font-weight: 500;
}
.rpc-row-detail .changes {
font-weight: 200;
list-style: none;
padding: 0px;
}
.rpc-row-detail .padded-section {
padding: 0px 10px;
}
p.small strong {
font-size: 10px;
}
p.small a {
font-size: 10px;
}
File renamed without changes.
@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>Builtin API Documentation - Penpot</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@200;300;400;500;700&display=swap" rel="stylesheet">
<style>
{% include "app/templates/api-doc.css" %}
</style>
<script>
{% include "app/templates/api-doc.js" %}
</script>
</head>
<body>
<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>Authentication</h3>
<p>The penpot backend right now offerts 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>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 METHODS REFERENCE:</h2>
<ul class="rpc-items">
{% for item in methods %}
{% include "app/templates/api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
</section>
</main>
</body>
</html>
+18
View File
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono">
<style>
{% include "app/templates/styles.css" %}
</style>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
+127
View File
@@ -0,0 +1,127 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
Debug Main Page
{% endblock %}
{% block content %}
<nav>
<h1>Debug INDEX:</h1>
<div>[<a href="/dbg/error">ERRORS</a>]</div>
</nav>
<main class="index">
<section class="widget">
<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>
<form method="get" action="/dbg/file/data">
<div class="row">
<input type="text" style="width:300px" name="file-id" placeholder="file-id" />
</div>
<div class="row">
<input type="submit" name="download" value="Download" />
<input type="submit" name="clone" value="Clone" />
</div>
</form>
</fieldset>
<fieldset>
<legend>Upload File Data:</legend>
<desc>Create a new file on your draft projects using the file downloaded from the previous section.</desc>
<form method="post" enctype="multipart/form-data" action="/dbg/file/data">
<div class="row">
<input type="file" name="file" value="" />
</div>
<div class="row">
<label>Import with same id?</label>
<input type="checkbox" name="reuseid" />
</div>
<input type="submit" value="Upload" />
</form>
</fieldset>
</section>
<section class="widget">
<fieldset>
<legend>Export binfile:</legend>
<desc>Given an FILE-ID, downloads the file and optionally all
the related libraries in a single custom formatted binary
file.</desc>
<form method="get" action="/dbg/file/export">
<div class="row set-of-inputs">
<input type="text" style="width:300px" name="file-ids" placeholder="file-id" />
<input type="text" style="width:300px" name="file-ids" placeholder="file-id" />
<input type="text" style="width:300px" name="file-ids" placeholder="file-id" />
<input type="text" style="width:300px" name="file-ids" placeholder="file-id" />
</div>
<div class="row">
<label>Include libraries?</label>
<input type="checkbox" name="includelibs" />
</div>
<div class="row">
<label>Embed assets?</label>
<input type="checkbox" name="embedassets" checked/>
</div>
<div class="row">
<input type="submit" name="download" value="Download" />
<input type="submit" name="clone" value="Clone" />
</div>
</form>
</fieldset>
<fieldset>
<legend>Import binfile:</legend>
<desc>Import penpot file in binary
format. If <strong>overwrite</strong> is checked, all files will
be overwritten using the same ids found in the file instead of
generating a new ones.</desc>
<form method="post" enctype="multipart/form-data" action="/dbg/file/import">
<div class="row">
<input type="file" name="file" value="" />
</div>
<div class="row">
<label>Overwrite?</label>
<input type="checkbox" name="overwrite" />
<br />
<small>
Instead of creating a new file with all relations remapped,
reuses all ids and updates/overwrites the objects that are
already exists on the database.
<strong>Warning, this operation should be used with caution.</strong>
</small>
</div>
<div class="row">
<label>Migrate?</label>
<input type="checkbox" name="migrate" />
<br />
<small>
Applies the file migrations on the importation process.
</small>
</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>
</div>
<div class="row">
<input type="submit" name="upload" value="Upload" />
</div>
</form>
</fieldset>
</section>
</main>
{% endblock %}
@@ -0,0 +1,19 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error list
{% endblock %}
{% block content %}
<nav>
<h1>Latest error reports:</h1>
</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>
{% endfor %}
</ul>
</main>
{% endblock %}
@@ -0,0 +1,98 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error report {{id}}
{% endblock %}
{% block content %}
<nav>
<div>[<a href="/dbg/error">⮜</a>]</div>
<div>[<a href="#context">context</a>]</div>
<div>[<a href="#params">request params</a>]</div>
{% 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="context" class="table-key">CONTEXT: </div>
<div class="table-val">
<h1>{{hint}}</h1>
</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 %}
@@ -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 %}
@@ -0,0 +1,100 @@
{% 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">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="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">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">VALIDATION 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 %}
@@ -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>
+193
View File
@@ -0,0 +1,193 @@
* {
font-family: "JetBrains Mono", monospace;
font-size: 12px;
}
body {
margin: 0px;
padding: 0px;
}
pre {
margin: 0px;
line-height: 16px;
}
desc {
margin-bottom: 10px;
font-size: 10px;
color: #666;
}
input[type=text], input[type=submit] {
padding: 3px;
}
pre {
white-space: pre-wrap;
}
main {
margin: 20px;
}
small {
font-size: 9px;
color: #888;
}
small > strong {
font-size: 9px;
}
nav {
position: fixed;
width: 100vw;
top: 0;
left: 0;
padding: 5px 20px;
display: flex;
background: #e3e3e3;
}
nav > h1 {
padding: 0px;
margin: 0px;
font-size: 11px;
}
nav > div {
text-transform: uppercase;
font-weight: bold;
}
nav > div:not(:last-child) {
margin-right: 10px;
}
.table {
margin-top: 25px;
display: flex;
flex-direction: column;
}
.table-row {
display: flex;
padding-bottom: 15px;
/* width: 100%; */
/* border: 1px solid red; */
}
.table-key {
font-weight: 600;
width: 60px;
padding: 4px;
padding-top: 40px;
margin-top: -40px;
}
.table-val {
font-weight: 200;
color: #333;
padding: 4px;
}
.multiline {
margin-top: 15px;
flex-direction: column;
}
.multiline .table-key {
margin-bottom: 10px;
border-bottom: 1px dashed #dddddd;
/* padding: 4px; */
width: unset;
}
.index {
margin-top: 40px;
display: flex;
}
.index > section {
padding: 10px;
background-color: #e3e3e3;
max-width: 400px;
margin: 5px;
height: fit-content;
}
.index fieldset:not(:first-child) {
margin-top: 15px;
}
/* .index > section:not(:last-child) { */
/* margin-bottom: 10px; */
/* } */
.index > section > h2 {
margin-top: 0px;
}
.horizontal-list {
margin: 20px;
margin-top: 40px;
}
.horizontal-list ul {
display: flex;
margin: 0px;
padding: 0px;
flex-direction: column;
justify-content: flex-start;
}
.horizontal-list li {
list-style: none;
padding: 0px;
margin: 0px;
line-height: 18px;
min-width: 210px;
margin: 0px 20px;
cursor: pointer;
display: flex;
border-radius: 3px;
}
.horizontal-list li:hover {
background-color: #e9e9e9;
}
.horizontal-list li > *:not(:last-child) {
margin-right: 10px;
}
.horizontal-list li > a {
text-decoration: none;
color: inherit;
}
.horizontal-list li > .date {
font-weight: 200;
color: #686868;
min-width: 210px;
}
form .row {
padding: 5px 0;
}
.set-of-inputs {
flex-direction: column;
display: flex;
}
.set-of-inputs input:not(:last-child) {
margin-bottom: 3px;
}
+14
View File
@@ -0,0 +1,14 @@
;; Example climit.edn file
;; Required: permits
;; Optional: queue, ommited means Integer/MAX_VALUE
;; Optional: timeout, ommited means no timeout
;; Note: queue and timeout are excluding
{:update-file-by-id {:permits 1 :queue 3}
:update-file {:permits 20}
:derive-password {:permits 8}
:process-font {:permits 4 :queue 32}
:process-image {:permits 8 :queue 32}
:submit-audit-events-by-profile
{:permits 1 :queue 3}}
@@ -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 prototyping platform that will be embraced by multidisciplinary 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>
@@ -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 prototyping platform that will be embraced by multidisciplinary 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>
@@ -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 prototyping platform that will be embraced by multidisciplinary 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>
@@ -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 prototyping platform that will be embraced by multidisciplinary 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>
-195
View File
@@ -1,195 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>penpot - error report {{id}}</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono">
<style>
body {
margin: 0px;
padding: 0px;
}
pre {
margin: 0px;
}
* {
font-family: "JetBrains Mono", monospace;
font-size: 12px;
}
.table {
display: flex;
flex-direction: column;
margin: 10px;
}
.table-row {
display: flex;
/* width: 100%; */
/* border: 1px solid red; */
}
.table-key {
font-weight: 600;
width: 60px;
padding: 4px;
}
.table-val {
font-weight: 200;
color: #333;
padding: 4px;
}
.multiline {
margin-top: 15px;
flex-direction: column;
}
.multiline .table-key {
margin-bottom: 10px;
border-bottom: 1px dashed #dddddd;
/* padding: 4px; */
width: unset;
}
</style>
</head>
<body>
<div class="table">
<div class="table-row">
<div class="table-key" title="Error ID">ERID: </div>
<div class="table-val">{{id}}</div>
</div>
{% if profile-id %}
<div class="table-row">
<div class="table-key" title="Profile ID">PFID: </div>
<div class="table-val">{{profile-id}}</div>
</div>
{% endif %}
{% if user-agent %}
<div class="table-row">
<div class="table-key">UAGT: </div>
<div class="table-val">{{user-agent}}</div>
</div>
{% endif %}
{% if frontend-version %}
<div class="table-row">
<div class="table-key">FVER: </div>
<div class="table-val">{{frontend-version}}</div>
</div>
{% endif %}
<div class="table-row">
<div class="table-key">BVER: </div>
<div class="table-val">{{version}}</div>
</div>
{% if host %}
<div class="table-row">
<div class="table-key">HOST: </div>
<div class="table-val">{{host}}</div>
</div>
{% endif %}
{% if tenant %}
<div class="table-row">
<div class="table-key">ENV: </div>
<div class="table-val">{{tenant}}</div>
</div>
{% endif %}
{% if public-uri %}
<div class="table-row">
<div class="table-key">PURI: </div>
<div class="table-val">{{public-uri}}</div>
</div>
{% endif %}
{% if type %}
<div class="table-row">
<div class="table-key">TYPE: </div>
<div class="table-val">{{type}}</div>
</div>
{% endif %}
{% if code %}
<div class="table-row">
<div class="table-key">CODE: </div>
<div class="table-val">{{code}}</div>
</div>
{% endif %}
{% if error %}
<div class="table-row">
<div class="table-key">CLSS: </div>
<div class="table-val">{{error.class}}</div>
</div>
{% endif %}
{% if error %}
<div class="table-row">
<div class="table-key">HINT: </div>
<div class="table-val">{{error.message}}</div>
</div>
{% endif %}
{% if method %}
<div class="table-row">
<div class="table-key">PATH: </div>
<div class="table-val">{{method|upper}} {{path}}</div>
</div>
{% endif %}
{% if explain %}
<div>(<a href="#explain">go to explain</a>)</div>
{% endif %}
{% if data %}
<div>(<a href="#edata">go to edata</a>)</div>
{% endif %}
{% if error %}
<div>(<a href="#trace">go to trace</a>)</div>
{% endif %}
{% if params %}
<div id="params" class="table-row multiline">
<div class="table-key">PARAMS: </div>
<div class="table-val">
<pre>{{params}}</pre>
</div>
</div>
{% endif %}
{% if explain %}
<div id="explain" class="table-row multiline">
<div class="table-key">EXPLAIN: </div>
<div class="table-val">
<pre>{{explain}}</pre>
</div>
</div>
{% endif %}
{% if data %}
<div id="edata" class="table-row multiline">
<div class="table-key">EDATA: </div>
<div class="table-val">
<pre>{{data}}</pre>
</div>
</div>
{% endif %}
{% if error %}
<div id="trace" class="table-row multiline">
<div class="table-key">TRACE:</div>
<div class="table-val">
<pre>{{error.trace}}</pre>
</div>
</div>
{% endif %}
</div>
</body>
</html>
+15 -18
View File
@@ -2,32 +2,35 @@
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%t] %level{length=1} %logger{36} - %msg%n"/>
<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.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"/>
<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>
<JeroMQ name="zmq">
<Property name="endpoint">tcp://localhost:45556</Property>
<JsonLayout complete="false" compact="true" includeTimeMillis="true" stacktraceAsString="true" properties="true" />
</JeroMQ>
</Appenders>
<Loggers>
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="io.lettuce" level="error" />
<Logger name="org.eclipse.jetty" level="error" />
<Logger name="com.zaxxer.hikari" level="error"/>
<Logger name="org.postgresql" level="error" />
<Logger name="app.cli" level="debug" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.storage.tmp" level="debug" />
<Logger name="app.worker" level="info" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" 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.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
@@ -35,12 +38,6 @@
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="zmq" level="debug" />
</Logger>
<Logger name="penpot" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
<AppenderRef ref="zmq" level="debug" />
</Logger>
<Logger name="user" level="trace" additivity="false">
+6 -7
View File
@@ -2,19 +2,18 @@
<Configuration status="info" monitorInterval="60">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%t] %level{length=1} %logger{36} - %msg%n"/>
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="false" />
</Console>
</Appenders>
<Loggers>
<Logger name="io.lettuce" level="error" />
<Logger name="com.zaxxer.hikari" level="error" />
<Logger name="org.eclipse.jetty" level="error" />
<Logger name="org.postgresql" level="error" />
<Logger name="app" level="debug" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="penpot" level="fatal" additivity="false">
<Logger name="app.util" level="info" />
<Logger name="app" level="info" additivity="false">
<AppenderRef ref="console" />
</Logger>
+11
View File
@@ -0,0 +1,11 @@
;; Example rlimit.edn file
^{:refresh "30s"}
{:default
[[:default :window "200000/h"]]
;; #{:command/get-teams}
;; [[:burst :bucket "5/5/5s"]]
;; #{:command/get-profile}
;; [[:burst :bucket "60/60/1m"]]
}
+18 -74
View File
@@ -1,79 +1,23 @@
#!/usr/bin/env bb
#!/usr/bin/env bash
;; 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) UXBOX Labs SL
CURRENT_VERSION=$1;
(ns build
(:require
[clojure.string :as str]
[clojure.java.io :as io]
[clojure.pprint :refer [pprint]]
[babashka.fs :as fs]
[babashka.process :refer [$ check]]))
set -ex
(defn split-cp
[data]
(str/split data #":"))
rm -rf target;
mkdir -p target/classes;
mkdir -p target/dist;
echo "$CURRENT_VERSION" > target/classes/version.txt;
cp ../CHANGES.md target/classes/changelog.md;
(def classpath
(->> ($ clojure -Spath)
(check)
(:out)
(slurp)
(split-cp)
(map str/trim)))
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
(def classpath-jars
(let [xfm (filter #(str/ends-with? % ".jar"))]
(into #{} xfm classpath)))
(def classpath-paths
(let [xfm (comp (remove #(str/ends-with? % ".jar"))
(filter #(.isDirectory (io/file %))))]
(into #{} xfm classpath)))
(def version
(or (first *command-line-args*) "%version%"))
;; Clean previous dist
(-> ($ rm -rf "./target/dist") check)
;; Create a new dist
(-> ($ mkdir -p "./target/dist/deps") check)
;; Copy all jar deps into dist
(run! (fn [item] (-> ($ cp ~item "./target/dist/deps/") check)) classpath-jars)
;; Create the application jar
(spit "./target/dist/version.txt" version)
(-> ($ jar cvf "./target/dist/deps/app.jar" -C ~(first classpath-paths) ".") check)
(-> ($ jar uvf "./target/dist/deps/app.jar" -C "./target/dist" "version.txt") check)
(run! (fn [item]
(-> ($ jar uvf "./target/dist/deps/app.jar" -C ~item ".") check))
(rest classpath-paths))
;; Copy logging configuration
(-> ($ cp "./resources/log4j2.xml" "./target/dist/") check)
;; Create classpath file
(let [jars (->> (into ["app.jar"] classpath-jars)
(map fs/file-name)
(map #(fs/path "deps" %))
(map str))]
(spit "./target/dist/classpath" (str/join ":" jars)))
;; Copy run script template
(-> ($ cp "./scripts/run.template.sh" "./target/dist/run.sh") check)
;; Copy run script template
(-> ($ cp "./scripts/manage.template.sh" "./target/dist/manage.sh") check)
;; Add exec permisions to scripts.
(-> ($ chmod +x "./target/dist/run.sh") check)
(-> ($ chmod +x "./target/dist/manage.sh") check)
nil
# Prefetch
bb ./scripts/prefetch-templates.clj resources/app/onboarding.edn builtin-templates/
cp -r builtin-templates target/dist/
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -x
jcmd |grep "rebel" |sed -nE 's/^([0-9]+).*$/\1/p' | xargs kill -9
+219
View File
@@ -0,0 +1,219 @@
#!/usr/bin/env python3
#
# 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
import argparse
import json
import socket
import sys
from tabulate import tabulate
from getpass import getpass
from urllib.parse import urlparse
PREPL_URI = "tcp://localhost:6063"
def get_prepl_conninfo():
uri_data = urlparse(PREPL_URI)
if uri_data.scheme != "tcp":
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
if not isinstance(uri_data.netloc, str):
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
host, port = uri_data.netloc.split(":", 2)
if port is None:
port = 6063
if isinstance(port, str):
port = int(port)
return host, port
def send_eval(expr):
host, port = get_prepl_conninfo()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.send(expr.encode("utf-8"))
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 RuntimeError("unexpected response from PREPL")
return result.get("val", None), result.get("exception", None)
def encode(val):
return json.dumps(json.dumps(val))
def print_error(res):
for error in res["via"]:
print("ERR:", error["message"])
break
def run_cmd(params):
try:
expr = "(app.srepl.ext/run-json-cmd {})".format(encode(params))
res, failed = send_eval(expr)
if failed:
print_error(res)
sys.exit(-1)
return res
except Exception as cause:
print("EXC:", str(cause))
sys.exit(-2)
def create_profile(fullname, email, password):
params = {
"cmd": "create-profile",
"params": {
"fullname": fullname,
"email": email,
"password": password
}
}
res = run_cmd(params)
print(f"Created: {res['email']} / {res['id']}")
def update_profile(email, fullname, password, is_active):
params = {
"cmd": "update-profile",
"params": {
"email": email,
"fullname": fullname,
"password": password,
"is_active": is_active
}
}
res = run_cmd(params)
if res is True:
print(f"Updated")
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",
"params": {
"password": password,
}
}
res = run_cmd(params)
print(f"Derived password: \"{res}\"")
available_commands = (
"create-profile",
"update-profile",
"delete-profile",
"search-profile",
"derive-password",
)
parser = argparse.ArgumentParser(
description=(
"Penpot Command Line Interface (CLI)"
)
)
parser.add_argument("-V", "--version", action="version", version="Penpot CLI %%develop%%")
parser.add_argument("action", action="store", choices=available_commands)
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()
PREPL_URI = args.connect
if args.action == "create-profile":
email = args.email
password = args.password
fullname = args.fullname
if email is None:
email = input("Email: ")
if fullname is None:
fullname = input("Fullname: ")
if password is None:
password = getpass("Password: ")
create_profile(fullname, email, password)
elif args.action == "update-profile":
email = args.email
password = args.password
if email is None:
email = input("Email: ")
if password is None:
password = getpass("Password: ")
update_profile(email, None, password, None)
elif args.action == "derive-password":
password = args.password
if password is None:
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)
-19
View File
@@ -1,19 +0,0 @@
#!/usr/bin/env bash
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
fi
if [ -f ./environ ]; then
source ./environ
fi
exec $JAVA_CMD $JVM_OPTS -classpath $(cat classpath) -Dlog4j2.configurationFile=./log4j2.xml clojure.main -m app.cli.manage "$@"
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env bb
(require '[babashka.curl :as curl]
'[babashka.fs :as fs])
(defn download-if-needed!
[dest data]
(doseq [{:keys [id file-uri] :as item} data]
(let [file (fs/file dest id)
rsp (curl/get file-uri {:as :stream})]
(when (not= 200 (:status rsp))
(println (format "unable to download %s (uri: %s)" id file-uri))
(System/exit -1))
(when-not (fs/exists? (str file))
(println (format "=> downloading %s" id))
(with-open [output (io/output-stream file)]
(io/copy (:body rsp) output))))))
(defn read-defs-file
[path]
(with-open [content (io/reader path)]
(edn/read-string (slurp content))))
(let [[path dest] *command-line-args*]
(when (or (nil? path)
(nil? dest))
(println "invalid arguments")
(System/exit -1))
(when-not (fs/exists? path)
(println (format "file %s does not exists" path))
(System/exit -1))
(when-not (fs/exists? dest)
(fs/create-dirs dest))
(let [data (read-defs-file path)]
(download-if-needed! dest data)))
+83 -4
View File
@@ -1,10 +1,89 @@
#!/usr/bin/env bash
export PENPOT_FLAGS="enable-asserts enable-audit-log $PENPOT_FLAGS"
export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-registration
enable-login-with-password
enable-login-with-oidc \
enable-login-with-google \
enable-login-with-github \
enable-login-with-gitlab \
enable-backend-asserts \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
disable-secure-session-cookies \
enable-smtp \
enable-prepl-server \
enable-urepl-server \
enable-rpc-climit \
enable-rpc-rlimit \
enable-soft-rpc-rlimit \
enable-webhooks \
enable-access-tokens";
export OPTIONS="-A:jmx-remote:dev -J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -J-Dlog4j2.configurationFile=log4j2-devenv.xml -J-Djdk.attach.allowAttachSelf -J-XX:+UseZGC -J-XX:ConcGCThreads=1 -J-XX:-OmitStackTraceInFastThrow -J-Xms50m -J-Xmx512m";
# export OPTIONS="$OPTIONS -J-XX:+UnlockDiagnosticVMOptions";
# export OPTIONS="$OPTIONS -J-XX:-TieredCompilation -J-XX:CompileThreshold=10000";
# export PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot"
# export PENPOT_DATABASE_USERNAME="penpot"
# export PENPOT_DATABASE_PASSWORD="penpot"
# export PENPOT_DATABASE_READONLY=true
# export PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot_pre"
# export PENPOT_DATABASE_USERNAME="penpot_pre"
# export PENPOT_DATABASE_PASSWORD="penpot_pre"
# export PENPOT_LOGGERS_LOKI_URI="http://172.17.0.1:3100/loki/api/v1/push"
# 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
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
#-J-Djdk.virtualThreadScheduler.parallelism=16
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-devenv.xml \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full \
-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"
# export OPTIONS_EVAL="(set! *warn-on-reflection* true)"
+15 -11
View File
@@ -1,20 +1,24 @@
#!/usr/bin/env bash
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
fi
fi
if [ -f ./environ ]; then
source ./environ
source ./environ
fi
export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS"
set -x
exec $JAVA_CMD $JVM_OPTS -classpath "$(cat classpath)" -Dlog4j2.configurationFile=./log4j2.xml "$@" clojure.main -m app.main
exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m app.main
+16 -1
View File
@@ -1,6 +1,21 @@
#!/usr/bin/env bash
export PENPOT_FLAGS="$PENPOT_FLAGS enable-asserts"
export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-prepl-server \
enable-urepl-server \
enable-webhooks \
enable-backend-asserts \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
disable-secure-session-cookies \
enable-smtp \
enable-webhooks";
set -ex
+29
View File
@@ -0,0 +1,29 @@
;; 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.auth
(:require
[buddy.hashers :as hashers]
[promesa.exec :as px]))
(def default-params
{:alg :argon2id
:memory (* 32768 2)
:iterations 5
:parallelism (px/get-available-processors)})
(defn derive-password
[password]
(hashers/derive password default-params))
(defn verify-password
[attempt password]
(try
(hashers/verify attempt password)
(catch Throwable _
{:update false
:valid false})))
+139
View File
@@ -0,0 +1,139 @@
;; 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.auth.ldap
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[clj-ldap.client :as ldap]
[clojure.spec.alpha :as s]
[clojure.string]
[integrant.core :as ig]))
(defn- prepare-params
[cfg]
{:ssl? (:ssl cfg)
:startTLS? (:tls cfg)
:bind-dn (:bind-dn cfg)
:password (:bind-password cfg)
:host {:address (:host cfg)
:port (:port cfg)}})
(defn- connect
"Connects to the LDAP provider and returns a connection. An
exception is raised if no connection is possible."
^java.lang.AutoCloseable
[cfg]
(try
(-> cfg prepare-params ldap/connect)
(catch Throwable cause
(ex/raise :type :restriction
:code :unable-to-connect-to-ldap
:hint "unable to connect to ldap server"
:cause cause))))
(defn- replace-several [s & {:as replacements}]
(reduce-kv clojure.string/replace s replacements))
(defn- search-user
[{:keys [::conn base-dn] :as cfg} email]
(let [query (replace-several (:query cfg) ":username" email)
attrs [(:attrs-username cfg)
(:attrs-email cfg)
(:attrs-fullname cfg)]
params {:filter query
:sizelimit 1
:attributes attrs}]
(first (ldap/search conn base-dn params))))
(defn- retrieve-user
[{:keys [::conn] :as cfg} {:keys [email password]}]
(when-let [{:keys [dn] :as user} (search-user cfg email)]
(when (ldap/bind? conn dn password)
{:fullname (get user (-> cfg :attrs-fullname keyword))
:email email
:backend "ldap"})))
(s/def ::fullname ::us/not-empty-string)
(s/def ::email ::us/email)
(s/def ::backend ::us/not-empty-string)
(s/def ::info-data
(s/keys :req-un [::fullname ::email ::backend]))
(defn authenticate
[cfg params]
(with-open [conn (connect cfg)]
(when-let [user (-> (assoc cfg ::conn conn)
(retrieve-user params))]
(when-not (s/valid? ::info-data user)
(let [explain (s/explain-str ::info-data user)]
(l/warn ::l/raw (str "invalid response from ldap, looks like ldap is not configured correctly\n" explain))
(ex/raise :type :restriction
:code :wrong-ldap-response
:explain explain)))
user)))
(defn- try-connectivity
[cfg]
;; If we have ldap parameters, try to establish connection
(when (and (:bind-dn cfg)
(:bind-password cfg)
(:host cfg)
(:port cfg))
(try
(with-open [_ (connect cfg)]
(l/info :hint "provider initialized"
:provider "ldap"
:host (:host cfg)
:port (:port cfg)
:tls? (:tls cfg)
:ssl? (:ssl cfg)
:bind-dn (:bind-dn cfg)
:base-dn (:base-dn cfg)
:query (:query cfg))
cfg)
(catch Throwable cause
(l/error :hint "unable to connect to LDAP server (LDAP auth provider disabled)"
:host (:host cfg) :port (:port cfg) :cause cause)
nil))))
(s/def ::enabled? ::us/boolean)
(s/def ::host ::cf/ldap-host)
(s/def ::port ::cf/ldap-port)
(s/def ::ssl ::cf/ldap-ssl)
(s/def ::tls ::cf/ldap-starttls)
(s/def ::query ::cf/ldap-user-query)
(s/def ::base-dn ::cf/ldap-base-dn)
(s/def ::bind-dn ::cf/ldap-bind-dn)
(s/def ::bind-password ::cf/ldap-bind-password)
(s/def ::attrs-email ::cf/ldap-attrs-email)
(s/def ::attrs-fullname ::cf/ldap-attrs-fullname)
(s/def ::attrs-username ::cf/ldap-attrs-username)
(s/def ::provider-params
(s/keys :opt-un [::host ::port
::ssl ::tls
::enabled?
::bind-dn
::bind-password
::query
::attrs-email
::attrs-username
::attrs-fullname]))
(s/def ::provider
(s/nilable ::provider-params))
(defmethod ig/pre-init-spec ::provider
[_]
(s/spec ::provider))
(defmethod ig/init-key ::provider
[_ cfg]
(when (:enabled? cfg)
(try-connectivity cfg)))
+565
View File
@@ -0,0 +1,565 @@
;; 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.auth.oidc
"OIDC client implementation."
(:require
[app.auth.oidc.providers :as-alias providers]
[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.uri :as u]
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.http.session :as session]
[app.loggers.audit :as audit]
[app.main :as-alias main]
[app.rpc.commands.profile :as profile]
[app.tokens :as tokens]
[app.util.json :as json]
[app.util.time :as dt]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[yetti.response :as-alias yrs]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- obfuscate-string
[s]
(if (< (count s) 10)
(apply str (take (count s) (repeat "*")))
(str (subs s 0 5)
(apply str (take (- (count s) 5) (repeat "*"))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OIDC PROVIDER (GENERIC)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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)
(= 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)
{:token-uri token-uri
:auth-uri auth-uri
:user-uri user-uri})
:else
(do
(l/warn :hint "unable to discover OIDC configuration"
:uri (str discovery-uri)
:response-status-code (:status response))
nil))))
(defn- prepare-oidc-opts
[cfg]
(let [opts {:base-uri (cf/get :oidc-base-uri)
:client-id (cf/get :oidc-client-id)
:client-secret (cf/get :oidc-client-secret)
:token-uri (cf/get :oidc-token-uri)
:auth-uri (cf/get :oidc-auth-uri)
:user-uri (cf/get :oidc-user-uri)
:scopes (cf/get :oidc-scopes #{"openid" "profile" "email"})
:roles-attr (cf/get :oidc-roles-attr)
:roles (cf/get :oidc-roles)
:name "oidc"}
opts (d/without-nils opts)]
(when (and (string? (:base-uri opts))
(string? (:client-id opts))
(string? (:client-secret opts)))
(if (and (string? (:token-uri opts))
(string? (:user-uri opts))
(string? (:auth-uri opts)))
opts
(some-> (discover-oidc-config cfg opts)
(merge opts {:discover? true}))))))
(defmethod ig/pre-init-spec ::providers/generic [_]
(s/keys :req [::http/client]))
(defmethod ig/init-key ::providers/generic
[_ cfg]
(when (contains? cf/flags :login-with-oidc)
(if-let [opts (prepare-oidc-opts cfg)]
(do
(l/info :hint "provider initialized"
:provider "oidc"
:method (if (:discover? opts) "discover" "manual")
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts))
:scopes (str/join "," (:scopes opts))
:auth-uri (:auth-uri opts)
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:roles-attr (:roles-attr opts)
:roles (:roles opts))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "oidc")
nil))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GOOGLE AUTH PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/init-key ::providers/google
[_ _]
(let [opts {:client-id (cf/get :google-client-id)
:client-secret (cf/get :google-client-secret)
:scopes #{"openid" "email" "profile"}
:auth-uri "https://accounts.google.com/o/oauth2/v2/auth"
:token-uri "https://oauth2.googleapis.com/token"
:user-uri "https://openidconnect.googleapis.com/v1/userinfo"
:name "google"}]
(when (contains? cf/flags :login-with-google)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
: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")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GITHUB AUTH PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- retrieve-github-email
[cfg tdata props]
(or (some-> props :github/email)
(let [params {:uri "https://api.github.com/user/emails"
:headers {"Authorization" (dm/str (:type tdata) " " (:token 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]))
(defmethod ig/init-key ::providers/github
[_ cfg]
(let [opts {:client-id (cf/get :github-client-id)
:client-secret (cf/get :github-client-secret)
:scopes #{"read:user" "user:email"}
:auth-uri "https://github.com/login/oauth/authorize"
:token-uri "https://github.com/login/oauth/access_token"
:user-uri "https://api.github.com/user"
:name "github"
;; Additional hooks for provider specific way of
;; retrieve emails.
: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"
: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")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GITLAB AUTH PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/init-key ::providers/gitlab
[_ _]
(let [base (cf/get :gitlab-base-uri "https://gitlab.com")
opts {:base-uri base
:client-id (cf/get :gitlab-client-id)
:client-secret (cf/get :gitlab-client-secret)
:scopes #{"openid" "profile" "email"}
:auth-uri (str base "/oauth/authorize")
:token-uri (str base "/oauth/token")
:user-uri (str base "/oauth/userinfo")
:name "gitlab"}]
(when (contains? cf/flags :login-with-gitlab)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
: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")
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))]
(str (assoc public :path (str "/api/auth/oauth/" (:name provider) "/callback")))))
(defn- build-auth-uri
[{:keys [provider] :as cfg} state]
(let [params {:client_id (:client-id provider)
:redirect_uri (build-redirect-uri cfg)
:response_type "code"
:state state
:scope (str/join " " (:scopes provider []))}
query (u/map->query-string params)]
(-> (u/uri (:auth-uri provider))
(assoc :query query)
(str))))
(defn- qualify-props
[provider props]
(reduce-kv (fn [result k v]
(assoc result (keyword (:name provider) (name k)) v))
{}
props))
(defn retrieve-access-token
[{:keys [provider] :as cfg} code]
(let [params {:client_id (:client-id provider)
:client_secret (:client-secret provider)
:code code
:grant_type "authorization_code"
:redirect_uri (build-redirect-uri cfg)}
req {:method :post
:headers {"content-type" "application/x-www-form-urlencoded"
"accept" "application/json"}
:uri (:token-uri provider)
:body (u/map->query-string params)}]
(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))
(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 (get data :access_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- retrieve-user-info
[{:keys [provider] :as cfg} tdata]
(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 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 [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]
(let [info (-> response :body json/decode)
props (qualify-props provider info)
email (get-email props)]
{:backend (:name provider)
:fullname (or (get-name props) email)
:email email
:props props}))]
(l/trace :hint "request user info"
:uri (:user-uri provider)
:token (obfuscate-string (:token tdata))
:token-type (:type tdata))
(let [request {:uri (:user-uri provider)
:headers {"Authorization" (str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get}
response (http/req! cfg request {: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)))
(let [info (process-response response)]
(l/trace :hint "authentication info" :info info)
(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 :incomplete-user-info
:hint "inconmplete user info"
:info info))
info))))
(s/def ::backend ::us/not-empty-string)
(s/def ::email ::us/not-empty-string)
(s/def ::fullname ::us/not-empty-string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::info
(s/keys :req-un [::backend
::email
::fullname
::props]))
(defn get-info
[{:keys [provider] :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)))
(let [state (get params :state)
code (get params :code)
state (tokens/verify (::main/props cfg) {:token state :iss :oauth})
token (retrieve-access-token cfg code)
info (retrieve-user-info cfg token)]
;; If the provider is OIDC, we can proceed to check
;; roles if they are defined.
(when (and (= "oidc" (:name provider))
(seq (:roles provider)))
(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/get-profile-by-email conn))))
(defn- redirect-response
[uri]
{::yrs/status 302
::yrs/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)})))]
(redirect-response uri)))
(defn- generate-redirect
[cfg request info profile]
(if profile
(let [sxf (session/create-fn cfg (:id profile))
token (or (:invitation-token info)
(tokens/generate (::main/props cfg)
{:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
params {:token token}
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/verify-token")
(assoc :query (u/map->query-string params)))]
(when (:is-blocked profile)
(ex/raise :type :restriction
:code :profile-blocked))
(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))))
(defn- auth-handler
[cfg {:keys [params] :as request}]
(let [props (audit/extract-utm-params params)
state (tokens/generate (::main/props cfg)
{:iss :oauth
:invitation-token (:invitation-token params)
:props props
:exp (dt/in-future "4h")})
uri (build-auth-uri cfg state)]
{::yrs/status 200
::yrs/body {:redirect-uri uri}}))
(defn- callback-handler
[cfg request]
(try
(let [info (get-info cfg request)
profile (get-profile cfg info)]
(generate-redirect cfg request info profile))
(catch Throwable cause
(l/error :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))))
(def provider-lookup
{:compile
(fn [& _]
(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)
(ex/raise :type :restriction
:code :provider-not-configured
:provider provider
:hint "provider not configured"))))))})
(s/def ::client-id ::cf/oidc-client-id)
(s/def ::client-secret ::cf/oidc-client-secret)
(s/def ::base-uri ::cf/oidc-base-uri)
(s/def ::token-uri ::cf/oidc-token-uri)
(s/def ::auth-uri ::cf/oidc-auth-uri)
(s/def ::user-uri ::cf/oidc-user-uri)
(s/def ::scopes ::cf/oidc-scopes)
(s/def ::roles ::cf/oidc-roles)
(s/def ::roles-attr ::cf/oidc-roles-attr)
(s/def ::email-attr ::cf/oidc-email-attr)
(s/def ::name-attr ::cf/oidc-name-attr)
;; FIXME: migrate to qualified-keywords
(s/def ::provider
(s/keys :req-un [::client-id
::client-secret]
:opt-un [::base-uri
::token-uri
::auth-uri
::user-uri
::scopes
::roles
::roles-attr
::email-attr
::name-attr]))
(s/def ::providers (s/map-of ::us/keyword (s/nilable ::provider)))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes
[_]
(s/keys :req [::session/manager
::http/client
::main/props
::db/pool
::providers]))
(defmethod ig/init-key ::routes
[_ cfg]
(let [cfg (update cfg :provider d/without-nils)]
["" {:middleware [[session/authz cfg]
[provider-lookup cfg]]}
["/auth/oauth"
["/:provider"
{:handler auth-handler
:allowed-methods #{:post}}]
["/:provider/callback"
{:handler callback-handler
:allowed-methods #{:get}}]]]))
-169
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) UXBOX Labs SL
(ns app.cli.manage
"A manage cli api."
(:require
[app.common.logging :as l]
[app.db :as db]
[app.main :as main]
[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)]
(->> (profile/create-profile conn
{:fullname fullname
:email email
:password password
:is-active true
:is-demo false})
(profile/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 "Dont' 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)]
;; (pp/pprint opts)
(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)))))
-129
View File
@@ -1,129 +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) UXBOX Labs SL
(ns app.cli.migrate-media
(:require
[app.common.logging :as l]
[app.common.media :as cm]
[app.config :as cf]
[app.db :as db]
[app.main :as main]
[app.storage :as sto]
[cuerdas.core :as str]
[datoteka.core :as fs]
[integrant.core :as ig]))
(declare migrate-profiles)
(declare migrate-teams)
(declare migrate-file-media)
(defn run-in-system
[system]
(db/with-atomic [conn (:app.db/pool system)]
(let [system (assoc system ::conn conn)]
(migrate-profiles system)
(migrate-teams system)
(migrate-file-media system))
system))
(defn run
[]
(let [config (select-keys main/system-config
[:app.db/pool
:app.migrations/migrations
:app.metrics/metrics
:app.storage.s3/backend
:app.storage.db/backend
:app.storage.fs/backend
:app.storage/storage])]
(ig/load-namespaces config)
(try
(-> (ig/prep config)
(ig/init)
(run-in-system)
(ig/halt!))
(catch Exception e
(l/error :hint "unhandled exception" :cause e)))))
;; --- IMPL
(defn migrate-profiles
[{:keys [::conn] :as system}]
(letfn [(retrieve-profiles [conn]
(->> (db/exec! conn ["select * from profile"])
(filter #(not (str/empty? (:photo %))))
(seq)))]
(let [base (fs/path (cf/get :storage-fs-old-directory))
storage (-> (:app.storage/storage system)
(assoc :conn conn))]
(doseq [profile (retrieve-profiles conn)]
(let [path (fs/path (:photo profile))
full (-> (fs/join base path)
(fs/normalize))
ext (fs/ext path)
mtype (cm/format->mtype (keyword ext))
obj (sto/put-object storage {:content (sto/content full)
:content-type mtype})]
(db/update! conn :profile
{:photo-id (:id obj)}
{:id (:id profile)}))))))
(defn migrate-teams
[{:keys [::conn] :as system}]
(letfn [(retrieve-teams [conn]
(->> (db/exec! conn ["select * from team"])
(filter #(not (str/empty? (:photo %))))
(seq)))]
(let [base (fs/path (cf/get :storage-fs-old-directory))
storage (-> (:app.storage/storage system)
(assoc :conn conn))]
(doseq [team (retrieve-teams conn)]
(let [path (fs/path (:photo team))
full (-> (fs/join base path)
(fs/normalize))
ext (fs/ext path)
mtype (cm/format->mtype (keyword ext))
obj (sto/put-object storage {:content (sto/content full)
:content-type mtype})]
(db/update! conn :team
{:photo-id (:id obj)}
{:id (:id team)}))))))
(defn migrate-file-media
[{:keys [::conn] :as system}]
(letfn [(retrieve-media-objects [conn]
(->> (db/exec! conn ["select fmo.id, fmo.path, fth.path as thumbnail_path
from file_media_object as fmo
join file_media_thumbnail as fth on (fth.media_object_id = fmo.id)"])
(seq)))]
(let [base (fs/path (cf/get :storage-fs-old-directory))
storage (-> (:app.storage/storage system)
(assoc :conn conn))]
(doseq [mobj (retrieve-media-objects conn)]
(let [img-path (fs/path (:path mobj))
thm-path (fs/path (:thumbnail-path mobj))
img-path (-> (fs/join base img-path)
(fs/normalize))
thm-path (-> (fs/join base thm-path)
(fs/normalize))
img-ext (fs/ext img-path)
thm-ext (fs/ext thm-path)
img-mtype (cm/format->mtype (keyword img-ext))
thm-mtype (cm/format->mtype (keyword thm-ext))
img-obj (sto/put-object storage {:content (sto/content img-path)
:content-type img-mtype})
thm-obj (sto/put-object storage {:content (sto/content thm-path)
:content-type thm-mtype})]
(db/update! conn :file-media-object
{:media-id (:id img-obj)
:thumbnail-id (:id thm-obj)}
{:id (:id mobj)}))))))
+132 -76
View File
@@ -2,7 +2,7 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.config
"A configuration management."
@@ -19,6 +19,7 @@
[clojure.pprint :as pprint]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.fs :as fs]
[environ.core :refer [env]]
[integrant.core :as ig]))
@@ -26,6 +27,10 @@
clojure.lang.IRecord
clojure.lang.IDeref)
(prefer-method print-method
clojure.lang.IPersistentMap
clojure.lang.IDeref)
(prefer-method pprint/simple-dispatch
clojure.lang.IPersistentMap
clojure.lang.IDeref)
@@ -41,30 +46,28 @@
data))
(def defaults
{:http-server-port 6060
:host "devenv"
:tenant "dev"
:database-uri "postgresql://postgres/penpot"
{:database-uri "postgresql://postgres/penpot"
:database-username "penpot"
:database-password "penpot"
:default-blob-version 3
:loggers-zmq-uri "tcp://localhost:45556"
:default-blob-version 5
:rpc-rlimit-config (fs/path "resources/rlimit.edn")
:rpc-climit-config (fs/path "resources/climit.edn")
:file-change-snapshot-every 5
:file-change-snapshot-timeout "3h"
:public-uri "http://localhost:3449"
:redis-uri "redis://redis/0"
:host "localhost"
:tenant "default"
:srepl-host "127.0.0.1"
:srepl-port 6062
:redis-uri "redis://redis/0"
:assets-storage-backend :assets-fs
:storage-assets-fs-directory "assets"
:assets-path "/internal/assets/"
:rlimits-password 10
:rlimits-image 2
:smtp-default-reply-to "Penpot <no-reply@example.com>"
:smtp-default-from "Penpot <no-reply@example.com>"
@@ -80,22 +83,36 @@
:ldap-attrs-username "uid"
:ldap-attrs-email "mail"
:ldap-attrs-fullname "cn"
:ldap-attrs-photo "jpegPhoto"
;; a server prop key where initial project is stored.
:initial-project-skey "initial-project"})
(s/def ::flags ::us/set-of-keywords)
(s/def ::default-rpc-rlimit ::us/vector-of-strings)
(s/def ::rpc-rlimit-config ::fs/path)
(s/def ::rpc-climit-config ::fs/path)
;; DEPRECATED PROPERTIES: should be removed in 1.10
(s/def ::registration-enabled ::us/boolean)
(s/def ::smtp-enabled ::us/boolean)
(s/def ::media-max-file-size ::us/integer)
(s/def ::flags ::us/vector-of-keywords)
(s/def ::telemetry-enabled ::us/boolean)
(s/def ::asserts-enabled ::us/boolean)
;; END DEPRECATED
(s/def ::audit-log-archive-uri ::us/string)
(s/def ::audit-log-gc-max-age ::dt/duration)
(s/def ::audit-log-http-handler-concurrency ::us/integer)
(s/def ::admins ::us/set-of-valid-emails)
(s/def ::file-change-snapshot-every ::us/integer)
(s/def ::file-change-snapshot-timeout ::dt/duration)
(s/def ::default-executor-parallelism ::us/integer)
(s/def ::scheduled-executor-parallelism ::us/integer)
(s/def ::worker-default-parallelism ::us/integer)
(s/def ::worker-webhook-parallelism ::us/integer)
(s/def ::authenticated-cookie-domain ::us/string)
(s/def ::authenticated-cookie-name ::us/string)
(s/def ::auth-token-cookie-name ::us/string)
(s/def ::auth-token-cookie-max-age ::dt/duration)
(s/def ::secret-key ::us/string)
(s/def ::allow-demo-users ::us/boolean)
@@ -103,6 +120,21 @@
(s/def ::database-password (s/nilable ::us/string))
(s/def ::database-uri ::us/string)
(s/def ::database-username (s/nilable ::us/string))
(s/def ::database-readonly ::us/boolean)
(s/def ::database-min-pool-size ::us/integer)
(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)
(s/def ::quotes-files-per-project ::us/integer)
(s/def ::quotes-files-per-team ::us/integer)
(s/def ::quotes-font-variants-per-team ::us/integer)
(s/def ::quotes-comment-threads-per-file ::us/integer)
(s/def ::quotes-comments-per-file ::us/integer)
(s/def ::default-blob-version ::us/integer)
(s/def ::error-report-webhook ::us/string)
(s/def ::user-feedback-destination ::us/string)
@@ -119,18 +151,20 @@
(s/def ::oidc-token-uri ::us/string)
(s/def ::oidc-auth-uri ::us/string)
(s/def ::oidc-user-uri ::us/string)
(s/def ::oidc-scopes ::us/set-of-str)
(s/def ::oidc-roles ::us/set-of-str)
(s/def ::oidc-roles-attr ::us/keyword)
(s/def ::oidc-scopes ::us/set-of-strings)
(s/def ::oidc-roles ::us/set-of-strings)
(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-session-idle-max-age ::dt/duration)
(s/def ::http-session-updater-batch-max-age ::dt/duration)
(s/def ::http-session-updater-batch-max-size ::us/integer)
(s/def ::initial-project-skey ::us/string)
(s/def ::http-server-host ::us/string)
(s/def ::http-server-max-body-size ::us/integer)
(s/def ::http-server-max-multipart-body-size ::us/integer)
(s/def ::http-server-io-threads ::us/integer)
(s/def ::http-server-worker-threads ::us/integer)
(s/def ::ldap-attrs-email ::us/string)
(s/def ::ldap-attrs-fullname ::us/string)
(s/def ::ldap-attrs-photo ::us/string)
(s/def ::ldap-attrs-username ::us/string)
(s/def ::ldap-base-dn ::us/string)
(s/def ::ldap-bind-dn ::us/string)
@@ -140,8 +174,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)
@@ -150,9 +182,8 @@
(s/def ::profile-complaint-threshold ::us/integer)
(s/def ::public-uri ::us/string)
(s/def ::redis-uri ::us/string)
(s/def ::registration-domain-whitelist ::us/set-of-str)
(s/def ::rlimits-image ::us/integer)
(s/def ::rlimits-password ::us/integer)
(s/def ::registration-domain-whitelist ::us/set-of-strings)
(s/def ::smtp-default-from ::us/string)
(s/def ::smtp-default-reply-to ::us/string)
(s/def ::smtp-host ::us/string)
@@ -161,36 +192,45 @@
(s/def ::smtp-ssl ::us/boolean)
(s/def ::smtp-tls ::us/boolean)
(s/def ::smtp-username (s/nilable ::us/string))
(s/def ::srepl-host ::us/string)
(s/def ::srepl-port ::us/integer)
(s/def ::urepl-host ::us/string)
(s/def ::urepl-port ::us/integer)
(s/def ::prepl-host ::us/string)
(s/def ::prepl-port ::us/integer)
(s/def ::assets-storage-backend ::us/keyword)
(s/def ::fdata-storage-backend ::us/keyword)
(s/def ::storage-assets-fs-directory ::us/string)
(s/def ::storage-assets-s3-bucket ::us/string)
(s/def ::storage-assets-s3-region ::us/keyword)
(s/def ::storage-fdata-s3-bucket ::us/string)
(s/def ::storage-fdata-s3-region ::us/keyword)
(s/def ::storage-fdata-s3-prefix ::us/string)
(s/def ::storage-assets-s3-endpoint ::us/string)
(s/def ::telemetry-uri ::us/string)
(s/def ::telemetry-with-taiga ::us/boolean)
(s/def ::tenant ::us/string)
(s/def ::sentry-trace-sample-rate ::us/number)
(s/def ::sentry-attach-stack-trace ::us/boolean)
(s/def ::sentry-debug ::us/boolean)
(s/def ::sentry-dsn ::us/string)
(s/def ::config
(s/keys :opt-un [::secret-key
::flags
::admins
::allow-demo-users
::audit-log-archive-uri
::audit-log-gc-max-age
::audit-log-http-handler-concurrency
::auth-token-cookie-name
::auth-token-cookie-max-age
::authenticated-cookie-name
::authenticated-cookie-domain
::database-password
::database-uri
::database-username
::database-readonly
::database-min-pool-size
::database-max-pool-size
::default-blob-version
::default-rpc-rlimit
::error-report-webhook
::default-executor-parallelism
::scheduled-executor-parallelism
::worker-default-parallelism
::worker-webhook-parallelism
::file-change-snapshot-every
::file-change-snapshot-timeout
::user-feedback-destination
::github-client-id
::github-client-secret
@@ -207,16 +247,18 @@
::oidc-user-uri
::oidc-scopes
::oidc-roles-attr
::oidc-email-attr
::oidc-name-attr
::oidc-roles
::host
::http-server-host
::http-server-port
::http-session-idle-max-age
::http-session-updater-batch-max-age
::http-session-updater-batch-max-size
::initial-project-skey
::http-server-max-body-size
::http-server-max-multipart-body-size
::http-server-io-threads
::http-server-worker-threads
::ldap-attrs-email
::ldap-attrs-fullname
::ldap-attrs-photo
::ldap-attrs-username
::ldap-base-dn
::ldap-bind-dn
@@ -227,41 +269,52 @@
::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
::profile-complaint-max-age
::profile-complaint-threshold
::public-uri
::quotes-teams-per-profile
::quotes-access-tokens-per-profile
::quotes-projects-per-team
::quotes-invitations-per-team
::quotes-profiles-per-team
::quotes-files-per-project
::quotes-files-per-team
::quotes-font-variants-per-team
::quotes-comment-threads-per-file
::quotes-comments-per-file
::redis-uri
::registration-domain-whitelist
::registration-enabled
::rlimits-image
::rlimits-password
::sentry-dsn
::sentry-debug
::sentry-attach-stack-trace
::sentry-trace-sample-rate
::rpc-rlimit-config
::semaphore-process-font
::semaphore-process-image
::semaphore-update-file
::semaphore-auth
::smtp-default-from
::smtp-default-reply-to
::smtp-enabled
::smtp-host
::smtp-password
::smtp-port
::smtp-ssl
::smtp-tls
::smtp-username
::srepl-host
::srepl-port
::urepl-host
::urepl-port
::prepl-host
::prepl-port
::assets-storage-backend
::storage-assets-fs-directory
::storage-assets-s3-bucket
::storage-assets-s3-region
::fdata-storage-backend
::storage-fdata-s3-bucket
::storage-fdata-s3-region
::storage-fdata-s3-prefix
::storage-assets-s3-endpoint
::telemetry-enabled
::telemetry-uri
::telemetry-referer
@@ -269,9 +322,11 @@
::tenant]))
(def default-flags
[:enable-backend-asserts
:enable-backend-api-doc
:enable-secure-session-cookies])
[:enable-backend-api-doc
:enable-backend-openapi-doc
:enable-backend-worker
:enable-secure-session-cookies
:enable-email-verification])
(defn- parse-flags
[config]
@@ -298,11 +353,12 @@
(merge defaults)
(us/conform ::config))
(catch Throwable e
(when (ex/ex-info? e)
(when (ex/error? e)
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")
(println "Error on validating configuration:")
(println (:explain (ex-data e))
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")))
(println (some-> e ex-data ex/explain))
(println (ex/explain (ex-data e)))
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"))
(throw e))))
(def version
@@ -311,8 +367,8 @@
(str/trim))
"%version%")))
(def ^:dynamic config (read-config))
(def ^:dynamic flags (parse-flags config))
(defonce ^:dynamic config (read-config))
(defonce ^:dynamic flags (parse-flags config))
(def deletion-delay
(dt/duration {:days 7}))
+226 -141
View File
@@ -2,9 +2,10 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.db
(:refer-clojure :exclude [get])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
@@ -16,7 +17,6 @@
[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.spec.alpha :as s]
@@ -27,14 +27,17 @@
com.zaxxer.hikari.HikariConfig
com.zaxxer.hikari.HikariDataSource
com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory
java.lang.AutoCloseable
io.whitfin.siphash.SipHasher
io.whitfin.siphash.SipHasherContainer
java.io.InputStream
java.io.OutputStream
java.sql.Connection
java.sql.Savepoint
org.postgresql.PGConnection
org.postgresql.geometric.PGpoint
org.postgresql.jdbc.PgArray
org.postgresql.largeobject.LargeObject
org.postgresql.largeobject.LargeObjectManager
org.postgresql.jdbc.PgArray
org.postgresql.util.PGInterval
org.postgresql.util.PGobject))
@@ -45,86 +48,96 @@
;; Initialization
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare instrument-jdbc!)
(declare apply-migrations!)
(s/def ::connection-timeout ::us/integer)
(s/def ::max-size ::us/integer)
(s/def ::min-size ::us/integer)
(s/def ::name keyword?)
(s/def ::password ::us/string)
(s/def ::uri ::us/not-empty-string)
(s/def ::min-pool-size ::us/integer)
(s/def ::max-pool-size ::us/integer)
(s/def ::migrations map?)
(s/def ::read-only ::us/boolean)
(s/def ::username ::us/string)
(s/def ::validation-timeout ::us/integer)
(s/def ::read-only? ::us/boolean)
(defmethod ig/pre-init-spec ::pool [_]
(s/keys :req-un [::uri ::name ::min-pool-size ::max-pool-size]
:opt-un [::migrations ::mtx/metrics ::read-only]))
(s/def ::pool-options
(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})
(defmethod ig/prep-key ::pool
[_ cfg]
(merge defaults (d/without-nils cfg)))
;; Don't validate here, just validate that a map is received.
(defmethod ig/pre-init-spec ::pool [_] ::pool-options)
(defmethod ig/init-key ::pool
[_ {:keys [migrations metrics name] :as cfg}]
(l/info :action "initialize connection pool" :name (d/name name) :uri (:uri cfg))
(some-> metrics :registry instrument-jdbc!)
(let [pool (create-pool cfg)]
(some->> (seq migrations) (apply-migrations! pool))
pool))
[_ {: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]
(.close ^HikariDataSource pool))
(defn- instrument-jdbc!
[registry]
(mtx/instrument-vars!
[#'next.jdbc/execute-one!
#'next.jdbc/execute!]
{:registry registry
:type :counter
:name "database_query_total"
:help "An absolute counter of database queries."}))
(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}))))
(when pool
(.close ^HikariDataSource pool)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; API & Impl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def initsql
(str "SET statement_timeout = 200000;\n"
"SET idle_in_transaction_session_timeout = 200000;"))
(str "SET statement_timeout = 300000;\n"
"SET idle_in_transaction_session_timeout = 300000;"))
(defn- create-datasource-config
[{:keys [metrics read-only] :or {read-only false} :as cfg}]
(let [dburi (:uri cfg)
username (:username cfg)
password (:password cfg)
config (HikariConfig.)]
[{:keys [::mtx/metrics ::uri] :as cfg}]
(let [config (HikariConfig.)]
(doto config
(.setJdbcUrl (str "jdbc:" dburi))
(.setPoolName (d/name (:name cfg)))
(.setJdbcUrl (str "jdbc:" uri))
(.setPoolName (d/name (::name cfg)))
(.setAutoCommit true)
(.setReadOnly read-only)
(.setConnectionTimeout 10000) ;; 10seg
(.setValidationTimeout 10000) ;; 10seg
(.setIdleTimeout 120000) ;; 2min
(.setMaxLifetime 1800000) ;; 30min
(.setMinimumIdle (:min-pool-size cfg 0))
(.setMaximumPoolSize (:max-pool-size cfg 30))
(.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))
;; When metrics namespace is provided
(when metrics
(->> (:registry metrics)
(->> (::mtx/registry metrics)
(PrometheusMetricsTrackerFactory.)
(.setMetricsTrackerFactory config)))
(when username (.setUsername config username))
(when password (.setPassword config password))
(some->> ^String (::username cfg) (.setUsername config))
(some->> ^String (::password cfg) (.setPassword config))
config))
@@ -132,12 +145,29 @@
[v]
(instance? javax.sql.DataSource v))
(s/def ::conn some?)
(s/def ::nilable-pool (s/nilable ::pool))
(s/def ::pool pool?)
(s/def ::pool-or-conn some?)
(defn pool-closed?
(defn closed?
[pool]
(.isClosed ^HikariDataSource pool))
(defn read-only?
[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]
(let [dsc (create-datasource-config cfg)]
@@ -190,77 +220,86 @@
[& args]
`(jdbc/with-transaction ~@args))
(defn ^Connection open
(defn open
[pool]
(jdbc/get-connection pool))
(def ^:private default-opts
{:builder-fn sql/as-kebab-maps})
(defn exec!
([ds sv]
(exec! ds sv {}))
(jdbc/execute! ds sv default-opts))
([ds sv opts]
(jdbc/execute! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(jdbc/execute! ds sv (merge default-opts opts))))
(defn exec-one!
([ds sv] (exec-one! ds sv {}))
([ds sv]
(jdbc/execute-one! ds sv default-opts))
([ds sv opts]
(jdbc/execute-one! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(jdbc/execute-one! ds sv
(-> (merge default-opts opts)
(assoc :return-keys (::return-keys? opts false))))))
(defn insert!
([ds table params] (insert! ds table params nil))
([ds table params opts]
(exec-one! ds
(sql/insert table params opts)
(assoc opts :return-keys true))))
[ds table params & {:as opts}]
(exec-one! ds
(sql/insert table params opts)
(merge {::return-keys? true} 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)
(assoc opts :return-keys true))))
[ds table cols rows & {:as opts}]
(exec! ds
(sql/insert-multi table cols rows opts)
(merge {::return-keys? true} 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)
(assoc opts :return-keys true))))
[ds table params where & {:as opts}]
(exec-one! ds
(sql/update table params where opts)
(merge {::return-keys? true} 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))))
[ds table params & {:as opts}]
(exec-one! ds
(sql/delete table params opts)
(merge {::return-keys? true} opts)))
(defn- is-deleted?
(defn is-row-deleted?
[{:keys [deleted-at]}]
(and (dt/instant? deleted-at)
(< (inst-ms deleted-at)
(inst-ms (dt/now)))))
(defn get-by-params
([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 [res (exec-one! ds (sql/select table params opts))]
(when (and check-not-found (or (not res) (is-deleted? res)))
(ex/raise :type :not-found
:table table
:hint "database object not found"))
res)))
(defn get*
"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
"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-id
([ds table id]
(get-by-params ds table {:id id} nil))
([ds table id opts]
(get-by-params ds table {:id id} opts)))
[ds table id & {:as 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 params & {:as opts}]
(exec! ds (sql/select table params opts)))
(defn pgobject?
([v]
@@ -287,10 +326,13 @@
[v]
(and (pgarray? v) (= "uuid" (.getBaseTypeName ^PgArray v))))
;; TODO rename to decode-pgarray-into
(defn decode-pgarray
([v] (into [] (.getArray ^PgArray v)))
([v in] (into in (.getArray ^PgArray v)))
([v in xf] (into in xf (.getArray ^PgArray v))))
([v] (decode-pgarray v []))
([v in]
(into in (some-> ^PgArray v .getArray)))
([v in xf]
(into in xf (some-> ^PgArray v .getArray))))
(defn pgarray->set
[v]
@@ -319,12 +361,20 @@
[data]
(org.postgresql.util.PGInterval. ^String data))
(defn connection?
[conn]
(instance? Connection conn))
(defn savepoint
([^Connection conn]
(.setSavepoint conn))
([^Connection conn label]
(.setSavepoint conn (name label))))
(defn release!
[^Connection conn ^Savepoint sp ]
(.releaseSavepoint conn sp))
(defn rollback!
([^Connection conn]
(.rollback conn))
@@ -332,74 +382,94 @@
(.rollback conn sp)))
(defn interval
[data]
[o]
(cond
(integer? data)
(->> (/ data 1000.0)
(or (integer? o)
(float? o))
(->> (/ o 1000.0)
(format "%s seconds")
(pginterval))
(string? data)
(pginterval data)
(string? o)
(pginterval o)
(dt/duration? data)
(->> (/ (.toMillis ^java.time.Duration data) 1000.0)
(format "%s seconds")
(pginterval))
(dt/duration? o)
(interval (inst-ms o))
:else
(ex/raise :type :not-implemented)))
(ex/raise :type :not-implemented
:hint (format "no implementation found for value %s" (pr-str o)))))
(defn decode-json-pgobject
[^PGobject o]
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(json/decode-str val)
val)))
(when o
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(json/decode val)
val))))
(defn decode-transit-pgobject
[^PGobject o]
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(t/decode-str val)
val)))
(when o
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(t/decode-str val)
val))))
(defn inet
[ip-addr]
(doto (org.postgresql.util.PGobject.)
(.setType "inet")
(.setValue (str ip-addr))))
(when ip-addr
(doto (org.postgresql.util.PGobject.)
(.setType "inet")
(.setValue (str ip-addr)))))
(defn decode-inet
[^PGobject o]
(if (= "inet" (.getType o))
(.getValue o)
nil))
(when o
(if (= "inet" (.getType o))
(.getValue o)
nil)))
(defn tjson
"Encode as transit json."
[data]
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (t/encode-str data {:type :json-verbose}))))
(when data
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (t/encode-str data {:type :json-verbose})))))
(defn json
"Encode as plain json."
[data]
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (json/encode-str data))))
(when data
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (json/encode-str data)))))
(defn get-update-count
[result]
(:next.jdbc/update-count result))
;; --- Locks
(def ^:private siphash-state
(SipHasher/container
(uuid/get-bytes uuid/zero)))
(defn uuid->hash-code
[o]
(.hash ^SipHasherContainer siphash-state
^bytes (uuid/get-bytes o)))
(defn- xact-check-param
[n]
(cond
(uuid? n) (uuid/get-word-high n)
(uuid? n) (uuid->hash-code n)
(int? n) n
:else (throw (IllegalArgumentException. "uuid or number allowed"))))
@@ -414,3 +484,18 @@
(let [n (xact-check-param n)
row (exec-one! conn ["select pg_try_advisory_xact_lock(?::bigint) as lock" n])]
(:lock row)))
(defn sql-exception?
[cause]
(instance? java.sql.SQLException cause))
(defn connection-error?
[cause]
(and (sql-exception? cause)
(contains? #{"08003" "08006" "08001" "08004"}
(.getSQLState ^java.sql.SQLException cause))))
(defn serialization-error?
[cause]
(and (sql-exception? cause)
(= "40001" (.getSQLState ^java.sql.SQLException cause))))
+6 -3
View File
@@ -2,11 +2,12 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(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]))
@@ -43,8 +44,10 @@
([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"))]
(::db/for-update? opts) (assoc :suffix "FOR UPDATE")
(::db/for-share? opts) (assoc :suffix "FOR KEY SHARE")
(:for-update opts) (assoc :suffix "FOR UPDATE")
(:for-key-share opts) (assoc :suffix "FOR KEY SHARE"))]
(sql/for-query table where-params opts))))
(defn update
+445
View File
@@ -0,0 +1,445 @@
;; 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.email
"Main api for send emails."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.email.invite-to-team :as-alias email.invite-to-team]
[app.metrics :as mtx]
[app.util.template :as tmpl]
[app.worker :as wrk]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig])
(:import
jakarta.mail.Message$RecipientType
jakarta.mail.Session
jakarta.mail.Transport
jakarta.mail.internet.InternetAddress
jakarta.mail.internet.MimeBodyPart
jakarta.mail.internet.MimeMessage
jakarta.mail.internet.MimeMultipart
java.util.Properties))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EMAIL IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-address
^"[Ljakarta.mail.internet.InternetAddress;"
[v]
(InternetAddress/parse ^String v))
(defn- resolve-recipient-type
^Message$RecipientType
[type]
(case type
:to Message$RecipientType/TO
:cc Message$RecipientType/CC
:bcc Message$RecipientType/BCC))
(defn- assign-recipient
[^MimeMessage mmsg type address]
(if (sequential? address)
(reduce #(assign-recipient %1 type %2) mmsg address)
(let [address (parse-address address)
type (resolve-recipient-type type)]
(.addRecipients mmsg type address)
mmsg)))
(defn- assign-recipients
[mmsg {:keys [to cc bcc] :as params}]
(cond-> mmsg
(some? to) (assign-recipient :to to)
(some? cc) (assign-recipient :cc cc)
(some? bcc) (assign-recipient :bcc bcc)))
(defn- assign-from
[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}]
(let [reply-to (or reply-to default-reply-to)]
(when reply-to
(let [reply-to (parse-address reply-to)]
(.setReplyTo ^MimeMessage mmsg reply-to)))))
(defn- assign-subject
[mmsg {:keys [subject charset] :or {charset "utf-8"} :as params}]
(assert (string? subject) "subject is mandatory")
(.setSubject ^MimeMessage mmsg
^String subject
^String charset))
(defn- assign-extra-headers
[^MimeMessage mmsg {:keys [headers extra-data] :as params}]
(let [headers (assoc headers "X-Penpot-Data" extra-data)]
(reduce-kv (fn [^MimeMessage mmsg k v]
(doto mmsg
(.addHeader (name k) (str v))))
mmsg
headers)))
(defn- assign-body
[^MimeMessage mmsg {:keys [body charset] :or {charset "utf-8"}}]
(let [mpart (MimeMultipart. "mixed")]
(cond
(string? body)
(let [bpart (MimeBodyPart.)]
(.setContent bpart ^String body (str "text/plain; charset=" charset))
(.addBodyPart mpart bpart))
(vector? body)
(let [mmp (MimeMultipart. "alternative")
mbp (MimeBodyPart.)]
(.addBodyPart mpart mbp)
(.setContent mbp mmp)
(doseq [item body]
(let [mbp (MimeBodyPart.)]
(.setContent mbp
^String (:content item)
^String (str (:type item "text/plain") "; charset=" charset))
(.addBodyPart mmp mbp))))
(map? body)
(let [bpart (MimeBodyPart.)]
(.setContent bpart
^String (:content body)
^String (str (:type body "text/plain") "; charset=" charset))
(.addBodyPart mpart bpart))
:else
(throw (ex-info "Unsupported type" {:body body})))
(.setContent mmsg mpart)
mmsg))
(defn- opts->props
[{:keys [::username ::tls ::host ::port ::timeout ::default-from]
:or {timeout 30000}}]
(reduce-kv
(fn [^Properties props k v]
(if (nil? v)
props
(doto props (.put ^String k ^String (str v)))))
(Properties.)
{"mail.user" username
"mail.host" host
"mail.debug" (contains? cf/flags :smtp-debug)
"mail.from" default-from
"mail.smtp.auth" (boolean username)
"mail.smtp.starttls.enable" tls
"mail.smtp.starttls.required" tls
"mail.smtp.host" host
"mail.smtp.port" port
"mail.smtp.user" username
"mail.smtp.timeout" timeout
"mail.smtp.connectiontimeout" timeout}))
(defn- create-smtp-session
^Session
[cfg]
(let [props (opts->props cfg)]
(Session/getInstance props)))
(defn- create-smtp-message
^MimeMessage
[cfg session params]
(let [mmsg (MimeMessage. ^Session session)]
(assign-recipients mmsg params)
(assign-from mmsg cfg params)
(assign-reply-to mmsg cfg params)
(assign-subject mmsg params)
(assign-extra-headers mmsg params)
(assign-body mmsg params)
(.saveChanges ^MimeMessage mmsg)
mmsg))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TEMPLATE EMAIL IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private email-path "app/email/%(id)s/%(lang)s.%(type)s")
(defn- render-email-template-part
[type id context]
(let [lang (:lang context :en)
path (str/format email-path {:id (name id)
:lang (name lang)
:type (name type)})]
(some-> (io/resource path)
(tmpl/render context))))
(defn- build-email-template
[id context]
(let [subj (render-email-template-part :subj id context)
text (render-email-template-part :txt id context)
html (render-email-template-part :html id context)]
(when (or (not subj)
(and (not text)
(not html)))
(ex/raise :type :internal
:code :missing-email-templates))
{:subject subj
:body (into
[{:type "text/plain"
:content text}]
(when html
[{:type "text/html"
:content html}]))}))
(s/def ::priority #{:high :low})
(s/def ::to (s/or :single ::us/email
:multi (s/coll-of ::us/email)))
(s/def ::from ::us/email)
(s/def ::reply-to ::us/email)
(s/def ::lang string?)
(s/def ::extra-data ::us/string)
(s/def ::context
(s/keys :req-un [::to]
:opt-un [::reply-to ::from ::lang ::priority ::extra-data]))
(defn template-factory
([id] (template-factory id {}))
([id extra-context]
(s/assert keyword? id)
(fn [context]
(us/verify ::context context)
(when-let [spec (s/get-spec id)]
(s/assert spec context))
(let [context (merge (if (fn? extra-context)
(extra-context)
extra-context)
context)
email (build-email-template id context)]
(when-not email
(ex/raise :type :internal
:code :email-template-does-not-exists
:hint "seems like the template is wrong or does not exists."
:context {:id id}))
(cond-> (assoc email :id (name id))
(:extra-data context)
(assoc :extra-data (:extra-data context))
(:from context)
(assoc :from (:from context))
(:reply-to context)
(assoc :reply-to (:reply-to context))
(:to context)
(assoc :to (:to context)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUBLIC HIGH-LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn render
[email-factory context]
(email-factory context))
(defn send!
"Schedule an already defined email to be sent using asynchronously
using worker task."
[{:keys [::conn ::factory] :as context}]
(us/verify some? conn)
(let [email (if factory
(factory context)
(dissoc context ::conn))]
(wrk/submit! (merge
{::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 4
::wrk/priority 200
::wrk/conn conn}
email))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SENDMAIL FN / TASK HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::username ::cf/smtp-username)
(s/def ::password ::cf/smtp-password)
(s/def ::tls ::cf/smtp-tls)
(s/def ::ssl ::cf/smtp-ssl)
(s/def ::host ::cf/smtp-host)
(s/def ::port ::cf/smtp-port)
(s/def ::default-reply-to ::cf/smtp-default-reply-to)
(s/def ::default-from ::cf/smtp-default-from)
(s/def ::smtp-config
(s/keys :opt [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(declare send-to-logger!)
(s/def ::sendmail fn?)
(defmethod ig/pre-init-spec ::sendmail [_]
(s/spec ::smtp-config))
(defmethod ig/init-key ::sendmail
[_ cfg]
(fn [params]
(when (contains? cf/flags :smtp)
(let [session (create-smtp-session cfg)]
(with-open [transport (.getTransport session (if (:ssl cfg) "smtps" "smtp"))]
(.connect ^Transport transport
^String (::username cfg)
^String (::password cfg))
(let [^MimeMessage message (create-smtp-message cfg session params)]
(.sendMessage ^Transport transport
^MimeMessage message
(.getAllRecipients message))))))
(when (or (contains? cf/flags :log-emails)
(not (contains? cf/flags :smtp)))
(send-to-logger! cfg params))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::sendmail ::mtx/metrics]))
(defmethod ig/init-key ::handler
[_ {:keys [::sendmail]}]
(fn [{:keys [props] :as task}]
(sendmail props)))
(defn- send-to-logger!
[_ email]
(let [body (:body email)
out (with-out-str
(println "email console dump:")
(println "******** start email" (:id email) "**********")
(pp/pprint (dissoc email :body))
(if (string? body)
(println body)
(println (->> body
(filter #(= "text/plain" (:type %)))
(map :content)
first)))
(println "******** end email" (:id email) "**********"))]
(l/info ::l/raw out)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EMAIL FACTORIES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::subject ::us/string)
(s/def ::content ::us/string)
(s/def ::feedback
(s/keys :req-un [::subject ::content]))
(def feedback
"A profile feedback email."
(template-factory ::feedback))
(s/def ::name ::us/string)
(s/def ::register
(s/keys :req-un [::name]))
(def register
"A new profile registration welcome email."
(template-factory ::register))
(s/def ::token ::us/string)
(s/def ::password-recovery
(s/keys :req-un [::name ::token]))
(def password-recovery
"A password recovery notification email."
(template-factory ::password-recovery))
(s/def ::pending-email ::us/email)
(s/def ::change-email
(s/keys :req-un [::name ::pending-email ::token]))
(def change-email
"Password change confirmation email"
(template-factory ::change-email))
(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 [::email.invite-to-team/invited-by
::email.invite-to-team/token
::email.invite-to-team/team]))
(def invite-to-team
"Teams member invitation email."
(template-factory ::invite-to-team))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BOUNCE/COMPLAINS HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def sql:profile-complaint-report
"select (select count(*)
from profile_complaint_report
where type = 'complaint'
and profile_id = ?
and created_at > now() - ?::interval) as complaints,
(select count(*)
from profile_complaint_report
where type = 'bounce'
and profile_id = ?
and created_at > now() - ?::interval) as bounces;")
(defn allow-send-emails?
[conn profile]
(when-not (:is-muted profile false)
(let [complaint-threshold (cf/get :profile-complaint-threshold)
complaint-max-age (cf/get :profile-complaint-max-age)
bounce-threshold (cf/get :profile-bounce-threshold)
bounce-max-age (cf/get :profile-bounce-max-age)
{:keys [complaints bounces] :as result}
(db/exec-one! conn [sql:profile-complaint-report
(:id profile)
(db/interval complaint-max-age)
(:id profile)
(db/interval bounce-max-age)])]
(and (< (or complaints 0) complaint-threshold)
(< (or bounces 0) bounce-threshold)))))
(defn has-complaint-reports?
([conn email] (has-complaint-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "complaint"}
{:limit 10}))]
(>= (count reports) threshold))))
(defn has-bounce-reports?
([conn email] (has-bounce-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "bounce"}
{:limit 10}))]
(>= (count reports) threshold))))
-183
View File
@@ -1,183 +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) UXBOX Labs SL
(ns app.emails
"Main api for send emails."
(:require
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.util.emails :as emails]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
;; --- PUBLIC API
(defn render
[email-factory context]
(email-factory context))
(defn send!
"Schedule the email for sending."
[{:keys [::conn ::factory] :as context}]
(us/verify fn? factory)
(us/verify some? conn)
(let [email (factory context)]
(wrk/submit! (assoc email
::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 1
::wrk/priority 200
::wrk/conn conn))))
;; --- BOUNCE/COMPLAINS HANDLING
(def sql:profile-complaint-report
"select (select count(*)
from profile_complaint_report
where type = 'complaint'
and profile_id = ?
and created_at > now() - ?::interval) as complaints,
(select count(*)
from profile_complaint_report
where type = 'bounce'
and profile_id = ?
and created_at > now() - ?::interval) as bounces;")
(defn allow-send-emails?
[conn profile]
(when-not (:is-muted profile false)
(let [complaint-threshold (cf/get :profile-complaint-threshold)
complaint-max-age (cf/get :profile-complaint-max-age)
bounce-threshold (cf/get :profile-bounce-threshold)
bounce-max-age (cf/get :profile-bounce-max-age)
{:keys [complaints bounces] :as result}
(db/exec-one! conn [sql:profile-complaint-report
(:id profile)
(db/interval complaint-max-age)
(:id profile)
(db/interval bounce-max-age)])]
(and (< complaints complaint-threshold)
(< bounces bounce-threshold)))))
(defn has-complaint-reports?
([conn email] (has-complaint-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "complaint"}
{:limit 10}))]
(>= (count reports) threshold))))
(defn has-bounce-reports?
([conn email] (has-bounce-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "bounce"}
{:limit 10}))]
(>= (count reports) threshold))))
;; --- EMAIL FACTORIES
(s/def ::subject ::us/string)
(s/def ::content ::us/string)
(s/def ::feedback
(s/keys :req-un [::subject ::content]))
(def feedback
"A profile feedback email."
(emails/template-factory ::feedback))
(s/def ::name ::us/string)
(s/def ::register
(s/keys :req-un [::name]))
(def register
"A new profile registration welcome email."
(emails/template-factory ::register))
(s/def ::token ::us/string)
(s/def ::password-recovery
(s/keys :req-un [::name ::token]))
(def password-recovery
"A password recovery notification email."
(emails/template-factory ::password-recovery))
(s/def ::pending-email ::us/email)
(s/def ::change-email
(s/keys :req-un [::name ::pending-email ::token]))
(def change-email
"Password change confirmation email"
(emails/template-factory ::change-email))
(s/def :internal.emails.invite-to-team/invited-by ::us/string)
(s/def :internal.emails.invite-to-team/team ::us/string)
(s/def :internal.emails.invite-to-team/token ::us/string)
(s/def ::invite-to-team
(s/keys :req-un [:internal.emails.invite-to-team/invited-by
:internal.emails.invite-to-team/token
:internal.emails.invite-to-team/team]))
(def invite-to-team
"Teams member invitation email."
(emails/template-factory ::invite-to-team))
;; --- SENDMAIL TASK
(declare send-console!)
(s/def ::username ::cf/smtp-username)
(s/def ::password ::cf/smtp-password)
(s/def ::tls ::cf/smtp-tls)
(s/def ::ssl ::cf/smtp-ssl)
(s/def ::host ::cf/smtp-host)
(s/def ::port ::cf/smtp-port)
(s/def ::default-reply-to ::cf/smtp-default-reply-to)
(s/def ::default-from ::cf/smtp-default-from)
(defmethod ig/pre-init-spec ::sendmail-handler [_]
(s/keys :opt-un [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(defmethod ig/init-key ::sendmail-handler
[_ cfg]
(fn [{:keys [props] :as task}]
(let [enabled? (or (contains? cf/flags :smtp)
(cf/get :smtp-enabled)
(:enabled task))]
(if enabled?
(emails/send! cfg props)
(send-console! cfg props)))))
(defn- send-console!
[cfg email]
(let [baos (java.io.ByteArrayOutputStream.)
mesg (emails/smtp-message cfg email)]
(.writeTo mesg baos)
(let [out (with-out-str
(println "email console dump:")
(println "******** start email" (:id email) "**********")
(println (.toString baos))
(println "******** end email "(:id email) "**********"))]
(l/info :email out))))
+133 -123
View File
@@ -2,167 +2,177 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http
(:require
[app.auth.oidc :as-alias oidc]
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.http.doc :as doc]
[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 middleware]
[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.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[reitit.ring :as rr]
[ring.adapter.jetty9 :as jetty])
(:import
org.eclipse.jetty.server.Server
org.eclipse.jetty.server.handler.ErrorHandler
org.eclipse.jetty.server.handler.StatisticsHandler))
[promesa.exec :as px]
[reitit.core :as r]
[reitit.middleware :as rr]
[yetti.adapter :as yt]
[yetti.request :as yrq]
[yetti.response :as-alias yrs]))
(declare router-handler)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP SERVER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::handler fn?)
(s/def ::router some?)
(s/def ::ws (s/map-of ::us/string fn?))
(s/def ::port ::us/integer)
(s/def ::name ::us/string)
(s/def ::port integer?)
(s/def ::host string?)
(s/def ::name string?)
(defmethod ig/pre-init-spec ::server [_]
(s/keys :req-un [::port]
:opt-un [::ws ::name ::mtx/metrics ::router ::handler]))
(s/def ::max-body-size integer?)
(s/def ::max-multipart-body-size integer?)
(s/def ::io-threads integer?)
(defmethod ig/prep-key ::server
[_ cfg]
(merge {:name "http"} (d/without-nils cfg)))
(merge {::port 6060
::host "0.0.0.0"
::max-body-size (* 1024 1024 30) ; 30 MiB
::max-multipart-body-size (* 1024 1024 120)} ; 120 MiB
(d/without-nils cfg)))
(defmethod ig/pre-init-spec ::server [_]
(s/keys :req [::port ::host]
:opt [::max-body-size
::max-multipart-body-size
::router
::handler
::io-threads
::wrk/executor]))
(defmethod ig/init-key ::server
[_ {:keys [handler router ws port name metrics] :as opts}]
(l/info :msg "starting http server" :port port :name name)
(let [pre-start (fn [^Server server]
(let [handler (doto (ErrorHandler.)
(.setShowStacks true)
(.setServer server))]
(.setErrorHandler server ^ErrorHandler handler)
(when metrics
(let [stats (StatisticsHandler.)]
(.setHandler ^StatisticsHandler stats (.getHandler server))
(.setHandler server stats)
(mtx/instrument-jetty! (:registry metrics) stats)))))
[_ {: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 (or (::io-threads cfg)
(max 3 (px/get-available-processors)))
:xnio/worker-threads (or (::worker-threads cfg)
(max 6 (px/get-available-processors)))
:xnio/dispatch true
:socket/backlog 4069
:ring/async true}
options (merge
{:port port
:h2c? true
:join? false
:allow-null-path-info true
:configurator pre-start}
(when (seq ws)
{:websockets ws}))
handler (cond
(some? router)
(router-handler router)
handler (cond
(fn? handler) handler
(some? router) (router-handler router)
:else (ex/raise :type :internal
:code :invalid-argument
:hint "Missing `handler` or `router` option."))
(some? handler)
handler
server (jetty/run-jetty handler options)]
(assoc opts :server server)))
: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 opts}]
(l/info :msg "stoping http server"
:name name
:port port)
(jetty/stop-server server))
[_ {:keys [::server ::port] :as cfg}]
(l/info :msg "stopping http server" :port port)
(yt/stop! server))
(defn- not-found-handler
[_ respond _]
(respond {::yrs/status 404}))
(defn- router-handler
[router]
(let [handler (rr/ring-handler router
(rr/routes
(rr/create-resource-handler {:path "/"})
(rr/create-default-handler))
{:middleware [middleware/server-timing]})]
(fn [request]
(try
(handler request)
(catch Throwable e
(try
(let [cdata (errors/get-error-context request e)]
(l/update-thread-context! cdata)
(l/error :hint "unhandled exception"
:message (ex-message e)
:error-id (str (:id cdata))
:cause e))
{:status 500 :body "internal server error"}
(catch Throwable e
(l/error :hint "unhandled exception"
:message (ex-message e)
:cause e)
{:status 500 :body "internal server error"})))))))
(letfn [(resolve-handler [request]
(if-let [match (r/match-by-path router (yrq/path request))]
(let [params (:path-params match)
result (:result match)
handler (or (:handler result) not-found-handler)
request (assoc request :path-params params)]
(partial handler request))
(partial not-found-handler request)))
(on-error [cause request]
(let [{:keys [body] :as response} (errors/handle cause request)]
(cond-> response
(map? body)
(-> (update ::yrs/headers assoc "content-type" "application/transit+json")
(assoc ::yrs/body (t/encode-str body {:type :json-verbose}))))))]
(fn [request respond _]
(let [handler (resolve-handler request)
exchange (yrq/exchange request)]
(handler
(fn [response]
(yt/dispatch! exchange (partial respond response)))
(fn [cause]
(let [response (on-error cause request)]
(yt/dispatch! exchange (partial respond response)))))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Http Main Handler (Router)
;; HTTP ROUTER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::rpc map?)
(s/def ::session map?)
(s/def ::oauth map?)
(s/def ::storage map?)
(s/def ::assets map?)
(s/def ::feedback fn?)
(s/def ::error-report-handler fn?)
(s/def ::audit-http-handler fn?)
(defmethod ig/pre-init-spec ::router [_]
(s/keys :req-un [::rpc ::session ::mtx/metrics
::oauth ::storage ::assets ::feedback
::error-report-handler
::audit-http-handler]))
(s/keys :req [::session/manager
::ws/routes
::rpc/routes
::rpc.doc/routes
::oidc/routes
::main/props
::assets/routes
::debug/routes
::db/pool
::mtx/routes
::awsns/routes]))
(defmethod ig/init-key ::router
[_ {:keys [session rpc oauth metrics assets feedback] :as cfg}]
[_ cfg]
(rr/router
[["/metrics" {:get (:handler metrics)}]
["/assets" {:middleware [[middleware/format-response-body]
[middleware/errors errors/handle]
[middleware/cookies]
(:middleware session)]}
["/by-id/:id" {:get (:objects-handler assets)}]
["/by-file-media-id/:id" {:get (:file-objects-handler assets)}]
["/by-file-media-id/:id/thumbnail" {:get (:file-thumbnails-handler assets)}]]
[["" {:middleware [[mw/server-timing]
[mw/params]
[mw/format-response]
[mw/parse-request]
[session/soft-auth cfg]
[actoken/soft-auth cfg]
[mw/errors errors/handle]
[mw/restrict-methods]
[mw/with-dispatch :vthread]]}
["/dbg"
["/error-by-id/:id" {:get (:error-report-handler cfg)}]]
(::mtx/routes cfg)
(::assets/routes cfg)
(::debug/routes cfg)
["/webhooks"
["/sns" {:post (:sns-webhook cfg)}]]
["/webhooks"
(::awsns/routes cfg)]
["/api" {:middleware [[middleware/cors]
[middleware/etag]
[middleware/format-response-body]
[middleware/params]
[middleware/multipart-params]
[middleware/keyword-params]
[middleware/parse-request-body]
[middleware/errors errors/handle]
[middleware/cookies]]}
(::ws/routes cfg)
["/_doc" {:get (doc/handler rpc)}]
["/feedback" {:middleware [(:middleware session)]
:post feedback}]
["/auth/oauth/:provider" {:post (:handler oauth)}]
["/auth/oauth/:provider/callback" {:get (:callback-handler oauth)}]
["/audit/events" {:middleware [(:middleware session)]
:post (:audit-http-handler cfg)}]
["/rpc" {:middleware [(:middleware session)]}
["/query/:type" {:get (:query-handler rpc)
:post (:query-handler rpc)}]
["/mutation/:type" {:post (:mutation-handler rpc)}]]]]))
["/api" {:middleware [[mw/cors]]}
(::oidc/routes cfg)
(::rpc.doc/routes cfg)
(::rpc/routes cfg)]]]))
+84
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.tokens :as tokens]
[yetti.request :as yrq]))
(def header-re #"^Token\s+(.*)")
(defn- get-token
[request]
(some->> (yrq/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 [::main/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 respond raise]
(let [request (handle-request request)]
(handler request respond raise)))))
(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))})
+71 -71
View File
@@ -2,20 +2,21 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(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]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
[integrant.core :as ig]
[yetti.response :as-alias yrs]))
(def ^:private cache-max-age
(dt/duration {:hours 24}))
@@ -23,88 +24,87 @@
(def ^:private signature-max-age
(dt/duration {:hours 24 :minutes 15}))
(defn coerce-id
[id]
(let [res (us/uuid-conformer 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] :as storage} id]
(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})]
{::yrs/status 307
::yrs/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))}]
{::yrs/status 204
::yrs/headers headers}))
(defn- serve-object
[{:keys [storage] :as cfg} obj]
(let [mdata (meta obj)
backend (sto/resolve-backend storage (:backend obj))]
(case (:type backend)
:db
{:status 200
:headers {"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}
:body (sto/get-object-bytes storage obj)}
:s3
(let [url (sto/get-object-url storage obj {:max-age signature-max-age})]
{:status 307
:headers {"location" (str url)
"x-host" (:host url)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}
:body ""})
:fs
(let [purl (u/uri (:assets-path cfg))
purl (u/join purl (sto/object->relative-path obj))]
{:status 204
:headers {"x-accel-redirect" (:path purl)
"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}
:body ""}))))
(defn- generic-handler
[{:keys [storage] :as cfg} _request id]
(let [obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
{:status 404 :body ""})))
"Helper function that returns the appropriate response depending on
the storage object backend type."
[{: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
[cfg request]
(let [id (get-in request [:path-params :id])]
(generic-handler cfg request (coerce-id id))))
"Handler that servers storage objects by id."
[{:keys [::sto/storage] :as cfg} request]
(let [id (get-id request)
obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
{::yrs/status 404})))
(defn- generic-handler
"A generic handler helper/common code for file-media based handlers."
[{: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)
{::yrs/status 404})))
(defn file-objects-handler
[{:keys [storage] :as cfg} request]
(let [id (get-in request [:path-params :id])
mobj (get-file-media-object storage id)]
(generic-handler cfg request (:media-id mobj))))
"Handler that serves storage objects by file media id."
[cfg request]
(generic-handler cfg request :media-id))
(defn file-thumbnails-handler
[{:keys [storage] :as cfg} request]
(let [id (get-in request [:path-params :id])
mobj (get-file-media-object storage id)]
(generic-handler cfg request (or (:thumbnail-id mobj) (:media-id mobj)))))
"Handler that serves storage objects by thumbnail-id and quick
fallback to file-media-id if no thumbnail is available."
[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 ::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 #(objects-handler cfg %)
:file-objects-handler #(file-objects-handler cfg %)
:file-thumbnails-handler #(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)}]])
+40 -18
View File
@@ -2,7 +2,7 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.awsns
"AWS SNS webhook handler for bounces."
@@ -11,30 +11,49 @@
[app.common.logging :as l]
[app.db :as db]
[app.db.sql :as sql]
[app.util.http :as http]
[app.http.client :as http]
[app.main :as-alias main]
[app.tokens :as tokens]
[app.worker :as-alias wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[jsonista.core :as j]))
[jsonista.core :as j]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as-alias yrs]))
(declare parse-json)
(declare handle-request)
(declare parse-notification)
(declare process-report)
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool]))
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::http/client
::main/props
::db/pool
::wrk/executor]))
(defmethod ig/init-key ::handler
[_ cfg]
(fn [request]
(let [body (parse-json (slurp (:body request)))
(defmethod ig/init-key ::routes
[_ {:keys [::wrk/executor] :as cfg}]
(letfn [(handler [request respond _]
(let [data (-> request yrq/body slurp)]
(px/run! executor #(handle-request cfg data)))
(respond {::yrs/status 200}))]
["/sns" {:handler handler
:allowed-methods #{:post}}]))
(defn handle-request
[cfg data]
(try
(let [body (parse-json data)
mtype (get body "Type")]
(cond
(= mtype "SubscriptionConfirmation")
(let [surl (get body "SubscribeURL")
stopic (get body "TopicArn")]
(l/info :action "subscription received" :topic stopic :url surl)
(http/send! {:uri surl :method :post :timeout 10000}))
(http/req! cfg {:uri surl :method :post :timeout 10000} {:sync? true}))
(= mtype "Notification")
(when-let [message (parse-json (get body "Message"))]
@@ -43,8 +62,11 @@
:else
(l/warn :hint "unexpected data received"
:report (pr-str body)))
{:status 200 :body ""})))
:report (pr-str body))))
(catch Throwable cause
(l/error :hint "unexpected exception on awsns"
:cause cause))))
(defn- parse-bounce
[data]
@@ -82,10 +104,10 @@
(get mail "headers")))
(defn- extract-identity
[{:keys [tokens] :as cfg} headers]
[cfg headers]
(let [tdata (get headers "x-penpot-data")]
(when-not (str/empty? tdata)
(let [result (tokens :verify {:token tdata :iss :profile-identity})]
(let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})]
(:profile-id result)))))
(defn- parse-notification
@@ -118,7 +140,7 @@
(j/read-value v)))
(defn- register-bounce-for-profile
[{:keys [pool]} {:keys [type kind profile-id] :as report}]
[{:keys [::db/pool]} {:keys [type kind profile-id] :as report}]
(when (= kind "permanent")
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
@@ -147,7 +169,7 @@
{:id profile-id}))))))
(defn- register-complaint-for-profile
[{:keys [pool]} {:keys [type profile-id] :as report}]
[{:keys [::db/pool]} {:keys [type profile-id] :as report}]
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
{:profile-id profile-id
@@ -173,14 +195,14 @@
(defn- process-report
[cfg {:keys [type profile-id] :as report}]
(l/trace :action "procesing report" :report (pr-str report))
(l/trace :action "processing report" :report (pr-str report))
(cond
;; In this case we receive a bounce/complaint notification without
;; confirmed identity, we just emit a warning but do nothing about
;; it because this is not a normal case. All notifications should
;; come with profile identity.
(nil? profile-id)
(l/warn :msg "a notification without identity recevied from AWS"
(l/warn :msg "a notification without identity received from AWS"
:report (pr-str report))
(= "bounce" type)
+64
View File
@@ -0,0 +1,64 @@
;; 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.client
"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]
[promesa.core :as p])
(:import
java.net.http.HttpClient))
(s/def ::client #(instance? HttpClient %))
(s/def ::client-holder
(s/keys :req [::client]))
(defmethod ig/pre-init-spec ::client [_]
(s/keys :req [::wrk/executor]))
(defmethod ig/init-key ::client
[_ {:keys [::wrk/executor] :as cfg}]
(http/build-client {:executor executor
:connect-timeout 30000 ;; 10s
:follow-redirects :always}))
(defn send!
([client req] (send! client req {}))
([client req {:keys [response-type sync?] :or {response-type :string sync? false}}]
(us/assert! ::client client)
(if sync?
(http/send req {:client client :as response-type})
(try
(http/send-async req {:client client :as response-type})
(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."
([cfg-or-client request]
(let [client (resolve-client cfg-or-client)]
(send! client request {})))
([cfg-or-client request options]
(let [client (resolve-client cfg-or-client)]
(send! client request options))))
+418
View File
@@ -0,0 +1,418 @@
;; 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.debug
(:refer-clojure :exclude [error-handler])
(:require
[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.session :as session]
[app.rpc.commands.binfile :as binf]
[app.rpc.commands.files-create :refer [create-file]]
[app.rpc.commands.profile :as profile]
[app.storage :as-alias sto]
[app.util.blob :as blob]
[app.util.template :as tmpl]
[app.util.time :as dt]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.io :as io]
[emoji.core :as emj]
[integrant.core :as ig]
[markdown.core :as md]
[markdown.transformers :as mdt]
[yetti.request :as yrq]
[yetti.response :as yrs]))
;; (selmer.parser/cache-off!)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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)))))
(defn prepare-response
[body]
(let [headers {"content-type" "application/transit+json"}]
{::yrs/status 200
::yrs/body body
::yrs/headers headers}))
(defn prepare-download-response
[body filename]
(let [headers {"content-disposition" (str "attachment; filename=" filename)
"content-type" "application/octet-stream"}]
{::yrs/status 200
::yrs/body body
::yrs/headers headers}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INDEX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn index-handler
[{:keys [::db/pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
{::yrs/status 200
::yrs/headers {"content-type" "text/html"}
::yrs/body (-> (io/resource "app/templates/debug.tmpl")
(tmpl/render {}))})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FILE CHANGES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def sql:retrieve-range-of-changes
"select revn, changes from file_change where file_id=? and revn >= ? and revn <= ? order by revn")
(def sql:retrieve-single-change
"select revn, changes, data from file_change where file_id=? and revn = ?")
(defn- retrieve-file-data
[{:keys [::db/pool]} {:keys [params ::session/profile-id] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(let [file-id (some-> params :file-id parse-uuid)
revn (some-> params :revn parse-long)
filename (str file-id)]
(when-not file-id
(ex/raise :type :validation
:code :missing-arguments))
(let [data (if (integer? revn)
(some-> (db/exec-one! pool [sql:retrieve-single-change file-id revn]) :data)
(some-> (db/get-by-id pool :file file-id) :data))]
(when-not data
(ex/raise :type :not-found
:code :enpty-data
:hint "empty response"))
(cond
(contains? params :download)
(prepare-download-response data filename)
(contains? params :clone)
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
data (blob/decode data)]
(create-file pool {:id (uuid/next)
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id
:data data})
{::yrs/status 201
::yrs/body "OK CREATED"})
:else
(prepare-response (blob/decode data))))))
(defn- is-file-exists?
[pool id]
(let [sql "select exists (select 1 from file where id=?) as exists;"]
(-> (db/exec-one! pool [sql id]) :exists)))
(defn- upload-file-data
[{: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 blob/decode)]
(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))]
(if (and overwrite? file-id
(is-file-exists? pool file-id))
(do
(db/update! pool :file
{:data (blob/encode data)}
{:id file-id})
{::yrs/status 200
::yrs/body "OK UPDATED"})
(do
(create-file pool {:id file-id
:name fname
:project-id project-id
:profile-id profile-id
:data data})
{::yrs/status 201
::yrs/body "OK CREATED"})))
{::yrs/status 500
::yrs/body "ERROR"})))
(defn file-data-handler
[cfg request]
(case (yrq/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 [::db/pool]} {:keys [params] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(letfn [(retrieve-changes [file-id revn]
(if (str/includes? revn ":")
(let [[start end] (->> (str/split revn #":")
(map str/trim)
(map parse-long))]
(some->> (db/exec! pool [sql:retrieve-range-of-changes file-id start end])
(map :changes)
(map blob/decode)
(mapcat identity)
(vec)))
(if-let [revn (parse-long revn)]
(let [item (db/exec-one! pool [sql:retrieve-single-change file-id revn])]
(some-> item :changes blob/decode vec))
(ex/raise :type :validation :code :invalid-arguments))))]
(let [file-id (some-> params :id parse-uuid)
revn (or (some-> params :revn parse-long) "latest")
filename (str file-id)]
(when (or (not file-id) (not revn))
(ex/raise :type :validation
:code :invalid-arguments
:hint "missing arguments"))
(let [data (retrieve-changes file-id revn)]
(if (contains? params :download)
(prepare-download-response data filename)
(prepare-response data))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ERROR BROWSER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn error-handler
[{:keys [::db/pool]} request]
(letfn [(get-report [{:keys [path-params]}]
(ex/ignoring
(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-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 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))))
(render-template-v2 [{report :content}]
(-> (io/resource "app/templates/error-report.v2.tmpl")
(tmpl/render report)))
(render-template-v3 [{report :content}]
(-> (io/resource "app/templates/error-report.v3.tmpl")
(tmpl/render report)))
]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(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))]
{::yrs/status 200
::yrs/body result
::yrs/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}})
{::yrs/status 404
::yrs/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")
(defn error-list-handler
[{:keys [::db/pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(let [items (->> (db/exec! pool [sql:error-reports])
(map #(update % :created-at dt/format-instant :rfc1123)))]
{::yrs/status 200
::yrs/body (-> (io/resource "app/templates/error-list.tmpl")
(tmpl/render {:items items}))
::yrs/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EXPORT/IMPORT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-handler
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(let [file-ids (->> (:file-ids params)
(remove empty?)
(mapv parse-uuid))
libs? (contains? params :includelibs)
clone? (contains? params :clone)
embed? (contains? params :embedassets)]
(when-not (seq file-ids)
(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!))]
(if clone?
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)]
(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))
{::yrs/status 200
::yrs/headers {"content-type" "text/plain"}
::yrs/body "OK CLONED"})
{::yrs/status 200
::yrs/body (io/input-stream path)
::yrs/headers {"content-type" "application/octet-stream"
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}}))))
(defn import-handler
[{: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 [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)]
(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))
{::yrs/status 200
::yrs/headers {"content-type" "text/plain"}
::yrs/body "OK"}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OTHER SMALL VIEWS/HANDLERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn health-handler
"Mainly a task that performs a health check."
[{:keys [::db/pool]} _]
(try
(db/exec-one! pool ["select count(*) as count from server_prop;"])
{::yrs/status 200
::yrs/body "OK"}
(catch Throwable cause
(l/warn :hint "unable to execute query on health handler"
:cause cause)
{::yrs/status 503
::yrs/body "KO"})))
(defn changelog-handler
[_ _]
(letfn [(transform-emoji [text state]
[(emj/emojify text) state])
(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/status 200
::yrs/headers {"content-type" "text/html; charset=utf-8"}
::yrs/body (-> clog slurp md->html)}
{::yrs/status 404
::yrs/body "NOT FOUND"})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def with-authorization
{:compile
(fn [& _]
(fn [handler pool]
(fn [request]
(if (authorized? pool request)
(handler request)
(ex/raise :type :authentication
:code :only-admins-allowed)))))})
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::db/pool ::session/manager]))
(defmethod ig/init-key ::routes
[_ {: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)}]
["/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)}]]])
-53
View File
@@ -1,53 +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) UXBOX Labs SL
(ns app.http.doc
"API autogenerated documentation."
(:require
[app.common.data :as d]
[app.config :as cf]
[app.util.services :as sv]
[app.util.template :as tmpl]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
[pretty-spec.core :as ps]))
(defn get-spec-str
[k]
(with-out-str
(ps/pprint (s/form k)
{:ns-aliases {"clojure.spec.alpha" "s"
"clojure.core.specs.alpha" "score"
"clojure.core" nil}})))
(defn prepare-context
[rpc]
(letfn [(gen-doc [type [name f]]
(let [mdata (meta f)]
;; (prn name mdata)
{:type (d/name type)
:name (d/name name)
:auth (:auth mdata true)
:docs (::sv/docs mdata)
:spec (get-spec-str (::sv/spec mdata))}))]
{:query-methods
(into []
(map (partial gen-doc :query))
(->> rpc :methods :query (sort-by first)))
:mutation-methods
(into []
(map (partial gen-doc :mutation))
(->> rpc :methods :mutation (sort-by first)))}))
(defn handler
[rpc]
(let [context (prepare-context rpc)]
(if (contains? cf/flags :backend-api-doc)
(fn [_]
{:status 200
:body (-> (io/resource "api-doc.tmpl")
(tmpl/render context))})
(constantly {:status 404 :body ""}))))
+167 -124
View File
@@ -2,62 +2,42 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(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.uuid :as uuid]
[clojure.pprint]
[cuerdas.core :as str]))
[app.common.schema :as sm]
[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]))
(defn- parse-client-ip
[{:keys [headers] :as request}]
(or (some-> (get headers "x-forwarded-for") (str/split ",") first)
(get headers "x-real-ip")
(get request :remote-addr)))
[request]
(or (some-> (yrq/get-header request "x-forwarded-for") (str/split ",") first)
(yrq/get-header request "x-real-ip")
(yrq/remote-addr request)))
(defn- simple-prune
([s] (simple-prune s (* 1024 1024)))
([s max-length]
(if (> (count s) max-length)
(str (subs s 0 max-length) " [...]")
s)))
(defn- stringify-data
[data]
(binding [clojure.pprint/*print-right-margin* 200]
(let [result (with-out-str (clojure.pprint/pprint data))]
(simple-prune result (* 1024 1024)))))
(defn get-error-context
[request error]
(let [data (ex-data error)]
(d/without-nils
(merge
{:id (str (uuid/next))
:path (str (:uri request))
:method (name (:request-method request))
:hint (or (:hint data) (ex-message error))
:params (stringify-data (:params request))
:data (stringify-data (dissoc data :explain))
:ip-addr (parse-client-ip request)
:explain (str/prune (:explain data) (* 1024 1024) "[...]")}
(when-let [id (:profile-id request)]
{:profile-id id})
(let [headers (:headers request)]
{:user-agent (get headers "user-agent")
:frontend-version (get headers "x-frontend-version" "unknown")})
(when (map? data)
{:error-type (:type data)
:error-code (:code data)})))))
(defn request->context
"Extracts error report relevant context data from request."
[request]
(let [claims (-> {}
(into (::session/token-claims request))
(into (::actoken/token-claims request)))]
{:path (:path request)
:method (:method request)
:params (:params request)
:ip-addr (parse-client-ip request)
:user-agent (yrq/get-header request "user-agent")
:profile-id (:uid claims)
:version (or (yrq/get-header request "x-frontend-version")
"unknown")}))
(defmulti handle-exception
(fn [err & _rest]
@@ -67,102 +47,165 @@
(defmethod handle-exception :authentication
[err _]
{:status 401 :body (ex-data err)})
{::yrs/status 401
::yrs/body (ex-data err)})
(defmethod handle-exception :authorization
[err _]
{::yrs/status 403
::yrs/body (ex-data err)})
(defmethod handle-exception :restriction
[err _]
{:status 400 :body (ex-data err)})
{::yrs/status 400
::yrs/body (ex-data err)})
(defmethod handle-exception :rate-limit
[err _]
(let [headers (-> err ex-data ::http/headers)]
{::yrs/status 429
::yrs/headers headers}))
(defmethod handle-exception :concurrency-limit
[err _]
(let [headers (-> err ex-data ::http/headers)]
{::yrs/status 429
::yrs/headers headers}))
(defmethod handle-exception :validation
[err req]
(let [header (get-in req [:headers "accept"])
edata (ex-data err)]
(if (and (= :spec-validation (:code edata))
(str/starts-with? header "text/html"))
{:status 400
:headers {"content-type" "text/html"}
:body (str "<pre style='font-size:16px'>"
(:explain edata)
"</pre>\n")}
{:status 400
:body (dissoc edata :data)})))
[err _]
(let [{:keys [code] :as data} (ex-data err)]
(cond
(= code :spec-validation)
(let [explain (ex/explain data)]
{::yrs/status 400
::yrs/body (-> data
(dissoc ::s/problems ::s/value)
(cond-> explain (assoc :explain explain)))})
(= code :params-validation)
(let [explain (::sm/explain data)
payload (sm/humanize-data explain)]
{::yrs/status 400
::yrs/body (-> data
(dissoc ::sm/explain)
(assoc :data payload))})
(= code :request-body-too-large)
{::yrs/status 413 ::yrs/body data}
:else
{::yrs/status 400 ::yrs/body data})))
(defmethod handle-exception :assertion
[error request]
(let [edata (ex-data error)
cdata (get-error-context request error)]
(l/update-thread-context! cdata)
(l/error :hint "internal error: assertion"
:error-id (str (:id cdata))
:cause error)
(binding [l/*context* (request->context request)]
(let [{:keys [code] :as data} (ex-data error)]
(cond
(= code :data-validation)
(let [explain (::sm/explain data)
payload (sm/humanize-data explain)]
(l/error :hint "Data assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::sm/explain)
(assoc :data payload))}})
(= code :spec-validation)
(let [explain (ex/explain data)]
(l/error :hint "Spec assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))}})
:else
(do
(l/error :hint "Assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data data}})))))
{:status 500
:body {:type :server-error
:code :assertion
:data (dissoc edata :data)}}))
(defmethod handle-exception :not-found
[err _]
{:status 404 :body (ex-data err)})
{::yrs/status 404
::yrs/body (ex-data err)})
(defmethod handle-exception :internal
[error request]
(binding [l/*context* (request->context request)]
(l/error :hint "Internal error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data (ex-data error)}}))
(defmethod handle-exception org.postgresql.util.PSQLException
[error request]
(let [state (.getSQLState ^java.sql.SQLException error)]
(binding [l/*context* (request->context request)]
(l/error :hint "PSQL error" :message (ex-message error) :cause error)
(cond
(= state "57014")
{::yrs/status 504
::yrs/body {:type :server-error
:code :statement-timeout
:hint (ex-message error)}}
(= state "25P03")
{::yrs/status 504
::yrs/body {:type :server-error
:code :idle-in-transaction-timeout
:hint (ex-message error)}}
:else
{::yrs/status 500
::yrs/body {:type :server-error
:code :unexpected
:hint (ex-message error)
:state state}}))))
(defmethod handle-exception :default
[error request]
(let [edata (ex-data error)]
;; NOTE: 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)
(let [cdata (get-error-context request error)]
(l/update-thread-context! cdata)
(l/error :hint "internal error"
:error-message (ex-message error)
:error-id (str (:id cdata))
:cause error)
{:status 500
:body {:type :server-error
:code :unexpected
:hint (ex-message error)
:data edata}}))))
(defmethod handle-exception org.postgresql.util.PSQLException
[error request]
(let [cdata (get-error-context request error)
state (.getSQLState ^java.sql.SQLException error)]
(l/update-thread-context! cdata)
(l/error :hint "psql exception"
:error-message (ex-message error)
:error-id (str (:id cdata))
:sql-state state
:cause error)
(cond
(= state "57014")
{:status 504
:body {:type :server-timeout
:code :statement-timeout
:hint (ex-message error)}}
;; This means that exception is not a controlled exception.
(nil? edata)
(binding [l/*context* (request->context request)]
(l/error :hint "Unexpected error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unexpected
:hint (ex-message error)}})
(= state "25P03")
{:status 504
:body {:type :server-timeout
:code :idle-in-transaction-timeout
: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)
:else
{:status 500
:body {:type :server-error
:code :psql-exception
:hint (ex-message error)
:state state}})))
(binding [l/*context* (request->context request)]
(l/error :hint "Unhandled error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata}}))))
(defn handle
[error req]
(if (or (instance? java.util.concurrent.CompletionException error)
(instance? java.util.concurrent.ExecutionException error))
(handle-exception (.getCause ^Throwable error) req)
(handle-exception error req)))
[cause request]
(if (or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(handle-exception (ex-cause cause) request)
(handle-exception cause request)))
-71
View File
@@ -1,71 +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) UXBOX Labs SL
(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]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(declare send-feedback)
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool]))
(defmethod ig/init-key ::handler
[_ {:keys [pool] :as scfg}]
(let [ftoken (cf/get :feedback-token ::no-token)
enabled (contains? cf/flags :user-feedback)]
(fn [{:keys [profile-id] :as request}]
(let [token (get-in request [:headers "x-feedback-token"])
params (d/merge (:params request)
(:body-params request))]
(when-not enabled
(ex/raise :type :validation
:code :feedback-disabled
:hint "feedback module is disabled"))
(cond
(uuid? profile-id)
(let [profile (profile/retrieve-profile-data pool profile-id)
params (assoc params :from (:email profile))]
(when-not (:is-muted profile)
(send-feedback pool profile params)))
(= token ftoken)
(send-feedback scfg nil params))
{:status 204 :body ""}))))
(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))
+212 -166
View File
@@ -2,204 +2,250 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.middleware
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.transit :as t]
[app.config :as cf]
[app.metrics :as mtx]
[app.util.json :as json]
[buddy.core.codecs :as bc]
[buddy.core.hash :as bh]
[clojure.java.io :as io]
[ring.middleware.cookies :refer [wrap-cookies]]
[ring.middleware.keyword-params :refer [wrap-keyword-params]]
[ring.middleware.multipart-params :refer [wrap-multipart-params]]
[ring.middleware.params :refer [wrap-params]]))
[cuerdas.core :as str]
[promesa.core :as p]
[promesa.exec :as px]
[promesa.util :as pu]
[yetti.adapter :as yt]
[yetti.middleware :as ymw]
[yetti.request :as yrq]
[yetti.response :as yrs])
(:import
com.fasterxml.jackson.core.JsonParseException
com.fasterxml.jackson.core.io.JsonEOFException
io.undertow.server.RequestTooBigException
java.io.OutputStream
java.io.InputStream))
(defn wrap-server-timing
(set! *warn-on-reflection* true)
(def server-timing
{:name ::server-timing
:compile (constantly ymw/wrap-server-timing)})
(def params
{:name ::params
:compile (constantly ymw/wrap-params)})
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(defn wrap-parse-request
[handler]
(let [seconds-from #(float (/ (- (System/nanoTime) %) 1000000000))]
(fn [request]
(let [start (System/nanoTime)
response (handler request)]
(update response :headers
(fn [headers]
(assoc headers "Server-Timing" (str "total;dur=" (seconds-from start)))))))))
(letfn [(process-request [request]
(let [header (yrq/get-header request "content-type")]
(cond
(str/starts-with? header "application/transit+json")
(with-open [^InputStream is (yrq/body request)]
(let [params (t/read! (t/reader is))]
(-> request
(assoc :body-params params)
(update :params merge params))))
(defn wrap-parse-request-body
(str/starts-with? header "application/json")
(with-open [^InputStream is (yrq/body request)]
(let [params (json/decode is json-mapper)]
(-> request
(assoc :body-params params)
(update :params merge params))))
:else
request)))
(handle-error [raise cause]
(cond
(instance? RuntimeException cause)
(if-let [cause (ex-cause cause)]
(handle-error raise cause)
(raise cause))
(instance? RequestTooBigException cause)
(raise (ex/error :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)))]
(fn [request respond raise]
(if (= (yrq/method request) :post)
(let [request (ex/try! (process-request request))]
(if (ex/exception? request)
(handle-error raise request)
(handler request respond raise)))
(handler request respond raise)))))
(def parse-request
{:name ::parse-request
:compile (constantly wrap-parse-request)})
(defn buffered-output-stream
"Returns a buffered output stream that ignores flush calls. This is
needed because transit-java calls flush very aggresivelly on each
object write."
[^java.io.OutputStream os ^long chunk-size]
(yetti.util.BufferedOutputStream. os (int chunk-size)))
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
(defn wrap-format-response
[handler]
(letfn [(parse-transit [body]
(let [reader (t/reader body)]
(t/read! reader)))
(letfn [(transit-streamable-body [data opts]
(reify yrs/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(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 _)
(catch Throwable cause
(l/warn :hint "unexpected error on encoding response"
:cause cause))
(finally
(.close ^OutputStream output-stream))))))
(parse-json [body]
(let [reader (io/reader body)]
(json/read reader)))
(json-streamable-body [data]
(reify yrs/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(json/write! bos data json-mapper))
(parse [type body]
(try
(case type
:json (parse-json body)
:transit (parse-transit body))
(catch Exception e
(let [data {:type :parse
:hint "unable to parse request body"
:message (ex-message e)}]
{:status 400
:headers {"content-type" "application/transit+json"}
:body (t/encode-str data {:type :json-verbose})}))))]
(catch java.io.IOException _)
(catch Throwable cause
(l/warn :hint "unexpected error on encoding response"
:cause cause))
(finally
(.close ^OutputStream output-stream))))))
(fn [{:keys [headers body] :as request}]
(let [ctype (get headers "content-type")]
(handler
(case ctype
"application/transit+json"
(let [params (parse :transit body)]
(-> request
(assoc :body-params params)
(update :params merge params)))
(format-response-with-json [response _]
(let [body (::yrs/body response)]
(if (or (boolean? body) (coll? body))
(-> response
(update ::yrs/headers assoc "content-type" "application/json")
(assoc ::yrs/body (json-streamable-body body)))
response)))
"application/json"
(let [params (parse :json body)]
(-> request
(assoc :body-params params)
(update :params merge params)))
(format-response-with-transit [response request]
(let [body (::yrs/body response)]
(if (or (boolean? body) (coll? body))
(let [qs (yrq/query request)
opts (if (or (contains? cf/flags :transit-readable-response)
(str/includes? qs "transit_verbose"))
{:type :json-verbose}
{:type :json})]
(-> response
(update ::yrs/headers assoc "content-type" "application/transit+json")
(assoc ::yrs/body (transit-streamable-body body opts))))
response)))
request))))))
(format-from-params [{:keys [query-params] :as request}]
(and (= "json" (get query-params :_fmt))
"application/json"))
(def parse-request-body
{:name ::parse-request-body
:compile (constantly wrap-parse-request-body)})
(format-response [response request]
(let [accept (or (format-from-params request)
(yrq/get-header request "accept"))]
(cond
(or (= accept "application/transit+json")
(str/includes? accept "application/transit+json"))
(format-response-with-transit response request)
(defn- impl-format-response-body
[response _request]
(let [body (:body response)
opts {:type :json}]
(cond
(coll? body)
(-> response
(update :headers assoc "content-type" "application/transit+json")
(assoc :body (t/encode body opts)))
(or (= accept "application/json")
(str/includes? accept "application/json"))
(format-response-with-json response request)
(nil? body)
(assoc response :status 204 :body "")
:else
(format-response-with-transit response request))))
:else
response)))
(process-response [response request]
(cond-> response
(map? response) (format-response request)))]
(defn- wrap-format-response-body
[handler]
(fn [request]
(let [response (handler request)]
(cond-> response
(map? response) (impl-format-response-body request)))))
(fn [request respond raise]
(handler request
(fn [response]
(respond (process-response response request)))
raise))))
(def format-response-body
{:name ::format-response-body
:compile (constantly wrap-format-response-body)})
(def format-response
{:name ::format-response
:compile (constantly wrap-format-response)})
(defn wrap-errors
[handler on-error]
(fn [request]
(try
(handler request)
(catch Throwable e
(on-error e request)))))
(fn [request respond raise]
(handler request respond (fn [cause]
(try
(respond (on-error cause request))
(catch Throwable cause
(raise cause)))))))
(def errors
{:name ::errors
:compile (constantly wrap-errors)})
(def metrics
{:name ::metrics
:wrap (fn [handler]
(mtx/wrap-counter handler {:id "http__requests_counter"
:help "Absolute http requests counter."}))})
(def cookies
{:name ::cookies
:compile (constantly wrap-cookies)})
(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")))
(def params
{:name ::params
:compile (constantly wrap-params)})
(def multipart-params
{:name ::multipart-params
:compile (constantly wrap-multipart-params)})
(def keyword-params
{:name ::keyword-params
:compile (constantly wrap-keyword-params)})
(def server-timing
{:name ::server-timing
:compile (constantly wrap-server-timing)})
(defn wrap-etag
(defn wrap-cors
[handler]
(letfn [(generate-etag [{:keys [body] :as response}]
(str "W/\"" (-> body bh/blake2b-128 bc/bytes->hex) "\""))
(get-match [{:keys [headers] :as request}]
(get headers "if-none-match"))]
(fn [request]
(let [response (handler request)]
(if (= :get (:request-method request))
(let [etag (generate-etag response)
match (get-match request)
response (update response :headers #(assoc % "ETag" etag))]
(cond-> response
(and (string? match)
(= :get (:request-method request))
(= etag match))
(-> response
(assoc :body "")
(assoc :status 304))))
response)))))
(def etag
{:name ::etag
:compile (constantly wrap-etag)})
(defn activity-logger
[handler]
(let [logger "penpot.profile-activity"]
(fn [{:keys [headers] :as request}]
(let [ip-addr (get headers "x-forwarded-for")
profile-id (:profile-id request)
qstring (:query-string request)]
(l/info ::l/async true
::l/logger logger
:ip-addr ip-addr
:profile-id profile-id
:uri (str (:uri request) (when qstring (str "?" qstring)))
:method (name (:request-method request)))
(handler request)))))
(defn- wrap-cors
[handler]
(if-not (contains? cf/flags :cors)
handler
(letfn [(add-cors-headers [response request]
(-> response
(update
:headers
(fn [headers]
(-> headers
(assoc "access-control-allow-origin" (get-in request [:headers "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"))))))]
(fn [request]
(if (= (:request-method request) :options)
(-> {:status 200 :body ""}
(add-cors-headers request))
(let [response (handler request)]
(add-cors-headers response request)))))))
(fn [request]
(let [response (if (= (yrq/method request) :options)
{::yrs/status 200}
(handler request))
origin (yrq/get-header request "origin")]
(update response ::yrs/headers with-cors-headers origin))))
(def cors
{:name ::cors
:compile (constantly wrap-cors)})
:compile (fn [& _]
(when (contains? cf/flags :cors)
wrap-cors))})
(def restrict-methods
{:name ::restrict-methods
:compile
(fn [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/status 405})))))))})
(def with-dispatch
{:name ::with-dispatch
:compile
(fn [& _]
(fn [handler executor]
(let [executor (px/resolve-executor executor)]
(fn [request respond raise]
(->> (px/submit! executor (partial handler request))
(p/fnly (pu/handler respond raise)))))))})
-376
View File
@@ -1,376 +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) UXBOX Labs SL
(ns app.http.oauth
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.uri :as u]
[app.config :as cf]
[app.db :as db]
[app.loggers.audit :as audit]
[app.rpc.queries.profile :as profile]
[app.util.http :as http]
[app.util.time :as dt]
[clojure.data.json :as json]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
(defn- build-redirect-uri
[{:keys [provider] :as cfg}]
(let [public (u/uri (:public-uri cfg))]
(str (assoc public :path (str "/api/auth/oauth/" (:name provider) "/callback")))))
(defn- build-auth-uri
[{:keys [provider] :as cfg} state]
(let [params {:client_id (:client-id provider)
:redirect_uri (build-redirect-uri cfg)
:response_type "code"
:state state
:scope (str/join " " (:scopes provider []))}
query (u/map->query-string params)]
(-> (u/uri (:auth-uri provider))
(assoc :query query)
(str))))
(defn retrieve-access-token
[{:keys [provider] :as cfg} code]
(try
(let [params {:client_id (:client-id provider)
:client_secret (:client-secret provider)
:code code
:grant_type "authorization_code"
:redirect_uri (build-redirect-uri cfg)}
req {:method :post
:headers {"content-type" "application/x-www-form-urlencoded"}
:uri (:token-uri provider)
:body (u/map->query-string params)}
res (http/send! req)]
(when (= 200 (:status res))
(let [data (json/read-str (:body res))]
{:token (get data "access_token")
:type (get data "token_type")})))
(catch Exception e
(l/warn :hint "unexpected error on retrieve-access-token" :cause e)
nil)))
(defn- qualify-props
[provider props]
(reduce-kv (fn [result k v]
(assoc result (keyword (:name provider) (name k)) v))
{}
props))
(defn- retrieve-user-info
[{:keys [provider] :as cfg} tdata]
(try
(let [req {:uri (:user-uri provider)
:headers {"Authorization" (str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get}
res (http/send! req)]
(when (= 200 (:status res))
(let [info (json/read-str (:body res) :key-fn keyword)]
{:backend (:name provider)
:email (:email info)
:fullname (:name info)
:props (->> (dissoc info :name :email)
(qualify-props provider))})))
(catch Exception e
(l/warn :hint "unexpected exception on retrieve-user-info" :cause e)
nil)))
(s/def ::backend ::us/not-empty-string)
(s/def ::email ::us/not-empty-string)
(s/def ::fullname ::us/not-empty-string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::info
(s/keys :req-un [::backend
::email
::fullname
::props]))
(defn retrieve-info
[{:keys [tokens provider] :as cfg} request]
(let [state (get-in request [:params :state])
state (tokens :verify {:token state :iss :oauth})
info (some->> (get-in request [:params :code])
(retrieve-access-token cfg)
(retrieve-user-info cfg))]
(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 :unable-to-auth
:hint "no user 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 #{}))]
;; 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 enought 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)))))
;; --- HTTP HANDLERS
(defn extract-utm-props
"Extracts additional data from user params."
[params]
(reduce-kv (fn [params k v]
(let [sk (name k)]
(cond-> params
(str/starts-with? sk "utm_")
(assoc (->> sk str/kebab (keyword "penpot")) v))))
{}
params))
(defn- retrieve-profile
[{:keys [pool] :as cfg} info]
(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))))
(defn- redirect-response
[uri]
{:status 302
:headers {"location" (str uri)}
:body ""})
(defn- generate-error-redirect
[cfg error]
(let [uri (-> (u/uri (:public-uri cfg))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string {:error "unable-to-auth" :hint (ex-message error)})))]
(redirect-response uri)))
(defn- generate-redirect
[{:keys [tokens session audit] :as cfg} request info profile]
(if profile
(let [sxf ((:create session) (:id profile))
token (or (:invitation-token info)
(tokens :generate {:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
params {:token token}
uri (-> (u/uri (:public-uri cfg))
(assoc :path "/#/auth/verify-token")
(assoc :query (u/map->query-string params)))]
(when (fn? audit)
(audit :cmd :submit
:type "mutation"
:name "login"
:profile-id (:id profile)
:ip-addr (audit/parse-client-ip request)
: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 info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (:public-uri cfg))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))))
(defn- auth-handler
[{:keys [tokens] :as cfg} {:keys [params] :as request}]
(let [invitation (:invitation-token params)
props (extract-utm-props params)
state (tokens :generate
{:iss :oauth
:invitation-token invitation
:props props
:exp (dt/in-future "15m")})
uri (build-auth-uri cfg state)]
{:status 200
:body {:redirect-uri uri}}))
(defn- callback-handler
[cfg request]
(try
(let [info (retrieve-info cfg request)
profile (retrieve-profile cfg info)]
(generate-redirect cfg request info profile))
(catch Exception e
(l/warn :hint "error on oauth process"
:cause e)
(generate-error-redirect cfg e))))
;; --- INIT
(declare initialize)
(s/def ::public-uri ::us/not-empty-string)
(s/def ::session map?)
(s/def ::tokens fn?)
(s/def ::rpc map?)
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::public-uri ::session ::tokens ::rpc ::db/pool]))
(defn wrap-handler
[cfg handler]
(fn [request]
(let [provider (get-in request [:path-params :provider])
provider (get-in @cfg [:providers provider])]
(when-not provider
(ex/raise :type :not-found
:context {:provider provider}
:hint "provider not configured"))
(-> (assoc @cfg :provider provider)
(handler request)))))
(defmethod ig/init-key ::handler
[_ cfg]
(let [cfg (initialize cfg)]
{:handler (wrap-handler cfg auth-handler)
:callback-handler (wrap-handler cfg callback-handler)}))
(defn- discover-oidc-config
[{:keys [base-uri] :as opts}]
(let [discovery-uri (u/join base-uri ".well-known/openid-configuration")
response (http/send! {:method :get :uri (str discovery-uri)})]
(when (= 200 (:status response))
(let [data (json/read-str (:body response))]
(assoc opts
:token-uri (get data "token_endpoint")
:auth-uri (get data "authorization_endpoint")
:user-uri (get data "userinfo_endpoint"))))))
(defn- obfuscate-string
[s]
(if (< (count s) 10)
(apply str (take (count s) (repeat "*")))
(str (subs s 0 5)
(apply str (take (- (count s) 5) (repeat "*"))))))
(defn- initialize-oidc-provider
[cfg]
(let [opts {:base-uri (cf/get :oidc-base-uri)
:client-id (cf/get :oidc-client-id)
:client-secret (cf/get :oidc-client-secret)
:token-uri (cf/get :oidc-token-uri)
:auth-uri (cf/get :oidc-auth-uri)
:user-uri (cf/get :oidc-user-uri)
:scopes (cf/get :oidc-scopes #{"openid" "profile" "email"})
:roles-attr (cf/get :oidc-roles-attr)
:roles (cf/get :oidc-roles)
:name "oidc"}]
(if (and (string? (:base-uri opts))
(string? (:client-id opts))
(string? (:client-secret opts)))
(if (and (string? (:token-uri opts))
(string? (:user-uri opts))
(string? (:auth-uri opts)))
(do
(l/info :action "initialize" :provider "oidc" :method "static"
:opts (pr-str (update opts :client-secret obfuscate-string)))
(assoc-in cfg [:providers "oidc"] opts))
(let [opts (discover-oidc-config opts)]
(l/info :action "initialize" :provider "oidc" :method "discover"
:opts (pr-str (update opts :client-secret obfuscate-string)))
(assoc-in cfg [:providers "oidc"] opts)))
cfg)))
(defn- initialize-google-provider
[cfg]
(let [opts {:client-id (cf/get :google-client-id)
:client-secret (cf/get :google-client-secret)
:scopes #{"openid" "email" "profile"}
:auth-uri "https://accounts.google.com/o/oauth2/v2/auth"
:token-uri "https://oauth2.googleapis.com/token"
:user-uri "https://openidconnect.googleapis.com/v1/userinfo"
:name "google"}]
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :action "initialize" :provider "google"
:opts (pr-str (update opts :client-secret obfuscate-string)))
(assoc-in cfg [:providers "google"] opts))
cfg)))
(defn- initialize-github-provider
[cfg]
(let [opts {:client-id (cf/get :github-client-id)
:client-secret (cf/get :github-client-secret)
:scopes #{"read:user" "user:email"}
:auth-uri "https://github.com/login/oauth/authorize"
:token-uri "https://github.com/login/oauth/access_token"
:user-uri "https://api.github.com/user"
:name "github"}]
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :action "initialize" :provider "github"
:opts (pr-str (update opts :client-secret obfuscate-string)))
(assoc-in cfg [:providers "github"] opts))
cfg)))
(defn- initialize-gitlab-provider
[cfg]
(let [base (cf/get :gitlab-base-uri "https://gitlab.com")
opts {:base-uri base
:client-id (cf/get :gitlab-client-id)
:client-secret (cf/get :gitlab-client-secret)
:scopes #{"read_user"}
:auth-uri (str base "/oauth/authorize")
:token-uri (str base "/oauth/token")
:user-uri (str base "/api/v4/user")
:name "gitlab"}]
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :action "initialize" :provider "gitlab"
:opts (pr-str (update opts :client-secret obfuscate-string)))
(assoc-in cfg [:providers "gitlab"] opts))
cfg)))
(defn- initialize
[cfg]
(let [cfg (agent cfg :error-mode :continue)]
(send-off cfg initialize-google-provider)
(send-off cfg initialize-gitlab-provider)
(send-off cfg initialize-github-provider)
(send-off cfg initialize-oidc-provider)
cfg))
+301 -168
View File
@@ -2,198 +2,331 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.session
(:refer-clojure :exclude [read])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.config :as cfg]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.metrics :as mtx]
[app.util.async :as aa]
[app.db.sql :as sql]
[app.http.session.tasks :as-alias tasks]
[app.main :as-alias main]
[app.tokens :as tokens]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
[cuerdas.core :as str]
[integrant.core :as ig]
[yetti.request :as yrq]))
;; A default cookie name for storing the session. We don't allow
;; configure it.
(def cookie-name "auth-token")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DEFAULTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; A default cookie name for storing the session.
(def default-auth-token-cookie-name "auth-token")
;; A cookie that we can use to check from other sites of the same
;; domain if a user is authenticated.
(def default-authenticated-cookie-name "authenticated")
;; Default value for cookie max-age
(def default-cookie-max-age (dt/duration {:days 7}))
;; Default age for automatic session renewal
(def default-renewal-max-age (dt/duration {:hours 6}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PROTOCOLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defprotocol ISessionManager
(read [_ key])
(write! [_ key data])
(update! [_ data])
(delete! [_ key]))
(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
[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
[pool]
(reify ISessionManager
(read [_ token]
(db/exec-one! pool (sql/select :http-session {:id token})))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(db/insert! pool :http-session params)
params))
(update! [_ params]
(let [updated-at (dt/now)]
(db/update! pool :http-session
{:updated-at updated-at}
{:id (:id params)})
(assoc params :updated-at updated-at)))
(delete! [_ token]
(db/delete! pool :http-session {:id token})
nil)))
(defn inmemory-manager
[]
(let [cache (atom {})]
(reify ISessionManager
(read [_ token]
(get @cache token))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(swap! cache assoc key params)
params))
(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]
(swap! cache dissoc token)
nil))))
(defmethod ig/pre-init-spec ::manager [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::manager
[_ {:keys [::db/pool]}]
(if (db/read-only? pool)
(inmemory-manager)
(database-manager pool)))
(defmethod ig/halt-key! ::manager
[_ _])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MANAGER IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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
[{:keys [::manager ::main/props]} profile-id]
(us/assert! ::manager manager)
(us/assert! ::us/uuid profile-id)
(fn [request response]
(let [uagent (yrq/get-header request "user-agent")
params {:profile-id profile-id
: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
[{: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)))))
(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"})))
(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)))
(defn- get-session
[manager token]
(some->> token (read manager)))
(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)))))
(defn- wrap-soft-auth
[handler {:keys [::manager ::main/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)))]
(fn [request respond raise]
(let [request (handle-request request)]
(handler request respond raise)))))
(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)))]
(cond-> (handler request)
(renew-session? session)
(-> (assign-auth-token-cookie session)
(assign-authenticated-cookie session))))))
(def soft-auth
{:name ::soft-auth
:compile (constantly wrap-soft-auth)})
(def authz
{:name ::authz
:compile (constantly wrap-authz)})
;; --- IMPL
(defn- create-session
[{:keys [conn tokens] :as cfg} {:keys [profile-id headers] :as request}]
(let [token (tokens :generate {:iss "authentication"
:iat (dt/now)
:uid profile-id})
params {:user-agent (get headers "user-agent")
:profile-id profile-id
:id token}]
(db/insert! conn :http-session params)))
(defn- assign-auth-token-cookie
[response {token :id updated-at :updated-at}]
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)
created-at (or updated-at (dt/now))
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
secure? (contains? cf/flags :secure-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))
cookie {:path "/"
:http-only true
:expires expires
:value token
:comment comment
:same-site (if cors? :none :lax)
:secure secure?}]
(update response :cookies assoc name cookie)))
(defn- delete-session
[{:keys [conn] :as cfg} {:keys [cookies] :as request}]
(when-let [token (get-in cookies [cookie-name :value])]
(db/delete! conn :http-session {:id token}))
nil)
(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")
(defn- retrieve-session
[{:keys [conn] :as cfg} id]
(when id
(db/exec-one! conn ["select id, profile_id from http_session where id = ?" id])))
created-at (or updated-at (dt/now))
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
(defn- retrieve-from-request
[cfg {:keys [cookies] :as request}]
(->> (get-in cookies [cookie-name :value])
(retrieve-session cfg)))
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
secure? (contains? cf/flags :secure-session-cookies)
(defn- add-cookies
[response {:keys [id] :as session}]
(let [cors? (contains? cfg/flags :cors)
secure? (contains? cfg/flags :secure-session-cookies)]
(assoc response :cookies {cookie-name {:path "/"
:http-only true
:value id
:same-site (if cors? :none :strict)
:secure secure?}})))
cookie {:domain domain
:expires expires
:path "/"
:comment comment
:value true
:same-site :strict
:secure secure?}]
(cond-> response
(string? domain)
(update :cookies assoc cname cookie))))
(defn- clear-cookies
(defn- clear-auth-token-cookie
[response]
(assoc response :cookies {cookie-name {:value "" :max-age -1}}))
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(update response :cookies assoc cname {:path "/" :value "" :max-age 0})))
(defn- middleware
[cfg handler]
(fn [request]
(if-let [{:keys [id profile-id] :as session} (retrieve-from-request cfg request)]
(do
(a/>!! (::events-ch cfg) id)
(l/update-thread-context! {:profile-id profile-id})
(handler (assoc request :profile-id profile-id)))
(handler request))))
(defn- clear-authenticated-cookie
[response]
(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 0}))))
;; --- STATE INIT: SESSION
(defmethod ig/pre-init-spec ::session [_]
(s/keys :req-un [::db/pool]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TASK: SESSION GC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/prep-key ::session
(s/def ::tasks/max-age ::dt/duration)
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]
:opt [::tasks/max-age]))
(defmethod ig/prep-key ::tasks/gc
[_ cfg]
(d/merge {:buffer-size 64}
(d/without-nils cfg)))
(defmethod ig/init-key ::session
[_ {:keys [pool] :as cfg}]
(let [events (a/chan (a/dropping-buffer (:buffer-size cfg)))
cfg (-> cfg
(assoc :conn pool)
(assoc ::events-ch events))]
(-> cfg
(assoc :middleware #(middleware cfg %))
(assoc :create (fn [profile-id]
(fn [request response]
(let [request (assoc request :profile-id profile-id)
session (create-session cfg request)]
(add-cookies response session)))))
(assoc :delete (fn [request response]
(delete-session cfg request)
(-> response
(assoc :status 204)
(assoc :body "")
(clear-cookies)))))))
(defmethod ig/halt-key! ::session
[_ data]
(a/close! (::events-ch data)))
;; --- STATE INIT: SESSION UPDATER
(declare update-sessions)
(s/def ::session map?)
(s/def ::max-batch-age ::cfg/http-session-updater-batch-max-age)
(s/def ::max-batch-size ::cfg/http-session-updater-batch-max-size)
(defmethod ig/pre-init-spec ::updater [_]
(s/keys :req-un [::db/pool ::wrk/executor ::mtx/metrics ::session]
:opt-un [::max-batch-age
::max-batch-size]))
(defmethod ig/prep-key ::updater
[_ cfg]
(merge {:max-batch-age (dt/duration {:minutes 5})
:max-batch-size 200}
(d/without-nils cfg)))
(defmethod ig/init-key ::updater
[_ {:keys [session metrics] :as cfg}]
(l/info :action "initialize session updater"
:max-batch-age (str (:max-batch-age cfg))
:max-batch-size (str (:max-batch-size cfg)))
(let [input (aa/batch (::events-ch session)
{:max-batch-size (:max-batch-size cfg)
:max-batch-age (inst-ms (:max-batch-age cfg))})
mcnt (mtx/create
{:name "http_session_update_total"
:help "A counter of session update batch events."
:registry (:registry metrics)
:type :counter})]
(a/go-loop []
(when-let [[reason batch] (a/<! input)]
(let [result (a/<! (update-sessions cfg batch))]
(mcnt :inc)
(cond
(ex/exception? result)
(l/error :task "updater"
:hint "unexpected error on update sessions"
:cause result)
(= :size reason)
(l/debug :task "updater"
:action "update sessions"
:reason (name reason)
:count result))
(recur))))))
(defn- update-sessions
[{:keys [pool executor]} ids]
(aa/with-thread executor
(db/exec-one! pool ["update http_session set updated_at=now() where id = ANY(?)"
(into-array String ids)])
(count ids)))
;; --- STATE INIT: SESSION GC
(declare sql:delete-expired)
(s/def ::max-age ::dt/duration)
(defmethod ig/pre-init-spec ::gc-task [_]
(s/keys :req-un [::db/pool]
:opt-un [::max-age]))
(defmethod ig/prep-key ::gc-task
[_ cfg]
(merge {:max-age (dt/duration {:days 2})}
(d/without-nils cfg)))
(defmethod ig/init-key ::gc-task
[_ {:keys [pool max-age] :as cfg}]
(fn [_]
(db/with-atomic [conn pool]
(let [interval (db/interval max-age)
result (db/exec-one! conn [sql:delete-expired interval])
result (:next.jdbc/update-count result)]
(l/debug :task "gc"
:action "clean http sessions"
:count result)
result))))
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)]
(merge {::tasks/max-age max-age} (d/without-nils cfg))))
(def ^:private
sql:delete-expired
"delete from http_session
where updated_at < now() - ?::interval")
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]
(let [interval (db/interval max-age)
result (db/exec-one! conn [sql:delete-expired interval interval])
result (:next.jdbc/update-count result)]
(l/debug :task "gc"
:hint "clean http sessions"
:deleted result)
result))))
+318
View File
@@ -0,0 +1,318 @@
;; 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.websocket
"A penpot notification service for file cooperative edition."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[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.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec.csp :as sp]
[yetti.websocket :as yws]))
(def recv-labels
(into-array String ["recv"]))
(def send-labels
(into-array String ["send"]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WEBSOCKET HOOKS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def state (atom {}))
;; REPL HELPERS
(defn repl-get-connections-for-file
[file-id]
(->> (vals @state)
(filter #(= file-id (-> % deref ::file-subscription :file-id)))
(map ::ws/id)))
(defn repl-get-connections-for-team
[team-id]
(->> (vals @state)
(filter #(= team-id (-> % deref ::team-subscription :team-id)))
(map ::ws/id)))
(defn repl-close-connection
[id]
(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)
:subscribed-file (-> wsp ::file-subscription :file-id)
:subscribed-team (-> wsp ::team-subscription :team-id)}))
(defn repl-print-connection-info
[id]
(some-> id repl-get-connection-info pp/pprint))
(defn repl-print-connection-info-for-file
[file-id]
(some->> (repl-get-connections-for-file file-id)
(map repl-get-connection-info)
(pp/pprint)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WEBSOCKET HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmulti handle-message
(fn [_ _ message]
(:type message)))
(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)))]
;; 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})
;; Forward the subscription messages directly to the websocket output channel
(sp/pipe ch output-ch false)
;; Subscribe to the profile topic on msgbus/redis
(mbus/sub! msgbus :topic profile-id :chan ch)))
(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}]
;; Close profile subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
;; Close team subscription if exists
(when-let [ch (:channel tsub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
;; 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
[{: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))))]
(sp/pipe channel output-ch false)
(mbus/sub! msgbus :topic team-id :chan channel)
(let [subs {:team-id team-id :channel channel :topic team-id}]
(swap! state assoc ::team-subscription subs))
;; Close previous subscription if exists
(when-let [ch (:channel prev-subs)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))))
(defmethod handle-message :subscribe-file
[{: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))))]
(let [subs {:file-id file-id :channel fch :topic file-id}]
(swap! state assoc ::file-subscription subs))
;; Close previous subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(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)))
;; Subscribe to file topic
(mbus/sub! msgbus :topic file-id :chan fch)
;; 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
[{: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)
(let [subs (::file-subscription @state)
message {:type :leave-file
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(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))
(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
[{: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
[_ {:keys [::ws/id]} message]
(l/warn :hint "received unexpected message"
:message message
:conn-id id))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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)
(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))))))
(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))
(defn- on-snd-message
[{:keys [::mtx/metrics]} message]
(mtx/run! metrics
:id :websocket-messages-total
:labels send-labels
:inc 1)
message)
(s/def ::session-id ::us/uuid)
(s/def ::handler-params
(s/keys :req-un [::session-id]))
(defn- http-handler
[cfg {:keys [params ::session/profile-id] :as request}]
(let [{:keys [session-id]} (us/conform ::handler-params params)]
(cond
(not profile-id)
(ex/raise :type :authentication
:hint "Authentication required.")
(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)
(->> (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 request))))))
(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]
["/ws/notifications" {:middleware [[session/authz cfg]]
:handler (partial http-handler cfg)
:allowed-methods #{:get}}])
+249 -187
View File
@@ -2,12 +2,13 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.loggers.audit
"Services related to the user activity (audit log)."
(: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]
@@ -15,227 +16,290 @@
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.util.http :as http]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.client :as http.client]
[app.loggers.audit.tasks :as-alias tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.main :as-alias main]
[app.rpc :as-alias rpc]
[app.rpc.retry :as rtry]
[app.tokens :as tokens]
[app.util.services :as-alias sv]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.exec :as px]))
[promesa.exec :as px]
[yetti.request :as yrq]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn parse-client-ip
[{:keys [headers] :as request}]
(or (some-> (get headers "x-forwarded-for") (str/split ",") first)
(get headers "x-real-ip")
(get request :remote-addr)))
[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)))
(defn extract-utm-params
"Extracts additional data from params and namespace them under
`penpot` ns."
[params]
(letfn [(process-param [params k v]
(let [sk (d/name k)]
(cond-> params
(str/starts-with? sk "utm_")
(assoc (->> sk str/kebab (keyword "penpot")) v)
(str/starts-with? sk "mtm_")
(assoc (->> sk str/kebab (keyword "penpot")) v))))]
(reduce-kv process-param {} params)))
(def ^:private
profile-props
[:id
:is-active
:is-muted
:auth-backend
:email
:default-team-id
:default-project-id
:fullname
:lang])
(defn profile->props
[profile]
(-> profile
(select-keys [:is-active :is-muted :auth-backend :email :default-team-id :default-project-id :fullname :lang])
(select-keys profile-props)
(merge (:props profile))
(d/without-nils)))
(def reserved-props
#{:session-id
:password
:old-password
:token})
(defn clean-props
[{:keys [profile-id] :as event}]
(letfn [(clean-common [props]
(-> props
(dissoc :session-id)
(dissoc :password)
(dissoc :old-password)
(dissoc :token)))
[props]
(into {}
(comp
(d/without-nils)
(d/without-qualified)
(remove #(contains? reserved-props (key %))))
props))
(clean-profile-id [props]
(cond-> props
(= profile-id (:profile-id props))
(dissoc :profile-id)))
;; --- SPECS
(clean-complex-data [props]
(reduce-kv (fn [props k v]
(cond-> props
(or (string? v)
(uuid? v)
(boolean? v)
(number? v))
(assoc k v)
(keyword? v)
(assoc k (name v))))
{}
props))]
(update event :props #(-> % clean-common clean-profile-id clean-complex-data))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare persist-http-events)
(s/def ::profile-id ::us/uuid)
(s/def ::name ::us/string)
(s/def ::type ::us/string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::timestamp dt/instant?)
(s/def ::context (s/map-of ::us/keyword any?))
(s/def ::event
(s/keys :req-un [::type ::name ::props ::timestamp ::profile-id]
:opt-un [::context]))
(s/def ::events (s/every ::event))
(defmethod ig/init-key ::http-handler
[_ {:keys [executor] :as cfg}]
(fn [{:keys [params profile-id] :as request}]
(when (contains? cf/flags :audit-log)
(let [events (->> (:events params)
(remove #(not= profile-id (:profile-id %)))
(us/conform ::events))
ip-addr (parse-client-ip request)
cfg (-> cfg
(assoc :source "frontend")
(assoc :events events)
(assoc :ip-addr ip-addr))]
(px/run! executor #(persist-http-events cfg))))
{:status 204 :body ""}))
(defn- persist-http-events
[{:keys [pool events ip-addr source] :as cfg}]
(try
(let [columns [:id :name :source :type :tracked-at :profile-id :ip-addr :props :context]
prepare-xf (map (fn [event]
[(uuid/next)
(:name event)
source
(:type event)
(:timestamp event)
(:profile-id event)
(db/inet ip-addr)
(db/tjson (:props event))
(db/tjson (d/without-nils (:context event)))]))
events (us/conform ::events events)]
(when (seq events)
(->> (into [] prepare-xf events)
(db/insert-multi! pool :audit-log columns))))
(catch Throwable e
(let [xdata (ex-data e)]
(if (= :spec-validation (:code xdata))
(l/error ::l/raw (str "spec validation on persist-events:\n"
(:explain xdata)))
(l/error :hint "error on persist-events"
:cause e))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Collector
;; 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.
(declare persist-events)
(s/def ::profile-id ::us/uuid)
(s/def ::name ::us/string)
(s/def ::type ::us/string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::ip-addr ::us/string)
(s/def ::webhooks/event? ::us/boolean)
(s/def ::webhooks/batch-timeout ::dt/duration)
(s/def ::webhooks/batch-key
(s/or :fn fn? :str string? :kw keyword?))
(s/def ::event
(s/keys :req [::type ::name ::profile-id]
:opt [::ip-addr
::props
::webhooks/event?
::webhooks/batch-timeout
::webhooks/batch-key]))
(s/def ::collector
(s/keys :req [::wrk/executor ::db/pool]))
(defmethod ig/pre-init-spec ::collector [_]
(s/keys :req-un [::db/pool ::wrk/executor]))
(def event-xform
(comp
(filter :profile-id)
(map clean-props)))
(s/keys :req [::db/pool ::wrk/executor]))
(defmethod ig/init-key ::collector
[_ cfg]
(when (contains? cf/flags :audit-log)
(l/info :msg "intializing audit log collector")
(let [input (a/chan 512 event-xform)
buffer (aa/batch input {:max-batch-size 100
:max-batch-age (* 10 1000) ; 10s
:init []})]
(a/go-loop []
(when-let [[_type events] (a/<! buffer)]
(let [res (a/<! (persist-events cfg events))]
(when (ex/exception? res)
(l/error :hint "error on persiting events"
:cause res)))
(recur)))
[_ {:keys [::db/pool] :as cfg}]
(cond
(db/read-only? pool)
(l/warn :hint "audit: disabled (db is read-only)")
(fn [& {:keys [cmd] :as params}]
(let [params (-> params
(dissoc :cmd)
(assoc :tracked-at (dt/now)))]
(case cmd
:stop (a/close! input)
:submit (when-not (a/offer! input params)
(l/warn :msg "activity channel is full"))))))))
:else
cfg))
(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)
(defn- persist-events
[{:keys [pool executor] :as cfg} events]
(letfn [(event->row [event]
[(uuid/next)
(:name event)
(:type event)
(:profile-id event)
(:tracked-at event)
(some-> (:ip-addr event) db/inet)
(db/tjson (:props event))
"backend"])]
(aa/with-thread executor
(when (seq events)
(db/with-atomic [conn pool]
(db/insert-multi! conn :audit-log
[:id :name :type :profile-id :tracked-at :ip-addr :props :source]
(sequence (map event->row) events)))))))
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!
[conn-or-pool event]
(us/verify! ::event event)
(let [params {:id (uuid/next)
:name (::name event)
:type (::type event)
:profile-id (::profile-id event)
:ip-addr (::ip-addr event)
:context (::context event)
:props (::props event)}]
(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"
::db/conn (dm/check db/connection? conn-or-pool)}
(let [now (dt/now)]
(db/insert! conn-or-pool :audit-log
(-> params
(update :props db/tjson)
(update :context db/tjson)
(update :ip-addr db/inet)
(assoc :created-at now)
(assoc :tracked-at now)
(assoc :source "backend"))))))
(when (and (contains? cf/flags :webhooks)
(::webhooks/event? event))
(let [batch-key (::webhooks/batch-key event)
batch-timeout (::webhooks/batch-timeout event)
label (dm/str "rpc:" (:name params))
label (cond
(ifn? batch-key) (dm/str label ":" (batch-key (::rpc/params event)))
(string? batch-key) (dm/str label ":" batch-key)
:else label)
dedupe? (boolean (and batch-key batch-timeout))]
(wrk/submit! ::wrk/conn conn-or-pool
::wrk/task :process-webhook-event
::wrk/queue :webhooks
::wrk/max-retries 0
::wrk/delay (or batch-timeout 0)
::wrk/dedupe dedupe?
::wrk/label label
::webhooks/event
(-> params
(dissoc :ip-addr)
(dissoc :type)))))
params))
(defn submit!
"Submit audit event to the collector."
[cfg params]
(let [conn (or (::db/conn cfg) (::db/pool cfg))]
(us/assert! ::db/pool-or-conn conn)
(try
(handle-event! conn (d/without-nils params))
(catch Throwable cause
(l/error :hint "audit: unexpected error processing event" :cause cause)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Archive Task
;; TASK: ARCHIVE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a task responsible to send the accomulated events to an
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(declare archive-events)
(s/def ::uri ::us/string)
(s/def ::tokens fn?)
(s/def ::tasks/uri ::us/string)
(defmethod ig/pre-init-spec ::archive-task [_]
(s/keys :req-un [::db/pool ::tokens]
:opt-un [::uri]))
(defmethod ig/pre-init-spec ::tasks/archive-task [_]
(s/keys :req [::db/pool ::main/props ::http.client/client]))
(defmethod ig/init-key ::archive-task
[_ {:keys [uri] :as cfg}]
(fn [props]
(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 props false))
uri (or uri (:uri props))
cfg (assoc cfg :uri uri)]
(: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 []
(let [res (archive-events cfg)]
(when (= res :continue)
(aa/thread-sleep 200)
(recur))))))))
(def sql:retrieve-batch-of-audit-log
"select * from audit_log
(when enabled
(loop [total 0]
(let [n (archive-events cfg)]
(if n
(do
(px/sleep 100)
(recur (+ total ^long 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 1000
limit 128
for update skip locked;")
(defn archive-events
[{:keys [pool uri tokens] :as cfg}]
[{:keys [::db/pool ::uri] :as cfg}]
(letfn [(decode-row [{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
@@ -259,9 +323,10 @@
:context]))
(send [events]
(let [token (tokens :generate {:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
(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)
@@ -271,12 +336,13 @@
:method :post
:headers headers
:body body}
resp (http/send! params)]
resp (http.client/req! cfg params {:sync? true})]
(if (= (:status resp) 204)
true
(do
(l/warn :hint "unable to archive events"
:resp-status (:status resp))
(l/error :hint "unable to archive events"
:resp-status (:status resp)
:resp-body (:body resp))
false))))
(mark-as-archived [conn rows]
@@ -291,34 +357,30 @@
(map row->event))
events (into [] xform rows)]
(when-not (empty? events)
(l/debug :action "archive-events" :uri uri :events (count events))
(l/trace :hint "archive events chunk" :uri uri :events (count events))
(when (send events)
(mark-as-archived conn rows)
:continue))))))
(count events)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GC Task
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def sql:clean-archived
(def ^:private sql:clean-archived
"delete from audit_log
where archived_at is not null
and archived_at < now() - ?::interval")
where archived_at is not null")
(defn- clean-archived
[{:keys [pool max-age]}]
(let [interval (db/interval max-age)
result (db/exec-one! pool [sql:clean-archived interval])
result (:next.jdbc/update-count result)]
(l/debug :action "clean archived audit log" :removed result)
[{: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))
(s/def ::max-age ::cf/audit-log-gc-max-age)
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]))
(defmethod ig/pre-init-spec ::gc-task [_]
(s/keys :req-un [::db/pool ::max-age]))
(defmethod ig/init-key ::gc-task
(defmethod ig/init-key ::tasks/gc
[_ cfg]
(fn [_]
(clean-archived cfg)))
+83 -93
View File
@@ -2,25 +2,23 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(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.pprint :as pp]
[app.common.schema :as sm]
[app.common.spec :as us]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.util.template :as tmpl]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
[integrant.core :as ig]
[promesa.exec :as px]
[promesa.exec.csp :as sp]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Error Listener
@@ -31,96 +29,88 @@
(defonce enabled (atom true))
(defn- persist-on-database!
[{:keys [pool] :as cfg} {:keys [id] :as event}]
(db/with-atomic [conn pool]
(db/insert! conn :server-error-report
{:id id :content (db/tjson event)})))
[pool id report]
(when-not (db/read-only? pool)
(db/insert! pool :server-error-report
{:id id
:version 3
:content (db/tjson report)})))
(defn- parse-context
[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)))
{}
(:context event)))
(defn record->report
[{:keys [::l/context ::l/message ::l/props ::l/logger ::l/level ::l/cause] :as record}]
(us/assert! ::l/record record)
(defn parse-event
[event]
(-> (parse-context event)
(merge (dissoc event :context))
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :version (:full cf/version))))
(let [data (ex-data cause)]
(merge
{:context (-> context
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :version (:full cf/version))
(assoc :logger-name logger)
(assoc :logger-level level)
(dissoc :params)
(pp/pprint-str :width 200))
(defn handle-event
[{:keys [executor] :as cfg} event]
(aa/with-thread executor
(try
(let [event (parse-event event)]
(persist-on-database! cfg event))
(catch Exception e
(l/warn :hint "unexpected exception on database error logger"
:cause e)))))
:props (pp/pprint-str props :width 200)
:hint (or (ex-message cause) @message)
:trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false)}
(when-let [params (:params context)]
{:params (pp/pprint-str params :width 200)})
(when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))]
{:data (pp/pprint-str data :width 200)})
(when-let [value (-> data ::sm/explain :value)]
{:value (pp/pprint-str value :width 200)})
(when-let [explain (ex/explain data)]
{:explain explain}))))
(defn error-record?
[{:keys [::l/level ::l/cause]}]
(and (= :error level)
(ex/exception? cause)))
(defn- handle-event
[{:keys [::db/pool]} {:keys [::l/id] :as record}]
(try
(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))
(persist-on-database! pool id report))
(catch Throwable cause
(l/warn :hint "unexpected exception on database error logger" :cause cause))))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::db/pool ::receiver]))
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver] :as cfg}]
(l/info :msg "initializing database error persistence")
(let [output (a/chan (a/sliding-buffer 128)
(filter #(= (:level %) "error")))]
(receiver :sub output)
(a/go-loop []
(let [msg (a/<! output)]
(if (nil? msg)
(l/info :msg "stoping error reporting loop")
(do
(a/<! (handle-event cfg msg))
(recur)))))
output))
[_ cfg]
(let [input (sp/chan :buf (sp/sliding-buffer 32)
:xf (filter error-record?))]
(add-watch l/log-record ::reporter #(sp/put! input %4))
(px/thread {:name "penpot/database-reporter" :virtual true}
(l/info :hint "initializing database error persistence")
(try
(loop []
(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
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated"))))))
(defmethod ig/halt-key! ::reporter
[_ output]
(a/close! output))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Http Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool]))
(defmethod ig/init-key ::handler
[_ {:keys [pool] :as cfg}]
(letfn [(parse-id [request]
(let [id (get-in request [:path-params :id])
id (us/uuid-conformer id)]
(when (uuid? id)
id)))
(retrieve-report [id]
(ex/ignoring
(when-let [{:keys [content] :as row} (db/get-by-id pool :server-error-report id)]
(assoc row :content (db/decode-transit-pgobject content)))))
(render-template [{:keys [content] :as report}]
(some-> (io/resource "error-report.tmpl")
(tmpl/render content)))]
(fn [request]
(let [result (some-> (parse-id request)
(retrieve-report)
(render-template))]
(if result
{:status 200
:headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}
:body result}
{:status 404
:body "not found"})))))
[_ thread]
(some-> thread px/interrupt!))
-99
View File
@@ -1,99 +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) UXBOX Labs SL
(ns app.loggers.loki
"A Loki integration."
(:require
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cfg]
[app.util.async :as aa]
[app.util.http :as http]
[app.util.json :as json]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(declare handle-event)
(s/def ::uri ::us/string)
(s/def ::receiver fn?)
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::receiver]
:opt-un [::uri]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver uri] :as cfg}]
(when uri
(l/info :msg "intializing loki reporter" :uri uri)
(let [input (a/chan (a/dropping-buffer 512))]
(receiver :sub input)
(a/go-loop []
(let [msg (a/<! input)]
(if (nil? msg)
(l/info :msg "stoping error reporting loop")
(do
(a/<! (handle-event cfg msg))
(recur)))))
input)))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))
(defn- prepare-payload
[event]
(let [labels {:host (cfg/get :host)
:tenant (cfg/get :tenant)
:version (:full cfg/version)
:logger (:logger event)
:level (:level event)}]
{:streams
[{:stream labels
:values [[(str (* (inst-ms (:created-at event)) 1000000))
(str (:message event)
(when-let [error (:error event)]
(str "\n" (:trace error))))]]}]}))
(defn- send-log
[uri payload i]
(try
(let [response (http/send! {:uri uri
:timeout 6000
:method :post
:headers {"content-type" "application/json"}
:body (json/encode payload)})]
(cond
(= (:status response) 204)
true
(= (:status response) 400)
(do
(l/error :hint "error on sending log to loki (no retry)"
:rsp (pr-str response))
true)
:else
(do
(l/error :hint "error on sending log to loki" :try i
:rsp (pr-str response))
false)))
(catch Exception e
(l/error :hint "error on sending message to loki" :cause e :try i)
false)))
(defn- handle-event
[{:keys [executor uri]} event]
(aa/with-thread executor
(let [payload (prepare-payload event)]
(loop [i 1]
(when (and (not (send-log uri payload i)) (< i 20))
(Thread/sleep (* i 2000))
(recur (inc i)))))))
+72 -52
View File
@@ -2,78 +2,98 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(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.db :as db]
[app.http.client :as http]
[app.loggers.database :as ldb]
[app.util.async :as aa]
[app.util.http :as http]
[app.util.json :as json]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
[integrant.core :as ig]
[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}]
(try
(let [uri (:uri cfg)
text (str "Exception on (host: " host ", url: " public-uri "/dbg/error-by-id/" id ")\n"
(when-let [pid (:profile-id event)]
(str "- profile-id: #uuid-" pid "\n")))
rsp (http/send! {:uri uri
:method :post
:headers {"content-type" "application/json"}
:body (json/encode-str {:text text})})]
(when (not= (:status rsp) 200)
(l/error :hint "error on sending data to mattermost"
:response (pr-str rsp))))
[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"
"```\n"
"- host: `" (:host report) "`\n"
"- tenant: `" (:tenant report) "`\n"
"- version: `" (:version report) "`\n"
"\n"
"Trace:\n"
(:trace report)
"```")
(catch Exception e
(l/error :hint "unexpected exception on error reporter"
:cause e))))
resp (http/req! cfg
{:uri (cf/get :error-report-webhook)
:method :post
:headers {"content-type" "application/json"}
:body (json/encode-str {:text text})}
{:sync? true})]
(when (not= 200 (:status resp))
(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)
:version (:full cf/version)
:profile-id (:profile-id context)
:trace (ex/format-throwable cause :detail? false :header? false)})
(defn handle-event
[{:keys [executor] :as cfg} event]
(aa/with-thread executor
[cfg record]
(when @enabled
(try
(let [event (ldb/parse-event event)]
(when @enabled
(send-mattermost-notification! cfg event)))
(catch Exception e
(l/warn :hint "unexpected exception on error reporter" :cause e)))))
(s/def ::uri ::cf/error-report-webhook)
(let [report (record->report record)]
(send-mattermost-notification! cfg report))
(catch Throwable cause
(l/warn :hint "unhandled error" :cause cause)))))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::db/pool ::receiver]
:opt-un [::uri]))
(s/keys :req [::http/client]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver uri] :as cfg}]
(when uri
(l/info :msg "initializing mattermost error reporter" :uri uri)
(let [output (a/chan (a/sliding-buffer 128)
(filter #(= (:level %) "error")))]
(receiver :sub output)
(a/go-loop []
(let [msg (a/<! output)]
(if (nil? msg)
(l/info :msg "stoping error reporting loop")
(do
(a/<! (handle-event cfg msg))
(recur)))))
output)))
[_ cfg]
(when-let [uri (cf/get :error-report-webhook)]
(px/thread
{: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
(loop []
(when-let [msg (sp/take! input)]
(handle-event cfg msg)
(recur)))
(catch InterruptedException _
(l/debug :hint "reporter interrupted"))
(catch Throwable cause
(l/error :hint "unexpected error" :cause cause))
(finally
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated")))))))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))
[_ thread]
(some-> thread px/interrupt!))
-172
View File
@@ -1,172 +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) UXBOX Labs SL
(ns app.loggers.sentry
"A mattermost integration for error reporting."
(:require
[app.common.logging :as l]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig])
(:import
io.sentry.Scope
io.sentry.IHub
io.sentry.Hub
io.sentry.NoOpHub
io.sentry.protocol.User
io.sentry.SentryOptions
io.sentry.SentryLevel
io.sentry.ScopeCallback))
(defonce enabled (atom true))
(defn- parse-context
[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)))
{}
(:context event)))
(defn- parse-event
[event]
(assoc event :context (parse-context event)))
(defn- build-sentry-options
[cfg]
(let [version (:base cf/version)]
(doto (SentryOptions.)
(.setDebug (:debug cfg false))
(.setTracesSampleRate (:traces-sample-rate cfg 1.0))
(.setDsn (:dsn cfg))
(.setServerName (cf/get :host))
(.setEnvironment (cf/get :tenant))
(.setAttachServerName true)
(.setAttachStacktrace (:attach-stack-trace cfg false))
(.setRelease (str "backend@" (if (= version "0.0.0") "develop" version))))))
(defn handle-event
[^IHub shub event]
(letfn [(set-user! [^Scope scope {:keys [context] :as event}]
(let [user (User.)]
(.setIpAddress ^User user ^String (:ip-addr context))
(when-let [pid (:profile-id context)]
(.setId ^User user ^String (str pid)))
(.setUser scope ^User user)))
(set-level! [^Scope scope]
(.setLevel scope SentryLevel/ERROR))
(set-context! [^Scope scope {:keys [context] :as event}]
(let [uri (str (cf/get :public-uri) "/dbg/error-by-id/" (:id context))]
(.setContexts scope "detailed_error_uri" ^String uri))
(when-let [vers (:frontend-version event)]
(.setContexts scope "frontend_version" ^String vers))
(when-let [puri (:public-uri event)]
(.setContexts scope "public_uri" ^String (str puri)))
(when-let [uagent (:user-agent context)]
(.setContexts scope "user_agent" ^String uagent))
(when-let [tenant (:tenant event)]
(.setTag scope "tenant" ^String tenant))
(when-let [type (:error-type context)]
(.setTag scope "error_type" ^String (str type)))
(when-let [code (:error-code context)]
(.setTag scope "error_code" ^String (str code)))
)
(capture [^Scope scope {:keys [context error] :as event}]
(let [msg (str (:message error) "\n\n"
"======================================================\n"
"=================== Params ===========================\n"
"======================================================\n"
(:params context) "\n"
(when (:explain context)
(str "======================================================\n"
"=================== Explain ==========================\n"
"======================================================\n"
(:explain context) "\n"))
(when (:data context)
(str "======================================================\n"
"=================== Error Data =======================\n"
"======================================================\n"
(:data context) "\n"))
(str "======================================================\n"
"=================== Stack Trace ======================\n"
"======================================================\n"
(:trace error))
"\n")]
(set-user! scope event)
(set-level! scope)
(set-context! scope event)
(.captureMessage ^IHub shub msg)
))
]
;; (clojure.pprint/pprint event)
(when @enabled
(.withScope ^IHub shub (reify ScopeCallback
(run [_ scope]
(->> event
(parse-event)
(capture scope))))))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Error Listener
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::receiver any?)
(s/def ::dsn ::cf/sentry-dsn)
(s/def ::trace-sample-rate ::cf/sentry-trace-sample-rate)
(s/def ::attach-stack-trace ::cf/sentry-attach-stack-trace)
(s/def ::debug ::cf/sentry-debug)
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::db/pool ::receiver]
:opt-un [::dsn ::trace-sample-rate ::attach-stack-trace]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver dsn executor] :as cfg}]
(l/info :msg "initializing sentry reporter" :dsn dsn)
(let [opts (build-sentry-options cfg)
shub (if dsn
(Hub. ^SentryOptions opts)
(NoOpHub/getInstance))
output (a/chan (a/sliding-buffer 128)
(filter #(= (:level %) "error")))]
(receiver :sub output)
(a/go-loop []
(let [event (a/<! output)]
(if (nil? event)
(do
(l/info :msg "stoping error reporting loop")
(.close ^IHub shub))
(do
(a/<! (aa/with-thread executor (handle-event shub event)))
(recur)))))
output))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))
+186
View File
@@ -0,0 +1,186 @@
;; 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.webhooks
"A mattermost integration for error reporting."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uri :as uri]
[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.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
;; --- HELPERS
(defn key-fn
[k & keys]
(fn [params]
(reduce #(dm/str %1 ":" (get params %2))
(dm/str (get params k))
keys)))
;; --- PROC
(defn- lookup-webhooks-by-team
[pool team-id]
(db/exec! pool ["select w.* from webhook as w where team_id=? and is_active=true" team-id]))
(defn- lookup-webhooks-by-project
[pool project-id]
(let [sql [(str "select w.* from webhook as w"
" join project as p on (p.team_id = w.team_id)"
" where p.id = ? and w.is_active = true")
project-id]]
(db/exec! pool sql)))
(defn- lookup-webhooks-by-file
[pool file-id]
(let [sql [(str "select w.* from webhook as w"
" join project as p on (p.team_id = w.team_id)"
" join file as f on (f.project_id = p.id)"
" where f.id = ? and w.is_active = true")
file-id]]
(db/exec! pool sql)))
(defn- lookup-webhooks
[{:keys [::db/pool]} {:keys [props] :as event}]
(or (some->> (:team-id props) (lookup-webhooks-by-team pool))
(some->> (:project-id props) (lookup-webhooks-by-project pool))
(some->> (:file-id props) (lookup-webhooks-by-file pool))))
(defmethod ig/pre-init-spec ::process-event-handler [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::process-event-handler
[_ {:keys [::db/pool] :as cfg}]
(fn [{:keys [props] :as task}]
(let [event (::event props)]
(l/debug :hint "process webhook event"
:name (:name event))
(when-let [items (lookup-webhooks cfg event)]
(l/trace :hint "webhooks found for event" :total (count items))
(db/with-atomic [conn pool]
(doseq [item items]
(wrk/submit! ::wrk/conn conn
::wrk/task :run-webhook
::wrk/queue :webhooks
::wrk/max-retries 3
::event event
::config item)))))))
;; --- RUN
(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}))
(defmethod ig/pre-init-spec ::run-webhook-handler [_]
(s/keys :req [::http/client ::db/pool]))
(defmethod ig/prep-key ::run-webhook-handler
[_ cfg]
(merge {::max-errors 3} (d/without-nils cfg)))
(defmethod ig/init-key ::run-webhook-handler
[_ {:keys [::db/pool ::max-errors] :as cfg}]
(letfn [(update-webhook! [whook err]
(if err
(let [sql [(str "update webhook "
" set error_code=?, "
" error_count=error_count+1 "
" where id=?")
err
(:id whook)]
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
{:updated-at (dt/now)
:error-code nil
:error-count 0}
{:id (:id whook)})))
(report-delivery! [whook req rsp err]
(db/insert! pool :webhook-delivery
{:webhook-id (:id whook)
:created-at (dt/now)
:error-code err
:req-data (db/tjson req)
:rsp-data (db/tjson rsp)}))]
(fn [{:keys [props] :as task}]
(let [event (::event props)
whook (::config props)
body (case (:mtype whook)
"application/json" (json/encode-str event json-mapper)
"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))
(let [req {:uri (:uri whook)
:headers {"content-type" (:mtype whook)
"user-agent" (str/ffmt "penpot/%" (:main cf/version))}
:timeout (dt/duration "4s")
:method :post
:body body}]
(try
(let [rsp (http/req! cfg req {:response-type :input-stream :sync? true})
err (interpret-response rsp)]
(report-delivery! whook req rsp err)
(update-webhook! whook err))
(catch Throwable cause
(let [err (interpret-exception cause)]
(report-delivery! whook req nil err)
(update-webhook! whook err)
(when (= err "unknown")
(l/error :hint "unknown error on webhook request"
:cause cause))))))))))
(defn interpret-response
[{:keys [status] :as response}]
(when-not (or (= 200 status)
(= 204 status))
(str/ffmt "unexpected-status:%" status)))
(defn interpret-exception
[cause]
(cond
(instance? javax.net.ssl.SSLHandshakeException cause)
"ssl-validation-error"
(instance? java.net.ConnectException cause)
"connection-error"
(instance? java.lang.IllegalArgumentException cause)
"invalid-uri"
(instance? java.net.http.HttpConnectTimeoutException cause)
"timeout"
))
-88
View File
@@ -1,88 +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) UXBOX Labs SL
(ns app.loggers.zmq
"A generic ZMQ listener."
(:require
[app.common.logging :as l]
[app.common.spec :as us]
[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])
(:import
org.zeromq.SocketType
org.zeromq.ZMQ$Socket
org.zeromq.ZContext))
(declare prepare)
(declare start-rcv-loop)
(s/def ::endpoint ::us/string)
(defmethod ig/pre-init-spec ::receiver [_]
(s/keys :opt-un [::endpoint]))
(defmethod ig/init-key ::receiver
[_ {:keys [endpoint] :as cfg}]
(l/info :msg "intializing ZMQ receiver" :bind endpoint)
(let [buffer (a/chan 1)
output (a/chan 1 (comp (filter map?)
(map prepare)))
mult (a/mult output)]
(when endpoint
(a/thread (start-rcv-loop {:out buffer :endpoint endpoint})))
(a/pipe buffer output)
(with-meta
(fn [cmd ch]
(case cmd
:sub (a/tap mult ch)
:unsub (a/untap mult ch))
ch)
{::output output
::buffer buffer
::mult mult})))
(defmethod ig/halt-key! ::receiver
[_ f]
(a/close! (::buffer (meta f))))
(defn- start-rcv-loop
([] (start-rcv-loop nil))
([{:keys [out endpoint] :or {endpoint "tcp://localhost:5556"}}]
(let [out (or out (a/chan 1))
zctx (ZContext.)
socket (.. zctx (createSocket SocketType/SUB))]
(.. socket (connect ^String endpoint))
(.. socket (subscribe ""))
(.. socket (setReceiveTimeOut 5000))
(loop []
(let [msg (.recv ^ZMQ$Socket socket)
msg (json/decode msg)
msg (if (nil? msg) :empty msg)]
(if (a/>!! out msg)
(recur)
(do
(.close ^java.lang.AutoCloseable socket)
(.close ^java.lang.AutoCloseable zctx))))))))
(defn- prepare
[event]
(merge
{:logger (:loggerName event)
:level (str/lower (:level event))
:thread (:thread event)
:created-at (dt/instant (:timeMillis event))
:message (:message event)}
(when-let [ctx (:contextMap event)]
{:context ctx})
(when-let [thrown (:thrown event)]
{:error
{:class (:name thrown)
:message (:message thrown)
:trace (:extendedStackTrace thrown)}})))
+470 -321
View File
@@ -2,385 +2,529 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.main
(:require
[app.auth.ldap :as-alias ldap]
[app.auth.oidc :as-alias oidc]
[app.auth.oidc.providers :as-alias oidc.providers]
[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.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.audit.tasks :as-alias audit.tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.metrics :as-alias mtx]
[app.metrics.definition :as-alias mdef]
[app.msgbus :as-alias mbus]
[app.redis :as-alias rds]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.srepl :as-alias srepl]
[app.storage :as-alias sto]
[app.storage.fs :as-alias sto.fs]
[app.storage.s3 :as-alias sto.s3]
[app.util.time :as dt]
[integrant.core :as ig]))
[app.worker :as-alias wrk]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.exec :as px])
(:gen-class))
(def default-metrics
{:update-file-changes
{::mdef/name "penpot_rpc_update_file_changes_total"
::mdef/help "A total number of changes submitted to update-file."
::mdef/type :counter}
:update-file-bytes-processed
{::mdef/name "penpot_rpc_update_file_bytes_processed_total"
::mdef/help "A total number of bytes processed by update-file."
::mdef/type :counter}
:rpc-mutation-timing
{::mdef/name "penpot_rpc_mutation_timing"
::mdef/help "RPC mutation method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:rpc-command-timing
{::mdef/name "penpot_rpc_command_timing"
::mdef/help "RPC command method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:rpc-query-timing
{::mdef/name "penpot_rpc_query_timing"
::mdef/help "RPC query method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:websocket-active-connections
{::mdef/name "penpot_websocket_active_connections"
::mdef/help "Active websocket connections gauge"
::mdef/type :gauge}
:websocket-messages-total
{::mdef/name "penpot_websocket_message_total"
::mdef/help "Counter of processed messages."
::mdef/labels ["op"]
::mdef/type :counter}
:websocket-session-timing
{::mdef/name "penpot_websocket_session_timing"
::mdef/help "Websocket session timing (seconds)."
::mdef/type :summary}
:session-update-total
{::mdef/name "penpot_http_session_update_total"
::mdef/help "A counter of session update batch events."
::mdef/type :counter}
:tasks-timing
{::mdef/name "penpot_tasks_timing"
::mdef/help "Background tasks timing (milliseconds)."
::mdef/labels ["name"]
::mdef/type :summary}
:redis-eval-timing
{::mdef/name "penpot_redis_eval_timing"
::mdef/help "Redis EVAL commands execution timings (ms)"
::mdef/labels ["name"]
::mdef/type :summary}
:rpc-climit-queue
{::mdef/name "penpot_rpc_climit_queue"
::mdef/help "Current number of queued submissions."
::mdef/labels ["name"]
::mdef/type :gauge}
:rpc-climit-permits
{::mdef/name "penpot_rpc_climit_permits"
::mdef/help "Current number of available permits"
::mdef/labels ["name"]
::mdef/type :gauge}
:rpc-climit-timing
{::mdef/name "penpot_rpc_climit_timing"
::mdef/help "Summary of the time between queuing and executing on the CLIMIT"
::mdef/labels ["name"]
::mdef/type :summary}
:audit-http-handler-queue-size
{::mdef/name "penpot_audit_http_handler_queue_size"
::mdef/help "Current number of queued submissions on the audit log http handler"
::mdef/labels []
::mdef/type :gauge}
:audit-http-handler-concurrency
{::mdef/name "penpot_audit_http_handler_concurrency"
::mdef/help "Current number of used concurrency capacity on the audit log http handler"
::mdef/labels []
::mdef/type :gauge}
:audit-http-handler-timing
{::mdef/name "penpot_audit_http_handler_timing"
::mdef/help "Summary of the time between queuing and executing on the audit log http handler"
::mdef/labels []
::mdef/type :summary}
:executors-active-threads
{::mdef/name "penpot_executors_active_threads"
::mdef/help "Current number of threads available in the executor service."
::mdef/labels ["name"]
::mdef/type :gauge}
:executors-completed-tasks
{::mdef/name "penpot_executors_completed_tasks_total"
::mdef/help "Approximate number of completed tasks by the executor."
::mdef/labels ["name"]
::mdef/type :counter}
:executors-running-threads
{::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
{:app.db/pool
{:uri (cf/get :database-uri)
:username (cf/get :database-username)
:password (cf/get :database-password)
:metrics (ig/ref :app.metrics/metrics)
:migrations (ig/ref :app.migrations/all)
:name :main
:min-pool-size 0
:max-pool-size 30}
{::db/pool
{::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)}
:app.metrics/metrics
{:definitions
{:profile-register
{:name "actions_profile_register_count"
:help "A global counter of user registrations."
:type :counter}
;; Default thread pool for IO operations
::wrk/executor
{::wrk/parallelism (cf/get :default-executor-parallelism
(+ 3 (* (px/get-available-processors) 3)))}
:profile-activation
{:name "actions_profile_activation_count"
:help "A global counter of profile activations"
:type :counter}
:update-file-changes
{:name "rpc_update_file_changes_total"
:help "A total number of changes submitted to update-file."
:type :counter}
:update-file-bytes-processed
{:name "rpc_update_file_bytes_processed_total"
:help "A total number of bytes processed by update-file."
:type :counter}}}
:app.migrations/all
{:main (ig/ref :app.migrations/migrations)}
::wrk/monitor
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/name "default"
::wrk/executor (ig/ref ::wrk/executor)}
:app.migrations/migrations
{::db/pool (ig/ref ::db/pool)}
::mtx/metrics
{:default default-metrics}
::mtx/routes
{::mtx/metrics (ig/ref ::mtx/metrics)}
::rds/redis
{::rds/uri (cf/get :redis-uri)
::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
::mbus/msgbus
{::wrk/executor (ig/ref ::wrk/executor)
::rds/redis (ig/ref ::rds/redis)}
:app.storage.tmp/cleaner
{::wrk/executor (ig/ref ::wrk/executor)}
::sto/gc-deleted-task
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
::sto/gc-touched-task
{::db/pool (ig/ref ::db/pool)}
::http.client/client
{::wrk/executor (ig/ref ::wrk/executor)}
::session/manager
{::db/pool (ig/ref ::db/pool)}
::session.tasks/gc
{::db/pool (ig/ref ::db/pool)}
::http.awsns/routes
{::props (ig/ref :app.setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
::wrk/executor (ig/ref ::wrk/executor)}
::http/server
{::http/port (cf/get :http-server-port)
::http/host (cf/get :http-server-host)
::http/router (ig/ref ::http/router)
::wrk/executor (ig/ref ::wrk/executor)
::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)
:port (cf/get :ldap-port)
:ssl (cf/get :ldap-ssl)
:tls (cf/get :ldap-starttls)
:query (cf/get :ldap-user-query)
:attrs-email (cf/get :ldap-attrs-email)
:attrs-fullname (cf/get :ldap-attrs-fullname)
:attrs-username (cf/get :ldap-attrs-username)
:base-dn (cf/get :ldap-base-dn)
:bind-dn (cf/get :ldap-bind-dn)
:bind-password (cf/get :ldap-bind-password)
:enabled? (contains? cf/flags :login-with-ldap)}
::oidc.providers/google
{}
:app.msgbus/msgbus
{:backend (cf/get :msgbus-backend :redis)
:redis-uri (cf/get :redis-uri)}
::oidc.providers/github
{::http.client/client (ig/ref ::http.client/client)}
:app.tokens/tokens
{:keys (ig/ref :app.setup/keys)}
::oidc.providers/gitlab
{}
:app.storage/gc-deleted-task
{:pool (ig/ref :app.db/pool)
:storage (ig/ref :app.storage/storage)
:min-age (dt/duration {:hours 2})}
::oidc.providers/generic
{::http.client/client (ig/ref ::http.client/client)}
:app.storage/gc-touched-task
{:pool (ig/ref :app.db/pool)}
:app.storage/recheck-task
{:pool (ig/ref :app.db/pool)
:storage (ig/ref :app.storage/storage)}
:app.http.session/session
{:pool (ig/ref :app.db/pool)
:tokens (ig/ref :app.tokens/tokens)}
:app.http.session/gc-task
{:pool (ig/ref :app.db/pool)
:max-age (cf/get :http-session-idle-max-age)}
:app.http.session/updater
{:pool (ig/ref :app.db/pool)
:metrics (ig/ref :app.metrics/metrics)
:executor (ig/ref :app.worker/executor)
:session (ig/ref :app.http.session/session)
:max-batch-age (cf/get :http-session-updater-batch-max-age)
:max-batch-size (cf/get :http-session-updater-batch-max-size)}
:app.http.awsns/handler
{:tokens (ig/ref :app.tokens/tokens)
:pool (ig/ref :app.db/pool)}
:app.http/server
{:port (cf/get :http-server-port)
:router (ig/ref :app.http/router)
:metrics (ig/ref :app.metrics/metrics)
:ws {"/ws/notifications" (ig/ref :app.notifications/handler)}}
::oidc/routes
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::props (ig/ref :app.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)}
:app.http/router
{:rpc (ig/ref :app.rpc/rpc)
:session (ig/ref :app.http.session/session)
:tokens (ig/ref :app.tokens/tokens)
:public-uri (cf/get :public-uri)
:metrics (ig/ref :app.metrics/metrics)
:oauth (ig/ref :app.http.oauth/handler)
:assets (ig/ref :app.http.assets/handlers)
:storage (ig/ref :app.storage/storage)
:sns-webhook (ig/ref :app.http.awsns/handler)
:feedback (ig/ref :app.http.feedback/handler)
:audit-http-handler (ig/ref :app.loggers.audit/http-handler)
:error-report-handler (ig/ref :app.loggers.database/handler)}
{::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)
::props (ig/ref :app.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.assets/handlers
{:metrics (ig/ref :app.metrics/metrics)
:assets-path (cf/get :assets-path)
:storage (ig/ref :app.storage/storage)
:cache-max-age (dt/duration {:hours 24})
:signature-max-age (dt/duration {:hours 24 :minutes 5})}
:app.http.debug/routes
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::sto/storage (ig/ref ::sto/storage)}
:app.http.feedback/handler
{:pool (ig/ref :app.db/pool)}
::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.oauth/handler
{:rpc (ig/ref :app.rpc/rpc)
:session (ig/ref :app.http.session/session)
:pool (ig/ref :app.db/pool)
:tokens (ig/ref :app.tokens/tokens)
:audit (ig/ref :app.loggers.audit/collector)
:public-uri (cf/get :public-uri)}
: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)
::wrk/executor (ig/ref ::wrk/executor)}
;; RLimit definition for password hashing
:app.rlimits/password
(cf/get :rlimits-password)
:app.rpc/climit
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
;; RLimit definition for image processing
:app.rlimits/image
(cf/get :rlimits-image)
:app.rpc/rlimit
{::wrk/executor (ig/ref ::wrk/executor)}
;; RLimit definition for font processing
:app.rlimits/font
(cf/get :rlimits-font 2)
:app.rpc/methods
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::ldap/provider (ig/ref ::ldap/provider)
::sto/storage (ig/ref ::sto/storage)
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::rds/redis (ig/ref ::rds/redis)
;; A collection of rlimits as hash-map.
:app.rlimits/all
{:password (ig/ref :app.rlimits/password)
:image (ig/ref :app.rlimits/image)
:font (ig/ref :app.rlimits/font)}
::rpc/climit (ig/ref ::rpc/climit)
::rpc/rlimit (ig/ref ::rpc/rlimit)
:app.rpc/rpc
{:pool (ig/ref :app.db/pool)
:session (ig/ref :app.http.session/session)
:tokens (ig/ref :app.tokens/tokens)
:metrics (ig/ref :app.metrics/metrics)
:storage (ig/ref :app.storage/storage)
:msgbus (ig/ref :app.msgbus/msgbus)
:rlimits (ig/ref :app.rlimits/all)
:public-uri (cf/get :public-uri)
:audit (ig/ref :app.loggers.audit/collector)}
::props (ig/ref :app.setup/props)
:app.notifications/handler
{:msgbus (ig/ref :app.msgbus/msgbus)
:pool (ig/ref :app.db/pool)
:session (ig/ref :app.http.session/session)
:metrics (ig/ref :app.metrics/metrics)
:executor (ig/ref :app.worker/executor)}
:pool (ig/ref ::db/pool)
:templates (ig/ref :app.setup/builtin-templates)
}
:app.worker/executor
{:min-threads 0
:max-threads 256
:idle-timeout 60000
:name :worker}
:app.rpc.doc/routes
{:methods (ig/ref :app.rpc/methods)}
:app.worker/worker
{:executor (ig/ref :app.worker/executor)
:tasks (ig/ref :app.worker/registry)
:metrics (ig/ref :app.metrics/metrics)
:pool (ig/ref :app.db/pool)}
:app.rpc/routes
{::rpc/methods (ig/ref :app.rpc/methods)
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::props (ig/ref :app.setup/props)}
:app.worker/scheduler
{:executor (ig/ref :app.worker/executor)
:tasks (ig/ref :app.worker/registry)
:pool (ig/ref :app.db/pool)
:schedule
[{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :file-media-gc}
::wrk/registry
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/tasks
{:sendmail (ig/ref ::email/handler)
:objects-gc (ig/ref :app.tasks.objects-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 ::session.tasks/gc)
:audit-log-archive (ig/ref ::audit.tasks/archive)
:audit-log-gc (ig/ref ::audit.tasks/gc)
{:cron #app/cron "0 0 * * * ?" ;; hourly
: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)}
::email/handler
{::email/sendmail (ig/ref ::email/sendmail)
::mtx/metrics (ig/ref ::mtx/metrics)}
:app.tasks.tasks-gc/handler
{::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.file-gc/handler
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-xlog-gc/handler
{::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)}
[::srepl/urepl ::srepl/server]
{::srepl/port (cf/get :urepl-port 6062)
::srepl/host (cf/get :urepl-host "localhost")}
[::srepl/prepl ::srepl/server]
{::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)}
:app.setup/props
{::db/pool (ig/ref ::db/pool)
::key (cf/get :secret-key)
;; 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)}
::audit.tasks/archive
{::props (ig/ref :app.setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
::audit.tasks/gc
{::db/pool (ig/ref ::db/pool)}
::webhooks/process-event-handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
::webhooks/run-webhook-handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.mattermost/reporter
{::http.client/client (ig/ref ::http.client/client)}
:app.loggers.database/reporter
{::db/pool (ig/ref ::db/pool)}
::sto/storage
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::sto/backends
{:assets-s3 (ig/ref [::assets :app.storage.s3/backend])
:assets-fs (ig/ref [::assets :app.storage.fs/backend])}}
[::assets :app.storage.s3/backend]
{::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)
::wrk/executor (ig/ref ::wrk/executor)}
[::assets :app.storage.fs/backend]
{::sto.fs/directory (cf/get :storage-assets-fs-directory)}
})
(def worker-config
{::wrk/cron
{::wrk/registry (ig/ref ::wrk/registry)
::db/pool (ig/ref ::db/pool)
::wrk/entries
[{:cron #app/cron "0 0 * * * ?" ;; hourly
:task :file-xlog-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-deleted-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-touched-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :session-gc}
{:cron #app/cron "0 0 * * * ?" ;; hourly
:task :storage-recheck}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :objects-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-deleted}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-touched}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :tasks-gc}
(when (cf/get :fdata-storage-backed)
{:cron #app/cron "0 0 * * * ?" ;; hourly
:task :file-offload})
{:cron #app/cron "0 0 2 * * ?" ;; daily
:task :file-gc}
{:cron #app/cron "0 30 */3,23 * * ?"
:task :telemetry}
(when (contains? cf/flags :audit-log-archive)
{:cron #app/cron "0 */3 * * * ?" ;; every 3m
{:cron #app/cron "0 */5 * * * ?" ;; every 5m
:task :audit-log-archive})
(when (contains? cf/flags :audit-log-gc)
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :audit-log-gc})
{:cron #app/cron "30 */5 * * * ?" ;; every 5m
:task :audit-log-gc})]}
(when (or (contains? cf/flags :telemetry)
(cf/get :telemetry-enabled))
{:cron #app/cron "0 0 */6 * * ?" ;; every 6h
:task :telemetry})]}
::wrk/dispatcher
{::rds/redis (ig/ref ::rds/redis)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
:app.worker/registry
{:metrics (ig/ref :app.metrics/metrics)
:tasks
{:sendmail (ig/ref :app.emails/sendmail-handler)
:objects-gc (ig/ref :app.tasks.objects-gc/handler)
:file-media-gc (ig/ref :app.tasks.file-media-gc/handler)
:file-xlog-gc (ig/ref :app.tasks.file-xlog-gc/handler)
:storage-deleted-gc (ig/ref :app.storage/gc-deleted-task)
:storage-touched-gc (ig/ref :app.storage/gc-touched-task)
:storage-recheck (ig/ref :app.storage/recheck-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)
:file-offload (ig/ref :app.tasks.file-offload/handler)
:audit-log-archive (ig/ref :app.loggers.audit/archive-task)
:audit-log-gc (ig/ref :app.loggers.audit/gc-task)}}
[::default ::wrk/worker]
{::wrk/parallelism (cf/get ::worker-default-parallelism 1)
::wrk/queue :default
::rds/redis (ig/ref ::rds/redis)
::wrk/registry (ig/ref ::wrk/registry)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
:app.emails/sendmail-handler
{: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)
:metrics (ig/ref :app.metrics/metrics)
:default-reply-to (cf/get :smtp-default-reply-to)
:default-from (cf/get :smtp-default-from)}
[::webhook ::wrk/worker]
{::wrk/parallelism (cf/get ::worker-webhook-parallelism 1)
::wrk/queue :webhooks
::rds/redis (ig/ref ::rds/redis)
::wrk/registry (ig/ref ::wrk/registry)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}})
:app.tasks.tasks-gc/handler
{:pool (ig/ref :app.db/pool)
:max-age cf/deletion-delay}
:app.tasks.objects-gc/handler
{:pool (ig/ref :app.db/pool)
:storage (ig/ref :app.storage/storage)
:max-age cf/deletion-delay}
:app.tasks.file-media-gc/handler
{:pool (ig/ref :app.db/pool)
:max-age cf/deletion-delay}
:app.tasks.file-xlog-gc/handler
{:pool (ig/ref :app.db/pool)
:max-age (dt/duration {:hours 72})}
:app.tasks.file-offload/handler
{:pool (ig/ref :app.db/pool)
:max-age (dt/duration {:seconds 5})
:storage (ig/ref :app.storage/storage)
:backend (cf/get :fdata-storage-backed :fdata-s3)}
:app.tasks.telemetry/handler
{:pool (ig/ref :app.db/pool)
:version (:full cf/version)
:uri (cf/get :telemetry-uri)
:sprops (ig/ref :app.setup/props)}
:app.srepl/server
{:port (cf/get :srepl-port)
:host (cf/get :srepl-host)}
:app.setup/props
{:pool (ig/ref :app.db/pool)
:key (cf/get :secret-key)}
:app.setup/keys
{:props (ig/ref :app.setup/props)}
:app.loggers.zmq/receiver
{:endpoint (cf/get :loggers-zmq-uri)}
:app.loggers.audit/http-handler
{:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)}
:app.loggers.audit/collector
{:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)}
:app.loggers.audit/archive-task
{:uri (cf/get :audit-log-archive-uri)
:tokens (ig/ref :app.tokens/tokens)
:pool (ig/ref :app.db/pool)}
:app.loggers.audit/gc-task
{:max-age (cf/get :audit-log-gc-max-age cf/deletion-delay)
:pool (ig/ref :app.db/pool)}
:app.loggers.loki/reporter
{:uri (cf/get :loggers-loki-uri)
:receiver (ig/ref :app.loggers.zmq/receiver)
:executor (ig/ref :app.worker/executor)}
:app.loggers.mattermost/reporter
{:uri (cf/get :error-report-webhook)
:receiver (ig/ref :app.loggers.zmq/receiver)
:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)}
:app.loggers.database/reporter
{:receiver (ig/ref :app.loggers.zmq/receiver)
:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)}
:app.loggers.database/handler
{:pool (ig/ref :app.db/pool)}
:app.loggers.sentry/reporter
{:dsn (cf/get :sentry-dsn)
:trace-sample-rate (cf/get :sentry-trace-sample-rate 1.0)
:attach-stack-trace (cf/get :sentry-attach-stack-trace false)
:debug (cf/get :sentry-debug false)
:receiver (ig/ref :app.loggers.zmq/receiver)
:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)}
:app.storage/storage
{:pool (ig/ref :app.db/pool)
:executor (ig/ref :app.worker/executor)
:backends {
:assets-s3 (ig/ref [::assets :app.storage.s3/backend])
:assets-db (ig/ref [::assets :app.storage.db/backend])
:assets-fs (ig/ref [::assets :app.storage.fs/backend])
:tmp (ig/ref [::tmp :app.storage.fs/backend])
:fdata-s3 (ig/ref [::fdata :app.storage.s3/backend])
;; keep this for backward compatibility
:s3 (ig/ref [::assets :app.storage.s3/backend])
:fs (ig/ref [::assets :app.storage.fs/backend])}}
[::fdata :app.storage.s3/backend]
{:region (cf/get :storage-fdata-s3-region)
:bucket (cf/get :storage-fdata-s3-bucket)
:prefix (cf/get :storage-fdata-s3-prefix)}
[::assets :app.storage.s3/backend]
{:region (cf/get :storage-assets-s3-region)
:bucket (cf/get :storage-assets-s3-bucket)}
[::assets :app.storage.fs/backend]
{:directory (cf/get :storage-assets-fs-directory)}
[::tmp :app.storage.fs/backend]
{:directory "/tmp/penpot"}
[::assets :app.storage.db/backend]
{:pool (ig/ref :app.db/pool)}})
(def system nil)
(defn start
[]
(ig/load-namespaces system-config)
(ig/load-namespaces (merge system-config worker-config))
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> system-config
(cond-> (contains? cf/flags :backend-worker)
(merge worker-config))
(ig/prep)
(ig/init))))
(l/info :msg "welcome to penpot"
(l/info :hint "welcome to penpot"
:flags (str/join "," (map name cf/flags))
:worker? (contains? cf/flags :backend-worker)
:version (:full cf/version)))
(defn stop
@@ -391,4 +535,9 @@
(defn -main
[& _args]
(start))
(try
(start)
(catch Throwable cause
(l/error :hint (ex-message cause)
:cause cause)
(System/exit -1))))
+118 -117
View File
@@ -2,7 +2,7 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.media
"Media & Font postprocessing."
@@ -10,47 +10,86 @@
[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.config :as cf]
[app.rlimits :as rlm]
[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.io :as io]
[clojure.java.shell :as sh]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.core :as fs])
[datoteka.fs :as fs]
[datoteka.io :as io])
(:import
java.io.ByteArrayInputStream
java.io.OutputStream
org.apache.commons.io.IOUtils
org.im4java.core.ConvertCmd
org.im4java.core.IMOperation
org.im4java.core.Info))
(s/def ::image-content-type cm/valid-image-types)
(s/def ::font-content-type cm/valid-font-types)
(def default-max-file-size
(* 1024 1024 30)) ; 30 MiB
(s/def :internal.http.upload/filename ::us/string)
(s/def :internal.http.upload/size ::us/integer)
(s/def :internal.http.upload/content-type ::us/string)
(s/def :internal.http.upload/tempfile any?)
(s/def ::path fs/path?)
(s/def ::filename string?)
(s/def ::size integer?)
(s/def ::headers (s/map-of string? string?))
(s/def ::mtype string?)
(s/def ::upload
(s/keys :req-un [:internal.http.upload/filename
:internal.http.upload/size
:internal.http.upload/tempfile
:internal.http.upload/content-type]))
(s/keys :req-un [::filename ::size ::path]
:opt-un [::mtype ::headers]))
(defn validate-media-type
([mtype] (validate-media-type mtype cm/valid-image-types))
([mtype allowed]
(when-not (contains? allowed mtype)
;; A subset of fields from the ::upload spec
(s/def ::input
(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]
(when-not (contains? allowed (:mtype upload))
(ex/raise :type :validation
:code :media-type-not-allowed
:hint "Seems like you are uploading an invalid media object"))))
:hint "Seems like you are uploading an invalid media object"))
upload))
(defn validate-media-size!
[upload]
(when (> (:size upload) (cf/get :media-max-file-size default-max-file-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)
default-max-file-size)))
upload)
(defmulti process :cmd)
(defmulti process-error class)
@@ -66,39 +105,23 @@
(throw error))
(defn run
[{:keys [rlimits] :as cfg} {:keys [rlimit] :or {rlimit :image} :as params}]
(us/assert map? rlimits)
(let [rlimit (get rlimits rlimit)]
(when-not rlimit
(ex/raise :type :internal
:code :rlimit-not-configured
:hint ":image rlimit not configured"))
(try
(rlm/execute rlimit (process params))
(catch Throwable e
(process-error e)))))
[params]
(try
(process params)
(catch Throwable e
(process-error e))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; --- Thumbnails Generation
;; IMAGE THUMBNAILS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::cmd keyword?)
(s/def ::path (s/or :path fs/path?
:string string?
:file fs/file?))
(s/def ::input
(s/keys :req-un [::path]
:opt-un [::cm/mtype]))
(s/def ::width integer?)
(s/def ::height integer?)
(s/def ::format #{:jpeg :webp :png})
(s/def ::quality #(< 0 % 101))
(s/def ::thumbnail-params
(s/keys :req-un [::cmd ::input ::format ::width ::height]))
(s/keys :req-un [::input ::format ::width ::height]))
;; Related info on how thumbnails generation
;; http://www.imagemagick.org/Usage/thumbnails/
@@ -108,18 +131,16 @@
(let [{:keys [path mtype]} input
format (or (cm/mtype->format mtype) format)
ext (cm/format->extension format)
tmp (fs/create-tempfile :suffix ext)]
tmp (tmp/tempfile :prefix "penpot.media." :suffix ext)]
(doto (ConvertCmd.)
(.run operation (into-array (map str [path tmp]))))
(let [thumbnail-data (fs/slurp-bytes tmp)]
(fs/delete tmp)
(assoc params
:format format
:mtype (cm/format->mtype format)
:size (alength ^bytes thumbnail-data)
:data (ByteArrayInputStream. thumbnail-data)))))
(assoc params
:format format
:mtype (cm/format->mtype format)
:size (fs/size tmp)
:data tmp)))
(defmethod process :generic-thumbnail
[{:keys [quality width height] :as params}]
@@ -185,7 +206,7 @@
(ex/raise :type :validation
:code :invalid-svg-file
:hint "uploaded svg does not provides dimensions"))
(assoc info :mtype mtype))
(merge input info {:ts (dt/now)}))
(let [instance (Info. (str path))
mtype' (.getProperty instance "Mime type")]
@@ -198,9 +219,10 @@
;; For an animated GIF, getImageWidth/Height returns the delta size of one frame (if no frame given
;; it returns size of the last one), whereas getPageWidth/Height always return the full size of
;; any frame.
{:width (.getPageWidth instance)
:height (.getPageHeight instance)
:mtype mtype}))))
(assoc input
:width (.getPageWidth instance)
:height (.getPageHeight instance)
:ts (dt/now))))))
(defmethod process-error org.im4java.core.InfoException
[error]
@@ -210,67 +232,49 @@
:cause error))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; --- Fonts Generation
;; FONTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def all-fotmats #{"font/woff2", "font/woff", "font/otf", "font/ttf"})
(defmethod process :generate-fonts
[{:keys [input] :as params}]
(letfn [(ttf->otf [data]
(let [input-file (fs/create-tempfile :prefix "penpot")
output-file (fs/path (str input-file ".otf"))
_ (with-open [out (io/output-stream input-file)]
(IOUtils/writeChunked ^bytes data ^OutputStream out)
(.flush ^OutputStream out))
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str input-file)
(str output-file)))]
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".otf"))
_ (io/write-to-file! data finput)
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str finput)
(str foutput)))]
(when (zero? (:exit res))
(fs/slurp-bytes output-file))))
foutput)))
(otf->ttf [data]
(let [input-file (fs/create-tempfile :prefix "penpot")
output-file (fs/path (str input-file ".ttf"))
_ (with-open [out (io/output-stream input-file)]
(IOUtils/writeChunked ^bytes data ^OutputStream out)
(.flush ^OutputStream out))
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str input-file)
(str output-file)))]
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".ttf"))
_ (io/write-to-file! data finput)
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str finput)
(str foutput)))]
(when (zero? (:exit res))
(fs/slurp-bytes output-file))))
foutput)))
(ttf-or-otf->woff [data]
(let [input-file (fs/create-tempfile :prefix "penpot" :suffix "")
output-file (fs/path (str input-file ".woff"))
_ (with-open [out (io/output-stream input-file)]
(IOUtils/writeChunked ^bytes data ^OutputStream out)
(.flush ^OutputStream out))
res (sh/sh "sfnt2woff" (str input-file))]
;; NOTE: foutput is not used directly, it represents the
;; default output of the execution of the underlying
;; command.
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".woff"))
_ (io/write-to-file! data finput)
res (sh/sh "sfnt2woff" (str finput))]
(when (zero? (:exit res))
(fs/slurp-bytes output-file))))
(ttf-or-otf->woff2 [data]
(let [input-file (fs/create-tempfile :prefix "penpot" :suffix "")
output-file (fs/path (str input-file ".woff2"))
_ (with-open [out (io/output-stream input-file)]
(IOUtils/writeChunked ^bytes data ^OutputStream out)
(.flush ^OutputStream out))
res (sh/sh "woff2_compress" (str input-file))]
(when (zero? (:exit res))
(fs/slurp-bytes output-file))))
foutput)))
(woff->sfnt [data]
(let [input-file (fs/create-tempfile :prefix "penpot" :suffix "")
_ (with-open [out (io/output-stream input-file)]
(IOUtils/writeChunked ^bytes data ^OutputStream out)
(.flush ^OutputStream out))
res (sh/sh "woff2sfnt" (str input-file)
:out-enc :bytes)]
(let [finput (tmp/tempfile :prefix "penpot" :suffix "")
_ (io/write-to-file! data finput)
res (sh/sh "woff2sfnt" (str finput)
:out-enc :bytes)]
(when (zero? (:exit res))
(:out res))))
@@ -297,15 +301,13 @@
(let [data (get input "font/ttf")]
(-> input
(update "font/otf" gen-if-nil #(ttf->otf data))
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))
(assoc "font/woff2" (ttf-or-otf->woff2 data))))
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))))
(contains? current "font/otf")
(let [data (get input "font/otf")]
(-> input
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))
(assoc "font/ttf" (otf->ttf data))
(assoc "font/woff2" (ttf-or-otf->woff2 data))))
(assoc "font/ttf" (otf->ttf data))))
(contains? current "font/woff")
(let [data (get input "font/woff")
@@ -317,8 +319,7 @@
(let [stype (get-sfnt-type sfnt)]
(cond-> input
true
(-> (assoc "font/woff" data)
(assoc "font/woff2" (ttf-or-otf->woff2 sfnt)))
(-> (assoc "font/woff" data))
(= stype :otf)
(-> (assoc "font/otf" sfnt)
@@ -334,10 +335,10 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn configure-assets-storage
"Given storage map, returns a storage configured with the apropriate
backend for assets."
[storage conn]
(-> storage
(assoc :conn conn)
(assoc :backend (cf/get :assets-storage-backend :assets-fs))))
"Given storage map, returns a storage configured with the appropriate
backend for assets and optional connection attached."
([storage]
(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))))
+166 -232
View File
@@ -2,296 +2,230 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.metrics
(:refer-clojure :exclude [run!])
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.metrics.definition :as-alias mdef]
[clojure.spec.alpha :as s]
[integrant.core :as ig])
(:import
io.prometheus.client.CollectorRegistry
io.prometheus.client.Counter
io.prometheus.client.Counter$Child
io.prometheus.client.Gauge
io.prometheus.client.Summary
io.prometheus.client.Gauge$Child
io.prometheus.client.Histogram
io.prometheus.client.Histogram$Child
io.prometheus.client.SimpleCollector
io.prometheus.client.Summary
io.prometheus.client.Summary$Builder
io.prometheus.client.Summary$Child
io.prometheus.client.exporter.common.TextFormat
io.prometheus.client.hotspot.DefaultExports
io.prometheus.client.jetty.JettyStatisticsCollector
org.eclipse.jetty.server.handler.StatisticsHandler
java.io.StringWriter))
(declare instrument-vars!)
(declare instrument)
(set! *warn-on-reflection* true)
(declare create-registry)
(declare create)
(declare create-collector)
(declare handler)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Entry Point
;; METRICS SERVICE PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::mdef/name string?)
(s/def ::mdef/help string?)
(s/def ::mdef/labels (s/every string? :kind vector?))
(s/def ::mdef/type #{:gauge :counter :summary :histogram})
(s/def ::mdef/instance
#(instance? SimpleCollector %))
(s/def ::mdef/definition
(s/keys :req [::mdef/name
::mdef/help
::mdef/type]
:opt [::mdef/labels
::mdef/instance]))
(s/def ::definitions
(s/map-of keyword? ::mdef/definition))
(s/def ::registry
#(instance? CollectorRegistry %))
(s/def ::handler fn?)
(s/def ::metrics
(s/keys :req [::registry
::handler
::definitions]))
(s/def ::default ::definitions)
(defmethod ig/pre-init-spec ::metrics [_]
(s/keys :req-un [::default]))
(defmethod ig/init-key ::metrics
[_ cfg]
(l/info :action "initialize metrics")
(let [registry (create-registry)
definitions (reduce-kv (fn [res k v]
(->> (assoc v ::registry registry)
(create-collector)
(assoc res k)))
{}
(:default cfg))]
(us/verify! ::definitions definitions)
{::handler (partial handler registry)
::definitions definitions
::registry registry}))
(defn- handler
[registry _request]
[registry _]
(let [samples (.metricFamilySamples ^CollectorRegistry registry)
writer (StringWriter.)]
(TextFormat/write004 writer samples)
{:headers {"content-type" TextFormat/CONTENT_TYPE_004}
:body (.toString writer)}))
:body (.toString writer)}))
(s/def ::definitions
(s/map-of keyword? map?))
(defmethod ig/pre-init-spec ::metrics [_]
(s/keys :opt-un [::definitions]))
(defmethod ig/init-key ::metrics
[_ {:keys [definitions] :as cfg}]
(l/info :action "initialize metrics")
(let [registry (create-registry)
definitions (reduce-kv (fn [res k v]
(->> (assoc v :registry registry)
(create)
(assoc res k)))
{}
definitions)]
{:handler (partial handler registry)
:definitions definitions
:registry registry}))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::metrics]))
(s/def ::handler fn?)
(s/def ::registry #(instance? CollectorRegistry %))
(s/def ::metrics
(s/keys :req-un [::registry ::handler]))
(defmethod ig/init-key ::routes
[_ {:keys [::metrics]}]
(let [registry (::registry metrics)]
["/metrics" {:handler (partial handler registry)
:allowed-methods #{:get}}]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn create-registry
(def default-empty-labels (into-array String []))
(def default-quantiles
[[0.5 0.01]
[0.90 0.01]
[0.99 0.001]])
(def default-histogram-buckets
[1 5 10 25 50 75 100 250 500 750 1000 2500 5000 7500])
(defmulti run-collector! (fn [mdef _] (::mdef/type mdef)))
(defmulti create-collector ::mdef/type)
(defn run!
[{:keys [::definitions]} & {:keys [id] :as params}]
(when-let [mobj (get definitions id)]
(run-collector! mobj params)
true))
(defn- create-registry
[]
(let [registry (CollectorRegistry.)]
(DefaultExports/register registry)
registry))
(defmacro with-measure
[& {:keys [expr cb]}]
`(let [start# (System/nanoTime)
tdown# ~cb]
(try
~expr
(finally
(tdown# (/ (- (System/nanoTime) start#) 1000000))))))
(defn- is-array?
[o]
(let [oc (class o)]
(and (.isArray ^Class oc)
(= (.getComponentType oc) String))))
(defmethod run-collector! :counter
[{:keys [::mdef/instance]} {:keys [inc labels] :or {inc 1 labels default-empty-labels}}]
(let [instance (.labels ^Counter instance (if (is-array? labels) labels (into-array String labels)))]
(.inc ^Counter$Child instance (double inc))))
(defmethod run-collector! :gauge
[{:keys [::mdef/instance]} {:keys [inc dec labels val] :or {labels default-empty-labels}}]
(let [instance (.labels ^Gauge instance (if (is-array? labels) labels (into-array String labels)))]
(cond (number? inc) (.inc ^Gauge$Child instance (double inc))
(number? dec) (.dec ^Gauge$Child instance (double dec))
(number? val) (.set ^Gauge$Child instance (double val)))))
(defmethod run-collector! :summary
[{:keys [::mdef/instance]} {:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Summary instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Summary$Child instance val)))
(defmethod run-collector! :histogram
[{:keys [::mdef/instance]} {:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Histogram instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Histogram$Child instance val)))
(defmethod create-collector :counter
[{::mdef/keys [name help reg labels]
::keys [registry]
:as props}]
(defn make-counter
[{:keys [name help registry reg labels] :as props}]
(let [registry (or registry reg)
instance (.. (Counter/build)
(name name)
(help help))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(help help))]
(when (seq labels)
(.labelNames instance (into-array String labels)))
{::instance instance
::fn (fn [{:keys [by labels] :or {by 1}}]
(if labels
(.. ^Counter instance
(labels (into-array String labels))
(inc by))
(.inc ^Counter instance by)))}))
(assoc props ::mdef/instance (.register instance registry))))
(defn make-gauge
[{:keys [name help registry reg labels] :as props}]
(defmethod create-collector :gauge
[{::mdef/keys [name help reg labels]
::keys [registry]
:as props}]
(let [registry (or registry reg)
instance (.. (Gauge/build)
(name name)
(help help))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(help help))]
(when (seq labels)
(.labelNames instance (into-array String labels)))
{::instance instance
::fn (fn [{:keys [cmd by labels] :or {by 1}}]
(if labels
(let [labels (into-array String [labels])]
(case cmd
:inc (.. ^Gauge instance (labels labels) (inc by))
:dec (.. ^Gauge instance (labels labels) (dec by))))
(case cmd
:inc (.inc ^Gauge instance by)
:dec (.dec ^Gauge instance by))))}))
(assoc props ::mdef/instance (.register instance registry))))
(def default-quantiles
[[0.75 0.02]
[0.99 0.001]])
(defn make-summary
[{:keys [name help registry reg labels max-age quantiles buckets]
:or {max-age 3600 buckets 6 quantiles default-quantiles} :as props}]
(defmethod create-collector :summary
[{::mdef/keys [name help reg labels max-age quantiles buckets]
::keys [registry]
:or {max-age 3600 buckets 12 quantiles default-quantiles}
:as props}]
(let [registry (or registry reg)
instance (doto (Summary/build)
builder (doto (Summary/build)
(.name name)
(.help help))
_ (when (seq quantiles)
(.maxAgeSeconds ^Summary instance max-age)
(.ageBuckets ^Summary instance buckets))
_ (doseq [[q e] quantiles]
(.quantile ^Summary instance q e))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(.help help))]
{::instance instance
::fn (fn [{:keys [val labels]}]
(if labels
(.. ^Summary instance
(labels (into-array String labels))
(observe val))
(.observe ^Summary instance val)))}))
(when (seq quantiles)
(.maxAgeSeconds ^Summary$Builder builder ^long max-age)
(.ageBuckets ^Summary$Builder builder buckets))
(def default-histogram-buckets
[1 5 10 25 50 75 100 250 500 750 1000 2500 5000 7500])
(doseq [[q e] quantiles]
(.quantile ^Summary$Builder builder q e))
(defn make-histogram
[{:keys [name help registry reg labels buckets]
:or {buckets default-histogram-buckets}}]
(when (seq labels)
(.labelNames ^Summary$Builder builder (into-array String labels)))
(assoc props ::mdef/instance (.register ^Summary$Builder builder registry))))
(defmethod create-collector :histogram
[{::mdef/keys [name help reg labels buckets]
::keys [registry]
:or {buckets default-histogram-buckets}
:as props}]
(let [registry (or registry reg)
instance (doto (Histogram/build)
(.name name)
(.help help)
(.buckets (into-array Double/TYPE buckets)))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(.buckets (into-array Double/TYPE buckets)))]
{::instance instance
::fn (fn [{:keys [val labels]}]
(if labels
(.. ^Histogram instance
(labels (into-array String labels))
(observe val))
(.observe ^Histogram instance val)))}))
(defn create
[{:keys [type] :as props}]
(case type
:counter (make-counter props)
:gauge (make-gauge props)
:summary (make-summary props)
:histogram (make-histogram props)))
(defn wrap-counter
([rootf mobj]
(let [mdata (meta rootf)
origf (::original mdata rootf)]
(with-meta
(fn
([a]
((::fn mobj) nil)
(origf a))
([a b]
((::fn mobj) nil)
(origf a b))
([a b c]
((::fn mobj) nil)
(origf a b c))
([a b c d]
((::fn mobj) nil)
(origf a b c d))
([a b c d & more]
((::fn mobj) nil)
(apply origf a b c d more)))
(assoc mdata ::original origf))))
([rootf mobj labels]
(let [mdata (meta rootf)
origf (::original mdata rootf)]
(with-meta
(fn
([a]
((::fn mobj) {:labels labels})
(origf a))
([a b]
((::fn mobj) {:labels labels})
(origf a b))
([a b & more]
((::fn mobj) {:labels labels})
(apply origf a b more)))
(assoc mdata ::original origf)))))
(defn wrap-summary
([rootf mobj]
(let [mdata (meta rootf)
origf (::original mdata rootf)]
(with-meta
(fn
([a]
(with-measure
:expr (origf a)
:cb #((::fn mobj) {:val %})))
([a b]
(with-measure
:expr (origf a b)
:cb #((::fn mobj) {:val %})))
([a b & more]
(with-measure
:expr (apply origf a b more)
:cb #((::fn mobj) {:val %}))))
(assoc mdata ::original origf))))
([rootf mobj labels]
(let [mdata (meta rootf)
origf (::original mdata rootf)]
(with-meta
(fn
([a]
(with-measure
:expr (origf a)
:cb #((::fn mobj) {:val % :labels labels})))
([a b]
(with-measure
:expr (origf a b)
:cb #((::fn mobj) {:val % :labels labels})))
([a b & more]
(with-measure
:expr (apply origf a b more)
:cb #((::fn mobj) {:val % :labels labels}))))
(assoc mdata ::original origf)))))
(defn instrument-vars!
[vars {:keys [wrap] :as props}]
(let [obj (create props)]
(cond
(instance? Counter (::instance obj))
(doseq [var vars]
(alter-var-root var (or wrap wrap-counter) obj))
(instance? Summary (::instance obj))
(doseq [var vars]
(alter-var-root var (or wrap wrap-summary) obj))
:else
(ex/raise :type :not-implemented))))
(defn instrument
[f {:keys [wrap] :as props}]
(let [obj (create props)]
(cond
(instance? Counter (::instance obj))
((or wrap wrap-counter) f obj)
(instance? Summary (::instance obj))
((or wrap wrap-summary) f obj)
(instance? Histogram (::instance obj))
((or wrap wrap-summary) f obj)
:else
(ex/raise :type :not-implemented))))
(defn instrument-jetty!
[^CollectorRegistry registry ^StatisticsHandler handler]
(doto (JettyStatisticsCollector. handler)
(.register registry))
nil)
(when (seq labels)
(.labelNames instance (into-array String labels)))
(assoc props ::mdef/instance (.register instance registry))))
+138 -3
View File
@@ -2,12 +2,16 @@
;; 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) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.migrations
(:require
[app.migrations.migration-0023 :as mg0023]
[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
@@ -202,7 +206,138 @@
{:name "0064-mod-audit-log-table"
:fn (mg/resource "app/migrations/sql/0064-mod-audit-log-table.sql")}
{:name "0065-add-trivial-spelling-fixes"
:fn (mg/resource "app/migrations/sql/0065-add-trivial-spelling-fixes.sql")}
{:name "0066-add-frame-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0066-add-frame-thumbnail-table.sql")}
{:name "0067-add-team-invitation-table"
:fn (mg/resource "app/migrations/sql/0067-add-team-invitation-table.sql")}
{:name "0068-mod-storage-object-table"
:fn (mg/resource "app/migrations/sql/0068-mod-storage-object-table.sql")}
{:name "0069-add-file-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0069-add-file-thumbnail-table.sql")}
{:name "0070-del-frame-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0070-del-frame-thumbnail-table.sql")}
{:name "0071-add-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0071-add-file-object-thumbnail-table.sql")}
{:name "0072-mod-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0072-mod-file-object-thumbnail-table.sql")}
{:name "0073-mod-file-media-object-constraints"
:fn (mg/resource "app/migrations/sql/0073-mod-file-media-object-constraints.sql")}
{:name "0074-mod-file-library-rel-constraints"
:fn (mg/resource "app/migrations/sql/0074-mod-file-library-rel-constraints.sql")}
{:name "0075-mod-share-link-table"
:fn (mg/resource "app/migrations/sql/0075-mod-share-link-table.sql")}
{:name "0076-mod-storage-object-table"
:fn (mg/resource "app/migrations/sql/0076-mod-storage-object-table.sql")}
{:name "0077-mod-comment-thread-table"
:fn (mg/resource "app/migrations/sql/0077-mod-comment-thread-table.sql")}
{:name "0078-mod-file-media-object-table-drop-cascade"
:fn (mg/resource "app/migrations/sql/0078-mod-file-media-object-table-drop-cascade.sql")}
{:name "0079-mod-profile-table"
:fn (mg/resource "app/migrations/sql/0079-mod-profile-table.sql")}
{:name "0080-mod-index-names"
:fn (mg/resource "app/migrations/sql/0080-mod-index-names.sql")}
{:name "0081-add-deleted-at-index-to-file-table"
:fn (mg/resource "app/migrations/sql/0081-add-deleted-at-index-to-file-table.sql")}
{:name "0082-add-features-column-to-file-table"
:fn (mg/resource "app/migrations/sql/0082-add-features-column-to-file-table.sql")}
{:name "0083-add-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0083-add-file-data-fragment-table.sql")}
{:name "0084-add-features-column-to-file-change-table"
:fn (mg/resource "app/migrations/sql/0084-add-features-column-to-file-change-table.sql")}
{:name "0085-add-webhook-table"
:fn (mg/resource "app/migrations/sql/0085-add-webhook-table.sql")}
{:name "0086-add-webhook-delivery-table"
:fn (mg/resource "app/migrations/sql/0086-add-webhook-delivery-table.sql")}
{:name "0087-mod-task-table"
:fn (mg/resource "app/migrations/sql/0087-mod-task-table.sql")}
{:name "0088-mod-team-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0088-mod-team-profile-rel-table.sql")}
{:name "0089-mod-project-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0089-mod-project-profile-rel-table.sql")}
{:name "0090-mod-http-session-table"
:fn (mg/resource "app/migrations/sql/0090-mod-http-session-table.sql")}
{:name "0091-mod-team-project-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0091-mod-team-project-profile-rel-table.sql")}
{:name "0092-mod-team-invitation-table"
:fn (mg/resource "app/migrations/sql/0092-mod-team-invitation-table.sql")}
{:name "0093-del-file-share-tokens-table"
:fn (mg/resource "app/migrations/sql/0093-del-file-share-tokens-table.sql")}
{:name "0094-del-profile-attr-table"
:fn (mg/resource "app/migrations/sql/0094-del-profile-attr-table.sql")}
{:name "0095-del-storage-data-table"
:fn (mg/resource "app/migrations/sql/0095-del-storage-data-table.sql")}
{:name "0096-del-storage-pending-table"
:fn (mg/resource "app/migrations/sql/0096-del-storage-pending-table.sql")}
{: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")}
{: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")}
])
(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/init-key ::migrations [_ _] 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"))))
Loaded 100 of 1497 files, more files were not shown because too many files have changed in this diff. Show more