From a76a9fae41f6aa69acfc5f4640b54b3c1560518f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Wed, 6 Aug 2025 13:28:02 +0200 Subject: [PATCH 1/5] :bug: Fix an unused translation (#7074) --- frontend/translations/en.po | 5 ----- 1 file changed, 5 deletions(-) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 745621ca7c..c3328ae363 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -4387,11 +4387,6 @@ msgstr "Subscription" msgid "subscription.settings.add-payment-to-continue" msgstr "Add a payment method to continue after your trial" -#: src/app/main/ui/settings/subscription.cljs:82, src/app/main/ui/settings/subscription.cljs:115, src/app/main/ui/settings/subscription.cljs:127 -#, fuzzy, unused -msgid "subscription.settings.benefits.all-professiona-benefits" -msgstr "" - #: src/app/main/ui/settings/subscription.cljs:247, src/app/main/ui/settings/subscription.cljs:268, src/app/main/ui/settings/subscription.cljs:303, src/app/main/ui/settings/subscription.cljs:317 msgid "subscription.settings.benefits.all-professional-benefits" msgstr "All Professional plan benefits and:" From 778a608854012be85c0a6938a8b4032dd4b3b2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marina=20L=C3=B3pez?= Date: Thu, 7 Aug 2025 07:43:49 +0200 Subject: [PATCH 2/5] :bug: Fix tooltip for icon plans from team dropdown (#7075) --- frontend/src/app/main/ui/dashboard/subscription.cljs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/main/ui/dashboard/subscription.cljs b/frontend/src/app/main/ui/dashboard/subscription.cljs index d320a687e4..2a560f84bc 100644 --- a/frontend/src/app/main/ui/dashboard/subscription.cljs +++ b/frontend/src/app/main/ui/dashboard/subscription.cljs @@ -125,7 +125,11 @@ (mf/defc menu-team-icon* [{:keys [subscription-type]}] - [:span {:class (stl/css :subscription-icon) :data-testid "subscription-icon"} + [:span {:class (stl/css :subscription-icon) + :title (if (= subscription-type "unlimited") + (tr "subscription.dashboard.power-up.unlimited-plan") + (tr "subscription.dashboard.power-up.enterprise-plan")) + :data-testid "subscription-icon"} (case subscription-type "unlimited" i/character-u "enterprise" i/character-e)]) From 6abd045273e0b8baf65150bedbf2592f42d468d2 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 7 Aug 2025 12:36:14 +0200 Subject: [PATCH 3/5] :bug: Add missing generator for token-set file change operation (#7080) * :bug: Add missing generator for token-set file change operation * :bug: Use ::sm/any instead of :any for on get-file-data-for-thumbnail rpc method Mainly because :any will use a very generic generator that can generate instances of Character that are not directly serializable to JSON --- backend/src/app/rpc/commands/files_thumbnails.clj | 2 +- common/src/app/common/files/changes.cljc | 9 ++++++++- common/src/app/common/types/tokens_lib.cljc | 8 +++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/src/app/rpc/commands/files_thumbnails.clj b/backend/src/app/rpc/commands/files_thumbnails.clj index 9d64ec504d..c74f023b9d 100644 --- a/backend/src/app/rpc/commands/files_thumbnails.clj +++ b/backend/src/app/rpc/commands/files_thumbnails.clj @@ -185,7 +185,7 @@ [:map {:title "PartialFile"} [:id ::sm/uuid] [:revn {:min 0} ::sm/int] - [:page :any]]) + [:page [:map-of :keyword ::sm/any]]]) (sv/defmethod ::get-file-data-for-thumbnail "Retrieves the data for generate the thumbnail of the file. Used diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index d9965ce556..8915402b06 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -418,7 +418,14 @@ [:type [:= :set-token-set]] [:set-name :string] [:group? :boolean] - [:token-set [:maybe [:fn ctob/token-set?]]]]] + + ;; FIXME: we should not pass private types as part of changes + ;; protocol, the changes protocol should reflect a + ;; method/protocol for perform surgical operations on file data, + ;; this has nothing todo with internal types of a file data + ;; structure. + [:token-set {:gen/gen (sg/generator ctob/schema:token-set)} + [:maybe [:fn ctob/token-set?]]]]] [:set-token [:map {:title "SetTokenChange"} diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index a802679a2c..498801f2d8 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -186,6 +186,10 @@ :modified-at modified-at :tokens tokens})]) + #?@(:clj + [json/JSONWriter + (-write [this writter options] (json/-write (deref this) writter options))]) + #?@(:cljs [cljs.core/IEncodeJS (-clj->js [_] (js-obj "id" (clj->js id) "name" (clj->js name) @@ -292,7 +296,9 @@ (declare make-token-set) (def schema:token-set - (sm/required-keys schema:token-set-attrs)) + [:schema {:gen/gen (->> (sg/generator schema:token-set-attrs) + (sg/fmap #(make-token-set %)))} + (sm/required-keys schema:token-set-attrs)]) (sm/register! ::token-set schema:token-set) ;; need to register for the recursive schema of token-sets From 23a6f4b7c12626206a2f4524bf00ba364d50fb57 Mon Sep 17 00:00:00 2001 From: Yamila Moreno Date: Thu, 7 Aug 2025 18:07:47 +0200 Subject: [PATCH 4/5] :paperclip: Improve gh actions --- .github/workflows/build-bundles.yml | 105 ++++++---------------------- .github/workflows/build-develop.yml | 12 ++++ .github/workflows/build-staging.yml | 12 ++++ 3 files changed, 44 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/build-develop.yml create mode 100644 .github/workflows/build-staging.yml diff --git a/.github/workflows/build-bundles.yml b/.github/workflows/build-bundles.yml index ff2f37f75f..a8efc23fa3 100644 --- a/.github/workflows/build-bundles.yml +++ b/.github/workflows/build-bundles.yml @@ -1,28 +1,14 @@ -name: Build and Upload Penpot Bundles non-prod +name: Build and Upload Penpot Bundles on: - # Create bundler for every tag - push: - tags: - - '**' # Pattern matched against refs/tags - # Create bundler every hour between 5:00 and 20:00 on working days - schedule: - - cron: '0 5-20 * * 1-5' - # Create bundler from manual action + # Create bundle from manual action workflow_dispatch: + workflow_call: inputs: - zip_mode: - # zip_mode defines how the build artifacts are packaged: - # - 'individual': creates one ZIP file per component (frontend, backend, exporter) - # - 'all': creates a single ZIP containing all components - # - null: for the rest of cases (non-manual events) - description: 'Bundle packaging mode' - required: false - default: 'individual' - type: choice - options: - - individual - - all + gh_ref: + description: 'Name of the branch' + type: string + required: true jobs: build-bundles: @@ -38,15 +24,15 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ inputs.gh_ref }} - - name: Extract somer useful variables + - name: Extract some useful variables id: vars run: | echo "commit_hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "gh_branch=${{ github.base_ref || github.ref_name }}" >> $GITHUB_OUTPUT - # Set up Docker Buildx for multi-arch build - - name: Set up Docker Buildx + - name: Set up Docker Buildx for multi-arch build uses: docker/setup-buildx-action@v3 - name: Run manage.sh build-bundle from host @@ -57,73 +43,22 @@ jobs: mkdir zips mv bundles penpot - - name: Create zip bundles for zip_mode == 'all' - if: ${{ github.event.inputs.zip_mode == 'all' }} + - name: Create zip bundles run: | - echo "๐Ÿ“ฆ Packaging Penpot 'all' bundles..." - zip -r zips/penpot-all-bundles.zip penpot + echo "๐Ÿ“ฆ Packaging Penpot bundles..." + zip -r zips/penpot.zip penpot - - name: Create zip bundles for zip_mode != 'all' - if: ${{ github.event.inputs.zip_mode != 'all' }} + - name: Upload Penpot bundle to S3 run: | - echo "๐Ÿ“ฆ Packaging Penpot 'individual' bundles..." - zip -r zips/penpot-frontend.zip penpot/frontend - zip -r zips/penpot-backend.zip penpot/backend - zip -r zips/penpot-exporter.zip penpot/exporter + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.gh_branch}}-latest.zip + aws s3 cp zips/penpot.zip s3://${{ secrets.S3_BUCKET }}/penpot-${{ steps.vars.outputs.commit_hash }}.zip - - name: Upload unified 'all' bundle - if: ${{ github.event.inputs.zip_mode == 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-all-bundles - path: zips/penpot-all-bundles.zip - - - name: Upload individual bundles - if: ${{ github.event.inputs.zip_mode != 'all' }} - uses: actions/upload-artifact@v4 - with: - name: penpot-individual-bundles - path: | - zips/penpot-frontend.zip - zips/penpot-backend.zip - zips/penpot-exporter.zip - - - name: Upload unified 'all' bundle to S3 - if: ${{ github.event.inputs.zip_mode == 'all' }} - run: | - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.gh_branch}}.zip - aws s3 cp zips/penpot-all-bundles.zip s3://${{ secrets.S3_BUCKET }}/penpot-all-bundles-${{ steps.vars.outputs.commit_hash }}.zip - - - name: Upload 'individual' bundles to S3 - if: ${{ github.event.inputs.zip_mode != 'all' }} - run: | - for name in penpot-frontend penpot-backend penpot-exporter; do - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.gh_branch }}-latest.zip - aws s3 cp zips/${name}.zip s3://${{ secrets.S3_BUCKET }}/${name}-${{ steps.vars.outputs.commit_hash }}.zip - done - - - name: Notify Mattermost about automatic bundles - if: github.event_name == 'pull_request' + - name: Notify Mattermost + if: failure() uses: mattermost/action-mattermost-notify@master with: MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} TEXT: | - ๐Ÿ“ฆ *Penpot bundle automatically generated* - ๐Ÿ“„ PR: ${{ github.event.pull_request.title }} - ๐Ÿ” From: \`${{ github.head_ref }}\` to \`{{ github.base_ref }}\` + โŒ *[PENPOT] Error during the execution of the job* + ๐Ÿ“„ Triggered from ref: `${{ steps.vars.outputs.gh_branch}}` ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Notify Mattermost about manual bundles - if: github.event_name == 'workflow_dispatch' - uses: mattermost/action-mattermost-notify@master - with: - MATTERMOST_WEBHOOK_URL: ${{ secrets.MATTERMOST_WEBHOOK }} - TEXT: | - ๐Ÿ“ฆ *Penpot bundle manually generated* - ๐Ÿ“„ Triggered from branch: `${{ github.ref_name}}` - ๐Ÿ”— Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: Print artifact summary URL - run: | - echo "๐Ÿ“ฆ Artifacts available at:" - echo "๐Ÿ”— https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" diff --git a/.github/workflows/build-develop.yml b/.github/workflows/build-develop.yml new file mode 100644 index 0000000000..dddcceeeb9 --- /dev/null +++ b/.github/workflows/build-develop.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot DEVELOP Bundles + +on: + schedule: + - cron: '16 5-20 * * 1-5' + +jobs: + build-develop-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "develop" diff --git a/.github/workflows/build-staging.yml b/.github/workflows/build-staging.yml new file mode 100644 index 0000000000..1d49914d9c --- /dev/null +++ b/.github/workflows/build-staging.yml @@ -0,0 +1,12 @@ +name: Build and Upload Penpot STAGING Bundles + +on: + schedule: + - cron: '0 5 * * 1-5' + +jobs: + build-staging-bundle: + uses: ./.github/workflows/build-bundles.yml + secrets: inherit + with: + gh_ref: "staging" From 32bd08533d1c6b82061bd5a526d24f1beeae17f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?andr=C3=A9s=20gonz=C3=A1lez?= Date: Fri, 8 Aug 2025 09:46:40 +0200 Subject: [PATCH 5/5] :lipstick: Remove slide about overrides in the release notes (#7086) --- frontend/src/app/main/ui/releases/v2_9.cljs | 34 ++------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/frontend/src/app/main/ui/releases/v2_9.cljs b/frontend/src/app/main/ui/releases/v2_9.cljs index 47f4183117..600df72665 100644 --- a/frontend/src/app/main/ui/releases/v2_9.cljs +++ b/frontend/src/app/main/ui/releases/v2_9.cljs @@ -74,42 +74,12 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 3}] + :total 2}] [:button {:on-click next :class (stl/css :next-btn)} "Continue"]]]]]] 1 - [:div {:class (stl/css-case :modal-overlay true)} - [:div.animated {:class klass} - [:div {:class (stl/css :modal-container)} - [:img {:src "images/features/2.9-overrides.gif" - :class (stl/css :start-image) - :border "0" - :alt "Component text overrides"}] - - [:div {:class (stl/css :modal-content)} - [:div {:class (stl/css :modal-header)} - [:h1 {:class (stl/css :modal-title)} - "Component text overrides"]] - - [:div {:class (stl/css :feature)} - [:p {:class (stl/css :feature-content)} - "You can now edit the text content independently from its propertiesโ€”such as color, effects, font size, or weightโ€”allowing you to update the wording while preserving the styling."] - - [:p {:class (stl/css :feature-content)} - "This change (inspired by community feedback) greatly improves consistency, predictability, and control when working with texts in components."]] - - [:div {:class (stl/css :navigation)} - [:& c/navigation-bullets - {:slide slide - :navigate navigate - :total 3}] - - [:button {:on-click next - :class (stl/css :next-btn)} "Continue"]]]]]] - - 2 [:div {:class (stl/css-case :modal-overlay true)} [:div.animated {:class klass} [:div {:class (stl/css :modal-container)} @@ -135,7 +105,7 @@ [:& c/navigation-bullets {:slide slide :navigate navigate - :total 3}] + :total 2}] [:button {:on-click finish :class (stl/css :next-btn)} "Let's go"]]]]]])))