From 333a91b7f96579e4e6698f58e477956a59f8fc2f Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 5 Mar 2022 17:01:22 +0100 Subject: [PATCH 01/15] fix optional tools/extensions text --- general/setup.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/general/setup.md b/general/setup.md index 975d4ab..b4dcc8d 100755 --- a/general/setup.md +++ b/general/setup.md @@ -11,10 +11,11 @@ Make sure your dev-environment or server fulfills the following requirements: * databases: mysql/postgresql/sqlsrv * web server: apache2/nginx * mod_headers (apache2) +* software: tesseract\*, pdftotext\*, pdftoppm\* The application and frameworks can use different databases. For the normal development process you only need one (whichever you prefer). However, in order to test against all supported databases and all code paths you would have to install all above mentioned databases. -Extensions marked with `*` are optional but recommended. They are only required in special situations. Requirements with a `/` in between mean that only one of the dependencies is necessary depending on your preferences and previous decisions. +Extensions and software marked with `*` are optional but recommended. They are only required in special situations. Requirements with a `/` in between mean that only one of the dependencies is necessary depending on your preferences and previous decisions. Steps which are not explained in this documentation are how to install and setup the above mentioned software and extensions. You also should configure the web server paths accordingly in order to access the application in the browser. @@ -129,3 +130,10 @@ php -dxdebug.profiler_enable=1 -dxdebug.mode=develop,debug,profile -dxdebug.outp ``` > This may use a lot of resources and storage space (≈15 GB of cachegrind data w/o trace data and ≈120 GB w/ trace data) + +## cOMS + +### OpenCV + +https://docs.opencv.org/3.4/d7/d9f/tutorial_linux_install.html + From 7154482850ffc49ec5e91a16e214293abd23dade Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 22 Mar 2022 18:15:09 +0100 Subject: [PATCH 02/15] fix deprecation --- basics/responses.md | 1 - basics/views.md | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/basics/responses.md b/basics/responses.md index 1a80d67..7f15522 100755 --- a/basics/responses.md +++ b/basics/responses.md @@ -16,7 +16,6 @@ The `{stringifiable_element}` accepts all supported types from the `StringUtils: * \JsonSerializable * array -* \Serializable * string * int * float diff --git a/basics/views.md b/basics/views.md index ddfeed1..07f854c 100755 --- a/basics/views.md +++ b/basics/views.md @@ -4,9 +4,9 @@ Views contain the raw information of a result which then depending on the templa ## Implementation -A view must implement `\Serializable` and `\JsonSerializable`. +A view must implement `__serialize/__unserialize` and `\JsonSerializable`. -In case the response header is set to JSON the view will automatically get parsed as JSON object, either by using a the JSON template or by encoding the view. For the JSON serialization the `jsonSerialize()` function will be used in all other cases the `serialize()` function will be used. +In case the response header is set to JSON the view will automatically get parsed as JSON object, either by using a the JSON template or by encoding the view. For the JSON serialization the `jsonSerialize()` function will be used in all other cases the `__serialize()` function will be used. ## Localization From 124f53b9d7470612e19a74dd18569cf3fbc643af Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 26 Mar 2022 14:59:28 +0100 Subject: [PATCH 03/15] undo serialize fiasco --- basics/views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basics/views.md b/basics/views.md index 07f854c..3094662 100755 --- a/basics/views.md +++ b/basics/views.md @@ -6,7 +6,7 @@ Views contain the raw information of a result which then depending on the templa A view must implement `__serialize/__unserialize` and `\JsonSerializable`. -In case the response header is set to JSON the view will automatically get parsed as JSON object, either by using a the JSON template or by encoding the view. For the JSON serialization the `jsonSerialize()` function will be used in all other cases the `__serialize()` function will be used. +In case the response header is set to JSON the view will automatically get parsed as JSON object, either by using a the JSON template or by encoding the view. For the JSON serialization the `jsonSerialize()` function will be used in all other cases the `serialize()` function will be used. ## Localization From f837e067c86451c98b434ca6ad453c7b84bfd12b Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 1 Apr 2022 18:29:50 +0200 Subject: [PATCH 04/15] document js drafting --- SUMMARY.md | 3 +- frontend/elements/dragndrop/dragndrop.md | 29 +++++++++++ frontend/elements/dragndrop/dragndrop.png | Bin 0 -> 41802 bytes frontend/forms/forms.md | 60 ++++++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 frontend/elements/dragndrop/dragndrop.md create mode 100644 frontend/elements/dragndrop/dragndrop.png create mode 100644 frontend/forms/forms.md diff --git a/SUMMARY.md b/SUMMARY.md index b8c33cd..3d23fe4 100755 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -76,9 +76,10 @@ * [Breadcrumbs]({%}?page=frontend/elements/breadcrumbs/breadcrumbs) * [Progress]({%}?page=frontend/elements/progress/progress) * [Layout]({%}?page=frontend/grid/grid) +* [Drag & Drop]({%}?page=frontend/elements/dragndrop/dragndrop) * [Charting]({%}?page=services/charting) ### Forms -* [Forms]({%}?page=frontend/elements/forms/forms) +* [Forms]({%}?page=frontend/forms/forms) * [Inputs]({%}?page=frontend/elements/inputs/inputs) * [Tables]({%}?page=frontend/elements/tables/tables) diff --git a/frontend/elements/dragndrop/dragndrop.md b/frontend/elements/dragndrop/dragndrop.md new file mode 100644 index 0000000..a261c8f --- /dev/null +++ b/frontend/elements/dragndrop/dragndrop.md @@ -0,0 +1,29 @@ +# Drag & Drop + +Elements can be made drag and droppable which can be helpful to allow users to re-order and re-position elements in a list, table or customize the user interface. + +## Container + +In order to make elements drag and droppable you must define a container which contains all the drag and droppable elements. + +```html +
+
+``` + +## Draggable elements + +Elements which should be draggable in the container must be marked with `draggable="true"`. + +```html +
+
1
+
2
+
3
+
4
+
+``` + +> If new draggable elements are dynamically added to the container they automatically get recognized, no additional event binding is necessary. + +![Button normal](Developer-Guide/frontend/elements/dragndrop/dragndrop.png) \ No newline at end of file diff --git a/frontend/elements/dragndrop/dragndrop.png b/frontend/elements/dragndrop/dragndrop.png new file mode 100644 index 0000000000000000000000000000000000000000..13451ef93e1a27c1f8eb9cb37137225db2096d8a GIT binary patch literal 41802 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 Date: Mon, 4 Apr 2022 19:13:18 +0200 Subject: [PATCH 05/15] fix img. minification action --- .github/workflows/image.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index d2fb2d4..8900845 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -19,6 +19,6 @@ jobs: uses: actions/checkout@master - name: Compress Images - uses: calibreapp/image-actions@master + uses: calibreapp/image-actions@main with: githubToken: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 1fa9236e20ce50d0922d76d1f605d2804910578e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 7 Apr 2022 17:29:23 +0200 Subject: [PATCH 06/15] Update setup.md --- general/setup.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/general/setup.md b/general/setup.md index b4dcc8d..96d1e1e 100755 --- a/general/setup.md +++ b/general/setup.md @@ -8,10 +8,11 @@ Make sure your dev-environment or server fulfills the following requirements: * PHP >= 8.0 * PHP extensions: mbstring, gd, zip, dom, pdo, pdo-mysql/pdo-pgsql/pdo-sqlsrv, sqlite, bcmath, imap\*, redis\*, memcached\*, ftp\*, socket\*, curl\*, xml\* + * Extension list: `php8.0 php8.0-dev php8.0-cli php8.0-common php8.0-mysql php8.0-pgsql php8.0-xdebug php8.0-opcache php8.0-pdo php8.0-sqlite php8.0-mbstring php8.0-curl php8.0-imap php8.0-bcmath php8.0-zip php8.0-dom php8.0-xml php8.0-phar php8.0-gd php-pear` * databases: mysql/postgresql/sqlsrv * web server: apache2/nginx * mod_headers (apache2) -* software: tesseract\*, pdftotext\*, pdftoppm\* +* software: tesseract-ocr\*, pdftotext\*, pdftoppm\* The application and frameworks can use different databases. For the normal development process you only need one (whichever you prefer). However, in order to test against all supported databases and all code paths you would have to install all above mentioned databases. From 081d0efba12d2dff5039795b67d49b7c392cab44 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 7 Apr 2022 17:34:17 +0200 Subject: [PATCH 07/15] Update setup.md --- general/setup.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/general/setup.md b/general/setup.md index 96d1e1e..91ad135 100755 --- a/general/setup.md +++ b/general/setup.md @@ -76,28 +76,6 @@ After the installation you'll have access to the following content: During this process the database automatically gets dropped (if it exists) and re-created. If you don't have `xdebug` installed but `phpdbg` you can replace `php phpunit ...` with `phpdbg -qrr phpunit.phar ...` or use `pcov` for much faster code coverage generation. -## Git Hooks (Linux only) - -The git hooks perform various checks and validations during the `commit` and warn the developer about invalid code or code style/guideline violations. - -For developers it is recommended to copy the contents of the `default.sh` file in the `Build` repository under `Hooks` to your `pre-commit` file in the `.git/hooks` directory. If the `pre-commit` file doesn't exist just create it. - -The same should be done with every module. Simply go to `.git/modules/**/hooks` and also add the content of the `default.sh` file to all `pre-commit` files. - -By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` have `+x` permissions. - -## Tools - -The following tools are important to test the application and to ensure the code quality. The configurations and sample shell executions can be found in the `Build` directory. These tools are also downloaded during the setup process of the `buildProject.sh` script. - -* composer -* phploc -* phpunit -* phpcs -* phpmetrics -* documentor -* phpstan - ## Option 3: Demo Application This will only setup the application including some dummy data and also perform the code tests but no quality checks. Compared to option 2 this includes much more test data and it doesn't execute a unit test. @@ -132,6 +110,28 @@ php -dxdebug.profiler_enable=1 -dxdebug.mode=develop,debug,profile -dxdebug.outp > This may use a lot of resources and storage space (≈15 GB of cachegrind data w/o trace data and ≈120 GB w/ trace data) +## Git Hooks (Linux only) + +The git hooks perform various checks and validations during the `commit` and warn the developer about invalid code or code style/guideline violations. + +For developers it is recommended to copy the contents of the `default.sh` file in the `Build` repository under `Hooks` to your `pre-commit` file in the `.git/hooks` directory. If the `pre-commit` file doesn't exist just create it. + +The same should be done with every module. Simply go to `.git/modules/**/hooks` and also add the content of the `default.sh` file to all `pre-commit` files. + +By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` have `+x` permissions. + +## Tools + +The following tools are important to test the application and to ensure the code quality. The configurations and sample shell executions can be found in the `Build` directory. These tools are also downloaded during the setup process of the `buildProject.sh` script. + +* composer +* phploc +* phpunit +* phpcs +* phpmetrics +* documentor +* phpstan + ## cOMS ### OpenCV From 665bb32565f351365681fa48c5db5a71cf09351c Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 7 Apr 2022 17:51:35 +0200 Subject: [PATCH 08/15] Create contribution.md --- general/contribution.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 general/contribution.md diff --git a/general/contribution.md b/general/contribution.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/general/contribution.md @@ -0,0 +1 @@ + From 7eec3cbe6e347c5d6797092b94424a449351b5d3 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Thu, 7 Apr 2022 18:27:45 +0200 Subject: [PATCH 09/15] Update contribution.md --- general/contribution.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/general/contribution.md b/general/contribution.md index 8b13789..77c519c 100644 --- a/general/contribution.md +++ b/general/contribution.md @@ -1 +1,9 @@ +# Contribution Guidelines +* Getting started + * Permissions + * Setup +* Code style +* Tests +* Code of conduct +* Code review From 8f8791032377868195beddc8088be76038e4ef8e Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 16:25:04 +0200 Subject: [PATCH 10/15] Update setup.md --- general/setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/general/setup.md b/general/setup.md index 91ad135..345101f 100755 --- a/general/setup.md +++ b/general/setup.md @@ -20,6 +20,14 @@ Extensions and software marked with `*` are optional but recommended. They are o Steps which are not explained in this documentation are how to install and setup the above mentioned software and extensions. You also should configure the web server paths accordingly in order to access the application in the browser. +### IDE / Editor + +Which IDE or editor a developer uses is up to the individual developer. From experience the following opinionated choices provided good results: + +* Visual Studio Code (vscode) +* Sublime +* PHPStorm (mostly for php, html, css, js) + ### Installation Options 1. Option 1: Full installation, code checks/tests, generating documentation. **Not recomended as quick setup** From 520e3a04b1875fe37d722ab1b9771ea8a22ac29d Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 17:19:58 +0200 Subject: [PATCH 11/15] Update inspections.md --- quality/inspections.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/quality/inspections.md b/quality/inspections.md index bc8118d..8772210 100755 --- a/quality/inspections.md +++ b/quality/inspections.md @@ -81,7 +81,7 @@ php -dxdebug.remote_enable=1 -dxdebug.mode=coverage,develop vendor/bin/phpunit - #### Modules -Every module needs to have a `Admin` directory containing a class called `AdminTest.php` which is used for testing the installation, activation, deactivation, uninstall and remove of the module. Tests that install, update, remove etc. a module need to have a group called `admin`. After running the `AdminTest.php` test the final state of the module should be installed and active, only this way it's possible to further test the controller and models. A code coverage of at least 80% is mandatory for every module for integration. +Every module needs to have a `Admin` directory containing a class called `AdminTest.php` which is used for testing the installation, activation, deactivation, uninstall and remove of the module. Tests that install, update, remove etc. a module need to have a group called `admin`. After running the `AdminTest.php` test the final state of the module should be installed and active, only this way it's possible to further test the controller and models. A code coverage of at least 90% is mandatory for every module for integration. ### PHPStan @@ -111,4 +111,20 @@ For developers it is recommended to copy the contents of the `default.sh` file i The same should be done with every module. Simply go to `.git/modules/**/hooks` and also add the content of the `default.sh` file to all `pre-commit` files. -By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` files have `+x` permissions. \ No newline at end of file +By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` files have `+x` permissions. + +## Demo setup + +A good way to setup a demo application with mostly randomly generated user input data is the **demoSetup** script which can be found in the repository https://github.com/Karaka-Management/demoSetup. + +The following command will create a demo application: + +```sh +php demoSetup/setup.php +``` + +In some cases code changes may require changes to the demo setup script (e.g. changes in the api, new modules). Since the demo setup script tries to simulate user generated data it takes some time to run. You may speed up the runtime by parallelizing the execution. However, this may use up 100% of your CPU and storage performance. + +```sh +php demoSetup/setup.php -a 0 +``` From 4637103ef5dee4877e3da1432f7e034694d49e9b Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 17:27:57 +0200 Subject: [PATCH 12/15] Update setup.md --- general/setup.md | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/general/setup.md b/general/setup.md index 345101f..dfff002 100755 --- a/general/setup.md +++ b/general/setup.md @@ -95,12 +95,14 @@ This will only setup the application including some dummy data and also perform 5. Install Composer 6. Run `composer install` inside `Karaka` 7. Create the database table `oms` -7. Run `php demoSetup/setup.php` inside `Karaka` +8. Run `php demoSetup/setup.php` inside `Karaka` (takes a long time: > 1h) After the installation you'll have access to the following content: * Application: `http://127.0.0.1` +Instead of calling `php demoSetup/setup.php` which only uses a single thread you may also run `php demoSetup/setup.php -a 0` which will execute the install script in multiple threads leading to most likely 100% CPU and storage usage but therfore significantly reduce the execution time. + ### Annotation * During this process the database automatically gets dropped (if it exists) and re-created @@ -118,27 +120,9 @@ php -dxdebug.profiler_enable=1 -dxdebug.mode=develop,debug,profile -dxdebug.outp > This may use a lot of resources and storage space (≈15 GB of cachegrind data w/o trace data and ≈120 GB w/ trace data) -## Git Hooks (Linux only) - -The git hooks perform various checks and validations during the `commit` and warn the developer about invalid code or code style/guideline violations. - -For developers it is recommended to copy the contents of the `default.sh` file in the `Build` repository under `Hooks` to your `pre-commit` file in the `.git/hooks` directory. If the `pre-commit` file doesn't exist just create it. - -The same should be done with every module. Simply go to `.git/modules/**/hooks` and also add the content of the `default.sh` file to all `pre-commit` files. - -By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` have `+x` permissions. - ## Tools -The following tools are important to test the application and to ensure the code quality. The configurations and sample shell executions can be found in the `Build` directory. These tools are also downloaded during the setup process of the `buildProject.sh` script. - -* composer -* phploc -* phpunit -* phpcs -* phpmetrics -* documentor -* phpstan +Especially in order to ensure the code quality various tools are used. Check out the inspection guidelines for further details. ## cOMS From 347870cc0907cc4c83688f1706bfa3bdd32275ff Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 17:34:11 +0200 Subject: [PATCH 13/15] Update inspections.md --- quality/inspections.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/quality/inspections.md b/quality/inspections.md index 8772210..a9b93c1 100755 --- a/quality/inspections.md +++ b/quality/inspections.md @@ -103,7 +103,9 @@ Besides the code tests and static code analysis the code style is another very i php vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report-junit=Build/test/junit_phpcs.xml ``` -### Git Hooks (Linux only) +### Custom scripts + +#### Git Hooks (Linux only) The git hooks perform various checks and validations during the `commit` and warn the developer about invalid code or code style/guideline violations. @@ -113,6 +115,23 @@ The same should be done with every module. Simply go to `.git/modules/**/hooks` By doing this every commit will be inspected and either pass without warnings, pass with warnings or stop with errors. This will allow you to fix code before committing it. Be aware only changed files will be inspected. Also make sure all `pre-commit` files have `+x` permissions. +#### Release Report + +The **TestReportGenerator** generates a customer report which outputs various information regarding tests (unit, integration, static) and code quality. The primary purpose of this report generator is to aggregate the code inspections in a printable format that can be used for auditing purposes on the customer side. + +```sh +php TestReportGenerator/src/index.php \ + -b /home/oms \ + -l /home/oms/Build/Config/reportLang.php \ + -c /home/oms/tests/coverage.xml \ + -s /home/oms/Build/test/junit_phpcs.xml \ + -sj /home/oms/Build/test/junit_eslint.xml \ + -a /home/oms/Build/test/phpstan.json \ + -u /home/oms/Build/test/junit_php.xml \ + -d /home/oms/Build/test/ReportExternal \ + --version 1.0.0 +``` + ## Demo setup A good way to setup a demo application with mostly randomly generated user input data is the **demoSetup** script which can be found in the repository https://github.com/Karaka-Management/demoSetup. From ab7ee44e4e4c45b8279c9f88bbb14b97560778ac Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 17:35:02 +0200 Subject: [PATCH 14/15] Update inspections.md --- quality/inspections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quality/inspections.md b/quality/inspections.md index a9b93c1..521b0dd 100755 --- a/quality/inspections.md +++ b/quality/inspections.md @@ -117,7 +117,7 @@ By doing this every commit will be inspected and either pass without warnings, p #### Release Report -The **TestReportGenerator** generates a customer report which outputs various information regarding tests (unit, integration, static) and code quality. The primary purpose of this report generator is to aggregate the code inspections in a printable format that can be used for auditing purposes on the customer side. +The (TestReportGenerator)[https://github.com/Karaka-Management/TestReportGenerator] generates a customer report which outputs various information regarding tests (unit, integration, static) and code quality. The primary purpose of this report generator is to aggregate the code inspections in a printable format that can be used for auditing purposes on the customer side. ```sh php TestReportGenerator/src/index.php \ From b6fc5e05ae082b81969bf3927a897bd8857b4184 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Fri, 8 Apr 2022 17:35:23 +0200 Subject: [PATCH 15/15] Update inspections.md --- quality/inspections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quality/inspections.md b/quality/inspections.md index 521b0dd..89230a2 100755 --- a/quality/inspections.md +++ b/quality/inspections.md @@ -117,7 +117,7 @@ By doing this every commit will be inspected and either pass without warnings, p #### Release Report -The (TestReportGenerator)[https://github.com/Karaka-Management/TestReportGenerator] generates a customer report which outputs various information regarding tests (unit, integration, static) and code quality. The primary purpose of this report generator is to aggregate the code inspections in a printable format that can be used for auditing purposes on the customer side. +The [TestReportGenerator](https://github.com/Karaka-Management/TestReportGenerator) generates a customer report which outputs various information regarding tests (unit, integration, static) and code quality. The primary purpose of this report generator is to aggregate the code inspections in a printable format that can be used for auditing purposes on the customer side. ```sh php TestReportGenerator/src/index.php \