Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
7fdec22
feat(tickets): implement createTicket method
lukasz-hycom Jan 14, 2026
11a0a79
feat(tickets): add support for ticket attachments in ZendeskTicketSer…
lukasz-hycom Jan 16, 2026
a373092
feat(tickets): add priority and type fields to PostTicketBody
lukasz-hycom Jan 16, 2026
63a3632
Merge branch 'main' of https://github.com/o2sdev/openselfservice into…
lukasz-hycom Jan 16, 2026
f6136af
refactor(ProductDetails, RecommendedProducts): fixing linter warnings
lukasz-hycom Jan 16, 2026
3c74660
feat(tickets): enforce ZENDESK_TOPIC_FIELD_ID requirement and improve…
lukasz-hycom Jan 16, 2026
e0dcebc
refactor(tickets): update types in PostTicketBody and update uploadAt…
lukasz-hycom Jan 16, 2026
ddd3f2e
refactor(tickets): improve error handling in ZendeskTicketService by …
lukasz-hycom Jan 16, 2026
aafa372
feat(tickets): add create ticket functionality and corresponding page…
lukasz-hycom Jan 19, 2026
d5bae10
refactor(tickets): update attachment handling in ZendeskTicketService
lukasz-hycom Jan 20, 2026
b26bbf0
feat(deps): add @types/multer dependency
lukasz-hycom Jan 21, 2026
3345a27
refactor(tickets): change content type in TicketAttachmentInput from …
lukasz-hycom Jan 21, 2026
023c478
feat(surveyjs): implement unified survey submission handling for JSON…
lukasz-hycom Jan 21, 2026
e229c02
Merge branch 'main' of https://github.com/o2sdev/openselfservice into…
lukasz-hycom Jan 21, 2026
5d43c6a
chore(deps): update package versions in package-lock.json
lukasz-hycom Jan 21, 2026
140650d
fix(surveyjs): ensure tickets service is always provided in SurveyjsM…
lukasz-hycom Jan 21, 2026
18506a9
feat(cms): add mappings for create ticket form pages in multiple locales
lukasz-hycom Jan 21, 2026
23dbf1e
Merge branch 'feature/creating-zendesk-tickets' of https://github.com…
lukasz-hycom Jan 21, 2026
7803964
feat(cms): extend page mappings to include create ticket pages for ad…
lukasz-hycom Jan 21, 2026
d428fdd
feat(surveyjs): add validation for required fields in ticket creation
lukasz-hycom Jan 21, 2026
05fdbb4
refactor(surveyjs): simplify survey submission by removing multipart …
lukasz-hycom Jan 21, 2026
490c770
feat(tickets): update ticket creation to use ticketFormId and customF…
lukasz-hycom Jan 22, 2026
eab0016
refactor(surveyjs): remove unused create ticket page mocks
lukasz-hycom Jan 23, 2026
f546490
feat(zendesk): enhance field mapping
lukasz-hycom Jan 24, 2026
8464a4c
feat(zendesk): add additional Zendesk fields and update survey submis…
lukasz-hycom Jan 26, 2026
11ffa81
Merge branch 'main' of https://github.com/o2sdev/openselfservice into…
lukasz-hycom Jan 26, 2026
7dd3363
docs(zendesk): updated custom fields mapping documentation
lukasz-hycom Jan 27, 2026
b9a0a84
feat(zendesk): add Zendesk form IDs to turbo config files
lukasz-hycom Jan 27, 2026
2e75c7a
docs(zendesk): update ticket documentation
lukasz-hycom Jan 27, 2026
2389087
refactor(ticket-details): make ticket type optional and improve mappi…
lukasz-hycom Jan 27, 2026
302cec0
refactor(tickets): make ticket type optional in the Ticket model
lukasz-hycom Jan 27, 2026
aa7d8de
refactor(ticket-details): update ticket properties and field mappings
lukasz-hycom Jan 27, 2026
52e381f
feat(zendesk): add method to retrieve field key by Zendesk field ID f…
lukasz-hycom Jan 27, 2026
fba71f4
feat(zendesk): enhance topic mapping logic based on ticket form IDs
lukasz-hycom Jan 27, 2026
6d09572
feat(zendesk): improved zendesk-ticket mapper
lukasz-hycom Jan 27, 2026
a72a013
feat(ticket-details): enhance ticket mapping with new field mappings …
lukasz-hycom Jan 27, 2026
c9a7275
feat(ticket-list): add ticketId field to models and enhance UI with t…
lukasz-hycom Jan 27, 2026
69f440c
refactor(ticket-list): make ticket type optional and enhance mapping …
lukasz-hycom Jan 28, 2026
d928907
refactor(cms.fieldMapping): enhance field mapping return type to incl…
lukasz-hycom Jan 28, 2026
6bd7086
Merge branch 'main' of https://github.com/o2sdev/openselfservice into…
lukasz-hycom Jan 28, 2026
cfd9d36
fix(surveyjs.mapper): improve attachment mapping by filtering invalid…
lukasz-hycom Jan 28, 2026
9b3b572
refactor(zendesk-ticket.service): removed unnecessary conversion of t…
lukasz-hycom Jan 28, 2026
c7dad1a
fix(zendesk-ticket.mapper): ensure topic field is present and throw e…
lukasz-hycom Jan 28, 2026
5004678
feat: add changeset validation for framework/integrations/modules/blo…
marcinkrasowski Jan 28, 2026
fc99802
refactor(tickets): updated PostTicketBody class
lukasz-hycom Jan 28, 2026
af98385
Merge branch 'feature/adding-createTicket-form' of https://github.com…
lukasz-hycom Jan 28, 2026
25c7cb6
docs(zendesk.features): correct formatting for environment variables
lukasz-hycom Jan 28, 2026
b168499
fix(ticket-list): conditionally render ticket ID label based on avail…
lukasz-hycom Jan 28, 2026
26ce47a
fix(ticket-recent.mapper): update type field to be conditionally defined
lukasz-hycom Jan 28, 2026
42612b2
fix(ticket-list.mapper): update label for updatedAt field
lukasz-hycom Jan 28, 2026
d8b75c2
refactor(zendesk-field.mapper): convert class methods to standalone f…
lukasz-hycom Jan 28, 2026
ed7d564
feat(zendesk-field.mapper): add consent field handling and improve va…
lukasz-hycom Jan 28, 2026
2f80a73
feat(ticket-details.mapper): added cms mappers for consents
lukasz-hycom Jan 28, 2026
13ecd36
fix(zendesk-ticket.mapper): ensure correct identification of CONTACT_US
lukasz-hycom Jan 28, 2026
91c77c4
fix(zendesk-ticket.service): correct tag syntax in search query
lukasz-hycom Jan 28, 2026
e1d21c5
feat(tickets.request): allow status to accept multiple values as an a…
lukasz-hycom Jan 28, 2026
4092ffd
fix(survey.mapper): update submitDestination from 'tickets' to 'surve…
lukasz-hycom Jan 28, 2026
fb4e1e6
docs(tickets): updated zendesk, tickets and survey js documentation
lukasz-hycom Jan 28, 2026
d3e111a
chore: added changeset
lukasz-hycom Jan 29, 2026
988d9f1
Merge branch 'main' of https://github.com/o2sdev/openselfservice into…
lukasz-hycom Jan 29, 2026
e01d4f5
docs(tickets): clarify ticket creation requirements
lukasz-hycom Jan 29, 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
15 changes: 15 additions & 0 deletions .changeset/cuddly-teams-flash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
'@o2s/integrations.contentful-cms': minor
'@o2s/integrations.strapi-cms': minor
'@o2s/blocks.ticket-details': minor
'@o2s/blocks.ticket-recent': minor
'@o2s/integrations.zendesk': minor
'@o2s/integrations.mocked': minor
'@o2s/blocks.ticket-list': minor
'@o2s/modules.surveyjs': minor
'@o2s/api-harmonization': minor
'@o2s/framework': minor
'@o2s/docs': minor
---

Added ticket creation functionality to the Zendesk integration. Users can now create tickets via POST /tickets with attachments and custom fields. Added custom field mapping from Survey.js format to Zendesk custom fields via new zendesk-field.mapper. Updated table columns on TicketList component to display: ticket type (topic), status, and last updated date. Added display of custom field values from ticket properties on TicketDetails. Updated mapper mocks in cms
Comment thread
lukasz-hycom marked this conversation as resolved.
7 changes: 6 additions & 1 deletion .github/CI_CD_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,17 @@ graph TD
A[PR Opened/Synchronized] --> B[skip-duplicate-check]
B --> C[changed-packages]
B --> D[build]
C --> O{Requires Changeset?}
O -->|Yes| P[check-changeset]
O -->|No| I[End]
Comment on lines +14 to +16
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix Mermaid node ID collision.
O is already used later for “Deploy Storybook to Vercel Preview,” so this reuses the same node ID and can merge nodes unexpectedly in Mermaid. Rename the new node ID.

🛠️ Proposed fix
-    C --> O{Requires Changeset?}
-    O -->|Yes| P[check-changeset]
-    O -->|No| I[End]
+    C --> RC{Requires Changeset?}
+    RC -->|Yes| P[check-changeset]
+    RC -->|No| I[End]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
C --> O{Requires Changeset?}
O -->|Yes| P[check-changeset]
O -->|No| I[End]
C --> RC{Requires Changeset?}
RC -->|Yes| P[check-changeset]
RC -->|No| I[End]
🤖 Prompt for AI Agents
In @.github/CI_CD_README.md around lines 14 - 16, The Mermaid graph reuses node
ID "O", causing a collision with the later "Deploy Storybook to Vercel Preview"
node; rename this decision node and all its references (e.g., change O to
O_changeset or O1) in the snippet containing C --> O{Requires Changeset?}, O
-->|Yes| P[check-changeset], and O -->|No| I[End] so the decision node ID is
unique and consistent across all edges.

C --> E{docs package changed?}
C --> L{stories changed?}
D --> F[lint]
D --> G[test]
F --> H[deploy-docs-preview]
G --> H
E -->|Yes| H
E -->|No| I[End]
E -->|No| I
H --> J[Prepare Environment]
J --> K[Deploy Docs to Vercel Preview]

Expand Down Expand Up @@ -162,6 +165,7 @@ Runs code quality checks on PRs and deploys preview environments.

- `skip-duplicate-check`: Prevents duplicate workflow runs
- `changed-packages`: Determines which packages/stories changed
- `check-changeset`: Checks if a changeset exists when required packages are modified
- `build`: Builds the project
- `lint`: Lints the code
- `test`: Runs tests
Expand Down Expand Up @@ -205,6 +209,7 @@ Determines which packages have changed using Turborepo and detects Storybook cha

- `package_changed`: JSON string containing changed packages information
- `stories_changed`: `true` if any `*.stories.tsx` or `.storybook/` files changed
- `requires_changeset`: `true` if changes require a changeset (framework/integrations/modules/blocks)

### `deploy-vercel`

Expand Down
22 changes: 22 additions & 0 deletions .github/actions/changed-packages/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ outputs:
stories_changed:
description: 'True if any storybook files or config changed'
value: ${{ steps.storybook.outputs.stories_changed }}
requires_changeset:
description: 'True if changes require a changeset (framework/integrations/modules/blocks)'
value: ${{ steps.changeset-required.outputs.requires_changeset }}

runs:
using: 'composite'
Expand Down Expand Up @@ -69,3 +72,22 @@ runs:
echo "stories_changed=false" >> $GITHUB_OUTPUT
echo "No storybook changes detected."
fi

- name: Determine if changeset is required
id: changeset-required
shell: bash
env:
TURBO_REF_FILTER: ${{ inputs.event-name == 'pull_request' && inputs.base-sha || 'HEAD^' }}
run: |
# Check if changes involve framework, integrations, modules, or blocks
CHANGESET_REQUIRED_FILES=$(git diff --name-only $TURBO_REF_FILTER | grep -E "^packages/(framework|integrations|modules|blocks)/" || true)

if [ -n "$CHANGESET_REQUIRED_FILES" ]; then
echo "requires_changeset=true" >> $GITHUB_OUTPUT
echo "### Changes requiring changeset detected ###"
echo "$CHANGESET_REQUIRED_FILES"
echo "############################################"
else
echo "requires_changeset=false" >> $GITHUB_OUTPUT
echo "No changes requiring changeset detected."
fi
30 changes: 30 additions & 0 deletions .github/workflows/pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:
outputs:
package_changed: ${{ steps.determine-changes.outputs.package_changed }}
stories_changed: ${{ steps.determine-changes.outputs.stories_changed }}
requires_changeset: ${{ steps.determine-changes.outputs.requires_changeset }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
Expand All @@ -57,6 +58,35 @@ jobs:
base-sha: ${{ github.event.pull_request.base.sha }}
fetch-depth: '0'

check-changeset:
needs: [skip-duplicate-check, changed-packages]
if: |
needs.skip-duplicate-check.outputs.should_skip != 'true' &&
needs.changed-packages.outputs.requires_changeset == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Check for changeset
shell: bash
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
# Check if any .md file in .changeset (excluding README.md) has been modified/added in this PR
CHANGESET_DIFF=$(git diff --name-only $BASE_SHA | grep -E "^\.changeset/.*\.md$" | grep -v "README.md" || true)

if [ -z "$CHANGESET_DIFF" ]; then
echo "::error::No changeset found in this PR! You modified packages in framework, integrations, modules, or blocks."
echo "::error::Please run 'npm run changeset' to add a changeset describing your changes."
exit 1
else
echo "Changeset found in PR:"
echo "$CHANGESET_DIFF"
fi
Comment on lines +61 to +88
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Ensure changeset check ignores deletions.
git diff --name-only will include deleted changeset files, so a PR could delete an old changeset and still pass the gate.

🛠️ Proposed fix
-                  CHANGESET_DIFF=$(git diff --name-only $BASE_SHA | grep -E "^\.changeset/.*\.md$" | grep -v "README.md" || true)
+                  CHANGESET_DIFF=$(git diff --name-only --diff-filter=AMR $BASE_SHA | grep -E "^\.changeset/.*\.md$" | grep -v "README.md" || true)
🤖 Prompt for AI Agents
In @.github/workflows/pull-request.yaml around lines 61 - 88, The current
check-changeset step may count deleted .changeset/*.md files because
CHANGESET_DIFF uses git diff --name-only; update the logic so CHANGESET_DIFF
only includes added/modified/copied files (exclude deletions) by adding a
diff-filter (e.g., use --diff-filter=ACM or equivalent) to the git diff
invocation in the check-changeset job that sets CHANGESET_DIFF (keep using
BASE_SHA and the same grep filter), so deleted changesets no longer satisfy the
check.


build:
needs: skip-duplicate-check
if: needs.skip-duplicate-check.outputs.should_skip != 'true'
Expand Down
3 changes: 2 additions & 1 deletion apps/api-harmonization/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"@types/express": "^5.0.6",
"@types/jest": "^30.0.0",
"@types/jsonwebtoken": "^9.0.10",
"@types/multer": "^2.0.0",
"@types/node": "^24.10.9",
"@types/string-template": "^1.0.7",
"@types/supertest": "^6.0.3",
Expand All @@ -123,4 +124,4 @@
"tsconfig-paths": "^4.2.0",
"typescript": "^5.9.3"
}
}
}
30 changes: 28 additions & 2 deletions apps/api-harmonization/turbo.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,34 @@
"CF_PREVIEW_TOKEN",
"CF_SPACE_ID",
"CF_ENV",
"CF_MANAGEMENT_TOKEN"
"CF_MANAGEMENT_TOKEN",
"ZENDESK_API_URL",
"ZENDESK_API_TOKEN",
"ZENDESK_CONTACT_FORM_ID",
"ZENDESK_COMPLAINT_FORM_ID",
"ZENDESK_REQUEST_DEVICE_MAINTENANCE_FORM_ID",
"ZENDESK_TOPIC_FIELD_ID",
"ZENDESK_DEVICE_NAME_FIELD_ID",
"ZENDESK_SERIAL_NUMBER_FIELD_ID",
"ZENDESK_MAINTENANCE_TYPE_FIELD_ID",
"ZENDESK_MAINTENANCE_PREFERRED_DATE_FIELD_ID",
"ZENDESK_ADDITIONAL_NOTES_FIELD_ID",
"ZENDESK_CONTACT_FIELD_ID",
"ZENDESK_ISSUE_DATE_FIELD_ID",
"ZENDESK_COMPANY_NAME_FIELD_ID",
"ZENDESK_FIRST_NAME_FIELD_ID",
"ZENDESK_LAST_NAME_FIELD_ID",
"ZENDESK_EMAIL_FIELD_ID",
"ZENDESK_PHONE_FIELD_ID",
"ZENDESK_INVOICE_NUMBER_FIELD_ID",
"ZENDESK_ADDRESS_FIELD_ID",
"ZENDESK_INQUIRY_TYPE_FIELD_ID",
"ZENDESK_PRODUCT_CATEGORY_FIELD_ID",
"ZENDESK_PREFERRED_CONTACT_METHOD_FIELD_ID",
"ZENDESK_TERMS_ACCEPTANCE_FIELD_ID",
"ZENDESK_NEWSLETTER_CONSENT_FIELD_ID",
"ZENDESK_MARKETING_CONSENT_FIELD_ID"
]
}
}
}
}
22 changes: 11 additions & 11 deletions apps/docs/docs/integrations/forms/surveyjs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ This document provides an overview of features supported by the SurveyJS integra
| [Localization](#localization) | ✅ | Multi-language support via locale prop |
| [Custom UI Components](#custom-ui-components) | ✅ | Custom React components for question types |
| [Block Integration](#block-integration) | ✅ | Integration with `@o2s/blocks.surveyjs-form` block |
| [Ticket System Integration](#ticket-system-integration) | 📋 | Planned feature for ticket submission forms |
| [Ticket System Integration](#ticket-system-integration) | | Submit surveys as tickets to ticket systems |

## Feature details

Expand Down Expand Up @@ -87,8 +87,10 @@ Each question type has custom React components for consistent UI styling.

Flexible submission handling:

- **Current target**: Currently, the only submission target is the SurveyJS backend service
- **Extensible architecture**: The submission system can be extended to support multiple destinations:
- **Submission destinations**: Forms can be submitted to multiple destinations configured via the `submitDestination` setting:
- **SurveyJS backend service**: Default submission target for standard survey responses
- **Ticket systems**: When `submitDestination` includes `'tickets'`, submissions are routed to the framework's Tickets service (e.g., Zendesk integration)
- **Extensible architecture**: The submission system can be extended to support additional destinations:
- Backend APIs (REST, GraphQL)
- Message brokers (e.g., RabbitMQ)
- Workflow tools (e.g., N8n)
Expand Down Expand Up @@ -155,13 +157,11 @@ Integration with the `@o2s/blocks.surveyjs-form` block:

### Ticket System Integration {#ticket-system-integration}

:::info Planned
This is a planned feature and is not yet implemented.
:::
The SurveyJS module supports ticket submission through the `submitDestination` configuration:

The SurveyJS module is planned to support ticket submission:
- **Ticket forms**: Create dynamic ticket submission forms using SurveyJS schemas
- **Form validation**: Automatic validation of required fields (`description`, `ticketFormId`)
- **Integration**: Works with ticket systems implementing the framework's Tickets service (e.g., Zendesk)
- **Custom workflows**: Configure submission destinations in CMS via `submitDestination: ['tickets']`

- **Ticket forms**: Create dynamic ticket submission forms
- **Form validation**: Validate ticket data before submission
- **Integration**: Can be integrated with ticket systems (e.g., Zendesk)
- **Custom workflows**: Configure custom submission workflows
Required survey fields for ticket submission: `description` (string) and `ticketFormId` (number).
Comment thread
coderabbitai[bot] marked this conversation as resolved.
4 changes: 3 additions & 1 deletion apps/docs/docs/integrations/forms/surveyjs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ First, create a survey entry in your CMS (e.g., Strapi) with the following requi
- **surveyId** - SurveyJS survey ID from your SurveyJS service
- **postId** - SurveyJS post ID for submissions
- **surveyType** - Type of survey (typically `"survey"`)
- **submitDestination** - Array of destinations (e.g., `["surveyjs"]`)
- **submitDestination** - Array of destinations: `["surveyjs"]` for SurveyJS backend, `["tickets"]` for ticket system
- **requiredRoles** - Array of required roles (can be empty `[]` for public surveys)

### Step 3: Add block to page in CMS
Expand All @@ -68,6 +68,8 @@ The block automatically handles everything:

No frontend code changes are needed - the form will be automatically rendered on the page.

**Ticket submission:** To submit surveys as tickets, set `submitDestination: ["tickets"]` and ensure your survey includes `description` (string) and `ticketFormId` (number) fields.

## Direct component usage (advanced)

If you need to use the survey component directly without the CMS block system:
Expand Down
Loading