Merge branch '145-build-system-rewrite' into test
This commit is contained in:
commit
81278d92a1
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
65
.azure-pipelines/templates/jobs/release.yaml
Normal file
@ -0,0 +1,65 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: releaseTag
|
||||
type: string
|
||||
- name: releaseEndpoint
|
||||
type: string
|
||||
default: 'devfra'
|
||||
values:
|
||||
- 'devfra'
|
||||
- 'prodfra'
|
||||
|
||||
jobs:
|
||||
- job: Release
|
||||
displayName: Release ${{ parameters.releaseTag }}
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
|
||||
# Download required artifacts from pipeline
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download FraDrive binaries
|
||||
inputs:
|
||||
artifactName: Build_backend
|
||||
patterns: 'Build_backend/bin/*'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||
- task: Bash@3
|
||||
displayName: Build FraDrive container
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/fradrive/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/fradrive:$(Build.BuildNumber) \
|
||||
--tag $(buildImageUpstream)/fradrive:${{parameters.releaseTag}} \
|
||||
--build-arg FROM_IMG=devfra.azurecr.io/de.fraport.trusted/ubuntu \
|
||||
--build-arg FROM_TAG=20.04 \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
.
|
||||
- task: Docker@2
|
||||
displayName: Push container to registry
|
||||
inputs:
|
||||
command: push
|
||||
repository: 'de.fraport.fradrive.build/fradrive'
|
||||
tags: '$(Build.BuildNumber),${{parameters.releaseTag}}'
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: '${{ parameters.releaseEndpoint }}'
|
||||
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
61
.azure-pipelines/templates/jobs/setup_dependencies.yaml
Normal file
@ -0,0 +1,61 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: serviceName
|
||||
type: string
|
||||
- name: dependenciesCaches
|
||||
type: object
|
||||
default: []
|
||||
- name: dependenciesBuildPool
|
||||
type: string
|
||||
default: 'Prod Private Agent Pool'
|
||||
values:
|
||||
- 'Prod Private Agent Pool'
|
||||
- 'Prod Private Agent Pool DS2'
|
||||
- 'Prod Private Agent Pool DS3'
|
||||
- name: dependenciesBuildCores
|
||||
type: number
|
||||
default: 1
|
||||
- name: dependenciesBuildTimeout
|
||||
type: number
|
||||
default: 60
|
||||
|
||||
jobs:
|
||||
- job: SetupDependencies_${{parameters.serviceName}}
|
||||
displayName: Install ${{parameters.serviceName}} dependencies
|
||||
dependsOn: SetupImage_${{parameters.serviceName}}
|
||||
${{ if eq(variables.setupImages, true) }}:
|
||||
condition: succeeded()
|
||||
${{ else }}:
|
||||
condition: always()
|
||||
pool: '${{parameters.dependenciesBuildPool}}'
|
||||
timeoutInMinutes: ${{parameters.dependenciesBuildTimeout}}
|
||||
container:
|
||||
${{ if variables.setupImages }}:
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||
${{ else }}:
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
# Restore previously-built dependencies from caches
|
||||
- ${{ each cache in parameters.dependenciesCaches }}:
|
||||
- template: ./../../steps/cache.yaml
|
||||
parameters:
|
||||
cacheIdent: '${{parameters.serviceName}}-dependencies'
|
||||
cacheKeys: '${{cache.key}}'
|
||||
cachePath: '${{cache.path}}'
|
||||
|
||||
# Compile dependencies
|
||||
- template: ./../../steps/make.yaml
|
||||
parameters:
|
||||
makeJob: dependencies
|
||||
makeService: ${{parameters.serviceName}}
|
||||
makeVars: 'CPU_CORES=${{parameters.dependenciesBuildCores}} STACK_CORES=-j${{parameters.dependenciesBuildCores}}'
|
||||
|
||||
# (Note: a post-job for updating the dependency cache is automatically created, so no further step is due here.)
|
||||
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
72
.azure-pipelines/templates/jobs/setup_image.yaml
Normal file
@ -0,0 +1,72 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: imageName
|
||||
type: string
|
||||
- name: imageBase
|
||||
type: object
|
||||
|
||||
jobs:
|
||||
- job: SetupImage_${{parameters.imageName}}
|
||||
displayName: Build ${{parameters.imageName}} image
|
||||
condition: eq(variables.setupImages, true)
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: devfra
|
||||
- task: Bash@3
|
||||
displayName: Build ${{parameters.imageName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/${{parameters.imageName}}/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) \
|
||||
--build-arg FROM_IMG=${{parameters.imageBase.image}} \
|
||||
--build-arg FROM_TAG=${{parameters.imageBase.tag}} \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
.
|
||||
- task: Bash@3
|
||||
displayName: Push ${{parameters.imageName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker push $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||
- task: Bash@3
|
||||
displayName: Update latest ${{parameters.imageName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker tag $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||
docker push $(buildImageUpstream)/${{parameters.imageName}}:latest
|
||||
- task: Bash@3
|
||||
displayName: Save image for publication
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker image save --output=$(Build.ArtifactStagingDirectory)/${{parameters.imageName}}.tar $(buildImageUpstream)/${{parameters.imageName}}:$(Build.BuildNumber)
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish image as artifact
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: Image_${{parameters.imageName}}
|
||||
publishLocation: 'Container'
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: devfra
|
||||
141
.azure-pipelines/templates/service.yaml
Executable file
141
.azure-pipelines/templates/service.yaml
Executable file
@ -0,0 +1,141 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: serviceName
|
||||
type: string
|
||||
default: serviceName
|
||||
- name: serviceBase
|
||||
type: object
|
||||
default:
|
||||
image: baseImage
|
||||
tag: baseImageTag
|
||||
- name: servicePool
|
||||
type: string
|
||||
default: 'Prod Private Agent Pool'
|
||||
- name: serviceTimeout
|
||||
type: number
|
||||
default: 60
|
||||
# extraBuildOptions: ''
|
||||
- name: serviceDependsOn
|
||||
type: object
|
||||
default: []
|
||||
- name: serviceRequiredArtifacts
|
||||
type: object
|
||||
default: []
|
||||
- name: serviceArtifacts
|
||||
type: string
|
||||
default: ''
|
||||
- name: buildSteps
|
||||
type: object
|
||||
|
||||
stages:
|
||||
- stage: ${{ parameters.serviceName }}
|
||||
dependsOn: ${{ parameters.serviceDependsOn }}
|
||||
pool: '${{ parameters.servicePool }}'
|
||||
jobs:
|
||||
- job: ImageBuild_${{parameters.serviceName}}
|
||||
displayName: Build ${{parameters.serviceName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true), eq(variables.onUpdateBranch, true))
|
||||
container:
|
||||
image: devfra.azurecr.io/de.fraport.build/tools:1.1.0
|
||||
endpoint: devfra
|
||||
steps:
|
||||
- checkout: self
|
||||
- task: Docker@2
|
||||
displayName: Login to container registry
|
||||
inputs:
|
||||
command: login
|
||||
containerRegistry: devFra
|
||||
- script: |
|
||||
ls -a .
|
||||
pwd
|
||||
find .
|
||||
- task: Bash@3
|
||||
displayName: Build ${{parameters.serviceName}} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
cp docker/${{parameters.serviceName}}/Dockerfile .
|
||||
docker build \
|
||||
--tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) \
|
||||
--build-arg FROM_IMG=${{parameters.serviceBase.image}} \
|
||||
--build-arg FROM_TAG=${{parameters.serviceBase.tag}} \
|
||||
--build-arg HTTPS_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg HTTP_PROXY=http://proxy.frankfurt-airport.de:8080 \
|
||||
--build-arg NO_PROXY='localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io' \
|
||||
--build-arg FRAPORT_NOPROXY=dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de \
|
||||
--build-arg PROJECT_DIR=$(Build.Repository.LocalPath) \
|
||||
--build-arg IN_CI=true \
|
||||
--build-arg IN_CONTAINER=true \
|
||||
.
|
||||
- task: Bash@3
|
||||
displayName: Push ${{ parameters.serviceName }} image
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker push $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber)
|
||||
- task: Bash@3
|
||||
displayName: Update latest ${{parameters.serviceName}} image
|
||||
condition: or(eq(variables.forcePushLatest, true), eq(variables.onMasterBranch, true))
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
docker tag $(buildImageUpstream)/${{parameters.serviceName}}:$(Build.BuildNumber) $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
docker push $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
- task: Docker@2
|
||||
displayName: Logout from container registry
|
||||
inputs:
|
||||
command: logout
|
||||
containerRegistry: devFra
|
||||
|
||||
- job: Build_${{parameters.serviceName}}
|
||||
displayName: Build ${{parameters.serviceName}}
|
||||
dependsOn:
|
||||
- ImageBuild_${{parameters.serviceName}}
|
||||
condition: in(dependencies.ImageBuild_${{parameters.serviceName}}.result, 'Succeeded', 'Skipped')
|
||||
timeoutInMinutes: ${{ parameters.serviceTimeout }}
|
||||
container:
|
||||
# TODO: use BuildNumber instead of latest in update branches
|
||||
# image: devfra.azurecr.io/de.fraport.fradrive.build/frontend:$(Build.BuildNumber)
|
||||
image: $(buildImageUpstream)/${{parameters.serviceName}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
- checkout: self
|
||||
- ${{ each dependency in parameters.serviceRequiredArtifacts }}:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts from ${{ dependency.name }} dependency
|
||||
continueOnError: ${{ dependency.continueOnError }}
|
||||
condition: ${{ dependency.condition }}
|
||||
inputs:
|
||||
artifactName: ${{ dependency.artifact }}
|
||||
source: ${{ dependency.source }}
|
||||
project: 'Fahrerausbildung'
|
||||
pipeline: $(System.DefinitionId)
|
||||
buildVersionToDownload: '${{ dependency.version }}'
|
||||
tags: '${{ dependency.artifact }}'
|
||||
allowPartiallySucceededBuilds: true
|
||||
allowFailedBuilds: true
|
||||
patterns: '${{ dependency.patterns }}'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
- ${{ each buildStep in parameters.buildSteps }}:
|
||||
- template: ./service/build-step.yaml
|
||||
parameters:
|
||||
service: ${{ parameters.serviceName }}
|
||||
buildStep: ${{ buildStep }}
|
||||
- task: CopyFiles@2
|
||||
displayName: Copy ${{parameters.serviceName}} artifacts
|
||||
inputs:
|
||||
Contents: ${{ parameters.serviceArtifacts }}
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish ${{parameters.serviceName}} artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: '${{parameters.serviceName}}'
|
||||
publishLocation: 'Container'
|
||||
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
15
.azure-pipelines/templates/steps/artifact-download.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: artifactName
|
||||
type: string
|
||||
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
displayName: Download artifacts from ${{parameters.artifactName}}
|
||||
inputs:
|
||||
source: 'current'
|
||||
artifactName: '${{parameters.artifactName}}'
|
||||
targetPath: '$(Build.Repository.LocalPath)'
|
||||
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
18
.azure-pipelines/templates/steps/cache.yaml
Normal file
@ -0,0 +1,18 @@
|
||||
# SPDX-FileCopyrightText: 2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: cacheIdent
|
||||
type: string
|
||||
- name: cacheKeys
|
||||
type: string
|
||||
- name: cachePath
|
||||
type: string
|
||||
|
||||
steps:
|
||||
- task: Cache@2
|
||||
displayName: Restore ${{parameters.cacheIdent}} cache
|
||||
inputs:
|
||||
key: '"${{parameters.cacheIdent}}" | ${{parameters.cacheKeys}}'
|
||||
path: '${{parameters.cachePath}}'
|
||||
35
.azure-pipelines/templates/steps/make.yaml
Normal file
35
.azure-pipelines/templates/steps/make.yaml
Normal file
@ -0,0 +1,35 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
parameters:
|
||||
- name: makeJob
|
||||
type: string
|
||||
values:
|
||||
- dependencies
|
||||
- compile
|
||||
- lint
|
||||
- test
|
||||
- name: makeService
|
||||
type: string
|
||||
values:
|
||||
- frontend
|
||||
- backend
|
||||
- name: makeVars
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
steps:
|
||||
- task: Bash@3
|
||||
name: ${{parameters.makeJob}}_${{parameters.makeService}}
|
||||
displayName: make ${{parameters.makeJob}}-${{parameters.makeService}}
|
||||
env:
|
||||
HTTPS_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||
HTTP_PROXY: http://proxy.frankfurt-airport.de:8080
|
||||
NO_PROXY: 'localhost,127.0.0.1,*.docker.internal,*.azmk8s.io,devfra.azurecr.io,devfra.westeurope.data.azurecr.io'
|
||||
FRAPORT_NOPROXY: 'dev.azure.com,*.dev.azure.com,*.fraport.de,*.frankfurt-airport.de'
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
make -- --${{parameters.makeJob}}-${{parameters.makeService}} IN_CONTAINER=true IN_CI=true PROJECT_DIR=${PROJECT_DIR} ${{parameters.makeVars}}
|
||||
17
.babelrc
17
.babelrc
@ -1,17 +0,0 @@
|
||||
{
|
||||
"presets": [
|
||||
["env", {
|
||||
"useBuiltIns": "usage",
|
||||
"targets": { "node": "current" }
|
||||
}
|
||||
]
|
||||
],
|
||||
"plugins": [
|
||||
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||
["@babel/plugin-proposal-class-properties", { "loose": true }],
|
||||
["@babel/plugin-proposal-private-methods", { "loose": true }],
|
||||
["@babel/plugin-proposal-private-property-in-object", { "loose": true }],
|
||||
["@babel/plugin-transform-modules-commonjs"],
|
||||
["@babel/transform-runtime"]
|
||||
]
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
**/*
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
@ -1,30 +0,0 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true,
|
||||
"jasmine": true
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"globals": {
|
||||
"Atomics": "readonly",
|
||||
"SharedArrayBuffer": "readonly",
|
||||
"flatpickr": "readonly",
|
||||
"$": "readonly"
|
||||
},
|
||||
"parser": "@babel/eslint-parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"requireConfigFile": false,
|
||||
"ecmaFeatures": {
|
||||
"legacyDecorators": true
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"no-extra-semi": "off",
|
||||
"semi": ["error", "always"],
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"quotes": ["error", "single"],
|
||||
"no-var": "error"
|
||||
}
|
||||
}
|
||||
21
.gitignore
vendored
21
.gitignore
vendored
@ -1,5 +1,10 @@
|
||||
.Dockerfile
|
||||
dist*
|
||||
develop
|
||||
node_modules/
|
||||
assets/icons
|
||||
assets/favicons
|
||||
bin/
|
||||
*.hi
|
||||
*.o
|
||||
*.sqlite3
|
||||
@ -7,7 +12,14 @@ node_modules/
|
||||
*.sqlite3-wal
|
||||
.hsenv*
|
||||
cabal-dev/
|
||||
.stack-work/
|
||||
.cache/
|
||||
.stack/
|
||||
.stack-work
|
||||
.job-*/
|
||||
.dev-port-http
|
||||
.dev-port-https
|
||||
.bash_history
|
||||
.lesshst
|
||||
yesod-devel/
|
||||
.cabal-sandbox
|
||||
cabal.sandbox.config
|
||||
@ -25,6 +37,7 @@ uniworx.nix
|
||||
.kateproject
|
||||
src/Handler/Assist.bak
|
||||
src/Handler/Course.SnapCustom.hs
|
||||
frontend/src/env.sass
|
||||
*.orig
|
||||
/instance
|
||||
.stack-work-*
|
||||
@ -34,7 +47,8 @@ test.log
|
||||
*.dump-splices
|
||||
/.stack-work.lock
|
||||
/.npmrc
|
||||
/config/webpack.yml
|
||||
/.npm/
|
||||
/config/manifest.json
|
||||
tunnel.log
|
||||
/static
|
||||
/well-known
|
||||
@ -51,4 +65,5 @@ tunnel.log
|
||||
**/result
|
||||
**/result-*
|
||||
.develop.cmd
|
||||
/.vscode
|
||||
/.vscode
|
||||
.ghc/ghci_history
|
||||
|
||||
1053
.gitlab-ci.yml
1053
.gitlab-ci.yml
File diff suppressed because it is too large
Load Diff
77
.gitlab-ci/backend.yml
Normal file
77
.gitlab-ci/backend.yml
Normal file
@ -0,0 +1,77 @@
|
||||
# SPDX-FileCopyrightText: 2024 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
### IMPORTANT NOTICE ###
|
||||
# Our pipeline consists of static and dynamic parts.
|
||||
#
|
||||
# This file only contains the dynamic backend parts of our pipeline.
|
||||
# Static jobs are defined in .gitlab-ci.yml.
|
||||
#
|
||||
# The marker "#dyn#" (without quotes) will be replaced by concrete values.
|
||||
###
|
||||
|
||||
variables:
|
||||
BACKEND_IMAGE_VERSION: #dyn#
|
||||
PARENT_PIPELINE_ID: #dyn#
|
||||
|
||||
stages:
|
||||
- compile
|
||||
- lint
|
||||
- test
|
||||
- release
|
||||
|
||||
default:
|
||||
image:
|
||||
name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/backend:${BACKEND_IMAGE_VERSION}
|
||||
entrypoint: [""]
|
||||
docker:
|
||||
platform: x86_64
|
||||
before_script:
|
||||
- ./.gitlab-ci/pull-frontend-artifacts.pl "${REGISTRY_AUTH_TOKEN}" "${PARENT_PIPELINE_ID}"
|
||||
- unzip ./.artifacts.tmp/artifacts.zip
|
||||
artifacts:
|
||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||
expire_in: "1 day"
|
||||
retry: 2
|
||||
interruptible: true
|
||||
|
||||
|
||||
compile:
|
||||
stage: compile
|
||||
script:
|
||||
- make -- compile${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||
artifacts:
|
||||
paths:
|
||||
- ${CI_PROJECT_DIR}/.stack-work/
|
||||
- bin/
|
||||
cache: &backend-cache
|
||||
|
||||
lint:
|
||||
stage: lint
|
||||
script:
|
||||
- make -- lint${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||
cache: *backend-cache
|
||||
|
||||
test:
|
||||
stage: test
|
||||
needs:
|
||||
- compile
|
||||
script:
|
||||
- make -- test${PROD_BUILD}-backend IN_CI=true IN_CONTAINER=true
|
||||
cache: *backend-cache
|
||||
|
||||
container:
|
||||
stage: release
|
||||
image: ${IMAGE_BUILDER}
|
||||
needs:
|
||||
- compile
|
||||
- lint
|
||||
- test
|
||||
script:
|
||||
- IMAGE_TAG=`./.gitlab-ci/version.pl`
|
||||
- buildah bud -t ${IMAGE_TAG} --volume ${CI_PROJECT_DIR}/bin/:/tmp/uniworx-bin --file docker/fradrive/Dockerfile
|
||||
- buildah push --creds "${CI_REGISTRY_USER}:${CI_JOB_TOKEN}" ${IMAGE_TAG} ${CI_REGISTRY_IMAGE}/${IMAGE_TAG}
|
||||
rules:
|
||||
- if: '"${PROD_BUILD}" == "-prod"'
|
||||
when: always
|
||||
@ -1,25 +0,0 @@
|
||||
diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc
|
||||
index 514ab3bf9..25dab18bb 100644
|
||||
--- a/src/libstore/filetransfer.cc
|
||||
+++ b/src/libstore/filetransfer.cc
|
||||
@@ -696,6 +696,8 @@ struct curlFileTransfer : public FileTransfer
|
||||
std::string scheme = get(params, "scheme").value_or("");
|
||||
std::string endpoint = get(params, "endpoint").value_or("");
|
||||
|
||||
+ debug("enqueueFileTransfer: scheme: %s", scheme);
|
||||
+
|
||||
S3Helper s3Helper(profile, region, scheme, endpoint);
|
||||
|
||||
// FIXME: implement ETag
|
||||
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
|
||||
index 6bfbee044..ff406e5e4 100644
|
||||
--- a/src/libstore/s3-binary-cache-store.cc
|
||||
+++ b/src/libstore/s3-binary-cache-store.cc
|
||||
@@ -126,6 +126,7 @@ ref<Aws::Client::ClientConfiguration> S3Helper::makeConfig(const string & region
|
||||
initAWS();
|
||||
auto res = make_ref<Aws::Client::ClientConfiguration>();
|
||||
res->region = region;
|
||||
+ debug("configuring scheme %s", scheme);
|
||||
if (!scheme.empty()) {
|
||||
res->scheme = Aws::Http::SchemeMapper::FromString(scheme.c_str());
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
43
.gitlab-ci/dynamci.pl
Executable file
43
.gitlab-ci/dynamci.pl
Executable file
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my %kv = ();
|
||||
|
||||
for(@ARGV) {
|
||||
if(!m#^\s*([^=\s]+)\s*=\s*(.*?)\s*$#) {
|
||||
die "$0: Bad parameter '$_': Not a key=value pair\n"
|
||||
}
|
||||
$kv{$1} = $2;
|
||||
}
|
||||
|
||||
my $invar = 0;
|
||||
|
||||
LOOP: while(my $line = <STDIN>) {
|
||||
if(1==$invar) {
|
||||
if($line=~m/^(\s+)(\S+)(\s*:\s*)(\S+)(.*)/) {
|
||||
my ($pre1, $key, $pre2, $var, $post) = ($1, $2, $3, $4, $5);
|
||||
if('#dyn#' eq $var) {
|
||||
if(not exists $kv{$key}) {
|
||||
die "$0: No value given for key '$key' in the parameters but it is defined in input!\n"
|
||||
}
|
||||
my $v = $kv{$key};
|
||||
delete $kv{$key};
|
||||
print "$pre1$key$pre2$v$post\n";
|
||||
next LOOP;
|
||||
}
|
||||
} elsif($line=~m/^[^#\t ]/) {
|
||||
$invar = 2
|
||||
}
|
||||
}
|
||||
if(0==$invar and $line=~m#^\s*variables\s*:\s*$#) {
|
||||
$invar = 1;
|
||||
}
|
||||
print $line;
|
||||
}
|
||||
|
||||
my @rem = sort keys %kv;
|
||||
|
||||
die "$0: Variables occur in parameter but not in input: @rem!\n" if @rem;
|
||||
|
||||
@ -1,13 +0,0 @@
|
||||
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
|
||||
index 6bfbee044..51d86c4e6 100644
|
||||
--- a/src/libstore/s3-binary-cache-store.cc
|
||||
+++ b/src/libstore/s3-binary-cache-store.cc
|
||||
@@ -209,7 +209,7 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
|
||||
S3Helper s3Helper;
|
||||
|
||||
S3BinaryCacheStoreImpl(
|
||||
- const std::string & scheme,
|
||||
+ const std::string & uriScheme,
|
||||
const std::string & bucketName,
|
||||
const Params & params)
|
||||
: StoreConfig(params)
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
63
.gitlab-ci/frontend.yml
Normal file
63
.gitlab-ci/frontend.yml
Normal file
@ -0,0 +1,63 @@
|
||||
# SPDX-FileCopyrightText: 2024 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
### IMPORTANT NOTICE ###
|
||||
# Our pipeline consists of static and dynamic parts.
|
||||
#
|
||||
# This file only contains the dynamic frontend parts of our pipeline.
|
||||
# Static jobs are defined in .gitlab-ci.yml.
|
||||
#
|
||||
# The marker "#dyn#" (without quotes) will be replaced by concrete values.
|
||||
###
|
||||
|
||||
variables:
|
||||
FRONTEND_IMAGE_VERSION: #dyn#
|
||||
|
||||
stages:
|
||||
- compile
|
||||
- lint
|
||||
- test
|
||||
|
||||
default:
|
||||
image:
|
||||
name: ${CI_REGISTRY_IMAGE}/${CI_COMMIT_REF_SLUG}/frontend:${FRONTEND_IMAGE_VERSION}
|
||||
entrypoint: [""]
|
||||
docker:
|
||||
platform: x86_64
|
||||
artifacts:
|
||||
name: "${CI_JOB_NAME}-${CI_COMMIT_SHORT_SHA}"
|
||||
expire_in: "1 day"
|
||||
retry: 2
|
||||
interruptible: true
|
||||
|
||||
|
||||
compile:
|
||||
stage: compile
|
||||
script:
|
||||
- make -- compile-frontend IN_CI=true IN_CONTAINER=true
|
||||
artifacts:
|
||||
paths:
|
||||
- ${CI_PROJECT_DIR}/node_modules
|
||||
- ${CI_PROJECT_DIR}/well-known
|
||||
- ${CI_PROJECT_DIR}/config/webpack.yml
|
||||
cache:
|
||||
- &frontend-cache
|
||||
key: default-frontend
|
||||
paths:
|
||||
- ${CI_PROJECT_DIR}/.npm/
|
||||
- ${CI_PROJECT_DIR}/.well-known-cache/
|
||||
|
||||
lint:
|
||||
stage: lint
|
||||
script:
|
||||
- make -- lint-frontend IN_CI=true IN_CONTAINER=true
|
||||
cache: *frontend-cache
|
||||
|
||||
test:
|
||||
stage: test
|
||||
needs:
|
||||
- compile
|
||||
script:
|
||||
- make -- test-frontend IN_CI=true IN_CONTAINER=true
|
||||
cache: *frontend-cache
|
||||
@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#!/usr/bin/bash
|
||||
|
||||
export MC_HOST_minio=http://$(cat /minio-gitlab-runner-cache/accesskey):$(cat /minio-gitlab-runner-cache/secretkey)@minio-gitlab-runner-cache
|
||||
|
||||
mc mb --ignore-existing minio/nix-cache
|
||||
@ -1,8 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
{ pkgs ? import <nixpkgs> {} }:
|
||||
pkgs.nixUnstable.overrideAttrs (oldAttrs: {
|
||||
patches = oldAttrs.patches or [] ++ [ ./fix-aws-scheme.patch ];
|
||||
})
|
||||
52
.gitlab-ci/pull-frontend-artifacts.pl
Executable file
52
.gitlab-ci/pull-frontend-artifacts.pl
Executable file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my $dir = ".artifacts.tmp";
|
||||
my ($token, $id) = @ARGV;
|
||||
die "usage: $0 [token] [id]" unless defined $token and defined $id;
|
||||
die "id in bad format" unless $id=~m#^[0-9]+$#;
|
||||
|
||||
if(!-d $dir) {
|
||||
mkdir($dir) or die "Cannot create directory '$dir', because: $!\n";
|
||||
}
|
||||
|
||||
system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$id/bridges" > $dir/bridges));
|
||||
my $pips = pparse("$dir/bridges", {id=>qq#."downstream_pipeline"."id"#}, {name=>""});
|
||||
|
||||
my $fe = $pips->{frontend}{id};
|
||||
|
||||
die "No frontend pipeline found!" unless $fe;
|
||||
|
||||
system(qq(curl --globoff --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/pipelines/$fe/jobs" > $dir/fe-jobs));
|
||||
my $arte = pparse("$dir/fe-jobs", {id=>""}, {name=>"", web_url=>"", artifacts=>""});
|
||||
|
||||
system(qq#curl --output $dir/artifacts.zip --location --header "PRIVATE-TOKEN: $token" "https://gitlab.uniworx.de/api/v4/projects/5/jobs/$arte->{compile}{id}/artifacts"#);
|
||||
|
||||
|
||||
sub pparse {
|
||||
my ($file, $numerical, $alpha) = @_;
|
||||
my %all = ();
|
||||
for my $k(keys %$numerical) {
|
||||
$all{$k} = $numerical->{$k} || qq#."$k"#;
|
||||
}
|
||||
for my $k(keys %$alpha) {
|
||||
$all{$k} = $alpha->{$k} || qq#."$k"#;
|
||||
}
|
||||
my $select = join ', ', map {qq#"$_": $all{$_}#} sort keys %all;
|
||||
my $cont = qx(cat $file | jq -c '.[] | {$select}');
|
||||
my @cont = split m/\R/, $cont;
|
||||
my %ret = ();
|
||||
for my $c(@cont) {
|
||||
my %block = ();
|
||||
for(keys %$numerical) {
|
||||
$block{$_} = $1 if $c=~m#"$_":([0-9]+)#;
|
||||
}
|
||||
for(keys %$alpha) {
|
||||
$block{$_} = $1 if $c=~m#"$_":"([^"]*)"#;
|
||||
}
|
||||
$ret{$block{name}} =\%block;
|
||||
}
|
||||
return \%ret
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -eu
|
||||
set -f # disable globbing
|
||||
export IFS=' '
|
||||
|
||||
echo "Signing and uploading paths" $OUT_PATHS
|
||||
exec nix copy --to "s3://nix-cache?region=us-east-1&scheme=http&endpoint=minio-gitlab-runner-cache&secret-key=${NIX_CACHE_KEYFILE}" $OUT_PATHS
|
||||
@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
#!/usr/bin/bash
|
||||
|
||||
mkdir -p $(dirname ${AWS_SHARED_CREDENTIALS_FILE})
|
||||
cat > ${AWS_SHARED_CREDENTIALS_FILE} <<EOF
|
||||
[default]
|
||||
aws_access_key_id = $(cat /minio-gitlab-runner-cache/accesskey)
|
||||
aws_secret_access_key = $(cat /minio-gitlab-runner-cache/secretkey)
|
||||
EOF
|
||||
28
.gnumake/Error.Mak
Normal file
28
.gnumake/Error.Mak
Normal file
@ -0,0 +1,28 @@
|
||||
# This Makefile contains targets that are deprecated, commonly mispelled or otherwise "faulty".
|
||||
|
||||
################################
|
||||
##### DEPRECATED TARGETS #####
|
||||
|
||||
# Deprecated since: 2024-10-18
|
||||
.PHONY: serve
|
||||
.PHONY: serve-%
|
||||
serve-%: serve;
|
||||
serve:
|
||||
@echo "The serve targets have been deprecated. Please use the new start (and stop) targets instead."
|
||||
@exit 1
|
||||
|
||||
##### DEPRECATED TARGETS #####
|
||||
################################
|
||||
|
||||
#############################
|
||||
##### COMMON MISTAKES #####
|
||||
|
||||
.PHONY: build
|
||||
.PHONY: build-%
|
||||
build-%: build;
|
||||
build:
|
||||
@echo "No recipe for build. Did you mean compile?"
|
||||
@exit 1
|
||||
|
||||
##### COMMON MISTAKES #####
|
||||
#############################
|
||||
12
.npmrc.gup
12
.npmrc.gup
@ -1,12 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
if command -V gup 1>&- 2>&-; then
|
||||
gup --always
|
||||
fi
|
||||
|
||||
cat >${1:-.npmrc} <<EOF
|
||||
@fortawesome:registry=https://npm.fontawesome.com/
|
||||
//npm.fontawesome.com/:_authToken=${FONTAWESOME_NPM_AUTH_TOKEN}
|
||||
EOF
|
||||
9
.reuse/dep5
Normal file
9
.reuse/dep5
Normal file
@ -0,0 +1,9 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: FraDrive
|
||||
Upstream-Contact: Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
Source: https://gitlab.uniworx.de/fradrive/fradrive
|
||||
|
||||
Files: assets/fonts/fradrive/*
|
||||
Copyright: 2010 Google Corporation with Reserved Font Arimo, Tinos and Cousine
|
||||
Copyright: 2012 Red Hat, Inc. with Reserved Font Name Liberation
|
||||
License: OFL-1.1-RFN
|
||||
@ -7,33 +7,33 @@ const standardVersionUpdaterYaml = require.resolve('standard-version-updater-yam
|
||||
module.exports = {
|
||||
scripts: {
|
||||
// postbump: './sync-versions.hs && git add -- package.yaml', // moved to bumpFiles
|
||||
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md'
|
||||
postchangelog: 'sed \'s/^### \\[/## [/g\' -i CHANGELOG.md',
|
||||
},
|
||||
packageFiles: ['package.json', 'package.yaml'],
|
||||
bumpFiles: [
|
||||
{
|
||||
filename: 'package.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'package-lock.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'package.yaml',
|
||||
updater: standardVersionUpdaterYaml
|
||||
updater: standardVersionUpdaterYaml,
|
||||
},
|
||||
{
|
||||
filename: 'nix/docker/version.json',
|
||||
type: 'json'
|
||||
type: 'json',
|
||||
},
|
||||
{
|
||||
filename: 'nix/docker/demo-version.json',
|
||||
type: 'json'
|
||||
}
|
||||
type: 'json',
|
||||
},
|
||||
],
|
||||
commitUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/{{hash}}',
|
||||
compareUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/{{previousTag}}...{{currentTag}}',
|
||||
issueUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/issues/{{id}}',
|
||||
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}'
|
||||
userUrlFormat: 'https://gitlab2.rz.ifi.lmu.de/{{user}}',
|
||||
};
|
||||
|
||||
73
CHANGELOG.md
73
CHANGELOG.md
@ -2,6 +2,79 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
## [v27.4.59-test-g0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.17...v27.4.59-test-g0.0.17) (2025-02-18)
|
||||
|
||||
## [v27.4.59-test-f0.0.17](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-g0.0.16...v27.4.59-test-f0.0.17) (2025-02-17)
|
||||
|
||||
## [v27.4.59-test-g0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.16...v27.4.59-test-g0.0.16) (2025-02-16)
|
||||
|
||||
## [v27.4.59-test-f0.0.16](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.15...v27.4.59-test-f0.0.16) (2025-02-16)
|
||||
|
||||
## [v27.4.59-test-f0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.15...v27.4.59-test-f0.0.15) (2025-02-15)
|
||||
|
||||
## [v27.4.59-test-e0.0.15](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-f0.0.14...v27.4.59-test-e0.0.15) (2025-02-14)
|
||||
|
||||
## [v27.4.59-test-f0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.14...v27.4.59-test-f0.0.14) (2025-02-14)
|
||||
|
||||
## [v27.4.59-test-e0.0.14](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.13...v27.4.59-test-e0.0.14) (2025-02-13)
|
||||
|
||||
## [v27.4.59-test-e0.0.13](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-e0.0.12...v27.4.59-test-e0.0.13) (2025-02-12)
|
||||
|
||||
## [v27.4.59-test-e0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.12...v27.4.59-test-e0.0.12) (2025-02-12)
|
||||
|
||||
## [v27.4.59-test-d0.0.12](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-d0.0.11...v27.4.59-test-d0.0.12) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-d0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.11...v27.4.59-test-d0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-c0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.11...v27.4.59-test-c0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-b0.0.11](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-c0.0.10...v27.4.59-test-b0.0.11) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-c0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-b0.0.10...v27.4.59-test-c0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-b0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.10...v27.4.59-test-b0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-a0.0.10](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.9...v27.4.59-test-a0.0.10) (2025-02-11)
|
||||
|
||||
## [v27.4.59-test-a0.0.9](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.8...v27.4.59-test-a0.0.9) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.8](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.7...v27.4.59-test-a0.0.8) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.7](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.6...v27.4.59-test-a0.0.7) (2025-02-10)
|
||||
|
||||
## [v27.4.59-test-a0.0.6](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.5...v27.4.59-test-a0.0.6) (2025-02-08)
|
||||
|
||||
## [v27.4.59-test-a0.0.5](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.4...v27.4.59-test-a0.0.5) (2025-02-07)
|
||||
|
||||
## [v27.4.59-test-a0.0.4](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.3...v27.4.59-test-a0.0.4) (2025-02-07)
|
||||
|
||||
## [v27.4.59-test-a0.0.3](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.2...v27.4.59-test-a0.0.3) (2025-02-06)
|
||||
|
||||
## [v27.4.59-test-a0.0.2](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.1...v27.4.59-test-a0.0.2) (2025-02-05)
|
||||
|
||||
## [v27.4.59-test-a0.0.1](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59-test-a0.0.0...v27.4.59-test-a0.0.1) (2025-02-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **ghci:** ghci works now as expected ([c3117db](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/c3117dbdcd1de9ef9f0751afa45018e2ebce2c42))
|
||||
|
||||
## [v27.4.59-test-a0.0.0](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive//compare/v27.4.59...v27.4.59-test-a0.0.0) (2024-10-25)
|
||||
|
||||
### Features
|
||||
|
||||
* **util script:** Util script for renaming of files added. ([caf8fec](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/caf8fec5acb94df16293bf9aa0cdab766f8829e8))
|
||||
* **frontend:** load icons from svg files ([22781e1](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/22781e1565e890cf6c5b40973146b0334cb667aa))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **stack.yaml:** move to uniworx.de gitlab ([55484e6](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/55484e631b786ea3710d322282019baf5292c243))
|
||||
* **utils/renamer:** Mehr outputs nur im verbose-Fall. ([ac30cb9](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/ac30cb9e6712d0ee3f204da4863d1e2509af8a76))
|
||||
* **utils:** Verboseparameter -v hinzugefuegt; rekursives makedir; genauere Meldungen. ([1806d9f](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/1806d9f01fc4a0746d2f9df42ef1ee6827c7fa09))
|
||||
* **Dockerfile:** change rights of source dir to env user ([e7a8183](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/e7a8183656ae419cfee2942543045c6fa6a9caa3))
|
||||
* **Makefile:** add missing dependency on well-known for backend-builds ([a09dc59](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/a09dc59f260843f8815c382576bb5254d21104bf))
|
||||
* **frontend:** fixed icon colour in table headers ([4c4571d](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/4c4571d2d0879e89f2572eba6015d34a7f4794c8))
|
||||
* **doc:** minor haddock problems ([d4f8a6c](https://fraport@dev.azure.com/fraport/Fahrerausbildung/_git/FRADrive/commit/d4f8a6c77b2a4a4540935f7f0beca0d0605508c8))
|
||||
|
||||
## [28.1.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/t28.1.0...t28.1.1) (2024-04-22)
|
||||
|
||||
## [28.1.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/t28.0.10...t28.1.0) (2024-04-18)
|
||||
|
||||
102
LICENSES/OFL-1.1-RFN.txt
Normal file
102
LICENSES/OFL-1.1-RFN.txt
Normal file
@ -0,0 +1,102 @@
|
||||
Digitized data copyright (c) 2010 Google Corporation
|
||||
with Reserved Font Arimo, Tinos and Cousine.
|
||||
Copyright (c) 2012 Red Hat, Inc.
|
||||
with Reserved Font Name Liberation.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
|
||||
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
|
||||
worldwide development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to provide
|
||||
a free and open framework in which fonts may be shared and improved in
|
||||
partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves.
|
||||
The fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such.
|
||||
This may include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components
|
||||
as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting ? in part or in whole ?
|
||||
any of the components of the Original Version, by changing formats or
|
||||
by porting the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical writer
|
||||
or other person who contributed to the Font Software.
|
||||
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must
|
||||
be distributed entirely under this license, and must not be distributed
|
||||
under any other license. The requirement for fonts to remain under
|
||||
this license does not apply to any document created using the Font
|
||||
Software.
|
||||
|
||||
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
||||
DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
417
Makefile
Normal file
417
Makefile
Normal file
@ -0,0 +1,417 @@
|
||||
|
||||
export SHELL=bash
|
||||
|
||||
# MAKE=make -f Makefile-loggingsymbols
|
||||
# MAKE=make -d
|
||||
|
||||
# System information
|
||||
export CPU_CORES = $(shell cat /proc/cpuinfo | grep '^processor' | wc -l)
|
||||
|
||||
export CONTAINER_COMMAND ?= podman
|
||||
export CONTAINER_BGRUN ?= $(CONTAINER_COMMAND) run -dit --network=host --replace
|
||||
export CONTAINER_FGRUN ?= $(CONTAINER_COMMAND) run -it --network=host --replace
|
||||
|
||||
export IMAGE_REGISTRY = docker.io
|
||||
export MEMCACHED_IMAGE = $(IMAGE_REGISTRY)/memcached:latest
|
||||
export MINIO_IMAGE = $(IMAGE_REGISTRY)/minio/minio:latest
|
||||
export MAILDEV_IMAGE = $(IMAGE_REGISTRY)/maildev/maildev:latest # TODO: needs different port than 1025 to avoid conflicts
|
||||
|
||||
export IN_CONTAINER ?= false
|
||||
export IN_CI ?= false
|
||||
export CONTAINER_FILE
|
||||
export CONTAINER_IDENT
|
||||
export CF_PREFIX
|
||||
export DEVELOP
|
||||
export CONTAINER_ATTACHED
|
||||
export CONTAINER_INIT
|
||||
export CONTAINER_CLEANUP
|
||||
export PROJECT_DIR=/fradrive
|
||||
|
||||
export SERVICE
|
||||
export SERVICE_VARIANT ?= $(SERVICE)
|
||||
export JOB
|
||||
export IMAGE
|
||||
export SET_IMAGE
|
||||
export ENTRYPOINT
|
||||
export EXEC_OPTS
|
||||
|
||||
export STACK_CORES = $(shell echo $(($(CPU_CORES)/2)))
|
||||
export BASE_PORTS
|
||||
export UNIWORXDB_OPTS ?= -cf
|
||||
export PROD ?= false
|
||||
export SRC
|
||||
|
||||
ifneq ($(PROD),true)
|
||||
export --DEVELOPMENT=--flag uniworx:dev
|
||||
endif
|
||||
|
||||
export DATE := $(shell date +'%Y-%m-%dT%H-%M-%S')
|
||||
|
||||
export CURR_DEV = $(shell cat develop/.current 2>/dev/null)
|
||||
export SET_DEVELOP = $(eval DEVELOP=develop/$$(CURR_DEV))
|
||||
export NEW_DEVELOP = $(eval DEVELOP=develop/$$(DATE))
|
||||
|
||||
|
||||
.PHONY: help
|
||||
# HELP: print out this help message
|
||||
help:
|
||||
@if [ -z "$$(which perl 2>/dev/null)" ] ; then \
|
||||
$(CONTAINER_FGRUN) .:/mnt 'debian:12.5' '/mnt/utils/makehelp.pl' '/mnt/Makefile' ; \
|
||||
else \
|
||||
utils/makehelp.pl Makefile ; \
|
||||
fi
|
||||
|
||||
.PHONY: clean
|
||||
# HELP: stop all running containers and remove all compilation results in the directory (but leave images including dependencies unharmed)
|
||||
clean:
|
||||
rm -rf develop
|
||||
-rm -rf node_modules .npm .cache assets/icons assets/favicons static well-known config/manifest.json frontend/src/env.sass
|
||||
-rm -rf .stack-work .stack-work.lock
|
||||
-rm -rf bin .Dockerfile develop
|
||||
-$(CONTAINER_COMMAND) container prune --force
|
||||
.PHONY: clean-all
|
||||
# HELP: like clean but with full container, image, and volume prune
|
||||
clean-all: clean
|
||||
-rm -rf .stack
|
||||
-$(CONTAINER_COMMAND) system prune --all --force --volumes
|
||||
-$(CONTAINER_COMMAND) image prune --all --force
|
||||
-$(CONTAINER_COMMAND) volume prune --force
|
||||
|
||||
.PHONY: release
|
||||
# HELP: create, commit and push a new release
|
||||
# TODO: only release when build and tests are passing!!!
|
||||
release:
|
||||
VERSION=`./utils/version.pl -changelog CHANGELOG.md -v` ; \
|
||||
git add CHANGELOG.md ; \
|
||||
git commit -m "chore(release): $${VERSION}" ; \
|
||||
git push ; \
|
||||
git tag $${VERSION} ; \
|
||||
git push origin $${VERSION}
|
||||
|
||||
.PHONY: compile
|
||||
compile:
|
||||
$(MAKE) compile-frontend
|
||||
$(MAKE) compile-backend
|
||||
|
||||
.PHONY: start
|
||||
start:
|
||||
$(MAKE) start-postgres
|
||||
$(MAKE) start-memcached
|
||||
$(MAKE) start-minio
|
||||
$(MAKE) compile-frontend
|
||||
$(MAKE) start-backend
|
||||
|
||||
.PHONY: %-backend
|
||||
%-backend: SERVICE=backend
|
||||
%-backend: SERVICE_VARIANT=backend
|
||||
%-backend: IMAGE=localhost/fradrive/backend
|
||||
%-backend: BASE_PORTS = "DEV_PORT_HTTP=3000" "DEV_PORT_HTTPS=3443"
|
||||
|
||||
.PHONY: %-uniworxdb
|
||||
%-uniworxdb: SERVICE=backend
|
||||
%-uniworxdb: SERVICE_VARIANT=uniworxdb
|
||||
%-uniworxdb: IMAGE=localhost/fradrive/backend
|
||||
|
||||
.PHONY: %-ghci
|
||||
%-ghci: SERVICE=backend
|
||||
%-ghci: SERVICE_VARIANT=ghci
|
||||
%-ghci: IMAGE=localhost/fradrive/backend
|
||||
|
||||
.PHONY: %-hoogle
|
||||
%-hoogle: SERVICE=backend
|
||||
%-hoogle: SERVICE_VARIANT=hoogle
|
||||
%-hoogle: BASE_PORTS = "HOOGLE_PORT=8081"
|
||||
%-hoogle: IMAGE=localhost/fradrive/backend
|
||||
--start-hoogle:
|
||||
HOOGLE_PORT=`cat $(CONTAINER_FILE) | grep 'HOOGLE_PORT=' | sed 's/HOOGLE_PORT=//'` ; \
|
||||
stack $(STACK_CORES) hoogle -- server --local --port $${HOOGLE_PORT}
|
||||
|
||||
.PHONY: %-frontend
|
||||
%-frontend: SERVICE=frontend
|
||||
%-frontend: SERVICE_VARIANT=frontend
|
||||
%-frontend: IMAGE=localhost/fradrive/frontend
|
||||
|
||||
.PHONY: %-postgres
|
||||
%-postgres: SERVICE=postgres
|
||||
%-postgres: SERVICE_VARIANT=postgres
|
||||
%-postgres: BASE_PORTS = "PGPORT=5432"
|
||||
%-postgres: IMAGE=localhost/fradrive/postgres
|
||||
|
||||
.PHONY: %-memcached
|
||||
%-memcached: SERVICE=memcached
|
||||
%-memcached: SERVICE_VARIANT=memcached
|
||||
%-memcached: SET_IMAGE=$$(MEMCACHED_IMAGE) --port=`cat $$(CONTAINER_FILE) | grep 'MEMCACHED_PORT=' | sed 's/MEMCACHED_PORT=//'`
|
||||
%-memcached: BASE_PORTS = "MEMCACHED_PORT=11211"
|
||||
|
||||
.PHONY: %-minio
|
||||
%-minio: SERVICE=minio
|
||||
%-minio: SERVICE_VARIANT=minio
|
||||
%-minio: SET_IMAGE=$$(MINIO_IMAGE) -- server `mktemp` --address=:`cat $$(CONTAINER_FILE) | grep 'UPLOAD_S3_PORT=' | sed 's/UPLOAD_S3_PORT=//'`
|
||||
%-minio: BASE_PORTS = "UPLOAD_S3_PORT=9000"
|
||||
|
||||
.PHONY: start-%
|
||||
start-%: JOB=start
|
||||
start-%: CF_PREFIX = start-
|
||||
start-%: CONTAINER_ATTACHED = false
|
||||
start-%: --act ;
|
||||
|
||||
.PHONY: compile-%
|
||||
compile-%: JOB=compile
|
||||
compile-%: CF_PREFIX = compile-
|
||||
compile-%: CONTAINER_ATTACHED = true
|
||||
compile-%: --act ;
|
||||
|
||||
.PHONY: dependencies-%
|
||||
dependencies-%: JOB=dependencies
|
||||
dependencies-%: CF_PREFIX = dependencies-
|
||||
dependencies-%: CONTAINER_ATTACHED = true
|
||||
dependencies-%: --act ;
|
||||
|
||||
.PHONY: test-%
|
||||
test-%: JOB=test
|
||||
test-%: CF_PREFIX = test-
|
||||
test-%: CONTAINER_ATTACHED = true
|
||||
test-%: --act ;
|
||||
|
||||
.PHONY: lint-%
|
||||
lint-%: JOB=lint
|
||||
lint-%: CF_PREFIX = lint-
|
||||
lint-%: CONTAINER_ATTACHED = true
|
||||
lint-%: --act ;
|
||||
|
||||
.PHONY: shell-%
|
||||
# HELP(shell-$SERVICE): launch (bash) shell inside a new $SERVICE container
|
||||
shell-%: JOB=shell
|
||||
shell-%: CF_PREFIX=shell-
|
||||
shell-%: CONTAINER_ATTACHED=true
|
||||
shell-%: --act ;
|
||||
.PHONY: ghci
|
||||
# HELP(ghci): launch new backend instance and enter interactive ghci shell
|
||||
ghci: shell-ghci;
|
||||
|
||||
--act: --develop_containerized;
|
||||
|
||||
--develop_%: PORTS = $(foreach PORT,$(BASE_PORTS),$(shell utils/next_free_port.pl $(PORT)))
|
||||
--develop_%: --ensure-develop
|
||||
DEVELOP=develop/`cat develop/.current` ; \
|
||||
CONTAINER_IDENT=$(CF_PREFIX)$(SERVICE_VARIANT) ; \
|
||||
CONTAINER_FILE=$${DEVELOP}/$${CONTAINER_IDENT} ; \
|
||||
if [[ -e $${CONTAINER_FILE} ]]; then \
|
||||
>&2 echo "Another $* service is already running! Use \"make new-develop\" to start a new develop instance despite currently running services." ; \
|
||||
exit 1 ; \
|
||||
fi ; \
|
||||
echo "$(PORTS)" | sed 's/ /\n/g' > $${CONTAINER_FILE} ; \
|
||||
$(MAKE) -- --$* CONTAINER_FILE=$${CONTAINER_FILE} CONTAINER_IDENT=$${CONTAINER_IDENT} JOB=$(JOB)
|
||||
|
||||
.PHONY: rebuild-%
|
||||
# HELP(rebuild-{backend,frontend,database,memcached,minio}): force-rebuild a given container image
|
||||
rebuild-%:
|
||||
$(MAKE) -- --image-build SERVICE=$* NO_CACHE=--no-cache
|
||||
--image-build:
|
||||
ifeq "$(IMAGE)" "localhost/fradrive/$(SERVICE)"
|
||||
rm -f .Dockerfile
|
||||
ln -s docker/$(SERVICE)/Dockerfile .Dockerfile
|
||||
PROJECT_DIR=/fradrive; \
|
||||
if [ "$(IN_CONTAINER)" == "false" ] ; then \
|
||||
$(CONTAINER_COMMAND) build $(NO_CACHE) \
|
||||
-v $(PWD):$${PROJECT_DIR}:rw \
|
||||
--build-arg PROJECT_DIR=$${PROJECT_DIR} \
|
||||
--env IN_CONTAINER=true \
|
||||
--env JOB=$(JOB) \
|
||||
--tag fradrive/$(SERVICE) \
|
||||
--file $(PWD)/.Dockerfile ; \
|
||||
fi
|
||||
else
|
||||
:
|
||||
endif
|
||||
|
||||
--containerized: --image-build
|
||||
DEVELOP=`cat develop/.current` ; \
|
||||
./utils/watchcontainerrun.sh "$(CONTAINER_COMMAND)" "$(CONTAINER_FILE)" "$(CONTAINER_INIT)" "$(CONTAINER_CLEANUP)" & \
|
||||
CONTAINER_NAME=fradrive.$(CURR_DEV).$(CONTAINER_IDENT) ; \
|
||||
if ! [ -z "$(SET_IMAGE)" ] ; \
|
||||
then \
|
||||
IMAGE="$(SET_IMAGE)" ; \
|
||||
else \
|
||||
IMAGE=$(IMAGE) ; \
|
||||
fi ; \
|
||||
CONTAINER_ID=`$(CONTAINER_BGRUN) \
|
||||
-v $(PWD):$(PROJECT_DIR):rw \
|
||||
--env IN_CONTAINER=true \
|
||||
--env CONTAINER_FILE=$(CONTAINER_FILE) \
|
||||
--env CONTAINER_NAME=$${CONTAINER_NAME} \
|
||||
--env JOB=$(JOB) \
|
||||
--env SRC=$(SRC) \
|
||||
--name $${CONTAINER_NAME} \
|
||||
$${IMAGE} \
|
||||
make -- --$(JOB)-$(SERVICE_VARIANT) IN_CONTAINER=true \
|
||||
` ; \
|
||||
printf "CONTAINER_ID=$${CONTAINER_ID}" >> "$(CONTAINER_FILE)" ; \
|
||||
if [[ "true" == "$(CONTAINER_ATTACHED)" ]] ; then \
|
||||
$(CONTAINER_COMMAND) attach $${CONTAINER_ID} || : ; \
|
||||
fi
|
||||
|
||||
# For Reverse Proxy Problem see: https://groups.google.com/g/yesodweb/c/2EO53kSOuy0/m/Lw6tq2VYat4J
|
||||
# HELP(start-backend): start development instance
|
||||
--start-backend:
|
||||
export YESOD_IP_FROM_HEADER=true; \
|
||||
export DEV_PORT_HTTP=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTP=' | sed 's/DEV_PORT_HTTP=//'`; \
|
||||
export DEV_PORT_HTTPS=`cat $(CONTAINER_FILE) | grep 'DEV_PORT_HTTPS=' | sed 's/DEV_PORT_HTTPS=//'`; \
|
||||
export HOST=127.0.0.1 ; \
|
||||
export PORT=$${PORT:-$${DEV_PORT_HTTP}} ; \
|
||||
export DETAILED_LOGGING=$${DETAILED_LOGGING:-true} ; \
|
||||
export LOG_ALL=$${LOG_ALL:-false} ; \
|
||||
export LOGLEVEL=$${LOGLEVEL:-info} ; \
|
||||
export DUMMY_LOGIN=$${DUMMY_LOGIN:-true} ; \
|
||||
export SERVER_SESSION_ACID_FALLBACK=$${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||
export SERVER_SESSION_COOKIES_SECURE=$${SERVER_SESSION_COOKIES_SECURE:-false} ; \
|
||||
export COOKIES_SECURE=$${COOKIES_SECURE:-false} ; \
|
||||
export ALLOW_DEPRECATED=$${ALLOW_DEPRECATED:-true} ; \
|
||||
export ENCRYPT_ERRORS=$${ENCRYPT_ERRORS:-false} ; \
|
||||
export RIBBON=$${RIBBON:-$${HOST:-localhost}} ; \
|
||||
export APPROOT=$${APPROOT:-http://localhost:$${DEV_PORT_HTTP}} ; \
|
||||
export AVSPASS=$${AVSPASS:-nopasswordset} ; \
|
||||
stack $(STACK_CORES) exec --local-bin-path $$(pwd)/bin --copy-bins -- yesod devel -p "$${DEV_PORT_HTTP}" -q "$${DEV_PORT_HTTPS}"
|
||||
# HELP(compile-backend): compile backend binaries
|
||||
--compile-backend:
|
||||
stack build $(STACK_CORES) --fast --profile --library-profiling --executable-profiling --flag uniworx:-library-only $(--DEVELOPMENT) --local-bin-path $$(pwd)/bin --copy-bins
|
||||
# HELP(dependencies-backend): (re-)build backend dependencies
|
||||
--dependencies-backend: #uniworx.cabal
|
||||
chown -R `id -un`:`id -gn` "$(PROJECT_DIR)"; \
|
||||
stack build -j2 --only-dependencies
|
||||
# HELP(lint-backend): lint backend
|
||||
--lint-backend:
|
||||
stack build $(STACK_CORES) --test --fast --flag uniworx:library-only $(--DEVELOPMENT) uniworx:test:hlint
|
||||
# HELP(test-backend): test backend
|
||||
--test-backend:
|
||||
stack build $(STACK_CORES) --test --coverage --fast --flag uniworx:library-only $(--DEVELOPMENT)
|
||||
# uniworx.cabal:
|
||||
# stack exec -- hpack --force
|
||||
|
||||
# HELP(compile-frontend): compile frontend assets
|
||||
--compile-frontend: node_modules assets esbuild.config.mjs frontend/src/env.sass
|
||||
npm run build
|
||||
--start-frontend: --compile-frontend;
|
||||
--dependencies-frontend: node_modules assets;
|
||||
node_modules: package.json package-lock.json
|
||||
npm install --cache .npm --prefer-offline
|
||||
package-lock.json: package.json
|
||||
npm install --cache .npm --prefer-offline
|
||||
assets: assets/favicons assets/icons;
|
||||
assets/favicons:
|
||||
./utils/faviconize.pl assets/favicon.svg long assets/favicons
|
||||
assets/icons: node_modules assets/icons-src/fontawesome.json
|
||||
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/solid assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||
./utils/renamer.pl node_modules/@fortawesome/fontawesome-free/svgs/regular assets/icons-src/fontawesome.json assets/icons/fradrive
|
||||
-cp assets/icons-src/*.svg assets/icons/fradrive
|
||||
frontend/src/env.sass:
|
||||
echo "\$$path: '$${PROJECT_DIR}'" > frontend/src/env.sass
|
||||
static: node_modules assets esbuild.config.mjs frontend/src/env.sass
|
||||
npm run build
|
||||
well-known: static;
|
||||
--lint-frontend: --compile-frontend
|
||||
npm run lint
|
||||
--test-frontend: --compile-frontend
|
||||
npm run test
|
||||
|
||||
# HELP(compile-uniworxdb): clear and fill database. requires running postgres instance (use "make start-postgres" to start one)
|
||||
# TODO (db-m-$MIGRATION-backend): apply migration (see src/Model/Migration/Definition.hs for list of available migrations)
|
||||
--compile-uniworxdb: --compile-backend
|
||||
SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true} ; \
|
||||
AVSPASS=${AVSPASS:-nopasswordset} ; \
|
||||
./bin/uniworxdb $(UNIWORXDB_OPTS)
|
||||
|
||||
# HELP(shell-ghci): enter ghci shell. Use "make ghci SRC=<MODULE_FILE.hs>" to load specific source modules."
|
||||
--shell-ghci:
|
||||
stack ghci -- $(SRC)
|
||||
# --main-is uniworx:exe:uniworx
|
||||
|
||||
# HELP(shell-{backend,frontend,memcached,minio,postgres}): enter (bash) shell inside a new container of a given service
|
||||
--shell-%:
|
||||
/bin/bash
|
||||
|
||||
# HELP(start-minio): start minio service
|
||||
|
||||
.PHONY: status
|
||||
# HELP: print develop status: running containers, used ports
|
||||
status:
|
||||
@./utils/develop-status.pl -a
|
||||
|
||||
.PHONY: log-%
|
||||
# HELP(log-$(JOB)-$(SERVICE)): inspect output of a given service. The service must be currently running When a service supports multiple running instances in one develop (i.e. backend), you need to specify the exact instance by its associated file (e.g. backend-1, backend-2, etc.), please check the contents of the develop/ directory for a list of running instances.
|
||||
log-%:
|
||||
DEVELOP=develop/`cat develop/.current` ; \
|
||||
SEARCH_FILE="$${DEVELOP}/$*" ; \
|
||||
if [[ ! -e "$${SEARCH_FILE}" ]] ; then \
|
||||
SEARCH_FILE="$${DEVELOP}/.exited.$*" ; \
|
||||
fi ; \
|
||||
if [[ -e "$${SEARCH_FILE}" ]] ; then \
|
||||
$(CONTAINER_COMMAND) logs --follow `cat "$${SEARCH_FILE}" | grep CONTAINER_ID= | sed 's/^CONTAINER_ID=//'` ; \
|
||||
else \
|
||||
>&2 echo "Cannot show log: No develop file found for '$*'" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
|
||||
.PHONY: enter
|
||||
# HELP: launch (bash) shell inside a currently running container. Use ./enter shell wrapper for more convenient usage, possibly with tab-completion in the future
|
||||
enter: --ensure-develop
|
||||
$(MAKE) -- --enter
|
||||
|
||||
.PHONY: psql
|
||||
# HELP: enter psql (postgresql) cli inside a currently running database container
|
||||
psql: ENTRYPOINT=/usr/bin/psql -d uniworx
|
||||
psql: EXEC_OPTS=--user postgres
|
||||
psql: --ensure-develop
|
||||
$(MAKE) -- --enter CONTAINER_FILE=develop/`cat develop/.current`/start-postgres
|
||||
|
||||
--enter:
|
||||
CONTAINER_ID=`cat $(CONTAINER_FILE) | grep 'CONTAINER_ID=' | sed 's/CONTAINER_ID=//'` ; \
|
||||
$(CONTAINER_COMMAND) exec -it $(EXEC_OPTS) $${CONTAINER_ID} $(if $(ENTRYPOINT),$(ENTRYPOINT),/bin/bash)
|
||||
|
||||
.PHONY: stop
|
||||
# HELP: stop all currently running develop instances
|
||||
stop:
|
||||
rm -rf develop
|
||||
.PHONY: stop-%
|
||||
# HELP(stop-SERVICE): stop all currently running develop instances of a given service (i.e. backend,frontend,uniworxdb,hoogle,postgres,...)
|
||||
# HELP(stop-JOB): stop all currently running develop instances of a given job (i.e. compile,start,test,lint)
|
||||
stop-compile: CF_PREFIX=compile-
|
||||
stop-start: CF_PREFIX=start-
|
||||
stop-test: CF_PREFIX=test-
|
||||
stop-lint: CF_PREFIX=lint-
|
||||
stop-%: --stop;
|
||||
--stop:
|
||||
$(SET_DEVELOP)
|
||||
ifdef CF_PREFIX
|
||||
rm -rf $(DEVELOP)/$(CF_PREFIX)*
|
||||
endif
|
||||
ifdef SERVICE_VARIANT
|
||||
rm -rf $(DEVELOP)/*-$(SERVICE_VARIANT)
|
||||
endif
|
||||
|
||||
.PHONY: new-develop
|
||||
# HELP: instantiate new development bundle, i.e. create new directory under develop/
|
||||
new-develop:
|
||||
$(NEW_DEVELOP)
|
||||
mkdir -p $(DEVELOP)
|
||||
$(MAKE) develop/.current
|
||||
.PHONY: switch-develop
|
||||
# HELP: switch current develop instance to DEVELOP=...
|
||||
switch-develop:
|
||||
if ! [ -e develop/$(DEVELOP) ]; then \
|
||||
echo "Specified develop $(DEVELOP) does not exist! Not switching." ; \
|
||||
exit 1 ; \
|
||||
fi ; \
|
||||
echo "$(DEVELOP)" > develop/.current
|
||||
--ensure-develop:
|
||||
if ! [[ -e develop ]]; then \
|
||||
$(MAKE) new-develop; \
|
||||
fi
|
||||
$(MAKE) develop/.current
|
||||
$(SET_DEVELOP)
|
||||
.PHONY: develop/.current
|
||||
develop/.current:
|
||||
ls -1 develop | tail -n1 > develop/.current
|
||||
|
||||
.PHONY: --%
|
||||
.SUFFIXES: # Delete all default suffixes
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
||||
|
||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
||||
|
||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Fraport AG
|
||||
|
||||
SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
16
assets/fonts/fradrive/AUTHORS
Normal file
16
assets/fonts/fradrive/AUTHORS
Normal file
@ -0,0 +1,16 @@
|
||||
AUTHORS
|
||||
|
||||
Current Contributors (sorted alphabetically):
|
||||
|
||||
- Vishal Vijayraghavan <vishalvvr at fedoraproject dot org>
|
||||
Project Owner/ Maintainer (Current)
|
||||
Red Hat, Inc.
|
||||
|
||||
Previous Contributors
|
||||
- Pravin Satpute <psatpute at redhat dot com>
|
||||
Project Owner/ Maintainer
|
||||
Red Hat, Inc.
|
||||
|
||||
- Steve Matteson
|
||||
Original Designer
|
||||
Ascender, Inc.
|
||||
79
assets/fonts/fradrive/ChangeLog
Normal file
79
assets/fonts/fradrive/ChangeLog
Normal file
@ -0,0 +1,79 @@
|
||||
* Thu Sep 30 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.5 version
|
||||
- Resolves #40: More fixes to Superscript and subscript Numbers missing issues
|
||||
-- fixed inconsistent weight, missing glyphs and GSUB issues
|
||||
|
||||
* Tue May 04 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.4 version
|
||||
- Resolves #40: Superscript and subscript Numbers missing
|
||||
- Resolves #24: Gender symbol are inconsistent in Sans
|
||||
|
||||
* Tue Feb 23 2021 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.3 version
|
||||
- Resolves #37: U+2262,2669,266C too wide
|
||||
- Resolves Bugzilla #1464310: Tilded G not works with Liberation Sans and Serif
|
||||
|
||||
* Mon Dec 21 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.2 version
|
||||
- Resolves #25: liberation-fonts doesn't have proper <==> symbol
|
||||
- Resolves #33: Liberation Mono: U+20BF is too wide
|
||||
- Resolves #14: Liberation mono fonts are not recognized as monospace by fontconfig and cairo
|
||||
|
||||
* Wed Jun 03 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.1 version
|
||||
- Few more fixes to Bugzilla #1072095: Liberation Sans renders most Latin combining characters incorrectly
|
||||
|
||||
* Mon Feb 10 2020 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.1.0 version
|
||||
- Updated release versioning scheme
|
||||
- Resolved Bugzilla #1072095: Liberation Sans renders most Latin combining characters incorrectly
|
||||
- Resolved Pagure issue-11: Combining diaerasis below does not work except U
|
||||
- Resolved GitHub issue-19: Incorrect glyph name mapped to unicode
|
||||
- Resolved Pagure issue-5: Incorrect glyph of Cent sign (U+00A2) in Sans and Mono style
|
||||
- Resolved Pagure issue-28 : U+25D2 and U+25D3 circle with lower / upper half black are backwards
|
||||
|
||||
* Mon Mar 4 2019 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.00.5 version
|
||||
- Resolved issue-10: Improving lowercase Cyrillic glyps localized for Macedonian and Serbian, Patch fix by Dimitrij Mijoski
|
||||
- Resolved #1014357: U+266B incorrect glyph with extra beam
|
||||
-- Added two new glyphs U+266C and U+2669
|
||||
- Resolved issue-13: COMBINING LONG SOLIDUS OVERLAY (U+0338) not centred on base character.
|
||||
- Validated Missing Points at Extrema, Non-integral coordinates, Wrong Direction issues for newly added and existing glyphs
|
||||
|
||||
* Mon Nov 05 2018 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Releasing liberation-fonts 2.00.4 version, it includes few bug fixes and enhancements as follows:
|
||||
-- Added Bitcoin sign #1533798
|
||||
-- Fixed Incorrect lowercase Cyrillic BE for Macedonian language in liberation v2 (look like Greek delta), Patch fix by Dimitrij Mijoski #1574410
|
||||
-- Fixed Liberation Sans Mono Enhancement Request: Modification needed for "l" Character, Patch fix by Nikolaus Waxweiler #1574410
|
||||
|
||||
* Tue Sep 18 2018 Vishal Vijayraghavan <vishalvijayraghavan@gmail.com>
|
||||
- Resolved #1574410: Incorrect lowercase Cyrillic BE for Macedonian language in liberation v2 (look like Greek delta)
|
||||
- Patch fix by Dimitrij Mijoski: https://pagure.io/liberation-fonts/pull-request/21
|
||||
- Updated LiberationMono-Bold, LiberationMono-Regular, LiberationSans-Bold, LiberationSans-Regular, LiberationSerif-Bold, LiberationSerif-Regular
|
||||
|
||||
* Thu May 17 2018 Pravin Satpute <psatpute AT redhat DOT com> - 2.00.3
|
||||
- Releasing liberation-fonts 2.00.3 version, it includes fix for few bugs.
|
||||
- This release was pending from long time, will work on other open bugs
|
||||
post this release.
|
||||
|
||||
* Tue Oct 14 2014 Pravin Satpute <psatpute AT redhat DOT com>
|
||||
- Resolved #1096336: Liberation 2.00.x missing unicode hyphen (U+2010)
|
||||
- Added U+2007 character in Liberation Mono
|
||||
- Imported missing gpos tables from Arimo #1072095
|
||||
- Missing MIDDLE DOT (u+00B7) glyph for Liberation Sans Italic #1084493
|
||||
- Rendering of Unicode tie bars could be improved #1076190
|
||||
|
||||
* Thu Oct 04 2012 Pravin Satpute <psatpute AT redhat DOT com>
|
||||
- Resolved "Glyphs with multiple unicode encodings inhibit subsetting" #851790
|
||||
- Resolved #851791, #854601 and #851825
|
||||
- Following GASP table version as per Liberation old version. (Anti-aliasing disabled)
|
||||
- Added support for Serbian glyphs for wikipedia #657849
|
||||
- In Monospace fonts, isFixedPitch bit set via script for getting it recognized as Monospace in putty.exe
|
||||
|
||||
* Fri Jul 06 2012 Pravin Satpute <psatpute AT redhat DOT com>
|
||||
- Initial version of Liberation fonts based on croscore fonts version 1.21.0
|
||||
- Converted TTF files into SFD files to be open source.
|
||||
- Update Copyright and License file
|
||||
- set fsType bit to 0, Installable Embedding is allowed.
|
||||
- Absolute value in HHeadAscent/Descent values for maintaining Metric compatibility.
|
||||
|
||||
BIN
assets/fonts/fradrive/FRADriveMono-Bold.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-BoldItalic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-Italic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Italic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveMono-Regular.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveMono-Regular.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Bold.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-BoldItalic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Italic.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Italic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/fradrive/FRADriveSans-Regular.ttf
Normal file
BIN
assets/fonts/fradrive/FRADriveSans-Regular.ttf
Normal file
Binary file not shown.
86
assets/fonts/fradrive/README.md
Normal file
86
assets/fonts/fradrive/README.md
Normal file
@ -0,0 +1,86 @@
|
||||
Liberation Fonts
|
||||
=================
|
||||
|
||||
The Liberation Fonts is font collection which aims to provide document
|
||||
layout compatibility as usage of Times New Roman, Arial, Courier New.
|
||||
|
||||
|
||||
Requirements
|
||||
=================
|
||||
|
||||
* [fontforge](http://fontforge.sourceforge.net)
|
||||
* [python fonttools](https://pypi.org/project/fonttools/)
|
||||
|
||||
|
||||
Install
|
||||
============
|
||||
|
||||
1. Get source
|
||||
```
|
||||
$ git clone https://github.com/liberationfonts/liberation-fonts.git
|
||||
```
|
||||
|
||||
- Or downloading the tar.gz file from [releases](https://github.com/fontforge/fontforge/releases).
|
||||
|
||||
- Extract the tar file:
|
||||
```
|
||||
$ tar zxvf liberation-fonts-[VERSION].tar.gz
|
||||
```
|
||||
2. Build from the source
|
||||
```
|
||||
$ cd liberation-fonts or $ cd liberation-fonts-[VERSION]
|
||||
$ make
|
||||
```
|
||||
The binary font files will be available in 'liberation-fonts-ttf-[VERSION]' directory.
|
||||
|
||||
3. Install to system
|
||||
|
||||
Fedora Users :
|
||||
- One can manually install the fonts by copying the TTFs to `~/.fonts` for user wide usage
|
||||
- and/or to `/usr/share/fonts/liberation` for system-wide availability.
|
||||
- Then, run `fc-cache` to let that cached.
|
||||
|
||||
Other distributions :
|
||||
please check out corresponding documentation.
|
||||
|
||||
|
||||
Usage
|
||||
==========
|
||||
|
||||
Simply select preferred liberation font in applications and start using.
|
||||
|
||||
|
||||
License
|
||||
============
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
Please read file "LICENSE" for details.
|
||||
|
||||
|
||||
For Maintainers
|
||||
====================
|
||||
|
||||
1. Before packaging a new release based on a new source tarball, you have to update the version suffix in the Makefile:
|
||||
```
|
||||
VER = [NEW_VERSION]
|
||||
```
|
||||
2. After updating Makefile VER attribute, update all font metadata by executing:
|
||||
```
|
||||
$ make versionupdate
|
||||
```
|
||||
can verfy changes using ftinfo/otfinfo or fontforge itself.
|
||||
3. It is highly recommended that file 'ChangeLog' is updated to reflect changes.
|
||||
|
||||
4. Create a tarball with the following command:
|
||||
```
|
||||
$ make dist
|
||||
```
|
||||
The new versioned tarball will be available in the dist/ folder as `liberation-fonts-[NEW_VERSION].tar.gz.`
|
||||
5. Create github tag for that [NEW_VERSION] and upload dist tarball
|
||||
|
||||
Credits
|
||||
============
|
||||
|
||||
Please read file "AUTHORS" for list of contributors.
|
||||
4
assets/fonts/fradrive/TODO
Normal file
4
assets/fonts/fradrive/TODO
Normal file
@ -0,0 +1,4 @@
|
||||
Here are todo for next release
|
||||
1) Serbian glyph for wikipedia https://bugzilla.redhat.com/show_bug.cgi?id=657849
|
||||
2) Liberation Mono not recognizing as Mono in Windows application #861003
|
||||
- presently it is patch, we have to update zero width characters to fixed width
|
||||
97
assets/icons-src/fontawesome.json
Normal file
97
assets/icons-src/fontawesome.json
Normal file
@ -0,0 +1,97 @@
|
||||
{
|
||||
"/defaultExtension": "svg",
|
||||
"/license": "SPDX-FileCopyrightText: 2024 Fonticons, Inc. (https://fontawesome.com)\n\nSPDX-License-Identifier: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)\n",
|
||||
"new": "seedling",
|
||||
"ok": "check",
|
||||
"not-ok": "xmark",
|
||||
"warning": "exclamation",
|
||||
"problem": "bolt",
|
||||
"visible": "eye",
|
||||
"invisible": "eye-slash",
|
||||
"course-favourite-manual": "star",
|
||||
"course-favourite-automatic": "star-half-stroke",
|
||||
"course-favourite-off": "slash",
|
||||
"enrol-true": "user-plus",
|
||||
"enrol-false": "user-slash",
|
||||
"planned": "gear",
|
||||
"announce": "bullhorn",
|
||||
"exam": "square-poll-horizontal",
|
||||
"exam-register-true": "calendar-check",
|
||||
"exam-register-false": "calendar-xmark",
|
||||
"exam-auto-occurrence-nudge-up": "user-plus",
|
||||
"exam-auto-occurrence-nudge-down": "user-minus",
|
||||
"exam-auto-occurrence-ignore": "user-slash",
|
||||
"exam-auto-occurrence-reconsider": "users",
|
||||
"comment-true": "comment",
|
||||
"comment-false": "comment-slash",
|
||||
"link": "link",
|
||||
"file-donwload": "file-arrow-down",
|
||||
"file-upload": "file-arrow-up",
|
||||
"file-zip": "file-zipper",
|
||||
"file-csv": "file-csv",
|
||||
"sft-question": "circle-question",
|
||||
"sft-hint": "life-ring",
|
||||
"sft-solution": "circle-exclamation",
|
||||
"sft-marking": "circle-check",
|
||||
"email": "envelope",
|
||||
"register-template": "file-lines",
|
||||
"no-correctors": "user-slash",
|
||||
"remove-user": "user-slash",
|
||||
"tooltip-default": "circle-question",
|
||||
"notification-success": "circle-check",
|
||||
"notification-info": "circle-info",
|
||||
"notification-warning": "circle-exclamation",
|
||||
"notification-error": "triangle-exclamation",
|
||||
"notification-nonactive": "info",
|
||||
"favourite": "star",
|
||||
"language": "flag",
|
||||
"nav-container-close": "chevron-up",
|
||||
"page-action-children-close": "chevron-up",
|
||||
"menu-news": "bullhorn",
|
||||
"menu-help": "question",
|
||||
"menu-profile": "gears",
|
||||
"menu-login": "right-to-bracket",
|
||||
"menu-logout": "right-from-bracket",
|
||||
"breadcrumbs-home": "house",
|
||||
"menu-extra": "ellipsis",
|
||||
"menu-course-list": "chalkboard-user",
|
||||
"menu-corrections": "check",
|
||||
"menu-exams": "square-poll-horizontal",
|
||||
"menu-admin": "screwdriver",
|
||||
"menu-lms": "list-check",
|
||||
"menu-qualification": "graduation-cap",
|
||||
"page-action-primary-expand": "bars",
|
||||
"page-action-secondary": "ellipsis",
|
||||
"breadcrumb-separator": "angle-right",
|
||||
"file-upload-session": "file-arrow-up",
|
||||
"standalone-field-error": "exclamation",
|
||||
"file-user": "address-card",
|
||||
"notification": "envelope",
|
||||
"notification-sent": "envelope-open",
|
||||
"no-notification": "bell-slash",
|
||||
"personal-identification": "id-card",
|
||||
"menu-workflows": "diagram-project",
|
||||
"video": "video",
|
||||
"submission-user-duplicate": "copy",
|
||||
"submission-no-users": "user-slash",
|
||||
"reset": "arrow-rotate-left",
|
||||
"blocked": "ban",
|
||||
"certificate": "certificate",
|
||||
"print-center": "envelopes-bulk",
|
||||
"letter": "envelopes-bulk",
|
||||
"at": "at",
|
||||
"supervisor": "person",
|
||||
"supervisor-foreign": "person-rays",
|
||||
"waiting-for-user": "user-gear",
|
||||
"expired": "hourglass-end",
|
||||
"locked": "lock",
|
||||
"unlocked": "unlock",
|
||||
"trash": "trash",
|
||||
"reset-tries": "trash-can-arrow-up",
|
||||
"company": "building",
|
||||
"edit": "pen-to-square",
|
||||
"user-edit": "user-pen",
|
||||
"loading": "spinner",
|
||||
"placeholder": "notdef"
|
||||
}
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
{
|
||||
"name": "App",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image\/png",
|
||||
"density": "0.75"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-48x48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image\/png",
|
||||
"density": "1.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-72x72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image\/png",
|
||||
"density": "1.5"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-96x96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image\/png",
|
||||
"density": "2.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-144x144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image\/png",
|
||||
"density": "3.0"
|
||||
},
|
||||
{
|
||||
"src": "\/android-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image\/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Steffen Jost <jost@cip.ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
197
azure-pipelines.yaml
Executable file
197
azure-pipelines.yaml
Executable file
@ -0,0 +1,197 @@
|
||||
# SPDX-FileCopyrightText: 2024-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
tags:
|
||||
include:
|
||||
- '*'
|
||||
#paths:
|
||||
# exclude:
|
||||
# - CHANGELOG.md
|
||||
|
||||
parameters:
|
||||
- name: services
|
||||
type: object
|
||||
default:
|
||||
- name: frontend
|
||||
imageBase:
|
||||
image: devfra.azurecr.io/de.fraport.build/npm
|
||||
tag: node-20
|
||||
# extraBuildOptions: |
|
||||
# --build-arg NPM_CUSTOM_REGISTRY=https://pkgs.dev.azure.com/fraport/_packaging/packages/npm/registry/
|
||||
dependsOn: []
|
||||
dependenciesCaches:
|
||||
- key: package.json | package-lock.json
|
||||
path: node_modules/
|
||||
- key: package.json | package-lock.json
|
||||
path: .npm/
|
||||
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||
path: assets/icons/
|
||||
- key: package.json | esbuild.config.mjs | utils/renamer.pl | utils/faviconize.pl | frontend/src/icons.scss
|
||||
path: assets/favicons/
|
||||
buildPool: 'Prod Private Agent Pool'
|
||||
buildCores: 1
|
||||
buildTimeout: 60
|
||||
buildArtifacts: |
|
||||
assets/icons/fradrive/*.svg
|
||||
assets/favicons/*.png
|
||||
assets/favicons/include.html
|
||||
frontend/src/env.sass
|
||||
config/manifest.json
|
||||
static/**/*
|
||||
well-known/**/*
|
||||
- name: backend
|
||||
imageBase:
|
||||
image: devfra.azurecr.io/de.fraport.build/haskell
|
||||
tag: 8.10.4
|
||||
dependsOn:
|
||||
- Build_frontend
|
||||
dependenciesCaches:
|
||||
- key: stack.yaml | stack.yaml.lock
|
||||
path: .stack/
|
||||
buildPool: 'Prod Private Agent Pool DS3'
|
||||
buildCores: 3
|
||||
buildTimeout: 1440
|
||||
buildArtifacts: |
|
||||
bin/*
|
||||
|
||||
variables:
|
||||
buildImageUpstream: devfra.azurecr.io/de.fraport.fradrive.build
|
||||
setupImages: $[ or( eq(variables.forcePushLatest, true), eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/update'), startsWith(variables['Build.SourceBranch'], 'refs/tags/') ) ]
|
||||
|
||||
pool: 'Prod Private Agent Pool'
|
||||
|
||||
stages:
|
||||
|
||||
- stage: Setup
|
||||
jobs:
|
||||
- ${{ each service in parameters.services }}:
|
||||
- template: .azure-pipelines/templates/jobs/setup_image.yaml
|
||||
parameters:
|
||||
imageName: ${{service.name}}
|
||||
imageBase: ${{service.imageBase}}
|
||||
- template: .azure-pipelines/templates/jobs/setup_dependencies.yaml
|
||||
parameters:
|
||||
serviceName: ${{service.name}}
|
||||
dependenciesCaches: ${{service.dependenciesCaches}}
|
||||
dependenciesBuildPool: ${{service.buildPool}}
|
||||
dependenciesBuildCores: ${{service.buildCores}}
|
||||
dependenciesBuildTimeout: ${{service.buildTimeout}}
|
||||
|
||||
- stage: Build
|
||||
dependsOn: Setup
|
||||
jobs:
|
||||
- ${{ each service in parameters.services }}:
|
||||
- job: Build_${{service.name}}
|
||||
displayName: Compile ${{service.name}}
|
||||
dependsOn: ${{service.dependsOn}}
|
||||
pool: '${{service.buildPool}}'
|
||||
timeoutInMinutes: ${{service.buildTimeout}}
|
||||
container:
|
||||
${{ if eq(variables.setupImages, true) }}:
|
||||
image: $(buildImageUpstream)/${{service.name}}:$(Build.BuildNumber)
|
||||
${{ else }}:
|
||||
image: $(buildImageUpstream)/${{service.name}}:latest
|
||||
endpoint: devfra
|
||||
env:
|
||||
PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
IN_CONTAINER: true
|
||||
IN_CI: true
|
||||
steps:
|
||||
- ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||
- template: .azure-pipelines/templates/steps/cache.yaml
|
||||
parameters:
|
||||
cacheIdent: '${{service.name}}-dependencies'
|
||||
cacheKeys: '${{dependencyCache.key}}'
|
||||
cachePath: '${{dependencyCache.path}}'
|
||||
- ${{ each dependency in service.dependsOn }}:
|
||||
- template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||
parameters:
|
||||
artifactName: '${{dependency}}'
|
||||
- template: .azure-pipelines/templates/steps/make.yaml
|
||||
parameters:
|
||||
makeJob: compile
|
||||
makeService: ${{service.name}}
|
||||
makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
- task: CopyFiles@2
|
||||
displayName: Prepare ${{service.name}} build artifacts for upload
|
||||
inputs:
|
||||
Contents: '${{service.buildArtifacts}}'
|
||||
TargetFolder: '$(Build.ArtifactStagingDirectory)'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish ${{service.name}} build artifacts
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: 'Build_${{service.name}}'
|
||||
publishLocation: 'Container'
|
||||
|
||||
# - stage: Test
|
||||
# dependsOn: Build
|
||||
# condition: eq(variables.skipTests, false)
|
||||
# jobs:
|
||||
# - ${{ each service in parameters.services }}:
|
||||
# - job: Test_${{service.name}}
|
||||
# displayName: Run ${{service.name}} tests
|
||||
# pool: '${{service.buildPool}}'
|
||||
# timeoutInMinutes: ${{service.buildTimeout}}
|
||||
# container:
|
||||
# # TODO: do not use latest on update branches
|
||||
# image: $(buildImageUpstream)/${{service.name}}:latest
|
||||
# endpoint: devfra
|
||||
# env:
|
||||
# PROJECT_DIR: $(Build.Repository.LocalPath)
|
||||
# IN_CONTAINER: true
|
||||
# IN_CI: true
|
||||
# steps:
|
||||
# - ${{ each dependencyCache in service.dependenciesCaches }}:
|
||||
# - template: .azure-pipelines/templates/steps/cache.yaml
|
||||
# parameters:
|
||||
# cacheIdent: '${{service.name}}-dependencies'
|
||||
# cacheKeys: '${{dependencyCache.key}}'
|
||||
# cachePath: '${{dependencyCache.path}}'
|
||||
# - ${{ each dependency in service.dependsOn }}:
|
||||
# - template: .azure-pipelines/templates/steps/artifact-download.yaml
|
||||
# parameters:
|
||||
# artifactName: '${{dependency}}'
|
||||
# - task: Docker@2
|
||||
# displayName: Login to container registry
|
||||
# inputs:
|
||||
# command: login
|
||||
# containerRegistry: devfra
|
||||
# - task: Bash@3
|
||||
# displayName: Start database container for testing
|
||||
# inputs:
|
||||
# targetType: inline
|
||||
# script: |
|
||||
# docker run -d devfra.azurecr.io/de.fraport.trusted/postgres:16.1-bookworm
|
||||
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||
# parameters:
|
||||
# makeJob: lint
|
||||
# makeService: ${{service.name}}
|
||||
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
# - template: .azure-pipelines/templates/steps/make.yaml
|
||||
# parameters:
|
||||
# makeJob: test
|
||||
# makeService: ${{service.name}}
|
||||
# makeVars: 'CPU_CORES=${{service.buildCores}} STACK_CORES=-j${{service.buildCores}}'
|
||||
# - task: Docker@2
|
||||
# displayName: Logout from container registry
|
||||
# inputs:
|
||||
# command: logout
|
||||
# containerRegistry: devfra
|
||||
# - job: TestReport_${{service.name}}
|
||||
# displayName: Upload test reports for ${{service.name}}
|
||||
# steps:
|
||||
# - script: echo "Work in progress" # TODO
|
||||
|
||||
- stage: Release
|
||||
dependsOn: Build # TODO Test
|
||||
condition: or(eq(variables.forceRelease, true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
jobs:
|
||||
- template: .azure-pipelines/templates/jobs/release.yaml
|
||||
parameters:
|
||||
releaseTag: ${{split(variables['Build.SourceBranch'], '/')[2]}}
|
||||
23
babel.config.cjs
Normal file
23
babel.config.cjs
Normal file
@ -0,0 +1,23 @@
|
||||
module.exports = (api) => {
|
||||
api.cache(true);
|
||||
|
||||
const presets = [
|
||||
[ '@babel/preset-env'
|
||||
]
|
||||
];
|
||||
|
||||
const plugins = [
|
||||
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||
["@babel/plugin-syntax-dynamic-import"],
|
||||
["@babel/plugin-transform-class-properties", { "loose": true }],
|
||||
["@babel/plugin-transform-private-methods", { "loose": true }],
|
||||
["@babel/plugin-transform-private-property-in-object", { "loose": true }],
|
||||
["@babel/plugin-transform-modules-commonjs"],
|
||||
["@babel/transform-runtime"],
|
||||
];
|
||||
|
||||
return {
|
||||
presets,
|
||||
plugins,
|
||||
};
|
||||
}
|
||||
46
clean.sh
46
clean.sh
@ -1,46 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || :
|
||||
|
||||
if [[ -n "${1}" ]]; then
|
||||
target=".stack-work-${1}"
|
||||
else
|
||||
target=".stack-work"
|
||||
fi
|
||||
shift
|
||||
|
||||
if [[ ! -d "${target}" ]]; then
|
||||
printf "%s does not exist or is no directory\n" "${target}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${target}" != ".stack-work" ]]; then
|
||||
if [[ -e .stack-work-clean ]]; then
|
||||
printf ".stack-work-clean exists\n" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
move-back() {
|
||||
if [[ -d .stack-work ]]; then
|
||||
mv -vT .stack-work "${target}"
|
||||
else
|
||||
mkdir -v "${target}"
|
||||
fi
|
||||
[[ -d .stack-work-clean ]] && mv -vT .stack-work-clean .stack-work
|
||||
}
|
||||
|
||||
mv -vT .stack-work .stack-work-clean
|
||||
mv -vT "${target}" .stack-work
|
||||
trap move-back EXIT
|
||||
fi
|
||||
|
||||
(
|
||||
set -ex
|
||||
stack clean $@
|
||||
)
|
||||
@ -2,4 +2,4 @@
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
module.exports = {extends: ['@commitlint/config-conventional']}
|
||||
module.exports = {extends: ['@commitlint/config-conventional']};
|
||||
|
||||
35
compose.yaml
Normal file
35
compose.yaml
Normal file
@ -0,0 +1,35 @@
|
||||
services:
|
||||
frontend:
|
||||
# image: registry.uniworx.de/fradrive/fradrive/frontend # TODO: reference to current branch required; how to do that here?
|
||||
# pull_policy: if_not_present
|
||||
build:
|
||||
dockerfile: ./docker/frontend/Dockerfile
|
||||
context: .
|
||||
environment:
|
||||
- PROJECT_DIR=/fradrive
|
||||
volumes:
|
||||
- &fradrive-mnt .:/tmp/fradrive
|
||||
backend:
|
||||
# image: registry.uniworx.de/fradrive/fradrive/backend
|
||||
# pull_policy: if_not_present
|
||||
build:
|
||||
dockerfile: ./docker/backend/Dockerfile
|
||||
context: ./
|
||||
volumes:
|
||||
- *fradrive-mnt
|
||||
depends_on:
|
||||
- frontend
|
||||
stdin_open: true
|
||||
database:
|
||||
# image: registry.uniworx.de/fradrive/fradrive/database
|
||||
# pull_policy: if_not_present
|
||||
build: ./docker/database
|
||||
ports:
|
||||
- "9876:5432"
|
||||
# privileged: true
|
||||
|
||||
# driver: local
|
||||
# driver_opts:
|
||||
# type: none
|
||||
# o: bind
|
||||
# device: ./
|
||||
@ -1,76 +0,0 @@
|
||||
{
|
||||
"masterPicture": "assets/favicon.svg",
|
||||
"design": {
|
||||
"desktop_browser": {},
|
||||
"ios": {
|
||||
"picture_aspect": "background_and_margin",
|
||||
"margin": "5%",
|
||||
"background_color": "#ffffff",
|
||||
"startup_image": {
|
||||
"background_color": "#ffffff"
|
||||
},
|
||||
"app_name": "FRADrive",
|
||||
"assets": {
|
||||
"ios6_and_prior_icons": false,
|
||||
"ios7_and_later_icons": true,
|
||||
"precomposed_icons": true,
|
||||
"declare_only_default_icon": true
|
||||
}
|
||||
},
|
||||
"windows": {
|
||||
"picture_aspect": "white_silhouette",
|
||||
"background_color": "#0a9342",
|
||||
"app_name": "FRADrive"
|
||||
},
|
||||
"firefox_app": {
|
||||
"picture_aspect": "circle",
|
||||
"keep_picture_in_circle": false,
|
||||
"circle_inner_margin": "5%",
|
||||
"background_color": "#ffffff",
|
||||
"overlay": false,
|
||||
"manifest": {
|
||||
"app_name": "FRADrive",
|
||||
"app_description": {
|
||||
"_i18n": true,
|
||||
"de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem",
|
||||
"en-eu": "A web based training management system"
|
||||
},
|
||||
"developer_name": "Uni2work-Team",
|
||||
"developer_url": "https://uni2work.ifi.lmu.de/info",
|
||||
"display": "browser",
|
||||
"start_url": "/"
|
||||
}
|
||||
},
|
||||
"android_chrome": {
|
||||
"picture_aspect": "shadow",
|
||||
"manifest": {
|
||||
"name": "FRADrive",
|
||||
"display": "browser",
|
||||
"orientation": "portrait",
|
||||
"start_url": "/"
|
||||
},
|
||||
"assets": {
|
||||
"legacy_icon": true,
|
||||
"low_resolution_icons": false
|
||||
}
|
||||
},
|
||||
"safari_pinned_tab": {
|
||||
"picture_aspect": "silhouette",
|
||||
"theme_color": "#0a9342"
|
||||
},
|
||||
"coast": {
|
||||
"picture_aspect": "background_and_margin",
|
||||
"background_color": "#ffffff",
|
||||
"margin": "10%"
|
||||
},
|
||||
"open_graph": {
|
||||
"picture_aspect": "background_and_margin",
|
||||
"background_color": "#ffffff",
|
||||
"margin": "10%",
|
||||
"ratio": "square"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"html_code_file": true
|
||||
}
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
5
config/i18n.json
Normal file
5
config/i18n.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"_i18n": true,
|
||||
"de-de-formal": "Ein webbasiertes Schulungsverwaltungssystem",
|
||||
"en-eu": "A web-based training management system"
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
keter_testworx.yml
|
||||
@ -1,77 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
root: ..
|
||||
|
||||
stanzas:
|
||||
- type: webapp
|
||||
|
||||
# Name of your executable. You are unlikely to need to change this.
|
||||
# Note that all file paths are relative to the keter.yml file.
|
||||
#
|
||||
# The path given is for Stack projects. If you're still using cabal, change
|
||||
# to
|
||||
# exec: ../dist/build/uniworx/uniworx
|
||||
exec: ../dist/bin/uniworx
|
||||
|
||||
# Command line options passed to your application.
|
||||
args: []
|
||||
|
||||
hosts:
|
||||
- testworx.tcs.ifi.lmu.de
|
||||
|
||||
ssl: true
|
||||
|
||||
forward-env:
|
||||
- LDAPHOST
|
||||
- LDAPTLS
|
||||
- LDAPPORT
|
||||
- LDAPUSER
|
||||
- LDAPPASS
|
||||
- LDAPBASE
|
||||
- LDAPSCOPE
|
||||
- LDAPSEARCHTIME
|
||||
- LDAPSTRIPES
|
||||
- LDAPTIMEOUT
|
||||
- LDAPLIMIT
|
||||
- DUMMY_LOGIN
|
||||
- DETAILED_LOGGING
|
||||
- LOG_ALL
|
||||
- LOGLEVEL
|
||||
- ALLOW_DEPRECATED
|
||||
- PWFILE
|
||||
- CRYPTOID_KEYFILE
|
||||
- IP_FROM_HEADER
|
||||
- MAILFROM_NAME
|
||||
- MAILFROM_EMAIL
|
||||
- MAILOBJECT_DOMAIN
|
||||
- SMTPHOST
|
||||
- SMTPPORT
|
||||
- SMTPSSL
|
||||
- SMTPUSER
|
||||
- SMTPPASS
|
||||
- SMTPTIMEOUT
|
||||
- SMTPLIMIT
|
||||
- MAILSUPPORT
|
||||
- MAILSUPPORT_NAME
|
||||
- INSTANCE_ID
|
||||
- MEMCACHEDHOST
|
||||
- MEMCACHEDPORT
|
||||
- MEMCACHEDLIMIT
|
||||
- MEMCACHEDTIMEOUT
|
||||
- MEMCACHEDROOT
|
||||
- MEMCACHEDEXPIRATION
|
||||
|
||||
# Use the following to automatically copy your bundle upon creation via `yesod
|
||||
# keter`. Uses `scp` internally, so you can set it to a remote destination
|
||||
# copy-to: user@host:/opt/keter/incoming/
|
||||
copy-to: keter@testworx.tcs.ifi.lmu.de:/opt/keter/incoming/
|
||||
copy-to-args:
|
||||
- "-P 30363"
|
||||
|
||||
# If you would like to have Keter automatically create a PostgreSQL database
|
||||
# and set appropriate environment variables for it to be discovered, uncomment
|
||||
# the following line.
|
||||
plugins:
|
||||
postgres: true
|
||||
@ -1,79 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
root: ..
|
||||
|
||||
stanzas:
|
||||
- type: webapp
|
||||
|
||||
# Name of your executable. You are unlikely to need to change this.
|
||||
# Note that all file paths are relative to the keter.yml file.
|
||||
#
|
||||
# The path given is for Stack projects. If you're still using cabal, change
|
||||
# to
|
||||
# exec: ../dist/build/uniworx/uniworx
|
||||
exec: ../dist/bin/uniworx
|
||||
|
||||
# Command line options passed to your application.
|
||||
args: []
|
||||
|
||||
hosts:
|
||||
- uni2work.ifi.lmu.de
|
||||
|
||||
ssl: true
|
||||
|
||||
forward-env:
|
||||
- LDAPHOST
|
||||
- LDAPTLS
|
||||
- LDAPPORT
|
||||
- LDAPUSER
|
||||
- LDAPPASS
|
||||
- LDAPBASE
|
||||
- LDAPSCOPE
|
||||
- LDAPSEARCHTIME
|
||||
- LDAPSTRIPES
|
||||
- LDAPTIMEOUT
|
||||
- LDAPLIMIT
|
||||
- DETAILED_LOGGING
|
||||
- LOG_ALL
|
||||
- LOGLEVEL
|
||||
- ALLOW_DEPRECATED
|
||||
- PWFILE
|
||||
- CRYPTOID_KEYFILE
|
||||
- IP_FROM_HEADER
|
||||
- MAILFROM_NAME
|
||||
- MAILFROM_EMAIL
|
||||
- MAILOBJECT_DOMAIN
|
||||
- SMTPHOST
|
||||
- SMTPPORT
|
||||
- SMTPSSL
|
||||
- SMTPUSER
|
||||
- SMTPPASS
|
||||
- SMTPTIMEOUT
|
||||
- SMTPLIMIT
|
||||
- MAILSUPPORT
|
||||
- MAILSUPPORT_NAME
|
||||
- INSTANCE_ID
|
||||
- MEMCACHEDHOST
|
||||
- MEMCACHEDPORT
|
||||
- MEMCACHEDLIMIT
|
||||
- MEMCACHEDTIMEOUT
|
||||
- MEMCACHEDROOT
|
||||
- MEMCACHEDEXPIRATION
|
||||
|
||||
|
||||
# Use the following to automatically copy your bundle upon creation via `yesod
|
||||
# keter`. Uses `scp` internally, so you can set it to a remote destination
|
||||
# copy-to: user@host:/opt/keter/incoming/
|
||||
copy-to: root@uni2work.ifi.lmu.de:/opt/keter/incoming/
|
||||
copy-to-args: []
|
||||
|
||||
|
||||
# If you would like to have Keter automatically create a PostgreSQL database
|
||||
# and set appropriate environment variables for it to be discovered, uncomment
|
||||
# the following line.
|
||||
plugins:
|
||||
postgres:
|
||||
- server: uniworxdb
|
||||
port: 5432
|
||||
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, David Mosbach <david.mosbach@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>, Sarah Vaupel <sarah.vaupel@ifi.lmu.de>, Steffen Jost <jost@tcs.ifi.lmu.de>, Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
||||
# SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -9,9 +9,9 @@
|
||||
|
||||
static-dir: "_env:STATIC_DIR:static"
|
||||
well-known-dir: "_env:WELL_KNOWN_DIR:well-known"
|
||||
well-known-link-file: html_code.html
|
||||
well-known-link-file: include.html
|
||||
|
||||
webpack-manifest: "_env:WEBPACK_MANIFEST:config/webpack.yml"
|
||||
bundler-manifest: "_env:BUNDLER_MANIFEST:config/manifest.json"
|
||||
host: "_env:HOST:*4" # any IPv4 host
|
||||
port: "_env:PORT:3000"
|
||||
ip-from-header: "_env:IP_FROM_HEADER:false"
|
||||
@ -120,7 +120,7 @@ auth-pw-hash:
|
||||
database:
|
||||
user: "_env:PGUSER:uniworx"
|
||||
password: "_env:PGPASS:uniworx"
|
||||
host: "_env:PGHOST:127.0.0.1"
|
||||
host: "_env:PGHOST:localhost"
|
||||
port: "_env:PGPORT:5432"
|
||||
# See config/test-settings.yml for an override during tests
|
||||
database: "_env:PGDATABASE:uniworx"
|
||||
@ -217,6 +217,8 @@ session-memcached:
|
||||
timeout: "_env:SESSION_MEMCACHED_TIMEOUT:20"
|
||||
expiration: "_env:SESSION_MEMCACHED_EXPIRATION:28807"
|
||||
|
||||
|
||||
# TODO: this one seems to be required!
|
||||
memcached:
|
||||
host: "_env:MEMCACHED_HOST:localhost"
|
||||
port: "_env:MEMCACHED_PORT:11211"
|
||||
@ -230,10 +232,10 @@ memcached-local:
|
||||
maximum-weight: 104857600 # 100MiB
|
||||
|
||||
upload-cache:
|
||||
host: "_env:UPLOAD_S3_HOST:" # should be optional, but all file transfers will be empty without an S3 cache
|
||||
host: "_env:UPLOAD_S3_HOST:localhost" # should be optional, but all file transfers will be empty without an S3 cache
|
||||
port: "_env:UPLOAD_S3_PORT:9000"
|
||||
access-key: "_env:UPLOAD_S3_KEY_ID:"
|
||||
secret-key: "_env:UPLOAD_S3_KEY"
|
||||
access-key: "_env:UPLOAD_S3_KEY_ID:minioadmin"
|
||||
secret-key: "_env:UPLOAD_S3_KEY:minioadmin"
|
||||
is-secure: "_env:UPLOAD_S3_SSL:false"
|
||||
region: "_env:UPLOAD_S3_REGION:"
|
||||
auto-discover-region: "_env:UPLOAD_S3_AUTO_DISCOVER_REGION:true"
|
||||
|
||||
7
db.sh
7
db.sh
@ -8,13 +8,6 @@ set -e
|
||||
|
||||
# Options: see /test/Database.hs (Main)
|
||||
|
||||
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en .stack-work.lock "$0" "$@" || :
|
||||
|
||||
if ! in-develop | grep -q 'In develop'; then
|
||||
printf "Not in develop"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
stack build --fast --flag uniworx:-library-only --flag uniworx:dev
|
||||
|
||||
export SERVER_SESSION_ACID_FALLBACK=${SERVER_SESSION_ACID_FALLBACK:-true}
|
||||
|
||||
38
docker/backend/Dockerfile
Normal file
38
docker/backend/Dockerfile
Normal file
@ -0,0 +1,38 @@
|
||||
ARG FROM_IMG=docker.io/library/haskell
|
||||
ARG FROM_TAG=8.10.4
|
||||
|
||||
FROM ${FROM_IMG}:${FROM_TAG}
|
||||
|
||||
ENV LANG=de_DE.UTF-8
|
||||
|
||||
# compile-time dependencies
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||
apt-get -y update && apt-get install -y libpq-dev libsodium-dev
|
||||
# RUN apt-get -y update && apt-get -y install llvm
|
||||
# RUN apt-get -y update && apt-get -y install g++ libghc-zlib-dev libpq-dev libsodium-dev pkg-config
|
||||
# RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||
apt-get -y update && apt-get install -y --no-install-recommends locales locales-all
|
||||
|
||||
# run-time dependencies for uniworx binary
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||
apt-get -y update && apt-get -y install fonts-roboto
|
||||
# RUN apt-get -y update && apt-get -y install pdftk
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||
apt-get -y update && apt-get -y install texlive-latex-recommended texlive-luatex texlive-plain-generic texlive-lang-german texlive-lang-english
|
||||
|
||||
ARG PROJECT_DIR=/fradrive
|
||||
ENV PROJECT_DIR=${PROJECT_DIR}
|
||||
RUN mkdir -p "${PROJECT_DIR}"; chmod -R 7777 "${PROJECT_DIR}"
|
||||
WORKDIR ${PROJECT_DIR}
|
||||
ENV HOME=${PROJECT_DIR}
|
||||
ENV STACK_ROOT="${PROJECT_DIR}/.stack"
|
||||
|
||||
RUN if [ ! -z "${IN_CI}" ]; then \
|
||||
stack install yesod-bin; \
|
||||
stack install hpack; \
|
||||
fi
|
||||
47
docker/fradrive/Dockerfile
Executable file
47
docker/fradrive/Dockerfile
Executable file
@ -0,0 +1,47 @@
|
||||
ARG FROM_IMG=docker.io/library/debian
|
||||
ARG FROM_TAG=12.5
|
||||
|
||||
FROM ${FROM_IMG}:${FROM_TAG}
|
||||
|
||||
# Setup locales
|
||||
# RUN apt-get update && apt-get -y install locales locales-all
|
||||
# RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||
# locale-gen
|
||||
# ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
|
||||
|
||||
# FraDrive runtime dependencies
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV TZ=Etc/UTC
|
||||
RUN apt-get update && apt-get -y install libpq-dev
|
||||
RUN apt-get update && apt-get -y install libsodium-dev
|
||||
# TODO: minimize texlive dependencies, switch to basic schemes where possible
|
||||
RUN apt-get update && apt-get -y install \
|
||||
texlive-latex-base \
|
||||
texlive-luatex \
|
||||
texlive-fonts-recommended \
|
||||
texlive-fonts-extra \
|
||||
texlive-lang-english \
|
||||
texlive-lang-german
|
||||
|
||||
# Add uniworx user and directories
|
||||
RUN mkdir -p /var/lib
|
||||
RUN mkdir -p /var/log
|
||||
RUN groupadd -r uniworx
|
||||
RUN useradd -r -g uniworx -d /var/lib/uniworx -M uniworx --uid 999
|
||||
RUN mkdir -p /var/lib/uniworx && chown -R uniworx:uniworx /var/lib/uniworx
|
||||
RUN mkdir -p /var/log/uniworx && chown -R uniworx:uniworx /var/log/uniworx
|
||||
|
||||
# Install FraDrive binaries
|
||||
# RUN install -d -g uniworx -o uniworx -m 0750 /var/lib/uniworx
|
||||
# RUN install -d -g uniworx -o uniworx -m 0755 /var/log/uniworx
|
||||
COPY ./bin/uniworx /usr/bin/uniworx
|
||||
COPY ./bin/uniworxdb /usr/bin/uniworxdb
|
||||
# COPY uniworxload /usr/bin/uniworx
|
||||
RUN chmod -R 777 /usr/bin
|
||||
COPY ./docker/fradrive/fradrive-entrypoint.sh /entrypoint.sh
|
||||
RUN chmod 777 /entrypoint.sh
|
||||
|
||||
USER uniworx
|
||||
ENTRYPOINT /entrypoint.sh
|
||||
EXPOSE 8080/tcp
|
||||
VOLUME /var/lib/uniworx /var/log
|
||||
22
docker/fradrive/fradrive-entrypoint.sh
Normal file
22
docker/fradrive/fradrive-entrypoint.sh
Normal file
@ -0,0 +1,22 @@
|
||||
#!/bin/bash -xe
|
||||
|
||||
cTime=$(date -Is)
|
||||
|
||||
# export LOGDEST=/var/log/uniworx/${cTime}.log # kubernetes prefers log via stdout
|
||||
|
||||
# typeset -a configs
|
||||
|
||||
configDir=${CONFIG_DIR-/cfg}
|
||||
# configs=()
|
||||
# if [[ -d "${configDir}" ]]; then
|
||||
# while IFS= read -d $'\0' cfg; do
|
||||
# # IMPORTANT: The paths to the settings-yaml-files should not contain spaces, otherwise this might fail runtime!
|
||||
# configs+=("${cfg}")
|
||||
# done < <(find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz)
|
||||
# fi
|
||||
|
||||
cd /var/lib/uniworx
|
||||
|
||||
# exec -- uniworx ${configs}
|
||||
# find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz | xargs -0 exec -- uniworx
|
||||
find "${configDir}" \( -name '*.yml' -o -name '*.yaml' \) -print0 | sort -rz | xargs -0 uniworx
|
||||
29
docker/frontend/Dockerfile
Normal file
29
docker/frontend/Dockerfile
Normal file
@ -0,0 +1,29 @@
|
||||
ARG FROM_IMG=docker.io/library/node
|
||||
ARG FROM_TAG=20
|
||||
|
||||
FROM ${FROM_IMG}:${FROM_TAG}
|
||||
|
||||
ENV LANG=de_DE.UTF-8
|
||||
ENV LANGUAGE=de_DE.UTF-8
|
||||
|
||||
# build and watch dependencies
|
||||
RUN apt-get -y update && apt-get -y install exiftool
|
||||
RUN apt-get -y update && apt-get -y install imagemagick
|
||||
|
||||
# test dependencies
|
||||
# RUN apt-get -y update && apt-get -y install chromium
|
||||
# ENV CHROME_BIN=chromium
|
||||
|
||||
# configure npm to use given proxy if specified
|
||||
RUN if [ ! -z "${HTTP_PROXY}" ]; then npm config set proxy ${HTTP_PROXY}; fi
|
||||
RUN if [ ! -z "${FRAPORT_NOPROXY}" ]; then npm config set noproxy "${FRAPORT_NOPROXY}"; fi
|
||||
ENV NODE_EXTRA_CA_CERTS="/etc/ssl/certs/ca-certificates.crt"
|
||||
|
||||
ENV PROJECT_DIR=/fradrive
|
||||
RUN mkdir -p ${PROJECT_DIR}
|
||||
WORKDIR ${PROJECT_DIR}
|
||||
ENV HOME=${PROJECT_DIR}
|
||||
|
||||
RUN if [ ! -z "${NPM_CUSTOM_REGISTRY}" ]; then \
|
||||
printf 'registry=${NPM_CUSTOM_REGISTRY}' > .npmrc \
|
||||
; fi
|
||||
9
docker/postgres/Dockerfile
Normal file
9
docker/postgres/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
||||
FROM docker.io/postgres:12
|
||||
|
||||
# Allow for connecting to database without password authentication
|
||||
ENV POSTGRES_HOST_AUTH_METHOD=trust
|
||||
|
||||
COPY --chown=postgres:postgres docker/postgres/pg_hba.conf /tmp/pg_hba.conf
|
||||
COPY --chown=postgres:postgres docker/postgres/postgresql.conf /tmp/postgresql.conf
|
||||
COPY docker/postgres/pgconfig.sh /docker-entrypoint-initdb.d/_pgconfig.sh
|
||||
COPY --chown=postgres:postgres docker/postgres/schema.sql /docker-entrypoint-initdb.d/schema.sql
|
||||
14
docker/postgres/initdb.sh
Normal file
14
docker/postgres/initdb.sh
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Init and start the postgres daemon
|
||||
initdb --no-locale
|
||||
pg_ctl start -w -o "-c listen_addresses='*' -c unix_socket_permissions=0700 -c max_connections=9990 -c shared_preload_libraries=pg_stat_statements -c session_preload_libraries=auto_explain -c auto_explain.log_min_duration=100ms"
|
||||
POSTGRID=`cat /var/lib/postgresql/data/postmaster.pid | perl -le '<>=~m#(\d+)# and print $1'`
|
||||
|
||||
# Create uniworx and uniworx_test database
|
||||
psql -f /schema.sql postgres
|
||||
|
||||
# Wait for postgres daemon to terminate
|
||||
while [ -e /proc/$POSTGRID ]; do
|
||||
sleep 0.5;
|
||||
done
|
||||
3
docker/postgres/pg_hba.conf
Normal file
3
docker/postgres/pg_hba.conf
Normal file
@ -0,0 +1,3 @@
|
||||
local all all trust
|
||||
host all all 0.0.0.0/0 trust
|
||||
host all all ::1/128 trust
|
||||
6
docker/postgres/pgconfig.sh
Executable file
6
docker/postgres/pgconfig.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cat /tmp/pg_hba.conf > /var/lib/postgresql/data/pg_hba.conf
|
||||
cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf
|
||||
|
||||
echo "Custom pg_hba.conf and postgresql.conf successfully deployed."
|
||||
6
docker/postgres/postgresql.conf
Normal file
6
docker/postgres/postgresql.conf
Normal file
@ -0,0 +1,6 @@
|
||||
listen_addresses='*'
|
||||
unix_socket_permissions=0700
|
||||
max_connections=9990
|
||||
shared_preload_libraries=pg_stat_statements
|
||||
session_preload_libraries=auto_explain
|
||||
auto_explain.log_min_duration=100ms
|
||||
5
docker/postgres/schema.sql
Normal file
5
docker/postgres/schema.sql
Normal file
@ -0,0 +1,5 @@
|
||||
CREATE USER uniworx WITH SUPERUSER PASSWORD 'uniworx';
|
||||
CREATE DATABASE uniworx_test;
|
||||
GRANT ALL ON DATABASE uniworx_test TO uniworx;
|
||||
CREATE DATABASE uniworx;
|
||||
GRANT ALL ON DATABASE uniworx TO uniworx;
|
||||
3
enter
Executable file
3
enter
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
make enter CONTAINER_FILE=develop/`cat develop/.current`/"$1"
|
||||
93
esbuild.config.mjs
Normal file
93
esbuild.config.mjs
Normal file
@ -0,0 +1,93 @@
|
||||
import * as esbuild from 'esbuild';
|
||||
|
||||
import babel from 'esbuild-plugin-babel';
|
||||
import { sassPlugin } from 'esbuild-sass-plugin';
|
||||
import svgPlugin from 'esbuild-plugin-svg-bundle';
|
||||
// import svgPlugin from 'esbuild-plugin-svg';
|
||||
import { copy } from 'esbuild-plugin-copy';
|
||||
// import manifestPlugin from 'esbuild-plugin-manifest';
|
||||
import manifestPlugin from 'esbuild-plugin-assets-manifest';
|
||||
// import copyWithHashPlugin from '@enonic/esbuild-plugin-copy-with-hash';
|
||||
// import inlineImportPlugin from 'esbuild-plugin-inline-import';
|
||||
import { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill';
|
||||
|
||||
const staticDir = './static';
|
||||
const wellKnownDir = './well-known';
|
||||
const wellKnownDirs = [ `${wellKnownDir}/de-de-formal`, `${wellKnownDir}/en-eu` ];
|
||||
|
||||
await esbuild.build({
|
||||
bundle: true,
|
||||
minify: true,
|
||||
sourcemap: true,
|
||||
entryPoints: {
|
||||
main: './frontend/src/main.js',
|
||||
polyfill: './frontend/src/polyfill.js',
|
||||
},
|
||||
outdir: staticDir,
|
||||
plugins: [
|
||||
/* inlineImportPlugin({
|
||||
filter: /.svg/,
|
||||
}), */
|
||||
svgPlugin({
|
||||
minify: true,
|
||||
// hash: 'foo', // TODO: introduce caching of static files (maybe even in backend)
|
||||
bundleFile: 'svg-bundle.svg',
|
||||
bundleUrl: 'svg-bundle.svg',
|
||||
}),
|
||||
nodeModulesPolyfillPlugin({
|
||||
// modules: ['crypto','worker_threads']
|
||||
}),
|
||||
sassPlugin(),
|
||||
copy({
|
||||
resolveFrom: 'cwd',
|
||||
assets: {
|
||||
from: [ './assets/favicons/*' ],
|
||||
to: wellKnownDirs,
|
||||
},
|
||||
}),
|
||||
copy({
|
||||
resolveFrom: 'cwd',
|
||||
assets: {
|
||||
from: [ './config/robots.txt' ],
|
||||
to: wellKnownDirs,
|
||||
},
|
||||
}),
|
||||
// ...['de-de-formal','en-eu'].map((lang) => manifestPlugin({
|
||||
manifestPlugin({
|
||||
filename: 'manifest.json',
|
||||
path: 'config',
|
||||
// metadata: { timestamp: new Date(), module: 'myapp', type: 'esm', },
|
||||
processOutput(assets) {
|
||||
const orderAssets = {
|
||||
main: assets['main'],
|
||||
...assets
|
||||
};
|
||||
return JSON.stringify(orderAssets, null, ' ');
|
||||
},
|
||||
}),
|
||||
/* copyWithHashPlugin({
|
||||
patterns: [
|
||||
'./assets/favicons/*',
|
||||
'./config/robots.txt',
|
||||
],
|
||||
}), */
|
||||
babel({
|
||||
config: {
|
||||
"sourceMaps": "inline",
|
||||
"presets": [
|
||||
"@babel/preset-env",
|
||||
],
|
||||
"plugins": [
|
||||
["@babel/plugin-proposal-decorators", { "legacy": true }],
|
||||
["@babel/plugin-syntax-dynamic-import"],
|
||||
["@babel/plugin-transform-class-properties", { "loose": true }],
|
||||
["@babel/plugin-transform-private-methods", { "loose": true }],
|
||||
["@babel/plugin-transform-private-property-in-object", { "loose": true }],
|
||||
["@babel/plugin-transform-modules-commonjs"],
|
||||
["@babel/transform-runtime"],
|
||||
["@babel/plugin-syntax-jsx"],
|
||||
],
|
||||
},
|
||||
}),
|
||||
],
|
||||
});
|
||||
33
eslint.config.mjs
Normal file
33
eslint.config.mjs
Normal file
@ -0,0 +1,33 @@
|
||||
import js from "@eslint/js";
|
||||
import globals from "globals";
|
||||
import babelParser from "@babel/eslint-parser";
|
||||
|
||||
export default [
|
||||
js.configs.recommended,
|
||||
{
|
||||
files: ["frontend/src/**/*.js"],
|
||||
plugins: {},
|
||||
languageOptions: {
|
||||
ecmaVersion: 2018,
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.es6,
|
||||
...globals.node,
|
||||
...globals.jasmine,
|
||||
Atomics: "readonly",
|
||||
SharedArrayBuffer: "readonly",
|
||||
flatpickr: "readonly",
|
||||
$: "readonly",
|
||||
},
|
||||
parser: babelParser,
|
||||
},
|
||||
rules: {
|
||||
"no-console": "off",
|
||||
"no-extra-semi": "off",
|
||||
"semi": ["error", "always"],
|
||||
"comma-dangle": ["error", "always-multiline"],
|
||||
"quotes": ["error", "single"],
|
||||
"no-var": "error",
|
||||
},
|
||||
},
|
||||
];
|
||||
488
flake.lock
488
flake.lock
@ -37,10 +37,10 @@
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1603716527,
|
||||
"narHash": "sha256-sDbrmur9Zfp4mPKohCD8IDZfXJ0Tjxpmr2R+kg5PpSY=",
|
||||
"narHash": "sha256-X0TFfdD4KZpwl0Zr6x+PLxUt/VyKQfX7ylXHdmZIL+w=",
|
||||
"owner": "haskell",
|
||||
"repo": "cabal",
|
||||
"rev": "94aaa8e4720081f9c75497e2735b90f6a819b08e",
|
||||
"rev": "48bf10787e27364730dd37a42b603cee8d6af7ee",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -53,11 +53,11 @@
|
||||
"cabal-34": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1622475795,
|
||||
"narHash": "sha256-chwTL304Cav+7p38d9mcb+egABWmxo2Aq+xgVBgEb/U=",
|
||||
"lastModified": 1645834128,
|
||||
"narHash": "sha256-wG3d+dOt14z8+ydz4SL7pwGfe7SiimxcD/LOuPCV6xM=",
|
||||
"owner": "haskell",
|
||||
"repo": "cabal",
|
||||
"rev": "b086c1995cdd616fc8d91f46a21e905cc50a1049",
|
||||
"rev": "5ff598c67f53f7c4f48e31d722ba37172230c462",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -67,6 +67,23 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"cabal-36": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1669081697,
|
||||
"narHash": "sha256-I5or+V7LZvMxfbYgZATU4awzkicBwwok4mVoje+sGmU=",
|
||||
"owner": "haskell",
|
||||
"repo": "cabal",
|
||||
"rev": "8fd619e33d34924a94e691c5fea2c42f0fc7f144",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "3.6",
|
||||
"repo": "cabal",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"cardano-shell": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -185,16 +202,33 @@
|
||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/esqueleto.git"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1672831974,
|
||||
"narHash": "sha256-z9k3MfslLjWQfnjBtEtJZdq3H7kyi2kQtUThfTgdRk0=",
|
||||
"owner": "input-output-hk",
|
||||
"repo": "flake-compat",
|
||||
"rev": "45f2638735f8cdc40fe302742b79f248d23eb368",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "input-output-hk",
|
||||
"ref": "hkm/gitlab-fix",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1681202837,
|
||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
||||
"lastModified": 1705309234,
|
||||
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
||||
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -204,21 +238,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"locked": {
|
||||
"lastModified": 1623875721,
|
||||
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ghc-8.6.5-iohk": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -236,14 +255,51 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ghc98X": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1696643148,
|
||||
"narHash": "sha256-E02DfgISH7EvvNAu0BHiPvl1E5FGMDi0pWdNZtIBC9I=",
|
||||
"ref": "ghc-9.8",
|
||||
"rev": "443e870d977b1ab6fc05f47a9a17bc49296adbd6",
|
||||
"revCount": 61642,
|
||||
"submodules": true,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||
},
|
||||
"original": {
|
||||
"ref": "ghc-9.8",
|
||||
"submodules": true,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||
}
|
||||
},
|
||||
"ghc99": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1701580282,
|
||||
"narHash": "sha256-drA01r3JrXnkKyzI+owMZGxX0JameMzjK0W5jJE/+V4=",
|
||||
"ref": "refs/heads/master",
|
||||
"rev": "f5eb0f2982e9cf27515e892c4bdf634bcfb28459",
|
||||
"revCount": 62197,
|
||||
"submodules": true,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||
},
|
||||
"original": {
|
||||
"submodules": true,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/ghc/ghc"
|
||||
}
|
||||
},
|
||||
"hackage": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1629940355,
|
||||
"narHash": "sha256-o9/U8R/JtyHIcxhMLaWYP+D/52B6LH/ikCyNZ7+mymI=",
|
||||
"lastModified": 1705796710,
|
||||
"narHash": "sha256-BdAqEqx6rdp8O8lu9yW1nXa8/da7+/QPgVjCJVEXyWw=",
|
||||
"owner": "input-output-hk",
|
||||
"repo": "hackage.nix",
|
||||
"rev": "429deb2a137084c011310bad92f4cecf244f2fc2",
|
||||
"rev": "31d4fed569912819adbf66b580489b45dc80a29a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -257,26 +313,44 @@
|
||||
"HTTP": "HTTP",
|
||||
"cabal-32": "cabal-32",
|
||||
"cabal-34": "cabal-34",
|
||||
"cabal-36": "cabal-36",
|
||||
"cardano-shell": "cardano-shell",
|
||||
"flake-utils": "flake-utils_2",
|
||||
"flake-compat": "flake-compat",
|
||||
"ghc-8.6.5-iohk": "ghc-8.6.5-iohk",
|
||||
"ghc98X": "ghc98X",
|
||||
"ghc99": "ghc99",
|
||||
"hackage": "hackage",
|
||||
"hls-1.10": "hls-1.10",
|
||||
"hls-2.0": "hls-2.0",
|
||||
"hls-2.2": "hls-2.2",
|
||||
"hls-2.3": "hls-2.3",
|
||||
"hls-2.4": "hls-2.4",
|
||||
"hls-2.5": "hls-2.5",
|
||||
"hls-2.6": "hls-2.6",
|
||||
"hpc-coveralls": "hpc-coveralls",
|
||||
"nix-tools": "nix-tools",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"hydra": "hydra",
|
||||
"iserv-proxy": "iserv-proxy",
|
||||
"nixpkgs": [
|
||||
"haskell-nix",
|
||||
"nixpkgs-unstable"
|
||||
],
|
||||
"nixpkgs-2003": "nixpkgs-2003",
|
||||
"nixpkgs-2009": "nixpkgs-2009",
|
||||
"nixpkgs-2105": "nixpkgs-2105",
|
||||
"nixpkgs-2111": "nixpkgs-2111",
|
||||
"nixpkgs-2205": "nixpkgs-2205",
|
||||
"nixpkgs-2211": "nixpkgs-2211",
|
||||
"nixpkgs-2305": "nixpkgs-2305",
|
||||
"nixpkgs-2311": "nixpkgs-2311",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||
"old-ghc-nix": "old-ghc-nix",
|
||||
"stackage": "stackage"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1629940530,
|
||||
"narHash": "sha256-cf/bshYWloj+rJSmOcFokN6Rs1lpFkiECKpykN3JBH8=",
|
||||
"lastModified": 1705798224,
|
||||
"narHash": "sha256-/zJa0hC58vLD8PqTEQNeN9EJAQpbS+YluJhLVstgqY8=",
|
||||
"owner": "input-output-hk",
|
||||
"repo": "haskell.nix",
|
||||
"rev": "5fcd4faf98fc8ca8287e2c7bc1fff71dfd340f1f",
|
||||
"rev": "2a31673a97ed3efbae9835ea7334528d2bc4b6ab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -285,6 +359,125 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-1.10": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1680000865,
|
||||
"narHash": "sha256-rc7iiUAcrHxwRM/s0ErEsSPxOR3u8t7DvFeWlMycWgo=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "b08691db779f7a35ff322b71e72a12f6e3376fd9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "1.10.0.0",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.0": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1687698105,
|
||||
"narHash": "sha256-OHXlgRzs/kuJH8q7Sxh507H+0Rb8b7VOiPAjcY9sM1k=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "783905f211ac63edf982dd1889c671653327e441",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.0.0.1",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1693064058,
|
||||
"narHash": "sha256-8DGIyz5GjuCFmohY6Fa79hHA/p1iIqubfJUTGQElbNk=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "b30f4b6cf5822f3112c35d14a0cba51f3fe23b85",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.2.0.0",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.3": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1695910642,
|
||||
"narHash": "sha256-tR58doOs3DncFehHwCLczJgntyG/zlsSd7DgDgMPOkI=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "458ccdb55c9ea22cd5d13ec3051aaefb295321be",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.3.0.0",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.4": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1699862708,
|
||||
"narHash": "sha256-YHXSkdz53zd0fYGIYOgLt6HrA0eaRJi9mXVqDgmvrjk=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "54507ef7e85fa8e9d0eb9a669832a3287ffccd57",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.4.0.1",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.5": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1701080174,
|
||||
"narHash": "sha256-fyiR9TaHGJIIR0UmcCb73Xv9TJq3ht2ioxQ2mT7kVdc=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "27f8c3d3892e38edaef5bea3870161815c4d014c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.5.0.0",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hls-2.6": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1705325287,
|
||||
"narHash": "sha256-+P87oLdlPyMw8Mgoul7HMWdEvWP/fNlo8jyNtwME8E8=",
|
||||
"owner": "haskell",
|
||||
"repo": "haskell-language-server",
|
||||
"rev": "6e0b342fa0327e628610f2711f8c3e4eaaa08b1e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "haskell",
|
||||
"ref": "2.6.0.0",
|
||||
"repo": "haskell-language-server",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hpc-coveralls": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -301,6 +494,46 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hydra": {
|
||||
"inputs": {
|
||||
"nix": "nix",
|
||||
"nixpkgs": [
|
||||
"haskell-nix",
|
||||
"hydra",
|
||||
"nix",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1671755331,
|
||||
"narHash": "sha256-hXsgJj0Cy0ZiCiYdW2OdBz5WmFyOMKuw4zyxKpgUKm4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "hydra",
|
||||
"rev": "f48f00ee6d5727ae3e488cbf9ce157460853fea8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "hydra",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"iserv-proxy": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1691634696,
|
||||
"narHash": "sha256-MZH2NznKC/gbgBu8NgIibtSUZeJ00HTLJ0PlWKCBHb0=",
|
||||
"ref": "hkm/remote-iserv",
|
||||
"rev": "43a979272d9addc29fbffc2e8542c5d96e993d73",
|
||||
"revCount": 14,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||
},
|
||||
"original": {
|
||||
"ref": "hkm/remote-iserv",
|
||||
"type": "git",
|
||||
"url": "https://gitlab.haskell.org/hamishmack/iserv-proxy.git"
|
||||
}
|
||||
},
|
||||
"ldap-client": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -318,6 +551,22 @@
|
||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/ldap-client.git"
|
||||
}
|
||||
},
|
||||
"lowdown-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1633514407,
|
||||
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "kristapsdz",
|
||||
"repo": "lowdown",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"memcached-binary": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
@ -352,34 +601,39 @@
|
||||
"url": "https://gitlab.ifi.lmu.de/uni2work/haskell/minio-hs.git"
|
||||
}
|
||||
},
|
||||
"nix-tools": {
|
||||
"flake": false,
|
||||
"nix": {
|
||||
"inputs": {
|
||||
"lowdown-src": "lowdown-src",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-regression": "nixpkgs-regression"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1626997434,
|
||||
"narHash": "sha256-1judQmP298ao6cGUNxcGhcAXHOnA9qSLvWk/ZtoUL7w=",
|
||||
"owner": "input-output-hk",
|
||||
"repo": "nix-tools",
|
||||
"rev": "c8c5e6a6fbb12a73598d1a434984a36e880ce3cf",
|
||||
"lastModified": 1661606874,
|
||||
"narHash": "sha256-9+rpYzI+SmxJn+EbYxjGv68Ucp22bdFUSy/4LkHkkDQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nix",
|
||||
"rev": "11e45768b34fdafdcf019ddbd337afa16127ff0f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "input-output-hk",
|
||||
"repo": "nix-tools",
|
||||
"owner": "NixOS",
|
||||
"ref": "2.11.0",
|
||||
"repo": "nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1624291665,
|
||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
||||
"lastModified": 1657693803,
|
||||
"narHash": "sha256-G++2CJ9u0E7NNTAi9n5G8TdDmGJXcIjkJ3NF8cetQB8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
||||
"rev": "365e1b3a859281cf11b94f87231adeabbdd878a2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-20.09-darwin",
|
||||
"ref": "nixos-22.05-small",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
@ -400,29 +654,13 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2009": {
|
||||
"locked": {
|
||||
"lastModified": 1624271064,
|
||||
"narHash": "sha256-qns/uRW7MR2EfVf6VEeLgCsCp7pIOjDeR44JzTF09MA=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "46d1c3f28ca991601a53e9a14fdd53fcd3dd8416",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-20.09-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2105": {
|
||||
"locked": {
|
||||
"lastModified": 1624291665,
|
||||
"narHash": "sha256-kNkaoa3dai9WOi7fsPklCCWZ8hRAkXx0ZUhpYKShyUk=",
|
||||
"lastModified": 1659914493,
|
||||
"narHash": "sha256-lkA5X3VNMKirvA+SUzvEhfA7XquWLci+CGi505YFAIs=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3c6f3f84af60a8ed5b8a79cf3026b7630fcdefb8",
|
||||
"rev": "022caabb5f2265ad4006c1fa5b1ebe69fb0c3faf",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -432,6 +670,86 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2111": {
|
||||
"locked": {
|
||||
"lastModified": 1659446231,
|
||||
"narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "eabc38219184cc3e04a974fe31857d8e0eac098d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-21.11-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2205": {
|
||||
"locked": {
|
||||
"lastModified": 1685573264,
|
||||
"narHash": "sha256-Zffu01pONhs/pqH07cjlF10NnMDLok8ix5Uk4rhOnZQ=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "380be19fbd2d9079f677978361792cb25e8a3635",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-22.05-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2211": {
|
||||
"locked": {
|
||||
"lastModified": 1688392541,
|
||||
"narHash": "sha256-lHrKvEkCPTUO+7tPfjIcb7Trk6k31rz18vkyqmkeJfY=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ea4c80b39be4c09702b0cb3b42eab59e2ba4f24b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-22.11-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2305": {
|
||||
"locked": {
|
||||
"lastModified": 1701362232,
|
||||
"narHash": "sha256-GVdzxL0lhEadqs3hfRLuj+L1OJFGiL/L7gCcelgBlsw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d2332963662edffacfddfad59ff4f709dde80ffe",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-23.05-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-2311": {
|
||||
"locked": {
|
||||
"lastModified": 1701386440,
|
||||
"narHash": "sha256-xI0uQ9E7JbmEy/v8kR9ZQan6389rHug+zOtZeZFiDJk=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "293822e55ec1872f715a66d0eda9e592dc14419f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-23.11-darwin",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-recent": {
|
||||
"locked": {
|
||||
"lastModified": 1669833724,
|
||||
@ -448,19 +766,35 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"nixpkgs-regression": {
|
||||
"locked": {
|
||||
"lastModified": 1628785280,
|
||||
"narHash": "sha256-2B5eMrEr6O8ff2aQNeVxTB+9WrGE80OB4+oM6T7fOcc=",
|
||||
"lastModified": 1643052045,
|
||||
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6525bbc06a39f26750ad8ee0d40000ddfdc24acb",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1694822471,
|
||||
"narHash": "sha256-6fSDCj++lZVMZlyqOe9SIOL8tYSBz1bI8acwovRwoX8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "47585496bcb13fb72e4a90daeea2f434e2501998",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@ -483,16 +817,16 @@
|
||||
"old-ghc-nix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1621819714,
|
||||
"narHash": "sha256-EJCnYQSWk7FRLwS0lZgTWIiQ6pcvDX1VuD6LGD4Uwzs=",
|
||||
"lastModified": 1631092763,
|
||||
"narHash": "sha256-sIKgO+z7tj4lw3u6oBZxqIhDrzSkvpHtv0Kki+lh9Fg=",
|
||||
"owner": "angerman",
|
||||
"repo": "old-ghc-nix",
|
||||
"rev": "f089a6f090cdb35fcf95f865fc6a31ba6b3ac4eb",
|
||||
"rev": "af48a7a7353e418119b6dfe3cd1463a657f342b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "angerman",
|
||||
"ref": "master2",
|
||||
"ref": "master",
|
||||
"repo": "old-ghc-nix",
|
||||
"type": "github"
|
||||
}
|
||||
@ -539,11 +873,11 @@
|
||||
"stackage": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1629940472,
|
||||
"narHash": "sha256-LFrNC25OpNoS6dGG5om+UGP8YdYjp01Qm6cenbemaVg=",
|
||||
"lastModified": 1705795852,
|
||||
"narHash": "sha256-Po+1G5KgHVRbP/PzK3HgdI1ZS7XJtP63vJmpSZMvFV8=",
|
||||
"owner": "input-output-hk",
|
||||
"repo": "stackage.nix",
|
||||
"rev": "c50dd0527babf85818cc67a7099e532e453752db",
|
||||
"rev": "8adfc78e62d3dbc3498a03579a50f3cf70cd4328",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
24
flake.nix
24
flake.nix
@ -114,7 +114,9 @@
|
||||
(final: prev: let
|
||||
pkgs-recent = import nixpkgs-recent { inherit system; };
|
||||
in {
|
||||
inherit (pkgs-recent) dockerTools node2nix glibcLocalesUtf8 tzdata chromium minio minio-client skopeo; inherit (pkgs-recent.stdenv) fetchurlBoot;
|
||||
inherit (pkgs-recent) gup dockerTools nodejs-14_x glibcLocalesUtf8 tzdata chromium minio minio-client skopeo;
|
||||
inherit (pkgs-recent.stdenv) fetchurlBoot make;
|
||||
inherit (pkgs-recent.coreutils) touch;
|
||||
stack = pkgs.symlinkJoin {
|
||||
inherit (pkgs-recent.stack) name;
|
||||
paths = [pkgs-recent.stack];
|
||||
@ -133,36 +135,16 @@
|
||||
};
|
||||
})
|
||||
|
||||
(import ./nix/maildev)
|
||||
haskell-nix.overlay
|
||||
(import ./nix/uniworx { inherit inputs frontendSource backendSource; gitRevision = if self ? rev then self.rev else null; })
|
||||
(import ./nix/docker { inherit self; })
|
||||
(import ./nix/parse-changelog.nix {})
|
||||
];
|
||||
|
||||
haskellFlake = pkgs.uniworx.flake {};
|
||||
|
||||
inherit (pkgs.lib) recursiveUpdate;
|
||||
in {
|
||||
packages = haskellFlake.packages // {
|
||||
inherit (pkgs) uniworxNodeDependencies uniworxWellKnown uniworxFrontend uniworxTestDocker uniworxDocker changelogJson;
|
||||
};
|
||||
|
||||
apps = haskellFlake.apps // {
|
||||
calculateMaterializedSha = flake-utils.lib.mkApp { drv = pkgs.uniworx.stack-nix.passthru.calculateMaterializedSha; exePath = ""; };
|
||||
jqChangelogJson = flake-utils.lib.mkApp { drv = pkgs.jqChangelogJson; };
|
||||
};
|
||||
|
||||
checks = haskellFlake.checks // {
|
||||
uniworxFrontend = pkgs.uniworxFrontend.check;
|
||||
};
|
||||
|
||||
devShell = import ./shell.nix { pkgs = self.legacyPackages.${system}; nixpkgsPath = nixpkgs; };
|
||||
|
||||
legacyPackages = pkgs.lib.foldr (overlay: acc: acc // recursiveUpdate (overlay self.legacyPackages.${system} pkgs) pkgs) {} overlays;
|
||||
|
||||
defaultPackage = self.packages.${system}."uniworx:exe:uniworx";
|
||||
defaultApp = self.apps.${system}."uniworx:exe:uniworx";
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,14 +1,18 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>, David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use "~@fortawesome/fontawesome-pro/scss/fontawesome" with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
|
||||
//@use "~@fortawesome/fontawesome-pro/scss/fontawesome" with ( $fa-font-path: "~@fortawesome/fontawesome-pro/webfonts" )
|
||||
|
||||
@forward "~@fortawesome/fontawesome-pro/scss/fontawesome"
|
||||
//@forward "~@fortawesome/fontawesome-pro/scss/fontawesome"
|
||||
|
||||
@use "~@fortawesome/fontawesome-pro/scss/solid"
|
||||
//@use "~@fortawesome/fontawesome-pro/scss/solid"
|
||||
|
||||
@use "icons.scss"
|
||||
|
||||
$icons: '~/assets/icons/fradrive'
|
||||
|
||||
@function ico-content($ico)
|
||||
@return url('#{$icons}/#{$ico}.svg')
|
||||
|
||||
@use "~typeface-roboto" as roboto
|
||||
@use "~typeface-source-sans-pro" as source-sans-pro
|
||||
@use "~typeface-source-code-pro" as source-code-pro
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@cip.ifi.lmu.de>,Wolfgang Witt <Wolfgang.Witt@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use "common" as *
|
||||
@use "icons"
|
||||
|
||||
\:root
|
||||
// THEME INDEPENDENT COLORS
|
||||
@ -27,9 +28,9 @@
|
||||
--color-fontsec: #5b5861
|
||||
|
||||
// FONTS
|
||||
--font-base: "Source Sans Pro", "Trebuchet MS", sans-serif
|
||||
--font-logo: "Roboto", var(--font-base)
|
||||
--font-monospace: "Source Code Pro", monospace
|
||||
--font-base: 'Arial', sans-serif
|
||||
--font-logo: var(--font-base)
|
||||
--font-monospace: 'Arial Mono', monospace
|
||||
|
||||
// DIMENSIONS
|
||||
--header-height: 100px
|
||||
@ -62,6 +63,7 @@ body
|
||||
--color-link: var(--color-font)
|
||||
--color-link-hover: var(--color-font)
|
||||
--color-lmu-box-border: var(--color-lightwhite)
|
||||
--filter-primary: invert(7%) sepia(83%) saturate(4889%) hue-rotate(241deg) brightness(106%) contrast(169%)
|
||||
|
||||
&.theme--lavender
|
||||
--color-primary: #584c9c
|
||||
@ -71,6 +73,7 @@ body
|
||||
--color-darker: #3c2765
|
||||
--color-link: var(--color-dark)
|
||||
--color-link-hover: var(--color-darker)
|
||||
--filter-primary: invert(28%) sepia(36%) saturate(1286%) hue-rotate(212deg) brightness(97%) contrast(83%)
|
||||
|
||||
&.theme--neutral-blue
|
||||
--color-primary: #3E606F
|
||||
@ -78,6 +81,7 @@ body
|
||||
--color-lighter: rgb(145, 159, 170)
|
||||
--color-dark: rgb(42, 74, 88)
|
||||
--color-darker: #193441
|
||||
--filter-primary: invert(35%) sepia(8%) saturate(2168%) hue-rotate(153deg) brightness(88%) contrast(80%)
|
||||
|
||||
&.theme--aberdeen-reds
|
||||
--color-primary: #820333
|
||||
@ -85,6 +89,7 @@ body
|
||||
--color-lighter: #F0433A
|
||||
--color-dark: #540032
|
||||
--color-darker: #2E112D
|
||||
--filter-primary: invert(12%) sepia(38%) saturate(6051%) hue-rotate(322deg) brightness(91%) contrast(110%)
|
||||
|
||||
&.theme--moss-green
|
||||
--color-primary: #5C996B
|
||||
@ -92,6 +97,7 @@ body
|
||||
--color-lighter: #99FFB2
|
||||
--color-dark: #3D6647
|
||||
--color-darker: #1F3324
|
||||
--filter-primary: invert(57%) sepia(19%) saturate(788%) hue-rotate(82deg) brightness(92%) contrast(87%)
|
||||
|
||||
&.theme--sky-love
|
||||
--color-primary: #87ABE5
|
||||
@ -101,6 +107,7 @@ body
|
||||
--color-darker: #6B7BC9
|
||||
--color-link: var(--color-lightblack)
|
||||
--color-link-hover: var(--color-darker)
|
||||
--filter-primary: invert(55%) sepia(47%) saturate(394%) hue-rotate(180deg) brightness(115%) contrast(80%)
|
||||
|
||||
// END THEMES
|
||||
|
||||
@ -263,6 +270,9 @@ button:not(.btn-link),
|
||||
&.btn-danger
|
||||
background-color: var(--color-error-dark)
|
||||
|
||||
span
|
||||
@extend .white-ico
|
||||
|
||||
.buttongroup
|
||||
display: grid
|
||||
grid: min-content / auto-flow max-content
|
||||
@ -450,9 +460,9 @@ input[type="button"].btn-info:not(.btn-link):hover,
|
||||
color: inherit
|
||||
|
||||
&::before
|
||||
@extend .fas
|
||||
@extend .ico-link
|
||||
|
||||
content: fa-content($fa-var-link)
|
||||
content:""
|
||||
margin-right: 0.25em
|
||||
|
||||
&.table__th-link::before
|
||||
@ -655,7 +665,6 @@ section
|
||||
margin: 0 auto 0.5rem
|
||||
|
||||
&::before
|
||||
@extend .fas
|
||||
|
||||
position: absolute
|
||||
display: flex
|
||||
@ -675,6 +684,13 @@ section
|
||||
&.notification--broad
|
||||
max-width: none
|
||||
|
||||
.fas
|
||||
position: absolute
|
||||
left: 20px
|
||||
top: 0
|
||||
height: 100%
|
||||
width: 60px
|
||||
|
||||
&:first-child
|
||||
margin-top: 0
|
||||
&:last-child
|
||||
@ -1271,6 +1287,9 @@ ul.breadcrumbs__list
|
||||
margin: 0 5px
|
||||
margin-top: 1px
|
||||
|
||||
span
|
||||
@extend .white-ico
|
||||
|
||||
a.breadcrumbs__home
|
||||
opacity: 0.5
|
||||
margin-right: 7px
|
||||
@ -1281,6 +1300,10 @@ a.breadcrumbs__home
|
||||
&:hover
|
||||
opacity: 1
|
||||
|
||||
i
|
||||
@extend .white-ico
|
||||
|
||||
|
||||
.breadcrumbs__last-item
|
||||
font-weight: 600
|
||||
opacity: 1
|
||||
|
||||
165
frontend/src/icons.scss
Normal file
165
frontend/src/icons.scss
Normal file
@ -0,0 +1,165 @@
|
||||
// SPDX-FileCopyrightText: 2024-2025 David Mosbach <david.mosbach@uniworx.de>, Sarah Vaupel <sarah.vaupel@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@import 'env';
|
||||
|
||||
$ico-width: 30px;
|
||||
|
||||
$icons: new,
|
||||
ok,
|
||||
not-ok,
|
||||
warning,
|
||||
problem,
|
||||
visible,
|
||||
invisible,
|
||||
course-favourite-manual,
|
||||
course-favourite-automatic,
|
||||
course-favourite-off,
|
||||
enrol-true,
|
||||
enrol-false,
|
||||
planned,
|
||||
announce,
|
||||
exam,
|
||||
exam-register-true,
|
||||
exam-register-false,
|
||||
exam-auto-occurrence-nudge-up,
|
||||
exam-auto-occurrence-nudge-down,
|
||||
exam-auto-occurrence-ignore,
|
||||
exam-auto-occurrence-reconsider,
|
||||
comment-true,
|
||||
comment-false,
|
||||
link,
|
||||
file-donwload,
|
||||
file-upload,
|
||||
file-zip,
|
||||
file-csv,
|
||||
sft-question,
|
||||
sft-hint,
|
||||
sft-solution,
|
||||
sft-marking,
|
||||
email,
|
||||
register-template,
|
||||
no-correctors,
|
||||
remove-user,
|
||||
tooltip-default,
|
||||
notification-success,
|
||||
notification-info,
|
||||
notification-warning,
|
||||
notification-error,
|
||||
notification-nonactive,
|
||||
favourite,
|
||||
language,
|
||||
nav-container-close,
|
||||
page-action-children-close,
|
||||
menu-news,
|
||||
menu-help,
|
||||
menu-profile,
|
||||
menu-login,
|
||||
menu-logout,
|
||||
breadcrumbs-home,
|
||||
menu-extra,
|
||||
menu-course-list,
|
||||
menu-corrections,
|
||||
menu-exams,
|
||||
menu-admin,
|
||||
menu-lms,
|
||||
menu-qualification,
|
||||
page-action-primary-expand,
|
||||
page-action-secondary,
|
||||
breadcrumb-separator,
|
||||
file-upload-session,
|
||||
standalone-field-error,
|
||||
file-user,
|
||||
notification,
|
||||
notification-sent,
|
||||
no-notification,
|
||||
personal-identification,
|
||||
menu-workflows,
|
||||
video,
|
||||
submission-user-duplicate,
|
||||
submission-no-users,
|
||||
reset,
|
||||
blocked,
|
||||
certificate,
|
||||
print-center,
|
||||
letter,
|
||||
at,
|
||||
supervisor,
|
||||
supervisor-foreign,
|
||||
waiting-for-user,
|
||||
expired,
|
||||
locked,
|
||||
unlocked,
|
||||
trash,
|
||||
reset-tries,
|
||||
company,
|
||||
edit,
|
||||
user-edit,
|
||||
placeholder,
|
||||
loading;
|
||||
|
||||
|
||||
@each $name in $icons {
|
||||
.ico-#{$name} {
|
||||
background-image: url('#{$path}/assets/icons/fradrive/#{$name}.svg');
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
aspect-ratio: 1/1;
|
||||
min-width: 1em;
|
||||
font-size: inherit;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
.white-ico {
|
||||
filter: invert(100%) sepia(20%) saturate(901%) hue-rotate(47deg) brightness(106%) contrast(101%);
|
||||
}
|
||||
|
||||
.fw-ico {
|
||||
width: $ico-width;
|
||||
}
|
||||
|
||||
.small-ico {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.medium-ico {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.large-ico {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.ico-spin {
|
||||
animation-name: ico-spin;
|
||||
animation-delay: 0s;
|
||||
animation-duration: 3s;
|
||||
animation-direction: normal;
|
||||
animation-iteration-count: infinite;
|
||||
animation-timing-function: linear;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.ico-spin {
|
||||
animation-delay: -1ms;
|
||||
animation-duration: 1ms;
|
||||
animation-iteration-count: 1;
|
||||
transition-delay: 0s;
|
||||
transition-duration: 0s;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes ico-spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Johannes Eder <ederj@cip.ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2025 Sarah Vaupel <sarah.vaupel@uniworx.de>, Gregor Kleen <gregor.kleen@ifi.lmu.de>,Johannes Eder <ederj@cip.ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
/* global global:writable */
|
||||
/* global:writable */
|
||||
|
||||
import semver from 'semver';
|
||||
import sodium from 'sodium-javascript';
|
||||
// import sodium from 'sodium-javascript';
|
||||
|
||||
import { HttpClient } from '../../services/http-client/http-client';
|
||||
|
||||
@ -365,7 +365,7 @@ export class StorageManager {
|
||||
}
|
||||
|
||||
addHistoryListener(listener, options=this._options, ...args) {
|
||||
const modified_listener = (function(event, ...listener_args) { // eslint-disable-line no-unused-vars
|
||||
const modified_listener = (function(event, ...listener_args) {
|
||||
|
||||
// do not propagate popstate events with empty state
|
||||
if(event.state === null)
|
||||
@ -460,7 +460,7 @@ export class StorageManager {
|
||||
const enc = this.load('encryption', { ...options, encryption: false });
|
||||
const requestBody = {
|
||||
type : options.encryption,
|
||||
length : sodium.crypto_secretbox_KEYBYTES,
|
||||
length : undefined, // sodium.crypto_secretbox_KEYBYTES,
|
||||
salt : enc.salt,
|
||||
timestamp : enc.timestamp,
|
||||
};
|
||||
@ -498,17 +498,15 @@ function encrypt(plaintext, key) {
|
||||
if (!plaintext) return '';
|
||||
if (!key) throw new Error('Cannot encrypt plaintext without a valid key!');
|
||||
|
||||
/* eslint-disable no-undef */
|
||||
// TODO use const if possible
|
||||
let plaintextB = Buffer.from(plaintext);
|
||||
let cipherB = Buffer.alloc(plaintextB.length + sodium.crypto_secretbox_MACBYTES);
|
||||
let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||
let keyB = Buffer.from(key);
|
||||
/* eslint-enable no-undef */
|
||||
// let plaintextB = Buffer.from(plaintext);
|
||||
// let cipherB = Buffer.alloc(plaintextB.length + sodium.crypto_secretbox_MACBYTES);
|
||||
// let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||
// let keyB = Buffer.from(key);
|
||||
|
||||
sodium.crypto_secretbox_easy(cipherB, plaintextB, nonceB, keyB);
|
||||
// sodium.crypto_secretbox_easy(cipherB, plaintextB, nonceB, keyB);
|
||||
|
||||
const result = cipherB;
|
||||
const result = null; // cipherB;
|
||||
console.log('encrypt result', result);
|
||||
return result;
|
||||
}
|
||||
@ -520,15 +518,13 @@ function decrypt(ciphertext, key) {
|
||||
if (!ciphertext) return '';
|
||||
if (!key) throw new Error('Cannot decrypt ciphertext without a valid key!');
|
||||
|
||||
/* eslint-disable no-undef */
|
||||
// TODO use const if possible
|
||||
let cipherB = Buffer.from(ciphertext);
|
||||
let plaintextB = Buffer.alloc(cipherB.length - sodium.crypto_secretbox_MACBYTES);
|
||||
let nonceB = Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||
let keyB = Buffer.from(key);
|
||||
/* eslint-enable no-undef */
|
||||
// let cipherB = Buffer.from(ciphertext);
|
||||
let plaintextB = null; // Buffer.alloc(cipherB.length - sodium.crypto_secretbox_MACBYTES);
|
||||
// let nonceB = undefined; Buffer.alloc(sodium.crypto_secretbox_NONCEBYTES);
|
||||
// let keyB = Buffer.from(key);
|
||||
|
||||
sodium.crypto_secretbox_open_easy(plaintextB, cipherB, nonceB, keyB);
|
||||
// sodium.crypto_secretbox_open_easy(plaintextB, cipherB, nonceB, keyB);
|
||||
|
||||
const result = plaintextB.toString();
|
||||
console.log('decrypt result', result);
|
||||
|
||||
@ -171,7 +171,7 @@ export class Alerts {
|
||||
}
|
||||
};
|
||||
|
||||
_createAlertElement(type, content, icon = 'info-circle') {
|
||||
_createAlertElement(type, content, icon = 'notification-info') {
|
||||
const alertElement = document.createElement('div');
|
||||
alertElement.classList.add(ALERT_CLASS, 'alert-' + type);
|
||||
|
||||
@ -179,7 +179,7 @@ export class Alerts {
|
||||
alertCloser.classList.add(ALERT_CLOSER_CLASS);
|
||||
|
||||
const alertIcon = document.createElement('div');
|
||||
alertIcon.classList.add(ALERT_ICON_CLASS, 'fas', 'fa-' + icon);
|
||||
alertIcon.classList.add(ALERT_ICON_CLASS, 'ico-' + icon);
|
||||
|
||||
const alertContent = document.createElement('div');
|
||||
alertContent.classList.add(ALERT_CONTENT_CLASS);
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use "../../common" as *
|
||||
@use '../../icons'
|
||||
|
||||
.alerts
|
||||
position: fixed
|
||||
@ -24,9 +25,9 @@
|
||||
cursor: pointer
|
||||
|
||||
&::before
|
||||
@extend .fas
|
||||
@extend .ico-nav-container-close
|
||||
|
||||
content: fa-content($fa-var-chevron-up)
|
||||
content: ""
|
||||
position: absolute
|
||||
left: 50%
|
||||
top: 0
|
||||
@ -111,7 +112,7 @@
|
||||
.alert__icon
|
||||
text-align: right
|
||||
position: absolute
|
||||
left: 0px
|
||||
left: 8px
|
||||
bottom: 0
|
||||
width: 50px
|
||||
height: 100%
|
||||
@ -152,9 +153,9 @@
|
||||
color: white
|
||||
|
||||
&::before
|
||||
@extend .fas
|
||||
@extend .ico-not-ok
|
||||
|
||||
content: fa-content($fa-var-times)
|
||||
content: ""
|
||||
position: absolute
|
||||
top: 50%
|
||||
left: 50%
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -301,7 +301,7 @@ export class ExamCorrect {
|
||||
users: [user],
|
||||
status: STATUS.LOADING,
|
||||
};
|
||||
if (results && results !== {}) rowInfo.results = results;
|
||||
if (results && results != {}) rowInfo.results = results;
|
||||
if (result !== undefined) rowInfo.result = result;
|
||||
this._addRow(rowInfo);
|
||||
|
||||
@ -461,7 +461,7 @@ export class ExamCorrect {
|
||||
for (let [k, v] of Object.entries(newEntry.results)) {
|
||||
const resultCell = row.cells.item(this._cIndices.get(k));
|
||||
if (v === null) {
|
||||
resultCell.innerHTML = '<i class="fas fa-fw fa-trash"></i>';
|
||||
resultCell.innerHTML = '<i class="fas fw-ico ico-trash"></i>';
|
||||
resultCell.classList.remove('exam-correct--result-unconfirmed');
|
||||
} else if (v && v.result !== undefined && v.result !== null) {
|
||||
resultCell.innerHTML = v.result;
|
||||
@ -499,7 +499,7 @@ export class ExamCorrect {
|
||||
else
|
||||
html = examResult.status;
|
||||
} else if (examResult === null) {
|
||||
html = '<i class="fas fa-fw fa-trash"></i>';
|
||||
html = '<i class="fas fw-ico ico-trash"></i>';
|
||||
}
|
||||
|
||||
return html;
|
||||
@ -598,7 +598,7 @@ export class ExamCorrect {
|
||||
const partCell = document.createElement('TD');
|
||||
|
||||
if (partResult === null) {
|
||||
partCell.innerHTML = '<i class="fas fa-fw fa-trash"></i>';
|
||||
partCell.innerHTML = '<i class="fas fw-ico ico-trash"></i>';
|
||||
} else {
|
||||
partCell.innerHTML = partResult;
|
||||
}
|
||||
@ -683,10 +683,10 @@ function userToHTML(user) {
|
||||
}
|
||||
|
||||
function setStatus(elem, status) {
|
||||
const successClasses = ['fas', 'fa-fw', 'fa-check', 'exam-correct--success'];
|
||||
const ambiguousClasses = ['fas', 'fa-fw', 'fa-question', 'exam-correct--ambiguous'];
|
||||
const errorClasses = ['fas', 'fa-fw', 'fa-times', 'exam-correct--error'];
|
||||
const loadingClasses = ['fas', 'fa-fw', 'fa-spinner-third', 'fa-spin'];
|
||||
const successClasses = ['fas', 'fw-ico', 'ico-ok', 'exam-correct--success'];
|
||||
const ambiguousClasses = ['fas', 'fw-ico', 'ico-menu-help', 'exam-correct--ambiguous'];
|
||||
const errorClasses = ['fas', 'fw-ico', 'ico-not-ok', 'exam-correct--error'];
|
||||
const loadingClasses = ['fas', 'fw-ico', 'ico-loading', 'ico-spin'];
|
||||
|
||||
elem.classList.remove(...successClasses, ...ambiguousClasses, ...errorClasses, ...loadingClasses);
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -104,8 +104,8 @@ export class HideColumns {
|
||||
|
||||
const hider = document.createElement('span');
|
||||
|
||||
const hiderIcon = document.createElement('i');
|
||||
hiderIcon.classList.add('fas', 'fa-fw');
|
||||
const hiderIcon = document.createElement('span');
|
||||
hiderIcon.classList.add('fas');
|
||||
hider.appendChild(hiderIcon);
|
||||
|
||||
const hiderContent = document.createElement('span');
|
||||
@ -240,8 +240,8 @@ export class HideColumns {
|
||||
|
||||
updateHiderIcon(hider, hidden) {
|
||||
Array.from(hider.getElementsByClassName('fas')).forEach(hiderIcon => {
|
||||
hiderIcon.classList.remove(hidden ? 'fa-eye' : 'fa-eye-slash');
|
||||
hiderIcon.classList.add(hidden ? 'fa-eye-slash' : 'fa-eye');
|
||||
hiderIcon.classList.remove(hidden ? 'ico-visible' : 'ico-invisible');
|
||||
hiderIcon.classList.add(hidden ? 'ico-invisible' : 'ico-visible');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use "../../icons.scss"
|
||||
|
||||
.table-hider
|
||||
background-color: #fff
|
||||
color: var(--color-link)
|
||||
@ -16,6 +18,9 @@
|
||||
transform-origin: top
|
||||
z-index: 1
|
||||
|
||||
.fas
|
||||
filter: var(--filter-primary)
|
||||
|
||||
&:hover
|
||||
background-color: var(--color-grey-light)
|
||||
|
||||
@ -66,5 +71,9 @@
|
||||
&:empty
|
||||
margin: 0
|
||||
|
||||
.fas
|
||||
@extend .white-ico
|
||||
|
||||
|
||||
.hide-columns--hidden-cell
|
||||
display: none
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@ -42,7 +42,7 @@ export class Password {
|
||||
this._wrapperEl.appendChild(this._toggleContainerEl);
|
||||
|
||||
this._iconEl = document.createElement('i');
|
||||
this._iconEl.classList.add('fas', 'fa-fw');
|
||||
this._iconEl.classList.add('fas');
|
||||
this._toggleContainerEl.appendChild(this._iconEl);
|
||||
|
||||
parentEl.insertBefore(this._wrapperEl, siblingEl);
|
||||
@ -91,7 +91,7 @@ export class Password {
|
||||
|
||||
updateVisibleIcon(visible) {
|
||||
function visibleClass(visible) {
|
||||
return 'fa-' + (visible ? 'eye' : 'eye-slash');
|
||||
return `ico-${visible ? '' : 'in'}visible`;
|
||||
}
|
||||
|
||||
this._iconEl.classList.remove(visibleClass(!visible));
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
/* global global:writable */
|
||||
/* global:writable */
|
||||
|
||||
import { Utility } from '../../core/utility';
|
||||
import { Datepicker } from '../form/datepicker';
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
@ -98,9 +98,10 @@ div.modal__trigger
|
||||
z-index: 20
|
||||
|
||||
&::before
|
||||
@extend .fas
|
||||
@extend .ico-not-ok
|
||||
@extend .white-ico
|
||||
|
||||
content: fa-content($fa-var-times)
|
||||
content: ""
|
||||
color: white
|
||||
|
||||
.modal__content
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use '../../icons.scss'
|
||||
|
||||
.navbar-container
|
||||
position: relative
|
||||
|
||||
@ -170,6 +172,9 @@
|
||||
transition: opacity 0.2s ease
|
||||
margin-bottom: 7px
|
||||
|
||||
span
|
||||
@extend .white-ico
|
||||
|
||||
.navbar__link-label
|
||||
transition: opacity .2s ease
|
||||
padding: 2px 4px
|
||||
@ -253,6 +258,11 @@
|
||||
.navbar__link-wrapper
|
||||
color: var(--color-dark)
|
||||
|
||||
.navbar__link-icon
|
||||
.white-ico
|
||||
filter: var(--filter-primary)
|
||||
|
||||
|
||||
.navbar__list-item--active .navbar__link-wrapper
|
||||
color: var(--color-dark)
|
||||
|
||||
@ -263,6 +273,7 @@
|
||||
.navbar__link-icon
|
||||
opacity: 1
|
||||
|
||||
|
||||
// sticky state
|
||||
.navbar--sticky
|
||||
height: var(--header-height-collapsed)
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
// SPDX-FileCopyrightText: 2022-2024 Gregor Kleen <gregor.kleen@ifi.lmu.de>,David Mosbach <david.mosbach@uniworx.de>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
// SPDX-License-Identifier: LicenseRef-Fraport-Corporate-Design
|
||||
|
||||
@use "../../common" as *
|
||||
@use "../../icons.scss"
|
||||
|
||||
.tooltip
|
||||
position: relative
|
||||
@ -63,11 +64,19 @@
|
||||
.table__th &
|
||||
color: white
|
||||
|
||||
.fas
|
||||
@extend .white-ico
|
||||
|
||||
.tooltip.tooltip__inline
|
||||
.tooltip__handle
|
||||
height: 1.0rem
|
||||
line-height: 1.0rem
|
||||
font-size: 1.0rem
|
||||
.fas
|
||||
filter: var(--filter-primary)
|
||||
.table__th & .fas
|
||||
@extend .white-ico
|
||||
|
||||
|
||||
.tooltip__content
|
||||
position: absolute
|
||||
@ -112,6 +121,11 @@
|
||||
left: unset
|
||||
top: unset
|
||||
transform: unset
|
||||
.tooltip__handle
|
||||
.fas
|
||||
filter: var(--filter-primary)
|
||||
.table__th & .fas
|
||||
@extend .white-ico
|
||||
|
||||
.tooltip--spread
|
||||
width: 100%
|
||||
@ -123,10 +137,10 @@
|
||||
padding: 4px 17px 4px 4px
|
||||
|
||||
&::after
|
||||
@extend .fas
|
||||
@extend .fa-fw
|
||||
@extend .ico-notification-nonactive
|
||||
@extend .fw-ico
|
||||
|
||||
content: '\f129'
|
||||
content: ''
|
||||
position: absolute
|
||||
right: 2px
|
||||
top: 6px
|
||||
|
||||
@ -1,4 +0,0 @@
|
||||
cabal2nix.gup:
|
||||
*.nix
|
||||
hpack.gup:
|
||||
*.cabal
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
@ -1,8 +0,0 @@
|
||||
#! /usr/bin/env nix-shell
|
||||
#! nix-shell -i zsh -p zsh haskellPackages.cabal2nix
|
||||
|
||||
gup -u ${2:r}.cabal
|
||||
|
||||
cd ${2:h}
|
||||
|
||||
cabal2nix . > $1
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
@ -1,6 +0,0 @@
|
||||
#! /usr/bin/env nix-shell
|
||||
#! nix-shell -i sh -p haskellPackages.hpack
|
||||
|
||||
gup -u package.yaml
|
||||
|
||||
hpack - >$1
|
||||
@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user