change from standalone app to module

This commit is contained in:
Dennis Eichhorn 2022-11-20 13:51:18 +01:00
parent c53d780a0e
commit 7e40813b10
205 changed files with 1037 additions and 10271 deletions

16
.gitmodules vendored
View File

@ -1,15 +1,3 @@
[submodule "app/server/cOMS"]
path = app/server/cOMS
[submodule "server/cOMS"]
path = server/cOMS
url = https://github.com/Karaka-Management/cOMS.git
[submodule "app/web/phpOMS"]
path = app/web/phpOMS
url = https://github.com/Karaka-Management/phpOMS.git
[submodule "app/web/Resources"]
path = app/web/Resources
url = https://github.com/Karaka-Management/Resources.git
[submodule "app/web/cssOMS"]
path = app/web/cssOMS
url = https://github.com/Karaka-Management/cssOMS.git
[submodule "app/web/jsOMS"]
path = app/web/jsOMS
url = https://github.com/Karaka-Management/jsOMS.git

View File

@ -0,0 +1,93 @@
[
{
"id": 1008001001,
"pid": "/",
"type": 2,
"subtype": 1,
"name": "OnlineResourceWatcher",
"uri": "{/prefix}orw/dashboard?u={?u}",
"target": "self",
"icon": null,
"order": 40,
"from": "OnlineResourceWatcher",
"permission": { "permission": 2, "category": null, "element": null },
"parent": 1006901001,
"children": [
{
"id": 1008002001,
"pid": "/orw",
"type": 3,
"subtype": 1,
"name": "OnlineResourceWatcher",
"uri": "{/prefix}orw/dashboard?u={?u}",
"target": "self",
"icon": null,
"order": 1,
"from": "OnlineResourceWatcher",
"permission": { "permission": 2, "category": null, "element": null },
"parent": 1008001001,
"children": []
},
{
"id": 1008003001,
"pid": "/orw",
"type": 3,
"subtype": 1,
"name": "Archive",
"uri": "{/prefix}orw/archive?u={?u}",
"target": "self",
"icon": null,
"order": 5,
"from": "OnlineResourceWatcher",
"permission": { "permission": 2, "category": null, "element": null },
"parent": 1008001001,
"children": []
},
{
"id": 1008004001,
"pid": "/orw",
"type": 3,
"subtype": 1,
"name": "Create",
"uri": "{/prefix}orw/create?{?}",
"target": "self",
"icon": null,
"order": 10,
"from": "OnlineResourceWatcher",
"permission": { "permission": 4, "category": null, "element": null },
"parent": 1008001001,
"children": []
},
{
"id": 1008005001,
"pid": "/orw",
"type": 3,
"subtype": 1,
"name": "Draft",
"uri": "{/prefix}orw/draft/list?u={?u}",
"target": "self",
"icon": null,
"order": 15,
"from": "OnlineResourceWatcher",
"permission": { "permission": 4, "category": null, "element": null },
"parent": 1008001001,
"children": []
},
{
"id": 1008006001,
"pid": "/orw",
"type": 3,
"subtype": 1,
"name": "Analysis",
"uri": "{/prefix}orw/analysis",
"target": "self",
"icon": null,
"order": 15,
"from": "OnlineResourceWatcher",
"permission": { "permission": 4, "category": null, "element": null },
"parent": 1008001001,
"children": []
}
]
}
]

43
Admin/Install/Navigation.php Executable file
View File

@ -0,0 +1,43 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Admin\Install
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Admin\Install;
use phpOMS\Application\ApplicationAbstract;
/**
* Navigation class.
*
* @package Modules\OnlineResourceWatcher\Admin\Install
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
class Navigation
{
/**
* Install navigation providing
*
* @param ApplicationAbstract $app Application
* @param string $path Module path
*
* @return void
*
* @since 1.0.0
*/
public static function install(ApplicationAbstract $app, string $path) : void
{
\Modules\Navigation\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Navigation.install.json']);
}
}

165
Admin/Install/db.json Normal file
View File

@ -0,0 +1,165 @@
{
"orw_resource": {
"name": "orw_resource",
"fields": {
"orw_resource_id": {
"name": "orw_resource_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"orw_resource_status": {
"name": "orw_resource_status",
"type": "TINYINT",
"null": false
},
"orw_resource_uri": {
"name": "orw_resource_uri",
"type": "VARCHAR(255)",
"null": false
},
"orw_resource_xpath": {
"name": "orw_resource_xpath",
"type": "VARCHAR(255)",
"null": false
},
"orw_resource_hash": {
"name": "orw_resource_hash",
"type": "BLOB(64)",
"null": false
},
"orw_resource_last_version_path": {
"name": "orw_resource_last_version_path",
"type": "VARCHAR(255)",
"null": false
},
"orw_resource_last_version_date": {
"name": "orw_resource_last_version_date",
"type": "DATETIME",
"null": false
},
"orw_resource_checked_at": {
"name": "orw_resource_checked_at",
"type": "DATETIME",
"null": false
},
"orw_resource_org": {
"name": "orw_resource_org",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "org",
"foreignKey": "org_id"
},
"orw_resource_created_at": {
"name": "orw_resource_created_at",
"type": "DATETIME",
"null": false
}
}
},
"orw_resource_check": {
"name": "orw_resource_check",
"fields": {
"orw_resource_check_id": {
"name": "orw_resource_check_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"orw_resource_check_status": {
"name": "orw_resource_check_status",
"type": "TINYINT",
"null": false
},
"orw_resource_check_change": {
"name": "orw_resource_check_change",
"type": "TEXT",
"null": false
},
"orw_resource_check_created_at": {
"name": "orw_resource_check_created_at",
"type": "DATETIME",
"null": false
},
"orw_resource_check_resource": {
"name": "orw_resource_check_resource",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "orw_resource",
"foreignKey": "orw_resource_id"
}
}
},
"orw_resource_info": {
"name": "orw_resource_info",
"fields": {
"orw_resource_info_id": {
"name": "orw_resource_info_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"orw_resource_info_mail": {
"name": "orw_resource_info_mail",
"type": "VARCHAR(255)",
"null": true,
"default": null,
"annotations": {
"gdpr": true
}
},
"orw_resource_info_account": {
"name": "orw_resource_info_account",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "account",
"foreignKey": "account_id"
},
"orw_resource_info_resource": {
"name": "orw_resource_info_resource",
"type": "INT",
"null": true,
"default": null,
"foreignTable": "orw_resource",
"foreignKey": "orw_resource_id"
},
"orw_resource_info_created_at": {
"name": "orw_resource_info_created_at",
"type": "DATETIME",
"null": false
}
}
},
"orw_resource_blacklist": {
"name": "orw_resource_blacklist",
"fields": {
"orw_resource_blacklist_id": {
"name": "orw_resource_blacklist_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"orw_resource_blacklist_mail": {
"name": "orw_resource_blacklist_mail",
"type": "VARCHAR(255)",
"null": true,
"default": null,
"annotations": {
"gdpr": true
}
},
"orw_resource_blacklist_created_at": {
"name": "orw_resource_blacklist_created_at",
"type": "DATETIME",
"null": false
}
}
}
}

36
Admin/Installer.php Executable file
View File

@ -0,0 +1,36 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Admin
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Admin;
use phpOMS\Module\InstallerAbstract;
/**
* Installer class.
*
* @package Modules\OnlineResourceWatcher\Admin
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class Installer extends InstallerAbstract
{
/**
* Path of the file
*
* @var string
* @since 1.0.0
*/
public const PATH = __DIR__;
}

59
Admin/Routes/Web/Api.php Executable file
View File

@ -0,0 +1,59 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
use Modules\OnlineResourceWatcher\Controller\ApiController;
use Modules\OnlineResourceWatcher\Models\PermissionCategory;
use phpOMS\Account\PermissionType;
use phpOMS\Router\RouteVerb;
return [
'^.*/news.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\ApiController:apiOnlineResourceWatcherCreate',
'verb' => RouteVerb::PUT,
'permission' => [
'module' => ApiController::NAME,
'type' => PermissionType::CREATE,
'state' => PermissionCategory::RESOURCE,
],
],
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\ApiController:apiOnlineResourceWatcherUpdate',
'verb' => RouteVerb::SET,
'permission' => [
'module' => ApiController::NAME,
'type' => PermissionType::MODIFY,
'state' => PermissionCategory::RESOURCE,
],
],
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\ApiController:apiOnlineResourceWatcherGet',
'verb' => RouteVerb::GET,
'permission' => [
'module' => ApiController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::RESOURCE,
],
],
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\ApiController:apiOnlineResourceWatcherDelete',
'verb' => RouteVerb::DELETE,
'permission' => [
'module' => ApiController::NAME,
'type' => PermissionType::DELETE,
'state' => PermissionCategory::RESOURCE,
],
],
],
];

98
Admin/Routes/Web/Backend.php Executable file
View File

@ -0,0 +1,98 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
use Modules\OnlineResourceWatcher\Controller\BackendController;
use Modules\OnlineResourceWatcher\Models\PermissionCategory;
use phpOMS\Account\PermissionType;
use phpOMS\Router\RouteVerb;
return [
'^.*/news/dashboard.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherDashboard',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/article.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherArticle',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/archive.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherArchive',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::READ,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/draft/list.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherDraftList',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::MODIFY,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/create.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherCreate',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::CREATE,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/edit.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherEdit',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::MODIFY,
'state' => PermissionCategory::RESOURCE,
],
],
],
'^.*/news/analysis.*$' => [
[
'dest' => '\Modules\OnlineResourceWatcher\Controller\BackendController:viewOnlineResourceWatcherAnalysis',
'verb' => RouteVerb::GET,
'permission' => [
'module' => BackendController::NAME,
'type' => PermissionType::MODIFY,
'state' => PermissionCategory::RESOURCE,
],
],
],
];

36
Admin/Status.php Executable file
View File

@ -0,0 +1,36 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Admin
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Admin;
use phpOMS\Module\StatusAbstract;
/**
* Status class.
*
* @package Modules\OnlineResourceWatcher\Admin
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class Status extends StatusAbstract
{
/**
* Path of the file
*
* @var string
* @since 1.0.0
*/
public const PATH = __DIR__;
}

36
Admin/Uninstaller.php Executable file
View File

@ -0,0 +1,36 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Admin
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Admin;
use phpOMS\Module\UninstallerAbstract;
/**
* Uninstaller class.
*
* @package Modules\OnlineResourceWatcher\Admin
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class Uninstaller extends UninstallerAbstract
{
/**
* Path of the file
*
* @var string
* @since 1.0.0
*/
public const PATH = __DIR__;
}

29
Admin/Updater.php Executable file
View File

@ -0,0 +1,29 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Admin
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Admin;
use phpOMS\Module\UpdaterAbstract;
/**
* Updater class.
*
* @package Modules\OnlineResourceWatcher\Admin
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class Updater extends UpdaterAbstract
{
}

46
CODE_OF_CONDUCT.md Executable file
View File

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

82
CONTRIBUTING.md Executable file
View File

@ -0,0 +1,82 @@
# Development
## Development environment
The setup and configuration of the development environment is in the hands of every developer themselves. However, it is recommended to follow the setup instructions in the [Developer-Guide](https://github.com/Karaka-Management/Developer-Guide/blob/develop/general/setup.md).
## Code of conduct
Every organization member and contributor to the organization must follow the [code of conduct](../Policies & Guidelines/Code of conduct.md).
## Code changes
### Topics / Tasks / Todos
Generally, the development philosophy is result orientated. This means that anyone can propose tasks, pick up existing tasks or right away implement their code changes. However, implementing code changes without consulting with a senior developer in advance has a much higher risk of code changes not getting admitted. The easiest way to discuss a code change idea in advance are the github [issues](https://github.com/Karaka-Management/Karaka/issues) or [discussions](https://github.com/Karaka-Management/Karaka/discussions).
Developers are encouraged to pick open tasks with high priorities according to their own skill level. Senior developers may directly assign tasks to developers based on their importance. New developers may find it easier to start with a task that has a low priority as they often also have a lower difficulty.
Open tasks can be found in the project overview: [PROJECT.md](https://github.com/Karaka-Management/Organization-Guide/blob/master/Project/PROJECT.md)
Tasks currently in development are prefixed in the priority column with an asterisk `*` and a name tag in the task description of the developer who is working on the task.
The open tasks are reviewed once a month by a senior developer. The senior developer updates the project overview if necessary and requests feedback regarding development status of important tasks under development. During this process important tasks may also get directly assigned to developers. This review is performed on a judgmental bases of the senior basis.
### Code style
Code changes must follow the [style guidelines](https://github.com/Karaka-Management/Developer-Guide/tree/develop/standards). Additionally, the automatic code style inspection tools must return no errors, failures or warnings. Developers should test their changes with inspection tools and configurations mentioned in the [inspection documentation](https://github.com/Karaka-Management/Developer-Guide/blob/develop/quality/inspections.md) in advance before submitting them for review.
In rare cases errors, failures or warnings during the automatic inspection are acceptable. Reasons can be changes in the programming language, special cases which cannot, are difficult or must be individually configured in the inspection settings. If this is the case for a code change and if inspection configuration changes are necessary are decided by the senior developer performing the code review.
Automated checks which are run during the review process:
```sh
php ./vendor/bin/phpcs --severity=1 ./ --standard="Build/Config/phpcs.xml"
npx eslint ./ -c ./Build/Config/.eslintrc.json
```
### Tests
Code changes must follow the inspection guidelines (i.e. code coverage) mentioned in the [inspection documentation](https://github.com/Karaka-Management/Developer-Guide/blob/develop/quality/inspections.md). Developers should check if the code changes comply with the inspection guidelines before submitting them.
In rare cases it might be not possible to follow the inspection guidelines. In such cases the senior developer performing the code review may decide if the code change still gets accepted.
Automated tests which are run during the review process:
```sh
php ./vendor/bin/phpunit -c tests/PHPUnit/phpunit_default.xml
php ./vendor/bin/phpstan analyse --autoload-file=phpOMS/Autoloader.php -l 9 -c Build/Config/phpstan.neon ./
npx jasmine-node ./
./cOMS/tests/test.sh
```
Additional inspections which are run but might be ignored during the review depending on the use case are mentioned in the [inspection documentation](https://github.com/Karaka-Management/Developer-Guide/blob/develop/quality/inspections.md) as other checks.
### Demo
Some code changes may also require changes or extensions in the demo setup scripts. The demo setup script try to simulate a real world use case by generating and modifying mostly random data. This is also a good way to setup and “manually” test the code changes in a larger picture. The demo setup script can be found in the [demoSetup](https://github.com/Karaka-Management/demoSetup) repository. The demo setup script takes a long time due to the large amount of user input simulated data which is generated. Therefore it is recommended to run this only sporadically.
### Code review
In addition to the automatic code review performed by the various inspection tools such as (phpcs, phpstan, phpunit, eslint and custom scripts) a senior developer must check the proposed code change before it is merged with the respective `develop` branch. Only upon the approval by the reviewer a code change requests gets merged as no other developers have permission in the software to make such code merges.
In case a code change request is not approved the reviewer states the reason for the decision, this may include some tips and requests which will allow the contributor to make improvements so that the code change may get approved.
If the code reviewer only finds minor issues with the proposed code change the reviewer may make small changes to the proposed code change and inform the contributor to speed up the implementation process. Code reviewers are encouraged to do this with new contributors to avoid long iteration processes and to not discourage new developers. However, communication is key and severe issues with code change requests or if the contributor already made multiple code change requests in the past the reviewer should not implement the improvements by himself and rather decline the code change requests with his reasoning.
### Release flow
Code changes must be performed in a new branch. A new branch can be created with:
```sh
git checkout -b new-branch-name
```
The name of the branch can be chosen freely however it is recommended to follow the following branch naming conventions:
* `feature-*` for feature implementations
* `bug-*` for bug fixes
* `security-*` for security related fixes/improvements
* `general-*` for general improvements (i.e. code documentation improvements, code style improvements)
The senior developer who performs the code review merges the change request into the `develop` branch upon approval.

View File

@ -0,0 +1,28 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Controller;
/**
* OnlineResourceWatcher controller class.
*
* @package Modules\OnlineResourceWatcher
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class ApiController extends Controller
{
}

View File

@ -0,0 +1,36 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Controller;
use Modules\Auditor\Models\AuditMapper;
use phpOMS\Contract\RenderableInterface;
use phpOMS\DataStorage\Database\Query\OrderType;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
use Web\Backend\Views\TableView;
/**
* OnlineResourceWatcher controller class.
*
* @package Modules\OnlineResourceWatcher
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
final class BackendController extends Controller
{
}

76
Controller/Controller.php Normal file
View File

@ -0,0 +1,76 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Controller;
use phpOMS\Module\ModuleAbstract;
/**
* OnlineResourceWatcher controller class.
*
* @package Modules\OnlineResourceWatcher
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
class Controller extends ModuleAbstract
{
/**
* Module path.
*
* @var string
* @since 1.0.0
*/
public const PATH = __DIR__ . '/../';
/**
* Module version.
*
* @var string
* @since 1.0.0
*/
public const VERSION = '1.0.0';
/**
* Module name.
*
* @var string
* @since 1.0.0
*/
public const NAME = 'OnlineResourceWatcher';
/**
* Module id.
*
* @var int
* @since 1.0.0
*/
public const ID = 1008000000;
/**
* Providing.
*
* @var string[]
* @since 1.0.0
*/
protected static array $providing = [];
/**
* Dependencies.
*
* @var string[]
* @since 1.0.0
*/
protected static array $dependencies = [];
}

49
ICAL.txt Executable file
View File

@ -0,0 +1,49 @@
# Individual Contributor License Agreement ("CLA") 1.0
Thank you for your interest in Karaka-Management (the "Company"). In order to clarify the intellectual property license granted with Contributions from any person or entity, the Company must provide a Contributor License Agreement ("CLA") on file that has been made available to each Contributor. This license is for your protection as a Contributor as well as the protection of the Company and its users; it does not change your rights to use your own Contributions for any other purpose.
By contributing to the Company You accept and agree to the following terms and conditions for Your present and future Contributions submitted to the Company. In return, the Company shall not use Your Contributions in a way that is contrary to the public benefit or inconsistent with its bylaws in effect at the time of the Contribution. Except for the license granted herein to the Company and recipients of software distributed by the Company, You reserve all right, title, and interest in and to Your Contributions.
## Definitions
**"You" (or "Your")**
"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with the Company. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
**"Contribution"**
"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to the Company for inclusion in, or documentation of, any of the products owned or managed by the Company (the "Work"). This includes but is not limited to technical material, techniques, articles, sketches, drawings, images, models, inventions, know-how, processes, apparatus, equipment, algorithms, software programs, software source documents, and formula related to the current, future and proposed products and services regarding the Company". For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Company or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Company for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."
## Grant of Copyright License
Subject to the terms and conditions of this Agreement, You hereby grant to the Company and to recipients of software distributed by the Company a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sub license, and distribute Your Contributions and such derivative works.
## Grant of Patent License
Subject to the terms and conditions of this Agreement, You hereby grant to the Company and to recipients of software distributed by the Company a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed.
## Authorization
You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to the Company, or that your employer has executed a separate Corporate CLA with the Company.
You represent that each of Your Contributions is Your original creation (see "Third-party Contribution" for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions.
## Support
You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
## Third-party Contribution
Should You wish to submit work that is not Your original creation, You may submit it to the Company separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".
## Survival
This Agreement shall govern all communications between the parties. You understand that this Agreement stays active even if the connection with You gets terminated unless the project the Company gets officially canceled by the project manager "Dennis Eichhorn".
## Governing Law and Jurisdiction
This Agreement shall be governed exclusively by German law. The courts of Hessen, Germany shall have exclusive jurisdiction.
## Entire Agreement
This agreement constitutes the entire agreement and supersedes all prior or contemporaneous oral or written agreements concerning such Contribution. This agreement may only be changed by mutual agreement of authorized representatives of the parties in writing. You agree to notify the Company of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect.

56
LICENSE.txt Normal file → Executable file
View File

@ -1,14 +1,48 @@
The OMS License 1.0
The OMS License
Version 2.0
Copyright (c) <Dennis Eichhorn> All Rights Reserved
1. Definitions
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by this entire document.
BY CONTRIBUTING YOU AUTOMATICALLY ACCEPT THE INDIVIDUAL CONTRIBUTOR LICENSE
AGREEMENT 1.0 ("CLA") INCLUDED IN THIS REPOSITORY.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License
Subject to the terms and conditions of this License, each Contributor grants to You after purchase a perpetual, worldwide, non-exclusive, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform the Work and such Derivative Works in Source or Object form. You are not allowed to sublicense, reproduce, or distribute the Work and such Derivative Works in Source or Object form.
3. Redistribution.
You may not reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form.
4. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
5. Trademarks
This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work.
6. Disclaimer of Warranty
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using the Work and assume any risks associated with Your exercise of permissions under this License.
7. Limitation of Liability
In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

34
Models/PermissionCategory.php Executable file
View File

@ -0,0 +1,34 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Modules\OnlineResourceWatcher\Models
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Modules\OnlineResourceWatcher\Models;
use phpOMS\Stdlib\Base\Enum;
/**
* Permision state enum.
*
* @package Modules\OnlineResourceWatcher\Models
* @license OMS License 1.0
* @link https://karaka.app
* @since 1.0.0
*/
abstract class PermissionCategory extends Enum
{
public const RESOURCE = 1;
public const REPORT = 2;
public const ORGANIZATION = 3;
}

@ -1 +0,0 @@
Subproject commit ac6079ac40e18d84fc464872ec81534f495a5c7d

View File

@ -1,107 +0,0 @@
# BEGIN Gzip Compression
<ifmodule mod_rewrite.c>
AddEncoding gzip .gz
<filesmatch "\.js\.gz$">
AddType "text/javascript" .gz
</filesmatch>
<filesmatch "\.css\.gz$">
AddType "text/css" .gz
</filesmatch>
</ifmodule>
AddType font/ttf .ttf
AddType font/otf .otf
AddType application/font-woff .woff
AddType application/vnd.ms-fontobject .eot
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript text/javascript
</ifmodule>
# END Gzip Compression
# Force mime for javascript files
<Files "*.js">
ForceType text/javascript
</Files>
# BEGIN Caching
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault A300
ExpiresByType image/x-icon A2592000
<FilesMatch ".(php)$">
ExpiresDefault A0
Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
Header set Pragma "no-cache"
</FilesMatch>
</ifModule>
# END Caching
# BEGIN Spelling
<IfModule mod_speling.c>
CheckSpelling On
CheckCaseOnly On
</IfModule>
# END Spelling
# BEGIN URL rewrite
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME} \.(js|css)$
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /?{QUERY_STRING} [QSA]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} !^(127\.0\.0)|(192\.)|(172\.)
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</ifmodule>
# END URL rewrite
# BEGIN Access control
<Files *.php>
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Files>
<Files index.php>
Allow from all
</Files>
# END Access control
# Disable directory view
Options All -Indexes
# Disable unsupported scripts
Options -ExecCGI
AddHandler cgi-script .pl .py .jsp .asp .shtml .sh .cgi
#<ifmodule mod_headers.c>
# # XSS protection
# header always set x-xss-protection "1; mode=block"
#
# # Nosnif
# header always set x-content-type-options "nosniff"
#
# # Iframes only from self
# header always set x-frame-options "SAMEORIGIN"
#</ifmodule>
<ifmodule mod_headers.c>
<FilesMatch "ServiceWorker.js$">
Header set Service-Worker-Allowed "/"
</FilesMatch>
</ifmodule>
# Php config
# This should be removed from here and adjusted in the php.ini file
php_value upload_max_filesize 40M
php_value post_max_size 40M
php_value memory_limit 128M
php_value max_input_time 30
php_value max_execution_time 30

View File

@ -1,183 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Applications\Api
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\Api;
use Models\AccountMapper;
use Models\LocalizationMapper;
use Models\NullAccount;
use phpOMS\Account\Account;
use phpOMS\Account\AccountManager;
use phpOMS\Account\PermissionType;
use phpOMS\Application\ApplicationAbstract;
use phpOMS\Application\ApplicationStatus;
use phpOMS\Auth\Auth;
use phpOMS\DataStorage\Cache\CachePool;
use phpOMS\DataStorage\Cookie\CookieJar;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
use phpOMS\DataStorage\Session\HttpSession;
use phpOMS\Dispatcher\Dispatcher;
use phpOMS\Event\EventManager;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Model\Html\Head;
use phpOMS\Module\ModuleManager;
use phpOMS\Router\RouteVerb;
use phpOMS\Router\WebRouter;
use phpOMS\System\File\PathException;
use phpOMS\System\MimeType;
use phpOMS\Uri\UriFactory;
use phpOMS\Views\View;
use WebApplication;
final class Application
{
private WebApplication $app;
private array $config;
public function __construct(WebApplication $app, array $config)
{
$this->app = $app;
$this->app->appName = 'Api';
$this->config = $config;
UriFactory::setQuery('/app', \strtolower($this->app->appName));
}
public function run(HttpRequest $request, HttpResponse $response): void
{
$response->header->set('Content-Type', 'text/plain; charset=utf-8');
$pageView = new View($this->app->l11nManager, $request, $response);
$this->app->l11nManager = new L11nManager($this->app->appName);
$this->app->dbPool = new DatabasePool();
$this->app->router = new WebRouter($this->app);
$this->app->router->importFromFile(__DIR__ . '/Routes.php');
$this->app->sessionManager = new HttpSession(0);
$this->app->cookieJar = new CookieJar();
$this->app->dispatcher = new Dispatcher($this->app);
$this->app->dbPool->create('core', $this->config['db']['core']['masters']['admin']);
$this->app->dbPool->create('insert', $this->config['db']['core']['masters']['insert']);
$this->app->dbPool->create('select', $this->config['db']['core']['masters']['select']);
$this->app->dbPool->create('update', $this->config['db']['core']['masters']['update']);
$this->app->dbPool->create('delete', $this->config['db']['core']['masters']['delete']);
$this->app->dbPool->create('schema', $this->config['db']['core']['masters']['schema']);
/* Checking csrf token, if a csrf token is required at all has to be decided in the route or controller */
if ($request->getData('CSRF') !== null
&& !\hash_equals($this->app->sessionManager->get('CSRF'), $request->getData('CSRF'))
) {
$response->header->status = RequestStatusCode::R_403;
return;
}
/** @var \phpOMS\DataStorage\Database\Connection\ConnectionAbstract $con */
$con = $this->app->dbPool->get();
DataMapperFactory::db($con);
$this->app->cachePool = new CachePool();
$this->app->eventManager = new EventManager($this->app->dispatcher);
$this->app->eventManager->importFromFile(__DIR__ . '/Hooks.php');
$this->app->accountManager = new AccountManager($this->app->sessionManager);
$this->app->l11nServer = LocalizationMapper::get()->where('id', 1)->execute();
$aid = Auth::authenticate($this->app->sessionManager);
$request->header->account = $aid;
$response->header->account = $aid;
$account = $this->loadAccount($request);
if (!($account instanceof NullAccount)) {
$response->header->l11n = $account->l11n;
} elseif ($this->app->sessionManager->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->sessionManager->get('language'),
$this->app->sessionManager->get('country') ?? '*'
);
} elseif ($this->app->cookieJar->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->cookieJar->get('language'),
$this->app->cookieJar->get('country') ?? '*'
);
}
UriFactory::setQuery('/lang', $response->getLanguage());
$response->header->set('content-language', $response->getLanguage(), true);
$appStatus = ApplicationStatus::NORMAL;
if ($appStatus === ApplicationStatus::READ_ONLY || $appStatus === ApplicationStatus::DISABLED) {
if (!$account->hasGroup(3)) {
if ($request->getRouteVerb() !== RouteVerb::GET) {
// Application is in read only mode or completely disabled
// If read only mode is active only GET requests are allowed
// A user who is part of the admin group is excluded from this rule
$response->header->status = RequestStatusCode::R_405;
return;
}
$this->app->dbPool->remove('admin');
$this->app->dbPool->remove('insert');
$this->app->dbPool->remove('update');
$this->app->dbPool->remove('delete');
$this->app->dbPool->remove('schema');
}
}
$routed = $this->app->router->route(
$request->uri->getRoute(),
$request->getData('CSRF'),
$request->getRouteVerb(),
$this->app->appName,
$this->app->orgId,
$account,
$request->getData()
);
$dispatched = $this->app->dispatcher->dispatch($routed, $request, $response);
if (empty($dispatched)) {
$response->header->set('Content-Type', MimeType::M_JSON . '; charset=utf-8', true);
$response->header->status = RequestStatusCode::R_404;
$response->set($request->uri->__toString(), [
'status' => \phpOMS\Message\NotificationLevel::ERROR,
'title' => '',
'message' => '',
'response' => [],
]);
}
$pageView->addData('dispatch', $dispatched);
}
private function loadAccount(HttpRequest $request): Account
{
/** @var Account $account */
$account = AccountMapper::get()->with('groups')->with('l11n')->where('id', $request->header->account)->execute();
$this->app->accountManager->add($account);
return $account;
}
}

View File

@ -1,30 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Router\RouteVerb;
return [
'.*?/download' => [
[
'dest' => '\Controllers\ApiController:downloadView',
'verb' => RouteVerb::GET,
],
],
'^.*?/login(\?.*|$)' => [
[
'dest' => '\Controllers\ApiController:apiLogin',
'verb' => RouteVerb::SET,
'permission' => [
],
],
],
'^.*?/logout(\?.*|$)' => [
[
'dest' => '\Controllers\ApiController:apiLogout',
'verb' => RouteVerb::SET,
'permission' => [
],
],
],
];

View File

@ -1,275 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Applications\Backend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\Backend;
use Models\AccountMapper;
use Models\CoreSettings;
use Models\LocalizationMapper;
use phpOMS\Account\Account;
use phpOMS\Account\NullAccount;
use phpOMS\Account\AccountManager;
use phpOMS\Asset\AssetType;
use phpOMS\Auth\Auth;
use phpOMS\DataStorage\Cache\CachePool;
use phpOMS\DataStorage\Cookie\CookieJar;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\DataStorage\Database\DatabaseStatus;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
use phpOMS\DataStorage\Session\HttpSession;
use phpOMS\Dispatcher\Dispatcher;
use phpOMS\Event\EventManager;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse;
use phpOMS\Message\Http\RequestMethod;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Model\Html\Head;
use phpOMS\Router\WebRouter;
use phpOMS\Uri\UriFactory;
use phpOMS\Views\View;
use phpOMS\Utils\Parser\Markdown\Markdown;
use WebApplication;
final class Application
{
private WebApplication $app;
private array $config;
public function __construct(WebApplication $app, array $config)
{
$this->app = $app;
$this->app->appName = 'Backend';
$this->config = $config;
UriFactory::setQuery('/app', \strtolower($this->app->appName));
}
public function run(HttpRequest $request, HttpResponse $response) : void
{
$this->app->l11nManager = new L11nManager($this->app->appName);
$this->app->dbPool = new DatabasePool();
$this->app->sessionManager = new HttpSession(0);
$this->app->cookieJar = new CookieJar();
$this->app->dispatcher = new Dispatcher($this->app);
$this->app->dbPool->create('select', $this->config['db']['core']['masters']['select']);
$this->app->router = new WebRouter($this->app);
$this->app->router->importFromFile(__DIR__ . '/Routes.php');
$this->app->router->importFromFile(__DIR__ . '/../../Routes.php');
/* CSRF token OK? */
if ($request->getData('CSRF') !== null
&& !\hash_equals($this->app->sessionManager->get('CSRF'), $request->getData('CSRF'))
) {
$response->header->status = RequestStatusCode::R_403;
return;
}
/** @var \phpOMS\DataStorage\Database\Connection\ConnectionAbstract $con */
$con = $this->app->dbPool->get();
DataMapperFactory::db($con);
$this->app->cachePool = new CachePool();
$this->app->appSettings = new CoreSettings();
$this->app->eventManager = new EventManager($this->app->dispatcher);
$this->app->accountManager = new AccountManager($this->app->sessionManager);
$this->app->l11nServer = LocalizationMapper::get()->where('id', 1)->execute();
$aid = Auth::authenticate($this->app->sessionManager);
$request->header->account = $aid;
$response->header->account = $aid;
$account = $this->loadAccount($request);
if (!($account instanceof NullAccount)) {
$response->header->l11n = $account->l11n;
} elseif ($this->app->sessionManager->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->sessionManager->get('language'),
$this->app->sessionManager->get('country') ?? '*'
);
} elseif ($this->app->cookieJar->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->cookieJar->get('language'),
$this->app->cookieJar->get('country') ?? '*'
);
}
if (!\in_array($response->getLanguage(), $this->config['language'])) {
$response->header->l11n->setLanguage($this->app->l11nServer->getLanguage());
}
$pageView = new BackendView($this->app->l11nManager, $request, $response);
$head = new Head();
$pageView->setData('head', $head);
$response->set('Content', $pageView);
/* Backend only allows GET */
if ($request->getMethod() !== RequestMethod::GET) {
$this->create406Response($response, $pageView);
return;
}
/* Database OK? */
if ($this->app->dbPool->get()->getStatus() !== DatabaseStatus::OK) {
$this->create503Response($response, $pageView);
return;
}
UriFactory::setQuery('/lang', $response->getLanguage());
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/lang/' . $response->getLanguage() . '.lang.php'
);
$response->header->set('content-language', $response->getLanguage(), true);
/* Create html head */
$this->initResponseHead($head, $request, $response);
/* Handle not logged in */
if ($account->getId() < 1) {
$this->createBaseLoggedOutResponse($request, $response, $head, $pageView);
return;
}
$this->createDefaultPageView($request, $response, $pageView);
$dispatched = $this->app->dispatcher->dispatch(
$this->app->router->route(
$request->uri->getRoute(),
$request->getData('CSRF'),
$request->getRouteVerb(),
$this->app->appName,
$this->app->orgId,
$account,
$request->getData()
),
$request,
$response
);
$pageView->addData('dispatch', $dispatched);
}
private function createDefaultPageView(HttpRequest $request, HttpResponse $response, BackendView $pageView) : void
{
$pageView->setTemplate('/Applications/Backend/index');
}
private function create406Response(HttpResponse $response, View $pageView) : void
{
$response->header->status = RequestStatusCode::R_406;
$pageView->setTemplate('/Applications/Backend/Error/406');
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/Error/lang/' . $response->getLanguage() . '.lang.php'
);
}
private function create503Response(HttpResponse $response, View $pageView) : void
{
$response->header->status = RequestStatusCode::R_503;
$pageView->setTemplate('/Applications/Backend/Error/503');
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/Error/lang/' . $response->getLanguage() . '.lang.php'
);
}
private function loadAccount(HttpRequest $request) : Account
{
/** @var Account $account */
$account = AccountMapper::get()->with('groups')->with('l11n')->where('id', $request->header->account)->execute();
$this->app->accountManager->add($account);
return $account;
}
private function initResponseHead(Head $head, HttpRequest $request, HttpResponse $response) : void
{
/* Load assets */
$head->addAsset(AssetType::CSS, 'Resources/fonts/fontawesome/css/font-awesome.min.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/linearicons/css/style.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/lineicons/css/lineicons.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'cssOMS/styles.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/Roboto/roboto.css?v=1.0.0');
// Framework
$head->addAsset(AssetType::JS, 'jsOMS/Utils/oLib.js?v=1.0.0');
$head->addAsset(AssetType::JS, 'jsOMS/UnhandledException.js?v=1.0.0');
$head->addAsset(AssetType::JS, 'Applications/Backend/js/backend.js?v=1.0.0', ['type' => 'module']);
$script = '';
$response->header->set(
'content-security-policy',
'base-uri \'self\'; script-src \'self\' blob: \'sha256-'
. \base64_encode(\hash('sha256', $script, true))
. '\'; worker-src \'self\'',
true
);
if ($request->hasData('debug')) {
$head->addAsset(AssetType::CSS, 'cssOMS/debug.css?v=1.0.0');
\phpOMS\DataStorage\Database\Query\Builder::$log = true;
}
$css = \file_get_contents(__DIR__ . '/css/backend-small.css');
if ($css === false) {
$css = '';
}
$css = \preg_replace('!\s+!', ' ', $css);
$head->setStyle('core', $css ?? '');
$head->title = 'Online Resource Watcher';
}
private function createBaseLoggedOutResponse(HttpRequest $request, HttpResponse $response, Head $head, View $pageView) : void
{
$file = \in_array($request->uri->getPathElement(0), ['forgot', 'reset', 'privacy', 'imprint', 'terms'])
? 'signin-legal'
: 'signin';
if ($file === 'signin-legal') {
$lang = $request->getLanguage();
$path = \is_file(__DIR__ . '/content/' . $request->uri->getPathElement(0) . '.' . $lang . '.md')
? __DIR__ . '/content/' . $request->uri->getPathElement(0) . '.' . $lang . '.md'
: __DIR__ . '/content/' . $request->uri->getPathElement(0) . '.en.md';
$markdown = Markdown::parse(\file_get_contents($path));
$pageView->setData('markdown', $markdown);
}
$response->header->status = RequestStatusCode::R_403;
$pageView->setTemplate('/Applications/Backend/' . $file);
$css = \file_get_contents(__DIR__ . '/css/signin-small.css');
if ($css === false) {
$css = '';
}
$css = \preg_replace('!\s+!', ' ', $css);
$head->setStyle('core', $css ?? '');
}
}

View File

@ -1,28 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Web\Backend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\Backend;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
class BackendView extends View
{
public function __construct(L11nManager $l11n = null, RequestAbstract $request = null, ResponseAbstract $response = null)
{
parent::__construct($l11n, $request, $response);
}
}

View File

@ -1,100 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Router\RouteVerb;
return [
'^/*$' => [
[
'dest' => '\Controllers\BackendController:dashboardView',
'verb' => RouteVerb::GET,
],
],
'^/admin/organizations$' => [
[
'dest' => '\Controllers\BackendController:adminOrganizationsView',
'verb' => RouteVerb::GET,
],
],
'^/admin/users$' => [
[
'dest' => '\Controllers\BackendController:adminUsersView',
'verb' => RouteVerb::GET,
],
],
'^/admin/resources$' => [
[
'dest' => '\Controllers\BackendController:adminResourcesView',
'verb' => RouteVerb::GET,
],
],
'^/admin/bills$' => [
[
'dest' => '\Controllers\BackendController:adminBillsView',
'verb' => RouteVerb::GET,
],
],
'^/admin/logs$' => [
[
'dest' => '\Controllers\BackendController:adminLogsView',
'verb' => RouteVerb::GET,
],
],
'^/organization/settings$' => [
[
'dest' => '\Controllers\BackendController:organizationSettingsView',
'verb' => RouteVerb::GET,
],
],
'^/organization/users$' => [
[
'dest' => '\Controllers\BackendController:organizationUsersView',
'verb' => RouteVerb::GET,
],
],
'^/organization/users/\d+$' => [
[
'dest' => '\Controllers\BackendController:organizationUsersEditView',
'verb' => RouteVerb::GET,
],
],
'^/organization/resources$' => [
[
'dest' => '\Controllers\BackendController:organizationResourcesView',
'verb' => RouteVerb::GET,
],
],
'^/organization/bills$' => [
[
'dest' => '\Controllers\BackendController:organizationBillsView',
'verb' => RouteVerb::GET,
],
],
'^/user/settings$' => [
[
'dest' => '\Controllers\BackendController:userSettingsView',
'verb' => RouteVerb::GET,
],
],
'^/user/resources$' => [
[
'dest' => '\Controllers\BackendController:userResourcesView',
'verb' => RouteVerb::GET,
],
],
'^/user/resources/create$' => [
[
'dest' => '\Controllers\BackendController:userResourcesCreateView',
'verb' => RouteVerb::GET,
],
],
'^/user/reports$' => [
[
'dest' => '\Controllers\BackendController:userReportsView',
'verb' => RouteVerb::GET,
],
],
];

View File

@ -1,28 +0,0 @@
# Impressum
jingga
**Vertreten durch**
Dennis Eichhorn
**Kontakt**
spl1nes.com@googlemail.com
**Registereintrag**
Nicht vorhanden
**Umsatzsteuer-ID gemäß §27 a Umsatzsteuergesetz**
Nicht vorhanden
**Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV**
jingga
Dennis Eichhorn
**Datenschutzbeauftragter**
spl1nes.com@googlemail.com

View File

@ -1,28 +0,0 @@
# Imprint
jingga
**Represented by**
Dennis Eichhorn
**Contact**
spl1nes.com@googlemail.com
**Commercial register**
Not available
**VAT-ID according §27 a value added tax (Umsatzsteuergesetz)**
Not available
**Responsible for the content according to § 55 Abs. 2 RStV**
jingga
Dennis Eichhorn
**Data protection officer**
spl1nes.com@googlemail.com

View File

@ -1,48 +0,0 @@
# Datenschutzerklärung
## Definitionen
Für die Zwecke dieser Datenschutzerklärung:
* ANGESCHLOSSEN bedeutet ein Unternehmen, das eine Partei kontrolliert, von ihr kontrolliert wird oder mit ihr unter gemeinsamer Kontrolle steht, wobei "Kontrolle" den Besitz von 50 % oder mehr der Aktien, Anteile oder anderer Wertpapiere bedeutet, die zur Wahl von Direktoren oder anderen leitenden Angestellten berechtigt sind.
* LAND bezieht sich auf Deutschland.
* UNTERNEHMEN (in dieser VEREINBARUNG entweder als "das Unternehmen", "wir", "uns" oder "unser" bezeichnet) bezieht sich auf jingga, Gartenstr. 26, 61206 Wöllstadt.
* GERÄT bezeichnet jedes Gerät, das auf den Dienst zugreifen kann, wie z.B. ein Computer, ein Mobiltelefon oder ein digitales Tablet.
* SERVICE bezieht sich auf die Website.
* TERMINE oder VEREINBARUNG bezeichnet diese Bedingungen, die die gesamte Vereinbarung zwischen Ihnen und der FIRMA bezüglich der Nutzung des SERVICE bilden.
* Social-Media-Dienst eines Dritten bezeichnet alle Dienste oder Inhalte (einschließlich Daten, Informationen, Produkte oder Dienste), die von einem Dritten bereitgestellt werden und durch den DIENST angezeigt, einbezogen oder verfügbar gemacht werden können.
* WEBSITE bezieht sich auf jingga.app.
* ANWENDUNG bezieht sich auf alle herunterladbaren oder installierbaren Inhalte, die auf einem bestimmten GERÄT genutzt werden können.
* Sie bezeichnet die Person, die auf die DIENSTE zugreift oder diese nutzt, oder das Unternehmen oder eine andere juristische Person, in deren Namen eine solche Person auf die DIENSTE zugreift oder diese nutzt, je nachdem.
## Was sind personenbezogene Daten?
Personenbezogene Daten sind Informationen, die dazu genutzt werden können, persönliche oder sachliche Verhältnisse über Sie zu erfahren (z.B. Name, Anschrift, Telefonnummer, Geburtsdatum, E-Mail-Adresse). Informationen, bei denen wir keinen (oder nur mit einem unverhältnismäßigen Aufwand) Bezug zu Ihrer Person herstellen können, z.B. durch Anonymisierung der Informationen, sind keine personenbezogenen Daten.
## Welche personenbezogenen Daten werden von uns erhoben/verarbeitet und genutzt?
Gespeichert werden Zugriffsdaten ohne Personenbezug, wie z.B. der Name Ihres Internet Service Providers, die Seite, von der aus Sie uns besuchen, die Namen der angeforderten Dateien und deren Abrufdatum. Diese Daten werden ausschließlich zur Verbesserung unseres Angebotes ausgewertet und erlauben keinerlei Rückschlüsse auf Ihre Person.
Soweit Sie von uns auf unserem Internetauftritt angebotene Leistungen, wie den Kauf von ANWENDUNGEN, etc., in Anspruch nehmen wollen, ist es dagegen nötig, dass Sie dazu weitere Daten angeben. Es handelt sich um diejenigen Daten, die zur jeweiligen Abwicklung erforderlich sind, z.B. die E-Mailadresse bei Bestellung einer DIENSTLEISTUNG oder ANWENDUNG.
Wir nutzen die von uns über Sie erhobenen Daten für die Bereitstellung der von uns angebotenen Produkte und DIENSTLEISTUNG, für die Beantwortung Ihrer Fragen sowie für den Betrieb und die Verbesserung unserer Webseiten und ANWENDUNG.
Eine weitere Nutzung Ihrer personenbezogenen Daten findet nicht statt. Eine Übermittlung Ihrer personenbezogenen Daten an Dritte oder eine Nutzung Ihrer Daten zu Werbezwecken ohne Ihre Einwilligung findet, ausgenommen der unten dargestellten Fälle, nicht statt, es sei denn, dass wir gesetzlich zur Herausgabe von Daten verpflichtet sind (Auskunft an Strafverfolgungsbehörden und Gerichte; Auskunft an öffentliche Stellen, die Daten aufgrund gesetzlicher Vorschriften erhalten, z.B. Sozialversicherungsträger, Finanzbehörden usw.) oder dass wir zur Durchsetzung unserer Forderungen Dritte einschalten. Insbesondere werden personenbezogene Daten wie folgt genutzt:
* Wenn Sie sich bei jingga registrieren, wird zunächst Ihre E-Mail-Adresse von uns gespeichert, damit wir Ihnen neue Zugangsdaten zusenden können, falls Sie diese einmal vergessen sollten. Zudem speichern wir Ihren Vor- und Nachnamen sowie Ihr Passwort, um Ihnen ein komfortables Einloggen zu Ihrem Konto zu ermöglichen. Diese Daten werden von uns zu den vorbeschriebenen Zwecken genutzt, um Ihnen diesen Dienst anzubieten.
* Nehmen Sie die Möglichkeit in Anspruch, mittels unseres Kontaktformulars Anfragen an uns zu richten, fragen wir Sie nach Ihrem Namen und Ihrer E-Mail-Adresse. Ferner können Sie in dem Mitteilungsfeld Ihre individuelle Nachricht an uns eintragen. Es unterliegt Ihrer freien Entscheidung, ob Sie uns diese Daten mitteilen. Ohne diese Angaben können wir allerdings Ihren Kontaktwunsch nicht erfüllen.
## Änderungen dieser Bedingungen
Wir behalten uns das Recht vor, diese Bedingungen nach unserem alleinigen Ermessen jederzeit zu ändern oder zu ersetzen. Wenn eine Änderung wesentlich ist, werden wir uns angemessen bemühen, Sie mindestens 30 Tage vor Inkrafttreten der neuen Bedingungen zu informieren. Was eine wesentliche Änderung darstellt, wird nach unserem alleinigen Ermessen festgelegt.
Indem Sie nach Inkrafttreten dieser Änderungen weiterhin auf unseren SERVICE zugreifen oder ihn nutzen, erklären Sie sich mit den überarbeiteten Bedingungen einverstanden. Wenn Sie mit den neuen Bedingungen ganz oder teilweise nicht einverstanden sind, beenden Sie bitte die Nutzung der WEBSITE und des SERVICE.
## Kontakt
Bei Fragen zu diesen Bedingungen, den Datenschutzrichtlinien oder den Praktiken von Websites oder Diensten Dritter können Sie uns unter info@jingga.app kontaktieren. Sie erkennen ferner an und erklären sich damit einverstanden, dass die FIRMA weder direkt noch indirekt für Schäden oder Verluste verantwortlich oder haftbar ist, die durch oder in Verbindung mit der Nutzung von oder dem Vertrauen auf solche Inhalte, Waren oder Dienstleistungen, die auf oder über solche Websites oder Dienste verfügbar sind, verursacht werden oder angeblich verursacht werden.
Unseren Datenschutzbeauftragten erreichen Sie bei Fragen über die genannte Adresse oder per Mail an spl1nes.com@googlemail.com.
Wir empfehlen Ihnen dringend, die Geschäftsbedingungen und Datenschutzrichtlinien der von Ihnen besuchten Websites oder Dienste Dritter zu lesen.
Version 2022-08-14

View File

@ -1,48 +0,0 @@
# Privacy
## Definitions
For the purposes of these TERMS:
* AFFILIATED means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
* COUNTRY refers to Germany
* COMPANY (referred to as either "the Company", "We", "Us" or "Our" in this AGREEMENT) refers to jingga, Gartenstr. 26, 61206 Woellstadt.
* DEVICE means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* SERVICE refers to the Website
* TERMS or AGREEMENT mean these terms that form the entire agreement between You and the COMPANY regarding the use of the SERVICE.
* Third-party Social Media Service means any services or content (including data, information, products or services) provided by a third-party that may be displayed, included or made available by the SERVICE.
* WEBSITE refers to jingga.app
* APPLICATION refers to all downloadable or installable content which can therfore be used on an a given DEVICE.
* You means the individual accessing or using the SERVICES, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
## What is personal data?
Personal data is information that can be used to find out personal or factual circumstances about you (e.g. name, address, telephone number, date of birth, e-mail address). Information for which we cannot (or can only with a disproportionate effort) establish a relationship to your person, e.g. by anonymizing the information, is not personal data.
## What personal data do we collect/process and use?
Access data without personal reference is stored, such as the name of your Internet service provider, the page from which you visit us, the names of the requested files and their retrieval date. These data are evaluated exclusively for the improvement of our offer and do not allow any conclusions to be drawn about your person.
If you wish to make use of services offered by us on our website, such as the purchase of APPLICATIONS, etc., it is necessary, on the other hand, for you to provide further data for this purpose. This is the data that is required for the respective processing, e.g. the e-mail address when ordering a SERVICE or APPLICATION.
We use the data we collect about you to provide the products and SERVICES we offer, to answer your questions and to operate and improve our websites and APPLICATION.
No further use of your personal data will take place. A transfer of your personal data to third parties or a use of your data for advertising purposes without your consent will not take place, except for the cases described below, unless we are required by law to disclose data (information to law enforcement agencies and courts; information to public bodies that receive data under statutory provisions, e.g. social security agencies, tax authorities, etc.) or that we involve third parties to enforce our claims. In particular, personal data is used as follows:
* When you register with jingga, we first store your e-mail address so that we can send you new access data in case you forget it. In addition, we store your first and last name as well as your password to enable you to log in to your account conveniently. These data are used by us for the purposes described above in order to offer you this service.
* If you make use of the possibility to send inquiries to us by means of our contact form, we will ask you for your name and e-mail address. Furthermore, you can enter your individual message to us in the message field. It is your free decision whether you provide us with this data. However, we cannot fulfill your contact request without this information.
## Changes to these Terms
We reserve the right, at Our sole discretion, to modify or replace these TERMS at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.
By continuing to access or use Our SERVICE after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the WEBSITE and the SERVICE.
## Contact
For questions regarding these TERMS, privacy policies, or practices of any third party websites or services please feel free to contact us at info@jingga.app. You further acknowledge and agree that the COMPANY shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such websites or services.
If you have any questions, please contact our data protection officer at the above address or by e-mail at spl1nes.com@googlemail.com.
We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.
Version 2022-08-14

View File

@ -1,102 +0,0 @@
# AGB
## Definitionen
Für die Zwecke dieser AGBs:
* ANGESCHLOSSEN bedeutet ein Unternehmen, das eine Partei kontrolliert, von ihr kontrolliert wird oder mit ihr unter gemeinsamer Kontrolle steht, wobei "Kontrolle" den Besitz von 50 % oder mehr der Aktien, Anteile oder anderer Wertpapiere bedeutet, die zur Wahl von Direktoren oder anderen leitenden Angestellten berechtigt sind.
* LAND bezieht sich auf Deutschland.
* UNTERNEHMEN (in dieser VEREINBARUNG entweder als "das Unternehmen", "wir", "uns" oder "unser" bezeichnet) bezieht sich auf jingga, Gartenstr. 26, 61206 Wöllstadt.
* GERÄT bezeichnet jedes Gerät, das auf den Dienst zugreifen kann, wie z.B. ein Computer, ein Mobiltelefon oder ein digitales Tablet.
* SERVICE bezieht sich auf die Website.
* TERMINE oder VEREINBARUNG bezeichnet diese Bedingungen, die die gesamte Vereinbarung zwischen Ihnen und der FIRMA bezüglich der Nutzung des SERVICE bilden.
* Social-Media-Dienst eines Dritten bezeichnet alle Dienste oder Inhalte (einschließlich Daten, Informationen, Produkte oder Dienste), die von einem Dritten bereitgestellt werden und durch den DIENST angezeigt, einbezogen oder verfügbar gemacht werden können.
* WEBSITE bezieht sich auf jingga.app.
* ANWENDUNG bezieht sich auf alle herunterladbaren oder installierbaren Inhalte, die auf einem bestimmten GERÄT genutzt werden können.
* Sie bezeichnet die Person, die auf die DIENSTE zugreift oder diese nutzt, oder das Unternehmen oder eine andere juristische Person, in deren Namen eine solche Person auf die DIENSTE zugreift oder diese nutzt, je nachdem.
## Kenntnisnahme
Dies sind die GESCHÄFTSBEDINGUNGEN für die Nutzung dieses SERVICE und die Vereinbarung zwischen Ihnen und der FIRMA. Diese BEDINGUNGEN legen die Rechte und Pflichten aller Nutzer in Bezug auf die Nutzung des SERVICE fest.
Ihr Zugang zu und Ihre Nutzung des SERVICE und ANWENDUNGEN setzt voraus, dass Sie die vorliegenden GESCHÄFTSBEDINGUNGEN akzeptieren und einhalten. Diese GESCHÄFTSBEDINGUNGEN gelten für alle Besucher, Nutzer und andere, die auf den SERVICE zugreifen oder ihn nutzen.
Indem Sie auf den SERVICE und ANWENDUNGEN zugreifen oder ihn nutzen, erklären Sie sich damit einverstanden, an diese BEDINGUNGEN gebunden zu sein. Wenn Sie mit irgendeinem Teil dieser Bedingungen nicht einverstanden sind, dürfen Sie nicht auf den SERVICE zugreifen. Sie versichern, dass Sie mindestens 18 Jahre alt sind und die Volljährigkeit erreicht haben. Die FIRMA gestattet Personen unter 18 Jahren oder unter der Volljährigkeit nicht, den SERVICE zu nutzen.
Ihr Zugang zu und Ihre Nutzung des SERVICE und ANWENDUNGEN hängt auch davon ab, dass Sie die Datenschutzrichtlinie der FIRMA akzeptieren und einhalten. Unsere Datenschutzrichtlinie beschreibt unsere Richtlinien und Verfahren für die Erfassung, Nutzung und Offenlegung Ihrer persönlichen Daten, wenn Sie die Anwendung oder die WEBSITE nutzen, und informiert Sie über Ihre Datenschutzrechte und darüber, wie das Gesetz Sie schützt. Bitte lesen Sie Unsere Datenschutzrichtlinien sorgfältig durch, bevor Sie Unseren SERVICE nutzen.
## Urheberrecht
Sofern nicht anders angegeben, sind alle Materialien, einschließlich, aber nicht beschränkt auf Logos, Markennamen, Bilder, Designs, Fotografien, Videos, Audiodateien, Quellcode und schriftliche und andere Materialien, die als Teil unserer WEBSITE, DIENSTE und ANWENDUNGEN erscheinen, Urheberrechte, Marken, Dienstleistungsmarken, Handelsaufmachungen und/oder anderes geistiges Eigentum, ob eingetragen oder nicht eingetragen ("geistiges Eigentum"), das Eigentum von jingga ist oder von jingga kontrolliert oder lizenziert wird. Unsere WEBSITE als Ganzes ist urheberrechtlich und durch Handelsaufmachung geschützt. Nichts auf unserer WEBSITE ist so auszulegen, dass stillschweigend, durch Rechtsverwirkung oder anderweitig eine Lizenz oder ein Recht zur Nutzung von geistigem Eigentum, das auf unserer WEBSITE angezeigt oder verwendet wird, ohne die vorherige schriftliche Genehmigung des Eigentümers des geistigen Eigentums gewährt wird. jingga setzt seine Rechte an geistigem Eigentum in vollem Umfang des Gesetzes aggressiv durch. Die Namen und Logos von jingga dürfen ohne vorherige schriftliche Genehmigung von jingga in keiner Weise verwendet werden, auch nicht in der Werbung oder in der Öffentlichkeitsarbeit im Zusammenhang mit der Verbreitung von Materialien auf unserer WEBSITE. jingga verbietet die Verwendung von Logos von jingga oder einer seiner Tochtergesellschaften als Teil eines Links zu oder von einer WEBSITE, es sei denn, jingga genehmigt einen solchen Link im Voraus und in Schriftform. Die faire Nutzung des geistigen Eigentums von jingga erfordert eine angemessene Anerkennung. Andere Produkt- und Firmennamen, die auf unserer Website erwähnt werden, können das geistige Eigentum ihrer jeweiligen Eigentümer sein.
## Links
Unser SERVICE kann Links zu Websites oder Diensten Dritter enthalten, die nicht im Besitz oder unter der Kontrolle der FIRMA sind.
Die FIRMA hat keine Kontrolle über und übernimmt keine Verantwortung für den Inhalt von Websites oder Diensten Dritter, die Sie besuchen.
## Beendigung
Wir können Ihren Zugang sofort und ohne Vorankündigung oder Haftung kündigen oder aussetzen, aus welchem Grund auch immer, einschließlich und ohne Einschränkung, wenn Sie diese Bedingungen verletzen.
Mit der Beendigung erlischt Ihr Recht zur Nutzung des DIENSTES oder der ANWENDUNG mit sofortiger Wirkung, es sei denn, der DIENST oder die ANWENDUNG stellt einen "Offline"-DIENST oder eine ANWENDUNG dar, einen DIENST oder eine ANWENDUNG, die keine Online-Verbindung erfordert, andere DIENSTE, die wir beendet haben, oder Dienste Dritter. Wir haben keine Kontrolle über die Ressourcen und Dienste Dritter, die für einige unserer DIENSTE und ANWENDUNGEN notwendig sein können. Änderungen durch diese Drittparteien können zur Beendigung des DIENSTES oder der ANWENDUNG oder zur Reduzierung ihrer Funktionalität führen. Sie verstehen diese Abhängigkeiten und Einschränkungen des DIENSTES und der ANWENDUNG und akzeptieren, dass die Beendigung oder reduzierte Funktionalität nicht als Grund für Streitigkeiten, Widerruf oder ähnliches verwendet werden kann.
## Haftungsbeschränkung
Ungeachtet etwaiger Schäden, die Ihnen entstehen könnten, ist die gesamte Haftung der FIRMA und ihrer Zulieferer gemäß den Bestimmungen dieser AGB und Ihr ausschließlicher Rechtsbehelf für alle vorgenannten Punkte auf den Betrag beschränkt, den Sie tatsächlich für den SERVICE bezahlt haben.
Soweit es das anwendbare Recht zulässt, haften die FIRMA oder ihre Lieferanten in keinem Fall für besondere, zufällige, indirekte oder Folgeschäden (einschließlich, aber nicht beschränkt auf Schäden aus entgangenem Gewinn, Verlust von Daten oder anderen Informationen, für Geschäftsunterbrechung, für Personenschäden, Verlust der Privatsphäre, die sich aus der Nutzung oder der Unmöglichkeit der Nutzung des SERVICE, der Software von Dritten und/oder der Hardware von Dritten, die mit dem SERVICE genutzt wird, oder in sonstiger Weise in Verbindung mit einer Bestimmung dieser AGB ergeben oder damit in Zusammenhang stehen), selbst wenn die FIRMA oder ein Lieferant auf die Möglichkeit solcher Schäden hingewiesen wurde und selbst wenn die Abhilfe ihren wesentlichen Zweck verfehlt.
In einigen Staaten oder Ländern ist der Ausschluss stillschweigender Garantien oder die Beschränkung der Haftung für beiläufig entstandene Schäden oder Folgeschäden nicht zulässig, was bedeutet, dass einige der oben genannten Beschränkungen möglicherweise nicht gelten. In diesen Staaten oder Ländern ist die Haftung jeder Partei auf den größtmöglichen gesetzlich zulässigen Umfang beschränkt.
## Haftungsausschluss
Der SERVICE wird Ihnen "WIE BESEHEN" und "WIE VERFÜGBAR" und mit allen Fehlern und Mängeln ohne jegliche Garantie zur Verfügung gestellt. Im größtmöglichen nach geltendem Recht zulässigen Umfang lehnt die FIRMA in ihrem eigenen Namen und im Namen ihrer VERBUNDENEN UNTERNEHMEN und ihrer jeweiligen Lizenzgeber und Dienstleistungsanbieter ausdrücklich alle ausdrücklichen, stillschweigenden, gesetzlichen oder sonstigen Gewährleistungen in Bezug auf den SERVICE ab, einschließlich aller stillschweigenden Gewährleistungen der Marktgängigkeit, der Eignung für einen bestimmten Zweck, des Eigentumsrechts und der Nichtverletzung von Rechten sowie der Gewährleistungen, die sich aus dem Handelsverlauf, der Leistungserbringung, den Gepflogenheiten oder der Handelspraxis ergeben können. Ohne Einschränkung des Vorstehenden übernimmt die FIRMA keine Garantie oder Verpflichtung und gibt keinerlei Zusicherungen ab, dass der SERVICE Ihren Anforderungen entspricht, die beabsichtigten Ergebnisse erzielt, mit anderer Software, Anwendungen, Systemen oder Diensten kompatibel ist oder zusammenarbeitet, ohne Unterbrechung funktioniert, Leistungs- oder Zuverlässigkeitsstandards erfüllt oder fehlerfrei ist oder dass Fehler oder Mängel korrigiert werden können oder werden.
Ohne das Vorstehende einzuschränken, geben weder die FIRMA noch einer ihrer Provider eine ausdrückliche oder stillschweigende Zusicherung oder Gewährleistung jeglicher Art: (i) hinsichtlich des Betriebs oder der Verfügbarkeit des SERVICE oder der darin enthaltenen Informationen, Inhalte und Materialien oder Produkte; (ii) dass der SERVICE ununterbrochen oder fehlerfrei funktioniert; (iii) hinsichtlich der Genauigkeit, Zuverlässigkeit oder Aktualität von Informationen oder Inhalten, die über den SERVICE zur Verfügung gestellt werden; oder (iv) dass der SERVICE, seine Server, die Inhalte oder E-Mails, die von oder im Namen der FIRMA versandt werden, frei von Viren, Skripten, trojanischen Pferden, Würmern, Malware, Zeitbomben oder anderen schädlichen Komponenten sind.
Einige Gerichtsbarkeiten lassen den Ausschluss bestimmter Arten von Garantien oder Einschränkungen der anwendbaren gesetzlichen Rechte eines Verbrauchers nicht zu, so dass einige oder alle der oben genannten Ausschlüsse und Einschränkungen möglicherweise nicht auf Sie zutreffen. In einem solchen Fall werden die in diesem Abschnitt dargelegten Ausschlüsse und Beschränkungen jedoch im größtmöglichen Umfang angewandt, der nach geltendem Recht durchsetzbar ist.
## Geltendes Recht
Die Gesetze des LANDES, unter Ausschluss der Kollisionsnormen, regeln diese Bedingungen und Ihre Nutzung des SERVICE. Ihre Nutzung der ANWENDUNG kann auch anderen lokalen, staatlichen, nationalen oder internationalen Gesetzen unterliegen.
Die Unwirksamkeit einer oder mehrerer Bestimmungen dieser Vereinbarung berührt nicht die Gültigkeit der anderen. Jede Partei dieser AGB kann in diesem Fall verlangen, dass eine neue gültige Bestimmung vereinbart wird, die den wirtschaftlichen Zweck der unwirksamen Bestimmung am besten erreicht.
## Streitbeilegung
Wenn Sie irgendwelche Bedenken oder Streitigkeiten bezüglich des Service haben, erklären Sie sich damit einverstanden, zunächst zu versuchen, die Streitigkeit informell zu lösen, indem Sie die FIRMA kontaktieren.
## Widerruf
Sie haben kein Widerrufsrecht für die DIENSTLEISTUNGEN und ANWENDUNGEN, es sei denn, in Ihrer Gerichtsbarkeit bestehen andere Widerrufsrechte. In einem solchen Fall wird der in diesem Abschnitt beschriebene Widerruf auf den niedrigsten Betrag angewandt, der nach geltendem Recht durchsetzbar ist.
## Lieferung
Die Lieferung der DIENSTLEISTUNGEN und ANWENDUNGEN erfolgt, sofern nicht anders angegeben, innerhalb von 30 Werktagen. Die Lieferung umfasst in diesem Zusammenhang nur den Zugang zu einem Download-Link, die Authentifizierung für einen Online-Dienst oder den Lizenzschlüssel per E-Mail.
## Zahlung
Die Zahlungsbedingungen sind immer Vorauszahlung, sofern nicht anders vereinbart. Zahlungen müssen per Kreditkarte erfolgen.
## Eigentumsvorbehalt
Bis zur vollständigen Bezahlung bleibt das Eigentum an den DIENSTLEISTUNGEN bei uns. Das Eigentum an den DIENSTLEISTUNGEN umfasst nur die Nutzungslizenzen und in keiner Weise das Eigentum an den Vermögenswerten, dem geistigen Eigentum und insbesondere dem Quellcode der DIENSTLEISTUNGEN. Sie haben kein Recht, Kopien unserer DIENSTLEISTUNGEN zu erstellen oder unsere DIENSTLEISTUNGEN unter keinen Umständen weiterzugeben.
## Rechtskonformität
Sie versichern und garantieren, dass (i) Sie sich nicht in einem Land befinden, das einem Embargo der US-Regierung unterliegt oder das von der US-Regierung, der deutschen Regierung oder der EU-Regierung als "Terroristen unterstützendes" Land bezeichnet wurde, und (ii) Sie nicht auf einer Liste der US-Regierung, der deutschen Regierung oder der EU-Regierung mit verbotenen oder eingeschränkten Parteien aufgeführt sind.
## Änderungen dieser Bedingungen
Wir behalten uns das Recht vor, diese Bedingungen nach unserem alleinigen Ermessen jederzeit zu ändern oder zu ersetzen. Wenn eine Änderung wesentlich ist, werden wir uns angemessen bemühen, Sie mindestens 30 Tage vor Inkrafttreten der neuen Bedingungen zu informieren. Was eine wesentliche Änderung darstellt, wird nach unserem alleinigen Ermessen festgelegt.
Indem Sie nach Inkrafttreten dieser Änderungen weiterhin auf unseren SERVICE zugreifen oder ihn nutzen, erklären Sie sich mit den überarbeiteten Bedingungen einverstanden. Wenn Sie mit den neuen Bedingungen ganz oder teilweise nicht einverstanden sind, beenden Sie bitte die Nutzung der WEBSITE und des SERVICE.
## Kontakt
Bei Fragen zu diesen Bedingungen, den Datenschutzrichtlinien oder den Praktiken von Websites oder Diensten Dritter können Sie uns unter info@jingga.app kontaktieren. Sie erkennen ferner an und erklären sich damit einverstanden, dass die FIRMA weder direkt noch indirekt für Schäden oder Verluste verantwortlich oder haftbar ist, die durch oder in Verbindung mit der Nutzung von oder dem Vertrauen auf solche Inhalte, Waren oder Dienstleistungen, die auf oder über solche Websites oder Dienste verfügbar sind, verursacht werden oder angeblich verursacht werden.
Wir empfehlen Ihnen dringend, die Geschäftsbedingungen und Datenschutzrichtlinien der von Ihnen besuchten Websites oder Dienste Dritter zu lesen.
Version 2022-08-14

View File

@ -1,102 +0,0 @@
# Terms of Service
## Definitions
For the purposes of these TERMS:
* AFFILIATED means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
* COUNTRY refers to Germany
* COMPANY (referred to as either "the Company", "We", "Us" or "Our" in this AGREEMENT) refers to jingga, Gartenstr. 26, 61206 Woellstadt.
* DEVICE means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* SERVICE refers to the Website
* TERMS or AGREEMENT mean these terms that form the entire agreement between You and the COMPANY regarding the use of the SERVICE.
* Third-party Social Media Service means any services or content (including data, information, products or services) provided by a third-party that may be displayed, included or made available by the SERVICE.
* WEBSITE refers to jingga.app
* APPLICATION refers to all downloadable or installable content which can therfore be used on an a given DEVICE.
* You means the individual accessing or using the SERVICES, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
## Acknowledgement
These are the TERMS governing the use of this SERVICE and the agreement that operates between You and the COMPANY. These TERMS set out the rights and obligations of all users regarding the use of the SERVICE.
Your access to and use of the SERVICE and APPLICATIONS is conditioned on Your acceptance of and compliance with these TERMS. These TERMS apply to all visitors, users and others who access or use the SERVICE.
By accessing or using the SERVICE and APPLICATIONS You agree to be bound by these TERMS. If You disagree with any part of these TERMS then You may not access the SERVICE. You represent that you are at least over the age of 18 and be over the Age of Majority. The COMPANY does not permit those under 18 or the Age of Majurity to use the SERVICE.
Your access to and use of the SERVICE and APPLICATIONS is also conditioned on Your acceptance of and compliance with the Privacy Policy of the COMPANY. Our Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your personal information when You use the Application or the WEBSITE and tells You about Your privacy rights and how the law protects You. Please read Our Privacy Policy carefully before using Our SERVICE.
## Copyright
Unless otherwise noted, all materials including without limitation, logos, brand names, images, designs, photographs, videos, audio, source code and written and other materials that appear as part of our WEBSITE, SERVICES and APPLICATIONS are copyrights, trademarks, service marks, trade dress and/or other intellectual property whether registered or unregistered ("Intellectual Property") owned, controlled or licensed by jingga. Our WEBSITE as a whole is protected by copyright and trade dress. Nothing on our WEBSITE should be construed as granting, by implication, estoppel or otherwise, any license or right to use any Intellectual Property displayed or used on our WEBSITE, without the prior written permission of the Intellectual Property owner. jingga aggressively enforces its intellectual property rights to the fullest extent of the law. The names and logos of jingga, may not be used in any way, including in advertising or publicity pertaining to distribution of materials on our WEBSITE, without prior, written permission from jingga. jingga prohibits use of any logo of jingga or any of its affiliates as part of a link to or from any WEBSITE unless jingga approves such link in advance and in writing. Fair use of jingga Intellectual Property requires proper acknowledgment. Other product and company names mentioned in our Website may be the Intellectual Property of their respective owners.
## Links
Our SERVICE may contain links to third-party web sites or services that are not owned or controlled by the COMPANY.
The COMPANY has no control over, and assumes no responsibility for, the contentthird-party web sites or services that You visit.
## Termination
We may terminate or suspend Your access immediately, without prior notice or liability, for any reason whatsoever, including without limitation if You breach these TERMS.
Upon termination, Your right to use the SERVICE or APPLICATION will cease immediately unless the SERVICE or APPLICATION represents a "offline" SERVICE or APPLICATION, a SERVICE or APPLICATION which doesn't require any online connection, other SERVICES which We terminated, or third-party services. We have no contorl over thrid-party resources and services which may be necessary for some of Our SERVICES and APPLICATIONS. Changes by these third-parties may lead to the termination of the SERVICE or APPLICATION or reducing their functionality. You understand these dependencies and SERVICE and APPLICATION limitations and accept that the termination or reduced functionality cannot be used as reason for dispute, revocation or similarly.
## Limitation of Liability
Notwithstanding any damages that You might incur, the entire liability of the COMPANY and any of its suppliers under any provision of this TERMS and Your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by through the SERVICE.
To the maximum extent permitted by applicable law, in no event shall the COMPANY or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, loss of data or other information, for business interruption, for personal injury, loss of privacy arising out of or in any way related to the use of or inability to use the SERVICE, third-party software and/or third-party hardware used with the SERVICE, or otherwise in connection with any provision of this TERMS), even if the COMPANY or any supplier has been advised of the possibility of such damages and even if the remedy fails of its essential purpose.
Some states or countries do not allow the exclusion of implied warranties or limitation of liability for incidental or consequential damages, which means that some of the above limitations may not apply. In these states or countries, each party's liability will be limited to the greatest extent permitted by law.
## Disclaimer
The SERVICE is provided to You "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. To the maximum extent permitted under applicable law, the COMPANY, on its own behalf and on behalf of its AFFILIATES and its and their respective licensors and service providers, expressly disclaims all warranties, whether express, implied, statutory or otherwise, with respect to the SERVICE, including all implied warranties of merchantability, fitness for a particular purpose, title and non-infringement, and warranties that may arise out of course of dealing, course of performance, usage or trade practice. Without limitation to the foregoing, the COMPANY provides no warranty or undertaking, and makes no representation of any kind that the SERVICE will meet Your requirements, achieve any intended results, be compatible or work with any other software, applications, systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.
Without limiting the foregoing, neither the COMPANY nor any of the company's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the SERVICE, or the information, content, and materials or products included thereon; (ii) that the SERVICE will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the SERVICE; or (iv) that the SERVICE, its servers, the content, or e-mails sent from or on behalf of the COMPANY are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.
Some jurisdictions do not allow the exclusion of certain types of warranties or limitations on applicable statutory rights of a consumer, so some or all of the above exclusions and limitations may not apply to You. But in such a case the exclusions and limitations set forth in this section shall be applied to the greatest extent enforceable under applicable law.
## Governing Law
The laws of the COUNTRY, excluding its conflicts of law rules, shall govern these TERMS and Your use of the SERVICE. Your use of the APPLICATION may also be subject to other local, state, national, or international laws.
The ineffectiveness of one or more provisions of this agreement does not affect the validity of the others. Each party to these TERMS can in this case demand that a new valid provision be agreed which best achieves the economic purpose of the ineffective provision.
## Dispute Resolution
If You have any concern or dispute about the Service, You agree to first try to resolve the dispute informally by contacting the COMPANY.
## Revocation
You have no right of revocation for any SERVICES and APPLICATIONS unless different revocation rights exist in your jurisdiction. In such a case the revocation set forth in this section shall be applied to the lowest amount enforcable under applicable law.
## Delivery
The delivery of any SERVICES and APPLICATIONS unless specified differently takes place within 30 business days. Delivery in this context only includes the access to a download link, authentication to a online service, or license key via email.
## Payment
The payment terms are always prepayment unless otherwise agreed upon. Payments must be done via credit card.
## Reservation of ownership
Until the complete payment the ownership of the SERVICES and APPLICATIONS belongs to Us. Ownership of SERVICES and APPLICATIONS only include user licenses and in no way ownership for the assets, intellectual property and especially the source code of the SERVICES and APPLICATIONS. You have no right to create copies of Our SERVICES or APPLICATIONS or re-distribute our SERVICES and APPLICATIONS under any circumstance.
## Legal Compliance
You represent and warrant that (i) You are not located in a country that is subject to the United States government embargo, or that has been designated by the United States, German or EU government as a "terrorist supporting" country, and (ii) You are not listed on any United States, German or EU government list of prohibited or restricted parties.
## Changes to these Terms
We reserve the right, at Our sole discretion, to modify or replace these TERMS at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.
By continuing to access or use Our SERVICE after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the WEBSITE and the SERVICE.
## Contact
For questions regarding these TERMS, privacy policies, or practices of any third party websites or services please feel free to contact us at info@jingga.app. You further acknowledge and agree that the COMPANY shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such websites or services.
We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.
Version 2022-08-14

View File

@ -1,215 +0,0 @@
:root {
--main-background: rgb(246, 246, 246);
--main-background-highlight: #3697db;
--input-border: rgba(218, 218, 218, 0.4);
--input-border-active: rgba(54, 150, 219, 0.7);
--input-color: rgba(0, 0, 0, 0.7);
--input-color-active: rgba(0, 0, 0, 0.8);
--input-background: rgba(255, 255, 255);
--input-background-active: rgba(255, 255, 255);
--input-icon-color: rgba(54, 150, 219, .6);
--input-icon-color-active: rgba(54, 150, 219, 1);
--button-main-background: #3697db;
--button-main-background-active: #4aabf0;
--button-main-color: rgba(255, 255, 255, .9);
--text-on-background-color: rgba(255, 255, 255, 0.7);
--text-on-background-color-2: rgba(255, 255, 255, 0.85);
--nav-category-background: #343a40;
--nav-category-background-highlight: #3697db;
--nav-category-background-hover: #dcd9ec;
--nav-sub-background: #ebeff3;
--nav-sub-background-highlight: rgb(160,56,228);
--nav-sub-background-hover: rgb(42, 43, 48);
--nav-content-hover: #3697db;
--font-family: 'Roboto', sans-serif;
--button-colored-background: #3697db;
--button-colored-background-hover: #4aabf0;
--table-caption-background: rgb(255, 255, 255);
--table-head-background: #e6ecf1;
--table-row-background: rgb(255, 255, 255);
--table-row-background-alt: rgb(255, 255, 255);
--table-row-background-hover: #d4eeff;
--link-color: #3697db;
--link-hover: #3697db;
--badge-size: .55rem;
--badge-color: rgb(255, 255, 255);
--badge-background: #3697db;
--box-border: rgba(72, 71, 114, 0.3);
--box-highlight: #3697db;
--color-blue: #3697db;
--color-red: #e74c3c;
--color-green: #2ecc71;
--color-yellow: #ffde5b;
--header-background: rgb(255, 255, 255); }
html, body {
width: 100%;
height: 100%;
min-width: 100%;
max-width: 100%;
overflow: hidden;
font-family: var(--font-family);
font-weight: 100;
color: #000; }
body {
display: flex;
flex-direction: column; }
body > nav {
width: 250px;
overflow-y: auto;
font-size: 0.8em;
background: var(--nav-category-background);
color: rgba(255, 255, 255, 0.8);
flex-shrink: 0;
display: flex;
flex-direction: column;
user-select: none; }
body > header {
background: #203483;
background: linear-gradient(90deg, #203483 0%, #a038e4 100%);
border-bottom: 1px solid #203483;
padding: 0 1rem 0 1rem;
box-sizing: border-box;
display: flex;
align-items: center;
flex-flow: row;
flex-shrink: 0;
height: 55px;
color: #fff; }
body > header > form {
display: flex;
flex: 1;
padding: 0 5px 0 5px;
max-width: 800px; }
body > header .inputWrapper {
flex: 1; }
body > header input[type=text] {
width: 100%;
background: white;
border: 1px solid var(--input-border);
text-shadow: none;
box-shadow: none;
transition: border 500ms ease-out;
outline: none;
box-sizing: border-box;
padding-left: 2rem; }
main {
display: flex;
flex-direction: row;
max-width: 100%;
height: 100%;
background: var(--main-background);
overflow-x: auto;
/* required for table overflow, otherwise tables in the portlet cause overflows */
flex: 1;
box-sizing: border-box; }
#nav-side {
background: var(--nav-sub-background);
width: 250px;
border-right: 1px solid #000; }
#nav-side-inner {
border-top: none; }
#nav-side-inner > li {
/* Category
li:first-child {
// border-top: none;
// border-bottom: none;
}
*/ }
#nav-side-inner > li li a:hover, #nav-side-inner > li li a.active, #nav-side-inner > li li a:focus {
background: var(--nav-category-background-hover); }
#logo {
height: 100%;
flex: 1;
display: flex;
flex-direction: row;
align-items: center; }
#logo-name {
margin-left: 1rem; }
#t-nav-container {
margin-left: auto; }
#content {
display: flex;
flex: 1;
padding: 0 0 1rem 1rem;
overflow-y: auto;
flex-direction: column; }
#t-nav {
font-size: .8rem;
color: #fff;
font-weight: 300; }
#t-nav a {
border: 2px solid rgba(255, 255, 255, 0);
border-radius: 3rem;
padding: .5rem 1rem .5rem 1rem;
line-height: 25px; }
#t-nav a:hover, #t-nav a:focus, #t-nav a.active {
border: 2px solid rgba(255, 255, 255, 0.25);
background: rgba(255, 255, 255, 0.25); }
#t-nav i {
margin-right: 5px; }
#t-nav li {
display: inline; }
#dim {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
opacity: 0.5;
z-index: 5; }
img.profile-image {
width: 40px;
height: 40px;
border-radius: 50%;
border: 2px solid #fff; }
#app-message-container {
position: absolute;
margin: 0 auto;
right: 10px;
top: 85px;
padding: 0; }
#app-message-container .log-msg {
z-index: 11;
margin: 0 auto;
right: 0;
top: 0;
margin-bottom: 10px; }
.log-msg {
position: relative; }
.log-msg .close {
position: absolute;
top: 5px;
right: 5px; }
@media only screen and (max-width: 500px) {
nav .ham-trigger {
display: flex; } }
@media only screen and (max-width: 600px) {
main > header {
flex-flow: column;
height: auto;
padding: 1rem; }
main > header form {
width: 100%; }
#t-nav-container {
order: -1;
margin-bottom: .5rem; } }
@media only screen and (max-width: 1000px) {
#t-nav .link {
display: none; } }

View File

@ -1,203 +0,0 @@
@import "backend_vars.scss";
html, body {
width: 100%;
height: 100%;
min-width: 100%;
max-width: 100%;
overflow: hidden;
font-family: var(--font-family);
font-weight: 100;
color: #000;
}
body {
display: flex;
flex-direction: column;
> nav {
width: 250px;
overflow-y: auto;
font-size: 0.8em;
background: var(--nav-category-background);
color: rgba(255, 255, 255, 0.8);
flex-shrink: 0;
display: flex;
flex-direction: column;
user-select: none;
}
> header {
background: rgb(32,52,131);
background: linear-gradient(90deg, rgb(32,52,131) 0%, rgb(160,56,228) 100%);
border-bottom: 1px solid rgb(32,52,131);
padding: 0 1rem 0 1rem;
box-sizing: border-box;
display: flex;
align-items: center;
flex-flow: row;
flex-shrink: 0;
height: 55px;
color: #fff;
//box-shadow: 0 0 3px 1px rgba(72, 71, 114, 0.3);
> form {
display: flex;
flex: 1;
padding: 0 5px 0 5px;
max-width: 800px;
}
.inputWrapper {
flex: 1;
}
input[type=text] {
width: 100%;
background: rgba(255, 255, 255, 1);
border: 1px solid var(--input-border);
text-shadow: none;
box-shadow: none;
transition : border 500ms ease-out;
outline: none;
box-sizing: border-box;
padding-left: 2rem;
}
}
}
main {
display: flex;
flex-direction: row;
max-width: 100%;
height: 100%;
background: var(--main-background);
overflow-x: auto; /* required for table overflow, otherwise tables in the portlet cause overflows */
flex: 1;
box-sizing: border-box;
}
#nav-side {
background: var(--nav-sub-background);
width: 250px;
border-right: 1px solid #000;
}
#nav-side-inner {
border-top: none;
> li {
/* Category
li:first-child {
// border-top: none;
// border-bottom: none;
}
*/
li {
a {
&:hover, &.active, &:focus {
background: var(--nav-category-background-hover);
}
}
} }
}
#logo {
height: 100%;
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
}
#logo-name {
margin-left: 1rem;
}
#t-nav-container {
margin-left: auto;
}
#content {
display: flex;
flex: 1;
padding: 0 0 1rem 1rem;
overflow-y: auto;
flex-direction: column;
}
#t-nav {
font-size: .8rem;
color: #fff;
font-weight: 300;
a {
border: 2px solid rgba(255, 255, 255, 0);
border-radius: 3rem;
padding: .5rem 1rem .5rem 1rem;
line-height: 25px;
&:hover, &:focus, &.active {
border: 2px solid rgba(255, 255, 255, 0.25);
background: rgba(255, 255, 255, 0.25);
}
}
i {
margin-right: 5px;
}
li {
display: inline;
}
}
#dim {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
opacity: 0.5;
z-index: 5;
}
img.profile-image {
width: 40px;
height: 40px;
border-radius: 50%;
border: 2px solid #fff;
}
#app-message-container {
position: absolute;
margin: 0 auto;
right: 10px;
top: 85px;
padding: 0;
.log-msg {
z-index: 11;
margin: 0 auto;
right: 0;
top: 0;
margin-bottom: 10px;
}
}
.log-msg {
position: relative;
.close {
position: absolute;
top: 5px;
right: 5px;
}
}
@import "backend_media.scss";

View File

@ -1,39 +0,0 @@
@media only screen and (min-width: 1101px) {
.b-1 {
width: 31.5%;
width: calc(33.3% - 10px); }
.b-2 {
width: 48.5%;
width: calc(50% - 10px); }
.b-3 {
width: 63%;
width: calc(66.6% - 10px); } }
@media only screen and (min-width: 801px) and (max-width: 1100px) {
.b-1 {
width: 48.5%;
width: calc(50% - 10px); } }
@media only screen and (max-width: 1100px) {
.b-2, .b-3 {
width: 100%;
width: calc(100% - 10px); } }
@media only screen and (min-width: 801px) {
.b-4 {
width: 48.5%;
width: calc(50% - 10px); } }
@media only screen and (max-width: 800px) {
.b-1, .b-3 {
width: 100%;
width: calc(100% - 10px); }
#logo {
display: none; }
#s-nav {
width: 100%; }
#s-bar input[type=text] {
margin-left: 35px;
width: 80%;
width: calc(100% - 90px); } }

View File

@ -1,28 +0,0 @@
@media only screen and (max-width: 500px) {
nav .ham-trigger {
display: flex;
}
}
@media only screen and (max-width: 600px) {
main > header {
flex-flow: column;
height: auto;
padding: 1rem;
form {
width: 100%;
}
}
#t-nav-container {
order: -1;
margin-bottom: .5rem;
}
}
@media only screen and (max-width: 1000px) {
#t-nav .link {
display: none;
}
}

View File

@ -1,43 +0,0 @@
:root {
--main-background: rgb(246, 246, 246);
--main-background-highlight: #3697db;
--input-border: rgba(218, 218, 218, 0.4);
--input-border-active: rgba(54, 150, 219, 0.7);
--input-color: rgba(0, 0, 0, 0.7);
--input-color-active: rgba(0, 0, 0, 0.8);
--input-background: rgba(255, 255, 255);
--input-background-active: rgba(255, 255, 255);
--input-icon-color: rgba(54, 150, 219, .6);
--input-icon-color-active: rgba(54, 150, 219, 1);
--button-main-background: #3697db;
--button-main-background-active: #4aabf0;
--button-main-color: rgba(255, 255, 255, .9);
--text-on-background-color: rgba(255, 255, 255, 0.7);
--text-on-background-color-2: rgba(255, 255, 255, 0.85);
--nav-category-background: #343a40;
--nav-category-background-highlight: #3697db;
--nav-category-background-hover: #dcd9ec;
--nav-sub-background: #ebeff3;
--nav-sub-background-highlight: rgb(160,56,228);
--nav-sub-background-hover: rgb(42, 43, 48);
--nav-content-hover: #3697db;
--font-family: 'Roboto', sans-serif;
--button-colored-background: #3697db;
--button-colored-background-hover: #4aabf0;
--table-caption-background: rgb(255, 255, 255);
--table-head-background: #e6ecf1;
--table-row-background: rgb(255, 255, 255);
--table-row-background-alt: rgb(255, 255, 255);
--table-row-background-hover: #d4eeff;
--link-color: #3697db;
--link-hover: #3697db;
--badge-size: .55rem;
--badge-color: rgb(255, 255, 255);
--badge-background: #3697db;
--box-border: rgba(72, 71, 114, 0.3);
--box-highlight: #3697db;
--color-blue: #3697db;
--color-red: #e74c3c;
--color-green: #2ecc71;
--color-yellow: #ffde5b;
--header-background: rgb(255, 255, 255); }

View File

@ -1,59 +0,0 @@
:root {
--main-background: rgb(246, 246, 246);
--main-background-highlight: #3697db;
--input-border: rgba(218, 218, 218, 0.4);
--input-border-active: rgba(54, 150, 219, 0.7);
--input-color: rgba(0, 0, 0, 0.7);
--input-color-active: rgba(0, 0, 0, 0.8);
--input-background: rgba(255, 255, 255);
--input-background-active: rgba(255, 255, 255);
--input-icon-color: rgba(54, 150, 219, .6);
--input-icon-color-active: rgba(54, 150, 219, 1);
--button-main-background: #3697db;
--button-main-background-active: #4aabf0;
--button-main-color: rgba(255, 255, 255, .9);
--text-on-background-color: rgba(255, 255, 255, 0.7);
--text-on-background-color-2: rgba(255, 255, 255, 0.85);
--nav-category-background: #343a40;
--nav-category-background-highlight: #3697db;
--nav-category-background-hover: #dcd9ec;
--nav-sub-background: #ebeff3;
--nav-sub-background-highlight: rgb(160,56,228);
--nav-sub-background-hover: rgb(42, 43, 48);
--nav-content-hover: #3697db;
--font-family: 'Roboto', sans-serif;
--button-colored-background: #3697db;
--button-colored-background-hover: #4aabf0;
--table-caption-background: rgb(255, 255, 255);
--table-head-background: #e6ecf1;
--table-row-background: rgb(255, 255, 255);
--table-row-background-alt: rgb(255, 255, 255);
--table-row-background-hover: #d4eeff;
--link-color: #3697db;
--link-hover: #3697db;
--badge-size: .55rem;
--badge-color: rgb(255, 255, 255);
--badge-background: #3697db;
--box-border: rgba(72, 71, 114, 0.3);
--box-highlight: #3697db;
--color-blue: #3697db;
--color-red: #e74c3c;
--color-green: #2ecc71;
--color-yellow: #ffde5b;
--header-background: rgb(255, 255, 255);
}

View File

@ -1,182 +0,0 @@
:root {
--main-background: #343a40;
--input-border: rgba(54, 150, 219, 0.4);
--input-border-active: rgba(54, 150, 219, 0.7);
--input-color: rgba(255, 255, 255, 0.7);
--input-color-active: rgba(255, 255, 255, 0.7);
--input-icon-color: rgba(54, 150, 219, .6);
--input-icon-color-active: rgba(54, 150, 219, 1);
--button-main-background: #3697db;
--button-main-background-active: #4aabf0;
--button-main-color: rgba(255, 255, 255, .9);
--text-on-background-color: rgba(255, 255, 255, 0.7); }
html, body {
font-family: 'Roboto', sans-serif;
color: var(--text-on-background-color);
display: flex;
align-items: center;
width: 100%;
height: 100%;
flex-direction: column;
font-weight: 100;
scrollbar-color: var(--button-main-background) var(--main-background);
scrollbar-width: thin;
}
html::-webkit-scrollbar, body::-webkit-scrollbar {
width: 7px;
}
html::-webkit-scrollbar-thumb, body::-webkit-scrollbar-thumb {
background: var(--button-main-background);
}
html::-webkit-scrollbar-track, body::-webkit-scrollbar-track {
background: var(--main-background);
}
body {
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
background-image: url(Applications/Backend/img/bg.svg);
}
footer {
align-self: flex-end; }
footer li {
display: inline-block;
padding: 1rem; }
main {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 90%;
max-width: 800px; }
main article {
background: inherit;
padding: 0;
margin: 0;
font-size: inherit;
color: inherit; }
#login-container {
width: 90%;
max-width: 300px;
margin: 0 auto; }
#login-container label {
color: rgba(255, 255, 255, 0.7); }
#login-logo {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 185px;
text-align: center;
margin-bottom: 10%; }
#login-logo img {
animation: pulse 1.5s ease infinite alternate;
width: 60%; }
@keyframes pulse {
0% {
width: 60%; }
30%, 100% {
width: 65%; } }
header {
text-align: left;
margin-bottom: 1rem; }
header h1 {
font-weight: 300; }
form {
margin-bottom: 10%; }
form label {
text-shadow: none;
color: var(--text-on-background-color);
cursor: pointer; }
form select,
form input[type=text],
form input[type=password] {
margin-bottom: .5rem;
background: rgba(0, 0, 0, 0.15);
border: 1px solid var(--input-border);
text-shadow: none;
box-shadow: none;
color: var(--text-on-background-color);
width: 100%;
transition: border 500ms ease-out;
outline: none;
box-sizing: border-box;
line-height: 1rem; }
.inputWithIcon {
position: relative; }
.inputWithIcon .frontIcon {
color: var(--input-icon-color);
font-size: 1rem;
position: absolute;
left: 0;
top: 0;
padding: .65rem; }
.inputWithIcon .endIcon {
color: var(--input-icon-color);
font-size: 1rem;
position: absolute;
right: 0;
top: 0;
padding: .65rem; }
.inputWithIcon input[type="text"], .inputWithIcon input[type="password"] {
padding-left: 2.5rem; }
form input[type=text]:active, form input[type=text]:focus,
form input[type=password]:active, form input[type=password]:focus {
border: 1px solid var(--input-border-active);
color: var(--text-on-background-color); }
form input[type=text]:active ~ .frontIcon, form input[type=text]:focus ~ .frontIcon,
form input[type=password]:active ~ .frontIcon, form input[type=password]:focus ~ .frontIcon,
form input[type=text]:active ~ .endIcon, form input[type=text]:focus ~ .endIcon,
form input[type=password]:active ~ .endIcon, form input[type=password]:focus ~ .endIcon {
color: var(--input-icon-color-active); }
form input[type=text] ~ .endIcon, form input[type=text] ~ .endIcon,
form input[type=password] ~ .endIcon, form input[type=password] ~ .endIcon {
cursor: pointer; }
form input[type=submit] {
width: 100%;
background-color: var(--button-main-background);
border: none;
text-shadow: none;
box-shadow: none;
color: var(--button-main-color);
cursor: pointer;
transition: background-color 500ms ease-out; }
form input[type=submit]:hover,
form input[type=submit]:focus {
background-color: var(--button-main-background-active);
border: none;
text-shadow: none;
box-shadow: none; }
/* Only this part below is different from the login page */
#below-form {
margin-top: 1rem;
text-align: center; }
#below-form a {
padding-bottom: .5rem;
cursor: pointer;
transition: border-bottom 100ms ease-out; }
#below-form a:hover,
#below-form a:focus {
color: rgba(255, 255, 255, 0.8);
border-bottom: 1px solid rgba(255, 255, 255, 0.6); }

View File

@ -1,271 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1920"
height="1080"
viewBox="0 0 508 285.75001"
version="1.1"
id="svg8"
sodipodi:docname="bg.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
preserveAspectRatio="none">
<defs
id="defs2">
<linearGradient
id="linearGradient1506"
inkscape:collect="always">
<stop
id="stop1502"
offset="0"
style="stop-color:#3996ff;stop-opacity:0.89705884" />
<stop
id="stop1504"
offset="1"
style="stop-color:#7a2caa;stop-opacity:0" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient1402-6">
<stop
style="stop-color:#1c3081;stop-opacity:1"
offset="0"
id="stop1454" />
<stop
style="stop-color:#7a2caa;stop-opacity:1"
offset="1"
id="stop1456" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1402-6"
id="linearGradient1422"
gradientUnits="userSpaceOnUse"
x1="207.9357"
y1="6.231005e-09"
x2="244.47226"
y2="151.04616" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1506"
id="radialGradient1500"
cx="253.99998"
cy="142.87502"
fx="253.99998"
fy="142.87502"
r="254"
gradientTransform="matrix(1.0925975,2.1601218e-8,-1.6571401e-8,0.83818749,-23.519771,23.118955)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="1128.5618"
inkscape:cy="335.46497"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1061"
inkscape:window-x="1920"
inkscape:window-y="1080"
inkscape:window-maximized="1"
units="px"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-bbox="true"
inkscape:snap-page="true" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="BG"
sodipodi:insensitive="true">
<rect
style="fill:url(#linearGradient1422);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1396"
width="508"
height="285.75"
x="-2.5560073e-08"
y="6.2309931e-09" />
</g>
<g
inkscape:label="Center Highlight"
id="g1496"
inkscape:groupmode="layer"
sodipodi:insensitive="true">
<rect
y="5.7251614e-06"
x="-1.1444092e-05"
height="285.75"
width="508"
id="rect1494"
style="fill:url(#radialGradient1500);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Transparent Highlights">
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513"
width="48.917919"
height="268.14758"
x="-37.255283"
y="-66.653755"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
ry="14.541889" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-7"
width="29.083778"
height="280.83319"
x="-77.095451"
y="93.633575"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-9"
width="29.083778"
height="280.83319"
x="-235.79486"
y="28.764849"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-3"
width="29.083778"
height="280.83319"
x="-278.81018"
y="237.31682"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-06"
width="29.083778"
height="280.83319"
x="-413.18396"
y="190.08469"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-2"
width="29.083778"
height="280.83319"
x="90.303535"
y="156.41028"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1572"
width="104.23512"
height="230.38632"
x="264.26831"
y="147.34708"
transform="rotate(-30)"
ry="43.717068" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1574"
width="82.239799"
height="257.36731"
x="132.64613"
y="22.777628"
transform="rotate(-30)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1576"
width="97.161247"
height="243.96391"
x="-65.513947"
y="220.71979"
transform="rotate(-30)"
ry="28.559462" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1578"
width="84.760918"
height="229.15842"
x="91.800362"
y="203.64694"
transform="matrix(0.86562457,-0.50069363,0.49930672,0.8664253,0,0)"
ry="32.495167" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1578-8"
width="64.990334"
height="235.05061"
x="-64.990334"
y="-117.52531"
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1578-7"
width="64.990334"
height="235.05061"
x="-53.941257"
y="145.60141"
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1572-9"
width="104.23513"
height="230.38632"
x="195.87666"
y="346.85233"
transform="rotate(-30)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-7-2"
width="29.083778"
height="280.83319"
x="-91.637344"
y="-46.783016"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
ry="14.541889" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1513-3-0"
width="29.083778"
height="280.83319"
x="-351.25281"
y="340.11569"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)" />
<rect
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1578-2"
width="64.048317"
height="238.82486"
x="101.23595"
y="-60.247566"
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
ry="32.024158" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

View File

@ -1,90 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Web\Backend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
/** @var phpOMS\Model\Html\Head $head */
$head = $this->getData('head');
/** @var array $dispatch */
$dispatch = $this->getData('dispatch') ?? [];
?>
<!DOCTYPE HTML>
<html lang="<?= $this->printHtml($this->response->getLanguage()); ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#1e3182">
<meta name="msapplication-navbutton-color" content="#1e3182">
<meta name="apple-mobile-web-app-status-bar-style" content="#1e3182">
<meta name="description" content="<?= $this->getHtml(':meta', '0', '0'); ?>">
<?= $head->meta->render(); ?>
<base href="<?= UriFactory::build('{/base}'); ?>/">
<link rel="shortcut icon" href="<?= UriFactory::build('Applications/Backend/img/favicon.ico?v=1.0.0'); ?>" type="image/x-icon">
<title><?= $this->printHtml($head->title); ?></title>
<?= $head->renderAssets(); ?>
<style><?= $head->renderStyle(); ?></style>
<script><?= $head->renderScript(); ?></script>
</head>
<body>
<div class="vh" id="dim"></div>
<?php include __DIR__ . '/tpl/header.tpl.php'; ?>
<main>
<?php include __DIR__ . '/tpl/nav-side.tpl.php'; ?>
<div id="content" class="container-fluid" role="main">
<?php
$c = 0;
foreach ($dispatch as $view) {
if (!($view instanceof \phpOMS\Views\NullView)
&& $view instanceof \phpOMS\Contract\RenderableInterface
) {
++$c;
echo $view->render();
}
}
if ($c === 0) {
echo '<div class="emptyPage"></div>';
}
?>
</div>
</main>
<div id="app-message-container">
<template id="app-message-tpl">
<div class="log-msg">
<h1 class="log-msg-title"></h1><i class="close fa fa-times"></i>
<div class="log-msg-content"></div>
</div>
</template>
</div>
<template id="table-context-menu-tpl">
<div id="table-context-menu" class="context-menu">
<ul>
<li class="context-line">
<label class="checkbox" for="itable1-visibile-">
<input type="checkbox" id="itable1-visibile-" name="itable1-visible" checked>
<span class="checkmark"></span>
</label>
</li>
</ul>
</div>
</template>
<?= $head->renderAssetsLate(); ?>

View File

@ -1,219 +0,0 @@
import { AssetManager } from '../../../jsOMS/Asset/AssetManager.js';
import { Logger } from '../../../jsOMS/Log/Logger.js';
import { CacheManager } from '../../../jsOMS/DataStorage/CacheManager.js';
import { StorageManager } from '../../../jsOMS/DataStorage/StorageManager.js';
import { EventManager } from '../../../jsOMS/Event/EventManager.js';
import { ResponseManager } from '../../../jsOMS/Message/Response/ResponseManager.js';
import { AccountManager } from '../../../jsOMS/Account/AccountManager.js';
import { UIManager } from '../../../jsOMS/UI/UIManager.js';
import { InputManager } from '../../../jsOMS/UI/Input/InputManager.js';
import { ModuleManager } from '../../../jsOMS/Module/ModuleManager.js';
import { ReadManager } from '../../../jsOMS/UI/Input/Voice/ReadManager.js';
import { VoiceManager } from '../../../jsOMS/UI/Input/Voice/VoiceManager.js';
import { NotificationManager } from '../../../jsOMS/Message/Notification/NotificationManager.js';
import { HttpUri } from '../../../jsOMS/Uri/HttpUri.js';
import { UriFactory } from '../../../jsOMS/Uri/UriFactory.js';
import { ACTION_EVENTS } from './global/ActionEvents.js';
import { KEYBOARD_EVENTS } from './global/KeyboardEvents.js';
import { MOUSE_EVENTS } from './global/MouseEvents.js';
import { RESPONSE_EVENTS } from './global/ResponseEvents.js';
import { TOUCH_EVENTS } from './global/TouchEvents.js';
import { VOICE_EVENTS } from './global/VoiceEvents.js';
/**
* Application entry point
*
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @since 1.0.0
*/
export class Application
{
/**
* @constructor
*
* @since 1.0.0
*/
constructor ()
{
//jsOMS.Autoloader.initPreloaded();
this.logger = Logger.getInstance(true, false, false);
window.logger = this.logger;
this.cacheManager = new CacheManager();
this.storageManager = new StorageManager();
this.eventManager = new EventManager();
this.responseManager = new ResponseManager();
this.assetManager = new AssetManager();
this.accountManager = new AccountManager();
this.uiManager = new UIManager(this);
this.inputManager = new InputManager(this);
this.moduleManager = new ModuleManager(this);
this.readManager = new ReadManager();
this.voiceManager = new VoiceManager(this);
this.notifyManager = new NotificationManager();
this.request = null;
this.reInit();
this.setupServiceWorker();
this.setResponseMessages();
this.setVoiceActions();
this.setActions();
this.setKeyboardActions();
this.setMouseActions();
this.setPopstate();
};
reInit()
{
this.request = new HttpUri(window.location.href);
this.request.setRootPath(
HttpUri.parseUrl(
document.getElementsByTagName('base')[0].href
).path
);
UriFactory.setupUriBuilder(this.request);
UriFactory.setQuery('/lang', window.location.href.substr(this.request.getBase().length).split('/')[0]);
this.uiManager.bind();
};
setPopstate()
{
window.addEventListener('popstate', function (event, state) {
window.location.href = window.location.href;
});
};
/**
* Setup the service worker
*
* @return {void}
*
* @sicne 1.0.0
*/
setupServiceWorker ()
{
/** global: navigator */
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/Web/Backend/ServiceWorker.js', {scope: this.request.getBase()}).catch(function (e)
{
Logger.instance.warning('ServiceWorker registration failed.');
});
}
};
/**
* Setup the response manager
*
* @return {void}
*
* @sicne 1.0.0
*/
setResponseMessages ()
{
/** global: RESPONSE_EVENTS */
for(let key in RESPONSE_EVENTS) {
if(RESPONSE_EVENTS.hasOwnProperty(key)) {
this.responseManager.add(key, RESPONSE_EVENTS[key]);
}
}
};
/**
* Setup the action manager
*
* @return {void}
*
* @sicne 1.0.0
*/
setActions ()
{
/** global: ACTION_EVENTS */
for(let key in ACTION_EVENTS) {
if(ACTION_EVENTS.hasOwnProperty(key)) {
this.uiManager.getActionManager().add(key, ACTION_EVENTS[key]);
}
}
};
/**
* Setup the keyboard manager
*
* @return {void}
*
* @sicne 1.0.0
*/
setKeyboardActions ()
{
/** global: KEYBOARD_EVENTS */
let length = KEYBOARD_EVENTS.length;
for(let i = 0; i < length; i++) {
this.inputManager.getKeyboardManager().add(
KEYBOARD_EVENTS[i]['element'],
KEYBOARD_EVENTS[i]['keys'],
KEYBOARD_EVENTS[i]['callback']
);
}
};
/**
* Setup the mouse manager
*
* @return {void}
*
* @sicne 1.0.0
*/
setMouseActions ()
{
/** global: MOUSE_EVENTS */
let length = MOUSE_EVENTS.length;
for(let i = 0; i < length; i++) {
this.inputManager.getMouseManager().add(
MOUSE_EVENTS[i]['element'],
MOUSE_EVENTS[i]['type'],
MOUSE_EVENTS[i]['button'],
MOUSE_EVENTS[i]['callback'],
MOUSE_EVENTS[i]['exact']
);
}
};
/**
* Setup the voice manager
*
* @return {void}
*
* @sicne 1.0.0
*/
setVoiceActions ()
{
/** global: VOICE_EVENTS */
for(let key in VOICE_EVENTS) {
if(VOICE_EVENTS.hasOwnProperty(key)) {
this.voiceManager.add(key, VOICE_EVENTS[key]);
}
}
this.voiceManager.setup();
this.voiceManager.start();
};
};
/**
* Create the application after loading the page
*/
jsOMS.ready(function ()
{
"use strict";
window.omsApp = new Application();
});

View File

@ -1,15 +0,0 @@
import { redirectMessage } from '../../../../jsOMS/Model/Message/Redirect.js';
import { requestAction } from '../../../../jsOMS/Model/Action/Message/Request.js';
import { reloadButtonAction } from '../../../../jsOMS/Model/Action/Dom/Reload.js';
import { preventEvent } from '../../../../jsOMS/Model/Action/Event/Prevent.js';
import { domClickAction } from '../../../../jsOMS/Model/Action/Dom/Click.js';
import { formSubmitAction } from '../../../../jsOMS/Model/Action/Dom/FormSubmit.js';
export const ACTION_EVENTS = {
'redirect': redirectMessage, /** global: redirectMessage */
'message.request': requestAction, /** global: requestAction */
'dom.reload': reloadButtonAction, /** global: reloadButtonAction */
'dom.click': domClickAction, /** global: domClickAction */
'form.submit': formSubmitAction, /** global: domClickAction */
'event.prevent': preventEvent, /** global: preventEvent */
};

View File

@ -1,116 +0,0 @@
/** global: jsOMS */
export const KEYBOARD_EVENTS = [
{
'element': '', // jump into search bar
'keys': [17, 80], // ctrl+p
'callback': function (e) {document.getElementById('iSearchBox').focus();}
}, {
'element': 'form, input, textarea, select', // submit currently focused form with the first found submit element (add, update, save)
'keys': [17, 13], // ctrl+enter
'callback': function (e) {
const focused = document.activeElement;
let formId = focused.closest('form');
if (formId !== null) {
formId = formId.id;
}
if (formId === null) {
formId = focused.getAttribute('form');
}
if (formId === null) {
formId = focused.getAttribute('data-form');
}
if (formId === null) {
return;
}
const form = window.omsApp.uiManager.getFormManager().get(formId);
const buttons = form.getSubmit();
const length = buttons.length;
let defaultSubmit = -1;
for (let i = 0; i < length; ++i) {
if (jsOMS.hasClass(buttons[i], 'hidden')) {
continue;
}
if (jsOMS.hasClass(buttons[i], 'add-form')
|| jsOMS.hasClass(buttons[i], 'update-form')
|| jsOMS.hasClass(buttons[i], 'save-form')
) {
buttons[i].click();
break;
}
defaultSubmit = i;
}
if (defaultSubmit !== -1) {
buttons[defaultSubmit].click();
}
}
}, {
'element': 'label, tr', // click label
'keys': [13], // enter
'callback': function (e) {document.activeElement.click();}
}, {
'element': '', // previous page
'keys': [17, 66], // ctrl+b
'callback': function (e) {window.history.back();}
}, {
'element': '', // next tabindex
'keys': [17, 40], // ctrl+down
'callback': function (e) {
const focusable = document.querySelectorAll('button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
const length = focusable.length;
for (let i = 0; i < length; ++i) {
if (document.activeElement === focusable[i]) {
let j = 1;
do {
if (i + j < length) {
focusable[i + j].focus();
} else {
focusable[0 + j - 1].focus();
}
++j;
} while (j < length && document.activeElement === focusable[i]);
return;
}
}
document.dispatchEvent(new KeyboardEvent('keypress', {keyCode: 9}));
}
}, {
'element': '', // previous tab index
'keys': [17, 38], // ctrl+up
'callback': function (e) {
const focusable = document.querySelectorAll('button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
const length = focusable.length;
for (let i = 0; i < length; ++i) {
if (document.activeElement === focusable[i]) {
let j = 1;
do {
if (i - j + 1 > 0) {
focusable[i - j].focus();
} else {
focusable[length - j].focus();
}
++j;
} while (j < length && document.activeElement === focusable[i]);
return;
}
}
document.dispatchEvent(new KeyboardEvent('keypress', {keyCode: 9}));
}
}];

View File

@ -1,18 +0,0 @@
import { EventType } from '../../../../jsOMS/UI/Input/Mouse/EventType.js';
import { ClickType } from '../../../../jsOMS/UI/Input/Mouse/ClickType.js';
/** global: jsOMS */
export const MOUSE_EVENTS = [
{
'element': 'nav-side',
'type': EventType.CONTEXT,
'button': ClickType.RIGHT,
'callback': function () { window.omsApp.logger.log('right clicked'); },
'exact': true
}, {
'element': 'nav-side',
'type': EventType.LONGPRESS,
'button': ClickType.LEFT,
'callback': function () { window.omsApp.logger.log('left clicked'); },
'exact': false
}];

View File

@ -1,12 +0,0 @@
import { notifyMessage } from '../../../../jsOMS/Model/Message/Notify.js';
import { formValidationMessage } from '../../../../jsOMS/Model/Message/FormValidation.js';
import { redirectMessage } from '../../../../jsOMS/Model/Message/Redirect.js';
import { reloadMessage } from '../../../../jsOMS/Model/Message/Reload.js';
/** global: jsOMS */
export const RESPONSE_EVENTS = {
'notify': notifyMessage, /** global: notifyMessage */
'validation': formValidationMessage, /** global: formValidationMessage */
'redirect': redirectMessage, /** global: redirectMessage */
'reload': reloadMessage /** global: reloadMessage */
};

View File

@ -1,2 +0,0 @@
/** global: jsOMS */
export const TOUCH_EVENTS = {};

View File

@ -1,57 +0,0 @@
import { Logger } from '../../../../jsOMS/Log/Logger.js';
import { NotificationLevel } from '../../../../jsOMS/Message/Notification/NotificationLevel.js';
import { NotificationMessage } from '../../../../jsOMS/Message/Notification/NotificationMessage.js';
import { NotificationType } from '../../../../jsOMS/Message/Notification/NotificationType.js';
import { Request } from '../../../../jsOMS/Message/Request/Request.js';
import { RequestMethod } from '../../../../jsOMS/Message/Request/RequestMethod.js';
import { RequestType } from '../../../../jsOMS/Message/Request/RequestType.js';
import { Response } from '../../../../jsOMS/Message/Response/Response.js';
/** global: jsOMS */
export const VOICE_EVENTS = {
'read': 'read_text',
'help': function() { Logger.instance.debug('There is no help for you.'); },
'go to': function(speech) {
const request = new Request();
request.setData({});
request.setType(RequestType.FORM_DATA);
request.setUri('api/navigation/goto?app=Backend&search=' + speech);
request.setMethod(RequestMethod.GET);
request.setSuccess(function (xhr)
{
window.omsApp.logger.log(xhr.response);
try {
const o = JSON.parse(xhr.response)[0];
const response = new Response(o);
if (typeof response.get('type') !== 'undefined') {
window.omsApp.responseManager.run(response.get('type'), response.get(), request);
} else if (typeof o.status !== 'undefined' && o.status !== NotificationLevel.HIDDEN) {
window.omsApp.notifyManager.send(
new NotificationMessage(o.status, o.title, o.message), NotificationType.APP_NOTIFICATION
);
}
} catch (e) {
window.omsApp.logger.log(e);
Logger.instance.error('Invalid form response. \n'
+ 'Request: ' + JSON.stringify(speech) + '\n'
+ 'Response: ' + xhr.response
);
}
});
request.setResultCallback(0, function (xhr)
{
window.omsApp.notifyManager.send(
new NotificationMessage(
NotificationLevel.ERROR,
'Failure',
'Some failure happened'
), NotificationType.APP_NOTIFICATION
);
});
request.send();
}};

View File

@ -1,71 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Web\Backend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
$head = $this->getData('head');
?>
<!DOCTYPE HTML>
<html lang="<?= $this->printHtml($this->response->getLanguage()); ?>">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8">
<base href="<?= UriFactory::build('{/base}'); ?>/">
<meta name="theme-color" content="#1e3182">
<meta name="msapplication-navbutton-color" content="#1e3182">
<meta name="apple-mobile-web-app-status-bar-style" content="#1e3182">
<meta name="description" content="<?= $this->getHtml(':meta', '0', '0'); ?>">
<link rel="shortcut icon" href="<?= UriFactory::build('Applications/Backend/img/favicon.ico'); ?>" type="image/x-icon">
<?= $head->meta->render(); ?>
<title><?= $this->printHtml($head->title); ?></title>
<style><?= $head->renderStyle(); ?></style>
<script><?= $head->renderScript(); ?></script>
<?= $head->renderAssets(); ?>
</head>
<body>
<main>
<div id="login-container">
<div id="login-logo">
<img alt="<?= $this->getHtml('Logo', '0', '0'); ?>" src="<?= UriFactory::build('Applications/Backend/img/logo.png'); ?>">
</div>
<header><h1><?= $this->getHtml('SignIn', '0', '0'); ?></h1></header>
<div id="login-form">
<form id="login" method="POST" action="<?= UriFactory::build('{/api}login?{?}'); ?>">
<label for="iName"><?= $this->getHtml('Username', '0', '0'); ?>:</label>
<div class="inputWithIcon">
<input id="iName" type="text" name="user" tabindex="1" value="" autocomplete="off" spellcheck="false" autofocus>
<i class="frontIcon fa fa-user fa-lg fa-fw" aria-hidden="true"></i>
<i class="endIcon fa fa-times fa-lg fa-fw" aria-hidden="true"></i>
</div>
<label for="iPassword"><?= $this->getHtml('Password', '0', '0'); ?>:</label>
<div class="inputWithIcon">
<input id="iPassword" type="password" name="pass" tabindex="2" value="">
<i class="frontIcon fa fa-lock fa-lg fa-fw" aria-hidden="true"></i>
<i class="endIcon fa fa-times fa-lg fa-fw" aria-hidden="true"></i>
</div>
<input id="iLoginButton" name="loginButton" type="submit" value="<?= $this->getHtml('SignIn', '0', '0'); ?>" tabindex="3">
</form>
</div>
<div id="below-form"><a href="<?= UriFactory::build('{/prefix}forgot'); ?>" tabindex="4"><?= $this->getHtml('ForgotPassword', '0', '0'); ?></a></div>
</div>
</main>
<footer>
<ul>
<li><a href="/privacy"><?= $this->getHtml('PrivacyPolicy', '0', '0'); ?></a>
<li><a href="/terms"><?= $this->getHtml('Terms', '0', '0'); ?></a>
<li><a href="/imprint"><?= $this->getHtml('Imprint', '0', '0'); ?></a>
</ul>
</footer>
<?= $head->renderAssetsLate(); ?>

View File

@ -1,64 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Applications\E500
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\E500;
use phpOMS\Asset\AssetType;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Model\Html\Head;
use phpOMS\System\File\PathException;
use phpOMS\Views\View;
use WebApplication;
final class Application
{
private WebApplication $app;
private array $config = [];
public function __construct(WebApplication $app, array $config)
{
$this->app = $app;
$this->config = $config;
$this->app->appName = 'E500';
}
public function run(HttpRequest $request, HttpResponse $response) : void
{
$pageView = new View($this->app->l11nManager, $request, $response);
$pageView->setTemplate('/Applications/E500/index');
$response->set('Content', $pageView);
$response->header->status = RequestStatusCode::R_500;
/* Load theme language */
if (($path = \realpath($oldPath = __DIR__ . '/lang/' . $response->getLanguage() . '.lang.php')) === false) {
throw new PathException($oldPath);
}
$this->app->l11nManager = new L11nManager($this->app->appName);
/** @noinspection PhpIncludeInspection */
$themeLanguage = include $path;
$this->app->l11nManager->loadLanguage($response->getLanguage(), '0', $themeLanguage);
$head = new Head();
$baseUri = $request->uri->getBase();
$head->addAsset(AssetType::CSS, $baseUri . 'cssOMS/styles.css?v=1.0.0');
$pageView->setData('head', $head);
}
}

View File

@ -1,7 +0,0 @@
<?php
declare(strict_types=1);
return [[
'ErrorMessage' => 'Error 500 - Unexpected error',
'Description' => 'Something unexpected happened but don\'t fear we already got informed about this error.',
]];

View File

@ -1,219 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Applications\Frontend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\Frontend;
use Models\CoreSettings;
use phpOMS\Account\Account;
use phpOMS\Account\NullAccount;
use phpOMS\Account\AccountManager;
use phpOMS\Asset\AssetType;
use phpOMS\Auth\Auth;
use phpOMS\DataStorage\Cache\CachePool;
use phpOMS\DataStorage\Cookie\CookieJar;
use phpOMS\DataStorage\Database\DatabasePool;
use phpOMS\DataStorage\Session\HttpSession;
use phpOMS\Dispatcher\Dispatcher;
use phpOMS\Event\EventManager;
use phpOMS\Localization\L11nManager;
use phpOMS\Localization\Localization;
use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse;
use phpOMS\Message\Http\RequestMethod;
use phpOMS\Message\Http\RequestStatusCode;
use phpOMS\Model\Html\Head;
use phpOMS\Router\WebRouter;
use phpOMS\Uri\UriFactory;
use phpOMS\Views\View;
use WebApplication;
final class Application
{
private WebApplication $app;
private array $config;
public function __construct(WebApplication $app, array $config)
{
$this->app = $app;
$this->app->appName = 'Frontend';
$this->config = $config;
UriFactory::setQuery('/app', \strtolower($this->app->appName));
}
public function run(HttpRequest $request, HttpResponse $response) : void
{
$this->app->l11nManager = new L11nManager($this->app->appName);
$this->app->dbPool = new DatabasePool();
$this->app->sessionManager = new HttpSession(0);
$this->app->cookieJar = new CookieJar();
$this->app->dispatcher = new Dispatcher($this->app);
$this->app->router = new WebRouter();
$this->app->router->importFromFile(__DIR__ . '/../../Routes.php');
$this->app->router->importFromFile(__DIR__ . '/Routes.php');
/* CSRF token OK? */
if ($request->getData('CSRF') !== null
&& !\hash_equals($this->app->sessionManager->get('CSRF'), $request->getData('CSRF'))
) {
$response->header->status = RequestStatusCode::R_403;
return;
}
$this->app->cachePool = new CachePool();
$this->app->appSettings = new CoreSettings();
$this->app->eventManager = new EventManager($this->app->dispatcher);
$this->app->accountManager = new AccountManager($this->app->sessionManager);
$this->app->l11nServer = new Localization();
$aid = Auth::authenticate($this->app->sessionManager);
$request->header->account = $aid;
$response->header->account = $aid;
$account = $this->loadAccount($request);
if ($this->app->sessionManager->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->sessionManager->get('language'),
$this->app->sessionManager->get('country') ?? '*'
);
} elseif ($this->app->cookieJar->get('language') !== null) {
$response->header->l11n
->loadFromLanguage(
$this->app->cookieJar->get('language'),
$this->app->cookieJar->get('country') ?? '*'
);
}
if (!\in_array($response->getLanguage(), $this->config['language'])) {
$response->header->l11n->setLanguage($this->app->l11nServer->getLanguage());
}
$pageView = new FrontendView($this->app->l11nManager, $request, $response);
$head = new Head();
$pageView->setData('head', $head);
$response->set('Content', $pageView);
/* Fontend only allows GET */
if ($request->getMethod() !== RequestMethod::GET) {
$this->create406Response($response, $pageView);
return;
}
UriFactory::setQuery('/lang', $response->getLanguage());
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/lang/' . $response->getLanguage() . '.lang.php'
);
$response->header->set('content-language', $response->getLanguage(), true);
/* Create html head */
$this->initResponseHead($head, $request, $response);
$this->createDefaultPageView($request, $response, $pageView);
$dispatched = $this->app->dispatcher->dispatch(
$this->app->router->route(
$request->uri->getRoute(),
$request->getData('CSRF'),
$request->getRouteVerb(),
$this->app->appName,
$this->app->orgId,
$account,
$request->getData()
),
$request,
$response
);
$pageView->addData('dispatch', $dispatched);
}
private function createDefaultPageView(HttpRequest $request, HttpResponse $response, FrontendView $pageView) : void
{
$pageView->setTemplate('/Applications/Frontend/index');
}
private function create406Response(HttpResponse $response, View $pageView) : void
{
$response->header->status = RequestStatusCode::R_406;
$pageView->setTemplate('/Applications/Frontend/Error/406');
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/Error/lang/' . $response->getLanguage() . '.lang.php'
);
}
private function create503Response(HttpResponse $response, View $pageView) : void
{
$response->header->status = RequestStatusCode::R_503;
$pageView->setTemplate('/Applications/Frontend/Error/503');
$this->app->loadLanguageFromPath(
$response->getLanguage(),
__DIR__ . '/Error/lang/' . $response->getLanguage() . '.lang.php'
);
}
private function loadAccount(HttpRequest $request) : Account
{
$account = new NullAccount();
$this->app->accountManager->add($account);
return $account;
}
private function initResponseHead(Head $head, HttpRequest $request, HttpResponse $response) : void
{
/* Load assets */
$head->addAsset(AssetType::CSS, 'Resources/fonts/fontawesome/css/font-awesome.min.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/linearicons/css/style.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/lineicons/css/lineicons.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'cssOMS/styles.css?v=1.0.0');
$head->addAsset(AssetType::CSS, 'Resources/fonts/Roboto/roboto.css?v=1.0.0');
// Framework
$head->addAsset(AssetType::JS, 'jsOMS/Utils/oLib.js?v=1.0.0');
$head->addAsset(AssetType::JS, 'jsOMS/UnhandledException.js?v=1.0.0');
$head->addAsset(AssetType::JS, 'Applications/Frontend/js/frontend.js?v=1.0.0', ['type' => 'module']);
$script = '';
$response->header->set(
'content-security-policy',
'base-uri \'self\'; script-src \'self\' blob: \'sha256-'
. \base64_encode(\hash('sha256', $script, true))
. '\'; worker-src \'self\'',
true
);
if ($request->hasData('debug')) {
$head->addAsset(AssetType::CSS, 'cssOMS/debug.css?v=1.0.0');
\phpOMS\DataStorage\Database\Query\Builder::$log = true;
}
$css = \file_get_contents(__DIR__ . '/css/small.css');
if ($css === false) {
$css = '';
}
$css = \preg_replace('!\s+!', ' ', $css);
$head->setStyle('core', $css ?? '');
$head->title = 'Online Resource Watcher';
}
}

View File

@ -1,7 +0,0 @@
<?php
declare(strict_types=1);
return [[
'ErrorMessage' => 'Error 500 - Unexpected error',
'Description' => 'Something unexpected happened but don\'t fear we already got informed about this error.',
]];

View File

@ -1,28 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Web\Backend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
namespace Applications\Frontend;
use phpOMS\Localization\L11nManager;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Views\View;
class FrontendView extends View
{
public function __construct(L11nManager $l11n = null, RequestAbstract $request = null, ResponseAbstract $response = null)
{
parent::__construct($l11n, $request, $response);
}
}

View File

@ -1,31 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Router\RouteVerb;
return [
'^/*$' => [
[
'dest' => '\Controllers\FrontController:frontView',
'verb' => RouteVerb::GET,
],
],
'.*?/features' => [
[
'dest' => '\Controllers\FrontController:featureView',
'verb' => RouteVerb::GET,
],
],
'.*?/pricing' => [
[
'dest' => '\Controllers\FrontController:pricingView',
'verb' => RouteVerb::GET,
],
],
'.*?/signup' => [
[
'dest' => '\Controllers\FrontController:signupView',
'verb' => RouteVerb::GET,
],
],
];

View File

@ -1,28 +0,0 @@
# Impressum
jingga
**Vertreten durch**
Dennis Eichhorn
**Kontakt**
spl1nes.com@googlemail.com
**Registereintrag**
Nicht vorhanden
**Umsatzsteuer-ID gemäß §27 a Umsatzsteuergesetz**
Nicht vorhanden
**Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV**
jingga
Dennis Eichhorn
**Datenschutzbeauftragter**
spl1nes.com@googlemail.com

View File

@ -1,28 +0,0 @@
# Imprint
jingga
**Represented by**
Dennis Eichhorn
**Contact**
spl1nes.com@googlemail.com
**Commercial register**
Not available
**VAT-ID according §27 a value added tax (Umsatzsteuergesetz)**
Not available
**Responsible for the content according to § 55 Abs. 2 RStV**
jingga
Dennis Eichhorn
**Data protection officer**
spl1nes.com@googlemail.com

View File

@ -1,48 +0,0 @@
# Datenschutzerklärung
## Definitionen
Für die Zwecke dieser Datenschutzerklärung:
* ANGESCHLOSSEN bedeutet ein Unternehmen, das eine Partei kontrolliert, von ihr kontrolliert wird oder mit ihr unter gemeinsamer Kontrolle steht, wobei "Kontrolle" den Besitz von 50 % oder mehr der Aktien, Anteile oder anderer Wertpapiere bedeutet, die zur Wahl von Direktoren oder anderen leitenden Angestellten berechtigt sind.
* LAND bezieht sich auf Deutschland.
* UNTERNEHMEN (in dieser VEREINBARUNG entweder als "das Unternehmen", "wir", "uns" oder "unser" bezeichnet) bezieht sich auf jingga, Gartenstr. 26, 61206 Wöllstadt.
* GERÄT bezeichnet jedes Gerät, das auf den Dienst zugreifen kann, wie z.B. ein Computer, ein Mobiltelefon oder ein digitales Tablet.
* SERVICE bezieht sich auf die Website.
* TERMINE oder VEREINBARUNG bezeichnet diese Bedingungen, die die gesamte Vereinbarung zwischen Ihnen und der FIRMA bezüglich der Nutzung des SERVICE bilden.
* Social-Media-Dienst eines Dritten bezeichnet alle Dienste oder Inhalte (einschließlich Daten, Informationen, Produkte oder Dienste), die von einem Dritten bereitgestellt werden und durch den DIENST angezeigt, einbezogen oder verfügbar gemacht werden können.
* WEBSITE bezieht sich auf jingga.app.
* ANWENDUNG bezieht sich auf alle herunterladbaren oder installierbaren Inhalte, die auf einem bestimmten GERÄT genutzt werden können.
* Sie bezeichnet die Person, die auf die DIENSTE zugreift oder diese nutzt, oder das Unternehmen oder eine andere juristische Person, in deren Namen eine solche Person auf die DIENSTE zugreift oder diese nutzt, je nachdem.
## Was sind personenbezogene Daten?
Personenbezogene Daten sind Informationen, die dazu genutzt werden können, persönliche oder sachliche Verhältnisse über Sie zu erfahren (z.B. Name, Anschrift, Telefonnummer, Geburtsdatum, E-Mail-Adresse). Informationen, bei denen wir keinen (oder nur mit einem unverhältnismäßigen Aufwand) Bezug zu Ihrer Person herstellen können, z.B. durch Anonymisierung der Informationen, sind keine personenbezogenen Daten.
## Welche personenbezogenen Daten werden von uns erhoben/verarbeitet und genutzt?
Gespeichert werden Zugriffsdaten ohne Personenbezug, wie z.B. der Name Ihres Internet Service Providers, die Seite, von der aus Sie uns besuchen, die Namen der angeforderten Dateien und deren Abrufdatum. Diese Daten werden ausschließlich zur Verbesserung unseres Angebotes ausgewertet und erlauben keinerlei Rückschlüsse auf Ihre Person.
Soweit Sie von uns auf unserem Internetauftritt angebotene Leistungen, wie den Kauf von ANWENDUNGEN, etc., in Anspruch nehmen wollen, ist es dagegen nötig, dass Sie dazu weitere Daten angeben. Es handelt sich um diejenigen Daten, die zur jeweiligen Abwicklung erforderlich sind, z.B. die E-Mailadresse bei Bestellung einer DIENSTLEISTUNG oder ANWENDUNG.
Wir nutzen die von uns über Sie erhobenen Daten für die Bereitstellung der von uns angebotenen Produkte und DIENSTLEISTUNG, für die Beantwortung Ihrer Fragen sowie für den Betrieb und die Verbesserung unserer Webseiten und ANWENDUNG.
Eine weitere Nutzung Ihrer personenbezogenen Daten findet nicht statt. Eine Übermittlung Ihrer personenbezogenen Daten an Dritte oder eine Nutzung Ihrer Daten zu Werbezwecken ohne Ihre Einwilligung findet, ausgenommen der unten dargestellten Fälle, nicht statt, es sei denn, dass wir gesetzlich zur Herausgabe von Daten verpflichtet sind (Auskunft an Strafverfolgungsbehörden und Gerichte; Auskunft an öffentliche Stellen, die Daten aufgrund gesetzlicher Vorschriften erhalten, z.B. Sozialversicherungsträger, Finanzbehörden usw.) oder dass wir zur Durchsetzung unserer Forderungen Dritte einschalten. Insbesondere werden personenbezogene Daten wie folgt genutzt:
* Wenn Sie sich bei jingga registrieren, wird zunächst Ihre E-Mail-Adresse von uns gespeichert, damit wir Ihnen neue Zugangsdaten zusenden können, falls Sie diese einmal vergessen sollten. Zudem speichern wir Ihren Vor- und Nachnamen sowie Ihr Passwort, um Ihnen ein komfortables Einloggen zu Ihrem Konto zu ermöglichen. Diese Daten werden von uns zu den vorbeschriebenen Zwecken genutzt, um Ihnen diesen Dienst anzubieten.
* Nehmen Sie die Möglichkeit in Anspruch, mittels unseres Kontaktformulars Anfragen an uns zu richten, fragen wir Sie nach Ihrem Namen und Ihrer E-Mail-Adresse. Ferner können Sie in dem Mitteilungsfeld Ihre individuelle Nachricht an uns eintragen. Es unterliegt Ihrer freien Entscheidung, ob Sie uns diese Daten mitteilen. Ohne diese Angaben können wir allerdings Ihren Kontaktwunsch nicht erfüllen.
## Änderungen dieser Bedingungen
Wir behalten uns das Recht vor, diese Bedingungen nach unserem alleinigen Ermessen jederzeit zu ändern oder zu ersetzen. Wenn eine Änderung wesentlich ist, werden wir uns angemessen bemühen, Sie mindestens 30 Tage vor Inkrafttreten der neuen Bedingungen zu informieren. Was eine wesentliche Änderung darstellt, wird nach unserem alleinigen Ermessen festgelegt.
Indem Sie nach Inkrafttreten dieser Änderungen weiterhin auf unseren SERVICE zugreifen oder ihn nutzen, erklären Sie sich mit den überarbeiteten Bedingungen einverstanden. Wenn Sie mit den neuen Bedingungen ganz oder teilweise nicht einverstanden sind, beenden Sie bitte die Nutzung der WEBSITE und des SERVICE.
## Kontakt
Bei Fragen zu diesen Bedingungen, den Datenschutzrichtlinien oder den Praktiken von Websites oder Diensten Dritter können Sie uns unter info@jingga.app kontaktieren. Sie erkennen ferner an und erklären sich damit einverstanden, dass die FIRMA weder direkt noch indirekt für Schäden oder Verluste verantwortlich oder haftbar ist, die durch oder in Verbindung mit der Nutzung von oder dem Vertrauen auf solche Inhalte, Waren oder Dienstleistungen, die auf oder über solche Websites oder Dienste verfügbar sind, verursacht werden oder angeblich verursacht werden.
Unseren Datenschutzbeauftragten erreichen Sie bei Fragen über die genannte Adresse oder per Mail an spl1nes.com@googlemail.com.
Wir empfehlen Ihnen dringend, die Geschäftsbedingungen und Datenschutzrichtlinien der von Ihnen besuchten Websites oder Dienste Dritter zu lesen.
Version 2022-08-14

View File

@ -1,48 +0,0 @@
# Privacy
## Definitions
For the purposes of these TERMS:
* AFFILIATED means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
* COUNTRY refers to Germany
* COMPANY (referred to as either "the Company", "We", "Us" or "Our" in this AGREEMENT) refers to jingga, Gartenstr. 26, 61206 Woellstadt.
* DEVICE means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* SERVICE refers to the Website
* TERMS or AGREEMENT mean these terms that form the entire agreement between You and the COMPANY regarding the use of the SERVICE.
* Third-party Social Media Service means any services or content (including data, information, products or services) provided by a third-party that may be displayed, included or made available by the SERVICE.
* WEBSITE refers to jingga.app
* APPLICATION refers to all downloadable or installable content which can therfore be used on an a given DEVICE.
* You means the individual accessing or using the SERVICES, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
## What is personal data?
Personal data is information that can be used to find out personal or factual circumstances about you (e.g. name, address, telephone number, date of birth, e-mail address). Information for which we cannot (or can only with a disproportionate effort) establish a relationship to your person, e.g. by anonymizing the information, is not personal data.
## What personal data do we collect/process and use?
Access data without personal reference is stored, such as the name of your Internet service provider, the page from which you visit us, the names of the requested files and their retrieval date. These data are evaluated exclusively for the improvement of our offer and do not allow any conclusions to be drawn about your person.
If you wish to make use of services offered by us on our website, such as the purchase of APPLICATIONS, etc., it is necessary, on the other hand, for you to provide further data for this purpose. This is the data that is required for the respective processing, e.g. the e-mail address when ordering a SERVICE or APPLICATION.
We use the data we collect about you to provide the products and SERVICES we offer, to answer your questions and to operate and improve our websites and APPLICATION.
No further use of your personal data will take place. A transfer of your personal data to third parties or a use of your data for advertising purposes without your consent will not take place, except for the cases described below, unless we are required by law to disclose data (information to law enforcement agencies and courts; information to public bodies that receive data under statutory provisions, e.g. social security agencies, tax authorities, etc.) or that we involve third parties to enforce our claims. In particular, personal data is used as follows:
* When you register with jingga, we first store your e-mail address so that we can send you new access data in case you forget it. In addition, we store your first and last name as well as your password to enable you to log in to your account conveniently. These data are used by us for the purposes described above in order to offer you this service.
* If you make use of the possibility to send inquiries to us by means of our contact form, we will ask you for your name and e-mail address. Furthermore, you can enter your individual message to us in the message field. It is your free decision whether you provide us with this data. However, we cannot fulfill your contact request without this information.
## Changes to these Terms
We reserve the right, at Our sole discretion, to modify or replace these TERMS at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.
By continuing to access or use Our SERVICE after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the WEBSITE and the SERVICE.
## Contact
For questions regarding these TERMS, privacy policies, or practices of any third party websites or services please feel free to contact us at info@jingga.app. You further acknowledge and agree that the COMPANY shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such websites or services.
If you have any questions, please contact our data protection officer at the above address or by e-mail at spl1nes.com@googlemail.com.
We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.
Version 2022-08-14

View File

@ -1,102 +0,0 @@
# AGB
## Definitionen
Für die Zwecke dieser AGBs:
* ANGESCHLOSSEN bedeutet ein Unternehmen, das eine Partei kontrolliert, von ihr kontrolliert wird oder mit ihr unter gemeinsamer Kontrolle steht, wobei "Kontrolle" den Besitz von 50 % oder mehr der Aktien, Anteile oder anderer Wertpapiere bedeutet, die zur Wahl von Direktoren oder anderen leitenden Angestellten berechtigt sind.
* LAND bezieht sich auf Deutschland.
* UNTERNEHMEN (in dieser VEREINBARUNG entweder als "das Unternehmen", "wir", "uns" oder "unser" bezeichnet) bezieht sich auf jingga, Gartenstr. 26, 61206 Wöllstadt.
* GERÄT bezeichnet jedes Gerät, das auf den Dienst zugreifen kann, wie z.B. ein Computer, ein Mobiltelefon oder ein digitales Tablet.
* SERVICE bezieht sich auf die Website.
* TERMINE oder VEREINBARUNG bezeichnet diese Bedingungen, die die gesamte Vereinbarung zwischen Ihnen und der FIRMA bezüglich der Nutzung des SERVICE bilden.
* Social-Media-Dienst eines Dritten bezeichnet alle Dienste oder Inhalte (einschließlich Daten, Informationen, Produkte oder Dienste), die von einem Dritten bereitgestellt werden und durch den DIENST angezeigt, einbezogen oder verfügbar gemacht werden können.
* WEBSITE bezieht sich auf jingga.app.
* ANWENDUNG bezieht sich auf alle herunterladbaren oder installierbaren Inhalte, die auf einem bestimmten GERÄT genutzt werden können.
* Sie bezeichnet die Person, die auf die DIENSTE zugreift oder diese nutzt, oder das Unternehmen oder eine andere juristische Person, in deren Namen eine solche Person auf die DIENSTE zugreift oder diese nutzt, je nachdem.
## Kenntnisnahme
Dies sind die GESCHÄFTSBEDINGUNGEN für die Nutzung dieses SERVICE und die Vereinbarung zwischen Ihnen und der FIRMA. Diese BEDINGUNGEN legen die Rechte und Pflichten aller Nutzer in Bezug auf die Nutzung des SERVICE fest.
Ihr Zugang zu und Ihre Nutzung des SERVICE und ANWENDUNGEN setzt voraus, dass Sie die vorliegenden GESCHÄFTSBEDINGUNGEN akzeptieren und einhalten. Diese GESCHÄFTSBEDINGUNGEN gelten für alle Besucher, Nutzer und andere, die auf den SERVICE zugreifen oder ihn nutzen.
Indem Sie auf den SERVICE und ANWENDUNGEN zugreifen oder ihn nutzen, erklären Sie sich damit einverstanden, an diese BEDINGUNGEN gebunden zu sein. Wenn Sie mit irgendeinem Teil dieser Bedingungen nicht einverstanden sind, dürfen Sie nicht auf den SERVICE zugreifen. Sie versichern, dass Sie mindestens 18 Jahre alt sind und die Volljährigkeit erreicht haben. Die FIRMA gestattet Personen unter 18 Jahren oder unter der Volljährigkeit nicht, den SERVICE zu nutzen.
Ihr Zugang zu und Ihre Nutzung des SERVICE und ANWENDUNGEN hängt auch davon ab, dass Sie die Datenschutzrichtlinie der FIRMA akzeptieren und einhalten. Unsere Datenschutzrichtlinie beschreibt unsere Richtlinien und Verfahren für die Erfassung, Nutzung und Offenlegung Ihrer persönlichen Daten, wenn Sie die Anwendung oder die WEBSITE nutzen, und informiert Sie über Ihre Datenschutzrechte und darüber, wie das Gesetz Sie schützt. Bitte lesen Sie Unsere Datenschutzrichtlinien sorgfältig durch, bevor Sie Unseren SERVICE nutzen.
## Urheberrecht
Sofern nicht anders angegeben, sind alle Materialien, einschließlich, aber nicht beschränkt auf Logos, Markennamen, Bilder, Designs, Fotografien, Videos, Audiodateien, Quellcode und schriftliche und andere Materialien, die als Teil unserer WEBSITE, DIENSTE und ANWENDUNGEN erscheinen, Urheberrechte, Marken, Dienstleistungsmarken, Handelsaufmachungen und/oder anderes geistiges Eigentum, ob eingetragen oder nicht eingetragen ("geistiges Eigentum"), das Eigentum von jingga ist oder von jingga kontrolliert oder lizenziert wird. Unsere WEBSITE als Ganzes ist urheberrechtlich und durch Handelsaufmachung geschützt. Nichts auf unserer WEBSITE ist so auszulegen, dass stillschweigend, durch Rechtsverwirkung oder anderweitig eine Lizenz oder ein Recht zur Nutzung von geistigem Eigentum, das auf unserer WEBSITE angezeigt oder verwendet wird, ohne die vorherige schriftliche Genehmigung des Eigentümers des geistigen Eigentums gewährt wird. jingga setzt seine Rechte an geistigem Eigentum in vollem Umfang des Gesetzes aggressiv durch. Die Namen und Logos von jingga dürfen ohne vorherige schriftliche Genehmigung von jingga in keiner Weise verwendet werden, auch nicht in der Werbung oder in der Öffentlichkeitsarbeit im Zusammenhang mit der Verbreitung von Materialien auf unserer WEBSITE. jingga verbietet die Verwendung von Logos von jingga oder einer seiner Tochtergesellschaften als Teil eines Links zu oder von einer WEBSITE, es sei denn, jingga genehmigt einen solchen Link im Voraus und in Schriftform. Die faire Nutzung des geistigen Eigentums von jingga erfordert eine angemessene Anerkennung. Andere Produkt- und Firmennamen, die auf unserer Website erwähnt werden, können das geistige Eigentum ihrer jeweiligen Eigentümer sein.
## Links
Unser SERVICE kann Links zu Websites oder Diensten Dritter enthalten, die nicht im Besitz oder unter der Kontrolle der FIRMA sind.
Die FIRMA hat keine Kontrolle über und übernimmt keine Verantwortung für den Inhalt von Websites oder Diensten Dritter, die Sie besuchen.
## Beendigung
Wir können Ihren Zugang sofort und ohne Vorankündigung oder Haftung kündigen oder aussetzen, aus welchem Grund auch immer, einschließlich und ohne Einschränkung, wenn Sie diese Bedingungen verletzen.
Mit der Beendigung erlischt Ihr Recht zur Nutzung des DIENSTES oder der ANWENDUNG mit sofortiger Wirkung, es sei denn, der DIENST oder die ANWENDUNG stellt einen "Offline"-DIENST oder eine ANWENDUNG dar, einen DIENST oder eine ANWENDUNG, die keine Online-Verbindung erfordert, andere DIENSTE, die wir beendet haben, oder Dienste Dritter. Wir haben keine Kontrolle über die Ressourcen und Dienste Dritter, die für einige unserer DIENSTE und ANWENDUNGEN notwendig sein können. Änderungen durch diese Drittparteien können zur Beendigung des DIENSTES oder der ANWENDUNG oder zur Reduzierung ihrer Funktionalität führen. Sie verstehen diese Abhängigkeiten und Einschränkungen des DIENSTES und der ANWENDUNG und akzeptieren, dass die Beendigung oder reduzierte Funktionalität nicht als Grund für Streitigkeiten, Widerruf oder ähnliches verwendet werden kann.
## Haftungsbeschränkung
Ungeachtet etwaiger Schäden, die Ihnen entstehen könnten, ist die gesamte Haftung der FIRMA und ihrer Zulieferer gemäß den Bestimmungen dieser AGB und Ihr ausschließlicher Rechtsbehelf für alle vorgenannten Punkte auf den Betrag beschränkt, den Sie tatsächlich für den SERVICE bezahlt haben.
Soweit es das anwendbare Recht zulässt, haften die FIRMA oder ihre Lieferanten in keinem Fall für besondere, zufällige, indirekte oder Folgeschäden (einschließlich, aber nicht beschränkt auf Schäden aus entgangenem Gewinn, Verlust von Daten oder anderen Informationen, für Geschäftsunterbrechung, für Personenschäden, Verlust der Privatsphäre, die sich aus der Nutzung oder der Unmöglichkeit der Nutzung des SERVICE, der Software von Dritten und/oder der Hardware von Dritten, die mit dem SERVICE genutzt wird, oder in sonstiger Weise in Verbindung mit einer Bestimmung dieser AGB ergeben oder damit in Zusammenhang stehen), selbst wenn die FIRMA oder ein Lieferant auf die Möglichkeit solcher Schäden hingewiesen wurde und selbst wenn die Abhilfe ihren wesentlichen Zweck verfehlt.
In einigen Staaten oder Ländern ist der Ausschluss stillschweigender Garantien oder die Beschränkung der Haftung für beiläufig entstandene Schäden oder Folgeschäden nicht zulässig, was bedeutet, dass einige der oben genannten Beschränkungen möglicherweise nicht gelten. In diesen Staaten oder Ländern ist die Haftung jeder Partei auf den größtmöglichen gesetzlich zulässigen Umfang beschränkt.
## Haftungsausschluss
Der SERVICE wird Ihnen "WIE BESEHEN" und "WIE VERFÜGBAR" und mit allen Fehlern und Mängeln ohne jegliche Garantie zur Verfügung gestellt. Im größtmöglichen nach geltendem Recht zulässigen Umfang lehnt die FIRMA in ihrem eigenen Namen und im Namen ihrer VERBUNDENEN UNTERNEHMEN und ihrer jeweiligen Lizenzgeber und Dienstleistungsanbieter ausdrücklich alle ausdrücklichen, stillschweigenden, gesetzlichen oder sonstigen Gewährleistungen in Bezug auf den SERVICE ab, einschließlich aller stillschweigenden Gewährleistungen der Marktgängigkeit, der Eignung für einen bestimmten Zweck, des Eigentumsrechts und der Nichtverletzung von Rechten sowie der Gewährleistungen, die sich aus dem Handelsverlauf, der Leistungserbringung, den Gepflogenheiten oder der Handelspraxis ergeben können. Ohne Einschränkung des Vorstehenden übernimmt die FIRMA keine Garantie oder Verpflichtung und gibt keinerlei Zusicherungen ab, dass der SERVICE Ihren Anforderungen entspricht, die beabsichtigten Ergebnisse erzielt, mit anderer Software, Anwendungen, Systemen oder Diensten kompatibel ist oder zusammenarbeitet, ohne Unterbrechung funktioniert, Leistungs- oder Zuverlässigkeitsstandards erfüllt oder fehlerfrei ist oder dass Fehler oder Mängel korrigiert werden können oder werden.
Ohne das Vorstehende einzuschränken, geben weder die FIRMA noch einer ihrer Provider eine ausdrückliche oder stillschweigende Zusicherung oder Gewährleistung jeglicher Art: (i) hinsichtlich des Betriebs oder der Verfügbarkeit des SERVICE oder der darin enthaltenen Informationen, Inhalte und Materialien oder Produkte; (ii) dass der SERVICE ununterbrochen oder fehlerfrei funktioniert; (iii) hinsichtlich der Genauigkeit, Zuverlässigkeit oder Aktualität von Informationen oder Inhalten, die über den SERVICE zur Verfügung gestellt werden; oder (iv) dass der SERVICE, seine Server, die Inhalte oder E-Mails, die von oder im Namen der FIRMA versandt werden, frei von Viren, Skripten, trojanischen Pferden, Würmern, Malware, Zeitbomben oder anderen schädlichen Komponenten sind.
Einige Gerichtsbarkeiten lassen den Ausschluss bestimmter Arten von Garantien oder Einschränkungen der anwendbaren gesetzlichen Rechte eines Verbrauchers nicht zu, so dass einige oder alle der oben genannten Ausschlüsse und Einschränkungen möglicherweise nicht auf Sie zutreffen. In einem solchen Fall werden die in diesem Abschnitt dargelegten Ausschlüsse und Beschränkungen jedoch im größtmöglichen Umfang angewandt, der nach geltendem Recht durchsetzbar ist.
## Geltendes Recht
Die Gesetze des LANDES, unter Ausschluss der Kollisionsnormen, regeln diese Bedingungen und Ihre Nutzung des SERVICE. Ihre Nutzung der ANWENDUNG kann auch anderen lokalen, staatlichen, nationalen oder internationalen Gesetzen unterliegen.
Die Unwirksamkeit einer oder mehrerer Bestimmungen dieser Vereinbarung berührt nicht die Gültigkeit der anderen. Jede Partei dieser AGB kann in diesem Fall verlangen, dass eine neue gültige Bestimmung vereinbart wird, die den wirtschaftlichen Zweck der unwirksamen Bestimmung am besten erreicht.
## Streitbeilegung
Wenn Sie irgendwelche Bedenken oder Streitigkeiten bezüglich des Service haben, erklären Sie sich damit einverstanden, zunächst zu versuchen, die Streitigkeit informell zu lösen, indem Sie die FIRMA kontaktieren.
## Widerruf
Sie haben kein Widerrufsrecht für die DIENSTLEISTUNGEN und ANWENDUNGEN, es sei denn, in Ihrer Gerichtsbarkeit bestehen andere Widerrufsrechte. In einem solchen Fall wird der in diesem Abschnitt beschriebene Widerruf auf den niedrigsten Betrag angewandt, der nach geltendem Recht durchsetzbar ist.
## Lieferung
Die Lieferung der DIENSTLEISTUNGEN und ANWENDUNGEN erfolgt, sofern nicht anders angegeben, innerhalb von 30 Werktagen. Die Lieferung umfasst in diesem Zusammenhang nur den Zugang zu einem Download-Link, die Authentifizierung für einen Online-Dienst oder den Lizenzschlüssel per E-Mail.
## Zahlung
Die Zahlungsbedingungen sind immer Vorauszahlung, sofern nicht anders vereinbart. Zahlungen müssen per Kreditkarte erfolgen.
## Eigentumsvorbehalt
Bis zur vollständigen Bezahlung bleibt das Eigentum an den DIENSTLEISTUNGEN bei uns. Das Eigentum an den DIENSTLEISTUNGEN umfasst nur die Nutzungslizenzen und in keiner Weise das Eigentum an den Vermögenswerten, dem geistigen Eigentum und insbesondere dem Quellcode der DIENSTLEISTUNGEN. Sie haben kein Recht, Kopien unserer DIENSTLEISTUNGEN zu erstellen oder unsere DIENSTLEISTUNGEN unter keinen Umständen weiterzugeben.
## Rechtskonformität
Sie versichern und garantieren, dass (i) Sie sich nicht in einem Land befinden, das einem Embargo der US-Regierung unterliegt oder das von der US-Regierung, der deutschen Regierung oder der EU-Regierung als "Terroristen unterstützendes" Land bezeichnet wurde, und (ii) Sie nicht auf einer Liste der US-Regierung, der deutschen Regierung oder der EU-Regierung mit verbotenen oder eingeschränkten Parteien aufgeführt sind.
## Änderungen dieser Bedingungen
Wir behalten uns das Recht vor, diese Bedingungen nach unserem alleinigen Ermessen jederzeit zu ändern oder zu ersetzen. Wenn eine Änderung wesentlich ist, werden wir uns angemessen bemühen, Sie mindestens 30 Tage vor Inkrafttreten der neuen Bedingungen zu informieren. Was eine wesentliche Änderung darstellt, wird nach unserem alleinigen Ermessen festgelegt.
Indem Sie nach Inkrafttreten dieser Änderungen weiterhin auf unseren SERVICE zugreifen oder ihn nutzen, erklären Sie sich mit den überarbeiteten Bedingungen einverstanden. Wenn Sie mit den neuen Bedingungen ganz oder teilweise nicht einverstanden sind, beenden Sie bitte die Nutzung der WEBSITE und des SERVICE.
## Kontakt
Bei Fragen zu diesen Bedingungen, den Datenschutzrichtlinien oder den Praktiken von Websites oder Diensten Dritter können Sie uns unter info@jingga.app kontaktieren. Sie erkennen ferner an und erklären sich damit einverstanden, dass die FIRMA weder direkt noch indirekt für Schäden oder Verluste verantwortlich oder haftbar ist, die durch oder in Verbindung mit der Nutzung von oder dem Vertrauen auf solche Inhalte, Waren oder Dienstleistungen, die auf oder über solche Websites oder Dienste verfügbar sind, verursacht werden oder angeblich verursacht werden.
Wir empfehlen Ihnen dringend, die Geschäftsbedingungen und Datenschutzrichtlinien der von Ihnen besuchten Websites oder Dienste Dritter zu lesen.
Version 2022-08-14

View File

@ -1,102 +0,0 @@
# Terms of Service
## Definitions
For the purposes of these TERMS:
* AFFILIATED means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.
* COUNTRY refers to Germany
* COMPANY (referred to as either "the Company", "We", "Us" or "Our" in this AGREEMENT) refers to jingga, Gartenstr. 26, 61206 Woellstadt.
* DEVICE means any device that can access the Service such as a computer, a cellphone or a digital tablet.
* SERVICE refers to the Website
* TERMS or AGREEMENT mean these terms that form the entire agreement between You and the COMPANY regarding the use of the SERVICE.
* Third-party Social Media Service means any services or content (including data, information, products or services) provided by a third-party that may be displayed, included or made available by the SERVICE.
* WEBSITE refers to jingga.app
* APPLICATION refers to all downloadable or installable content which can therfore be used on an a given DEVICE.
* You means the individual accessing or using the SERVICES, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.
## Acknowledgement
These are the TERMS governing the use of this SERVICE and the agreement that operates between You and the COMPANY. These TERMS set out the rights and obligations of all users regarding the use of the SERVICE.
Your access to and use of the SERVICE and APPLICATIONS is conditioned on Your acceptance of and compliance with these TERMS. These TERMS apply to all visitors, users and others who access or use the SERVICE.
By accessing or using the SERVICE and APPLICATIONS You agree to be bound by these TERMS. If You disagree with any part of these TERMS then You may not access the SERVICE. You represent that you are at least over the age of 18 and be over the Age of Majority. The COMPANY does not permit those under 18 or the Age of Majurity to use the SERVICE.
Your access to and use of the SERVICE and APPLICATIONS is also conditioned on Your acceptance of and compliance with the Privacy Policy of the COMPANY. Our Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your personal information when You use the Application or the WEBSITE and tells You about Your privacy rights and how the law protects You. Please read Our Privacy Policy carefully before using Our SERVICE.
## Copyright
Unless otherwise noted, all materials including without limitation, logos, brand names, images, designs, photographs, videos, audio, source code and written and other materials that appear as part of our WEBSITE, SERVICES and APPLICATIONS are copyrights, trademarks, service marks, trade dress and/or other intellectual property whether registered or unregistered ("Intellectual Property") owned, controlled or licensed by jingga. Our WEBSITE as a whole is protected by copyright and trade dress. Nothing on our WEBSITE should be construed as granting, by implication, estoppel or otherwise, any license or right to use any Intellectual Property displayed or used on our WEBSITE, without the prior written permission of the Intellectual Property owner. jingga aggressively enforces its intellectual property rights to the fullest extent of the law. The names and logos of jingga, may not be used in any way, including in advertising or publicity pertaining to distribution of materials on our WEBSITE, without prior, written permission from jingga. jingga prohibits use of any logo of jingga or any of its affiliates as part of a link to or from any WEBSITE unless jingga approves such link in advance and in writing. Fair use of jingga Intellectual Property requires proper acknowledgment. Other product and company names mentioned in our Website may be the Intellectual Property of their respective owners.
## Links
Our SERVICE may contain links to third-party web sites or services that are not owned or controlled by the COMPANY.
The COMPANY has no control over, and assumes no responsibility for, the contentthird-party web sites or services that You visit.
## Termination
We may terminate or suspend Your access immediately, without prior notice or liability, for any reason whatsoever, including without limitation if You breach these TERMS.
Upon termination, Your right to use the SERVICE or APPLICATION will cease immediately unless the SERVICE or APPLICATION represents a "offline" SERVICE or APPLICATION, a SERVICE or APPLICATION which doesn't require any online connection, other SERVICES which We terminated, or third-party services. We have no contorl over thrid-party resources and services which may be necessary for some of Our SERVICES and APPLICATIONS. Changes by these third-parties may lead to the termination of the SERVICE or APPLICATION or reducing their functionality. You understand these dependencies and SERVICE and APPLICATION limitations and accept that the termination or reduced functionality cannot be used as reason for dispute, revocation or similarly.
## Limitation of Liability
Notwithstanding any damages that You might incur, the entire liability of the COMPANY and any of its suppliers under any provision of this TERMS and Your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by through the SERVICE.
To the maximum extent permitted by applicable law, in no event shall the COMPANY or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, loss of data or other information, for business interruption, for personal injury, loss of privacy arising out of or in any way related to the use of or inability to use the SERVICE, third-party software and/or third-party hardware used with the SERVICE, or otherwise in connection with any provision of this TERMS), even if the COMPANY or any supplier has been advised of the possibility of such damages and even if the remedy fails of its essential purpose.
Some states or countries do not allow the exclusion of implied warranties or limitation of liability for incidental or consequential damages, which means that some of the above limitations may not apply. In these states or countries, each party's liability will be limited to the greatest extent permitted by law.
## Disclaimer
The SERVICE is provided to You "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. To the maximum extent permitted under applicable law, the COMPANY, on its own behalf and on behalf of its AFFILIATES and its and their respective licensors and service providers, expressly disclaims all warranties, whether express, implied, statutory or otherwise, with respect to the SERVICE, including all implied warranties of merchantability, fitness for a particular purpose, title and non-infringement, and warranties that may arise out of course of dealing, course of performance, usage or trade practice. Without limitation to the foregoing, the COMPANY provides no warranty or undertaking, and makes no representation of any kind that the SERVICE will meet Your requirements, achieve any intended results, be compatible or work with any other software, applications, systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.
Without limiting the foregoing, neither the COMPANY nor any of the company's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the SERVICE, or the information, content, and materials or products included thereon; (ii) that the SERVICE will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the SERVICE; or (iv) that the SERVICE, its servers, the content, or e-mails sent from or on behalf of the COMPANY are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.
Some jurisdictions do not allow the exclusion of certain types of warranties or limitations on applicable statutory rights of a consumer, so some or all of the above exclusions and limitations may not apply to You. But in such a case the exclusions and limitations set forth in this section shall be applied to the greatest extent enforceable under applicable law.
## Governing Law
The laws of the COUNTRY, excluding its conflicts of law rules, shall govern these TERMS and Your use of the SERVICE. Your use of the APPLICATION may also be subject to other local, state, national, or international laws.
The ineffectiveness of one or more provisions of this agreement does not affect the validity of the others. Each party to these TERMS can in this case demand that a new valid provision be agreed which best achieves the economic purpose of the ineffective provision.
## Dispute Resolution
If You have any concern or dispute about the Service, You agree to first try to resolve the dispute informally by contacting the COMPANY.
## Revocation
You have no right of revocation for any SERVICES and APPLICATIONS unless different revocation rights exist in your jurisdiction. In such a case the revocation set forth in this section shall be applied to the lowest amount enforcable under applicable law.
## Delivery
The delivery of any SERVICES and APPLICATIONS unless specified differently takes place within 30 business days. Delivery in this context only includes the access to a download link, authentication to a online service, or license key via email.
## Payment
The payment terms are always prepayment unless otherwise agreed upon. Payments must be done via credit card.
## Reservation of ownership
Until the complete payment the ownership of the SERVICES and APPLICATIONS belongs to Us. Ownership of SERVICES and APPLICATIONS only include user licenses and in no way ownership for the assets, intellectual property and especially the source code of the SERVICES and APPLICATIONS. You have no right to create copies of Our SERVICES or APPLICATIONS or re-distribute our SERVICES and APPLICATIONS under any circumstance.
## Legal Compliance
You represent and warrant that (i) You are not located in a country that is subject to the United States government embargo, or that has been designated by the United States, German or EU government as a "terrorist supporting" country, and (ii) You are not listed on any United States, German or EU government list of prohibited or restricted parties.
## Changes to these Terms
We reserve the right, at Our sole discretion, to modify or replace these TERMS at any time. If a revision is material We will make reasonable efforts to provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at Our sole discretion.
By continuing to access or use Our SERVICE after those revisions become effective, You agree to be bound by the revised terms. If You do not agree to the new terms, in whole or in part, please stop using the WEBSITE and the SERVICE.
## Contact
For questions regarding these TERMS, privacy policies, or practices of any third party websites or services please feel free to contact us at info@jingga.app. You further acknowledge and agree that the COMPANY shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with the use of or reliance on any such content, goods or services available on or through any such websites or services.
We strongly advise You to read the terms and conditions and privacy policies of any third-party web sites or services that You visit.
Version 2022-08-14

View File

@ -1,55 +0,0 @@
html, body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, textarea, p, blockquote, th, td, nav, section, iframe, label {
margin: 0;
padding: 0;
}
a, img, button {
outline: none;
}
a {
color: inherit;
text-decoration: none;
}
h1, h2, h3, h4, h5, h6 {
font-weight: 300;
}
ul {
list-style: none;
}
th {
font-weight: 300;
}
input, select, textarea, .textarea, button {
box-sizing: border-box;
box-shadow: none;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border-radius: 0;
}
input:focus, select:focus, textarea:focus, .textarea:focus, button:focus {
outline: none;
}
input[type=checkbox] {
margin-right: 5px;
}
button::-moz-focus-inner {
border: 0;
}
table {
border-collapse: separate;
border-spacing: 0;
}
i {
font-style: normal;
}

View File

@ -1,146 +0,0 @@
html, body {
padding: 0;
margin: 0;
height: 100%;
max-height: 100%;
font-weight: 100;
font-family: 'Roboto', sans-serif;
}
body {
background: #fff;
display: flex;
flex-direction: column;
}
header, footer {
background-size: 100% 100%;
background-repeat: no-repeat;
min-height: 20rem;
display: flex;
color: #fff;
}
header {
align-items: flex-start;
background-image: url(Applications/Frontend/img/top.svg);
}
header .floater, footer .floater {
display: flex;
flex-direction: row;
align-items: center;
}
#toplogo {
flex: 1;
display: flex;
align-items: center;
}
#toplogo span {
font-size: 1.5rem;
margin-left: 1rem;
font-weight: 400;
}
footer {
align-items: flex-end;
background-image: url(Applications/Frontend/img/bottom.svg);
padding-bottom: 1rem;
}
footer .floater {
align-items: flex-start;
}
#copyright {
flex: 1;
}
main {
flex: 1;
}
nav {
font-size: 0.8em;
display: flex;
flex-direction: row;
user-select: none;
padding: 2rem;
}
nav li {
display: inline-block;
font-weight: 400;
}
#topnav {
margin-right: .5rem;
}
#topnav a, #toplogin a {
border: 2px solid rgba(255, 255, 255, 0);
border-radius: 3rem;
padding: .5rem 1rem .5rem 1rem;
}
#topnav a:hover, #signinButton:hover {
border: 2px solid rgba(255, 255, 255, 0.25);
}
#toplogin {
border-left: 1px solid rgba(255, 255, 255, 0.25);
padding-left: .5rem;
}
#signupButton {
background: rgba(255, 255, 255, 0.25);
}
#signupButton:hover {
border: 2px solid rgba(255, 255, 255, 0);
background: rgba(255, 255, 255, 0.3);
}
.floater {
width: 95%;
max-width: 900px;
margin: 0 auto;
}
.portlet {
background: #fff;
border-radius: 1rem;
}
.portlet-head {
color: #000;
font-weight: 400;
}
.portlet-body {
color: rgba(0, 0, 0, 0.5);
}
@media only screen and (max-width: 650px) {
#toplogo {
display: none;
}
nav {
flex-direction: column;
padding: 1rem 0 0 0;
}
#toplogin {
margin-top: 2rem;
border: none;
padding: 0;
}
header, footer {
min-height: 12rem;
background-size: cover;
}
}

View File

@ -1,3 +0,0 @@
:root {
--main-bg-color: brown;
}

View File

@ -1,274 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="508mm"
height="136.89267mm"
viewBox="0 0 508 136.89267"
version="1.1"
id="svg3288"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="bottom.svg"
preserveAspectRatio="none">
<defs
id="defs3282">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3239">
<path
sodipodi:nodetypes="ccsccc"
inkscape:connector-curvature="0"
id="path3241"
d="M 508,285.75 V 169.32252 c 0,0 -18.53356,-26.95356 -74.66941,-18.99549 C 377.12367,158.29517 1.0012708e-5,213.65292 1.0012708e-5,213.65292 L 1.2708563e-8,285.75 Z"
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1402-6"
id="linearGradient1422"
gradientUnits="userSpaceOnUse"
x1="207.9357"
y1="6.231005e-09"
x2="244.47226"
y2="151.04616" />
<linearGradient
inkscape:collect="always"
id="linearGradient1402-6">
<stop
style="stop-color:#1c3081;stop-opacity:1"
offset="0"
id="stop1454" />
<stop
style="stop-color:#7a2caa;stop-opacity:1"
offset="1"
id="stop1456" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1506"
id="radialGradient1500"
cx="253.99998"
cy="142.87502"
fx="253.99998"
fy="142.87502"
r="254"
gradientTransform="matrix(1.0925975,2.1601218e-8,-1.6571401e-8,0.83818749,-23.519771,23.118955)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient1506"
inkscape:collect="always">
<stop
id="stop1502"
offset="0"
style="stop-color:#3996ff;stop-opacity:0.89705884" />
<stop
id="stop1504"
offset="1"
style="stop-color:#7a2caa;stop-opacity:0" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="1008.5714"
inkscape:cy="584.40909"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1061"
inkscape:window-x="1920"
inkscape:window-y="1080"
inkscape:window-maximized="1" />
<metadata
id="metadata3285">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(161.77381,-166.56557)">
<g
transform="translate(-161.77381,17.708239)"
id="g3237"
clip-path="url(#clipPath3239)">
<rect
y="6.2309931e-09"
x="-2.5560073e-08"
height="285.75"
width="508"
id="rect1396"
style="fill:url(#linearGradient1422);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g2508">
<rect
y="5.7251614e-06"
x="-1.1444092e-05"
height="285.75"
width="508"
id="rect1494"
style="fill:url(#radialGradient1500);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g2487"
transform="translate(-36.558265,-12.854607)">
<rect
ry="14.541889"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="-66.653755"
x="-37.255283"
height="268.14758"
width="48.917919"
id="rect1513"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="93.633575"
x="-77.095451"
height="280.83319"
width="29.083778"
id="rect1513-7"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="28.764849"
x="-235.79486"
height="280.83319"
width="29.083778"
id="rect1513-9"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="237.31682"
x="-278.81018"
height="280.83319"
width="29.083778"
id="rect1513-3"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="190.08469"
x="-413.18396"
height="280.83319"
width="29.083778"
id="rect1513-06"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="156.41028"
x="90.303535"
height="280.83319"
width="29.083778"
id="rect1513-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="43.717068"
transform="rotate(-30)"
y="147.34708"
x="264.26831"
height="230.38632"
width="104.23512"
id="rect1572"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="rotate(-30)"
y="22.777628"
x="132.64613"
height="257.36731"
width="82.239799"
id="rect1574"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="28.559462"
transform="rotate(-30)"
y="220.71979"
x="-65.513947"
height="243.96391"
width="97.161247"
id="rect1576"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="32.495167"
transform="matrix(0.86562457,-0.50069363,0.49930672,0.8664253,0,0)"
y="203.64694"
x="91.800362"
height="229.15842"
width="84.760918"
id="rect1578"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="-117.52531"
x="-64.990334"
height="235.05061"
width="64.990334"
id="rect1578-8"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="145.60141"
x="-53.941257"
height="235.05061"
width="64.990334"
id="rect1578-7"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="rotate(-30)"
y="346.85233"
x="195.87666"
height="230.38632"
width="104.23513"
id="rect1572-9"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="14.541889"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="-46.783016"
x="-91.637344"
height="280.83319"
width="29.083778"
id="rect1513-7-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="340.11569"
x="-351.25281"
height="280.83319"
width="29.083778"
id="rect1513-3-0"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="32.024158"
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="-60.247566"
x="101.23595"
height="238.82486"
width="64.048317"
id="rect1578-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

View File

@ -1,275 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="508mm"
height="136.89267mm"
viewBox="0 0 508 136.89267"
version="1.1"
id="svg2582"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="top.svg"
preserveAspectRatio="none">
<defs
id="defs2576">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2533">
<path
style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 3.2628054e-8,0 v 116.42748 c 0,0 18.533568967371945,26.95356 74.669403967371948,18.99549 C 130.87633,127.45483 508,72.097077 508,72.097077 V 0 Z"
id="path2535"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccc"
clip-path="none" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1402-6"
id="linearGradient1422"
gradientUnits="userSpaceOnUse"
x1="207.9357"
y1="6.231005e-09"
x2="244.47226"
y2="151.04616" />
<linearGradient
inkscape:collect="always"
id="linearGradient1402-6">
<stop
style="stop-color:#1c3081;stop-opacity:1"
offset="0"
id="stop1454" />
<stop
style="stop-color:#7a2caa;stop-opacity:1"
offset="1"
id="stop1456" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1506"
id="radialGradient1500"
cx="253.99998"
cy="142.87502"
fx="253.99998"
fy="142.87502"
r="254"
gradientTransform="matrix(1.0925975,2.1601218e-8,-1.6571401e-8,0.83818749,-23.519771,23.118955)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient1506"
inkscape:collect="always">
<stop
id="stop1502"
offset="0"
style="stop-color:#3996ff;stop-opacity:0.89705884" />
<stop
id="stop1504"
offset="1"
style="stop-color:#7a2caa;stop-opacity:0" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="897.14287"
inkscape:cy="10.123372"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1061"
inkscape:window-x="1920"
inkscape:window-y="1080"
inkscape:window-maximized="1" />
<metadata
id="metadata2579">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(132.29167,-14.619143)">
<g
id="g2531"
clip-path="url(#clipPath2533)"
transform="translate(-132.29167,14.619143)">
<rect
y="6.2309931e-09"
x="-2.5560073e-08"
height="285.75"
width="508"
id="rect1396"
style="fill:url(#linearGradient1422);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g2508">
<rect
y="5.7251614e-06"
x="-1.1444092e-05"
height="285.75"
width="508"
id="rect1494"
style="fill:url(#radialGradient1500);fill-opacity:1;stroke:none;stroke-width:0.39700001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
id="g2487"
transform="translate(-36.558265,-12.854607)">
<rect
ry="14.541889"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="-66.653755"
x="-37.255283"
height="268.14758"
width="48.917919"
id="rect1513"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="93.633575"
x="-77.095451"
height="280.83319"
width="29.083778"
id="rect1513-7"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="28.764849"
x="-235.79486"
height="280.83319"
width="29.083778"
id="rect1513-9"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="237.31682"
x="-278.81018"
height="280.83319"
width="29.083778"
id="rect1513-3"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="190.08469"
x="-413.18396"
height="280.83319"
width="29.083778"
id="rect1513-06"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="156.41028"
x="90.303535"
height="280.83319"
width="29.083778"
id="rect1513-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="43.717068"
transform="rotate(-30)"
y="147.34708"
x="264.26831"
height="230.38632"
width="104.23512"
id="rect1572"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="rotate(-30)"
y="22.777628"
x="132.64613"
height="257.36731"
width="82.239799"
id="rect1574"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="28.559462"
transform="rotate(-30)"
y="220.71979"
x="-65.513947"
height="243.96391"
width="97.161247"
id="rect1576"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="32.495167"
transform="matrix(0.86562457,-0.50069363,0.49930672,0.8664253,0,0)"
y="203.64694"
x="91.800362"
height="229.15842"
width="84.760918"
id="rect1578"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="-117.52531"
x="-64.990334"
height="235.05061"
width="64.990334"
id="rect1578-8"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="145.60141"
x="-53.941257"
height="235.05061"
width="64.990334"
id="rect1578-7"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="rotate(-30)"
y="346.85233"
x="195.87666"
height="230.38632"
width="104.23513"
id="rect1572-9"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="14.541889"
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="-46.783016"
x="-91.637344"
height="280.83319"
width="29.083778"
id="rect1513-7-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="matrix(-0.8660254,0.5,0.5,0.8660254,0,0)"
y="340.11569"
x="-351.25281"
height="280.83319"
width="29.083778"
id="rect1513-3-0"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39699998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
ry="32.024158"
transform="matrix(0.86562456,-0.50069364,0.49930672,0.8664253,0,0)"
y="-60.247566"
x="101.23595"
height="238.82486"
width="64.048317"
id="rect1578-2"
style="fill:#ffffff;fill-opacity:0.01960784;stroke:none;stroke-width:0.39700025;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,67 +0,0 @@
<?php
/**
* Karaka
*
* PHP Version 8.1
*
* @package Applications\Frontend
* @copyright Dennis Eichhorn
* @license OMS License 1.0
* @version 1.0.0
* @link https://karaka.app
*/
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
/** @var phpOMS\Model\Html\Head $head */
$head = $this->getData('head');
/** @var array $dispatch */
$dispatch = $this->getData('dispatch') ?? [];
?>
<!DOCTYPE HTML>
<html lang="<?= $this->printHtml($this->response->getLanguage()); ?>">
<head>
<meta charset="utf-8">
<base href="<?= UriFactory::build('{/base}'); ?>/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#343a40">
<meta name="msapplication-navbutton-color" content="#343a40">
<meta name="apple-mobile-web-app-status-bar-style" content="#343a40">
<meta name="description" content="<?= $this->getHtml(':meta', '0', '0'); ?>">
<?= $head->meta->render(); ?>
<base href="<?= UriFactory::build('{/base}'); ?>/">
<link rel="shortcut icon" href="<?= UriFactory::build('Applications/Frontend/img/favicon.ico?v=1.0.0'); ?>" type="image/x-icon">
<title><?= $this->printHtml($head->title); ?></title>
<?= $head->renderAssets(); ?>
<style><?= $head->renderStyle(); ?></style>
<script><?= $head->renderScript(); ?></script>
</head>
<body>
<?php include __DIR__ . '/tpl/header.tpl.php'; ?>
<main>
<div class="floater">
<div id="content" class="container-fluid" role="main">
<?php
$c = 0;
foreach ($dispatch as $view) {
if (!($view instanceof \phpOMS\Views\NullView)
&& $view instanceof \phpOMS\Contract\RenderableInterface
) {
++$c;
echo $view->render();
}
}
?>
</div>
</div>
</main>
<?php include __DIR__ . '/tpl/footer.tpl.php'; ?>
<?= $head->renderAssetsLate(); ?>

View File

@ -1,14 +0,0 @@
<?php
declare(strict_types=1);
return [[
'Home' => 'Home',
'Features' => 'Features',
'Pricing' => 'Pricing',
'SignIn' => 'Sign In',
'SignUp' => 'Sign Up',
'Terms' => 'Terms',
'Privacy' => 'Privacy',
'Imprint' => 'Imprint',
'Contact' => 'Contact',
]];

View File

@ -1,3 +0,0 @@
<article>
<?= $this->getData('text'); ?>
</article>

View File

@ -1,17 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
?>
<footer>
<div class="floater">
<div id="copyright">(c) Dennis Eichhorn</div>
<ul id="bottomnav">
<li><a href="<?= UriFactory::build('{/lang}/terms'); ?>"><?= $this->getHtml('Terms', '0', '0'); ?></a></li>
<li><a href="<?= UriFactory::build('{/lang}/privacy'); ?>"><?= $this->getHtml('Privacy', '0', '0'); ?></a></li>
<li><a href="<?= UriFactory::build('{/lang}/imprint'); ?>"><?= $this->getHtml('Imprint', '0', '0'); ?></a></li>
<li><a href="<?= UriFactory::build('{/lang}/contact'); ?>"><?= $this->getHtml('Contact', '0', '0'); ?></a></li>
</ul>
</div>
</footer>

View File

@ -1 +0,0 @@
Frontss

View File

@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
?>
<header>
<div class="floater">
<a id="toplogo" href="<?= UriFactory::build('{/lang}'); ?>">
<img alt="Logo" src="Applications/Frontend/img/logo.png" width="40px">
<span>Jingga</span>
</a>
<?php include __DIR__ . '/nav.tpl.php'; ?>
</div>
</header>

View File

@ -1,17 +0,0 @@
<?php
declare(strict_types=1);
use phpOMS\Uri\UriFactory;
?>
<nav>
<ul id="topnav">
<li><a href="<?= UriFactory::build('{/lang}'); ?>"><?= $this->getHtml('Home', '0', '0'); ?></a></li>
<li><a href="<?= UriFactory::build('{/lang}/features'); ?>"><?= $this->getHtml('Features', '0', '0'); ?></a></li>
<li><a href="<?= UriFactory::build('{/lang}/pricing'); ?>"><?= $this->getHtml('Pricing', '0', '0'); ?></a></li>
</ul>
<ul id="toplogin">
<li><a id="signinButton" target="_blank" href="<?= UriFactory::build('{/lang}/backend'); ?>"><?= $this->getHtml('SignIn', '0', '0'); ?></a></li>
<li><a id="signupButton" href="<?= UriFactory::build('{/lang}/signup'); ?>"><?= $this->getHtml('SignUp', '0', '0'); ?></a></li>
</ul>
</nav>

Some files were not shown because too many files have changed in this diff Show More