snapshot of https://github.com/marmelab/atomic-crm.git (main, 2026-09-18; blobs > 131072B omitted)
Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s

This commit is contained in:
upstream-mirror
2026-09-18 01:48:50 +05:00
commit 93ecc1a6f8
787 changed files with 75240 additions and 0 deletions

46
.github/CODE_OF_CONDUCT.md vendored Normal file
View File

@@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@marmelab.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
[homepage]: https://contributor-covenant.org
[version]: https://contributor-covenant.org/version/1/4/

50
.github/CONTRIBUTING.md vendored Normal file
View File

@@ -0,0 +1,50 @@
# Contributing
So you want to contribute to atomic-crm? Awesome! Thank you in advance for your contribution. Here are a few guidelines that will help you along the way.
## Opening an Issue
If you think you have found a bug, or have a new feature idea, please start by making sure it hasn't already been [reported or fixed](https://github.com/marmelab/atomic-crm/issues?q=is%3Aissue+is%3Aclosed). You can search through existing issues and PRs to see if someone has reported one similar to yours.
Next, create a new issue that briefly explains the problem, and provides a bit of background as to the circumstances that triggered it, and steps to reproduce it.
For code issues please include:
* atomic-crm version (package.json)
* React version
* Browser version
For visual or layout problems, images or animated gifs can help explain your issue.
It's even better with a live reproduction test case.
### Issue Guidelines
Please use a succinct description. "doesn't work" doesn't help others find similar issues.
Please don't group multiple topics into one issue, but instead each should be its own issue.
And please don't just '+1' an issue. It spams the maintainers and doesn't help move the issue forward.
## Submitting a Pull Request
atomic-crm is a community project, so pull requests are always welcome, but before working on a large change, it is best to open an issue first to discuss it with the maintainers. In that case, prefix it with "[RFC]" (Request for Comments)
When in doubt, keep your pull requests small. To give a PR the best chance of getting accepted, don't bundle more than one feature or bug fix per pull request. It's always best to create two smaller PRs than one big one.
The core team prefix their PRs width "[WIP]" (Work in Progress) or "[RFR]" (ready for Review), don't hesitate to do the same to explain how far you are from completion.
When adding new features or modifying existing, please attempt to include tests to confirm the new behaviour.
### Coding style
You must follow the coding style of the existing files. atomic-crm uses eslint and [prettier](https://github.com/prettier/prettier). You can reformat all the project files automatically by calling
```sh
make lint
```
**Tip**: If possible, enable linting in your editor to get realtime feedback and/or fixes.
## License
By contributing your code to the marmelab/atomic-crm GitHub repository, you agree to license your contribution under the MIT license.

35
.github/ISSUE_TEMPLATE/Bug_report.md vendored Normal file
View File

@@ -0,0 +1,35 @@
---
name: "\U0001F41B Bug report"
about: Something isn't working as expected. Please tell us!
---
**What you were expecting:**
<!-- Describe what the behavior would be without the bug. -->
**What happened instead:**
<!-- Describe how the bug manifests. -->
**Steps to reproduce:**
<!-- Please explain the steps required to duplicate the issue, especially if you are able to provide a sample application. -->
**Related code:**
<!-- If you are able to illustrate the bug or feature request with an example, please provide a sample application via one of the following means: -->
* A link to a GitHub repo with the minimal codebase to reproduce the issue
```
insert short code snippets here
```
**Other information:**
<!-- List any other information that is relevant to your issue. Stack traces, related issues, suggestions on how to fix, Stack Overflow links, forum links, etc. For visual or layout problems, please include images or animated gifs.-->
**Environment**
* atomic-crm version:
* Last version that did not exhibit the issue (if applicable):
* React version:
* Browser:
* Stack trace (in case of a JS error):

View File

@@ -0,0 +1,17 @@
---
name: "\U0001F680 Feature request"
about: "I have a suggestion (and may want to implement it \U0001F642)!"
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

19
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,19 @@
## Problem
_Describe the problem this PR solves_
## Solution
_Describe the solution this PR implements_
## How To Test
_Describe the steps required to test the changes_
## Additional Checks
- [ ] The **documentation** is up to date
- [ ] Tested with **fakerest** provider (see [related documentation](https://github.com/marmelab/atomic-crm/blob/main/doc/developer/data-providers.md))
- [ ] Tested with **Mobile** resolution
Also, please make sure to read the [contributing guidelines](https://github.com/marmelab/atomic-crm/tree/main?tab=contributing-ov-file#readme).

136
.github/workflows/check.yml vendored Normal file
View File

@@ -0,0 +1,136 @@
name: ✅ Check
on:
push:
branches:
- main
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
contents: write
checks: write
jobs:
lint:
name: 🔬 ESLint
runs-on: ubuntu-latest
timeout-minutes: 10
if: ${{ !github.event.pull_request.draft || github.event_name == 'push' }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: 📥 Download deps
run: npm ci
- name: 🔬 Lint
uses: wearerequired/lint-action@v2
with:
eslint: true
eslint_args: "**/*.{mjs,ts,tsx}"
prettier: true
prettier_args: "--config ./.prettierrc.json \"**/*.{js,json,ts,tsx,css,md,html}\""
typecheck:
name: 🏷️ Typecheck
timeout-minutes: 10
runs-on: ubuntu-latest
if: ${{ !github.event.pull_request.draft || github.event_name == 'push' }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: 📥 Download deps
run: npm ci
- name: 🏷️ Typecheck
run: npm run typecheck
test-app:
name: 🔎 Test
runs-on: ubuntu-latest
timeout-minutes: 10
if: ${{ !github.event.pull_request.draft || github.event_name == 'push' }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: 📥 Download deps
run: npm ci
- name: 🎭 Install Playwright browsers
run: npx playwright install chromium-headless-shell 1>/dev/null
- name: 🔎 Unit Tests on App
run: CI=1 npm run test:unit:app -- --run
- name: 🔎 Unit Tests on Supabase functions
run: CI=1 npm run test:unit:functions -- --run
e2e-test:
timeout-minutes: 10
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: Install dependencies
run: npm ci
- name: Install Playwright Browsers
run: npx playwright install --with-deps chromium-headless-shell 1>/dev/null
- name: Install wait-on and serve
run: npm install -g wait-on serve
- name: Run Playwright tests
run: make test-e2e-ci
build:
name: 🔨 Build
timeout-minutes: 10
runs-on: ubuntu-latest
if: ${{ !github.event.pull_request.draft || github.event_name == 'push' }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: 📥 Download deps
run: npm ci
- name: 🔨 Build
run: npm run build

203
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,203 @@
name: 🚀 Deploy
on:
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
permissions:
pages: write
contents: write
jobs:
deploy-doc:
name: 🚀 Deploy (doc)
runs-on: ubuntu-latest
timeout-minutes: 5
env:
PRODUCTION_REMOTE: https://git:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: ⚙️ Setup git
run: |
git remote set-url origin https://git:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}
git config --global user.email support+actions@github.com
git config --global user.name github-actions-bot
- name: 📥 Download deps
run: make doc-install
- name: 🔨 Build Registry
run: make registry-build
- name: 🔨 Build Documentation
run: make doc-build
- name: 📡 Deploy Registry
run: make registry-deploy
- name: 📡 Deploy Documentation
run: make doc-deploy
deploy-demo:
name: 🚀 Deploy (demo)
runs-on: ubuntu-latest
timeout-minutes: 10
env:
VITE_IS_DEMO: true
VITE_INBOUND_EMAIL: ${{ vars.VITE_INBOUND_EMAIL }}
VITE_ATTACHMENTS_BUCKET: ${{ vars.VITE_ATTACHMENTS_BUCKET || 'attachments' }}
PRODUCTION_REMOTE: https://git:${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}@github.com/${{ vars.DEMO_DEPLOY_REPOSITORY }}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: ⚙️ Setup git
run: |
echo Deploying to pages to ${{ vars.DEMO_DEPLOY_REPOSITORY }}
git remote set-url origin https://git:${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}@github.com/${{ vars.DEMO_DEPLOY_REPOSITORY }}
git remote add production $PRODUCTION_REMOTE
git config --global user.email support+actions@github.com
git config --global user.name github-actions-bot
- name: 📥 Download deps
run: npm ci
- name: 🔨 Build
run: npm run build:demo
- name: 📡 Deploy GitHub pages
run: npx gh-pages --remote production -d dist -b ${{ vars.DEPLOY_BRANCH || 'gh-pages' }}
env:
GITHUB_TOKEN: ${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}
deploy-supabase:
name: 🚀 Deploy (supabase)
runs-on: ubuntu-latest
timeout-minutes: 10
env:
SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
SUPABASE_DB_PASSWORD: ${{ secrets.SUPABASE_DB_PASSWORD }}
SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PROJECT_ID }}
VITE_SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
VITE_SB_PUBLISHABLE_KEY: ${{ secrets.SB_PUBLISHABLE_KEY }}
IS_SUPABASE_CONFIGURED: ${{ secrets.SUPABASE_ACCESS_TOKEN && secrets.SUPABASE_DB_PASSWORD && secrets.SUPABASE_PROJECT_ID && secrets.SUPABASE_URL && secrets.SB_PUBLISHABLE_KEY }}
VITE_IS_DEMO: ${{ vars.VITE_IS_DEMO }}
VITE_INBOUND_EMAIL: ${{ vars.VITE_INBOUND_EMAIL }}
VITE_ATTACHMENTS_BUCKET: ${{ vars.VITE_ATTACHMENTS_BUCKET || 'attachments' }}
PRODUCTION_REMOTE: https://git:${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}@github.com/${{ vars.DEPLOY_REPOSITORY }}
POSTMARK_WEBHOOK_USER: ${{secrets.POSTMARK_WEBHOOK_USER}}
POSTMARK_WEBHOOK_PASSWORD: ${{secrets.POSTMARK_WEBHOOK_PASSWORD}}
POSTMARK_WEBHOOK_AUTHORIZED_IPS: ${{secrets.POSTMARK_WEBHOOK_AUTHORIZED_IPS}}
VITE_GOOGLE_WORKPLACE_DOMAIN: ${{secrets.VITE_GOOGLE_WORKPLACE_DOMAIN}}
steps:
- name: 📥 Checkout repo
uses: actions/checkout@v4
- name: ⚙️ Setup node
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- name: ⚙️ Setup git
run: |
echo Deploying to pages to ${{ vars.DEPLOY_REPOSITORY }}
git remote set-url origin https://git:${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}@github.com/${{ vars.DEPLOY_REPOSITORY }}
git remote add production $PRODUCTION_REMOTE
git config --global user.email support+actions@github.com
git config --global user.name github-actions-bot
- name: ⚙️ Setup supabase
uses: supabase/setup-cli@v1
- name: 📥 Download deps
run: npm ci
- name: 🔨 Build
run: npm run build
- if: ${{ env.IS_SUPABASE_CONFIGURED }}
name: 🔗 Supabase Link
run: npx supabase link --project-ref $SUPABASE_PROJECT_ID
- if: ${{ env.IS_SUPABASE_CONFIGURED }}
name: 📡 Push supabase migrations
run: npx supabase db push
- if: ${{ env.IS_SUPABASE_CONFIGURED && env.POSTMARK_WEBHOOK_USER && env.POSTMARK_WEBHOOK_PASSWORD && env.POSTMARK_WEBHOOK_AUTHORIZED_IPS }}
name: 📡 Push supabase postmark webhook user secret
run: |
npx supabase secrets set POSTMARK_WEBHOOK_USER=${{ env.POSTMARK_WEBHOOK_USER }}
npx supabase secrets set POSTMARK_WEBHOOK_PASSWORD=${{ env.POSTMARK_WEBHOOK_PASSWORD }}
npx supabase secrets set POSTMARK_WEBHOOK_AUTHORIZED_IPS=${{ env.POSTMARK_WEBHOOK_AUTHORIZED_IPS }}
npx supabase secrets set VITE_INBOUND_EMAIL=${{ env.VITE_INBOUND_EMAIL }}
npx supabase secrets set VITE_ATTACHMENTS_BUCKET=${{ env.VITE_ATTACHMENTS_BUCKET }}
- if: ${{ env.IS_SUPABASE_CONFIGURED }}
name: 📡 Deploy supabase functions
run: npx supabase functions deploy
- if: ${{ !env.SUPABASE_ACCESS_TOKEN }}
name: Check SUPABASE_ACCESS_TOKEN secret
run: echo ':warning:SUPABASE_ACCESS_TOKEN secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.SUPABASE_DB_PASSWORD }}
name: Check SUPABASE_DB_PASSWORD secret
run: echo ':warning:SUPABASE_DB_PASSWORD secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.SUPABASE_PROJECT_ID }}
name: Check SUPABASE_PROJECT_ID secret
run: echo ':warning:SUPABASE_PROJECT_ID secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.VITE_SUPABASE_URL }}
name: Check SUPABASE_URL secret
run: echo ':warning:SUPABASE_URL secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.VITE_SB_PUBLISHABLE_KEY }}
name: Check SB_PUBLISHABLE_KEY secret
run: echo ':warning:SB_PUBLISHABLE_KEY secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.POSTMARK_WEBHOOK_USER }}
name: Check POSTMARK_WEBHOOK_USER secret
run: echo ':warning:POSTMARK_WEBHOOK_USER secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.POSTMARK_WEBHOOK_PASSWORD }}
name: Check POSTMARK_WEBHOOK_USER secret
run: echo ':warning:POSTMARK_WEBHOOK_PASSWORD secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.POSTMARK_WEBHOOK_AUTHORIZED_IPS }}
name: Check POSTMARK_WEBHOOK_USER secret
run: echo ':warning:POSTMARK_WEBHOOK_AUTHORIZED_IPS secret is missing' >> $GITHUB_STEP_SUMMARY
- if: ${{ !env.IS_SUPABASE_CONFIGURED }}
name: Supabase deployment skipped
run: echo ':warning:Supabase deployment skipped' >> $GITHUB_STEP_SUMMARY
- name: 📡 Deploy GitHub pages
run: npx gh-pages --remote production -d dist -b ${{ vars.DEPLOY_BRANCH || 'gh-pages' }}
env:
GITHUB_TOKEN: ${{ secrets.DEPLOY_TOKEN || secrets.GITHUB_TOKEN }}