Commit graph

1707 commits

Author SHA1 Message Date
dependabot[bot]
8885437671
Bump @babel/runtime from 7.26.0 to 7.27.0 in /frontend/email-builder
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 14:24:04 +00:00
Kailash Nadh
5477c169fd
Merge pull request #2373 from knadh/feat-visual-editor
This is a mega patch with a massive number of significant, complex
changes integrating the visual, drag-and-drop block editor library,
email-builder: https://github.com/usewaypoint/email-builder-js

It adds a new template type (`visual`) to templates and integrates the editor
UI in Admin -> Templates and Admin -> Campaigns UIs. There are changes to
templates and campaign APIs, UI flows, and database table schemas.

`email-builder` is written in TypeScript and React (eww) and is a massive lib,
(2.3MB minified+gzipped), bigger than all of listmonk's own JS and other deps
combined, but alas, there is no other viable editor and it has been a popular
demand for a long time.

So, `email-builder` is built separately, and the static assets are copied along
with listmonk's assets. Since it's basically a separate "app" altogether,
it's loaded as an iframe on the editor pages, outside of the Vue app.

The visual editor integration is courtesy of @vividvilla who did all the
R&D and trial and error and sent the original PR to make this possible.

I really loathe the Javascript ecosystem. Sigh.
2025-04-21 18:43:55 +05:30
Kailash Nadh
ed700d7a33 Add a Preview option to the campaign archive tab. Closes #2245. 2025-04-21 18:17:46 +05:30
Kailash Nadh
b67fc5ea24 Replace CodeFlask code editor with CodeMirror on the UI.
Unfortunately, the tiny CodeFlask lib stopped getting updates 5+ years ago and
is buggy. The attempt to replace it with CodeInput (which itself seems to have
several open bugs) failed.

So, biting the bullet with CodeMirror, which is a robust, battle tested, albeit
large (~300KB) code editor library.

This patch replaces all code editor UIs (Campaign, Templates, Settings) with
CodeMirror.
2025-04-20 20:48:51 +05:30
Kailash Nadh
53d79297ca Prepare first RC. 2025-04-20 20:48:51 +05:30
Kailash Nadh
ffbda019e4 Add sample visual campaign template on install and upgrade. 2025-04-20 20:48:51 +05:30
Kailash Nadh
445d7e53a4 Fix clone campaign by fetching campaign body on clone. 2025-04-20 20:48:51 +05:30
Kailash Nadh
1559c55aff Add visual editor Cypress tests. 2025-04-20 20:48:51 +05:30
Kailash Nadh
ded0fcfae2 Fix broken visual template cloning on the templates UI. 2025-04-20 20:48:51 +05:30
Kailash Nadh
dcdef8ea38 Add format/content type selection to campaign creation UI. 2025-04-20 20:48:51 +05:30
Kailash Nadh
d3da0be629 Fix `test campaign' sending wrong template for visual campaigns. 2025-04-20 20:48:51 +05:30
Kailash Nadh
5207dff733 Fix visual editor change event/init/import sequences. 2025-04-20 20:48:51 +05:30
Kailash Nadh
968b366b43 Stop fetching bodies for all campaigns and explicitly fetch for visual campaign import. 2025-04-20 20:48:51 +05:30
Kailash Nadh
20e4b100ca Fix DB state issues in visual campaign cloning. 2025-04-20 20:48:51 +05:30
Kailash Nadh
f4c0e66adb Refactor 'media upload' integration in campaign visual editor. 2025-04-20 20:48:51 +05:30
Kailash Nadh
3aba2b00b4 Fix frontend/email-builder Makefile build steps. 2025-04-20 20:48:51 +05:30
Kailash Nadh
343d405b0f Add Ctrl+S campaign save shortcut and add Ctrl+S and F9 to richtext editor. 2025-04-20 20:48:51 +05:30
Kailash Nadh
e4e735e0cd Update tsx formatting in email-builder. 2025-04-20 20:48:51 +05:30
Kailash Nadh
503e98551c Add support for converting all types to visual editor blocks. 2025-04-20 20:48:51 +05:30
Kailash Nadh
f1fbadf6a6 Fix incorrect template states in DB in campaign creation and broken preview. 2025-04-20 20:48:51 +05:30
Kailash Nadh
cee2589a8e Move email-builder src from / to /frontend. 2025-04-20 20:48:51 +05:30
Kailash Nadh
110345d659 Refactor and simplify state management in campaign editor.
- Simplify and fix content conversion between formats.
- Fix state management issues.
- Rename `Apply` to `Import` on the visual template UI.
2025-04-20 20:48:51 +05:30
Kailash Nadh
fca5ec5abe Change visual editor UI language. 2025-04-20 20:48:51 +05:30
Kailash Nadh
7786b18473 Add DB migrations for visual editor. 2025-04-20 20:48:51 +05:30
Kailash Nadh
c1f81cfadd Fix compatibility issues with master.
- Fix merge conflicts.
- Simply logic in campaign preview handler.
- Remove redundant `GetCampaignForPreviewWithTemplate()` and switch to the old
  query that optionally takes a template.
- Fix Vue linting issues.
2025-04-20 20:48:51 +05:30
Vivek R
82e2b705bd fix: Move visual-editor to iframe so that CSS styles are isolated. 2025-04-20 20:48:51 +05:30
Vivek R
4a524c9332 feat: Integrate media selector to visual editor and add minor fixes.
- Disable visual templates from being made default.
- Refactor visual template selection flow in campaigns.
- Hide scroll if templates modal is active. This is to make sure it doesn't
  flicker when adding blocks in visual-editor.
2025-04-20 20:48:51 +05:30
Vivek R
e6f08a052c feat: Inject email-builder instead of loading it as ES module
- Add email-builder source
- Update yarn lock
2025-04-20 20:48:51 +05:30
Vivek R
ae98280858 feat: Integrate email-builder on campaign/template editor UI and backend. 2025-04-20 20:48:51 +05:30
Kailash Nadh
5a0980e55e Add on-hover one-click Copy button to subscribers and campaigns tables UI. 2025-04-20 20:48:41 +05:30
Fabian Schneebauer
a85e467cd9
Add missing charset for numbers in TrackLink regex. (#2404)
Co-authored-by: Fabian Schneebauer <fabian@fs-it.org>
2025-04-19 11:15:44 +05:30
Kailash Nadh
fb527008d7 Remove GET /api/settings dependency on the Lists -> Forms UI. 2025-04-18 23:44:08 +05:30
Kailash Nadh
b44ea0c336 Merge branch 'fix-sql-search' 2025-04-18 15:33:41 +05:30
Kailash Nadh
75aad8ec88 Add new search param to paginated API response structure. 2025-04-18 15:33:10 +05:30
Kailash Nadh
29591c188a Add get list permission check to bulk subscriber list management. 2025-04-18 15:30:28 +05:30
dependabot[bot]
fca8d6de25
Bump vite from 5.4.17 to 5.4.18 in /frontend (#2416)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.17 to 5.4.18.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.18/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.18/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.18
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-18 15:19:33 +05:30
Kailash Nadh
4b805f885b Fix broken subscribers:sql_query permission.
This permission was never checked for and had an unintended consequence of
allowing a non-superadmin user to execute arbitrary queries (expected), but
getting a superadmin session by joining the `sessions` table.

This patch:
- Introduces a table allowlist that uses the Postgres query plan (JSON)
  and validate the referenced tables against the allowed ones on arbitrary
  queries issued to the various `/subscribers` APIs.
- Explicitly adds the missing `subscribers:sql_query` permission check to all
  handlers that accept `query`.
- Introduces a new `search` parameter on all handlers that accept `query`.
  This parameter is an interface over the default name/email substring search
  instead of relying on `query`.
2025-04-18 14:15:47 +05:30
dependabot[bot]
375e385666
Bump golang.org/x/net from 0.36.0 to 0.38.0 (#2413)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.36.0 to 0.38.0.
- [Commits](https://github.com/golang/net/compare/v0.36.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.38.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-18 14:01:03 +05:30
Carson Yang
4d8c8cdedd
Update installation.md (#2405) 2025-04-15 15:18:50 +05:30
Pierre Neillo
5971bc4a5c
Fix Raw CSV example on import UI (#2392)
Signed-off-by: Pierre Neillo <pierre.neillo@free.fr>
2025-04-14 13:08:14 +05:30
Kailash Nadh
562e52cd22 Introduce LISTMONK_ADMIN_API_USER to --install. Closes #2314, #2322.
- During install, listmonk now accepts the env `LISTMONK_ADMIN_API_USER`
  and creates an API user (with username $LISTMONK_ADMIN_API_USER)
  with full superadmin permissions. This requires LISTMONK_ADMIN_USER and
  LISTMONK_ADMIN_API_PASSWORD to be set so that that there's always a superadmin
  user to avoid bad states, mainly: bot superadmin exists, but no admin user
  exists, leaving the installation perpetually open with the superadmin user
  creation UI on the first login.
  The API user's token is printed to stderr in the following format:
  `export LISTMONK_ADMIN_API_TOKEN="7I81VSd90UWhKDj5Kq9c6YopToRduyDF"`
  This can be redirected to a file with ./listmonk 2> /tmp/token or captured
  directly and then source()'d.
- Add new function `core.GetRole(id)`.
- Fix `at least one super admin` query in user deletion.
2025-04-10 13:06:04 +05:30
dependabot[bot]
b3e6b09929
Bump vite from 5.4.15 to 5.4.17 in /frontend (#2391)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.15 to 5.4.17.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.17/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.17/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.17
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-06 15:33:41 +05:30
Kailash Nadh
0826f401b7 Remove repetitive URL param :id validation and simplify handlers.
This patch significantly cleans up clunky, repetitive, and pervasive
validation logic across HTTP handlers.

- Rather than dozens of handlers checking and using strconv to validate ID,
  the handlers with `:id` are now wrapped in a `hasID()` middleware that does
  the validation and sets an int `id` in the handler context that the wrapped
  handlers can now access with `getID()`.

- Handlers that handled both single + multi resource requests
  (eg: GET `/api/lists`) with single/multiple id checking conditions are all now
  split into separate handlers, eg: `getList()`, `getLists()`.
2025-04-06 14:01:21 +05:30
Kailash Nadh
e6d3aad0a1 Add ability to wait and healthcheck for backend app in Cypress settings tests. 2025-04-06 13:40:44 +05:30
Kailash Nadh
78366ab7e4 Clean up main initialization to remove app interdepencies in init.
`App{}` now is used purely as a container for HTTP handlers.
2025-04-06 00:28:35 +05:30
Kailash Nadh
88489223c9 Remove superfluous consts dep in init functions by separating URL consts. 2025-04-05 23:39:08 +05:30
Kailash Nadh
e2f24a140e Turn notifs into a special stateful global singleton package, removing clunky deps. 2025-04-05 22:45:19 +05:30
Kailash Nadh
e327ebbbdf Move all HTTP handlers directly to App and remove the redundant in-between layer. 2025-04-05 19:24:25 +05:30
Kailash Nadh
b3d46a8c85 Refactor system notification callbacks into a new notifs package. 2025-04-05 19:07:06 +05:30
Kailash Nadh
00c858fc49 Refactor all HTTP handlers and attach them to a single struct.
- Attach all HTTP handlers to a new `Handlers{}` struct.
- Remove all `handle*` function prefixes.
- Remove awkward, repetitive `app = c.Get("app").(*App)` from all handlers
  and instead, simply access it from `h.app` from `Handlers{}`

Originally proposed in #2292.
2025-04-05 15:42:35 +05:30