mirror of
https://codeberg.org/SeedDMS/paperless
synced 2025-07-13 16:08:14 +00:00
Compare commits
110 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ff4b3d7722 | ||
![]() |
1c09c1ba4e | ||
![]() |
54d4d2c41a | ||
![]() |
6633e78ef8 | ||
![]() |
9ba5882aa9 | ||
![]() |
feccb4ac65 | ||
![]() |
413877b537 | ||
![]() |
4390b57036 | ||
![]() |
b7b3e20cf4 | ||
![]() |
3fb56643ee | ||
![]() |
c8c5a789ae | ||
![]() |
7bc95887cb | ||
![]() |
3a73820fee | ||
![]() |
caf2e49d3b | ||
![]() |
0ee9bfee6b | ||
![]() |
eef4f46687 | ||
![]() |
a551ea2587 | ||
![]() |
38326621a1 | ||
![]() |
4aee2e9e3b | ||
![]() |
8b642f78b1 | ||
![]() |
0eb85b8ebe | ||
![]() |
aafd65f26f | ||
![]() |
1ad48e50b5 | ||
![]() |
75f4be229c | ||
![]() |
afecdf2205 | ||
![]() |
8fa420114b | ||
![]() |
5df36d9487 | ||
![]() |
b18bedd004 | ||
![]() |
f68dd2e483 | ||
![]() |
04cddbcee6 | ||
![]() |
1bf93e420c | ||
![]() |
e2b20688fe | ||
![]() |
8fd2a12ed8 | ||
![]() |
8ba45f3346 | ||
![]() |
fa97180c55 | ||
![]() |
3fe6f6df3c | ||
![]() |
5e0b31bf95 | ||
![]() |
9dfd05247f | ||
![]() |
6395de766b | ||
![]() |
aefd3b8807 | ||
![]() |
d5b5a1cb49 | ||
![]() |
b7e1ca4ed9 | ||
![]() |
434cce5d0d | ||
![]() |
5ccec6a942 | ||
![]() |
24d1dfa17d | ||
![]() |
16fe475136 | ||
![]() |
5bc93c25d5 | ||
![]() |
043ed11f8c | ||
![]() |
2440fd4e65 | ||
![]() |
e3c545ef36 | ||
![]() |
e916e6afb9 | ||
![]() |
e9bcdf0d09 | ||
![]() |
a5fb29c683 | ||
![]() |
fb84b8d282 | ||
![]() |
60bbc32f04 | ||
![]() |
ce540d3e24 | ||
![]() |
1205b32572 | ||
![]() |
6116bbfa4d | ||
![]() |
62d6ab86c5 | ||
![]() |
45af226bca | ||
![]() |
5c2ce7b0ac | ||
![]() |
1d9adf9b26 | ||
![]() |
ee6b5eb7c6 | ||
![]() |
a13b19bf34 | ||
![]() |
d07399d8b0 | ||
![]() |
d5416f895a | ||
![]() |
5db8a70515 | ||
![]() |
4f939feb68 | ||
![]() |
6f3c87bf08 | ||
![]() |
c4abcf98c0 | ||
![]() |
10dddd8e7e | ||
![]() |
f50d74f710 | ||
![]() |
a74ec650af | ||
![]() |
16ee0a8c49 | ||
![]() |
b50ddcdbb4 | ||
![]() |
76d6be2a08 | ||
![]() |
9840153ff8 | ||
![]() |
72cc22e474 | ||
![]() |
210e8a04a9 | ||
![]() |
687bb2e2b2 | ||
![]() |
fe4f527daa | ||
![]() |
76399068dc | ||
![]() |
7b85496041 | ||
![]() |
48c474a815 | ||
![]() |
84742f6ab6 | ||
![]() |
2580c56a09 | ||
![]() |
16a3083f33 | ||
![]() |
72471b96e3 | ||
![]() |
8011d515f9 | ||
![]() |
6a84abb6ce | ||
![]() |
28d2e4dc4b | ||
![]() |
63539d9e07 | ||
![]() |
19b5a670d7 | ||
![]() |
b4199beed8 | ||
![]() |
ce5873027d | ||
![]() |
b1693b24c0 | ||
![]() |
d578a7bc99 | ||
![]() |
3f871b3b77 | ||
![]() |
691bbcd689 | ||
![]() |
2a19650419 | ||
![]() |
af39f6fdf2 | ||
![]() |
9c3114634b | ||
![]() |
26df6830c0 | ||
![]() |
68c706b6e6 | ||
![]() |
32aed7f3eb | ||
![]() |
1121532204 | ||
![]() |
ae0d06f1ef | ||
![]() |
59084a1ddd | ||
![]() |
111e842645 | ||
![]() |
959b8bea7d |
90
README.md
90
README.md
|
@ -1,21 +1,29 @@
|
|||
# SeedDMS paperless extension
|
||||
|
||||
This extension makes SeedDMS behave like a Paperless ngx server.
|
||||
|
||||
Paperless (and Paperless ngx) is another free document management system.
|
||||
It has a different focus than SeedDMS and misses many of the features
|
||||
of SeedDMS but there are three Android apps for uploading and browsing,
|
||||
which can be used for SeedDMS as well, if this extension is installed.
|
||||
|
||||
All apps are available at google play and/or f-droid.
|
||||
All apps are available at
|
||||
[Google Play](https://play.google.com/store/apps) and/or [f-droid](https://f-droid.org/).
|
||||
|
||||
### paperless-mobile
|
||||
|
||||
paperless-mobile
|
||||
This is the youngest but most feature complete app. It has all
|
||||
the features of both apps paperless and paperless-share.
|
||||
[Google Play](https://play.google.com/store/apps/details?id=eu.bauerj.paperless_app),
|
||||
[f-droid](https://f-droid.org/packages/eu.bauerj.paperless_app/).
|
||||
|
||||
### paperless
|
||||
|
||||
paperless
|
||||
This one is already a couple of years around but development has
|
||||
slowed down a bit. It supports listing and uploading documents.
|
||||
|
||||
paperless-share
|
||||
### paperless-share
|
||||
|
||||
This app just adds a share button. Any shared document will
|
||||
be uploaded to the server. Once the app was started it is mostly
|
||||
invisible.
|
||||
|
@ -28,6 +36,23 @@ and basic authentication of paperless. Because this middleware applies
|
|||
to all routes of the rest api, even the existing routes may use
|
||||
the new authentication methods.
|
||||
|
||||
## Installation
|
||||
|
||||
Install this extension like any other extension by uploading the
|
||||
zip file in the extension manager or copy the content of this
|
||||
repository into a directory `paperless` in SeedDMS' extension
|
||||
directory `www/ext`.
|
||||
|
||||
Afterwards import one of the database files
|
||||
|
||||
* paperless.sql (MySQL)
|
||||
* paperless-sqlite3.sql (SQLite3)
|
||||
|
||||
into your database.
|
||||
|
||||
You can test the extension by accessing `http://<your-seeddms>/restapi/index.php/api/`
|
||||
with your browser. It should return a json object containing various links.
|
||||
|
||||
## Restrictions
|
||||
|
||||
The concept of paperless is quite different from SeedDMS. Fortunately,
|
||||
|
@ -42,11 +67,13 @@ to setup fulltext search before using it.
|
|||
### Authentication
|
||||
|
||||
Paperless uses a token based or http basic authentication. Both are
|
||||
implemented by another slim middleware. There is no session, but the
|
||||
token is encrypted and stores all the required data to identify the user.
|
||||
The password to encrypt the token can be set in the configuration, just
|
||||
like the expiration date of the token. Once the password changes all
|
||||
token will become invalid and users will have to relogin.
|
||||
implemented in SeedDMS by an additional slim middleware. There is no
|
||||
session, but the token is encrypted and stores all the required data
|
||||
to identify the user, including a lifetime which can be set in the
|
||||
configuration. Once that lifetime has ended the token becomes invalid
|
||||
and the user has to relogin. The password to encrypt the token can
|
||||
also be set in the configuration. Once the password changes all token
|
||||
will become invalid and users will have to relogin.
|
||||
|
||||
### Archive
|
||||
|
||||
|
@ -66,6 +93,20 @@ A category in SeedDMS does not have a color and cannot be marked as inbox tags.
|
|||
SeedDMS deriveѕ the color from the category name and keeps a list of
|
||||
categories, which are treated as inbox tags, in the configuration.
|
||||
|
||||
### Document Types
|
||||
|
||||
There is no direct equivalent to Document Types in SeedDMS, but they can
|
||||
be easily simulated with a custom attribute. Since version 1.0.1 of this
|
||||
extension the configuration contains a parameter for an attribute which
|
||||
must be a value set containing the different document types. Do *not* make
|
||||
it a multi value attribute, because a document in Paperless may have only
|
||||
one type. Adding more types when you need it or changing the order is possible.
|
||||
|
||||
### Correspondents
|
||||
|
||||
Just like Document Types, there is a second attribute for correspondents.
|
||||
It's implemented in SeedDMS just like document types.
|
||||
|
||||
## Folder hierachy
|
||||
|
||||
Paperless does not have folders. Consequently, SeedDMS disolves its folder
|
||||
|
@ -75,4 +116,35 @@ upload folder. Moving documents at its right place must be done within SeedDMS.
|
|||
Which documents are actually visible also depends on which root folder is used.
|
||||
The root folder can be set in the configuration or can be the user's home folder.
|
||||
|
||||
Well, paperless seems to have a different concept called 'storage path'. Though
|
||||
that's not like folder paths in SeedDMS but it's worth a try to map the both.
|
||||
Since version 1.2.0 of this extension, there storage paths will resolve on folder
|
||||
paths in SeedDMS.
|
||||
|
||||
## Searching for documents
|
||||
|
||||
The extension enforces any search to be limited to released documents.
|
||||
|
||||
## Searching for similar documents
|
||||
|
||||
There is some experimental support for searching for similar documents. This
|
||||
is done by extracting the most frequent words from the content and using them
|
||||
to issue a second query with this list of words. Since this list of most frequent
|
||||
words can be very long it will be reduced. For a word to qualify for the
|
||||
query
|
||||
|
||||
* it must be longer than 4 characters
|
||||
* have a frequency greater 2
|
||||
|
||||
If less than five words meet these conditions, the list will be filled up with
|
||||
subsequent words from the most frequent word list. If the than executed query
|
||||
doesn't yield a result the list will be diminished again word by word until the
|
||||
search succeeds or the query is empty.
|
||||
|
||||
## Changing meta data
|
||||
|
||||
The app paperless-mobile has support for editing meta data and even the content
|
||||
of a document. Currently, this extension only supports editing the correspondent
|
||||
and the tags of a document. All other changes made in paperless mobile we be
|
||||
disregarded.
|
||||
|
||||
|
|
82
changelog.md
82
changelog.md
|
@ -1,3 +1,85 @@
|
|||
Changes in version 1.4.0
|
||||
==========================
|
||||
|
||||
- lots of changes to be compatible with Slim 4 which was introduced
|
||||
in SeedDMS 5.1.37 and 6.0.30
|
||||
|
||||
Changes in version 1.3.0
|
||||
==========================
|
||||
|
||||
- use get() and set() to access elements of container
|
||||
(in preparation for Slim4)
|
||||
- add page for listing stored views
|
||||
- show correspondent as badge in document list view
|
||||
|
||||
Changes in version 1.2.3
|
||||
==========================
|
||||
|
||||
- better check for fulltext index, issue warning in settings if fulltext
|
||||
search is turned off
|
||||
|
||||
Changes in version 1.2.2
|
||||
==========================
|
||||
|
||||
- requires SeedDMS 5.1.34 or 6.0.27
|
||||
|
||||
Changes in version 1.2.1
|
||||
==========================
|
||||
|
||||
- implement /api/documents/{id}/
|
||||
|
||||
Changes in version 1.2.0
|
||||
==========================
|
||||
|
||||
- add filtering 'not set' or 'any value' for correspondent
|
||||
- editing meta data can set correspondent
|
||||
- create list of storage paths from path of folders
|
||||
- turn off facets in route 'statistics'
|
||||
- saved views can be changed
|
||||
- fix getting number of documents in inbox
|
||||
|
||||
Changes in version 1.1.5
|
||||
==========================
|
||||
|
||||
- make it work with paperless mobile >=3.0.2
|
||||
- fix downloading of original document
|
||||
|
||||
Changes in version 1.1.4
|
||||
==========================
|
||||
|
||||
- fix regression in searching documents
|
||||
|
||||
Changes in version 1.1.3
|
||||
==========================
|
||||
|
||||
- fix color of labels
|
||||
- return json array with element `non_field_errors` when login with
|
||||
token failed
|
||||
- convert none pdf documents to pdf when downloading them (must be
|
||||
configured)
|
||||
|
||||
Changes in version 1.1.2
|
||||
==========================
|
||||
|
||||
- date of modification is taken from upload date of version
|
||||
- add filtering by modification date
|
||||
- support sorting by correspondent
|
||||
- show warning on settings page if jwt secret is not set
|
||||
|
||||
Changes in version 1.1.1
|
||||
==========================
|
||||
|
||||
- some more logging
|
||||
- rename class.Paperless.php to class.PaperlessView.php
|
||||
|
||||
Changes in version 1.1.0
|
||||
==========================
|
||||
|
||||
- add support for correspondents and document types
|
||||
- use document id as archive serial number
|
||||
- return only released documents
|
||||
- add experimental support for searching for similar docs
|
||||
|
||||
Changes in version 1.0.0
|
||||
==========================
|
||||
|
||||
|
|
|
@ -2,22 +2,16 @@
|
|||
/**
|
||||
* Implementation of a paperless view
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @license GPL2
|
||||
* @subpackage paperless
|
||||
* @license GPL3
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2023 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class to represent a paperless view
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2022 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
class SeedDMS_PaperlessView { /* {{{ */
|
||||
/**
|
||||
|
@ -115,6 +109,10 @@ class SeedDMS_PaperlessView { /* {{{ */
|
|||
return $this->_view;
|
||||
} /* }}} */
|
||||
|
||||
public function setView($view) { /* {{{ */
|
||||
$this->_view = $view;
|
||||
} /* }}} */
|
||||
|
||||
/*
|
||||
* Add a new to the database.
|
||||
*
|
||||
|
@ -128,6 +126,11 @@ class SeedDMS_PaperlessView { /* {{{ */
|
|||
return false;
|
||||
}
|
||||
$this->_id = $db->getInsertID();
|
||||
} else {
|
||||
$queryStr = "UPDATE `tblPaperlessView` SET `view`=".$db->qstr(json_encode($this->_view))." WHERE `id`=".$this->_id;
|
||||
if (!$db->getResult($queryStr)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return self::getInstance($this->_id, $this->_dms);
|
1122
class.paperless.php
1122
class.paperless.php
File diff suppressed because it is too large
Load Diff
31
conf.php
31
conf.php
|
@ -3,13 +3,13 @@ $EXT_CONF['paperless'] = array(
|
|||
'title' => 'Paperless RestAPI',
|
||||
'description' => 'This extension adds additional rest api routes to make it behave like a paperless server. Just use the regular paperless apps, .e.g paperless mobile to access SeedDMS.',
|
||||
'disable' => false,
|
||||
'version' => '1.0.0',
|
||||
'releasedate' => '2023-02-05',
|
||||
'version' => '1.4.0',
|
||||
'releasedate' => '2025-02-27',
|
||||
'author' => array('name'=>'Uwe Steinmann', 'email'=>'uwe@steinmann.cx', 'company'=>'MMK GmbH'),
|
||||
'config' => array(
|
||||
'rootfolder' => array(
|
||||
'title'=>'Folder used as root folder',
|
||||
'help'=>'This is the folder used as the base folder. Documens not below this folder will be not shown by the papeerless mobile app. Uploaded documents will be saved into this folder, unless the dedicated upload folder is set.',
|
||||
'help'=>'This is the folder used as the base folder. Documens not below this folder will not be shown by the paperless mobile app. Uploaded documents will be saved into this folder, unless the dedicated upload folder is set.',
|
||||
'type'=>'select',
|
||||
'internal'=>'folders',
|
||||
),
|
||||
|
@ -26,7 +26,7 @@ $EXT_CONF['paperless'] = array(
|
|||
),
|
||||
'jwtsecret' => array(
|
||||
'title'=>'Secret for JSON Web Token',
|
||||
'help'=>'This is used for creating a token which is needed to authenticate by token',
|
||||
'help'=>'This is used for creating a secret which is needed to authenticate by token',
|
||||
'type'=>'password',
|
||||
),
|
||||
'tokenlivetime' => array(
|
||||
|
@ -50,9 +50,30 @@ $EXT_CONF['paperless'] = array(
|
|||
'options'=>['title'=>'Title', 'content'=>'Content'],
|
||||
'allow_empty'=>true,
|
||||
),
|
||||
'correspondentsattr' => array(
|
||||
'title'=>'Attribute for storing the correspondent',
|
||||
'help'=>'This attribute stores the correspondent of a document and must have a list of correspondents.',
|
||||
'type'=>'select',
|
||||
'internal'=>'attributedefinitions',
|
||||
'objtype'=>'2',
|
||||
'allow_empty'=>true,
|
||||
),
|
||||
'documenttypesattr' => array(
|
||||
'title'=>'Attribute for storing the document type',
|
||||
'help'=>'This attribute stores the document type of a document and must have a list of types.',
|
||||
'type'=>'select',
|
||||
'internal'=>'attributedefinitions',
|
||||
'objtype'=>'2',
|
||||
'allow_empty'=>true,
|
||||
),
|
||||
'converttopdf' => array(
|
||||
'title'=>'Convert to PDF',
|
||||
'type'=>'checkbox',
|
||||
'help'=>"Enable, if you want non pdf documents to be converted to PDF if they are downloaded. Usually, this is only done for preview.",
|
||||
),
|
||||
),
|
||||
'constraints' => array(
|
||||
'depends' => array('php' => '7.4.0-', 'seeddms' => array('5.1.29-5.1.99', '6.0.22-6.0.99')),
|
||||
'depends' => array('php' => '7.4.0-', 'seeddms' => array('5.1.34-5.1.37', '6.0.30-6.0.99', '6.1.0-6.1.99')),
|
||||
),
|
||||
'icon' => 'icon.svg',
|
||||
'changelog' => 'changelog.md',
|
||||
|
|
34
lang.php
34
lang.php
|
@ -1,18 +1,52 @@
|
|||
<?php
|
||||
$__lang['en_GB'] = array(
|
||||
'paperless'=>'Paperless',
|
||||
'paperless_upload_succeded'=>'Upload succeded',
|
||||
'paperless_upload_failed'=>'Upload failed',
|
||||
'paperless_missing_target_folder'=>'Missing target folder',
|
||||
'paperless_no_files_uploaded'=>'No files uploaded',
|
||||
'paperless_upload_maxsize'=>'Max file size exceeded',
|
||||
'paperless_token_has_expired'=>'Token has expired. Login again before you proceed.',
|
||||
'paperless_jwtsecret_not_set'=>'The secret for the JSON Web Token is not set. This is required for successful login.',
|
||||
'paperless_needs_fulltextsearch'=>'The extension needs fulltext search to be on.',
|
||||
'paperless_views'=>'Paperless',
|
||||
'paperless_view_name'=>'Name',
|
||||
'paperless_view_rules'=>'Rules',
|
||||
'paperless_view_sort_by'=>'Sort by',
|
||||
'paperless_view_dashboard'=>'Dashboard',
|
||||
'paperless_view_sidebar'=>'Sidebar',
|
||||
'paperless_view_rule_13'=>'Added until',
|
||||
'paperless_view_rule_14'=>'Added from',
|
||||
'paperless_view_rule_8'=>'Created until',
|
||||
'paperless_view_rule_9'=>'Created from',
|
||||
'paperless_view_rule_6'=>'Category',
|
||||
'paperless_view_rule_3'=>'Correspondent',
|
||||
'paperless_view_rule_19'=>'Title & Content',
|
||||
'paperless_view_rule_20'=>'Advanced Search',
|
||||
);
|
||||
$__lang['de_DE'] = array(
|
||||
'paperless'=>'Paperless',
|
||||
'paperless_upload_succeded'=>'Erfolgreich hochgeladen',
|
||||
'paperless_upload_failed'=>'Hochladen fehlgeschlagen',
|
||||
'paperless_missing_target_folder'=>'Zielordner nicht vorhanden',
|
||||
'paperless_no_files_uploaded'=>'Keine Dateien hochgeladen',
|
||||
'paperless_upload_maxsize'=>'Maximale Dateigröße überschritten',
|
||||
'paperless_token_has_expired'=>'Token abgelaufen. Melden Sie sich bitte neu an.',
|
||||
'paperless_jwtsecret_not_set'=>'Das Geheimnis des JSON Web Token ist nicht gesetzt. Dies ist für eine erfolgreiche Anmeldung erforderlich.',
|
||||
'paperless_needs_fulltextsearch'=>'Die Erweiterung erfordert eine konfigurierte Volltextsuche .',
|
||||
'paperless_views'=>'Paperless',
|
||||
'paperless_view_name'=>'Name',
|
||||
'paperless_view_rules'=>'Regeln',
|
||||
'paperless_view_sort_by'=>'Sortiere nach',
|
||||
'paperless_view_dashboard'=>'Dashboard',
|
||||
'paperless_view_sidebar'=>'Sidebar',
|
||||
'paperless_view_rule_13'=>'Hinzugefügt bis',
|
||||
'paperless_view_rule_14'=>'Hinzugefügt von',
|
||||
'paperless_view_rule_8'=>'Ausgestellt bis',
|
||||
'paperless_view_rule_9'=>'Ausgestellt von',
|
||||
'paperless_view_rule_6'=>'Kategorie',
|
||||
'paperless_view_rule_3'=>'Korrepondent',
|
||||
'paperless_view_rule_19'=>'Titel & Inhalt',
|
||||
'paperless_view_rule_20'=>'Erweiterte Suche',
|
||||
);
|
||||
|
||||
|
|
69
out/out.PaperlessViews.php
Normal file
69
out/out.PaperlessViews.php
Normal file
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
/**
|
||||
* MyDMS. Document Management System
|
||||
* Copyright (C) 2002-2005 Markus Westphal
|
||||
* Copyright (C) 2006-2008 Malcolm Cowe
|
||||
* Copyright (C) 2010-2011 Matteo Lucarelli
|
||||
* Copyright (C) 2010-2024 Uwe Steinmann
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
if(!empty($_SERVER['SEEDDMS_HOME']))
|
||||
require_once($_SERVER['SEEDDMS_HOME'].'/inc/inc.Settings.php');
|
||||
else
|
||||
require_once("../../../inc/inc.Settings.php");
|
||||
require_once("inc/inc.Utils.php");
|
||||
require_once("inc/inc.LogInit.php");
|
||||
require_once("inc/inc.Language.php");
|
||||
require_once("inc/inc.Init.php");
|
||||
require_once("inc/inc.Extension.php");
|
||||
require_once("inc/inc.DBInit.php");
|
||||
require_once("inc/inc.ClassUI.php");
|
||||
require_once("inc/inc.Authentication.php");
|
||||
|
||||
require_once('ext/paperless/class.PaperlessView.php');
|
||||
|
||||
$tmp = explode('.', basename($_SERVER['SCRIPT_FILENAME']));
|
||||
$view = UI::factory($theme, $tmp[1], array('dms' => $dms, 'user' => $user));
|
||||
|
||||
$v = new SeedDMS_Version();
|
||||
if($v->majorVersion() > 5) {
|
||||
$accessop = new SeedDMS_AccessOperation($dms, $user, $settings);
|
||||
if (!$accessop->check_view_access($view, $_GET)) {
|
||||
UI::exitError(getMLText("admin_tools"), getMLText("access_denied"));
|
||||
}
|
||||
} else
|
||||
$accessop = new SeedDMS_AccessOperation($dms, null, $user, $settings);
|
||||
|
||||
$pview = null;
|
||||
if (isset($_GET["view"])) {
|
||||
$pview = SeedDMS_PaperlessView::getInstance($_GET['view'], $dms);
|
||||
}
|
||||
|
||||
if($view) {
|
||||
$view->setParam('accessobject', $accessop);
|
||||
$view->setParam('showtree', showtree());
|
||||
$view->setParam('pview', $pview);
|
||||
$view->setParam('fulltextservice', $fulltextservice);
|
||||
$view->setParam('logger', $logger);
|
||||
$view->setParam('conversionmgr', $conversionmgr);
|
||||
$view->setParam('previewWidthList', $settings->_previewWidthList);
|
||||
$view->setParam('previewconverters', $settings->_converters['preview']);
|
||||
$view->setParam('timeout', $settings->_cmdTimeout);
|
||||
$view($_GET);
|
||||
exit;
|
||||
}
|
||||
|
|
@ -1,5 +1,17 @@
|
|||
Create a file credentials and define AUTH and URL in it.
|
||||
URL is the base url of the restapi service. AUTH are the credentials
|
||||
as pass in http header Authorization. It can be ab basic authentication,
|
||||
a papeerless or a regular SeedDMS token.
|
||||
# Testing the API
|
||||
|
||||
These scripts can be used to test almost all endpoints of the
|
||||
paperless-ngx API.
|
||||
|
||||
In order to use them, create a file `credentials` and define `AUTH` and
|
||||
`URL` in it. `URL` is the base url of the restapi service. `AUTH` contains
|
||||
the credentials passed in the http header `Authorization`. It can be a basic
|
||||
authentication, a paperless token or a regular SeedDMS key.
|
||||
|
||||
Example:
|
||||
|
||||
URL="http://my.seeddms.org/restapi/index.php"
|
||||
AUTH="my seeddms api key"
|
||||
#AUTH="Token <paperless token>"
|
||||
#AUTH="Basic <credentials>"
|
||||
|
||||
|
|
14
tests/credentials.example
Normal file
14
tests/credentials.example
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Create a token by running `./test-token.sh login password`
|
||||
URL="http://192.168.178.25:8000"
|
||||
AUTH="Token fe34a1f210f561c3599641035c1bbcd2c2bbc8b3"
|
||||
|
||||
#URL="https://your-server/restapi/index.php"
|
||||
#AUTH="your api key"
|
||||
|
||||
# Credentials for local seeddms uses Basic auth with admin:admin
|
||||
URL="https://seeddms.steinmann.cx/restapi/index.php"
|
||||
AUTH="Basic YWRtaW46YWRtaW4="
|
||||
|
||||
# Credentials for demo6 seeddms uses Basic auth with admin:admin
|
||||
#URL="https://demo6.seeddms.org/restapi/index.php"
|
||||
#AUTH="Basic YWRtaW46YWRtaW4="
|
7
tests/test-correspondents.sh
Executable file
7
tests/test-correspondents.sh
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/correspondents/" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
||||
|
|
@ -2,4 +2,6 @@
|
|||
|
||||
. ./credentials
|
||||
|
||||
curl -L --silent "${URL}/fetch/doc/23311" -H "Authorization: ${AUTH}" --output 23311.pdf
|
||||
DOCID=22833
|
||||
|
||||
curl -L --silent "${URL}/fetch/doc/${DOCID}" -H "Authorization: ${AUTH}" --output ${DOCID}.pdf
|
||||
|
|
6
tests/test-documents-correspondent-any.sh
Executable file
6
tests/test-documents-correspondent-any.sh
Executable file
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/documents/?format=json&page=1&correspondent__isnull=0&page_size=15&ordering=-added" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
6
tests/test-documents-like.sh
Executable file
6
tests/test-documents-like.sh
Executable file
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/documents/?format=json&more_like_id=19245&page=1&page_size=5&ordering=-added" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
|
@ -2,5 +2,6 @@
|
|||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/documents/?format=json&query=added:%5B-70%20day%20to%20now%5D&is_tagged=0&page=3&page_size=5&ordering=-added" -H "Authorization: ${AUTH}" | jq '.'
|
||||
curl --silent "${URL}/api/documents/?format=json&_query=added:%5B-70%20day%20to%20now%5D&is_tagged=0&document_type__id=1&page=1&page_size=5&ordering=-added" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
||||
#curl --silent "${URL}/api/documents/?format=json&query=barbaradio&page=3&page_size=5&ordering=-added" -H "Authorization: ${AUTH}" | jq '.'
|
||||
|
|
7
tests/test-documenttypes.sh
Executable file
7
tests/test-documenttypes.sh
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/document_types/" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
||||
|
10
tests/test-patch-saved-view.sh
Executable file
10
tests/test-patch-saved-view.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent -X PATCH "${URL}/api/saved_views/" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H "Authorization: ${AUTH}" \
|
||||
-d '{"id":0,"name":"autoview","username":"admin","password":"admin"}'
|
||||
# | jq '.'
|
||||
|
7
tests/test-storagepaths.sh
Executable file
7
tests/test-storagepaths.sh
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/storage_paths/" -H "Authorization: ${AUTH}"
|
||||
#| jq '.'
|
||||
|
|
@ -2,7 +2,16 @@
|
|||
|
||||
. ./credentials
|
||||
|
||||
USERNAME="admin"
|
||||
if [ -n "$1" ]; then
|
||||
USERNAME=$1
|
||||
fi
|
||||
PASSWORD="admin"
|
||||
if [ -n "$2" ]; then
|
||||
PASSWORD=$2
|
||||
fi
|
||||
JSON="{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}"
|
||||
curl --silent -X POST "${URL}/api/token/" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"username":"admin","password":"admin"}' | jq '.'
|
||||
-d $JSON | jq '.'
|
||||
|
||||
|
|
6
tests/test-ui-settings.sh
Executable file
6
tests/test-ui-settings.sh
Executable file
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
. ./credentials
|
||||
|
||||
curl --silent "${URL}/api/ui_settings/" -H "Authorization: ${AUTH}" | jq '.'
|
||||
|
363
views/bootstrap/class.PaperlessViews.php
Normal file
363
views/bootstrap/class.PaperlessViews.php
Normal file
|
@ -0,0 +1,363 @@
|
|||
<?php
|
||||
/**
|
||||
* Implementation of PaperlessViews view
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @license GPL 2
|
||||
* @version @version@
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2017 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class which outputs the html page for PaperlessViews view
|
||||
*
|
||||
* @category DMS
|
||||
* @package SeedDMS
|
||||
* @author Uwe Steinmann <uwe@steinmann.cx>
|
||||
* @copyright Copyright (C) 2017 Uwe Steinmann
|
||||
* @version Release: @package_version@
|
||||
*/
|
||||
class SeedDMS_View_PaperlessViews extends SeedDMS_Bootstrap_Style {
|
||||
|
||||
function js() { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$onepage = $this->params['onepage'];
|
||||
header('Content-Type: application/javascript');
|
||||
parent::jsTranslations(array('cancel', 'splash_move_document', 'confirm_move_document', 'move_document', 'confirm_transfer_link_document', 'transfer_content', 'link_document', 'splash_move_folder', 'confirm_move_folder', 'move_folder'));
|
||||
?>
|
||||
$(document).ready(function() {
|
||||
$('body').on('click', '.view', function(ev){
|
||||
ev.preventDefault();
|
||||
$('#paperless_view.ajax').trigger('update', {view: $(this).data('view')});
|
||||
});
|
||||
});
|
||||
<?php
|
||||
if($onepage) {
|
||||
$this->printClickDocumentJs();
|
||||
}
|
||||
$this->printDeleteDocumentButtonJs();
|
||||
} /* }}} */
|
||||
|
||||
protected function printListHeader($previewer, $order=false) { /* {{{ */
|
||||
print "<table class=\"table table-condensed table-sm\">";
|
||||
print "<thead>\n<tr>\n";
|
||||
print "<th></th>\n";
|
||||
if($order) {
|
||||
$orderby = ''; //$this->params['orderby'];
|
||||
$orderdir = ''; //$this->params['orderdir'];
|
||||
|
||||
print "<th><a data-action=\"".$order."\" data-orderby=\"n\" data-orderdir=\"".($orderdir == 'desc' ? '' : 'desc')."\">".getMLText("name")."</a> ".($orderby == 'n' || $orderby == '' ? ($orderdir == 'desc' ? '<i class="icon-arrow-up"></i>' : '<i class="icon-arrow-down"></i>') : '')." · <a data-action=\"".$order."\" data-orderby=\"u\" data-orderdir=\"".($orderdir == 'desc' ? '' : 'desc')."\">".getMLText("last_update")."</a> ".($orderby == 'u' ? ($orderdir == 'desc' ? '<i class="icon-arrow-up"></i>' : '<i class="icon-arrow-down"></i>') : '')." · <a data-action=\"".$order."\" data-orderby=\"e\" data-orderdir=\"".($orderdir == 'desc' ? '' : 'desc')."\">".getMLText("expires")."</a> ".($orderby == 'e' ? ($orderdir == 'desc' ? '<i class="icon-arrow-up"></i>' : '<i class="icon-arrow-down"></i>') : '')."</th>\n";
|
||||
} else
|
||||
print "<th>".getMLText("name")."</th>\n";
|
||||
if($order)
|
||||
print "<th><a data-action=\"".$order."\" data-orderby=\"s\" data-orderdir=\"".($orderdir == 'desc' ? '' : 'desc')."\">".getMLText("status")."</a>".($orderby == 's' ? " ".($orderdir == 'desc' ? '<i class="icon-arrow-up"></i>' : '<i class="icon-arrow-down"></i>') : '')."</th>\n";
|
||||
else
|
||||
print "<th>".getMLText("status")."</th>\n";
|
||||
print "<th>".getMLText("action")."</th>\n";
|
||||
print "</tr>\n</thead>\n<tbody>\n";
|
||||
} /* }}} */
|
||||
|
||||
protected function printListFooter() { /* {{{ */
|
||||
echo "</tbody>\n</table>";
|
||||
} /* }}} */
|
||||
|
||||
private function getSearchParameter($data) { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
|
||||
$categories = array();
|
||||
$categorynames = array();
|
||||
$astart = null;
|
||||
$aend = null;
|
||||
$mstart = null;
|
||||
$mend = null;
|
||||
$startfolder = $dms->getRootFolder();
|
||||
$rootfolder = $dms->getRootFolder();
|
||||
$cattrs = [];
|
||||
$query = '';
|
||||
foreach ($data['filter_rules'] as $rule) {
|
||||
switch ($rule['rule_type']) {
|
||||
case 3:
|
||||
$correspondent = null;
|
||||
if(!empty($settings->_extensions['paperless']['correspondentsattr']) && $attrdef = $dms->getAttributeDefinition($settings->_extensions['paperless']['correspondentsattr'])) {
|
||||
$valueset = $attrdef->getValueSetAsArray();
|
||||
if(isset($valueset[$rule['value']-1])) {
|
||||
$correspondent = $valueset[$rule['value']-1];
|
||||
$cattrs['attr_'.$attrdef->getId()] = $correspondent;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
$catid = (int) $rule['value'];
|
||||
if($catid) {
|
||||
if($cat = $dms->getDocumentCategory($catid)) {
|
||||
$categories[] = $cat;
|
||||
$categorynames[] = $cat->getName();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 8:
|
||||
$aend = makeTsFromDate($rule['value']);
|
||||
break;
|
||||
case 9:
|
||||
$astart = makeTsFromDate($rule['value']);
|
||||
break;
|
||||
case 13:
|
||||
$aend = makeTsFromDate($rule['value']);
|
||||
break;
|
||||
case 14:
|
||||
$astart = makeTsFromDate($rule['value']);
|
||||
break;
|
||||
case 19:
|
||||
$query = $rule['value'];
|
||||
break;
|
||||
case 20:
|
||||
$tmp = explode(',', $rule['value']);
|
||||
foreach ($tmp as $t) {
|
||||
if (substr($t, 0, 9) == 'created:[') {
|
||||
$q = substr($t, 9, -1);
|
||||
if($x = explode(' to ', $q, 2)) {
|
||||
$astart = strtotime($x[0]);
|
||||
$aend = strtotime($x[1])+86400;
|
||||
}
|
||||
} elseif (substr($t, 0, 7) == 'added:[') {
|
||||
$q = substr($t, 7, -1);
|
||||
if($x = explode(' to ', $q, 2)) {
|
||||
$astart = strtotime($x[0]);
|
||||
$aend = strtotime($x[1])+86400;
|
||||
}
|
||||
} else {
|
||||
$query = $t;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return [$query, array('record_type'=>['document'], 'status'=>[2], 'user'=>[$user->getLogin()], 'category'=>$categorynames, 'created_start'=>$astart, 'created_end'=>$aend, 'modified_start'=>$mstart, 'modified_end'=>$mend, 'startFolder'=>$startfolder, 'rootFolder'=>$rootfolder, 'attributes'=>$cattrs)];
|
||||
} /* }}} */
|
||||
|
||||
private function printList($data, $previewer) { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
$fulltextservice = $this->params['fulltextservice'];
|
||||
$logger = $this->params['logger'];
|
||||
|
||||
$order = [];
|
||||
$order['dir'] = $data['sort_reverse'] ? 'desc' : 'asc';
|
||||
$orderfield = $data["sort_field"];
|
||||
if(in_array($orderfield, ['modified', 'created', 'title']))
|
||||
$order['by'] = $orderfield;
|
||||
elseif($orderfield == 'added')
|
||||
$order['by'] = 'created';
|
||||
elseif($orderfield == 'archive_serial_number')
|
||||
$order['by'] = 'id';
|
||||
elseif($orderfield == 'correspondent__name') {
|
||||
if(!empty($settings->_extensions['paperless']['correspondentsattr']) && $attrdef = $dms->getAttributeDefinition($settings->_extensions['paperless']['correspondentsattr'])) {
|
||||
$order['by'] = 'attr_'.$attrdef->getId();
|
||||
}
|
||||
}
|
||||
|
||||
list($query, $searchparams) = $this->getSearchParameter($data);
|
||||
|
||||
if($fulltextservice && $index = $fulltextservice->Indexer()) {
|
||||
$lucenesearch = $fulltextservice->Search();
|
||||
$limit = 10;
|
||||
$offset = 0;
|
||||
$logger->log('Query is '.$query, PEAR_LOG_DEBUG);
|
||||
/*
|
||||
$logger->log('User is '.$userobj->getLogin(), PEAR_LOG_DEBUG);
|
||||
$logger->log('limit is '.$limit, PEAR_LOG_DEBUG);
|
||||
$logger->log('offset is '.$offset, PEAR_LOG_DEBUG);
|
||||
*/
|
||||
$searchresult = $lucenesearch->search($query, $searchparams, array('limit'=>$limit, 'offset'=>$offset), $order, array('no_facets'=>true));
|
||||
if($searchresult) {
|
||||
$recs = array();
|
||||
$facets = $searchresult['facets'];
|
||||
$dcount = 0;
|
||||
$fcount = 0;
|
||||
if($searchresult['hits']) {
|
||||
$allids = '';
|
||||
$this->printListHeader($previewer);
|
||||
foreach($searchresult['hits'] as $hit) {
|
||||
if($hit['document_id'][0] == 'D') {
|
||||
if($document = $dms->getDocument((int) substr($hit['document_id'], 1))) {
|
||||
$document->verifyLastestContentExpriry();
|
||||
$v = new SeedDMS_Version();
|
||||
if($v->majorVersion() > 5) {
|
||||
$document->checkForDueRevisionWorkflow($user);
|
||||
}
|
||||
|
||||
$lc = $document->getLatestContent();
|
||||
if($document->getAccessMode($user) >= M_READ && $lc) {
|
||||
$txt = $this->callHook('documentListItem', $document, $previewer, false, 'opentasks');
|
||||
if(is_string($txt))
|
||||
echo $txt;
|
||||
else {
|
||||
/*
|
||||
$errormsg = '';
|
||||
$errorcls = '';
|
||||
if(!$doc['error']) {
|
||||
} else {
|
||||
$errorcls = $doc['error'] < 0 ? " error" : ($doc['error'] === 0 ? " success" : "");
|
||||
$errormsg = $doc['error'];
|
||||
}
|
||||
*/
|
||||
$extracontent = array();
|
||||
$extracontent['below_title'] = $this->getListRowPath($document);
|
||||
echo $this->documentListRowStart($document);
|
||||
echo $this->documentListRow($document, $previewer, true, 0, $extracontent);
|
||||
echo $this->documentListRowEnd($document);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->printListFooter();
|
||||
$logger->log('Result is '.$allids, PEAR_LOG_DEBUG);
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
private function count($data) { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
$fulltextservice = $this->params['fulltextservice'];
|
||||
$logger = $this->params['logger'];
|
||||
|
||||
list($query, $searchparams) = $this->getSearchParameter($data);
|
||||
|
||||
if($fulltextservice && $index = $fulltextservice->Indexer()) {
|
||||
$lucenesearch = $fulltextservice->Search();
|
||||
$limit = 10;
|
||||
$offset = 0;
|
||||
$logger->log('Query is '.$query, PEAR_LOG_DEBUG);
|
||||
/*
|
||||
$logger->log('User is '.$userobj->getLogin(), PEAR_LOG_DEBUG);
|
||||
$logger->log('limit is '.$limit, PEAR_LOG_DEBUG);
|
||||
$logger->log('offset is '.$offset, PEAR_LOG_DEBUG);
|
||||
*/
|
||||
$searchresult = $lucenesearch->search($query, $searchparams, array('limit'=>0, 'offset'=>0), [], array('no_facets'=>true));
|
||||
if($searchresult) {
|
||||
return $searchresult['count'];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} /* }}} */
|
||||
|
||||
public function list() { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
$pview = $this->params['pview'];
|
||||
$cachedir = $this->params['cachedir'];
|
||||
$conversionmgr = $this->params['conversionmgr'];
|
||||
$previewwidth = $this->params['previewWidthList'];
|
||||
$previewconverters = $this->params['previewconverters'];
|
||||
$timeout = $this->params['timeout'];
|
||||
|
||||
$previewer = new SeedDMS_Preview_Previewer($cachedir, $previewwidth, $timeout);
|
||||
if($conversionmgr)
|
||||
$previewer->setConversionMgr($conversionmgr);
|
||||
else
|
||||
$previewer->setConverters($previewconverters);
|
||||
|
||||
if ($pview) {
|
||||
$data = $pview->getView();
|
||||
$this->printList($data, $previewer);
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
private function getFilterValue($rule) { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$settings = $this->params['settings'];
|
||||
|
||||
switch($rule['rule_type']) {
|
||||
case 13: // Added until
|
||||
case 14: // Added from
|
||||
return getReadableDate($rule['value']);
|
||||
case 3: // Correspondent
|
||||
if(!empty($settings->_extensions['paperless']['correspondentsattr']) && $attrdef = $dms->getAttributeDefinition($settings->_extensions['paperless']['correspondentsattr'])) {
|
||||
$valueset = $attrdef->getValueSetAsArray();
|
||||
if(isset($valueset[$rule['value']-1])) {
|
||||
return $valueset[$rule['value']-1];
|
||||
}
|
||||
}
|
||||
return '???';
|
||||
break;
|
||||
case 6: // Category
|
||||
return $dms->getDocumentCategory($rule['value'])->getName();
|
||||
break;
|
||||
default:
|
||||
return $rule['value'];
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
public function show() { /* {{{ */
|
||||
$dms = $this->params['dms'];
|
||||
$user = $this->params['user'];
|
||||
$settings = $this->params['settings'];
|
||||
$session = $this->params['session'];
|
||||
|
||||
$area = 'my_account';
|
||||
$this->htmlStartPage(getMLText("paperless_views"), '', '../../');
|
||||
$this->globalNavigation();
|
||||
$this->contentStart();
|
||||
$this->pageNavigation(getMLText($area), $area);
|
||||
$this->contentHeading(getMLText("paperless_views"));
|
||||
|
||||
$this->rowStart();
|
||||
$this->columnStart(4);
|
||||
$views = SeedDMS_PaperlessView::getAllInstances($user, $dms);
|
||||
|
||||
if($views) {
|
||||
print "<table id=\"paperlessviews-table\" class=\"table table-condensed table-sm table-hover\">";
|
||||
print "<thead>\n<tr>\n";
|
||||
print "<th>".getMLText("paperless_view_name")."</th>\n";
|
||||
print "<th>".getMLText("paperless_view_rules")."</th>\n";
|
||||
print "</tr>\n</thead>\n<tbody>\n";
|
||||
foreach($views as $view) {
|
||||
$data = $view->getView();
|
||||
$c = $this->count($data);
|
||||
echo "<tr class=\"view\" data-view=\"".$data['id']."\"><td><strong>".$data['name']." (".$c.")</strong>";
|
||||
echo "<br>".getMLText('paperless_view_sort_by').": ".$data['sort_field'];
|
||||
if ($data['show_on_dashboard']) {
|
||||
echo "<br>".getMLText('paperless_view_dashboard').': <i class="fa fa-check"></i>';
|
||||
}
|
||||
if ($data['show_in_sidebar']) {
|
||||
echo "<br>".getMLText('paperless_view_sidebar').': <i class="fa fa-check"></i>';
|
||||
}
|
||||
echo "</td>";
|
||||
echo "<td>";
|
||||
foreach ($data['filter_rules'] as $rule) {
|
||||
echo getMLText('paperless_view_rule_'.$rule['rule_type']).": ".$this->getFilterValue($rule)."<br>";
|
||||
}
|
||||
// echo "<pre>";
|
||||
// print_r($data);
|
||||
// echo "</pre>";
|
||||
echo "</td>";
|
||||
echo "</tr>";
|
||||
}
|
||||
echo "</tbody>\n</table>\n";
|
||||
} else {
|
||||
$this->infoMsg(getMLText('upload_area_no_secret_info'));
|
||||
}
|
||||
$this->columnEnd();
|
||||
$this->columnStart(8);
|
||||
echo '<div id="paperless_view" class="ajax" data-base="ext/paperless/" data-view="PaperlessViews" data-action="list"></div>';
|
||||
$this->columnEnd();
|
||||
$this->rowEnd();
|
||||
|
||||
$this->contentEnd();
|
||||
$this->htmlEndPage();
|
||||
} /* }}} */
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user