Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
d1ad7a3
[!!!][TASK] Add salary grade structure for jobs
sfroemkenjw Jul 29, 2026
4eb9c41
[TASK] Use group field for Job salary grade selection
sfroemkenjw Jul 30, 2026
7b80e39
[TASK] Improve SalaryStep title with step label prefix
sfroemkenjw Jul 30, 2026
e3e3516
[TASK] Compact SalaryGrade form and improve step creation
sfroemkenjw Jul 30, 2026
37bff2c
[TASK] Add bottom create-new button for salary grades
sfroemkenjw Jul 30, 2026
98844a7
[FEATURE] Accept locale-formatted amounts in salary inputs
sfroemkenjw Jul 30, 2026
f729197
[TASK] Use imports instead of FQCN in config files
sfroemkenjw Jul 30, 2026
6b245f7
[TASK] Remove native TCA fields already added by core
sfroemkenjw Jul 30, 2026
931b9db
[TASK] Use boolean for TCA exclude flag
sfroemkenjw Jul 30, 2026
3269826
[TASK] Type and sort TCA types/typeicon_classes keys
sfroemkenjw Jul 30, 2026
d315458
[TASK] Order TCA columns to match showitem
sfroemkenjw Jul 30, 2026
0346094
[TASK] Remove redundant foreign_field pointer column
sfroemkenjw Jul 30, 2026
5fa1cf8
[TASK] Resolve SalaryGrade's parent title without a group field
sfroemkenjw Jul 30, 2026
3979255
[TASK] Use TYPO3 native labels for the access palette
sfroemkenjw Jul 30, 2026
90c297c
[TASK] Add .editorconfig
sfroemkenjw Jul 30, 2026
eded015
[TASK] Clean up composer.json metadata
sfroemkenjw Jul 30, 2026
e5fb265
[TASK] Update extension author to jweiland.net
sfroemkenjw Jul 30, 2026
81d14cb
[TASK] Remove ext_tables.sql columns auto-generated from TCA
sfroemkenjw Jul 30, 2026
960b959
[TASK] Rename LICENSE to LICENSE.txt
sfroemkenjw Jul 30, 2026
69c157a
[TASK] Add test/build tooling to composer.json
sfroemkenjw Jul 30, 2026
0884a31
[TASK] Add .gitignore and .gitattributes
sfroemkenjw Jul 30, 2026
96a3663
[TASK] Add PhpStorm meta file for TYPO3 core APIs
sfroemkenjw Jul 30, 2026
abf0574
[TASK] Add test/build tooling scripts
sfroemkenjw Jul 30, 2026
b69e54e
[TASK] Add GitHub Actions workflows
sfroemkenjw Jul 30, 2026
06d4ce7
[TASK] Fix CGL violations flagged by the new CI workflow
sfroemkenjw Jul 30, 2026
02ce6b9
[TASK] Force docker as container runtime in CI
sfroemkenjw Jul 30, 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
64 changes: 64 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true

# TS/JS-Files
[*.{ts,js,mjs}]
indent_size = 2

# JSON-Files
[*.json]
indent_style = tab

# ReST-Files
[*.{rst,rst.txt}]
indent_size = 4
max_line_length = 80

# Markdown-Files
[*.md]
max_line_length = 80

# YAML-Files
[*.{yaml,yml}]
indent_size = 2

# NEON-Files
[*.neon]
indent_size = 2
indent_style = tab

# stylelint
[.stylelintrc]
indent_size = 2

# package.json
[package.json]
indent_size = 2

# TypoScript
[*.{typoscript,tsconfig}]
indent_size = 2

# XLF-Files
[*.xlf]
indent_style = tab

# SQL-Files
[*.sql]
indent_style = tab
indent_size = 2

# .htaccess
[{_.htaccess,.htaccess}]
indent_style = tab
7 changes: 7 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/.github/ export-ignore
/Build/ export-ignore
/Tests/ export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/.editorconfig export-ignore
/.phpstorm.meta.php export-ignore
22 changes: 22 additions & 0 deletions .github/workflows/backport.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Backport merged pull request

on:
pull_request_target:
types: [closed]

permissions:
contents: write
pull-requests: write

jobs:
backport:
name: 'Backport pull request'
runs-on: 'ubuntu-latest'
if: github.event.pull_request.merged == true
steps:
- uses: actions/checkout@v4
- name: Create backport pull requests
uses: korthout/backport-action@v3
with:
label_pattern: '^Backport ([^ ]+)$'
github_token: ${{ secrets.BACKPORT_TOKEN }}
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Tests

on: [pull_request]

jobs:
testing:
name: Testing

runs-on: ubuntu-latest

strategy:
fail-fast: true

matrix:
php:
- '8.2'
- '8.3'

steps:
- name: 'Checkout'
uses: actions/checkout@v6

- name: 'Lint PHP'
run: Build/Scripts/runTests.sh -b docker -p ${{ matrix.php }} -s lint

- name: 'Install testing system'
run: Build/Scripts/runTests.sh -b docker -p ${{ matrix.php }} -s composerUpdate

- name: 'Composer validate'
run: Build/Scripts/runTests.sh -b docker -p ${{ matrix.php }} -s composerValidate

- name: 'Composer normalize'
run: Build/Scripts/runTests.sh -b docker -p ${{ matrix.php }} -s composerNormalize -n

- name: 'CGL'
run: Build/Scripts/runTests.sh -b docker -n -p ${{ matrix.php }} -s cgl
56 changes: 56 additions & 0 deletions .github/workflows/ter-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: ter-release.yml

permissions:
contents: read

on:
release:
types: [published]

jobs:

publish:
name: Publish Extension to TYPO3 Extension Repository (TER)
runs-on: ubuntu-latest

env:
TYPO3_EXTENSION_KEY: ${{ secrets.TYPO3_EXTENSION_KEY }}
TYPO3_REPOSITORY_URL: ${{ secrets.TYPO3_REPOSITORY_URL }}
TYPO3_API_TOKEN: ${{ secrets.TYPO3_API_TOKEN }}
TYPO3_API_USERNAME: ${{ secrets.TYPO3_API_USERNAME }}
TYPO3_API_PASSWORD: ${{ secrets.TYPO3_API_PASSWORD }}

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Get version and description
id: prep
run: |
# 1. Clean the version tag (removes 'v' prefix if present, e.g., v1.0.0 -> 1.0.0)
RAW_VERSION="${{ github.event.release.tag_name }}"
VERSION=${RAW_VERSION#v}
echo "VERSION=$VERSION" >> "$GITHUB_OUTPUT"

# 2. Safely capture the multi-line release body as an ENV variable
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
echo "${{ github.event.release.body }}" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: intl, mbstring, json, libxml, xml, zip, curl
tools: composer:v2

- name: Install TYPO3 Tailor Extension
run: composer global require typo3/tailor --prefer-dist --no-progress --no-suggest

- name: Release to TER
run: |
# Use the VERSION from steps and RELEASE_NOTES from env
# We use double quotes around env.RELEASE_NOTES to handle the multi-line content
php ~/.composer/vendor/bin/tailor ter:publish ${{ steps.prep.outputs.VERSION }} \
--artefact=${{ env.TYPO3_REPOSITORY_URL }}/archive/${{ github.event.release.tag_name }}.zip \
--comment="${{ env.RELEASE_NOTES }}"
48 changes: 48 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
########################
# jobfair2
# global ignore file
########################

# Ignore files generated by docs rendering
*GENERATED*
docker-compose.yaml
docker-compose.yml

# Ignore environment files
.env

# Ignore temporary files (left by editors and OS)
*~
*.bak
*.swp
.DS_Store

# Ignore by common IDEs used directories/files
nbproject
*.idea
*.project
.buildpath
.settings
.TemporaryItems
.webprj
.fleet

# Temporary files and folders
/.cache
.php_cs.cache
.php-cs-fixer.cache
.sass-cache
.session
*.log

# Ignore composer stuff
bin/*
vendor/*
.build
.php_cs.cache
composer.lock

# Ignore testing stuff
/.Build
/composer.json.orig
/composer.json.testing
149 changes: 149 additions & 0 deletions .phpstorm.meta.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?php

/**
* Extend PhpStorms code completion capabilities by providing a meta file
*
* @link https://www.jetbrains.com/help/phpstorm/ide-advanced-metadata.html
*/

namespace PHPSTORM_META {
expectedArguments(
\TYPO3\CMS\Core\Context\Context::getAspect(),
0,
'date',
'visibility',
'backend.user',
'frontend.user',
'workspace',
'language',
'frontend.preview',
);
override(\TYPO3\CMS\Core\Context\Context::getAspect(), map([
'date' => \TYPO3\CMS\Core\Context\DateTimeAspect::class,
'visibility' => \TYPO3\CMS\Core\Context\VisibilityAspect::class,
'backend.user' => \TYPO3\CMS\Core\Context\UserAspect::class,
'frontend.user' => \TYPO3\CMS\Core\Context\UserAspect::class,
'workspace' => \TYPO3\CMS\Core\Context\WorkspaceAspect::class,
'language' => \TYPO3\CMS\Core\Context\LanguageAspect::class,
'frontend.preview' => \TYPO3\CMS\Frontend\Aspect\PreviewAspect::class,
]));
expectedArguments(
\TYPO3\CMS\Core\Context\DateTimeAspect::get(),
0,
'timestamp',
'iso',
'timezone',
'full',
'accessTime'
);
expectedArguments(
\TYPO3\CMS\Core\Context\VisibilityAspect::get(),
0,
'includeHiddenPages',
'includeHiddenContent',
'includeDeletedRecords'
);
expectedArguments(
\TYPO3\CMS\Core\Context\UserAspect::get(),
0,
'id',
'username',
'isLoggedIn',
'isAdmin',
'groupIds',
'groupNames'
);
expectedArguments(
\TYPO3\CMS\Core\Context\WorkspaceAspect::get(),
0,
'id',
'isLive',
'isOffline'
);
expectedArguments(
\TYPO3\CMS\Core\Context\LanguageAspect::get(),
0,
'id',
'contentId',
'fallbackChain',
'overlayType',
'legacyLanguageMode',
'legacyOverlayType'
);
expectedArguments(
\TYPO3\CMS\Frontend\Aspect\PreviewAspect::get(),
0,
'isPreview'
);

expectedArguments(
\Psr\Http\Message\ServerRequestInterface::getAttribute(),
0,
'frontend.user',
'normalizedParams',
'site',
'language',
'routing',
'module',
'moduleData',
'frontend.controller',
'frontend.typoscript',
'frontend.cache.collector',
'frontend.cache.instruction',
'frontend.page.information',
);
override(\Psr\Http\Message\ServerRequestInterface::getAttribute(), map([
'frontend.user' => \TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication::class,
'normalizedParams' => \TYPO3\CMS\Core\Http\NormalizedParams::class,
'site' => \TYPO3\CMS\Core\Site\Entity\SiteInterface::class,
'language' => \TYPO3\CMS\Core\Site\Entity\SiteLanguage::class,
'routing' => '\TYPO3\CMS\Core\Routing\SiteRouteResult|\TYPO3\CMS\Core\Routing\PageArguments',
'module' => \TYPO3\CMS\Backend\Module\ModuleInterface::class,
'moduleData' => \TYPO3\CMS\Backend\Module\ModuleData::class,
'frontend.controller' => \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController::class,
'frontend.typoscript' => \TYPO3\CMS\Core\TypoScript\FrontendTypoScript::class,
'frontend.cache.collector' => \TYPO3\CMS\Core\Cache\CacheDataCollector::class,
'frontend.cache.instruction' => \TYPO3\CMS\Frontend\Cache\CacheInstruction::class,
'frontend.page.information' => \TYPO3\CMS\Frontend\Page\PageInformation::class,
]));

expectedArguments(
\TYPO3\CMS\Core\Http\ServerRequest::getAttribute(),
0,
'frontend.user',
'normalizedParams',
'site',
'language',
'routing',
'module',
'moduleData'
);
override(\TYPO3\CMS\Core\Http\ServerRequest::getAttribute(), map([
'frontend.user' => \TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication::class,
'normalizedParams' => \TYPO3\CMS\Core\Http\NormalizedParams::class,
'site' => \TYPO3\CMS\Core\Site\Entity\SiteInterface::class,
'language' => \TYPO3\CMS\Core\Site\Entity\SiteLanguage::class,
'routing' => '\TYPO3\CMS\Core\Routing\SiteRouteResult|\TYPO3\CMS\Core\Routing\PageArguments',
'module' => \TYPO3\CMS\Backend\Module\ModuleInterface::class,
'moduleData' => \TYPO3\CMS\Backend\Module\ModuleData::class,
]));

override(\TYPO3\CMS\Core\Routing\SiteMatcher::matchRequest(), type(
\TYPO3\CMS\Core\Routing\SiteRouteResult::class,
\TYPO3\CMS\Core\Routing\RouteResultInterface::class,
)
);

override(\TYPO3\CMS\Core\Routing\PageRouter::matchRequest(), type(
\TYPO3\CMS\Core\Routing\PageArguments::class,
\TYPO3\CMS\Core\Routing\RouteResultInterface::class,
));

override(\Psr\Container\ContainerInterface::get(0), map([
'' => '@',
]));

override(\Psr\EventDispatcher\EventDispatcherInterface::dispatch(0), map([
'' => '@',
]));
}
Loading
Loading