Skip to content

Scheduler: Appointment popup Customization #25898

Scheduler: Appointment popup Customization

Scheduler: Appointment popup Customization #25898

name: Demos Frameworks
concurrency:
group: wf-${{github.event.pull_request.number || github.sha}}-${{github.workflow}}
cancel-in-progress: true
on:
pull_request:
paths-ignore:
- 'apps/**/*.md'
push:
branches: [25_2]
workflow_dispatch:
env:
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }}
NX_SKIP_NX_CACHE: ${{ (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'skip-cache')) && 'true' || 'false' }}
BUILD_TEST_INTERNAL_PACKAGE: true
RUN_TESTS: true
jobs:
check-should-run:
name: Check if tests should run
runs-on: devextreme-shr2
outputs:
should-run: ${{ steps.check.outputs.should-run }}
steps:
- name: Check RUN_TESTS flag
id: check
run: echo "should-run=${{ env.RUN_TESTS }}" >> $GITHUB_OUTPUT
build-devextreme:
runs-on: devextreme-shr2
name: Build DevExtreme
needs: check-should-run
if: needs.check-should-run.outputs.should-run == 'true'
env:
NODE_OPTIONS: "--max-old-space-size=8192"
timeout-minutes: 40
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: |
${{ env.STORE_PATH }}
.nx/cache
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: DevExtreme - Build-all
env:
BUILD_TEST_INTERNAL_PACKAGE: true
run: pnpm run all:build-dev
- name: Move packages
run: |
mv ./packages/devextreme/artifacts/npm/devextreme/*.tgz ./devextreme-installer.tgz
mv ./packages/devextreme/artifacts/npm/devextreme-dist/*.tgz ./devextreme-dist-installer.tgz
mv ./packages/devextreme-angular/npm/dist/*.tgz ./devextreme-angular-installer.tgz
mv ./packages/devextreme-react/npm/*.tgz ./devextreme-react-installer.tgz
mv ./packages/devextreme-vue/npm/*.tgz ./devextreme-vue-installer.tgz
- name: Copy build artifacts
uses: actions/upload-artifact@v4
with:
name: devextreme-sources
path: |
devextreme-installer.tgz
devextreme-dist-installer.tgz
devextreme-angular-installer.tgz
devextreme-react-installer.tgz
devextreme-vue-installer.tgz
retention-days: 1
build-demos:
runs-on: devextreme-shr2
name: Build Demos
timeout-minutes: 20
needs: [check-should-run, build-devextreme]
if: needs.check-should-run.outputs.should-run == 'true'
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Download devextreme sources
uses: actions/download-artifact@v4
with:
name: devextreme-sources
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: |
${{ env.STORE_PATH }}
.nx/cache
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install tgz
working-directory: apps/demos
run: pnpm add ../../devextreme-installer.tgz ../../devextreme-dist-installer.tgz ../../devextreme-react-installer.tgz ../../devextreme-vue-installer.tgz ../../devextreme-angular-installer.tgz
# - name: Build wrappers
# run: pnpm exec nx run-many -t pack -p devextreme-angular devextreme-react devetreme-vue
# - name: Link wrappers packages
# run: pnpm install
- name: Prepare bundles
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'force all tests')
working-directory: apps/demos
env:
NODE_OPTIONS: "--max-old-space-size=8192"
run: pnpx nx prepare-bundles
- name: Demos - Run tsc
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'force all tests')
working-directory: apps/demos
run: pnpm exec tsc --noEmit
- name: Copy build artifacts
uses: actions/upload-artifact@v4
with:
name: devextreme-bundles
path: |
apps/demos/bundles/
retention-days: 1
get-changes:
runs-on: devextreme-shr2
needs: check-should-run
if: github.event_name == 'pull_request' && needs.check-should-run.outputs.should-run == 'true'
name: Get changed demos
timeout-minutes: 5
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Get changed files
uses: DevExpress/github-actions/get-changed-files@v1
with:
gh-token: ${{ secrets.GITHUB_TOKEN }}
paths: 'apps/demos/Demos/**/*'
output: apps/demos/changed-files.json
- name: Display changed files
run: |
if [ -f "apps/demos/changed-files.json" ]; then
echo "Found changed-files.json"
echo "Content of changed-files.json:"
cat apps/demos/changed-files.json
echo "Number of changed files: $(jq length apps/demos/changed-files.json)"
else
echo "changed-files.json not found"
fi
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: changed-demos
path: apps/demos/changed-files.json
retention-days: 1
check-ts:
name: Check TS
needs: [check-should-run, build-devextreme]
if: needs.check-should-run.outputs.should-run == 'true'
runs-on: devextreme-shr2
timeout-minutes: 20
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Download devextreme packages
uses: actions/download-artifact@v4
with:
name: devextreme-sources
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: |
${{ env.STORE_PATH }}
.nx/cache
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install tgz
run: pnpm add -w ./devextreme-installer.tgz ./devextreme-dist-installer.tgz ./devextreme-react-installer.tgz ./devextreme-vue-installer.tgz ./devextreme-angular-installer.tgz
- name: Run check TS for Vue
working-directory: apps/demos
run: pnpm run ts-check-vue
# - name: Run check TS for Angular
# working-directory: apps/demos
# run: pnpm run ts-check-ng
# - name: Run check TS for React
# working-directory: apps/demos
# run: pnpm run ts-check-react
lint:
name: Lint code base
needs: [check-should-run, build-devextreme]
if: needs.check-should-run.outputs.should-run == 'true'
runs-on: devextreme-shr2
timeout-minutes: 60
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Download artifacts
if: github.event_name == 'pull_request'
uses: actions/download-artifact@v4
with:
name: changed-demos
path: apps/demos
- name: Download devextreme sources
uses: actions/download-artifact@v4
with:
name: devextreme-sources
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: |
${{ env.STORE_PATH }}
.nx/cache
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install tgz
run: pnpm add -w ./devextreme-installer.tgz ./devextreme-dist-installer.tgz ./devextreme-react-installer.tgz ./devextreme-vue-installer.tgz ./devextreme-angular-installer.tgz
- name: Run lint on all demos
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'force all tests')
working-directory: apps/demos
env:
DEBUG: 'eslint:cli-engine,stylelint:standalone'
run: pnpx nx lint
- name: Run lint on changed demos
if: github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'force all tests')
working-directory: apps/demos
env:
DEBUG: 'eslint:cli-engine,stylelint:standalone'
run: |
pnpx nx lint-non-demos
if [ -f "changed-files.json" ]; then
echo "Running lint-demos on changed files"
CHANGED_DEMOS=$(jq -r '.[].filename' changed-files.json \
| grep '^apps/demos/Demos/' \
| sed 's|^apps/demos/||' \
| while read f; do
[ -f "$f" ] && echo "$f"
done \
| tr '\n' ' ')
if [ ! -z "$CHANGED_DEMOS" ]; then
echo "Changed demo files: $CHANGED_DEMOS"
pnpx eslint $CHANGED_DEMOS
else
echo "No demo files changed, skipping lint-demos"
fi
else
echo "changed-files.json not found"
pnpm run lint-demos
fi
check_generated_demos:
name: ${{ matrix.name }}
runs-on: devextreme-shr2
timeout-minutes: 10
needs: [check-should-run, build-devextreme]
if: needs.check-should-run.outputs.should-run == 'true'
strategy:
fail-fast: false
matrix:
include:
- name: Check generated demos
command: pnpm run convert-to-js
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Download artifacts
if: github.event_name == 'pull_request'
uses: actions/download-artifact@v4
with:
name: changed-demos
path: apps/demos
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
- name: Download devextreme sources
uses: actions/download-artifact@v4
with:
name: devextreme-sources
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install tgz
working-directory: apps/demos
run: pnpm add ../../devextreme-installer.tgz ../../devextreme-dist-installer.tgz ../../devextreme-react-installer.tgz ../../devextreme-vue-installer.tgz ../../devextreme-angular-installer.tgz
- name: Prepare JS
working-directory: apps/demos
run: pnpm run prepare-js
- name: Check generated JS demos
if: github.event_name == 'pull_request'
working-directory: apps/demos
run: |
if [ -f "changed-files.json" ]; then
echo "Running convert-to-js on changed files only"
CHANGED_DEMOS=$(jq -r '.[].filename' changed-files.json | grep '/React/' | grep '\.tsx$' | sed 's|^apps/demos/||' | sed 's|/[^/]*\.tsx$||' | sort | uniq)
if [ -z "$CHANGED_DEMOS" ]; then
echo "No React demos found in changed files, skipping conversion"
else
echo "Changed React demos:"
echo "$CHANGED_DEMOS"
echo "$CHANGED_DEMOS" | while read -r demo_dir; do
if [ ! -z "$demo_dir" ]; then
echo "Converting: $demo_dir"
pnpm run convert-to-js "$demo_dir"
fi
done
fi
else
echo "Running convert-to-js on all files"
${{ matrix.command }}
fi
git add ./Demos -N
if git diff --exit-code . ':!package.json' ; then
echo "Generated JS demos are up-to-date"
else
echo "Generated JS demos are outdated. Execute 'pnpm run convert-to-js split' and commit changes."
echo "If you see another diff, ensure that extra listed files have LF endings."
exit 1
fi
testcafe:
needs: [check-should-run, build-demos]
if: contains(github.event.pull_request.labels.*.name, 'force all tests')
strategy:
fail-fast: false
matrix:
CONSTEL: [react(1/4), react(2/4), react(3/4), react(4/4), vue(1/4), vue(2/4), vue(3/4), vue(4/4), angular(1/4), angular(2/4), angular(3/4), angular(4/4)]
THEME: ['fluent.blue.light']
runs-on: devextreme-shr2
name: testcafe-${{ matrix.CONSTEL }}-${{ matrix.THEME }}
timeout-minutes: 60
steps:
- name: Get sources
uses: actions/checkout@v4
- name: Setup Chrome
uses: ./.github/actions/setup-chrome
with:
chrome-version: '141.0.7390.122'
runner-type: 'github-hosted'
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Download devextreme sources
uses: actions/download-artifact@v4
with:
name: devextreme-sources
- uses: pnpm/action-setup@v4
with:
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: |
${{ env.STORE_PATH }}
.nx/cache
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Install tgz
working-directory: apps/demos
run: pnpm add ../../devextreme-installer.tgz ../../devextreme-dist-installer.tgz ../../devextreme-react-installer.tgz ../../devextreme-vue-installer.tgz ../../devextreme-angular-installer.tgz
- name: Prepare JS
working-directory: apps/demos
run: pnpm run prepare-js
- name: Update bundles config
working-directory: apps/demos
run: pnpx gulp update-config
- name: Create bundles dir
run: mkdir -p apps/demos/bundles
- name: Download bundles artifacts
uses: actions/download-artifact@v4
with:
name: devextreme-bundles
path: apps/demos/bundles
- name: Run Web Server
run: |
python -m http.server 8080 &
python -m http.server 8081 &
python -m http.server 8082 &
python -m http.server 8083 &
- name: Run TestCafe tests
shell: bash
working-directory: apps/demos
env:
CHANGEDFILEINFOSPATH: changed-files.json
BROWSERS: chrome:headless --window-size=1200,800 --disable-gpu --no-sandbox --disable-dev-shm-usage --disable-partial-raster --disable-skia-runtime-opts --run-all-compositor-stages-before-draw --disable-new-content-rendering-timeout --disable-threaded-animation --disable-threaded-scrolling --disable-checker-imaging --disable-image-animation-resync --use-gl="swiftshader" --disable-features=PaintHolding --js-flags=--random-seed=2147483647 --font-render-hinting=none --disable-font-subpixel-positioning
# DEBUG: hammerhead:*,testcafe:*
CONCURRENCY: 4
TCQUARANTINE: true
CONSTEL: ${{ matrix.CONSTEL }}
THEME: ${{ matrix.THEME }}
# DISABLE_DEMO_TEST_SETTINGS: all # Uncomment to ignore all the visualtestrc.json settings
# DISABLE_DEMO_TEST_SETTINGS: ignore # Uncomment to ignore the `ignore` field
# DISABLE_DEMO_TEST_SETTINGS: comparison-options # Uncomment to ignore the `comparison-options` field
CI_ENV: true # The `ignore` field in the visualtestrc.json should be disabled when running test locally
run: pnpx nx test-testcafe
- name: Sanitize job name
if: ${{ failure() }}
run: echo "JOB_NAME=$(echo "${{ matrix.CONSTEL }}-${{ matrix.THEME }}" | tr '/' '-')" >> $GITHUB_ENV
- name: Copy screenshots artifacts
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: screenshots-${{ env.JOB_NAME }}
path: ${{ github.workspace }}/apps/demos/testing/artifacts/compared-screenshots/**/*
if-no-files-found: ignore
merge-artifacts:
runs-on: devextreme-shr2
needs: testcafe
if: ${{ failure() }}
steps:
- name: Merge screenshot artifacts
uses: actions/upload-artifact/merge@v4
continue-on-error: true
with:
name: screenshots
pattern: screenshots-*
delete-merged: true