diff --git a/.gitignore b/.gitignore index 8069909902..ad4be629b8 100644 --- a/.gitignore +++ b/.gitignore @@ -74,5 +74,5 @@ node_modules /playwright-report/ /blob-report/ /playwright/.cache/ -/frontend/vendor/draft-js/.yarn/ -/frontend/vendor/hljs/.yarn \ No newline at end of file +/render-wasm/target/ +/**/.yarn/* diff --git a/CHANGES.md b/CHANGES.md index d150bddba1..a35458574e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -22,6 +22,24 @@ ### :bug: Bugs fixed +## 2.3.3 + +### :bug: Bugs fixed + +- Fix problem creating manual overlay interactions [Taiga #9146](https://tree.taiga.io/project/penpot/issue/9146) + +## 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 diff --git a/common/src/app/common/logic/shapes.cljc b/common/src/app/common/logic/shapes.cljc index 0e292847fd..24b89bc1ad 100644 --- a/common/src/app/common/logic/shapes.cljc +++ b/common/src/app/common/logic/shapes.cljc @@ -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]))) diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index e0cf0c8263..761456827f 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -679,8 +679,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] @@ -717,8 +717,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] @@ -747,8 +747,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] diff --git a/docs/technical-guide/getting-started.md b/docs/technical-guide/getting-started.md index 38071cc0fe..d8dbedf4a5 100644 --- a/docs/technical-guide/getting-started.md +++ b/docs/technical-guide/getting-started.md @@ -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 Helm 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 + +

+Skip this section if you already have Helm installed in your system. +

+ +You can install Helm by following the
official guide. +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 +`values.yml` +file itself, which you can use as a basis for creating your own settings. + +You can also consult the list of parameters on the +ArtifactHub page of the project. + + +### 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**: @@ -263,7 +399,7 @@ There are some other options, **NOT SUPPORTED BY PENPOT**: * Install with Podman instead of Docker. * Try the under development Penpot Desktop app. * Try a simple Kubernetes Deployment option penpot-kubernetes. -* Or try a fully manual installation if you have really special needs. For help, you can look at the [Architecture][2] section and the Docker configuration files. +* Or try a fully manual installation if you have a really specific use case.. For help, you can look at the [Architecture][2] section and the Docker configuration files. [1]: /technical-guide/configuration/ [2]: /technical-guide/developer/architecture diff --git a/frontend/src/app/main/data/modal.cljs b/frontend/src/app/main/data/modal.cljs index 1055014c28..8b88a813f2 100644 --- a/frontend/src/app/main/data/modal.cljs +++ b/frontend/src/app/main/data/modal.cljs @@ -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 diff --git a/frontend/src/app/main/data/workspace/interactions.cljs b/frontend/src/app/main/data/workspace/interactions.cljs index e8dfd12537..ef62306921 100644 --- a/frontend/src/app/main/data/workspace/interactions.cljs +++ b/frontend/src/app/main/data/workspace/interactions.cljs @@ -206,14 +206,16 @@ (watch [_ _ _] (let [interactions (ctsi/update-interaction (:interactions shape) index update-fn) interaction (nth interactions index)] - (rx/of (dwsh/update-shapes - [(:id shape)] - (fn [shape] - (assoc shape :interactions interactions)) - options) + (rx/of + (dwsh/update-shapes + [(:id shape)] + (fn [shape] + (-> shape + (update :interactions ctsi/update-interaction index update-fn))) + options) - (when (some? (:destination interaction)) - (dwsh/update-shapes [(:destination interaction)] cls/show-in-viewer options)))))))) + (when (some? (:destination interaction)) + (dwsh/update-shapes [(:destination interaction)] cls/show-in-viewer options)))))))) (defn remove-all-interactions-nav-to "Remove all interactions that navigate to the given frame."