Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
f28c11d
wip
jnptk Mar 23, 2026
04a0f9b
first working
jnptk Mar 30, 2026
5fdf327
make format
jnptk Mar 30, 2026
5f48385
add endpoint to get KeywordIndex indexes
jnptk Mar 30, 2026
ef8cfa3
add pagination
jnptk Mar 31, 2026
a7b577f
missing things for choosing the index thats queried
jnptk Mar 31, 2026
28bd1a5
rename endpoint to [at]keywords
jnptk Apr 1, 2026
f264a46
make endpoint only available for site root
jnptk Apr 1, 2026
a9d8fcf
add manage keywords permission
jnptk Apr 1, 2026
2c358b3
rename action path
jnptk Apr 1, 2026
a32eef3
request data validation
jnptk Apr 1, 2026
e390427
add tests for keywords service get & fix get methods reply
jnptk Apr 8, 2026
d15d190
more tests
jnptk Apr 8, 2026
23e095d
fix query building in get method
jnptk Apr 9, 2026
52fbd94
even more tests
jnptk Apr 9, 2026
04e1092
different fixes & styling
jnptk Apr 13, 2026
49ea914
prepare for to make endpoint traversable + fixes & styling
jnptk Apr 13, 2026
532b9b9
make endpoint traverseable
jnptk Apr 13, 2026
e4d3307
make format
jnptk Apr 13, 2026
8adddf7
fix typo in function import
jnptk Apr 13, 2026
f17560d
various styling fixes
jnptk Apr 14, 2026
d1bb2fd
rework single keyword view to use search endpoint
jnptk Apr 14, 2026
97d943f
fix cursor for buttons outside the table
jnptk Apr 14, 2026
58360fe
typing for km utility
jnptk Apr 14, 2026
dccb6db
implement sorting mechanisms & styling
jnptk Apr 16, 2026
886a0e5
fix tests
jnptk Apr 17, 2026
0d41438
don't return sorted keywords
jnptk Apr 17, 2026
8dcc3dc
support custom KeywordIndexes & more improvements
jnptk Apr 21, 2026
66717a3
remove shadow from buttons
jnptk Apr 21, 2026
99e5130
update confirm modal
jnptk Apr 21, 2026
3c79c07
move modals out of KeywordManager.tsx & more
jnptk Apr 22, 2026
8427764
reuse DeleteModal component
jnptk Apr 23, 2026
ffe68ff
Fix babel.config.js, extract i18n
davisagli Apr 23, 2026
efb3e5a
Run make format
davisagli Apr 23, 2026
ca97f10
Fix storybook config
davisagli Apr 23, 2026
0dd894d
fix typos
jnptk Apr 24, 2026
274e1cd
remove unicode fallback for python 2
jnptk Apr 24, 2026
4f07d0b
remove fallback for archetypes
jnptk Apr 24, 2026
abc1d54
update permission name in config
jnptk Apr 24, 2026
ab4227f
pagination & styling for keyword view
jnptk Apr 24, 2026
5b0910f
add option to filter by type
jnptk Apr 24, 2026
df09bdb
add filtering options in keyword view
jnptk Apr 28, 2026
bf7a769
make keyword view aware of the index a keyword is from
jnptk Apr 29, 2026
3656bb9
update to volto 19.0.0-alpha.33
jnptk May 8, 2026
7e865fe
styling + a bunch of fixes
jnptk May 8, 2026
f07af32
don't reload the entire page when sorting
jnptk May 26, 2026
6655f3e
hide choice of keyword index if there is only one
jnptk May 26, 2026
b6ece78
update locales
jnptk May 27, 2026
4eeaeba
show text if no search results
jnptk May 27, 2026
96a980b
naming
jnptk May 27, 2026
047aaad
remove action column, show delete button on the keyword pills
jnptk May 27, 2026
53ddc84
dynamically get index field from object
jnptk May 27, 2026
ee1d71a
make delete endpoint context aware
jnptk May 29, 2026
65baed6
fix keyword deletion in individual keyword view
jnptk May 29, 2026
2c9f56a
update scaffold, fix missing ts type declarations
jnptk May 29, 2026
f45579c
fix type declarations for react-toastify
jnptk May 29, 2026
048d9f8
fix selected row hover
jnptk May 29, 2026
5b547dd
truncate keyword pills with show more button
jnptk Jun 1, 2026
2039e64
update keyword manager description
jnptk Jun 1, 2026
dd73947
remove unused import
jnptk Jun 1, 2026
18641e1
add loading indicator while bulk keyword changes are being processed
jnptk Jun 1, 2026
ce731d7
align show more button with keyword pills
jnptk Jun 1, 2026
91f6f58
display path & title on separate lines in keyword view
jnptk Jun 1, 2026
f27645d
fix bulk delete doing nothing in keyword view
jnptk Jun 1, 2026
394b486
locales
jnptk Jun 1, 2026
fd7375e
make format
jnptk Jun 1, 2026
41a1c8e
remove direct dependency of react-aria-components
jnptk Jun 2, 2026
1434903
use Table component from react-aria-components (from 'catalog:') & so…
jnptk Jun 5, 2026
9c43d80
few fixes
jnptk Jun 5, 2026
68321d7
show toast after successful/failed actions
jnptk Jun 8, 2026
b7fd33c
rename & merge: use "edit" (pencil) icon instead
jnptk Jun 8, 2026
bff5a0b
fix sorting icon in table header
jnptk Jun 8, 2026
8313f42
style table heading
jnptk Jun 9, 2026
36d7ac1
refactor toasts, add toasts for individual keyword view
jnptk Jun 9, 2026
e0e1dca
remove pagination from keywords view
jnptk Jun 10, 2026
7df21b7
add a11y complient pagination component
jnptk Jun 11, 2026
67d3fa1
refactor table in individual keyword view
jnptk Jun 12, 2026
5a3311a
improvement to the styles
jnptk Jun 15, 2026
c0fd064
border styles
jnptk Jun 15, 2026
34e5b26
remove unused import
jnptk Jun 15, 2026
8d19830
consistent placeholder styling
jnptk Jun 16, 2026
aaa0940
fix table inner text alignment
jnptk Jun 16, 2026
dcf79f0
fix filter button
jnptk Jun 16, 2026
e836c54
remove unused import
jnptk Jun 16, 2026
26a793d
fix services tests
jnptk Jun 16, 2026
282cc3d
add changelog entries
jnptk Jun 16, 2026
5ca5d10
fix keyword index selection
jnptk Jun 23, 2026
3d6ff19
fix search button in individual keyword view
jnptk Jun 23, 2026
5735836
fix multi-select fields in individual keyword view not showing select…
jnptk Jun 23, 2026
82e9a9b
add confimation dialog to single keyword delete button
jnptk Jun 25, 2026
1793f79
more specific texts for rename modal if only one keyword is selected
jnptk Jun 25, 2026
9d82358
improve toast messages & add translations
jnptk Jun 26, 2026
5c8389d
add VLT as dev dependency
jnptk Jun 29, 2026
0e243af
move to scss
jnptk Jun 29, 2026
19983df
fix text wrap with ellipsis in individual keyword filters
jnptk Jun 29, 2026
8b24684
fix color of trash icon in rows
jnptk Jun 29, 2026
e85c028
improve a11y
jnptk Jun 30, 2026
d0e16dd
make format
jnptk Jun 30, 2026
96ccd53
remove box-shadow on buttons
jnptk Jun 30, 2026
8f219c1
fix cursor not pointing in row delete
jnptk Jun 30, 2026
5df2a56
use custom Select to fix popover position in rename modal
jnptk Jun 30, 2026
505b31b
fix overflowing select values
jnptk Jul 17, 2026
0bd4b10
replace temp popover fix with upstream fix
jnptk Jul 17, 2026
38e381f
fix sorting icons
jnptk Jul 17, 2026
e7d5e3f
fix keyword deletion
jnptk Jul 17, 2026
db58601
fix keyword deletion from single item (via pills)
jnptk Jul 20, 2026
adeb3a9
move KeywordList component
jnptk Jul 20, 2026
f1578ba
update error message
jnptk Jul 20, 2026
fb7744e
update README.md
jnptk Jul 20, 2026
4090f00
update README.md
jnptk Jul 21, 2026
62903d6
remove docs workflow
jnptk Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions .github/workflows/docs.yml

This file was deleted.

7 changes: 0 additions & 7 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,6 @@ jobs:
permissions:
contents: read
packages: write
docs:
uses: ./.github/workflows/docs.yml
needs:
- config
with:
python-version: ${{ needs.config.outputs.python-version }}
if: ${{ needs.config.outputs.docs == 'true' }}

frontend:
uses: ./.github/workflows/frontend.yml
Expand Down
159 changes: 159 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# Contributing

Contributions are welcome!

## Quick Start 🏁

### Prerequisites ✅

- An [operating system](https://6.docs.plone.org/install/create-project-cookieplone.html#prerequisites-for-installation) that runs all the requirements mentioned.
- [uv](https://6.docs.plone.org/install/create-project-cookieplone.html#uv)
- [nvm](https://6.docs.plone.org/install/create-project-cookieplone.html#nvm)
- [Node.js and pnpm](https://6.docs.plone.org/install/create-project.html#node-js) 24
- [Make](https://6.docs.plone.org/install/create-project-cookieplone.html#make)
- [Git](https://6.docs.plone.org/install/create-project-cookieplone.html#git)
- [Docker](https://docs.docker.com/get-started/get-docker/) (optional)

### Installation 🔧

1. Clone this repository, then change your working directory.

```shell
git clone git@github.com:kitconcept/kitconcept-keywordmanager.git
cd kitconcept-keywordmanager
```

2. Install this code base.

```shell
make install
```

### Fire Up the Servers 🔥

1. Create a new Plone site on your first run.

```shell
make backend-create-site
```

2. Start the backend at http://localhost:8080/.

```shell
make backend-start
```

3. In a new shell session, start the frontend at http://localhost:3000/.

```shell
make frontend-start
```

Voila! Your Plone site should be live and kicking! 🎉

### Local Stack Deployment 📦

Deploy a local Docker Compose environment that includes the following.

- Docker images for Backend and Frontend 🖼️
- A stack with a Traefik router and a PostgreSQL database 🗃️
- Accessible at [http://kitconcept-keywordmanager.localhost](http://kitconcept-keywordmanager.localhost) 🌐

Run the following commands in a shell session.

```shell
make stack-create-site
make stack-start
```

And... you're all set! Your Plone site is up and running locally! 🚀

## Project structure 🏗️

This monorepo consists of the following distinct sections:

- **backend**: Houses the API and Plone installation, utilizing pip instead of buildout, and includes a policy package named kitconcept.keywordmanager.
- **frontend**: Contains the React (Volto) package.
- **devops**: Encompasses Docker stack, Ansible playbooks, and cache settings.
- **docs**: Scaffold for writing documentation for your project.

### Why this structure? 🤔

- All necessary codebases to run the site are contained within the repository (excluding existing add-ons for Plone and React).
- Specific GitHub Workflows are triggered based on changes in each codebase (refer to .github/workflows).
- Simplifies the creation of Docker images for each codebase.
- Demonstrates Plone installation/setup without buildout.

## Code quality assurance 🧐

To check your code against quality standards, run the following shell command.

```shell
make check
```

### Format the codebase

To format and rewrite the code base, ensuring it adheres to quality standards, run the following shell command.

```shell
make format
```

| Section | Tool | Description | Configuration |
| -------- | --------- | --------------------------------------- | ---------------------------------------------------- |
| backend | Ruff | Python code formatting, imports sorting | [`backend/pyproject.toml`](./backend/pyproject.toml) |
| backend | `zpretty` | XML and ZCML formatting | -- |
| frontend | ESLint | Fixes most common frontend issues | [`frontend/.eslintrc.js`](.frontend/.eslintrc.js) |
| frontend | prettier | Format JS and Typescript code | [`frontend/.prettierrc`](.frontend/.prettierrc) |
| frontend | Stylelint | Format Styles (css, less, sass) | [`frontend/.stylelintrc`](.frontend/.stylelintrc) |

Formatters can also be run within the `backend` or `frontend` folders.

### Linting the codebase

or `lint`:

```shell
make lint
```

| Section | Tool | Description | Configuration |
| -------- | --------------------- | ----------------------------------------- | ---------------------------------------------------- |
| backend | Ruff | Checks code formatting, imports sorting | [`backend/pyproject.toml`](./backend/pyproject.toml) |
| backend | Pyroma | Checks Python package metadata | -- |
| backend | check-python-versions | Checks Python version information | -- |
| backend | `zpretty` | Checks XML and ZCML formatting | -- |
| frontend | ESLint | Checks JS / Typescript lint | [`frontend/.eslintrc.js`](.frontend/.eslintrc.js) |
| frontend | prettier | Check JS / Typescript formatting | [`frontend/.prettierrc`](.frontend/.prettierrc) |
| frontend | Stylelint | Check Styles (css, less, sass) formatting | [`frontend/.stylelintrc`](.frontend/.stylelintrc) |

Linters can be run individually within the `backend` or `frontend` folders.

## Internationalization 🌐

Generate translation files for Plone and Volto with ease:

```shell
make i18n
```

## Credits and acknowledgements 🙏

This add-on is based on code from Products.PloneKeywordManager, adapted and extended for Plone 6 & Volto.

### Origins of PloneKeywordManager

PloneKeywordManager was originally written by Maik Jablonski at the Plone Paderborn Sprint in September 2003, an event funded by the Bertelsmann Foundation. Alexander Limi of Plone Solutions contributed the initial user interface updates and setup code, and Joe Geldart of Netalley Networks later brought the templates up to the Plone 2.0 format. Maik Jablonski subsequently donated the code to the Collective, allowing the community to maintain and extend it going forward.

Since then, the package has been maintained and updated through successive Plone releases by numerous contributors within the Plone Collective. The full list of contributors is available on [GitHub](https://github.com/collective/Products.PloneKeywordManager/graphs/contributors/).

### This add-on

Building on that foundation, this package was created by the kitconcept GmbH to bring keyword management Volto.

### Long-term goal: bringing keyword management into Plone core

There is an ongoing effort to bring keyword-management functionality into Plone core itself, tracked as PLIP: Keyword Manager. This add-on is intended as a step toward that goal — a working, up-to-date implementation that can inform (and hopefully eventually be folded into) that core integration. Getting there will require several steps: stabilizing the add-on for Plone 6, gathering community feedback, aligning with the Volto/core UI patterns, and going through the PLIP review process. Contributions and feedback toward that end are welcome.

Thanks to Maik Jablonski and everyone who has contributed to Products.PloneKeywordManager over the years for the original work this builds on.
12 changes: 6 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -207,12 +207,12 @@ acceptance-test:
.PHONY: acceptance-frontend-image-build
acceptance-frontend-image-build:
@echo "Build acceptance frontend image"
@docker build frontend -t $(IMAGE_NAME_PREFIX)-frontend:acceptance -f frontend/Dockerfile --build-arg VOLTO_VERSION=$(VOLTO_VERSION)
@docker build frontend -t $(IMAGE_NAME_PREFIX)frontend:acceptance -f frontend/Dockerfile --build-arg VOLTO_VERSION=$(VOLTO_VERSION)

.PHONY: acceptance-backend-image-build
acceptance-backend-image-build:
@echo "Build acceptance backend image"
@docker build backend -t $(IMAGE_NAME_PREFIX)-backend:acceptance -f backend/Dockerfile.acceptance --build-arg PLONE_VERSION=$(PLONE_VERSION)
@docker build backend -t $(IMAGE_NAME_PREFIX)backend:acceptance -f backend/Dockerfile.acceptance --build-arg PLONE_VERSION=$(PLONE_VERSION)

.PHONY: acceptance-images-build
acceptance-images-build: ## Build Acceptance frontend/backend images
Expand All @@ -222,12 +222,12 @@ acceptance-images-build: ## Build Acceptance frontend/backend images
.PHONY: acceptance-frontend-container-start
acceptance-frontend-container-start:
@echo "Start acceptance frontend"
@docker run --rm -p 3000:3000 --name $(IMAGE_NAME_PREFIX)-frontend-acceptance --link $(IMAGE_NAME_PREFIX)-backend-acceptance:backend -e RAZZLE_API_PATH=http://localhost:55001/plone -e RAZZLE_INTERNAL_API_PATH=http://backend:55001/plone -d $(IMAGE_NAME_PREFIX)-frontend:acceptance
@docker run --rm -p 3000:3000 --name $(IMAGE_NAME_PREFIX)frontend-acceptance --link $(IMAGE_NAME_PREFIX)backend-acceptance:backend -e RAZZLE_API_PATH=http://localhost:55001/plone -e RAZZLE_INTERNAL_API_PATH=http://backend:55001/plone -d $(IMAGE_NAME_PREFIX)frontend:acceptance

.PHONY: acceptance-backend-container-start
acceptance-backend-container-start:
@echo "Start acceptance backend"
@docker run --rm -p 55001:55001 --name $(IMAGE_NAME_PREFIX)-backend-acceptance -d $(IMAGE_NAME_PREFIX)-backend:acceptance
@docker run --rm -p 55001:55001 --name $(IMAGE_NAME_PREFIX)backend-acceptance -d $(IMAGE_NAME_PREFIX)backend:acceptance

.PHONY: acceptance-containers-start
acceptance-containers-start: ## Start Acceptance containers
Expand All @@ -237,8 +237,8 @@ acceptance-containers-start: ## Start Acceptance containers
.PHONY: acceptance-containers-stop
acceptance-containers-stop: ## Stop Acceptance containers
@echo "Stop acceptance containers"
@docker stop $(IMAGE_NAME_PREFIX)-frontend-acceptance
@docker stop $(IMAGE_NAME_PREFIX)-backend-acceptance
@docker stop $(IMAGE_NAME_PREFIX)frontend-acceptance
@docker stop $(IMAGE_NAME_PREFIX)backend-acceptance

.PHONY: ci-acceptance-test
ci-acceptance-test:
Expand Down
Loading
Loading