From 35dcec5b9699337b0ce7a06c671be3b9af3e07cf Mon Sep 17 00:00:00 2001
From: Robin Windey
Date: Wed, 16 Feb 2022 06:44:16 +0100
Subject: [PATCH] Add language settings and global processor settings closes
#76 (#85)
* Add lang settings and global CPU settings closes #76
---
.eslintrc.js | 9 +
.github/workflows/build.yml | 17 +
.github/workflows/build_release.yml | 18 +
.../workflows/{coverage.yml => codecov.yml} | 26 +-
.gitignore | 4 +-
.l10nignore | 2 +
.php_cs.dist | 1 +
.vscode/launch.json | 12 +
Makefile | 74 +-
README.md | 48 +-
appinfo/info.xml | 11 +-
appinfo/routes.php | 33 +
babel.config.js | 3 +
composer.json | 5 +-
composer.lock | 41 +-
doc/img/global_settings.png | Bin 0 -> 41901 bytes
doc/img/per_workflow_settings.png | Bin 0 -> 25233 bytes
jest.config.js | 22 +
js/admin.js | 59 -
lib/AppInfo/Application.php | 3 +
lib/BackgroundJobs/ProcessFileJob.php | 69 +-
lib/Controller/GlobalSettingsController.php | 78 +
.../RegisterFlowOperationsListener.php | 6 +-
lib/Model/GlobalSettings.php | 32 +
lib/Model/WorkflowSettings.php | 90 +
lib/OcrProcessors/IOcrProcessor.php | 10 +-
lib/OcrProcessors/PdfOcrProcessor.php | 62 +-
lib/Operation.php | 19 +-
lib/Service/GlobalSettingsService.php | 79 +
lib/Service/IGlobalSettingsService.php | 43 +
lib/Service/IOcrService.php | 11 +-
lib/Service/OcrService.php | 11 +-
lib/Settings/GlobalSettings.php | 48 +
lib/Wrapper/ViewWrapper.php | 3 -
package-lock.json | 56866 ++++++++++++++++
package.json | 48 +
phpunit.integration.xml | 1 +
phpunit.xml | 1 +
src/components/GlobalSettings.vue | 90 +
src/components/WorkflowOcr.vue | 134 +
src/constants.js | 1 +
src/globalSettings.js | 7 +
src/main.js | 9 +
src/service/globalSettingsService.js | 50 +
src/test/components/GlobalSettings.spec.js | 61 +
src/test/components/WorkflowOcr.spec.js | 117 +
src/test/gobalSettings.spec.js | 12 +
src/test/main.spec.js | 10 +
.../service/globalSettingsService.spec.js | 36 +
stylelint.config.js | 3 +
templates/globalSettings.php | 32 +
.../BackgroundJobs/ProcessFileJobTest.php | 38 +-
.../GlobalSettingsControllerTest.php | 108 +
tests/Unit/Model/WorkflowSettingsTest.php | 56 +
.../OcrProcessors/PdfOcrProcessorTest.php | 95 +-
tests/Unit/OperationTest.php | 42 +-
.../Service/GlobalSettingsServiceTest.php | 68 +
tests/Unit/Service/OcrServiceTest.php | 25 +-
tests/Unit/Settings/GlobalSettingsTest.php | 58 +
webpack.js | 10 +
60 files changed, 58743 insertions(+), 184 deletions(-)
create mode 100644 .eslintrc.js
rename .github/workflows/{coverage.yml => codecov.yml} (69%)
create mode 100644 .l10nignore
create mode 100644 appinfo/routes.php
create mode 100644 babel.config.js
create mode 100644 doc/img/global_settings.png
create mode 100644 doc/img/per_workflow_settings.png
create mode 100644 jest.config.js
delete mode 100644 js/admin.js
create mode 100644 lib/Controller/GlobalSettingsController.php
create mode 100644 lib/Model/GlobalSettings.php
create mode 100644 lib/Model/WorkflowSettings.php
create mode 100644 lib/Service/GlobalSettingsService.php
create mode 100644 lib/Service/IGlobalSettingsService.php
create mode 100644 lib/Settings/GlobalSettings.php
create mode 100644 package-lock.json
create mode 100644 package.json
create mode 100644 src/components/GlobalSettings.vue
create mode 100644 src/components/WorkflowOcr.vue
create mode 100644 src/constants.js
create mode 100644 src/globalSettings.js
create mode 100644 src/main.js
create mode 100644 src/service/globalSettingsService.js
create mode 100644 src/test/components/GlobalSettings.spec.js
create mode 100644 src/test/components/WorkflowOcr.spec.js
create mode 100644 src/test/gobalSettings.spec.js
create mode 100644 src/test/main.spec.js
create mode 100644 src/test/service/globalSettingsService.spec.js
create mode 100644 stylelint.config.js
create mode 100644 templates/globalSettings.php
create mode 100644 tests/Unit/Controller/GlobalSettingsControllerTest.php
create mode 100644 tests/Unit/Model/WorkflowSettingsTest.php
create mode 100644 tests/Unit/Service/GlobalSettingsServiceTest.php
create mode 100644 tests/Unit/Settings/GlobalSettingsTest.php
create mode 100644 webpack.js
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..225d22a
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,9 @@
+module.exports = {
+ rules: {
+ // no object literal shorthand syntax
+ 'object-shorthand': ['warn', 'never'],
+ },
+ extends: [
+ '@nextcloud',
+ ],
+}
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fb28643..2577c78 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -14,8 +14,25 @@ jobs:
uses: actions/checkout@v2
with:
path: ${{ env.APP_NAME }}
+
+ - name: Read package.json node and npm engines version
+ uses: skjnldsv/read-package-engines-version-actions@v1.1
+ id: versions
+ continue-on-error: false
+ with:
+ path: ${{ env.APP_NAME }}
+
+ - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ steps.versions.outputs.nodeVersion }}
+
+ - name: Set up npm ${{ steps.versions.outputs.npmVersion }}
+ run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
+
- name: Run build
run: cd ${{ env.APP_NAME }} && make appstore
+
- name: Upload artifacts
uses: actions/upload-artifact@v1
with:
diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml
index d7e9c86..5249976 100644
--- a/.github/workflows/build_release.yml
+++ b/.github/workflows/build_release.yml
@@ -15,8 +15,25 @@ jobs:
uses: actions/checkout@v2
with:
path: ${{ env.APP_NAME }}
+
+ - name: Read package.json node and npm engines version
+ uses: skjnldsv/read-package-engines-version-actions@v1.1
+ id: versions
+ continue-on-error: false
+ with:
+ path: ${{ env.APP_NAME }}
+
+ - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ steps.versions.outputs.nodeVersion }}
+
+ - name: Set up npm ${{ steps.versions.outputs.npmVersion }}
+ run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
+
- name: Run build
run: cd ${{ env.APP_NAME }} && make appstore
+
- name: Upload app tarball to release
uses: svenstaro/upload-release-action@v2
id: attach_to_release
@@ -26,6 +43,7 @@ jobs:
asset_name: ${{ env.APP_NAME }}.tar.gz
tag: ${{ github.ref }}
overwrite: true
+
- name: Upload app to Nextcloud appstore
uses: R0Wi/nextcloud-appstore-push-action@v1
with:
diff --git a/.github/workflows/coverage.yml b/.github/workflows/codecov.yml
similarity index 69%
rename from .github/workflows/coverage.yml
rename to .github/workflows/codecov.yml
index 1bde156..14e91b7 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/codecov.yml
@@ -63,12 +63,28 @@ jobs:
./occ app:enable ${{ env.APP_NAME }}
php -S localhost:8080 &
- - name: Run tests with coverage tracking
+ - name: Read package.json node and npm engines version
+ uses: skjnldsv/read-package-engines-version-actions@v1.1
+ id: versions
+ continue-on-error: false
+ with:
+ path: ./apps/${{ env.APP_NAME }}
+
+ - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ steps.versions.outputs.nodeVersion }}
+
+ - name: Set up npm ${{ steps.versions.outputs.npmVersion }}
+ run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
+
+ - name: Run PHP and JS tests with coverage tracking and merge results
working-directory: apps/${{ env.APP_NAME }}
- run: make coverage
+ run: make coverage-all
- name: Upload coverage to Codecov
- working-directory: ./apps/${{ env.APP_NAME }}
+ working-directory: ./apps/${{ env.APP_NAME }}/coverage
run: |
- wget https://codecov.io/bash -O codecov.sh
- bash codecov.sh -t ${{ secrets.CODECOV_TOKEN }} -f coverage.xml -Z
+ curl -Os https://uploader.codecov.io/latest/linux/codecov
+ chmod +x codecov
+ ./codecov -t ${{ secrets.CODECOV_TOKEN }} -Z
diff --git a/.gitignore b/.gitignore
index 80c6955..8d6ea41 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,6 @@ coverage_html
build
.phpunit.result.cache
*.cov
-coverage
\ No newline at end of file
+node_modules
+js
+coverage
diff --git a/.l10nignore b/.l10nignore
new file mode 100644
index 0000000..9700db2
--- /dev/null
+++ b/.l10nignore
@@ -0,0 +1,2 @@
+# compiled vue templates
+js/
\ No newline at end of file
diff --git a/.php_cs.dist b/.php_cs.dist
index 909be7d..448cc4b 100644
--- a/.php_cs.dist
+++ b/.php_cs.dist
@@ -13,5 +13,6 @@ $config
->notPath('l10n')
->notPath('src')
->notPath('vendor')
+ ->notPath('node_modules')
->in(__DIR__);
return $config;
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 8d15c3f..d082e93 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -41,6 +41,18 @@
"args": ["-c", "phpunit.integration.xml"],
"cwd": "${workspaceRoot}",
"port": 9003
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Debug VUE Unit Test (current file)",
+ "runtimeExecutable": "npm",
+ "runtimeArgs": [
+ "run-script",
+ "test:debug",
+ "${file}"
+ ],
+ "port": 9229
}
]
}
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 340283a..c55c336 100644
--- a/Makefile
+++ b/Makefile
@@ -56,13 +56,10 @@ all: build
.PHONY: build
build:
ifneq (,$(wildcard $(CURDIR)/composer.json))
- make composer
+ make composer-build
endif
ifneq (,$(wildcard $(CURDIR)/package.json))
- make npm
-endif
-ifneq (,$(wildcard $(CURDIR)/js/package.json))
- make npm
+ make npm-install && make npm-build
endif
# Installs and updates the composer dependencies. If composer is not installed
@@ -87,14 +84,30 @@ composer-build:
composer install --no-dev --prefer-dist
# Installs npm dependencies
-.PHONY: npm
-npm:
+.PHONY: npm-install
+npm-install: check-npm
ifeq (,$(wildcard $(CURDIR)/package.json))
- cd js && $(npm) run build
+ cd js && npm run dev-install
+else
+ npm run dev-install
+endif
+
+# Runs npm build script
+.PHONY: npm-build
+npm-build: check-npm
+ifeq (,$(wildcard $(CURDIR)/package.json))
+ cd js && npm run build
else
npm run build
endif
+# Checks if npm is installed
+.PHONY: check-npm
+check-npm:
+ifeq (,$(npm))
+ $(error npm is not installed. Please install Node in version mentioned in package.json on your system)
+endif
+
# Removes the appstore build
.PHONY: clean
clean:
@@ -106,8 +119,7 @@ clean:
distclean: clean
rm -rf vendor
rm -rf node_modules
- rm -rf js/vendor
- rm -rf js/node_modules
+ rm -rf js
# Builds the source and appstore package
.PHONY: dist
@@ -132,10 +144,11 @@ source:
.PHONY: appstore
appstore:
make distclean
- make composer-build
+ make build
rm -rf $(appstore_build_directory)
mkdir -p $(appstore_build_directory)
tar cvzf $(appstore_package_name).tar.gz \
+ --no-wildcards-match-slash \
--exclude-vcs \
--exclude="../$(app_name)/build" \
--exclude="../$(app_name)/tests" \
@@ -144,6 +157,8 @@ appstore:
--exclude="../$(app_name)/phpunit*xml" \
--exclude="../$(app_name)/coverage*xml" \
--exclude="../$(app_name)/composer.*" \
+ --exclude="../$(app_name)/coverage_html" \
+ --exclude="../$(app_name)/coverage" \
--exclude="../$(app_name)/js/node_modules" \
--exclude="../$(app_name)/js/tests" \
--exclude="../$(app_name)/js/test" \
@@ -152,12 +167,19 @@ appstore:
--exclude="../$(app_name)/js/bower.json" \
--exclude="../$(app_name)/js/karma.*" \
--exclude="../$(app_name)/js/protractor.*" \
+ --exclude="../$(app_name)/js/*.map" \
+ --exclude="../$(app_name)/js/.*" \
--exclude="../$(app_name)/package.json" \
--exclude="../$(app_name)/bower.json" \
--exclude="../$(app_name)/karma.*" \
--exclude="../$(app_name)/protractor\.*" \
--exclude="../$(app_name)/.*" \
- --exclude="../$(app_name)/js/.*" \
+ --exclude="../$(app_name)/src" \
+ --exclude="../$(app_name)/node_modules" \
+ --exclude="../$(app_name)/*.js" \
+ --exclude="../$(app_name)/*.json" \
+ --exclude="../$(app_name)/*.lock" \
+ --exclude="../$(app_name)/*.cov" \
../$(app_name) \
.PHONY: test
@@ -173,23 +195,31 @@ unittest: composer
integrationtest: composer
$(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml
+.PHONY: coverage-php
+coverage-php:
+ XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.xml --coverage-php coverage/coverage_unittests.cov
+ XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml --coverage-php coverage/coverage_integrationtests.cov
+ XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpcov/phpcov merge --clover ./coverage/php-coverage.xml ./coverage
+
.PHONY: html-coverage
-html-coverage: composer
- XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.xml --coverage-php coverage_unittests.cov
- XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml --coverage-php coverage_integrationtests.cov
+html-coverage: composer coverage-php
XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpcov/phpcov merge --html coverage_html .
-.PHONY: coverage
-coverage: composer
- XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.xml --coverage-php coverage_unittests.cov
- XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpunit/phpunit -c phpunit.integration.xml --coverage-php coverage_integrationtests.cov
- XDEBUG_MODE=coverage $(CURDIR)/vendor/phpunit/phpcov/phpcov merge --clover coverage.xml .
+# Coverage PHP and JS + merge coverage
+.PHONY: coverage-all
+coverage-all: composer npm-install coverage-php js-test
.PHONY: lint
-lint: composer
+lint: composer npm-install
composer run lint
composer run cs:check
+ npm run lint
.PHONY: lint-fix
-lint-fix: composer
+lint-fix: composer npm-install
composer run cs:fix
+ npm run lint:fix
+
+.PHONY: js-test
+js-test:
+ npm run test:unit
diff --git a/README.md b/README.md
index c54e723..8c3876c 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,12 @@
- [Nextcloud background jobs](#nextcloud-background-jobs)
- [Backend](#backend)
- [Usage](#usage)
- - [Trigger OCR if file was created or updated](#trigger-ocr-if-file-was-created-or-updated)
- - [Trigger OCR on tag assigning](#trigger-ocr-on-tag-assigning)
+ - [Useful triggers](#useful-triggers)
+ - [Trigger OCR if file was created or updated](#trigger-ocr-if-file-was-created-or-updated)
+ - [Trigger OCR on tag assigning](#trigger-ocr-on-tag-assigning)
+ - [Settings](#settings)
+ - [Per workflow settings](#per-workflow-settings)
+ - [Global settings](#global-settings)
- [Testing your configuration](#testing-your-configuration)
- [How it works](#how-it-works)
- [General](#general)
@@ -71,7 +75,9 @@ You can configure the OCR processing via Nextcloud's workflow engine. Therefore
-### Trigger OCR if file was created or updated
+### Useful triggers
+
+#### Trigger OCR if file was created or updated
If you want a newly uploaded file to be processed via OCR or if you want to process a file which was updated, use the **When**-conditions `File created` or `File updated` or both.
@@ -83,7 +89,7 @@ A typical setup for processing incoming PDF-files and adding a text-layer to the
> :warning: Please ensure to use the `File MIME type` → **`is`** → `PDF documents` operator, otherwise you might not be able to save the workflow like discussed [here](https://github.com/R0Wi/workflow_ocr/issues/41).
-### Trigger OCR on tag assigning
+#### Trigger OCR on tag assigning
If you have existing files which you want to process after they have been created, or if you want to filter manually which files are processed, you can use the `Tag assigned` event to trigger the OCR process if a user adds a specific tag to a file. Such a setup might look like this:
@@ -100,6 +106,36 @@ After that you should be able to add a file to the OCR processing queue by assig
+### Settings
+
+#### Per workflow settings
+Anyone who can create new workflows (admin or regular user) can configure settings for the OCR processing for a specific workflow. These settings are only applied to the specific workflow and do not affect other workflows.
+
+
+
+
+
+Currently the following settings are available per workflow:
+
+Name | Description
+--- | ---
+Languages | The languages to be used for OCR processing. The languages can be choosen from a dropdown list. For PDF files this setting corresponds to the `-l` parameter of `ocrmypdf`. **Please note** that you'll have to install the appropriate languages like described in the [`ocrmypdf` documentation](https://ocrmypdf.readthedocs.io/en/latest/languages.html).
+Remove background | If the switch is set, the OCR processor will try to remove the background of the document before processing and instead set a white background. For PDF files this setting corresponds to the [`--remove-background`](https://ocrmypdf.readthedocs.io/en/latest/cookbook.html?highlight=remove-background#image-processing) parameter of `ocrmypdf`. **Please note** that without setting this option, the [`--redo-ocr`](https://ocrmypdf.readthedocs.io/en/latest/errors.html?highlight=redo-ocr#page-already-has-text) option will be set, which is **not** compatible to the mentioned `--remove-background`-parameter. So if you set this switch to "on", make sure your PDF documents do not already contain text, otherwise you might find errors in your NC logs and OCR is not possible.
+
+#### Global settings
+As a Nextcloud administrator you're able to configure global settings which apply to all configured OCR-workflows on the current system.
+Go to `Settings` → `Flow` and scroll down to `Workflow OCR`:
+
+
+
+
+
+Currently the following settings can be applied globally:
+
+Name | Description
+-----|------------
+Processor cores | Defines the number of processor cores to use for OCR processing. When the input is a PDF file, this corresponds to the [`ocrmypdf` CPU limit](https://ocrmypdf.readthedocs.io/en/latest/pdfsecurity.html?highlight=%22-j%22#limiting-cpu-usage). This setting can be especially useful if you have a small backend system which has only limited power.
+
### Testing your configuration
To **test** if your file gets processed properly you can do the following steps:
@@ -124,6 +160,7 @@ For processing PDF files, the external command line tool [`OCRmyPDF`](https://gi
### Dev setup
Tools and packages you need for development:
* `make`
+* `node` and `npm`
* [`composer`](https://getcomposer.org/download/) (Will be automatically installed when running `make build`)
* Properly setup `php`-environment
* Webserver (like [`Apache`](https://httpd.apache.org/))
@@ -279,7 +316,7 @@ public static function registerOcrProcessors(IRegistrationContext $context) : vo
}
```
-That's all. If you now create a new workflow based on your added mimetype, your implementation should be triggered by the app. The return value of `ocrFile(string $fileContent)` will be interpreted as the file content of the scanned file. This one is used to create a new file version in Nextcloud.
+That's all. If you now create a new workflow based on your added mimetype, your implementation should be triggered by the app. The return value of `ocrFile(string $fileContent, WorkflowSettings $settings, GlobalSettings $globalSettings)` will be interpreted as the file content of the scanned file. This one is used to create a new file version in Nextcloud.
## Limitations
* **Currently only pdf documents (`application/pdf`) can be used as input.** Other mimetypes are currently ignored but might be added in the future.
@@ -301,4 +338,5 @@ That's all. If you now create a new workflow based on your added mimetype, your
|---|---|---|
| OCRmyPDF (commandline) | >= 9.6.0 | https://github.com/jbarlow83/OCRmyPDF On Debian, you might need to manually install a more recent version as described in https://ocrmypdf.readthedocs.io/en/latest/installation.html#ubuntu-18-04-lts; see https://github.com/R0Wi/workflow_ocr/issues/46 |
| php-shellcommand | >= 1.6 | https://github.com/mikehaertl/php-shellcommand |
+| chain | >= 0.9.0 | https://packagist.org/packages/cocur/chain |
| PHPUnit | >= 8.0 | https://phpunit.de/ |
diff --git a/appinfo/info.xml b/appinfo/info.xml
index dc77e92..b079e4c 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -3,10 +3,12 @@
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
workflow_ocr
Workflow OCR
- OCR processing via workflow
+ Serverside OCR processing via workflow-engine
This app makes it possible to process various files via OCR algorithms.
- The processing is done via workflow-engine and can therefore easily be customized.
- 1.22.4
+ The processing is done via workflow-engine and can therefore easily be customized.
+ Please note that you'll have to install the OcrMyPDF CLI on your Nextcloud server to
+ process PDF files. More installation instructions can be found in the docs https://github.com/R0Wi/workflow_ocr/blob/master/README.md.
+ 1.22.5
agpl
Robin Windey
WorkflowOcr
@@ -17,6 +19,9 @@
tools
organization
workflow
+
+ OCA\WorkflowOcr\Settings\GlobalSettings
+
https://github.com/R0Wi/workflow_ocr
https://github.com/R0Wi/workflow_ocr/issues
https://github.com/R0Wi/workflow_ocr.git
diff --git a/appinfo/routes.php b/appinfo/routes.php
new file mode 100644
index 0000000..79e9b05
--- /dev/null
+++ b/appinfo/routes.php
@@ -0,0 +1,33 @@
+
+ *
+ * @author Robin Windey
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+
+return [
+ 'routes' => [
+ ['name' => 'GlobalSettings#getGlobalSettings', 'url' => '/globalsettings', 'verb' => 'GET'],
+ ['name' => 'GlobalSettings#setGlobalSettings', 'url' => '/globalsettings', 'verb' => 'PUT']
+ ]
+];
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..bd8e2cb
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,3 @@
+const babelConfig = require('@nextcloud/babel-config')
+
+module.exports = babelConfig
\ No newline at end of file
diff --git a/composer.json b/composer.json
index 7481fa2..8490ebb 100644
--- a/composer.json
+++ b/composer.json
@@ -1,6 +1,7 @@
{
"require": {
- "mikehaertl/php-shellcommand": "^1.6"
+ "mikehaertl/php-shellcommand": "^1.6",
+ "cocur/chain": "^0.9.0"
},
"require-dev": {
"phpunit/phpunit": "9.3.*",
@@ -12,7 +13,7 @@
"classmap-authoritative": true
},
"scripts": {
- "lint": "find . -name \\*.php -not -path './vendor/*' -exec php -l \"{}\" \\;",
+ "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './node_modules/*' -exec php -l \"{}\" \\;",
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix"
}
diff --git a/composer.lock b/composer.lock
index b6931f7..3f1abfb 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,45 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "a266f4fee85dac69fa62a0dbac83f350",
+ "content-hash": "03274588aa74138b71ca0dc8123815d8",
"packages": [
+ {
+ "name": "cocur/chain",
+ "version": "v0.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cocur/chain.git",
+ "reference": "4d0a6e4fdee3b4aa53f0937f82e98d43320659a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cocur/chain/zipball/4d0a6e4fdee3b4aa53f0937f82e98d43320659a9",
+ "reference": "4d0a6e4fdee3b4aa53f0937f82e98d43320659a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cocur\\Chain\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Consistent and chainable array manipulation",
+ "support": {
+ "issues": "https://github.com/cocur/chain/issues",
+ "source": "https://github.com/cocur/chain/tree/v0.9.0"
+ },
+ "time": "2020-07-19T15:36:22+00:00"
+ },
{
"name": "mikehaertl/php-shellcommand",
"version": "1.6.3",
@@ -4213,5 +4250,5 @@
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
- "plugin-api-version": "2.0.0"
+ "plugin-api-version": "2.1.0"
}
diff --git a/doc/img/global_settings.png b/doc/img/global_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..6801172c72df68c89730d747f7eeb0912c7f5e74
GIT binary patch
literal 41901
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%0AewFfvDV$igG3jHAbdfFEUTB
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 6h4x8<$xegOmr^nft(IR88kyT7-H~YUBVW
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 |