diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 25248d1..bdf3062 100755
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -131,6 +131,96 @@ jobs:
env:
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
run: "bash <(curl -s https://codecov.io/bash) -f tests/coverage.xml"
+ static-tests:
+ runs-on: ubuntu-latest
+ if: "!contains(github.event.head_commit.message, 'NO_CI')"
+ strategy:
+ fail-fast: false
+ max-parallel: 3
+ matrix:
+ php-versions: ['8.0']
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@master
+ with:
+ fetch-depth: 1
+ submodules: recursive
+ token: ${{ secrets.GITHUB }}
+ - name: Checkout Build Repository
+ uses: actions/checkout@master
+ with:
+ fetch-depth: 1
+ ref: develop
+ repository: Karaka/Build
+ path: Build
+ - name: Setup PHP, with composer and extensions
+ uses: shivammathur/setup-php@master
+ with:
+ php-version: ${{ matrix.php-versions }}
+ extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached
+ ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1
+ - name: Get Composer Cache Directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+ - name: Cache dependencies
+ uses: actions/cache@v1
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+ restore-keys: ${{ runner.os }}-composer-
+ - name: Setup Composer
+ run: composer install
+ - name: phpstan
+ run: vendor/bin/phpstan analyse -a phpOMS/Autoloader.php --no-progress -l 9 -c Build/Config/phpstan.neon ./
+ codestyle-tests:
+ runs-on: ubuntu-latest
+ if: "!contains(github.event.head_commit.message, 'NO_CI')"
+ strategy:
+ fail-fast: false
+ max-parallel: 3
+ matrix:
+ php-versions: ['8.0']
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@master
+ with:
+ fetch-depth: 1
+ submodules: recursive
+ token: ${{ secrets.GITHUB }}
+ - name: Checkout Build Repository
+ uses: actions/checkout@master
+ with:
+ fetch-depth: 1
+ ref: develop
+ repository: Karaka/Build
+ path: Build
+ - name: Setup PHP, with composer and extensions
+ uses: shivammathur/setup-php@master
+ with:
+ php-version: ${{ matrix.php-versions }}
+ extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached
+ ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1
+ - name: Get Composer Cache Directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+ - name: Cache dependencies
+ uses: actions/cache@v1
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+ restore-keys: ${{ runner.os }}-composer-
+ - name: Setup Composer
+ run: composer install
+ - name: phpcs
+ run: vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report=full
+ - name: Install NPM
+ uses: actions/setup-node@v3
+ with:
+ node-version: '14'
+ cache: 'npm'
+ - run: npm install
+ - name: eslint
+ run: npx eslint ./ -c Build/Config/.eslintrc.json
custom:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, 'NO_CI')"
@@ -165,6 +255,11 @@ jobs:
run: |
if [[ $(find ./ -name "*tpl.php" | xargs grep -E '=\"[\#\$\%\^\&\*\(\)\\/\ ]*\"') -ne "" ]]; then exit 1; fi
if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\
)') -ne "" ]]; then exit 1; fi
+ if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi
+ if [[ $(find ./ -name "*tpl.php" | xargs grep -P '()') -ne "" ]]; then exit 1; fi
+ if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(style=)') -ne "" ]]; then exit 1; fi
+ if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(value|title|alt|aria\-label)(=\")((?!\<\?).)*(>)') -ne "" ]]; then exit 1; fi
+ if [[ $(find ./ -name "*tpl.php" | xargs grep -P '(\
|\ | |\|\)) -ne "" ]]; then exit 1; fi
- name: Js strict
run: if [[ $(grep -r -L "\"use strict\";" --include=*.js ./) -ne "" ]]; then exit 1; fi
- name: Js inspection
diff --git a/Controller.js b/Controller.js
deleted file mode 100755
index 2ec657a..0000000
--- a/Controller.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import { Autoloader } from '../../jsOMS/Autoloader.js';
-import { Application } from '../../Web/Backend/js/backend.js';
-import { Navigation } from './Models/Navigation.js';
-
-Autoloader.defineNamespace('jsOMS.Modules');
-
-/**
- * Navigation controller.
- *
- * @copyright Dennis Eichhorn
- * @license OMS License 1.0
- * @version 1.0.0
- * @since 1.0.0
- */
-jsOMS.Modules.Navigation = class {
- /**
- * Constructor
- *
- * @since 1.0.0
- */
- constructor() {
- this.navigation = {};
- /** global: jsOMS */
- /** global: localStorage */
- this.rawNavData = JSON.parse(window.localStorage.getItem(Navigation.MODULE_NAME));
- this.rawNavData = this.rawNavData !== null ? this.rawNavData : {};
- };
-
- /**
- * Bind navigation
- *
- * @param {string} id Navigation to bind (optional)
- *
- * @return {void}
- *
- * @since 1.0.0
- */
- bind (id) {
- const e = typeof id === 'undefined' ? document.getElementsByClassName('nav') : [document.getElementById(id)];
- const length = e.length;
-
- for (let i = 0; i < length; ++i) {
- if (e[i] === null) {
- continue;
- }
-
- this.bindElement(e[i]);
- }
- };
-
- /**
- * Bind navigation element
- *
- * @param {Element} e Element to bind
- *
- * @return {void}
- *
- * @since 1.0.0
- */
- bindElement (e) {
- const extend = e.querySelectorAll('li label');
- const self = this;
-
- this.navigation[e.id] = new Navigation(this.rawNavData[e.id]);
-
- // On load
- const open = this.navigation[e.id].getOpen();
- let ele = null;
-
- for (let key in open) {
- if (open.hasOwnProperty(key) && (ele = document.getElementById(key)) !== null) {
- ele.checked = open[key];
- }
- }
-
- if (!this.navigation[e.id].isVisible()) {
- let width = window.innerWidth
- || document.documentElement.clientWidth
- || document.body.clientWidth;
-
- /**
- * @todo Navigation sidebar width
- * The sidebar navigation is not working properly if the content is too wide then the side nav becomes smaller (resize window for testing)
- */
- e.nextElementSibling.checked = width < 800;
- }
-
- e.scrollTop = this.navigation[e.id].getScrollPosition().y;
- e.scrollLeft = this.navigation[e.id].getScrollPosition().x;
-
- // Bind minimize/maximize
- jsOMS.addEventListenerToAll(extend, 'click', function () {
- let box = document.getElementById(this.getAttribute('for'));
-
- if (!box.checked) {
- self.navigation[e.id].setOpen(box.id);
- } else {
- self.navigation[e.id].setClose(box.id);
- }
-
- localStorage.setItem(Navigation.MODULE_NAME, JSON.stringify(self.navigation));
- });
-
- // Bind show/hide
- e.addEventListener('change', function () {
- self.navigation[e.id].setVisible(this.checked);
- localStorage.setItem(Navigation.MODULE_NAME, JSON.stringify(self.navigation));
- });
-
- // Bind scroll
- e.addEventListener('scroll', function () {
- self.navigation[e.id].setScrollPosition(this.scrollLeft, this.scrollTop);
- localStorage.setItem(Navigation.MODULE_NAME, JSON.stringify(self.navigation));
- });
- };
-};
-
-/**
- * Module id
- *
- * @var {string}
- * @since 1.0.0
- */
-Navigation.MODULE_NAME = '1000500001';
-
-window.omsApp.moduleManager.get('Navigation').bind('nav-side-outer');
\ No newline at end of file
diff --git a/Models/Navigation.js b/Models/Navigation.js
deleted file mode 100755
index fc462f9..0000000
--- a/Models/Navigation.js
+++ /dev/null
@@ -1,131 +0,0 @@
-export class Navigation {
- /**
- * Construct
- *
- * @param {Object} data Initialization (optional)
- *
- * @since 1.0.0
- */
- constructor (data)
- {
- if (typeof data === 'undefined') {
- this.scrollPosition = {x: 0, y: 0};
- this.activeLinks = {};
- this.visible = true;
- this.openCategories = {};
- } else {
- this.scrollPosition = typeof data.scrollPosition === 'undefined' ? {x : 0, y : 0} : data.scrollPosition;
- this.activeLinks = typeof data.activeLinks === 'undefined' ? {} : data.activeLinks;
- this.visible = typeof data.visible === 'undefined' ? true : data.visible;
- this.openCategories = typeof data.openCategories === 'undefined' ? {} : data.openCategories;
- }
- };
-
- /**
- * Set scroll position
- *
- * @param {int} x Horizontal position
- * @param {int} y Vertical position
- *
- * @return {void}
- *
- * @since 1.0.0
- */
- setScrollPosition (x, y)
- {
- this.scrollPosition.x = x;
- this.scrollPosition.y = y;
- };
-
- /**
- * Get scroll position
- *
- * @return {Object}
- *
- * @since 1.0.0
- */
- getScrollPosition ()
- {
- return this.scrollPosition;
- };
-
- /**
- * Open navigation category
- *
- * @param {string} id Category id
- *
- * @return {void}
- *
- * @since 1.0.0
- */
- setOpen (id)
- {
- this.openCategories[id] = true;
- };
-
- /**
- * Close navigation category
- *
- * @param {string} id Category id
- *
- * @return {void}
- *
- * @since 1.0.0
- */
- setClose (id)
- {
- delete this.openCategories[id];
- };
-
- /**
- * Get open navigation elements
- *
- * @return {Object}
- *
- * @since 1.0.0
- */
- getOpen ()
- {
- return this.openCategories;
- };
-
- active (id)
- {
- this.allInactive();
- };
-
- allInactive ()
- {
-
- };
-
- inactive (id)
- {
- };
-
- /**
- * Set navigation visibility
- *
- * @param {bool} visible Visibility
- *
- * @return {bool}
- *
- * @since 1.0.0
- */
- setVisible (visible)
- {
- this.visible = visible;
- };
-
- /**
- * Is navigation visible
- *
- * @return {bool}
- *
- * @since 1.0.0
- */
- isVisible ()
- {
- return this.visible;
- };
-};
diff --git a/Theme/Backend/side.tpl.php b/Theme/Backend/side.tpl.php
index 9dfd736..d33f318 100755
--- a/Theme/Backend/side.tpl.php
+++ b/Theme/Backend/side.tpl.php
@@ -19,12 +19,12 @@ use \Modules\Navigation\Models\NavigationType;
* @var \Modules\Navigation\Views\NavigationView $this
*/
if (isset($this->nav[NavigationType::SIDE])) : ?>
- |