Compare commits

...

25 Commits

Author SHA1 Message Date
Andrey Antukh
e369b70aeb Merge pull request #5279 from penpot/alotor-hotfix-grid-problem
🐛 Fix problem with grid layout ordering after moving
2024-11-11 12:48:40 +01:00
alonso.torres
c3970255e6 🐛 Fix problem with grid layout ordering after moving 2024-11-11 12:34:07 +01:00
Andrey Antukh
7823eaf890 📎 Update changelog 2024-11-11 12:08:49 +01:00
Andrey Antukh
ec0079461e Merge pull request #5262 from penpot/palba-add-libraries-dialog-event
 Send event when an user opens a modal
2024-11-07 20:52:52 +01:00
Pablo Alba
70a1a7a5ea Send event when an user opens a modal 2024-11-07 16:27:16 +01:00
Andrey Antukh
c3dc165c4c Merge pull request #5241 from penpot/bameda-docs-kubernetes-setup
📚 Add documentation to install with Kubernetes
2024-11-07 10:33:49 +01:00
David Barragán Merino
5a3619c737 📚 Add documentation to install with Kubernetes 2024-11-06 14:55:41 +01:00
Pablo Alba
227f06c1ec Merge pull request #5255 from penpot/niwinz-bugfix-1
🐛 Fix null pointer exception on validating nil with number schema
2024-11-06 09:36:14 +01:00
Andrey Antukh
946dac3c9f 🐛 Fix NPE on number schemas
Mainly, without this fix, happens the following:

user=> (sm/validate [::sm/int {:min 0}] nil)
Execution error (NullPointerException) at app.common.schema/fn$fn (schema.cljc:692).
Cannot invoke "Object.getClass()" because "x" is null

And it should return `false` without an exception.
2024-11-06 09:15:06 +01:00
Andrey Antukh
b160ba1793 📎 Update .gitignore 2024-11-06 09:14:47 +01:00
Andrey Antukh
33d51a51d1 📚 Update changelog 2024-11-04 17:29:52 +01:00
Andrey Antukh
ab4be85669 Merge pull request #5250 from penpot/alotor-hotfix-plugins-api-problem
🐛 Fix problem with promises in plugins
2024-11-04 17:27:41 +01:00
alonso.torres
6c0dce580d 🐛 Fix problem with promises in plugins 2024-11-04 17:12:45 +01:00
Andrey Antukh
59050a7bc6 📎 Backport frontend/package.json changes
Mainly for compatibility with the upcoming devenv changes
2024-11-04 16:16:28 +01:00
Andrey Antukh
3334fb0e99 🐛 Add migration to fix invalid pages 2024-11-04 15:34:09 +01:00
Andrey Antukh
24268bbf33 Merge pull request #5248 from penpot/palba-add-event-for-add-frame
 Add event for add-frame
2024-11-04 14:25:19 +01:00
Pablo Alba
cd3f8f0c43 Add event for add-frame 2024-11-04 12:56:34 +01:00
Andrey Antukh
d3a8954605 Merge pull request #5247 from penpot/alotor-fix-plugin-problem
🐛 Fix problem with plugins path positioning
2024-11-04 12:16:25 +01:00
alonso.torres
1cda61e230 🐛 Fix problem with plugins path positioning 2024-11-04 11:02:04 +01:00
Alejandro
aca3e3db4f Merge pull request #5237 from penpot/niwinz-hotfix-2
🐛 Fix incorrect thumbnail lookup on dashboard project view
2024-10-31 16:12:22 +01:00
Andrey Antukh
74f9166f3d Merge pull request #5238 from penpot/bameda-manage-build-docs-bundle
🎉 add command to build docs bundle
2024-10-30 23:15:22 +01:00
David Barragán Merino
977a2090fb 🎉 add command to build docs bundle 2024-10-30 19:17:04 +01:00
Andrey Antukh
14e6ea9393 Merge pull request #5236 from penpot/palba-testab-templates-link2
🎉 Add test A/B for add a link to the libraries page
2024-10-30 16:44:17 +01:00
Andrey Antukh
3eb35f0aa6 🐛 Fix incorrect thumbnail lookup on dashboard project view
That causes a repeated generation of thumbnails on each page
view instead of reusing already generated thumbnails.
2024-10-30 16:19:16 +01:00
Pablo Alba
92b7a35c58 🎉 Add test A/B for add a link to the libraries page 2024-10-30 16:13:05 +01:00
26 changed files with 324 additions and 66 deletions

2
.gitignore vendored
View File

@@ -74,3 +74,5 @@ node_modules
/playwright-report/
/blob-report/
/playwright/.cache/
/render-wasm/target/
/**/.yarn/*

View File

@@ -1,5 +1,25 @@
# CHANGELOG
## 2.3.2
### :bug: Bugs fixed
- Fix null pointer exception on number checking functions
- Fix problem with grid layout ordering after moving [Taiga #9179](https://tree.taiga.io/project/penpot/issue/9179)
### :books: Documentation
- Add initial documentation for Kubernetes
## 2.3.1
### :bug: Bugs fixed
- Fix unexpected issue on interaction between plugins sandbox and
internal impl of promise
## 2.3.0
### :rocket: Epics and highlights

View File

@@ -356,7 +356,7 @@
f.name,
f.revn,
f.is_shared,
ft.media_id
ft.media_id AS thumbnail_id
from file as f
left join file_thumbnail as ft on (ft.file_id = f.id
and ft.revn = f.revn
@@ -367,13 +367,7 @@
(defn get-project-files
[conn project-id]
(->> (db/exec! conn [sql:project-files project-id])
(mapv (fn [row]
(if-let [media-id (:media-id row)]
(-> row
(dissoc :media-id)
(assoc :thumbnail-uri (resolve-public-uri media-id)))
(dissoc row :media-id))))))
(db/exec! conn [sql:project-files project-id]))
(def schema:get-project-files
[:map {:title "get-project-files"}

View File

@@ -467,7 +467,7 @@
#?(:clj (validate-shapes! data result items))
result))))
;; DEPRECATED: remove before 2.3 release
;; DEPRECATED: remove after 2.3 release
(defmethod process-change :set-option
[data _]
data)

View File

@@ -6,4 +6,4 @@
(ns app.common.files.defaults)
(def version 56)
(def version 57)

View File

@@ -13,6 +13,7 @@
[app.common.files.defaults :as cfd]
[app.common.files.helpers :as cfh]
[app.common.geom.matrix :as gmt]
[app.common.geom.point :as gpt]
[app.common.geom.rect :as grc]
[app.common.geom.shapes :as gsh]
[app.common.geom.shapes.path :as gsp]
@@ -1102,6 +1103,33 @@
(update :pages-index update-vals update-container)
(update :components update-vals update-container))))
(defn migrate-up-57
[data]
(letfn [(fix-thread-positions [positions]
(reduce-kv (fn [result id {:keys [position] :as data}]
(let [data (cond
(gpt/point? position)
data
(and (map? position)
(gpt/valid-point-attrs? position))
(assoc data :position (gpt/point position))
:else
(assoc data :position (gpt/point 0 0)))]
(assoc result id data)))
positions
positions))
(update-page [page]
(d/update-when page :comment-thread-positions fix-thread-positions))]
(-> data
(update :pages (fn [pages] (into [] (remove nil?) pages)))
(update :pages-index dissoc nil)
(update :pages-index update-vals update-page))))
(def migrations
"A vector of all applicable migrations"
[{:id 2 :migrate-up migrate-up-2}
@@ -1149,4 +1177,6 @@
{:id 53 :migrate-up migrate-up-26}
{:id 54 :migrate-up migrate-up-54}
{:id 55 :migrate-up migrate-up-55}
{:id 56 :migrate-up migrate-up-56}])
{:id 56 :migrate-up migrate-up-56}
{:id 57 :migrate-up migrate-up-57}])

View File

@@ -56,6 +56,9 @@
[:x ::sm/safe-number]
[:y ::sm/safe-number]])
(def valid-point-attrs?
(sm/validator schema:point-attrs))
(def valid-point?
(sm/validator
[:and [:fn point?] schema:point-attrs]))

View File

@@ -391,13 +391,14 @@
(-> (pcb/update-shapes
[parent-id]
(fn [frame objects]
(-> frame
;; Assign the cell when pushing into a specific grid cell
(cond-> (some? cell)
(-> (ctl/free-cell-shapes ids)
(ctl/push-into-cell ids (:row cell) (:column cell))
(ctl/assign-cells objects)))
(ctl/assign-cell-positions objects)))
(let [[row column] cell]
(-> frame
;; Assign the cell when pushing into a specific grid cell
(cond-> (some? cell)
(-> (ctl/free-cell-shapes ids)
(ctl/push-into-cell ids row column)
(ctl/assign-cells objects)))
(ctl/assign-cell-positions objects))))
{:with-objects? true})
(pcb/reorder-grid-children [parent-id])))

View File

@@ -681,8 +681,8 @@
(let [pred int?
pred (if (some? min)
(fn [v]
(and (>= v min)
(pred v)))
(and (pred v)
(>= v min)))
pred)
pred (if (some? max)
(fn [v]
@@ -719,8 +719,8 @@
(let [pred double?
pred (if (some? min)
(fn [v]
(and (>= v min)
(pred v)))
(and (pred v)
(>= v min)))
pred)
pred (if (some? max)
(fn [v]
@@ -749,8 +749,8 @@
(let [pred number?
pred (if (some? min)
(fn [v]
(and (>= v min)
(pred v)))
(and (pred v)
(>= v min)))
pred)
pred (if (some? max)
(fn [v]

View File

@@ -256,6 +256,142 @@ Postgres database and another one for the assets uploaded by your users (images
clips). There may be more volumes if you enable other features, as explained in the file
itself.
## Install with Kubernetes
This section details everything you need to know to get Penpot up and running in
production environments using a Kubernetes cluster of your choice. To do this, we have
created a <a href="https://helm.sh/" target="_blank">Helm<a> repository with everything
you need.
Therefore, your prerequisite will be to have a Kubernetes cluster on which we can install
Helm.
### What is Helm
*Helm* is the package manager for Kubernetes. A *Chart* is a Helm package. It contains
all of the resource definitions necessary to run an application, tool, or service inside
of a Kubernetes cluster. Think of it like the Kubernetes equivalent of a Homebrew
formula, an Apt dpkg, or a Yum RPM file.
A Repository is the place where charts can be collected and shared. It's like Perl's CPAN
archive or the Fedora Package Database, but for Kubernetes packages.
A Release is an instance of a chart running in a Kubernetes cluster. One chart can often
be installed many times into the same cluster. And each time it is installed, a new
release is created. Consider a MySQL chart. If you want two databases running in your
cluster, you can install that chart twice. Each one will have its own release, which will
in turn have its own release name.
With these concepts in mind, we can now explain Helm like this:
> Helm installs charts into Kubernetes clusters, creating a new release for each
> installation. And to find new charts, you can search Helm chart repositories.
### Install Helm
<p class="advice">
Skip this section if you already have Helm installed in your system.
</p>
You can install Helm by following the <a href="https://helm.sh/docs/intro/install/" target="_blank">official guide</a>.
There are different ways to install Helm, depending on your infrastructure and operating
system.
### Add Penpot repository
To add the Penpot Helm repository, run the following command:
```bash
helm repo add penpot http://helm.penpot.app
```
This will add the Penpot repository to your Helm configuration, so you can install all
the Penpot charts stored there.
### Install Penpot Chart
To install the chart with the release name `my-release`:
```bash
helm install my-release penpot/penpot
```
You can customize the installation specify each parameter using the `--set key=value[,key=value]`
argument to helm install. For example,
```bash
helm install my-release \
--set global.postgresqlEnabled=true \
--set global.redisEnabled=true \
--set persistence.assets.enabled=true \
penpot/penpot
```
Alternatively, a YAML file that specifies the values for the above parameters can be
provided while installing the chart. For example,
```bash
helm install my-release -f values.yaml penpot/penpot
```
### Configure Penpot with Helm Chart
In the previous section we have shown how to configure penpot during installation by
using parameters or by using a yaml file.
The default values are defined in the
<a href="https://github.com/penpot/penpot-helm/blob/main/charts/penpot/values.yaml" target="_blank">`values.yml`</a>
file itself, which you can use as a basis for creating your own settings.
You can also consult the list of parameters on the
<a href="https://artifacthub.io/packages/helm/penpot/penpot#parameters" target="_blank">ArtifactHub page of the project</a>.
### Upgrade Penpot
When a new version of Penpot's chart is released, or when you want to change the
configuration of your release, you can use the helm upgrade command.
```bash
helm upgrade my-release -f values.yaml penpot/penpot
```
An upgrade takes an existing release and upgrades it according to the information you
provide. Because Kubernetes charts can be large and complex, Helm tries to perform the
least invasive upgrade. It will only update things that have changed since the last
release.
After each upgrade, a new *revision* will be generated. You can check the revision
history of a release with `helm history my-release` and go back to the previous revision
if something went wrong with `helm rollback my-release 1` (`1` is the revision number of
the previous release revision).
### Backup Penpot
The Penpot's Helm Chart uses different Persistent Volumes to store all persistent data.
This allows you to delete and recreate the instance whenever you want without losing
information.
You back up data from a Persistent Volume via snapshots, so you will want to ensure that
your container storage interface (CSI) supports volume snapshots. There are a couple of
different options for the CSI driver that you choose. All of the major cloud providers
have their respective CSI drivers.
At last, there are two Persistent Volumes used: one for the Postgres database and another
one for the assets uploaded by your users (images and svg clips). There may be more
volumes if you enable other features, as explained in the file itself.
You have to back up your custom settings too (the yaml file or the list of parameters you
are using during you setup).
## Unofficial self-host options
There are some other options, **NOT SUPPORTED BY PENPOT**:

View File

@@ -38,6 +38,7 @@
"translations": "node ./scripts/translations.js",
"watch": "yarn run watch:app:assets",
"watch:app:assets": "node ./scripts/watch.js",
"watch:app": "clojure -M:dev:shadow-cljs watch main",
"watch:storybook": "concurrently \"clojure -M:dev:shadow-cljs watch storybook\" \"storybook dev -p 6006 --no-open\" \"yarn run watch:storybook:assets\"",
"watch:storybook:assets": "node ./scripts/watch-storybook.js"
},

View File

@@ -10,6 +10,7 @@
[app.common.uuid :as uuid]
[app.main.data.events :as ev]
[app.main.store :as st]
[beicon.v2.core :as rx]
[cljs.core :as c]
[potok.v2.core :as ptk]))
@@ -30,6 +31,12 @@
(dissoc :type)
(assoc :name type)))
ptk/WatchEvent
(watch [_ _ _]
(rx/of (ptk/event
::ev/event
{::ev/name "show-modal" :type type})))
ptk/UpdateEvent
(update [_ state]
(assoc state ::modal {:id id

View File

@@ -18,6 +18,7 @@
[app.common.types.shape-tree :as ctst]
[app.main.data.changes :as dch]
[app.main.data.comments :as dc]
[app.main.data.events :as ev]
[app.main.data.workspace.edition :as dwe]
[app.main.data.workspace.selection :as dws]
[app.main.data.workspace.state-helpers :as wsh]
@@ -129,7 +130,9 @@
(dwu/commit-undo-transaction undo-id))
(when (cfh/text-shape? shape)
(->> (rx/of (dwe/start-edition-mode (:id shape)))
(rx/observe-on :async)))))))))
(rx/observe-on :async)))
(when (cfh/frame-shape? shape)
(rx/of (ptk/event ::ev/event {::ev/name "add-frame"})))))))))
(defn move-shapes-into-frame
[frame-id shapes]

View File

@@ -14,6 +14,7 @@
[app.common.types.file :as ctf]
[app.common.types.typographies-list :as ctyl]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.main.data.modal :as modal]
[app.main.data.users :as du]
[app.main.data.workspace.colors :as mdc]
@@ -293,7 +294,14 @@
[:*
[:span {:class (stl/css :empty-state-icon)}
library-icon]
(tr "workspace.libraries.no-shared-libraries-available")]
(tr "workspace.libraries.no-shared-libraries-available")
(when (cf/external-feature-flag "templates-01" "test")
[:div {:class (stl/css :templates-info)}
(tr "workspace.libraries.more-templates")
[:a {:target "_blank"
:class (stl/css :templates-info-link)
:href "https://penpot.app/libraries-templates"}
(tr "workspace.libraries.more-templates-link")]])]
:else
(tr "workspace.libraries.no-matches-for" search-term))]))]]))

View File

@@ -323,3 +323,13 @@
@include headlineSmallTypography;
padding: $s-0 $s-16;
}
.templates-info {
color: var(--color-accent-primary);
}
.templates-info-link {
color: var(--color-accent-primary);
text-decoration: underline;
font-weight: $fw400;
}

View File

@@ -40,8 +40,7 @@
[app.plugins.viewport :as viewport]
[app.util.code-gen :as cg]
[app.util.object :as obj]
[beicon.v2.core :as rx]
[promesa.core :as p]))
[beicon.v2.core :as rx]))
;;
;; PLUGINS PUBLIC API - The plugins will able to access this functions
@@ -174,7 +173,7 @@
:else
(let [file-id (:current-file-id @st/state)]
(p/create
(js/Promise.
(fn [resolve reject]
(->> (dwm/upload-media-url name file-id url)
(rx/take 1)
@@ -184,7 +183,7 @@
(uploadMediaData
[_ name data mime-type]
(let [file-id (:current-file-id @st/state)]
(p/create
(js/Promise.
(fn [resolve reject]
(->> (dwm/process-blobs
{:file-id file-id

View File

@@ -19,13 +19,12 @@
[app.plugins.shape :as shape]
[app.plugins.user :as user]
[app.plugins.utils :as u]
[beicon.v2.core :as rx]
[promesa.core :as p]))
[beicon.v2.core :as rx]))
(deftype CommentProxy [$plugin $file $page $thread $id]
Object
(remove [_]
(p/create
(js/Promise.
(fn [resolve reject]
(cond
(not (r/check-permission $plugin "comment:write"))
@@ -79,7 +78,7 @@
Object
(findComments
[_]
(p/create
(js/Promise.
(fn [resolve reject]
(cond
(not (r/check-permission $plugin "comment:read"))
@@ -106,7 +105,7 @@
(u/display-not-valid :reply "Not valid")
:else
(p/create
(js/Promise.
(fn [resolve reject]
(->> (rp/cmd! :create-comment {:thread-id $id :content content})
(rx/subs! #(resolve (comment-proxy $plugin $file $page $id $users %)) reject))))))
@@ -121,9 +120,9 @@
(u/display-not-valid :remove "Cannot change content from another user's comments")
:else
(p/create
(js/Promise.
(fn [resolve]
(p/create
(js/Promise.
(st/emit! (dc/delete-comment-thread-on-workspace {:id $id} #(resolve))))))))))
(defn comment-thread-proxy? [p]

View File

@@ -20,8 +20,7 @@
[app.plugins.utils :as u]
[app.util.http :as http]
[app.util.object :as obj]
[beicon.v2.core :as rx]
[promesa.core :as p]))
[beicon.v2.core :as rx]))
(deftype FileProxy [$plugin $id]
Object
@@ -128,7 +127,7 @@
file (u/proxy->file self)
features (features/get-team-enabled-features @st/state)
team-id (:current-team-id @st/state)]
(p/create
(js/Promise.
(fn [resolve reject]
(->> (uw/ask-many!
{:cmd export-cmd

View File

@@ -30,8 +30,7 @@
[app.plugins.utils :as u]
[app.util.object :as obj]
[beicon.v2.core :as rx]
[potok.v2.core :as ptk]
[promesa.core :as p]))
[potok.v2.core :as ptk]))
(declare lib-color-proxy)
(declare lib-typography-proxy)
@@ -915,7 +914,7 @@
(availableLibraries
[_]
(let [team-id (:current-team-id @st/state)]
(p/create
(js/Promise.
(fn [resolve reject]
(let [current-libs (into #{} (map first) (get @st/state :workspace-libraries))]
(->> (rp/cmd! :get-team-shared-files {:team-id team-id})
@@ -939,7 +938,7 @@
(u/display-not-valid :connectLibrary "Plugin doesn't have 'library:write' permission")
:else
(p/create
(js/Promise.
(fn [resolve reject]
(cond
(not (string? library-id))

View File

@@ -29,8 +29,7 @@
[app.plugins.utils :as u]
[app.util.object :as obj]
[beicon.v2.core :as rx]
[cuerdas.core :as str]
[promesa.core :as p]))
[cuerdas.core :as str]))
(deftype FlowProxy [$plugin $file $page $id]
Object
@@ -288,7 +287,7 @@
(some? board)
(-> (update :x - (:x board))
(update :y - (:y board))))]
(p/create
(js/Promise.
(fn [resolve]
(st/emit!
(dc/create-thread-on-workspace
@@ -315,10 +314,10 @@
(u/display-not-valid :removeCommentThread "Plugin doesn't have 'content:write' permission")
:else
(p/create
(js/Promise.
(fn [resolve]
(let [thread-id (obj/get thread "$id")]
(p/create
(js/Promise.
(st/emit! (dc/delete-comment-thread-on-workspace {:id thread-id} #(resolve)))))))))
(findCommentThreads
@@ -326,7 +325,7 @@
(let [only-yours (boolean (obj/get criteria "onlyYours" false))
show-resolved (boolean (obj/get criteria "showResolved" true))
user-id (-> @st/state :profile :id)]
(p/create
(js/Promise.
(fn [resolve reject]
(cond
(not (r/check-permission $plugin "comment:read"))

View File

@@ -52,8 +52,7 @@
[app.util.object :as obj]
[app.util.path.format :as upf]
[beicon.v2.core :as rx]
[cuerdas.core :as str]
[promesa.core :as p]))
[cuerdas.core :as str]))
(declare shape-proxy)
(declare shape-proxy?)
@@ -542,7 +541,7 @@
:type (:type value :png)
:suffix (:suffix value "")
:scale (:scale value 1)}]}]
(p/create
(js/Promise.
(fn [resolve reject]
(->> (rp/cmd! :export payload)
(rx/mapcat #(rp/cmd! :export {:cmd :get-resource :wait true :id (:id %) :blob? true}))
@@ -952,7 +951,7 @@
;; Geometry properties
{:name "x"
:get #(-> % u/proxy->shape :x)
:get #(-> % u/proxy->shape :points grc/points->rect :x)
:set
(fn [self value]
(let [id (obj/get self "$id")]
@@ -967,7 +966,7 @@
(st/emit! (dw/update-position id {:x value})))))}
{:name "y"
:get #(-> % u/proxy->shape :y)
:get #(-> % u/proxy->shape :points grc/points->rect :y)
:set
(fn [self value]
(let [id (obj/get self "$id")]
@@ -991,9 +990,10 @@
{:name "parentX"
:get (fn [self]
(let [shape (u/proxy->shape self)
shape-x (-> shape :points grc/points->rect :x)
parent-id (:parent-id shape)
parent (u/locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)]
(- (:x shape) (:x parent))))
(- shape-x (:x parent))))
:set
(fn [self value]
(cond
@@ -1013,10 +1013,11 @@
{:name "parentY"
:get (fn [self]
(let [shape (u/proxy->shape self)
shape-y (-> shape :points grc/points->rect :y)
parent-id (:parent-id shape)
parent (u/locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)
parent-y (:y parent)]
(- (:y shape) parent-y)))
(- shape-y parent-y)))
:set
(fn [self value]
(cond
@@ -1036,10 +1037,11 @@
{:name "boardX"
:get (fn [self]
(let [shape (u/proxy->shape self)
shape-x (-> shape :points grc/points->rect :x)
frame-id (:parent-id shape)
frame (u/locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
frame-x (:x frame)]
(- (:x shape) frame-x)))
(- shape-x frame-x)))
:set
(fn [self value]
(cond
@@ -1059,10 +1061,11 @@
{:name "boardY"
:get (fn [self]
(let [shape (u/proxy->shape self)
shape-y (-> shape :points grc/points->rect :y)
frame-id (:parent-id shape)
frame (u/locate-shape (obj/get self "$file") (obj/get self "$page") frame-id)
frame-y (:y frame)]
(- (:y shape) frame-y)))
(- shape-y frame-y)))
:set
(fn [self value]
(cond
@@ -1080,10 +1083,10 @@
(st/emit! (dw/update-position id {:y (+ frame-y value)})))))}
{:name "width"
:get #(-> % u/proxy->shape :width)}
:get #(-> % u/proxy->shape :selrect :width)}
{:name "height"
:get #(-> % u/proxy->shape :height)}
:get #(-> % u/proxy->shape :selrect :height)}
{:name "bounds"
:get #(-> % u/proxy->shape :points grc/points->rect format/format-bounds)}

View File

@@ -12,8 +12,7 @@
[app.common.types.container :as ctn]
[app.common.types.file :as ctf]
[app.main.store :as st]
[app.util.object :as obj]
[promesa.core :as p]))
[app.util.object :as obj]))
(defn locate-file
[id]
@@ -175,7 +174,7 @@
[]
(let [ret-v (atom nil)
ret-p
(p/create
(js/Promise.
(fn [resolve _]
(add-watch
ret-v

View File

@@ -4415,6 +4415,14 @@ msgstr "No matches found for “%s“"
msgid "workspace.libraries.no-shared-libraries-available"
msgstr "There are no Shared Libraries available"
#: src/app/main/ui/workspace/libraries.cljs:297
msgid "workspace.libraries.more-templates"
msgstr "You can look for "
#: src/app/main/ui/workspace/libraries.cljs:297
msgid "workspace.libraries.more-templates-link"
msgstr "more templates in here"
#: src/app/main/ui/workspace/libraries.cljs:260
msgid "workspace.libraries.search-shared-libraries"
msgstr "Search shared libraries"

View File

@@ -4397,6 +4397,14 @@ msgstr "No se encuentra “%s“"
msgid "workspace.libraries.no-shared-libraries-available"
msgstr "No hay bibliotecas compartidas disponibles"
#: src/app/main/ui/workspace/libraries.cljs:297
msgid "workspace.libraries.more-templates"
msgstr "Puedes buscar "
#: src/app/main/ui/workspace/libraries.cljs:297
msgid "workspace.libraries.more-templates-link"
msgstr "más plantillas aquí"
#: src/app/main/ui/workspace/libraries.cljs:260
msgid "workspace.libraries.search-shared-libraries"
msgstr "Buscar bibliotecas compartidas"

View File

@@ -177,13 +177,27 @@ function build-exporter-bundle {
rm -rf $bundle_dir;
mv ./exporter/target $bundle_dir;
echo $version > $bundle_dir/version.txt
put-license-file $bundle_dir;
echo ">> bundle exporter end";
}
function build-docs-bundle {
echo ">> bundle docs start";
mkdir -p ./bundles
local version=$(print-current-version);
local bundle_dir="./bundles/docs";
build "docs";
rm -rf $bundle_dir;
mv ./docs/_dist $bundle_dir;
echo $version > $bundle_dir/version.txt;
put-license-file $bundle_dir;
echo ">> bundle docs end";
}
function build-docker-images {
rsync -avr --delete ./bundles/frontend/ ./docker/images/bundle-frontend/;
rsync -avr --delete ./bundles/backend/ ./docker/images/bundle-backend/;
@@ -204,12 +218,24 @@ function usage {
echo "Options:"
echo "- pull-devenv Pulls docker development oriented image"
echo "- build-devenv Build docker development oriented image"
echo "- build-devenv-local Build a local docker development oriented image"
echo "- create-devenv Create the development oriented docker compose service."
echo "- start-devenv Start the development oriented docker compose service."
echo "- stop-devenv Stops the development oriented docker compose service."
echo "- drop-devenv Remove the development oriented docker compose containers, volumes and clean images."
echo "- run-devenv Attaches to the running devenv container and starts development environment"
echo "- run-devenv-shell Attaches to the running devenv container and starts a bash shell."
echo "- log-devenv Show logs of the running devenv docker compose service."
echo ""
echo "- build-bundle Build all bundles (frontend, backend and exporter)."
echo "- build-frontend-bundle Build frontend bundle"
echo "- build-backend-bundle Build backend bundle."
echo "- build-exporter-bundle Build exporter bundle."
echo "- build-docs-bundle Build docs bundle."
echo ""
echo "- build-docker-images Build all docker images (frontend, backend and exporter)."
echo ""
echo "- version Show penpot's version."
}
case $1 in
@@ -276,6 +302,10 @@ case $1 in
build-exporter-bundle;
;;
build-docs-bundle)
build-docs-bundle;
;;
build-docker-images)
build-docker-images
;;