Compare commits
35 Commits
RewriteAva
...
03a9e1e268
Author | SHA1 | Date | |
---|---|---|---|
03a9e1e268
|
|||
b3b682d8dc
|
|||
2a5c158ac7
|
|||
8de7ec1809
|
|||
952c0b9b1f
|
|||
ab9c955ec1
|
|||
a38ddd46db
|
|||
409f5e3bad
|
|||
05d6865cb3
|
|||
2e349568e7
|
|||
7fd6b18af1
|
|||
e617cd6054
|
|||
829f289d95
|
|||
326af61836
|
|||
3e4554f759
|
|||
014523c17d
|
|||
453a726a9a
|
|||
fe791c2000
|
|||
85ea427242
|
|||
82f01a0961
|
|||
a817b59b9b
|
|||
a141b23608
|
|||
77aeebd90a
|
|||
5eb8d7fd8c
|
|||
947f2cb87b
|
|||
37aecde967
|
|||
c03b276732
|
|||
94f22ec5cb
|
|||
58a450cb9f
|
|||
5f9e9cf5bf
|
|||
38bb26c2be
|
|||
6e9cdf3c95
|
|||
8661848f0c
|
|||
0ba9a3b1ec
|
|||
b0bdf698ab
|
4
.gitmodules
vendored
@ -1,12 +1,12 @@
|
||||
[submodule "classes/MD_STD"]
|
||||
path = classes/MD_STD
|
||||
url = https://gitea.armuli.eu/museum-digital/MD_STD.git
|
||||
url = gitea:museum-digital/MD_STD.git
|
||||
[submodule "classes/MDErrorReporter"]
|
||||
path = classes/MDErrorReporter
|
||||
url = gitea:museum-digital/MDErrorReporter.git
|
||||
[submodule "classes/MDAllowedValueSets"]
|
||||
path = classes/MDAllowedValueSets
|
||||
url = https://gitea.armuli.eu/museum-digital/MDAllowedValueSets.git
|
||||
url = gitea:museum-digital/MDAllowedValueSets.git
|
||||
[submodule "classes/MDTlLoader"]
|
||||
path = classes/MDTlLoader
|
||||
url = gitea:museum-digital/MDTlLoader.git
|
||||
|
34
.htaccess
@ -1,34 +0,0 @@
|
||||
RewriteEngine On # Turn on the rewriting engine
|
||||
|
||||
# Disallow access to the given subfolders
|
||||
RewriteRule ^(\.git|conf|vendor/|composer\.json|composer\.lock|functions) - [F,L,NC]
|
||||
|
||||
# Only allow GET|HEAD|POST
|
||||
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|OPTIONS)
|
||||
RewriteRule .? - [F]
|
||||
|
||||
# RewriteCond %{REQUEST_URI} output=json
|
||||
# RewriteRule ^.*$ - [ENV=LONGCACHE:true]
|
||||
# Header set Access-Control-Allow-Origin "*" env=LONGCACHE
|
||||
# Header set Access-Control-Allow-Methods "GET, OPTIONS" env=LONGCACHE
|
||||
# Header set Access-Control-Allow-Headers "X-PINGOTHER, Content-Type, Accept-Encoding, cache-control" env=LONGCACHE
|
||||
# Header set Access-Control-Max-Age "86400" env=LONGCACHE
|
||||
HEADER set X-Frame-Options DENY env=LONGCACHE
|
||||
|
||||
# RewriteCond %{REQUEST_FILENAME} -f
|
||||
# RewriteRule ^(.+)\.pdf$ /cgi-bin/pdf.php?file=$1 [L,NC,QSA]
|
||||
|
||||
# Disallow execution of the following types of scripts
|
||||
RemoveHandler cgi-script .pl .py .cgi .sh
|
||||
|
||||
## MAIN DEFAULTS
|
||||
Options -Indexes
|
||||
DirectoryIndex index.php
|
||||
|
||||
# Set deailt charset
|
||||
AddDefaultCharset UTF-8
|
||||
|
||||
# Set content and feature security headers
|
||||
Header set Content-Security-Policy "default-src 'none'; connect-src 'none'; script-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; frame-src 'none'; frame-ancestors 'none'; object-src 'none'; base-uri 'self'; form-action 'self';"
|
||||
Header set Feature-Policy "midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker *; payment 'none'; fullscreen 'none'; geolocation 'none';"
|
||||
|
661
LICENSE
Normal file
@ -0,0 +1,661 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
10
README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Validator for the standard csv format for imports to museum-digital
|
||||
|
||||
# Development
|
||||
|
||||
To update, run `scripts/compile.php`.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- [JSZip](https://github.com/Stuk/jszip), dual-licensed under MIT & GPLv3
|
||||
- [PapaParse](https://github.com/mholt/PapaParse), licensed under the MIT license
|
17
TODO.md
@ -1,17 +0,0 @@
|
||||
# Project: Rewrite CSVXML with Rust
|
||||
|
||||
## Step 1: Rewriting classes/CsvxmlAvailableFields.php
|
||||
|
||||
- New class for fieldentries
|
||||
- use tlloader: $eventname[1] -> $tlLoader->tl("eventtype-name", "eventname", "1")
|
||||
- __toArray(){}
|
||||
|
||||
## Step 2: Rewrite Validationprocess in index3.php
|
||||
|
||||
### FFI with Rust
|
||||
|
||||
- https://www.php.net/manual/en/class.ffi.php
|
||||
- https://www.php.net/manual/en/ffi.examples-basic.php
|
||||
- https://platform.sh/blog/2020/php-fun-with-ffi-getting-rust-ic/
|
||||
|
||||
## Step 3: Remove fnam Parameter
|
@ -1,49 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* Contains a helper class for validation errors.
|
||||
*
|
||||
* @author Nathan Eikermann <nathan@museum-digital.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
/**
|
||||
* Class holding the information about various errors
|
||||
* that can occur during validation
|
||||
*/
|
||||
final class CSVXMLValidator
|
||||
{
|
||||
public array $error_msgs;
|
||||
public array $inv_errors;
|
||||
public array $depcon_errors;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->error_msgs = [];
|
||||
$this->inv_errors = [];
|
||||
$this->depcon_errors = [];
|
||||
}
|
||||
|
||||
public function addError(String $error)
|
||||
{
|
||||
$this->error_msgs[] = $error;
|
||||
}
|
||||
|
||||
public function addInvError(String $error)
|
||||
{
|
||||
$this->inv_errors[] = $error;
|
||||
}
|
||||
|
||||
public function addDepconError(String $error)
|
||||
{
|
||||
$this->depcon_errors[] = $error;
|
||||
}
|
||||
|
||||
public function overallErrorCount(): int
|
||||
{
|
||||
return count($this->error_msgs)
|
||||
+ count($this->inv_errors)
|
||||
+ count($this->depcon_errors);
|
||||
}
|
||||
}
|
@ -9,24 +9,27 @@ declare(strict_types = 1);
|
||||
/**
|
||||
* Class holding the information for a field entry.
|
||||
*/
|
||||
final class FieldEntry
|
||||
{
|
||||
public bool $required;
|
||||
public array $allowedValues;
|
||||
public array $dependsOn;
|
||||
public string $remark;
|
||||
public string $name_human_readable;
|
||||
public string $explica;
|
||||
final class FieldEntry {
|
||||
|
||||
public readonly bool $required;
|
||||
public readonly string $remark;
|
||||
public readonly string $name_human_readable;
|
||||
public readonly string $explica;
|
||||
|
||||
/** @var array<string> */
|
||||
public readonly array $allowedValues;
|
||||
/** @var array<string> */
|
||||
public readonly array $dependsOn;
|
||||
|
||||
/**
|
||||
* Function for constructing a new FieldEntry Object.
|
||||
*
|
||||
* @param bool $required True if the field is required.
|
||||
* @param array $allowedValues Array of allowed values.
|
||||
* @param array $dependsOn Array of fields the entry depends on.
|
||||
* @param string $remark String variable.
|
||||
* @param string $name_human_readable Human readable translation.
|
||||
* @param string $explica String variable
|
||||
* @param boolean $required True if the field is required.
|
||||
* @param array<string> $allowedValues Array of allowed values.
|
||||
* @param array<string> $dependsOn Array of fields the entry depends on.
|
||||
* @param string $remark Remark.
|
||||
* @param string $name_human_readable Human readable translation.
|
||||
* @param string $explica Explanation.
|
||||
*/
|
||||
public function __construct(
|
||||
bool $required, array $allowedValues,
|
||||
@ -41,5 +44,4 @@ final class FieldEntry
|
||||
$this->explica = $explica;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Current location','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Home location','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Weitere Objektbezeichnung','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Nähere Lokalisation','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Beschriftung/Aufschrift','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Länge','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Höhe','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Breite','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Gewicht','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Durchmesser','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wandung','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['Seitenzahl','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['Stückzahl','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Vergleichsobjekte','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Eingangsnummer','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Weitere Inventarnummer','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Teil von','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Sachgruppe','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Systematik','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Vorbesitzer','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Zugangszeitpunkt','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Zugangsart','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Zugangswert','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Objektgeschichte','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Schätzwert, wann','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Schätzwert, von','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Schätzwert, Höhe','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Versicherungswert, wann','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Versicherungswert, von','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Versicherungswert, Höhe','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Zustand (kurz)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restaurierung','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Aktueller Aufenthalt','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Eigentlicher Standort','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Ausstellung, wann ... wo ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Aktuell verliehen an','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Ansprechpartner (Leihe)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['Verliehen (von-bis)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Versicherungswert (Leihe)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Leihvorgang, Anmerkung','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Urheberrecht','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Nutzungsrecht','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rechte, Anmerkung','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Kurznotiz','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Notiz','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Ansichten im Museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Dokumente im Museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Ausführliche Beschreibung','detaileddescription2','detaileddescription2','objektplus','Ausführliche Beschreibung'];
|
||||
$searchvar[47] = ['Erwerbender','erwerbender','erwerbender','objektverwaltung','Erwerbender'];
|
||||
$searchvar[48] = ['Ort des Erwerbs','erwerbungsort','erwerbungsort','objektverwaltung','Ort des Erwerbs'];
|
||||
$searchvar[49] = ['Ersterfasst von','ersterfasser','ersterfasser','objektverwaltung','Ersterfasser'];
|
||||
$searchvar[50] = ['Ersterfasst am','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','Ersterfassung'];
|
||||
$searchvar[51] = ['Stempelstellung','stempelstellung','mass2_stempelstellung','objektplus','Stempelstellung'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (getrennt)'];
|
||||
$searchvar[53] = ['Technik','technik','technik2','objektplus','Technik (getrennt)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Current location','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Home location','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['További megnevezés','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Pontos helyszín','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Felirat/szignó','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Hosszúság','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Magasság','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Mélység','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Súly','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Átmérő','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Falvastagság','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['Oldalszám','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['Darabszám','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Hasonló tárgyak','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Gyarapodási napló szám','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['További leltári számok','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Gyűjtemény','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Együttes','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Szakcsoport','sachgruppe','sachgruppe','objektverwaltung','Szakcsoport'];
|
||||
$searchvar[17] = ['Jellemzők','systematik','systematik','objektverwaltung','Jellemzők'];
|
||||
$searchvar[18] = ['Az átadó neve','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['A megszerzés ideje','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['A megszerzés módja','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Vételár','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Átadó adatai','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Értékmeghatározás dátuma','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Értékmeghatározó','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Érték (összeg)','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['A bizt. érték meghat. dátuma','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['A bizt. ért. meghatározó','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Biztosítási érték','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Állapot (rövid leírás)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restaurálás/ preparálás','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Aktuális elhelyezés','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Állandó őrzési hely','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Kiállítástörténet (dátum, helyszín)','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Kölcsönvevő','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Kapcsolattartó (Kölcsön)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['Kölcsönzés kezdete és vége','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Biztosítási érték','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Haszonkölcsönnel kapcsolatos megjegyzések','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Szerzői jogok','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Felhasználási jogok','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Státusz','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Fontos megjegyzés','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Jegyzetek','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['A tárgyról készült képek','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['A tárgyról készült egyéb dokumentációk','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Szakmai leírás','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Gyűjtő','erwerbender','erwerbender','objektverwaltung','Gyűjtő'];
|
||||
$searchvar[48] = ['Lelőhely','erwerbungsort','erwerbungsort','objektverwaltung','Lelőhely'];
|
||||
$searchvar[49] = ['Leltározó','ersterfasser','ersterfasser','objektverwaltung','Leltározó'];
|
||||
$searchvar[50] = ['Letározás dátuma','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Anyag','material','material2','objektplus','Anyag'];
|
||||
$searchvar[53] = ['Technika','technik','technik2','objektplus','Technika'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Judul benda alternatif','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Lokasi persis','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Prasasti','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Panjang','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Tinggi','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Lebar','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Massa','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Dinding','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# halaman','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# potongan','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Benda serupa','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Nomor pemasukan','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Nomor invenarisasi alternatif','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Bagian','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Kelompok subyek','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Klasifikasi','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Pemilik lama','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Tanggal pemasukan','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Cara pemasukan','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Nilai pemasukan / pembelian','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Sejarah benda','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Nilai diperkirakan, pada','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Nilai diperkirakan, oleh','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Nilai diperkirakan, jumlah','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Nilai asuransi, pada','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Nilai asuransi, oleh','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Nilai asuransi, jumlah','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Kondisi (singkat)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restaurasi','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Lokasi terkini','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Lokasi reguler','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Pameran, pada ... di mana ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Sekarang dipinjam kepada','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Orang pengontakan (pinjaman)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['Dipinjam pada (sejak-hingga)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Nilai asuransi (pinjaman)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Catatan pinjaman','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Hak cipta','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Hak penggunaan','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Hak / lisensi, catatan','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Catatan pendek','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Catatan','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Pertunjukan di museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Dokumen di museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Deskripsi lengkap','detaileddescription2','detaileddescription2','objektplus','Deskripsi lengkap'];
|
||||
$searchvar[47] = ['Pembeli','erwerbender','erwerbender','objektverwaltung','Pembeli'];
|
||||
$searchvar[48] = ['Tempat pembelian','erwerbungsort','erwerbungsort','objektverwaltung','Tempat pembelian'];
|
||||
$searchvar[49] = ['Pendaftar pertama','ersterfasser','ersterfasser','objektverwaltung','Pendaftar Pertama'];
|
||||
$searchvar[50] = ['Waktu pendaftaran pertama kali','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','Waktu pendaftaran'];
|
||||
$searchvar[51] = ['Sumbu die','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material (tersendiri)','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Cara','technik','technik2','objektplus','Technique (separate)'];
|
Before Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 74 B |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 3.7 KiB |
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Actual abode','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Regular abode','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material (separate)','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Current location','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Home location','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Actual abode','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Regular abode','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Actual abode','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Regular abode','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Descrição completa','detaileddescription2','detaileddescription2','objektplus','Descrição completa'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Current location','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Home location','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -1,3 +0,0 @@
|
||||
<?PHP
|
||||
/* 'Lari', 'Mark', 'Pengő', 'Real', 'RM', 'Rupiah', 'US Dollar', 'Złoty' */
|
||||
$currencies_short = ['EUR' => 'Euro', "FOR" => 'Forint', "USD" => "US Dollar", "IDR" => "Rupiah (Indonesia)", 'DM' => "Deutsche Mark"];
|
@ -1,57 +0,0 @@
|
||||
<?PHP
|
||||
//0:Anzeigestring in search-Formular 1:Programminterne Variable 2: Variable in DB 3:Name der Tabelle in DB 4:Anzeigestring in Filter-Auflistung
|
||||
global $searchvar;
|
||||
$searchvar[0] = ['Other object name','titel2', 'titel2_name','objektplus','Objektname (+)'];
|
||||
$searchvar[1] = ['Closer location','ort2','ort2_name','objektplus','Ortsangabe (+)'];
|
||||
$searchvar[2] = ['Inscription','beschriftung2','beschriftung2','objektplus','Beschriftung'];
|
||||
$searchvar[3] = ['Length','laengenwert','mass2_laenge_wert','objektplus','Länge'];
|
||||
$searchvar[4] = ['Height','hoehenwert','mass2_hoehe_wert','objektplus','Höhe'];
|
||||
$searchvar[5] = ['Width','breitenwert','mass2_breite_wert','objektplus','Breite'];
|
||||
$searchvar[6] = ['Weight','gewichtswert','mass2_gewicht_wert','objektplus','Gewicht'];
|
||||
$searchvar[7] = ['Diameter','durchmesserwert','mass2_durchmesser_wert','objektplus','Durchmesser'];
|
||||
$searchvar[8] = ['Wall','wandungwert','wandungsstaerke_wert','objektplus','Wandung'];
|
||||
$searchvar[9] = ['# pages','seitenzahlwert','mass2_seitenzahl','objektplus','Seitenzahl'];
|
||||
$searchvar[10] = ['# pieces','stueckzahl','stueckzahl','objektplus','Stückzahl'];
|
||||
$searchvar[11] = ['Similar objects','vergleichsobjekt','vergleichsobjekte2','objektplus','Vergleichsobjekt'];
|
||||
$searchvar[12] = ['Entry number','eingangsnummer','eingangsnummer','objektverwaltung','Eingangsnummer'];
|
||||
$searchvar[13] = ['Additional invent. no.','inventarnummer2','invnr2','objektverwaltung','Inventarnummer (+)'];
|
||||
$searchvar[14] = ['Konvolut','konvolut','konvolut','objektverwaltung','Konvolut'];
|
||||
$searchvar[15] = ['Part of','teilvon','teilvon','objektverwaltung','Teil von ...'];
|
||||
$searchvar[16] = ['Subject group','sachgruppe','sachgruppe','objektverwaltung','Sachgruppe'];
|
||||
$searchvar[17] = ['Classification','systematik','systematik','objektverwaltung','Systematik'];
|
||||
$searchvar[18] = ['Previous owner','vorbesitzer','vorbesitzer','objektverwaltung','Vorbesitzer'];
|
||||
$searchvar[19] = ['Date of acquisition','zugangszeitpunkt','zeitpunkt_zugang','objektverwaltung','Zugang, am ...'];
|
||||
$searchvar[20] = ['Way of acquisition','zugangsart','zugang_art','objektverwaltung','Zugang, als ...'];
|
||||
$searchvar[21] = ['Value at acquisition','zugangswert','ankaufsumme','objektverwaltung','Zugang, für ... (Preis)'];
|
||||
$searchvar[22] = ['Object history','objektgeschichte','objektgeschichte','objektverwaltung','Objektgeschichte'];
|
||||
$searchvar[23] = ['Estimated value, when','wert_zeitpunkt','wert_zeitpunkt','objektverwaltung','Schätzwert, wann'];
|
||||
$searchvar[24] = ['Estimated value, by','wert_bestimmer','wert_bestimmer','objektverwaltung','Schätzwert, von'];
|
||||
$searchvar[25] = ['Estimated value, amount','wert_zahl','wert_zahl','objektverwaltung','Schätzwert, Höhe'];
|
||||
$searchvar[26] = ['Insurance value, when','wert2_zeitpunkt','wert2_zeitpunkt','objektverwaltung','Versicherungswert, wann'];
|
||||
$searchvar[27] = ['Insurance value, by','wert2_bestimmer','wert2_bestimmer','objektverwaltung','Versicherungswert, von'];
|
||||
$searchvar[28] = ['Insurance value, amont','wert2_zahl','wert2_zahl','objektverwaltung','Versicherungswert, Höhe'];
|
||||
$searchvar[29] = ['Condition (short)','zustand','zustand','objektverwaltung','Zustand'];
|
||||
$searchvar[30] = ['Restauration','restaurierung','restaurierung','objektverwaltung','Restaurierung'];
|
||||
$searchvar[31] = ['Current location','standort_aktuell','standort_aktuell','verbleib','Aufenthalt'];
|
||||
$searchvar[32] = ['Home location','standort_eigentlich','standort_eigentlich','verbleib','Standort'];
|
||||
$searchvar[33] = ['Exhibition, when ... where ...','ausstellung','ausstellung','verbleib','Ausstellung'];
|
||||
$searchvar[34] = ['Momentarily on load at','verliehen_an','verliehen_an','verbleib','Verliehen an (aktuell)'];
|
||||
$searchvar[35] = ['Contact person (Loan)','leihvorgang_ansprechpartner','leihvorgang_ansprechpartner','verbleib','Ansprechpartner'];
|
||||
$searchvar[36] = ['On loan (from-until)','leihvorgang_zeitraum','leihvorgang_zeitraum','verbleib','Verliehen (von-bis)'];
|
||||
$searchvar[37] = ['Insurance value (Loan)','leihvorgang_versicherungswert','leihvorgang_versicherungswert','verbleib','Wert (Leihe)'];
|
||||
$searchvar[38] = ['Loan, remarks','leihvorgang_anmerkungen','leihvorgang_anmerkungen','verbleib','Anm. zur Leihe'];
|
||||
$searchvar[39] = ['Copyright','urheberrechte','urheberrechte','rechte','Urheberrecht'];
|
||||
$searchvar[40] = ['Rights of use','nutzungsrechte','nutzungsrechte','rechte','Nutzungsrecht'];
|
||||
$searchvar[41] = ['Rights, remarks','rechte_anmerkungen','rechte_anmerkungen','rechte','Anm. zu Rechten'];
|
||||
$searchvar[42] = ['Short remark','notizen_text2','notizen_text2','notizen','Kurznotiz'];
|
||||
$searchvar[43] = ['Remarks','notizen_text1','notizen_text1','notizen','Notiz'];
|
||||
$searchvar[44] = ['Representations at museum','bilder_lokal','bilder_lokal','notizen','Ansichten (lokal)'];
|
||||
$searchvar[45] = ['Documents at museum','dokumente_lokal','dokumente_lokal','notizen','Dokumente (lokal)'];
|
||||
$searchvar[46] = ['Detailed description','detaileddescription2','detaileddescription2','objektplus','Detailed description'];
|
||||
$searchvar[47] = ['Acquirer','erwerbender','erwerbender','objektverwaltung','Acquirer'];
|
||||
$searchvar[48] = ['Acquisition (Place)','erwerbungsort','erwerbungsort','objektverwaltung','Place of acquisition'];
|
||||
$searchvar[49] = ['First registered by','ersterfasser','ersterfasser','objektverwaltung','First registered by'];
|
||||
$searchvar[50] = ['First registered at','ersterfasst_zeitpunkt','ersterfasst_zeitpunkt','objektverwaltung','First registered at'];
|
||||
$searchvar[51] = ['Die-Axis','stempelstellung','mass2_stempelstellung','objektplus','Die-Axis'];
|
||||
$searchvar[52] = ['Material','material','material2','objektplus','Material (separate)'];
|
||||
$searchvar[53] = ['Technique','technik','technik2','objektplus','Technique (separate)'];
|
@ -2,10 +2,12 @@
|
||||
"require": {
|
||||
"phpmailer/phpmailer": "^6.1",
|
||||
"phpunit/phpunit": "^9.4",
|
||||
"phpstan/phpstan": "^0.12.57",
|
||||
"phpstan/phpstan-strict-rules": "^0.12.5",
|
||||
"ergebnis/phpstan-rules": "^0.15.3",
|
||||
"phpstan/phpstan-deprecation-rules": "^0.12.5",
|
||||
"spaze/phpstan-disallowed-calls": "^1.0"
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpstan/phpstan-strict-rules": "^1.4",
|
||||
"ergebnis/phpstan-rules": "^1.0",
|
||||
"phpstan/phpstan-deprecation-rules": "^1.0",
|
||||
"spaze/phpstan-disallowed-calls": "^2.9",
|
||||
"thecodingmachine/phpstan-strict-rules": "^1.0",
|
||||
"phpstan/phpstan-phpunit": "^1.2"
|
||||
}
|
||||
}
|
||||
|
@ -9,11 +9,11 @@
|
||||
declare(strict_types = 1);
|
||||
|
||||
// Set autoloader
|
||||
# \error_reporting(E_ALL);
|
||||
# \ini_set('display_errors', "1");
|
||||
\error_reporting(E_ALL);
|
||||
\ini_set('display_errors', "1");
|
||||
\spl_autoload_register("mdCsvxmlAutoloader");
|
||||
\set_exception_handler("mdExceptionHandler");
|
||||
\set_error_handler("mdErrorHandler", E_ALL);
|
||||
# \set_exception_handler("mdExceptionHandler");
|
||||
# \set_error_handler("mdErrorHandler", E_ALL);
|
||||
|
||||
require_once __DIR__ . '/../inc/constants.php';
|
||||
require_once __DIR__ . '/../vendor/autoload.php';
|
||||
@ -177,165 +177,3 @@ function mdExceptionHandler(Throwable $exception):void {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for generating the HTML head.
|
||||
*
|
||||
* @param string $injected Additional code to inject into the head, e.g. a
|
||||
* reference to JS files.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function printHTMLHead(string $injected = ""):string {
|
||||
|
||||
$output = '<!DOCTYPE HTML>
|
||||
<html lang="en">
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
||||
<meta name="description" content="Validate import CSV files for museum-digital" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
<link rel="shortcut icon" sizes="128x128" href="assets/img/mdlogo-csvxml.svg" />
|
||||
<script src="assets/js/csvxml-overview.min.js" type="text/javascript" defer></script>
|
||||
<meta name="robots" content="noindex" />
|
||||
|
||||
<title>CSVXML :: museum-digital</title>
|
||||
|
||||
<meta name="keywords" content="Imports, museum-digital" />
|
||||
';
|
||||
|
||||
$output .= $injected;
|
||||
|
||||
$output .= '
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>
|
||||
<img src="assets/img/mdlogo-csvxml.svg" alt="" />
|
||||
<span>museum-digital:csvxml</span>
|
||||
</h1>
|
||||
';
|
||||
|
||||
return $output;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function generateHelpTooltip returns a tooltip for hovering over using the common settings.
|
||||
*
|
||||
* @param string $identifier ID attribute of the tooltip.
|
||||
* @param string $title Title of the tooltip.
|
||||
* @param string $explica More in-depth explanation: body of the tooltip.
|
||||
* @param boolean $setParagraph If set to true (default), the content of the tooltip will be put into a <p> element. Optional.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function generateHelpTooltip(string $identifier, string $title, string $explica, bool $setParagraph = true):array {
|
||||
|
||||
$outputTag = '<a class="newToolTipTag icons iconsHelp" data-for="' . $identifier . '" title="Help"></a>';
|
||||
$output = '<span class="newToolTip" id="tooltip_' . $identifier . '" data-title="' . $title . '">';
|
||||
if ($setParagraph) $output .= '<p class="toolTipCont">';
|
||||
$output .= $explica;
|
||||
if ($setParagraph) $output .= '</p>';
|
||||
$output .= '</span>';
|
||||
|
||||
return [$output, $outputTag];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs a DOMDocument with correct header and then aborts.
|
||||
* Used mainly for debugging.
|
||||
*
|
||||
* @param DOMDocument $xmlDoc XML object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function printDOMDocToXML(DOMDocument $xmlDoc):string {
|
||||
|
||||
return '<?xml version="1.0" encoding="UTF-8"?>' . $xmlDoc->saveXML($xmlDoc->documentElement);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for creating a DOMElement with a text node inside.
|
||||
*
|
||||
* @param DOMDocument $xmlDoc XML document.
|
||||
* @param string $tag Tag.
|
||||
* @param string $content Text content.
|
||||
*
|
||||
* @return DOMElement
|
||||
*/
|
||||
function createTextDomElement(DOMDocument $xmlDoc, string $tag, string $content):DOMElement {
|
||||
|
||||
try {
|
||||
$element = $xmlDoc->createElement($tag);
|
||||
}
|
||||
catch (DOMException $e) {
|
||||
echo "Error at " . __FILE__ . ", line #" . __LINE__ . PHP_EOL . "<br/>";
|
||||
echo "Cannot create DOM element for $tag / $content";
|
||||
exit;
|
||||
}
|
||||
|
||||
$element->appendChild($xmlDoc->createTextNode($content));
|
||||
|
||||
return $element;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for creating a DOMDocument record channel.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getBlankRecordChannel():array {
|
||||
|
||||
$xmlDoc = new DOMDocument("1.0", "UTF-8");
|
||||
$xmlMainElem = $xmlDoc->createElement("record");
|
||||
$record_node = $xmlDoc->appendChild($xmlMainElem); //add RSS element to XML node
|
||||
|
||||
return [$xmlDoc, $record_node];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for removing a directory with all its contents.
|
||||
*
|
||||
* @param string $dir File path of the directory to remove.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function rrmdir(string $dir):void {
|
||||
if (is_dir($dir)) {
|
||||
$objects = scandir($dir);
|
||||
foreach ($objects as $object) {
|
||||
if ($object != "." && $object != "..") {
|
||||
if (filetype($dir . "/" . $object) == "dir") rrmdir($dir . "/" . $object);
|
||||
else unlink($dir . "/" . $object);
|
||||
}
|
||||
}
|
||||
reset($objects);
|
||||
rmdir($dir);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for checking if two arrays have identical values / contents.
|
||||
*
|
||||
* @param array $arrayA First array to compare.
|
||||
* @param array $arrayB Second array to compare.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function identical_values(array $arrayA, array $arrayB):bool {
|
||||
sort($arrayA);
|
||||
sort($arrayB);
|
||||
return $arrayA == $arrayB;
|
||||
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,8 @@ declare(strict_types = 1);
|
||||
|
||||
const CACHE_DIR_PERMS = 0775;
|
||||
|
||||
const ALLOWED_LANGS = ['de', 'en', 'hu'];
|
||||
|
||||
const TL_FILE_DIRS = [
|
||||
__DIR__ . "/../l10n/musdb/",
|
||||
__DIR__ . "/../l10n/importer/",
|
||||
@ -33,26 +35,51 @@ const AUTOLOAD_DIRS = [
|
||||
|
||||
const AUTOLOAD_CLASS_MAP = [
|
||||
'CsvxmlAvailableFields' => __DIR__ . '/../classes/CsvxmlAvailableFields.php',
|
||||
'FieldEntry' => __DIR__ . '/../classes/FieldEntry.php',
|
||||
'MDTlLoader' => __DIR__ . '/../classes/MDTlLoader/src/MDTlLoader.php',
|
||||
'MDFormatter' => __DIR__ . '/../classes/MD_STD/src/MDFormatter.php',
|
||||
'MD_JAIL' => __DIR__ . '/../classes/MD_STD/src/MD_JAIL.php',
|
||||
'MD_STD' => __DIR__ . '/../classes/MD_STD/src/MD_STD.php',
|
||||
'MD_STD_CACHE' => __DIR__ . '/../classes/MD_STD/src/MD_STD_CACHE.php',
|
||||
'MD_STD_DEBUG' => __DIR__ . '/../classes/MD_STD/src/MD_STD_DEBUG.php',
|
||||
'MD_STD_IN' => __DIR__ . '/../classes/MD_STD/src/MD_STD_IN.php',
|
||||
'MD_STD_SEC' => __DIR__ . '/../classes/MD_STD/src/MD_STD_SEC.php',
|
||||
'MD_STD_SORT' => __DIR__ . '/../classes/MD_STD/src/MD_STD_SORT.php',
|
||||
'MDActorVariantTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDActorVariantTypesSet.php',
|
||||
'MDAppointmentAttendanceModeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentAttendanceModeSet.php',
|
||||
'MDAppointmentContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentContributorsSet.php',
|
||||
'MDAppointmentRecordingSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentRecordingSet.php',
|
||||
'MDAppointmentStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentStatusSet.php',
|
||||
'MDBlockedMailserverSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDBlockedMailserverSet.php',
|
||||
'MDCloserLocationTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDCloserLocationTypesSet.php',
|
||||
'MDColorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDColorsSet.php',
|
||||
'MDConservationReportTypeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDConservationReportTypeSet.php',
|
||||
'MDConservationStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDConservationStatusSet.php',
|
||||
'MDCurrenciesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDCurrenciesSet.php',
|
||||
'MDDataHistorySubjectsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDDataHistorySubjectsSet.php',
|
||||
'MDEntryTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDEntryTypesSet.php',
|
||||
'MDEventsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDEventsSet.php',
|
||||
'MDExhibitionContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDExhibitionContributorsSet.php',
|
||||
'MDExternalHostingSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDExternalHostingSet.php',
|
||||
'MDLanguagesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLanguagesSet.php',
|
||||
'MDLicensesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLicensesSet.php',
|
||||
'MDLoanTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLoanTypesSet.php',
|
||||
'MDMarkingTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDMarkingTypesSet.php',
|
||||
'MDNodaRepositoriesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDNodaRepositoriesSet.php',
|
||||
'MDObjectPositionsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectPositionsSet.php',
|
||||
'MDObjectPublicationBackgrounds' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectPublicationBackgrounds.php',
|
||||
'MDObjectStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectStatusSet.php',
|
||||
'MDObjectSyndicationSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectSyndicationSet.php',
|
||||
'MDPhoneTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPhoneTypesSet.php',
|
||||
'MDPlacetypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPlacetypesSet.php',
|
||||
'MDPodcastContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPodcastContributorsSet.php',
|
||||
'MDProcessTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDProcessTypesSet.php',
|
||||
'MDRecordingTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDRecordingTypesSet.php',
|
||||
'MDRequirementsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDRequirementsSet.php',
|
||||
'MDResearchStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDResearchStatusSet.php',
|
||||
'MDSourceTypeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSourceTypeSet.php',
|
||||
'MDSpaceAccessStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSpaceAccessStatusSet.php',
|
||||
'MDSpaceTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSpaceTypesSet.php',
|
||||
'MDTitleTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDTitleTypesSet.php',
|
||||
'MDUnitsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDUnitsSet.php',
|
||||
'MDValueSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDValueSet.php',
|
||||
@ -66,8 +93,10 @@ const AUTOLOAD_CLASS_MAP = [
|
||||
'MDFileDoesNotExist' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDFileDoesNotExist.php',
|
||||
'MDFileIsNotReadable' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDFileIsNotReadable.php',
|
||||
'MDInaccessiblePropertyException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInaccessiblePropertyException.php',
|
||||
'MDInputTooLongException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInputTooLongException.php',
|
||||
'MDInvalidColorCode' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidColorCode.php',
|
||||
'MDInvalidEmail' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidEmail.php',
|
||||
'MDInvalidEmptyInputException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidEmptyInputException.php',
|
||||
'MDInvalidUrl' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidUrl.php',
|
||||
'MDOutputBufferNotStarted' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDOutputBufferNotStarted.php',
|
||||
'MDRequiredConfigNotSet' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDRequiredConfigNotSet.php',
|
||||
@ -81,6 +110,7 @@ const AUTOLOAD_CLASS_MAP = [
|
||||
'MDpageParameterMissingException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/page/MDpageParameterMissingException.php',
|
||||
'MDpageParameterNotNumericException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/page/MDpageParameterNotNumericException.php',
|
||||
'MDDuplicateLinkException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDDuplicateLinkException.php',
|
||||
'MDFileIsNotWritable' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDFileIsNotWritable.php',
|
||||
'MDFileUploadNotAcceptedException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDFileUploadNotAcceptedException.php',
|
||||
'MDInvalidCurrency' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDInvalidCurrency.php',
|
||||
'MDInvalidInputDate' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDInvalidInputDate.php',
|
||||
|
@ -1,56 +0,0 @@
|
||||
<?PHP
|
||||
|
||||
/**
|
||||
* Function for sanitizing contents for prospective XML contents.
|
||||
*
|
||||
* @param string $transform Input string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function transform(string $transform):string {
|
||||
$transform = str_replace(chr(14), "", $transform);
|
||||
$transform = str_replace('"', '"', $transform);
|
||||
$transform = str_replace('&', '&', $transform);
|
||||
$transform = str_replace('"', '"', $transform);
|
||||
$transform = str_replace('</br>', ' ', $transform);
|
||||
$transform = str_replace('<br />', ' ', $transform);
|
||||
$transform = str_replace('’', '\'', $transform);
|
||||
$transform = str_replace(chr(11), ' ', $transform);
|
||||
|
||||
$transform = str_replace('<', '<', $transform);
|
||||
$transform = str_replace('>', '>', $transform);
|
||||
$transform = str_replace('´', ''', $transform);
|
||||
$transform = str_replace('&sbquo', '\'', $transform);
|
||||
$transform = str_replace('&lsquo', '\'', $transform);
|
||||
$transform = str_replace(chr(96), '\'', $transform);
|
||||
$transform = str_replace(chr(130), '\'', $transform);
|
||||
$transform = str_replace(chr(145), '\'', $transform);
|
||||
$transform = str_replace(chr(146), '\'', $transform);
|
||||
return $transform;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for sanitizing contents for prospective XML contents.
|
||||
*
|
||||
* @param string $tagify Input string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function tagify(string $tagify):string {
|
||||
$tagify = str_replace(' ', '_', $tagify);
|
||||
$tagify = str_replace('/', '_', $tagify);
|
||||
$tagify = str_replace(',', '_', $tagify);
|
||||
$tagify = str_replace('__', '_', $tagify);
|
||||
$tagify = str_replace('Ä', 'ae', $tagify);
|
||||
$tagify = str_replace('ä', 'ae', $tagify);
|
||||
$tagify = str_replace('Ö', 'oe', $tagify);
|
||||
$tagify = str_replace('ö', 'oe', $tagify);
|
||||
$tagify = str_replace('Ü', 'ue', $tagify);
|
||||
$tagify = str_replace('ü', 'ue', $tagify);
|
||||
$tagify = str_replace('ß', 'ss', $tagify);
|
||||
$tagify = str_replace(chr(41), '', $tagify);
|
||||
$tagify = str_replace(chr(40), '', $tagify);
|
||||
return $tagify;
|
||||
|
||||
}
|
440
inc/zip.php
@ -1,440 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Class to create and manage a Zip file.
|
||||
*
|
||||
* Inspired by CreateZipFile by Rochak Chauhan www.rochakchauhan.com (http://www.phpclasses.org/browse/package/2322.html)
|
||||
* and
|
||||
* http://www.pkware.com/documents/casestudies/APPNOTE.TXT Zip file specification.
|
||||
*
|
||||
* @author A. Grandt
|
||||
* @see Distributed under "General Public License"
|
||||
* @version 1.1
|
||||
*/
|
||||
class Zip {
|
||||
private $zipMemoryThreshold = 1048576; // Autocreate tempfile if the zip data exceeds 1048576 bytes (1 MB)
|
||||
private $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
|
||||
private $localFileHeader = "\x50\x4b\x03\x04"; // Local file header signature
|
||||
private $centralFileHeader = "\x50\x4b\x01\x02"; // Central file header signature
|
||||
|
||||
private $zipData = null;
|
||||
private $zipFile = null;
|
||||
private $zipComment = null;
|
||||
private $cdRec = array(); // central directory
|
||||
private $offset = 0;
|
||||
private $isFinalized = false;
|
||||
|
||||
private $streamChunkSize = 65536;
|
||||
private $streamFilePath = null;
|
||||
private $streamTimeStamp = null;
|
||||
private $streamComment = null;
|
||||
private $streamFile = null;
|
||||
private $streamData = null;
|
||||
private $streamFileLength = 0;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param $useZipFile boolean. Write temp zip data to tempFile? Default false
|
||||
*/
|
||||
function __construct($useZipFile = false) {
|
||||
if ($useZipFile) {
|
||||
$this->zipFile = tmpfile();
|
||||
} else {
|
||||
$this->zipData = "";
|
||||
}
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
if (!is_null($this->zipFile)) {
|
||||
fclose($this->zipFile);
|
||||
}
|
||||
$this->zipData= null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Zip archive comment.
|
||||
*
|
||||
* @param string $newComment New comment. null to clear.
|
||||
*/
|
||||
public function setComment($newComment = null) {
|
||||
$this->zipComment = $newComment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set zip file to write zip data to.
|
||||
* This will cause all present and future data written to this class to be written to this file.
|
||||
* This can be used at any time, even after the Zip Archive have been finalized. Any previous file will be closed.
|
||||
* Warning: If the given file already exists, it will be overwritten.
|
||||
*
|
||||
* @param string $fileName
|
||||
*/
|
||||
public function setZipFile($fileName) {
|
||||
if (file_exists($fileName)) {
|
||||
unlink ($fileName);
|
||||
}
|
||||
$fd=fopen($fileName, "x+b");
|
||||
if (!is_null($this->zipFile)) {
|
||||
rewind($this->zipFile);
|
||||
while(!feof($this->zipFile)) {
|
||||
fwrite($fd, fread($this->zipFile, $this->streamChunkSize));
|
||||
}
|
||||
|
||||
fclose($this->zipFile);
|
||||
} else {
|
||||
fwrite($fd, $this->zipData);
|
||||
$this->zipData = null;
|
||||
}
|
||||
$this->zipFile = $fd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an empty directory entry to the zip archive.
|
||||
* Basically this is only used if an empty directory is added.
|
||||
*
|
||||
* @param string $directoryPath Directory Path and name to be added to the archive.
|
||||
* @param int $timestamp (Optional) Timestamp for the added directory, if omitted or set to 0, the current time will be used.
|
||||
* @param string $fileComment (Optional) Comment to be added to the archive for this directory. To use fileComment, timestamp must be given.
|
||||
*/
|
||||
public function addDirectory($directoryPath, $timestamp = 0, $fileComment = null) {
|
||||
if ($this->isFinalized) {
|
||||
return;
|
||||
}
|
||||
$this->buildZipEntry($directoryPath, $fileComment, "\x00\x00", "\x00\x00", $timestamp, "\x00\x00\x00\x00", 0, 0, 16);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a file to the archive at the specified location and file name.
|
||||
*
|
||||
* @param string $data File data.
|
||||
* @param string $filePath Filepath and name to be used in the archive.
|
||||
* @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
|
||||
* @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
|
||||
*/
|
||||
public function addFile($data, $filePath, $timestamp = 0, $fileComment = null) {
|
||||
if ($this->isFinalized) {
|
||||
return;
|
||||
}
|
||||
|
||||
$gzType = "\x08\x00"; // Compression type 8 = deflate
|
||||
$gpFlags = "\x02\x00"; // General Purpose bit flags for compression type 8 it is: 0=Normal, 1=Maximum, 2=Fast, 3=super fast compression.
|
||||
$dataLength = strlen($data);
|
||||
$fileCRC32 = pack("V", crc32($data));
|
||||
|
||||
$gzData = gzcompress($data);
|
||||
$gzData = substr( substr($gzData, 0, strlen($gzData) - 4), 2); // gzcompress adds a 2 byte header and 4 byte CRC we can't use.
|
||||
// The 2 byte header does contain useful data, though in this case the 2 parameters we'd be interrested in will always be 8 for compression type, and 2 for General purpose flag.
|
||||
$gzLength = strlen($gzData);
|
||||
|
||||
if ($gzLength >= $dataLength) {
|
||||
$gzLength = $dataLength;
|
||||
$gzData = $data;
|
||||
$gzType = "\x00\x00"; // Compression type 0 = stored
|
||||
$gpFlags = "\x00\x00"; // Compression type 0 = stored
|
||||
}
|
||||
|
||||
if (is_null($this->zipFile) && ($this->offset + $gzLength) > $this->zipMemoryThreshold) {
|
||||
$this->zipFile = tmpfile();
|
||||
fwrite($this->zipFile, $this->zipData);
|
||||
$this->zipData = null;
|
||||
}
|
||||
|
||||
$this->buildZipEntry($filePath, $fileComment, $gpFlags, $gzType, $timestamp, $fileCRC32, $gzLength, $dataLength, 32);
|
||||
if (is_null($this->zipFile)) {
|
||||
$this->zipData .= $gzData;
|
||||
} else {
|
||||
fwrite($this->zipFile, $gzData);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a file to the archive at the specified location and file name.
|
||||
*
|
||||
* @param string $dataFile File name/path.
|
||||
* @param string $filePath Filepath and name to be used in the archive.
|
||||
* @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
|
||||
* @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
|
||||
*/
|
||||
public function addLargeFile($dataFile, $filePath, $timestamp = 0, $fileComment = null) {
|
||||
if ($this->isFinalized) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->openStream($filePath, $timestamp, $fileComment);
|
||||
|
||||
$fh = fopen($dataFile, "rb");
|
||||
while(!feof($fh)) {
|
||||
$this->addStreamData(fread($fh, $this->streamChunkSize));
|
||||
}
|
||||
fclose($fh);
|
||||
|
||||
$this->closeStream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a stream to be used for large entries.
|
||||
*
|
||||
* @param string $filePath Filepath and name to be used in the archive.
|
||||
* @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
|
||||
* @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
|
||||
*/
|
||||
public function openStream($filePath, $timestamp = 0, $fileComment = null) {
|
||||
if ($this->isFinalized) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_null($this->zipFile)) {
|
||||
$this->zipFile = tmpfile();
|
||||
fwrite($this->zipFile, $this->zipData);
|
||||
$this->zipData = null;
|
||||
}
|
||||
|
||||
if (strlen($this->streamFilePath) > 0) {
|
||||
closeStream();
|
||||
}
|
||||
$this->streamFile = tempnam(sys_get_temp_dir(), 'Zip');
|
||||
$this->streamData = gzopen($this->streamFile, "w9");
|
||||
$this->streamFilePath = $filePath;
|
||||
$this->streamTimestamp = $timestamp;
|
||||
$this->streamFileComment = $fileComment;
|
||||
$this->streamFileLength = 0;
|
||||
}
|
||||
|
||||
public function addStreamData($data) {
|
||||
$length = gzwrite($this->streamData, $data, strlen($data));
|
||||
if ($length != strlen($data)) {
|
||||
print "<p>Length mismatch</p>\n";
|
||||
}
|
||||
$this->streamFileLength += $length;
|
||||
return $length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the current stream.
|
||||
*/
|
||||
public function closeStream() {
|
||||
if ($this->isFinalized || strlen($this->streamFilePath) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
fflush($this->streamData);
|
||||
gzclose($this->streamData);
|
||||
|
||||
$gzType = "\x08\x00"; // Compression type 8 = deflate
|
||||
$gpFlags = "\x02\x00"; // General Purpose bit flags for compression type 8 it is: 0=Normal, 1=Maximum, 2=Fast, 3=super fast compression.
|
||||
|
||||
$file_handle = fopen($this->streamFile, "rb");
|
||||
$stats = fstat($file_handle);
|
||||
$eof = $stats['size'];
|
||||
|
||||
fseek($file_handle, $eof-8);
|
||||
$fileCRC32 = fread($file_handle, 4);
|
||||
$dataLength = $this->streamFileLength;//$gzl[1];
|
||||
|
||||
$gzLength = $eof-10;
|
||||
$eof -= 9;
|
||||
|
||||
fseek($file_handle, 10);
|
||||
|
||||
$this->buildZipEntry($this->streamFilePath, $this->streamFileComment, $gpFlags, $gzType, $this->streamTimestamp, $fileCRC32, $gzLength, $dataLength, 32);
|
||||
while(!feof($file_handle)) {
|
||||
fwrite($this->zipFile, fread($file_handle, $this->streamChunkSize));
|
||||
}
|
||||
|
||||
unlink($this->streamFile);
|
||||
$this->streamFile = null;
|
||||
$this->streamData = null;
|
||||
$this->streamFilePath = null;
|
||||
$this->streamTimestamp = null;
|
||||
$this->streamFileComment = null;
|
||||
$this->streamFileLength = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the archive.
|
||||
* A closed archive can no longer have new files added to it.
|
||||
*/
|
||||
public function finalize() {
|
||||
if(!$this->isFinalized) {
|
||||
if (strlen($this->streamFilePath) > 0) {
|
||||
$this->closeStream();
|
||||
}
|
||||
$cd = implode("", $this->cdRec);
|
||||
|
||||
$cdRec = $cd . $this->endOfCentralDirectory
|
||||
. pack("v", sizeof($this->cdRec))
|
||||
. pack("v", sizeof($this->cdRec))
|
||||
. pack("V", strlen($cd))
|
||||
. pack("V", $this->offset);
|
||||
if (!is_null($this->zipComment)) {
|
||||
$cdRec .= pack("v", strlen($this->zipComment)) . $this->zipComment;
|
||||
} else {
|
||||
$cdRec .= "\x00\x00";
|
||||
}
|
||||
|
||||
if (is_null($this->zipFile)) {
|
||||
$this->zipData .= $cdRec;
|
||||
} else {
|
||||
fwrite($this->zipFile, $cdRec);
|
||||
fflush($this->zipFile);
|
||||
}
|
||||
$this->isFinalized = true;
|
||||
$cd = null;
|
||||
$this->cdRec = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the handle ressource for the archive zip file.
|
||||
* If the zip haven't been finalized yet, this will cause it to become finalized
|
||||
*
|
||||
* @return zip file handle
|
||||
*/
|
||||
public function getZipFile() {
|
||||
if(!$this->isFinalized) {
|
||||
$this->finalize();
|
||||
}
|
||||
if (is_null($this->zipFile)) {
|
||||
$this->zipFile = tmpfile();
|
||||
fwrite($this->zipFile, $this->zipData);
|
||||
$this->zipData = null;
|
||||
}
|
||||
rewind($this->zipFile);
|
||||
return $this->zipFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the zip file contents
|
||||
* If the zip haven't been finalized yet, this will cause it to become finalized
|
||||
*
|
||||
* @return zip data
|
||||
*/
|
||||
public function getZipData() {
|
||||
if(!$this->isFinalized) {
|
||||
$this->finalize();
|
||||
}
|
||||
if (is_null($this->zipFile)) {
|
||||
return $this->zipData;
|
||||
} else {
|
||||
rewind($this->zipFile);
|
||||
$filestat = fstat($this->zipFile);
|
||||
return fread($this->zipFile, $filestat['size']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the archive as a zip download
|
||||
*
|
||||
* @param String $fileName The name of the Zip archive, ie. "archive.zip".
|
||||
* @return void
|
||||
*/
|
||||
function sendZip($fileName) {
|
||||
if(!$this->isFinalized) {
|
||||
$this->finalize();
|
||||
}
|
||||
|
||||
if (!headers_sent($headerFile, $headerLine) or die("<p><strong>Error:</strong> Unable to send file $fileName. HTML Headers have already been sent from <strong>$headerFile</strong> in line <strong>$headerLine</strong></p>")) {
|
||||
if (ob_get_contents() === false or die("\n<p><strong>Error:</strong> Unable to send file <strong>$fileName.epub</strong>. Output buffer contains the following text (typically warnings or errors):<br>" . ob_get_contents() . "</p>")) {
|
||||
if (ini_get('zlib.output_compression')) {
|
||||
ini_set('zlib.output_compression', 'Off');
|
||||
}
|
||||
|
||||
header('Pragma: public');
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s T"));
|
||||
header("Expires: 0");
|
||||
header("Accept-Ranges: bytes");
|
||||
header("Connection: close");
|
||||
header("Content-Type: application/zip");
|
||||
header('Content-Disposition: attachment; filename="' . $fileName . '";' );
|
||||
header("Content-Transfer-Encoding: binary");
|
||||
header("Content-Length: ". $this->getArchiveSize());
|
||||
|
||||
if (is_null($this->zipFile)) {
|
||||
echo $this->zipData;
|
||||
} else {
|
||||
rewind($this->zipFile);
|
||||
|
||||
while(!feof($this->zipFile)) {
|
||||
echo fread($this->zipFile, $this->streamChunkSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getArchiveSize() {
|
||||
if (is_null($this->zipFile)) {
|
||||
return strlen($this->zipData);
|
||||
}
|
||||
$filestat = fstat($this->zipFile);
|
||||
return $filestat['size'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the 2 byte dostime used in the zip entries.
|
||||
*
|
||||
* @param int $timestamp
|
||||
* @return 2-byte encoded DOS Date
|
||||
*/
|
||||
private function getDosTime($timestamp = 0) {
|
||||
$timestamp = (int)$timestamp;
|
||||
$date = ($timestamp == 0 ? getdate() : getDate($timestamp));
|
||||
if ($date["year"] >= 1980) {
|
||||
return pack("V", (($date["mday"] + ($date["mon"] << 5) + (($date["year"]-1980) << 9)) << 16) |
|
||||
(($date["seconds"] >> 1) + ($date["minutes"] << 5) + ($date["hours"] << 11)));
|
||||
}
|
||||
return "\x00\x00\x00\x00";
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the Zip file structures
|
||||
*
|
||||
* @param unknown_type $filePath
|
||||
* @param unknown_type $fileComment
|
||||
* @param unknown_type $gpFlags
|
||||
* @param unknown_type $gzType
|
||||
* @param unknown_type $timestamp
|
||||
* @param unknown_type $fileCRC32
|
||||
* @param unknown_type $gzLength
|
||||
* @param unknown_type $dataLength
|
||||
* @param integer $extFileAttr 16 for directories, 32 for files.
|
||||
*/
|
||||
private function buildZipEntry($filePath, $fileComment, $gpFlags, $gzType, $timestamp, $fileCRC32, $gzLength, $dataLength, $extFileAttr) {
|
||||
$filePath = str_replace("\\", "/", $filePath);
|
||||
$fileCommentLength = (is_null($fileComment) ? 0 : strlen($fileComment));
|
||||
$dosTime = $this->getDosTime($timestamp);
|
||||
|
||||
$zipEntry = $this->localFileHeader;
|
||||
$zipEntry .= "\x14\x00"; // Version needed to extract
|
||||
$zipEntry .= $gpFlags . $gzType . $dosTime. $fileCRC32;
|
||||
$zipEntry .= pack("VV", $gzLength, $dataLength);
|
||||
$zipEntry .= pack("v", strlen($filePath) ); // File name length
|
||||
$zipEntry .= "\x00\x00"; // Extra field length
|
||||
$zipEntry .= $filePath; // FileName . Extra field
|
||||
|
||||
if (is_null($this->zipFile)) {
|
||||
$this->zipData .= $zipEntry;
|
||||
} else {
|
||||
fwrite($this->zipFile, $zipEntry);
|
||||
}
|
||||
|
||||
$cdEntry = $this->centralFileHeader;
|
||||
$cdEntry .= "\x00\x00"; // Made By Version
|
||||
$cdEntry .= "\x14\x00"; // Version Needed to extract
|
||||
$cdEntry .= $gpFlags . $gzType . $dosTime. $fileCRC32;
|
||||
$cdEntry .= pack("VV", $gzLength, $dataLength);
|
||||
$cdEntry .= pack("v", strlen($filePath)); // Filename length
|
||||
$cdEntry .= "\x00\x00"; // Extra field length
|
||||
$cdEntry .= pack("v", $fileCommentLength); // File comment length
|
||||
$cdEntry .= "\x00\x00"; // Disk number start
|
||||
$cdEntry .= "\x00\x00"; // internal file attributes
|
||||
$cdEntry .= pack("V", $extFileAttr ); // External file attributes
|
||||
$cdEntry .= pack("V", $this->offset ); // Relative offset of local header
|
||||
$cdEntry .= $filePath; // FileName . Extra field
|
||||
if (!is_null($fileComment)) {
|
||||
$cdEntry .= $fileComment; // Comment
|
||||
}
|
||||
|
||||
$this->cdRec[] = $cdEntry;
|
||||
$this->offset += strlen($zipEntry) + $gzLength;
|
||||
}
|
||||
}
|
22
public/.well-known/security.txt
Normal file
@ -0,0 +1,22 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
Contact: mailto:security@museum-digital.de
|
||||
Expires: 2022-12-31T23:00:00.000Z
|
||||
Encryption: https://museum-digital.org/security.museum-digital.de.asc
|
||||
Preferred-Languages: en,de,id
|
||||
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iQHPBAEBCAA5FiEEj8Xp6Z+ljyT3em/ZGu3UMfzOrDYFAmJBDykbHHNlY3VyaXR5
|
||||
QG11c2V1bS1kaWdpdGFsLmRlAAoJEBrt1DH8zqw2SO8L/1sGwb/PUyVJS3L5XVJE
|
||||
eQA6I7Uo1GzdEvv+G4qtcZMYrsZpVl0gxlDfvcRr394PVnW5EExqMCPPsT+g2Quz
|
||||
MFoFgTUf9XC5MXridcJg3JFK37bwYGJ7bBTQSezkdCMZpy0SdOAlQetEi1mI4Ubf
|
||||
dqcbrlZHprvtEvfzQwyvkv8w6Zjr+aFXBtybJLG92cO6iFwXGAnOOoBpfA4Mnoe7
|
||||
eiU17GU65ZJElGAIB4aNy/S8Rp680lSdffLNa2pehB59f9Dt7aku6TXa7ngE+52R
|
||||
T4P/UtELA8VyFG2/61XbdqPuXrBN+n9WKQXDvKtfiNv9iSsciTh+AG1Z98LONHLS
|
||||
N6bqOpiwyicnP9fzhCnlfGlY5XSGaUkBFeiN8/lFbRsieGRZ6zP5LxyBeNa5dvG1
|
||||
r6ZQuRhIwelsH/JhkP6495v2LyzHpHvjzXsrpiIZjn5DWQKfNO3cDj4O8wCtMcOh
|
||||
uWf2U+RQjutZzAsdzhVdll2UuR/ZYY69D0apDx8NPbh9rA==
|
||||
=EJhz
|
||||
-----END PGP SIGNATURE-----
|
@ -1,4 +1,36 @@
|
||||
@import 'editMenu.css';
|
||||
/*
|
||||
* @import 'editMenu.css';
|
||||
@import 'dialogue.css';
|
||||
*/
|
||||
:root {
|
||||
--color-bg-normal: #FFF;
|
||||
--color-bg-raised: #EEE;
|
||||
--color-bg-raised2: #FAFAFA;
|
||||
--color-fg-normal: #000;
|
||||
--color-fg-less: #212121;
|
||||
--color-borders: #D6D6D6;
|
||||
--color-borders-dark: #646464;
|
||||
|
||||
--color-accent-normal: #FFCCBC;
|
||||
--color-accent-hover: #CB9B8C;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
|
||||
:root {
|
||||
--color-bg-normal: #000;
|
||||
--color-bg-raised: #273000;
|
||||
--color-bg-raised2: #121212;
|
||||
--color-fg-normal: #FFF;
|
||||
--color-fg-less: #EEE;
|
||||
--color-borders: #37474F;
|
||||
--color-borders-dark: #BDBDBD;
|
||||
|
||||
--color-accent-normal: #FFC107;
|
||||
--color-accent-hover: #FFA000;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* ==============
|
||||
| Load fonts
|
||||
@ -18,16 +50,19 @@
|
||||
|
||||
* { box-sizing: border-box; z-index: 1; }
|
||||
|
||||
body { margin: 2em; background: #FFF;
|
||||
body { margin: 0; background: var(--color-bg-normal); color: var(--color-fg-normal);
|
||||
font-family: sourceSansPro, Arial, Helvetica, Times; font-size: 1.2em; line-height: 1.5em; }
|
||||
|
||||
a { text-decoration: none; color: inherit; }
|
||||
|
||||
h1 { display: block; max-width: 600px; margin: 0 auto 1.5em auto; }
|
||||
h1 > * { display: inline-block; vertical-align: middle; color: #212121; }
|
||||
h1 img { height: 2em; margin-right: .2em; border-radius: .1em; opacity: .7; transition: opacity .4s; }
|
||||
h1 { display: block; width: 100%; text-align: center; margin: 0 auto 1.5em auto;
|
||||
padding: 1em 0;
|
||||
font-size: 2.5em; line-height: 1.2em; }
|
||||
h1 > * { display: inline-block; vertical-align: middle; color: var(--color-fg-less); }
|
||||
h1 img { height: 2em; margin-right: .5em; border-radius: .1em; opacity: .7; transition: opacity .4s; }
|
||||
h1 img:hover { opacity: 1; }
|
||||
|
||||
main,
|
||||
body > div,
|
||||
body > form { display: block; max-width: 90vw; margin: 0 auto 3em auto; padding-bottom: 3em; }
|
||||
|
||||
@ -40,8 +75,8 @@ label { display: block; font-weight: bold; margin-bottom: .5em; }
|
||||
select,
|
||||
button,
|
||||
textarea,
|
||||
input { display: block; width: 100%; padding: .5em .5em; border: 2.5px solid #EEE;
|
||||
background: inherit; color: #424242; font-family: roboto; font-size: 1em;
|
||||
input { display: block; width: 100%; padding: .5em .5em; border: 2.5px solid var(--color-bg-raised);
|
||||
background: inherit; color: var(--color-fg-less); font-family: roboto; font-size: 1em;
|
||||
border-radius: .2em; transition: border .2s; }
|
||||
|
||||
.buttonLike { display: inline-block; text-align: center; }
|
||||
@ -49,7 +84,7 @@ input[type="submit"],
|
||||
button { padding: .5em .8em; }
|
||||
.buttonLike,
|
||||
input[type="submit"],
|
||||
button { background: #FFCCBC; color: #424242; border: none; font-weight: bold; text-transform: uppercase; transition: background .2s, color .2s; }
|
||||
button { background: var(--color-accent-normal); color: var(--color-fg-less); border: none; font-weight: bold; text-transform: uppercase; transition: background .2s, color .2s; }
|
||||
textarea { line-height: 1.2em; }
|
||||
|
||||
select:hover,
|
||||
@ -61,7 +96,7 @@ input[type="submit"]:focus,
|
||||
button:focus,
|
||||
.buttonLike:hover,
|
||||
input[type="submit"]:hover,
|
||||
button:hover { background: #CB9B8C; color: #000; }
|
||||
button:hover { background: var(--color-accent-hover); color: #000; }
|
||||
|
||||
aside .buttonLike + .buttonLike,
|
||||
aside button + button { margin-top: .5em; }
|
||||
@ -69,7 +104,7 @@ aside > h4:first-child { margin-top: 0; }
|
||||
|
||||
select:focus,
|
||||
textarea:focus,
|
||||
input:focus { border-color: #CB9B8C; box-shadow: none; }
|
||||
input:focus { border-color: var(--color-accent-hover); box-shadow: none; }
|
||||
|
||||
textarea:invalid,
|
||||
input:invalid { box-shadow: none; }
|
||||
@ -80,66 +115,118 @@ textarea { min-height: 30vh; }
|
||||
|
||||
table { width: 100%; max-height: 60vh; margin: 2em 0; border-collapse: collapse; overflow: auto; }
|
||||
|
||||
th { padding: .3em .5em; text-align: left; border-bottom: 2px solid #424242; }
|
||||
tbody > tr:nth-child(2n + 1) { background: #F2F2F2; }
|
||||
td { padding: .3em .5em; border-bottom: 1px solid #D6D6D6; }
|
||||
th { padding: .3em .5em; text-align: left; border-bottom: 2px solid var(--color-fg-less); }
|
||||
tbody > tr:nth-child(2n + 1) { background: var(--color-bg-raised2); }
|
||||
td { padding: .3em .5em; border-bottom: 1px solid var(--color-borders); }
|
||||
|
||||
body > div.uploader { background: #F2F2F2; border: 2px solid #EEE; padding: 1em 1em; }
|
||||
body > div.uploader { background: var(--color-bg-raised2); border: 2px solid var(--color-bg-raised); padding: 1em 1em; }
|
||||
|
||||
ul.fieldList { display: block; margin: .5em 0; padding: 0 0; list-style: none; }
|
||||
ul.fieldList > li { display: inline-block; padding: .3em; margin: .1em; border: 1px solid #D6D6D6; background: #FAFAFA; cursor: pointer; transition: background .4s, border .4s, box-shadow .4s;; }
|
||||
ul.fieldList > li:hover { background: #FFF; border-color: #212121; }
|
||||
ul.fieldList > li { display: inline-block; margin: .1em; padding: .3em;
|
||||
border: 1px solid var(--color-borders); background: var(--color-bg-raised2);
|
||||
color: var(--color-fg-normal);
|
||||
cursor: pointer; transition: background .4s, border .4s, box-shadow .4s; }
|
||||
ul.fieldList > li:hover { background: var(--color-bg-normal); border-color: var(--color-fg-less); }
|
||||
ul.fieldList > li.requiredField:before { display: inline-block; content: " \002612 "; margin-right: .5em; }
|
||||
ul.fieldList > li.humanTLToggled { border-color: #CB9B8C; background: #CB9B8C; box-shadow: 0 8px 6px -6px black; }
|
||||
ul.fieldList > li.humanTLToggled { border-color: var(--color-accent-hover); background: var(--color-accent-hover); box-shadow: 0 8px 6px -6px black; }
|
||||
|
||||
.options > a.buttonLike { display: inline-block; width: auto;
|
||||
.options > .buttonLike { display: inline-block; width: auto;
|
||||
margin: .15em 0; padding: .4em .5em;
|
||||
text-transform: inherit; cursor: pointer;
|
||||
background: initial; border: 2px solid #D6D6D6;
|
||||
background: initial; border: 2px solid var(--color-borders);
|
||||
opacity: 1;
|
||||
transition: background .4s, opacity .4s; }
|
||||
.options > a.buttonLike:hover { background: #D6D6D6; }
|
||||
.options > .buttonLike:hover { background: var(--color-borders); }
|
||||
|
||||
.actionList { margin: 1em 0 1em 1em; padding: .5em 0; }
|
||||
.actionList > li a { display: inline-block; padding: .3em; border-radius: .3em; transition: background .4s; }
|
||||
.actionList > li a:hover { background: #CB9B8C; }
|
||||
.actionList > li a:hover { background: var(--color-accent-hover); }
|
||||
|
||||
/* =============
|
||||
| Dark mode
|
||||
|============ */
|
||||
.loading:before,
|
||||
.loading:after { content: " "; display: block;
|
||||
position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
|
||||
height: 64px; width: 64px; margin: 0; padding: 0;
|
||||
border-radius: 50%;
|
||||
border: 8px solid var(--color-accent-hover);
|
||||
border-color: var(--color-accent-hover) transparent transparent transparent;
|
||||
z-index: 100;
|
||||
animation: rotating 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; animation-delay: -0.15s; }
|
||||
|
||||
.loading:after { animation-delay: -0.45s; }
|
||||
|
||||
@keyframes rotating {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
|
||||
header { display: block; width: 100%; padding: 0 2em; font-size: 1rem; z-index: 2; }
|
||||
header#mainHeader { margin-bottom: 2em;
|
||||
background: var(--color-fg-less); color: var(--color-bg-raised2); display: table; }
|
||||
header#mainHeader > * { display: table-cell; }
|
||||
@media screen and (max-width: 70em) {
|
||||
header#mainHeader > * { min-width: 20%; }
|
||||
}
|
||||
header#mainHeader > *:last-child { text-align: right; }
|
||||
|
||||
header#mainHeader, header#mainHeader * { z-index: 5; }
|
||||
header#mainHeader:hover,
|
||||
header#mainHeader *:hover { z-index: 6; }
|
||||
header * { z-index: 2; }
|
||||
header > * { display: inline-block; vertical-align: middle; }
|
||||
|
||||
header h2 { font-size: 1.1em; color: inherit; }
|
||||
|
||||
header select { background: inherit; font-size: .85rem; border: 0; }
|
||||
header select option { color: var(--color-fg-normal); }
|
||||
|
||||
header nav { color: var(--color-bg-raised2); }
|
||||
header nav > * { position: relative; display: inline-block; flex: 1; font-size: 1rem; padding: .7em 0; }
|
||||
|
||||
header#mainHeader img { display: inline-block; height: 1.9em; margin-right: .5em; vertical-align: middle; filter: invert(1); transition: opacity .4s; }
|
||||
header#mainHeader h2 { display: inline-block; vertical-align: middle; font-weight: normal; }
|
||||
header#mainHeader > a:focus > img,
|
||||
header#mainHeader > a:hover > img { opacity: .7; }
|
||||
|
||||
@media screen and (min-width: 75em) {
|
||||
|
||||
header nav > div > div { display: none; position: absolute; right: 0; top: 100%; width: 300px;
|
||||
background: var(--color-fg-less); text-align: left; }
|
||||
header nav > div > a { padding: .95em 1em; transition: background .4s, color .4s; }
|
||||
header nav > div:focus > a,
|
||||
header nav > div:hover > a { color: var(--color-gray); }
|
||||
header nav > div > a:focus + div,
|
||||
header nav > div:hover > div { display: block; animation: fade-in .4s; }
|
||||
header nav > div > a:focus + div > a,
|
||||
header nav > div:hover > div > a { display: block; padding: .5em 1em; cursor: pointer;
|
||||
transition: background .4s, color .4s; }
|
||||
header nav > div > a:focus + div > a:focus,
|
||||
header nav > div:hover > div > a:hover { background: var(--color-fg-normal); color: var(--color-bg-normal); }
|
||||
header { padding: 0 10em; }
|
||||
}
|
||||
|
||||
@media screen and (max-width: 75em) {
|
||||
body { font-size: 1.08em; }
|
||||
h1 img { display: none; }
|
||||
header .branding { padding: .7rem; }
|
||||
header nav:before { content: " \2630 "; display: inline-block; position: absolute; right: 3rem; top: 0;
|
||||
padding: .8rem 0; font-size: 1.5em; text-align: right; }
|
||||
header nav > * { display: none; }
|
||||
|
||||
header nav:hover:before { display: none; }
|
||||
header nav:hover { position: absolute; left: 0; top: 0; display: flex;
|
||||
width: 100%; min-height: 90vh; padding: 2em 1em .5em 1em; background: var(--color-bg-normal); color: var(--color-fg-normal);
|
||||
border-bottom: 1px solid var(--color-borders); box-shadow: 2px 2px 4px var(--color-borders);
|
||||
z-index: 3; animation: fade-in .4s; }
|
||||
|
||||
header nav:hover > * { display: block; flex: 1; min-width: 40vw; padding: 1em; font-size: 1em; }
|
||||
header nav:hover > div a { display: block; padding: .2em 0; }
|
||||
header { padding: 0 1em; }
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #263238; color: #ECEFF1; }
|
||||
input, select, textarea { background: inherit; color: inherit; border: 3px solid #37474F; transition: border .4s, box-shadow .4s; }
|
||||
a.buttonLike:focus,
|
||||
.options > a.buttonLike:focus,
|
||||
button:focus,
|
||||
select:focus,
|
||||
textarea:focus,
|
||||
input:focus,
|
||||
textarea:active,
|
||||
input:active,
|
||||
a.buttonLike:hover,
|
||||
.options > a.buttonLike:hover,
|
||||
ul.fieldList > li:hover,
|
||||
button:hover,
|
||||
select:hover,
|
||||
textarea:hover,
|
||||
input:hover { background: inherit; border-color: #FFF; box-shadow: initial; border-radius: .2em; }
|
||||
ul.fieldList > li,
|
||||
.options > a.buttonLike,
|
||||
a.buttonLike, button, input[type="submit"] { background: inherit; color: #FFF; border: 3px solid #FFC107; border-radius: .2em; transition: background .4s, color .4s, border .4s; }
|
||||
ul.fieldList > li { border-color: #37474F; }
|
||||
ul.fieldList > li.humanTLToggled,
|
||||
.options > a.buttonLike:hover,
|
||||
a.buttonLike:hover, button:hover { background: #FFC107; color: #000; border-color: #FFA000; }
|
||||
|
||||
a { color: #CFD8DC; }
|
||||
|
||||
.tiles > section h2 { background: #37474F; color: inherit; }
|
||||
.tiles > section:hover h2 { background: rgba(0,0,0,.2); color: inherit; }
|
||||
|
||||
h1, h1 > * { color: #CFD8DC; }
|
||||
body > div.uploader { background: inherit; border-color: #37474F; }
|
||||
|
||||
header#mainHeader,
|
||||
header nav,
|
||||
header nav > div > div { background: inherit; color: inherit; }
|
||||
header#mainHeader { border-bottom: 1px solid var(--color-bg-raised2); }
|
||||
}
|
||||
|
39
public/assets/css/csvxml.min.css
vendored
40
public/assets/css/dialogue.css
Normal file
@ -0,0 +1,40 @@
|
||||
/* ========
|
||||
| Reference overlay
|
||||
|= ======== */
|
||||
|
||||
#dialogueArea { display: block; position: fixed; left: 0; top: 0;
|
||||
width: 100%; height: 100%;
|
||||
max-width: initial; max-height: initial;
|
||||
background: rgba(0,0,0,.7); backdrop-filter: blur(3px);
|
||||
z-index: 10000; }
|
||||
#dialogue { display: block; position: absolute; left: 50%; top: 50%;
|
||||
transform: translate(-50%, -50%); min-width: 60vw; min-height: 2em;
|
||||
max-width: 90vw; max-height: 90vh; overflow-y: auto;
|
||||
padding: 1.5em 1em;
|
||||
background: var(--color-bg-normal); border-radius: .3em;
|
||||
box-shadow: 2px 2px 4px var(--color-fg-less), -2px -2px 4px var(--color-fg-less); }
|
||||
#dialogue h3 { margin-top: 0; padding-top: 0; text-transform: initial; color: var(--color-fg-less); }
|
||||
|
||||
#confirmButtons { text-align: right; }
|
||||
#dialogue .buttonLike { margin: .5em 0 .2em .5em; background: transparent; transition: background .4s, color .4s; }
|
||||
#dialogue .buttonLike:hover { background: var(--color-borders-dark); color: var(--color-bg-normal); }
|
||||
|
||||
#dialogue input[type="text"],
|
||||
#dialogue textarea { padding: .5em; border-radius: .1em; border: 2px solid var(--color-borders); transition: border .4s; }
|
||||
#dialogue input[type="text"]:hover,
|
||||
#dialogue textarea:hover { border-color: var(--color-fg-normal); }
|
||||
#dialogue button { padding: .6em .8em; font-size: .8em; background: var(--color-bg-normal); border: 1px solid var(--color-borders);
|
||||
transition: .4s; }
|
||||
#dialogue button:focus,
|
||||
#dialogue button:hover { background: var(--color-fg-less); color: var(--color-bg-normal); border-color: var(--color-fg-less); }
|
||||
#dialogue form > * { display: block; width: 100%; }
|
||||
#dialogue form label { font-weight: bold; color: var(--color-fg-less); }
|
||||
#dialogueClose { float: right; display: inline-block; padding: 0 .6em .2em .6em; background: var(--color-bg-raised);
|
||||
border-radius: 100%; cursor: pointer; transition: .4s; }
|
||||
#dialogueClose:hover { background: var(--color-fg-less); color: var(--color-bg-normal); }
|
||||
|
||||
#dialogue ul { margin-left: 1em; padding-left: 0; transition: .4s; }
|
||||
#dialogue ul.minimized { height: 20px; background-color: var(--color-accent-normal);
|
||||
background-size: 20px 20px;
|
||||
background-image: repeating-linear-gradient(to right, var(--color-fg-normal), var(--color-fg-normal) 1px, var(--color-accent-normal) 1px, var(--color-accent-normal)); }
|
||||
#dialogue ul.minimized > * { display: none; }
|
@ -3,11 +3,11 @@
|
||||
|= ======== */
|
||||
|
||||
.newToolTip { position: fixed; display: none !important; min-width: 300px !important; max-width: 600px;
|
||||
background: #212121 !important; color: #FFF; text-align: left; font-size: .95rem;
|
||||
border-radius: .2em; box-shadow: 1px 1px 4px #646464; z-index: 3000; white-space: initial !important; }
|
||||
background: var(--color-fg-less) !important; color: var(--color-bg-normal); text-align: left; font-size: .95rem;
|
||||
border-radius: .2em; box-shadow: 1px 1px 4px var(--color-borders-dark); z-index: 3000; white-space: initial !important; }
|
||||
#newToolTipMain:before { content: attr(data-title); display: block; padding: .5em 1em; max-width: 598px;
|
||||
background: #212121; color: #BDBDBD; font-weight: bold;
|
||||
box-shadow: 0px 4px 2px -2px #646464; }
|
||||
background: var(--color-fg-less); color: var(--color-bg-raised2); font-weight: bold;
|
||||
box-shadow: 0px 4px 2px -2px var(--color-borders-dark); }
|
||||
#newToolTipMain > * { padding: .5rem 1rem !important; }
|
||||
#newToolTipMain > table td { padding: .5rem 1em; vertical-align: top; }
|
||||
@media screen and (min-width:75em) {
|
||||
@ -21,10 +21,6 @@ dl#newToolTipMain dd { margin: -1em 0 0 0; padding: 0 0 0 0; }
|
||||
|
||||
.newToolTipMain p + .toolTipHierarchy { padding-bottom: 0 !important; }
|
||||
#newToolTipMain > h5 { padding: 0 1rem !important; margin: -.5rem 0 !important; }
|
||||
.toolTipHierarchy { margin: 0; padding: 0; border-top: 1px solid #424242; list-style: none; }
|
||||
.toolTipHierarchy ul { margin: 0; padding: .2em 0 .2em 0; list-style: none; }
|
||||
.toolTipHierarchy ul ul { padding: .1em 0 .1em 1.2em; }
|
||||
.toolTipHierarchy ul > li:before { content: " \002514 "; display: inline-block; padding-right: .4em; }
|
||||
|
||||
.copyToDialogue { cursor: pointer; }
|
||||
|
||||
|
BIN
public/assets/img/mdlogo-code-128px.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/assets/img/mdlogo-csvxml-1028px.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
public/assets/img/mdlogo-csvxml-192px.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
@ -1,130 +0,0 @@
|
||||
(function() {
|
||||
|
||||
let csvBySelectionButton = document.getElementById("csvBySelection");
|
||||
let unsetSelectionButton = document.getElementById("unsetSelection");
|
||||
|
||||
function checkCSVBySelectionAccessibility() {
|
||||
|
||||
let selected = document.getElementsByClassName("humanTLToggled");
|
||||
if (selected.length === 0) {
|
||||
csvBySelectionButton.classList.add("invisible");
|
||||
unsetSelection.classList.add("invisible");
|
||||
}
|
||||
else {
|
||||
csvBySelectionButton.classList.remove("invisible");
|
||||
unsetSelection.classList.remove("invisible");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Takes a callback function
|
||||
function doForFieldList(callback) {
|
||||
let fieldLists = document.getElementsByClassName("fieldList");
|
||||
for (let i = 0, max = fieldLists.length; i < max; i++) {
|
||||
|
||||
let fields = fieldLists[i].getElementsByTagName("li");
|
||||
for (let j = 0, maxj = fields.length; j < maxj; j++) {
|
||||
|
||||
callback(fields[j]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function toggleListFieldSelectionState(field) {
|
||||
|
||||
let newValue = field.getAttribute("data-alt");
|
||||
field.setAttribute("data-alt", field.textContent);
|
||||
field.textContent = newValue;
|
||||
field.classList.toggle("humanTLToggled");
|
||||
|
||||
if (field.classList.contains("humanTLToggled") === false) return;
|
||||
|
||||
let dependencies = field.getAttribute("data-dependencies");
|
||||
if (dependencies !== undefined && dependencies !== null) {
|
||||
let linkedFields = dependencies.split(";");
|
||||
for (let i = 0, max = linkedFields.length; i < max; i++) {
|
||||
let linkedField = document.getElementById(linkedFields[i]);
|
||||
if (linkedField.classList.contains("humanTLToggled") === true) continue;
|
||||
toggleListFieldSelectionState(linkedField);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
doForFieldList(function(field) {
|
||||
|
||||
// Each field should switch its visible content and human-readable
|
||||
// translation on a click.
|
||||
field.addEventListener('click', function(e) {
|
||||
|
||||
toggleListFieldSelectionState(field);
|
||||
checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
csvBySelectionButton.addEventListener('click', function(e) {
|
||||
|
||||
let selectionForm = document.createElement("form");
|
||||
selectionForm.method = "POST";
|
||||
selectionForm.action = "csv.php";
|
||||
|
||||
let hiddenInput = document.createElement("input");
|
||||
hiddenInput.type = "hidden";
|
||||
hiddenInput.name = "selectedFields";
|
||||
hiddenInput.value = "";
|
||||
|
||||
let selected = document.getElementsByClassName("humanTLToggled");
|
||||
for (let i = 0, max = selected.length; i < max; i++) {
|
||||
hiddenInput.value += selected[i].getAttribute("data-value") + ",";
|
||||
}
|
||||
|
||||
selectionForm.appendChild(hiddenInput);
|
||||
document.documentElement.appendChild(selectionForm);
|
||||
selectionForm.submit();
|
||||
|
||||
});
|
||||
|
||||
let selectRequired = document.getElementById("selectRequired");
|
||||
selectRequired.addEventListener('click', function(e) {
|
||||
|
||||
doForFieldList(function(field) {
|
||||
if (field.classList.contains("requiredField") === false) return;
|
||||
if (field.classList.contains("humanTLToggled") === true) return;
|
||||
|
||||
toggleListFieldSelectionState(field);
|
||||
checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
let selectAll = document.getElementById("selectAll");
|
||||
selectAll.addEventListener('click', function(e) {
|
||||
|
||||
doForFieldList(function(field) {
|
||||
if (field.classList.contains("humanTLToggled") === true) return;
|
||||
|
||||
toggleListFieldSelectionState(field);
|
||||
checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
unsetSelectionButton.addEventListener('click', function(e) {
|
||||
|
||||
doForFieldList(function(field) {
|
||||
if (field.classList.contains("humanTLToggled") === false) return;
|
||||
|
||||
toggleListFieldSelectionState(field);
|
||||
checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
})();
|
5
public/assets/js/csvxml-overview.min.js
vendored
@ -1,5 +0,0 @@
|
||||
(function(){let csvBySelectionButton=document.getElementById("csvBySelection");let unsetSelectionButton=document.getElementById("unsetSelection");function checkCSVBySelectionAccessibility(){let selected=document.getElementsByClassName("humanTLToggled");if(selected.length===0){csvBySelectionButton.classList.add("invisible");unsetSelection.classList.add("invisible")}else{csvBySelectionButton.classList.remove("invisible");unsetSelection.classList.remove("invisible")}}
|
||||
function doForFieldList(callback){let fieldLists=document.getElementsByClassName("fieldList");for(let i=0,max=fieldLists.length;i<max;i++){let fields=fieldLists[i].getElementsByTagName("li");for(let j=0,maxj=fields.length;j<maxj;j++){callback(fields[j])}}}
|
||||
function toggleListFieldSelectionState(field){let newValue=field.getAttribute("data-alt");field.setAttribute("data-alt",field.textContent);field.textContent=newValue;field.classList.toggle("humanTLToggled");if(field.classList.contains("humanTLToggled")===!1)return;let dependencies=field.getAttribute("data-dependencies");if(dependencies!==undefined&&dependencies!==null){let linkedFields=dependencies.split(";");for(let i=0,max=linkedFields.length;i<max;i++){let linkedField=document.getElementById(linkedFields[i]);if(linkedField.classList.contains("humanTLToggled")===!0)continue;toggleListFieldSelectionState(linkedField)}}}
|
||||
doForFieldList(function(field){field.addEventListener('click',function(e){toggleListFieldSelectionState(field);checkCSVBySelectionAccessibility()})});csvBySelectionButton.addEventListener('click',function(e){let selectionForm=document.createElement("form");selectionForm.method="POST";selectionForm.action="csv.php";let hiddenInput=document.createElement("input");hiddenInput.type="hidden";hiddenInput.name="selectedFields";hiddenInput.value="";let selected=document.getElementsByClassName("humanTLToggled");for(let i=0,max=selected.length;i<max;i++){hiddenInput.value+=selected[i].getAttribute("data-value")+","}
|
||||
selectionForm.appendChild(hiddenInput);document.documentElement.appendChild(selectionForm);selectionForm.submit()});let selectRequired=document.getElementById("selectRequired");selectRequired.addEventListener('click',function(e){doForFieldList(function(field){if(field.classList.contains("requiredField")===!1)return;if(field.classList.contains("humanTLToggled")===!0)return;toggleListFieldSelectionState(field);checkCSVBySelectionAccessibility()})});let selectAll=document.getElementById("selectAll");selectAll.addEventListener('click',function(e){doForFieldList(function(field){if(field.classList.contains("humanTLToggled")===!0)return;toggleListFieldSelectionState(field);checkCSVBySelectionAccessibility()})});unsetSelectionButton.addEventListener('click',function(e){doForFieldList(function(field){if(field.classList.contains("humanTLToggled")===!1)return;toggleListFieldSelectionState(field);checkCSVBySelectionAccessibility()})})})()
|
989
public/assets/js/csvxmlV2.js
Normal file
@ -0,0 +1,989 @@
|
||||
"use strict";
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
console.log("Registering service worker");
|
||||
navigator.serviceWorker.register('/sw.js');
|
||||
}
|
||||
|
||||
class CsvxmlValidator {
|
||||
|
||||
fieldList; // {}{}
|
||||
toValidate; // []{}
|
||||
errors; // {}array
|
||||
|
||||
constructor(fieldList, csvRaw) {
|
||||
|
||||
this.errors = {
|
||||
parsing: [],
|
||||
mandatoryTags: [],
|
||||
duplicateInvNos: [],
|
||||
dependentColumns: [],
|
||||
controlledLists: [],
|
||||
mainImageResource: [],
|
||||
};
|
||||
|
||||
this.fieldList = Object.freeze(fieldList);
|
||||
|
||||
const data = Papa.parse(csvRaw.trim(), {header: true});
|
||||
|
||||
if (data.errors.length !== 0) {
|
||||
window.alert(data.errors);
|
||||
}
|
||||
|
||||
let toValidate = data.data;
|
||||
|
||||
this.toValidate = toValidate;
|
||||
|
||||
if (toValidate.length === 0) {
|
||||
alert("Error: No lines of content identified");
|
||||
}
|
||||
|
||||
this.validate();
|
||||
}
|
||||
|
||||
validate() {
|
||||
|
||||
this.validateMandatoryTagsPresent();
|
||||
this.checkDuplicateInvNos();
|
||||
this.checkDependentColumns();
|
||||
this.checkControlledLists();
|
||||
// this.checkMainImageResource();
|
||||
|
||||
}
|
||||
|
||||
validateMandatoryTagsPresent() {
|
||||
|
||||
let mandatoryFields = [];
|
||||
for (let fieldName in this.fieldList) {
|
||||
if (this.fieldList[fieldName].required === true) {
|
||||
mandatoryFields.push(fieldName);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(this.toValidate);
|
||||
let lineCounter = 1;
|
||||
for (let line of this.toValidate) {
|
||||
for (let mandatoryField of mandatoryFields) {
|
||||
if (line[mandatoryField] === undefined || line[mandatoryField] === null || line[mandatoryField] === '') {
|
||||
this.errors.mandatoryTags.push("Missing or empty mandatory tag " + mandatoryField + " on line " + lineCounter);
|
||||
}
|
||||
}
|
||||
lineCounter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkDuplicateInvNos() {
|
||||
|
||||
let invNoEncountered = [];
|
||||
let lineCounter = 1;
|
||||
for (let line of this.toValidate) {
|
||||
if (invNoEncountered.includes(line.inventory_number)) {
|
||||
this.errors.duplicateInvNos.push("Duplicate inventory number " + line.inventory_number + " on line " + lineCounter);
|
||||
}
|
||||
invNoEncountered.push(line.inventory_number);
|
||||
lineCounter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkDependentColumns() {
|
||||
|
||||
const headers = Object.keys(this.toValidate[0]);
|
||||
|
||||
for (let header of headers) {
|
||||
if (this.fieldList[header] === undefined || this.fieldList[header].dependsOn === undefined || this.fieldList[header].dependsOn === null) continue;
|
||||
|
||||
let dependencies = this.fieldList[header].dependsOn;
|
||||
for (let dep of dependencies) {
|
||||
if (headers.includes(dep) === false) {
|
||||
this.errors.dependentColumns.push("Dependency issue at column " + header + ": Corresponding column " + dep + " is missing");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkControlledLists() {
|
||||
|
||||
let lineCounter = 1;
|
||||
for (let line of this.toValidate) {
|
||||
for (let fieldName in line) {
|
||||
|
||||
if (this.fieldList[fieldName] === undefined) {
|
||||
console.log("Undefined but requested field " + fieldName);
|
||||
continue;
|
||||
}
|
||||
|
||||
let allowedValues = this.fieldList[fieldName].allowedValues;
|
||||
|
||||
// No error if the field doesn't have a controlled list
|
||||
if (allowedValues === undefined || allowedValues === null) continue;
|
||||
// No error if the line's content is in the list
|
||||
if (Object.values(allowedValues).length === 0 || Object.values(allowedValues).includes(line[fieldName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
this.errors.controlledLists.push("Disallowed value used for column " + fieldName + " at line " + lineCounter + " (Allowed values are: " + Object.values(allowedValues).join(", ") + "; current value is " + line[fieldName] + ")");
|
||||
}
|
||||
lineCounter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkMainImageResource() {
|
||||
|
||||
}
|
||||
|
||||
isValid() {
|
||||
|
||||
for (let errorClass in this.errors) {
|
||||
if (this.errors[errorClass].length !== 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates XML for the parsed lines
|
||||
*/
|
||||
generateXml() {
|
||||
|
||||
let output = [];
|
||||
|
||||
let xmlDoc = document.implementation.createDocument(null, "record");
|
||||
for (let line of this.toValidate) {
|
||||
let root = xmlDoc.createElement("record");
|
||||
for (let fieldName in line) {
|
||||
const elem = xmlDoc.createElement(fieldName);
|
||||
elem.textContent = line[fieldName];
|
||||
root.appendChild(elem);
|
||||
}
|
||||
output.push(root)
|
||||
}
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class CsvxmlTooltip {
|
||||
|
||||
/**
|
||||
* Function for setting the alignment of an element.
|
||||
*
|
||||
* @param {Event} e Event triggering the execution of this function.
|
||||
* @param {DOMElement} elem Dom element to position.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
static getDirection(e, elem) {
|
||||
|
||||
if (window.innerHeight < e.clientY + elem.clientHeight) {
|
||||
elem.style.top = "";
|
||||
elem.style.bottom = (window.innerHeight - e.clientY) + "px";
|
||||
}
|
||||
else {
|
||||
elem.style.bottom = "";
|
||||
elem.style.top = (e.clientY + 4) + "px";
|
||||
}
|
||||
if (window.innerWidth < e.clientX + elem.clientWidth) {
|
||||
elem.style.left = "";
|
||||
elem.style.right = (window.innerWidth - e.clientX) + "px";
|
||||
} else {
|
||||
elem.style.right = "";
|
||||
elem.style.left = (e.clientX + 3) + "px";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static positionMobile(newMain) {
|
||||
|
||||
if (window.matchMedia && window.matchMedia('(max-width:75em)').matches) {
|
||||
|
||||
newMain.style.left = "";
|
||||
newMain.style.right = "";
|
||||
newMain.style.top = "";
|
||||
newMain.style.bottom = "";
|
||||
|
||||
if (newMain.classList.contains("atBottom") === false) {
|
||||
newMain.classList.add("atBottom");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static triggerMouseMove(e) {
|
||||
const newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain === undefined || newMain === null) return;
|
||||
CsvxmlTooltip.getDirection(e, newMain);
|
||||
CsvxmlTooltip.positionMobile(newMain);
|
||||
}
|
||||
|
||||
static triggerMouseOut(e) {
|
||||
|
||||
const newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain !== undefined && newMain !== null) {
|
||||
newMain.classList.remove("visible");
|
||||
document.body.removeChild(newMain);
|
||||
}
|
||||
e.target.removeEventListener('mouseout', CsvxmlTooltip.triggerMouseOut);
|
||||
|
||||
}
|
||||
|
||||
static bindTooltipToElement(elem, tooltipTitle, tooltipContent) {
|
||||
|
||||
elem.addEventListener('mouseover', function(e) {
|
||||
|
||||
let newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain !== null) return;
|
||||
newMain = document.createElement("div");
|
||||
newMain.classList.add("newToolTip");
|
||||
newMain.id = "newToolTipMain";
|
||||
|
||||
// Insert contents loaded.
|
||||
|
||||
newMain.setAttribute("data-title", tooltipTitle);
|
||||
|
||||
newMain.appendChild(tooltipContent);
|
||||
|
||||
document.body.appendChild(newMain);
|
||||
newMain.classList.add("visible");
|
||||
CsvxmlTooltip.getDirection(e, newMain);
|
||||
CsvxmlTooltip.positionMobile(newMain);
|
||||
|
||||
newMain.addEventListener("mouseout", function(e) {
|
||||
const newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain !== undefined && newMain !== null) {
|
||||
newMain.classList.remove("visible");
|
||||
document.body.removeChild(newMain);
|
||||
}
|
||||
});
|
||||
|
||||
elem.addEventListener("mouseout", CsvxmlTooltip.triggerMouseOut);
|
||||
|
||||
}, {passive: true});
|
||||
|
||||
elem.addEventListener("mousemove", CsvxmlTooltip.triggerMouseMove, {passive: true});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class CsvxmlDialogue {
|
||||
|
||||
static closeDialogue(e) {
|
||||
|
||||
if (e !== undefined) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
let dialogueArea = document.getElementById("dialogueArea");
|
||||
if (dialogueArea !== null && dialogueArea !== false) {
|
||||
while (dialogueArea.firstChild) {
|
||||
dialogueArea.removeChild(dialogueArea.firstChild);
|
||||
}
|
||||
dialogueArea.parentElement.removeChild(dialogueArea);
|
||||
|
||||
document.removeEventListener('keydown', CsvxmlDialogue.closeDialogueByEscape, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static closeDialogueByEscape(e) {
|
||||
|
||||
if (e.keyCode === 27) { // 27 = Esc
|
||||
|
||||
CsvxmlDialogue.closeDialogue(e);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for drawing a dialogue and attaching it to the body elem.
|
||||
*
|
||||
* @param {DOMElement} contents Contents.
|
||||
*/
|
||||
static drawDialogue(contents) {
|
||||
let dialogueArea = document.createElement("div");
|
||||
dialogueArea.id = "dialogueArea";
|
||||
|
||||
let dialogue = document.createElement("div");
|
||||
dialogue.id = "dialogue";
|
||||
|
||||
dialogue.appendChild(contents);
|
||||
dialogueArea.appendChild(dialogue);
|
||||
|
||||
document.body.appendChild(dialogueArea);
|
||||
|
||||
document.addEventListener('keydown', CsvxmlDialogue.closeDialogueByEscape);
|
||||
|
||||
return dialogue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class CsvxmlPage {
|
||||
|
||||
fieldList;
|
||||
fieldListFlat;
|
||||
tls;
|
||||
domUploaderWrapper;
|
||||
domMainWrapper;
|
||||
selectedFields;
|
||||
|
||||
csvBySelectionButton;
|
||||
unsetSelectionButton;
|
||||
|
||||
constructor(fieldList, tls) {
|
||||
this.fieldList = Object.freeze(fieldList);
|
||||
|
||||
let list = {};
|
||||
for (let sectionName in fieldList) {
|
||||
list = Object.assign(list, fieldList[sectionName]);
|
||||
}
|
||||
this.fieldListFlat = Object.freeze(list);
|
||||
|
||||
this.tls = Object.freeze(tls);
|
||||
|
||||
let domUploaderWrapper = document.createElement("div");
|
||||
domUploaderWrapper.id = "uploader";
|
||||
domUploaderWrapper.classList.add("uploader");
|
||||
this.domUploaderWrapper = domUploaderWrapper;
|
||||
|
||||
let domMainWrapper = document.createElement("main");
|
||||
this.domMainWrapper = domMainWrapper;
|
||||
|
||||
this.selectedFields = [];
|
||||
}
|
||||
|
||||
generateCsv(selectedFields = []) {
|
||||
|
||||
let line1 = [];
|
||||
let line2 = [];
|
||||
let line3 = [];
|
||||
|
||||
for (let fieldName in this.fieldListFlat) {
|
||||
console.log(fieldName);
|
||||
console.log(selectedFields);
|
||||
|
||||
if (selectedFields.length !== 0 && selectedFields.includes(fieldName) === false) continue;
|
||||
const field = this.fieldListFlat[fieldName];
|
||||
|
||||
line1.push(fieldName);
|
||||
line2.push(field.name_human_readable);
|
||||
|
||||
if (field.allowedValues !== undefined) {
|
||||
// Join for object
|
||||
let values = [];
|
||||
for (let key in field.allowedValues) values.push(field.allowedValues[key]);
|
||||
line3.push(values.join(","));
|
||||
}
|
||||
else line3.push("");
|
||||
|
||||
}
|
||||
|
||||
const csvLine1 = '"' + line1.join('";"') + '"';
|
||||
const csvLine2 = '"' + line2.join('";"') + '"';
|
||||
const csvLine3 = '"' + line3.join('";"') + '"';
|
||||
|
||||
const toStore = csvLine1 + "\n" + csvLine2 + "\n" + csvLine3;
|
||||
|
||||
// Download
|
||||
const triggerLink = document.createElement('a');
|
||||
triggerLink.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(toStore));
|
||||
triggerLink.setAttribute('download', "csvxml_museum-digital_template.csv");
|
||||
|
||||
triggerLink.style.display = 'none';
|
||||
|
||||
document.body.appendChild(triggerLink);
|
||||
triggerLink.click();
|
||||
document.body.removeChild(triggerLink);
|
||||
|
||||
|
||||
}
|
||||
|
||||
zipUploadToXml(validator) {
|
||||
|
||||
// Wrap zipping in function to postload it
|
||||
function runZipping() {
|
||||
|
||||
let zip = new JSZip();
|
||||
|
||||
let xmlFiles = validator.generateXml();
|
||||
const serializer = new XMLSerializer();
|
||||
let lineCounter = 0;
|
||||
for (let xml of xmlFiles) {
|
||||
zip.file(lineCounter + ".xml", serializer.serializeToString(xml));
|
||||
lineCounter++;
|
||||
}
|
||||
|
||||
zip.generateAsync({type:"blob"})
|
||||
.then(function(content) {
|
||||
const triggerLink = document.createElement('a');
|
||||
triggerLink.href = window.URL.createObjectURL(content);
|
||||
triggerLink.setAttribute('download', "csvxml.zip");
|
||||
|
||||
triggerLink.style.display = 'none';
|
||||
|
||||
document.body.appendChild(triggerLink);
|
||||
triggerLink.click();
|
||||
document.body.removeChild(triggerLink);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if (typeof JSZip === "undefined") {
|
||||
|
||||
const loadScript = document.createElement("script");
|
||||
loadScript.setAttribute("src", "assets/js/jszip/dist/jszip.min.js");
|
||||
loadScript.addEventListener('load', function() {
|
||||
// console.log("Post-loaded OpenLayers");
|
||||
runZipping();
|
||||
}, {passive: true, once: true});
|
||||
|
||||
document.body.appendChild(loadScript);
|
||||
}
|
||||
else {
|
||||
runZipping();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
listValidationErrors(validator) {
|
||||
|
||||
console.log("Listing validation errors");
|
||||
|
||||
const dialogueContent = document.createElement("div");
|
||||
|
||||
const headline = document.createElement("h3");
|
||||
headline.textContent = this.tls.validation_errors;
|
||||
|
||||
const cancelB = document.createElement("a");
|
||||
cancelB.classList.add("icons");
|
||||
cancelB.classList.add("iconsClose");
|
||||
cancelB.classList.add("dialogueCloseX");
|
||||
cancelB.id = "dialogueClose";
|
||||
cancelB.textContent = "X";
|
||||
cancelB.title = "Close";
|
||||
cancelB.href = "#" + location.href;
|
||||
cancelB.addEventListener('click', CsvxmlDialogue.closeDialogue);
|
||||
headline.appendChild(cancelB);
|
||||
|
||||
dialogueContent.appendChild(headline);
|
||||
|
||||
const domErrorsSection = document.createElement("div");
|
||||
|
||||
for (let errorType in validator.errors) {
|
||||
|
||||
if (validator.errors[errorType].length === 0) continue;
|
||||
|
||||
const ulHl = document.createElement("h4");
|
||||
ulHl.textContent = this.tls['errors_' + errorType] + " (" + validator.errors[errorType].length + ")";
|
||||
ulHl.style.cursor = "pointer";
|
||||
domErrorsSection.appendChild(ulHl);
|
||||
|
||||
const ul = document.createElement("ul");
|
||||
|
||||
for (let error of validator.errors[errorType]) {
|
||||
const li = document.createElement("li");
|
||||
li.textContent = error;
|
||||
ul.appendChild(li);
|
||||
}
|
||||
|
||||
ulHl.addEventListener('click', function() {
|
||||
ul.classList.toggle("minimized");
|
||||
});
|
||||
|
||||
domErrorsSection.appendChild(ul);
|
||||
|
||||
}
|
||||
|
||||
dialogueContent.appendChild(domErrorsSection);
|
||||
|
||||
const domDlSection = document.createElement("div");
|
||||
const domDlA = document.createElement("span");
|
||||
domDlA.textContent = this.tls.download;
|
||||
domDlA.classList.add("buttonLike");
|
||||
let app = this;
|
||||
domDlA.addEventListener('click', function() {
|
||||
app.zipUploadToXml(validator);
|
||||
});
|
||||
domDlSection.appendChild(domDlA);
|
||||
dialogueContent.appendChild(domDlSection);
|
||||
|
||||
dialogue = CsvxmlDialogue.drawDialogue(dialogueContent);
|
||||
|
||||
}
|
||||
|
||||
uploadFileForValidation(file) {
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.readAsText(file);
|
||||
|
||||
let app = this;
|
||||
|
||||
document.body.classList.add("loading");
|
||||
|
||||
reader.onload = function() {
|
||||
|
||||
function handleValidation() {
|
||||
|
||||
// On loading success, check if the upload is valid JSON
|
||||
console.log("Read file");
|
||||
// Validate the file
|
||||
let validator = new CsvxmlValidator(app.fieldListFlat, reader.result);
|
||||
document.body.classList.remove("loading");
|
||||
if (validator.isValid() === true) {
|
||||
alert("Document is valid. Press ok to download.");
|
||||
app.zipUploadToXml(validator);
|
||||
}
|
||||
else {
|
||||
console.log("Identified invalid upload document");
|
||||
app.listValidationErrors(validator);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
console.log("Postload papaparse");
|
||||
if (typeof Papa === "undefined") {
|
||||
|
||||
const loadScript = document.createElement("script");
|
||||
loadScript.setAttribute("src", "assets/js/papaparse/papaparse.min.js");
|
||||
loadScript.addEventListener('load', function() {
|
||||
// console.log("Post-loaded OpenLayers");
|
||||
handleValidation();
|
||||
}, {passive: true, once: true});
|
||||
document.body.appendChild(loadScript);
|
||||
|
||||
}
|
||||
else {
|
||||
handleValidation();
|
||||
}
|
||||
|
||||
};
|
||||
reader.onerror = function() {
|
||||
alert(reader.error);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
renderGenHeader() {
|
||||
|
||||
const header = document.createElement("header");
|
||||
header.id = "mainHeader";
|
||||
|
||||
const logoArea = document.createElement("a");
|
||||
logoArea.id = "logoArea";
|
||||
logoArea.href = "https://www.museum-digital.org/";
|
||||
|
||||
const logoImg = document.createElement("img");
|
||||
logoImg.src = "assets/img/mdlogo-code-128px.png";
|
||||
logoImg.alt = "Logo of museum-digital";
|
||||
logoArea.appendChild(logoImg);
|
||||
|
||||
const h2 = document.createElement("h2");
|
||||
h2.textContent = "museum-digital";
|
||||
logoArea.appendChild(h2);
|
||||
|
||||
header.appendChild(logoArea);
|
||||
|
||||
// Right side of the header
|
||||
const nav = document.createElement("nav");
|
||||
|
||||
const lAbout = document.createElement("a");
|
||||
lAbout.href = "https://en.about.museum-digital.org/about";
|
||||
lAbout.textContent = this.tls.about;
|
||||
nav.appendChild(lAbout);
|
||||
|
||||
const lContactList = document.createElement("div");
|
||||
|
||||
const lContact = document.createElement("a");
|
||||
lContact.textContent = this.tls.contact;
|
||||
lContact.href = "https://en.about.museum-digital.org/contact/";
|
||||
lContactList.appendChild(lContact);
|
||||
|
||||
const lContactDiv = document.createElement("div");
|
||||
|
||||
const lImprint = document.createElement("a");
|
||||
lImprint.textContent = this.tls.imprint;
|
||||
lImprint.href = "https://en.about.museum-digital.org/impressum";
|
||||
lContactDiv.appendChild(lImprint);
|
||||
|
||||
const lPrivacy = document.createElement("a");
|
||||
lPrivacy.textContent = this.tls.privacy_policy;
|
||||
lPrivacy.href = "https://en.about.museum-digital.org/privacy/";
|
||||
lContactDiv.appendChild(lPrivacy);
|
||||
|
||||
lContactList.appendChild(lContactDiv);
|
||||
nav.appendChild(lContactList);
|
||||
|
||||
const lNews = document.createElement("a")
|
||||
lNews.textContent = this.tls.news;
|
||||
lNews.href = "https://blog.museum-digital.org/";
|
||||
nav.appendChild(lNews);
|
||||
|
||||
header.appendChild(nav);
|
||||
document.body.appendChild(header);
|
||||
|
||||
}
|
||||
|
||||
renderHeader() {
|
||||
|
||||
const appHeader = document.createElement("header");
|
||||
|
||||
const h1 = document.createElement("h1");
|
||||
|
||||
const img = document.createElement("img");
|
||||
img.width = "70";
|
||||
img.height = "70";
|
||||
img.src = "assets/img/mdlogo-csvxml.svg";
|
||||
img.alt = "";
|
||||
h1.appendChild(img);
|
||||
|
||||
const h1Span = document.createElement("span");
|
||||
h1Span.textContent = "museum-digital:csvxml";
|
||||
h1.appendChild(h1Span);
|
||||
|
||||
appHeader.appendChild(h1);
|
||||
|
||||
document.body.appendChild(appHeader);
|
||||
|
||||
}
|
||||
|
||||
renderUploader() {
|
||||
|
||||
let app = this;
|
||||
(async function() {
|
||||
|
||||
const form = document.createElement("form");
|
||||
|
||||
const label = document.createElement("label");
|
||||
label.textContent = app.tls.select_csv_file_for_upload;
|
||||
label.setAttribute("for", "fileToUpload");
|
||||
form.appendChild(label);
|
||||
|
||||
const input = document.createElement("input");
|
||||
input.type = "file";
|
||||
input.id = "fileToUpload";
|
||||
input.setAttribute("tabindex", "1");
|
||||
input.accept = ".csv";
|
||||
input.required = "required";
|
||||
input.addEventListener('change', async function() {
|
||||
app.uploadFileForValidation(input.files[0]);
|
||||
});
|
||||
form.appendChild(input);
|
||||
|
||||
/*
|
||||
const button = document.createElement("button");
|
||||
button.textContent = "Upload"; // TODO
|
||||
button.type = "submit";
|
||||
form.appendChild(button);
|
||||
*/
|
||||
|
||||
app.domUploaderWrapper.appendChild(form);
|
||||
|
||||
})();
|
||||
|
||||
document.body.appendChild(this.domUploaderWrapper);
|
||||
|
||||
}
|
||||
|
||||
// Takes a callback function
|
||||
doForFieldList(callback) {
|
||||
let fieldLists = document.getElementsByClassName("fieldList");
|
||||
for (let i = 0, max = fieldLists.length; i < max; i++) {
|
||||
|
||||
let fields = fieldLists[i].getElementsByTagName("li");
|
||||
for (let j = 0, maxj = fields.length; j < maxj; j++) {
|
||||
|
||||
callback(fields[j]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
toggleListFieldSelectionState(field) {
|
||||
|
||||
let app = this;
|
||||
|
||||
let newValue = field.getAttribute("data-alt");
|
||||
field.setAttribute("data-alt", field.textContent);
|
||||
field.textContent = newValue;
|
||||
field.classList.toggle("humanTLToggled");
|
||||
|
||||
if (field.classList.contains("humanTLToggled") === false) return;
|
||||
|
||||
let dependencies = this.fieldListFlat[field.id].dependsOn;
|
||||
if (dependencies !== undefined && dependencies !== null) {
|
||||
let linkedFields = this.fieldListFlat[field.id].dependsOn;
|
||||
for (let i = 0, max = linkedFields.length; i < max; i++) {
|
||||
let linkedField = document.getElementById(linkedFields[i]);
|
||||
if (linkedField.classList.contains("humanTLToggled") === true) continue;
|
||||
this.toggleListFieldSelectionState(linkedField);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkCSVBySelectionAccessibility() {
|
||||
|
||||
let selected = document.getElementsByClassName("humanTLToggled");
|
||||
if (selected.length === 0) {
|
||||
this.csvBySelectionButton.classList.add("invisible");
|
||||
this.unsetSelectionButton.classList.add("invisible");
|
||||
}
|
||||
else {
|
||||
this.csvBySelectionButton.classList.remove("invisible");
|
||||
this.unsetSelectionButton.classList.remove("invisible");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
getOptionsSection() {
|
||||
|
||||
function genButton(id, text, link = "") {
|
||||
|
||||
const output = document.createElement("span");
|
||||
output.id = id;
|
||||
output.setAttribute("tabindex", "1");
|
||||
output.textContent = text;
|
||||
output.classList.add("buttonLike");
|
||||
if (link !== "") output.href = link;
|
||||
return output;
|
||||
|
||||
}
|
||||
|
||||
const options = document.createElement("div");
|
||||
options.classList.add("options");
|
||||
|
||||
const app = this;
|
||||
|
||||
const dlAllButton = genButton("dlAll", this.tls.download_csv_all);
|
||||
dlAllButton.cursor = "pointer";
|
||||
dlAllButton.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
app.generateCsv();
|
||||
});
|
||||
options.appendChild(dlAllButton);
|
||||
|
||||
this.csvBySelectionButton = genButton("csvBySelection", this.tls.download_csv_by_selection);
|
||||
this.csvBySelectionButton.classList.add("invisible");
|
||||
options.appendChild(this.csvBySelectionButton);
|
||||
|
||||
const optionSelectRequired = genButton("selectRequired", this.tls.select_required_fields);
|
||||
options.appendChild(optionSelectRequired);
|
||||
|
||||
const optionSelectAll = genButton("selectAll", this.tls.select_all_fields);
|
||||
options.appendChild(optionSelectAll);
|
||||
|
||||
this.unsetSelectionButton = genButton("unsetSelection", this.tls.unset_selection);
|
||||
this.unsetSelectionButton.classList.add("invisible");
|
||||
options.appendChild(this.unsetSelectionButton);
|
||||
|
||||
this.csvBySelectionButton.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
let selected = document.getElementsByClassName("humanTLToggled");
|
||||
let selectedFields = [];
|
||||
for (let i = 0, max = selected.length; i < max; i++) {
|
||||
selectedFields += selected[i].getAttribute("data-value");
|
||||
}
|
||||
app.generateCsv(selectedFields);
|
||||
|
||||
});
|
||||
|
||||
optionSelectRequired.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
app.doForFieldList(function(field) {
|
||||
if (field.classList.contains("requiredField") === false) return;
|
||||
if (field.classList.contains("humanTLToggled") === true) return;
|
||||
|
||||
app.toggleListFieldSelectionState(field);
|
||||
app.checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
optionSelectAll.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
app.doForFieldList(function(field) {
|
||||
if (field.classList.contains("humanTLToggled") === true) return;
|
||||
|
||||
app.toggleListFieldSelectionState(field);
|
||||
app.checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
this.unsetSelectionButton.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
app.doForFieldList(function(field) {
|
||||
if (field.classList.contains("humanTLToggled") === false) return;
|
||||
|
||||
app.toggleListFieldSelectionState(field);
|
||||
app.checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
return options;
|
||||
|
||||
}
|
||||
|
||||
renderMain() {
|
||||
|
||||
const domH2 = document.createElement("h2");
|
||||
domH2.textContent = this.tls.currently_approved_tags;
|
||||
this.domMainWrapper.appendChild(domH2);
|
||||
|
||||
this.domMainWrapper.appendChild(this.getOptionsSection());
|
||||
|
||||
for (let sectionName in this.fieldList) {
|
||||
|
||||
const domDiv = document.createElement("div");
|
||||
|
||||
const domH3 = document.createElement("h3");
|
||||
domH3.textContent = sectionName;
|
||||
domDiv.appendChild(domH3);
|
||||
|
||||
const domUl = document.createElement("ul");
|
||||
domUl.classList.add("fieldList");
|
||||
|
||||
const sectionFields = this.fieldList[sectionName];
|
||||
for (let fieldName in sectionFields) {
|
||||
const field = sectionFields[fieldName];
|
||||
|
||||
const domLi = document.createElement("li");
|
||||
domLi.textContent = fieldName;
|
||||
domLi.id = fieldName;
|
||||
domLi.setAttribute("data-alt", field.name_human_readable)
|
||||
domLi.setAttribute("data-value", fieldName)
|
||||
if (field.required === true) domLi.classList.add("requiredField");
|
||||
domUl.appendChild(domLi);
|
||||
|
||||
const tooltipContent = document.createElement("div");
|
||||
const explicaP = document.createElement("p");
|
||||
explicaP.textContent = field.explica;
|
||||
tooltipContent.appendChild(explicaP);
|
||||
|
||||
if (field.remarks !== undefined && field.remarks !== '') {
|
||||
|
||||
const remarkHl = document.createElement("h4");
|
||||
remarkHl.textContent = this.tls.remarks;
|
||||
tooltipContent.appendChild(remarkHl)
|
||||
const remarkCont = document.createElement("p");
|
||||
remarkCont = field.remarks;
|
||||
tooltipContent.appendChild(remarkCont);
|
||||
|
||||
}
|
||||
|
||||
if (field.allowedValues !== undefined && Object.values(field.allowedValues).length !== 0) {
|
||||
const allowedHl = document.createElement("h4");
|
||||
allowedHl.textContent = this.tls.allowed_values;
|
||||
tooltipContent.appendChild(allowedHl);
|
||||
const allowedList = document.createElement("p");
|
||||
allowedList.textContent = Object.values(field.allowedValues).join(', ');
|
||||
tooltipContent.appendChild(allowedList);
|
||||
}
|
||||
|
||||
CsvxmlTooltip.bindTooltipToElement(domLi, field.name_human_readable, tooltipContent);
|
||||
|
||||
}
|
||||
|
||||
domDiv.appendChild(domUl);
|
||||
|
||||
this.domMainWrapper.appendChild(domDiv);
|
||||
|
||||
}
|
||||
|
||||
document.body.appendChild(this.domMainWrapper);
|
||||
|
||||
let app = this;
|
||||
this.doForFieldList(function(field) {
|
||||
|
||||
// Each field should switch its visible content and human-readable
|
||||
// translation on a click.
|
||||
field.addEventListener('click', function(e) {
|
||||
|
||||
app.toggleListFieldSelectionState(field);
|
||||
app.checkCSVBySelectionAccessibility();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
(async function() {
|
||||
|
||||
function getLang() {
|
||||
|
||||
const allowedLangs = document.documentElement.getAttribute("data-allowed-langs").split(',');
|
||||
|
||||
if (navigator.language === undefined) return 'en';
|
||||
|
||||
const browserLang = navigator.language.toLowerCase().substr(0, 2);
|
||||
console.log(browserLang);
|
||||
|
||||
if (allowedLangs.includes(browserLang)) return browserLang;
|
||||
else return 'en';
|
||||
|
||||
}
|
||||
|
||||
const lang = getLang();
|
||||
document.documentElement.setAttribute("lang", lang);
|
||||
|
||||
document.body.classList.add("loading");
|
||||
|
||||
let loaded = 0;
|
||||
|
||||
let fieldList;
|
||||
let tls;
|
||||
|
||||
function loadPage() {
|
||||
|
||||
document.body.classList.remove("loading");
|
||||
|
||||
const page = new CsvxmlPage(fieldList, tls);
|
||||
page.renderGenHeader();
|
||||
page.renderHeader();
|
||||
page.renderUploader();
|
||||
page.renderMain();
|
||||
|
||||
}
|
||||
|
||||
window.fetch('/json/fields.' + lang + '.json', {
|
||||
method: 'GET', cache: 'no-cache', credentials: 'same-origin',
|
||||
}).then(function(response) {
|
||||
return response.json();
|
||||
}).then(function(elements) {
|
||||
fieldList = elements;
|
||||
loaded++;
|
||||
if (loaded === 2) loadPage();
|
||||
});
|
||||
|
||||
window.fetch('/json/tls.' + lang + '.json', {
|
||||
method: 'GET', cache: 'no-cache', credentials: 'same-origin',
|
||||
}).then(function(response) {
|
||||
return response.json();
|
||||
}).then(function(elements) {
|
||||
tls = elements;
|
||||
loaded++;
|
||||
if (loaded === 2) loadPage();
|
||||
});
|
||||
|
||||
})();
|
72
public/assets/js/csvxmlV2.min.js
vendored
Normal file
@ -0,0 +1,72 @@
|
||||
"use strict";if('serviceWorker'in navigator){console.log("Registering service worker");navigator.serviceWorker.register('/sw.js');}
|
||||
class CsvxmlValidator{fieldList;toValidate;errors;constructor(fieldList,csvRaw){this.errors={parsing:[],mandatoryTags:[],duplicateInvNos:[],dependentColumns:[],controlledLists:[],mainImageResource:[],};this.fieldList=Object.freeze(fieldList);const data=Papa.parse(csvRaw.trim(),{header:true});if(data.errors.length!==0){window.alert(data.errors);}
|
||||
let toValidate=data.data;this.toValidate=toValidate;if(toValidate.length===0){alert("Error: No lines of content identified");}
|
||||
this.validate();}
|
||||
validate(){this.validateMandatoryTagsPresent();this.checkDuplicateInvNos();this.checkDependentColumns();this.checkControlledLists();}
|
||||
validateMandatoryTagsPresent(){let mandatoryFields=[];for(let fieldName in this.fieldList){if(this.fieldList[fieldName].required===true){mandatoryFields.push(fieldName);}}
|
||||
console.log(this.toValidate);let lineCounter=1;for(let line of this.toValidate){for(let mandatoryField of mandatoryFields){if(line[mandatoryField]===undefined||line[mandatoryField]===null||line[mandatoryField]===''){this.errors.mandatoryTags.push("Missing or empty mandatory tag "+mandatoryField+" on line "+lineCounter);}}
|
||||
lineCounter++;}}
|
||||
checkDuplicateInvNos(){let invNoEncountered=[];let lineCounter=1;for(let line of this.toValidate){if(invNoEncountered.includes(line.inventory_number)){this.errors.duplicateInvNos.push("Duplicate inventory number "+line.inventory_number+" on line "+lineCounter);}
|
||||
invNoEncountered.push(line.inventory_number);lineCounter++;}}
|
||||
checkDependentColumns(){const headers=Object.keys(this.toValidate[0]);for(let header of headers){if(this.fieldList[header]===undefined||this.fieldList[header].dependsOn===undefined||this.fieldList[header].dependsOn===null)continue;let dependencies=this.fieldList[header].dependsOn;for(let dep of dependencies){if(headers.includes(dep)===false){this.errors.dependentColumns.push("Dependency issue at column "+header+": Corresponding column "+dep+" is missing");}}}}
|
||||
checkControlledLists(){let lineCounter=1;for(let line of this.toValidate){for(let fieldName in line){if(this.fieldList[fieldName]===undefined){console.log("Undefined but requested field "+fieldName);continue;}
|
||||
let allowedValues=this.fieldList[fieldName].allowedValues;if(allowedValues===undefined||allowedValues===null)continue;if(Object.values(allowedValues).length===0||Object.values(allowedValues).includes(line[fieldName])){continue;}
|
||||
this.errors.controlledLists.push("Disallowed value used for column "+fieldName+" at line "+lineCounter+" (Allowed values are: "+Object.values(allowedValues).join(", ")+"; current value is "+line[fieldName]+")");}
|
||||
lineCounter++;}}
|
||||
checkMainImageResource(){}
|
||||
isValid(){for(let errorClass in this.errors){if(this.errors[errorClass].length!==0)return false;}
|
||||
return true;}
|
||||
generateXml(){let output=[];let xmlDoc=document.implementation.createDocument(null,"record");for(let line of this.toValidate){let root=xmlDoc.createElement("record");for(let fieldName in line){const elem=xmlDoc.createElement(fieldName);elem.textContent=line[fieldName];root.appendChild(elem);}
|
||||
output.push(root)}
|
||||
return output;}}
|
||||
class CsvxmlTooltip{static getDirection(e,elem){if(window.innerHeight<e.clientY+elem.clientHeight){elem.style.top="";elem.style.bottom=(window.innerHeight-e.clientY)+"px";}
|
||||
else{elem.style.bottom="";elem.style.top=(e.clientY+4)+"px";}
|
||||
if(window.innerWidth<e.clientX+elem.clientWidth){elem.style.left="";elem.style.right=(window.innerWidth-e.clientX)+"px";}else{elem.style.right="";elem.style.left=(e.clientX+3)+"px";}}
|
||||
static positionMobile(newMain){if(window.matchMedia&&window.matchMedia('(max-width:75em)').matches){newMain.style.left="";newMain.style.right="";newMain.style.top="";newMain.style.bottom="";if(newMain.classList.contains("atBottom")===false){newMain.classList.add("atBottom");}}}
|
||||
static triggerMouseMove(e){const newMain=document.getElementById("newToolTipMain");if(newMain===undefined||newMain===null)return;CsvxmlTooltip.getDirection(e,newMain);CsvxmlTooltip.positionMobile(newMain);}
|
||||
static triggerMouseOut(e){const newMain=document.getElementById("newToolTipMain");if(newMain!==undefined&&newMain!==null){newMain.classList.remove("visible");document.body.removeChild(newMain);}
|
||||
e.target.removeEventListener('mouseout',CsvxmlTooltip.triggerMouseOut);}
|
||||
static bindTooltipToElement(elem,tooltipTitle,tooltipContent){elem.addEventListener('mouseover',function(e){let newMain=document.getElementById("newToolTipMain");if(newMain!==null)return;newMain=document.createElement("div");newMain.classList.add("newToolTip");newMain.id="newToolTipMain";newMain.setAttribute("data-title",tooltipTitle);newMain.appendChild(tooltipContent);document.body.appendChild(newMain);newMain.classList.add("visible");CsvxmlTooltip.getDirection(e,newMain);CsvxmlTooltip.positionMobile(newMain);newMain.addEventListener("mouseout",function(e){const newMain=document.getElementById("newToolTipMain");if(newMain!==undefined&&newMain!==null){newMain.classList.remove("visible");document.body.removeChild(newMain);}});elem.addEventListener("mouseout",CsvxmlTooltip.triggerMouseOut);},{passive:true});elem.addEventListener("mousemove",CsvxmlTooltip.triggerMouseMove,{passive:true});}}
|
||||
class CsvxmlDialogue{static closeDialogue(e){if(e!==undefined){e.preventDefault();e.stopPropagation();}
|
||||
let dialogueArea=document.getElementById("dialogueArea");if(dialogueArea!==null&&dialogueArea!==false){while(dialogueArea.firstChild){dialogueArea.removeChild(dialogueArea.firstChild);}
|
||||
dialogueArea.parentElement.removeChild(dialogueArea);document.removeEventListener('keydown',CsvxmlDialogue.closeDialogueByEscape,false);}}
|
||||
static closeDialogueByEscape(e){if(e.keyCode===27){CsvxmlDialogue.closeDialogue(e);}}
|
||||
static drawDialogue(contents){let dialogueArea=document.createElement("div");dialogueArea.id="dialogueArea";let dialogue=document.createElement("div");dialogue.id="dialogue";dialogue.appendChild(contents);dialogueArea.appendChild(dialogue);document.body.appendChild(dialogueArea);document.addEventListener('keydown',CsvxmlDialogue.closeDialogueByEscape);return dialogue;}}
|
||||
class CsvxmlPage{fieldList;fieldListFlat;tls;domUploaderWrapper;domMainWrapper;selectedFields;csvBySelectionButton;unsetSelectionButton;constructor(fieldList,tls){this.fieldList=Object.freeze(fieldList);let list={};for(let sectionName in fieldList){list=Object.assign(list,fieldList[sectionName]);}
|
||||
this.fieldListFlat=Object.freeze(list);this.tls=Object.freeze(tls);let domUploaderWrapper=document.createElement("div");domUploaderWrapper.id="uploader";domUploaderWrapper.classList.add("uploader");this.domUploaderWrapper=domUploaderWrapper;let domMainWrapper=document.createElement("main");this.domMainWrapper=domMainWrapper;this.selectedFields=[];}
|
||||
generateCsv(selectedFields=[]){let line1=[];let line2=[];let line3=[];for(let fieldName in this.fieldListFlat){console.log(fieldName);console.log(selectedFields);if(selectedFields.length!==0&&selectedFields.includes(fieldName)===false)continue;const field=this.fieldListFlat[fieldName];line1.push(fieldName);line2.push(field.name_human_readable);if(field.allowedValues!==undefined){let values=[];for(let key in field.allowedValues)values.push(field.allowedValues[key]);line3.push(values.join(","));}
|
||||
else line3.push("");}
|
||||
const csvLine1='"'+line1.join('";"')+'"';const csvLine2='"'+line2.join('";"')+'"';const csvLine3='"'+line3.join('";"')+'"';const toStore=csvLine1+"\n"+csvLine2+"\n"+csvLine3;const triggerLink=document.createElement('a');triggerLink.setAttribute('href','data:text/plain;charset=utf-8,'+encodeURIComponent(toStore));triggerLink.setAttribute('download',"csvxml_museum-digital_template.csv");triggerLink.style.display='none';document.body.appendChild(triggerLink);triggerLink.click();document.body.removeChild(triggerLink);}
|
||||
zipUploadToXml(validator){function runZipping(){let zip=new JSZip();let xmlFiles=validator.generateXml();const serializer=new XMLSerializer();let lineCounter=0;for(let xml of xmlFiles){zip.file(lineCounter+".xml",serializer.serializeToString(xml));lineCounter++;}
|
||||
zip.generateAsync({type:"blob"}).then(function(content){const triggerLink=document.createElement('a');triggerLink.href=window.URL.createObjectURL(content);triggerLink.setAttribute('download',"csvxml.zip");triggerLink.style.display='none';document.body.appendChild(triggerLink);triggerLink.click();document.body.removeChild(triggerLink);});}
|
||||
if(typeof JSZip==="undefined"){const loadScript=document.createElement("script");loadScript.setAttribute("src","assets/js/jszip/dist/jszip.min.js");loadScript.addEventListener('load',function(){runZipping();},{passive:true,once:true});document.body.appendChild(loadScript);}
|
||||
else{runZipping();}}
|
||||
listValidationErrors(validator){console.log("Listing validation errors");const dialogueContent=document.createElement("div");const headline=document.createElement("h3");headline.textContent=this.tls.validation_errors;const cancelB=document.createElement("a");cancelB.classList.add("icons");cancelB.classList.add("iconsClose");cancelB.classList.add("dialogueCloseX");cancelB.id="dialogueClose";cancelB.textContent="X";cancelB.title="Close";cancelB.href="#"+location.href;cancelB.addEventListener('click',CsvxmlDialogue.closeDialogue);headline.appendChild(cancelB);dialogueContent.appendChild(headline);const domErrorsSection=document.createElement("div");for(let errorType in validator.errors){if(validator.errors[errorType].length===0)continue;const ulHl=document.createElement("h4");ulHl.textContent=this.tls['errors_'+errorType]+" ("+validator.errors[errorType].length+")";ulHl.style.cursor="pointer";domErrorsSection.appendChild(ulHl);const ul=document.createElement("ul");for(let error of validator.errors[errorType]){const li=document.createElement("li");li.textContent=error;ul.appendChild(li);}
|
||||
ulHl.addEventListener('click',function(){ul.classList.toggle("minimized");});domErrorsSection.appendChild(ul);}
|
||||
dialogueContent.appendChild(domErrorsSection);const domDlSection=document.createElement("div");const domDlA=document.createElement("span");domDlA.textContent=this.tls.download;domDlA.classList.add("buttonLike");let app=this;domDlA.addEventListener('click',function(){app.zipUploadToXml(validator);});domDlSection.appendChild(domDlA);dialogueContent.appendChild(domDlSection);dialogue=CsvxmlDialogue.drawDialogue(dialogueContent);}
|
||||
uploadFileForValidation(file){const reader=new FileReader();reader.readAsText(file);let app=this;document.body.classList.add("loading");reader.onload=function(){function handleValidation(){console.log("Read file");let validator=new CsvxmlValidator(app.fieldListFlat,reader.result);document.body.classList.remove("loading");if(validator.isValid()===true){alert("Document is valid. Press ok to download.");app.zipUploadToXml(validator);}
|
||||
else{console.log("Identified invalid upload document");app.listValidationErrors(validator);}}
|
||||
console.log("Postload papaparse");if(typeof Papa==="undefined"){const loadScript=document.createElement("script");loadScript.setAttribute("src","assets/js/papaparse/papaparse.min.js");loadScript.addEventListener('load',function(){handleValidation();},{passive:true,once:true});document.body.appendChild(loadScript);}
|
||||
else{handleValidation();}};reader.onerror=function(){alert(reader.error);};}
|
||||
renderGenHeader(){const header=document.createElement("header");header.id="mainHeader";const logoArea=document.createElement("a");logoArea.id="logoArea";logoArea.href="https://www.museum-digital.org/";const logoImg=document.createElement("img");logoImg.src="assets/img/mdlogo-code-128px.png";logoImg.alt="Logo of museum-digital";logoArea.appendChild(logoImg);const h2=document.createElement("h2");h2.textContent="museum-digital";logoArea.appendChild(h2);header.appendChild(logoArea);const nav=document.createElement("nav");const lAbout=document.createElement("a");lAbout.href="https://en.about.museum-digital.org/about";lAbout.textContent=this.tls.about;nav.appendChild(lAbout);const lContactList=document.createElement("div");const lContact=document.createElement("a");lContact.textContent=this.tls.contact;lContact.href="https://en.about.museum-digital.org/contact/";lContactList.appendChild(lContact);const lContactDiv=document.createElement("div");const lImprint=document.createElement("a");lImprint.textContent=this.tls.imprint;lImprint.href="https://en.about.museum-digital.org/impressum";lContactDiv.appendChild(lImprint);const lPrivacy=document.createElement("a");lPrivacy.textContent=this.tls.privacy_policy;lPrivacy.href="https://en.about.museum-digital.org/privacy/";lContactDiv.appendChild(lPrivacy);lContactList.appendChild(lContactDiv);nav.appendChild(lContactList);const lNews=document.createElement("a")
|
||||
lNews.textContent=this.tls.news;lNews.href="https://blog.museum-digital.org/";nav.appendChild(lNews);header.appendChild(nav);document.body.appendChild(header);}
|
||||
renderHeader(){const appHeader=document.createElement("header");const h1=document.createElement("h1");const img=document.createElement("img");img.width="70";img.height="70";img.src="assets/img/mdlogo-csvxml.svg";img.alt="";h1.appendChild(img);const h1Span=document.createElement("span");h1Span.textContent="museum-digital:csvxml";h1.appendChild(h1Span);appHeader.appendChild(h1);document.body.appendChild(appHeader);}
|
||||
renderUploader(){let app=this;(async function(){const form=document.createElement("form");const label=document.createElement("label");label.textContent=app.tls.select_csv_file_for_upload;label.setAttribute("for","fileToUpload");form.appendChild(label);const input=document.createElement("input");input.type="file";input.id="fileToUpload";input.setAttribute("tabindex","1");input.accept=".csv";input.required="required";input.addEventListener('change',async function(){app.uploadFileForValidation(input.files[0]);});form.appendChild(input);app.domUploaderWrapper.appendChild(form);})();document.body.appendChild(this.domUploaderWrapper);}
|
||||
doForFieldList(callback){let fieldLists=document.getElementsByClassName("fieldList");for(let i=0,max=fieldLists.length;i<max;i++){let fields=fieldLists[i].getElementsByTagName("li");for(let j=0,maxj=fields.length;j<maxj;j++){callback(fields[j]);}}}
|
||||
toggleListFieldSelectionState(field){let app=this;let newValue=field.getAttribute("data-alt");field.setAttribute("data-alt",field.textContent);field.textContent=newValue;field.classList.toggle("humanTLToggled");if(field.classList.contains("humanTLToggled")===false)return;let dependencies=this.fieldListFlat[field.id].dependsOn;if(dependencies!==undefined&&dependencies!==null){let linkedFields=this.fieldListFlat[field.id].dependsOn;for(let i=0,max=linkedFields.length;i<max;i++){let linkedField=document.getElementById(linkedFields[i]);if(linkedField.classList.contains("humanTLToggled")===true)continue;this.toggleListFieldSelectionState(linkedField);}}}
|
||||
checkCSVBySelectionAccessibility(){let selected=document.getElementsByClassName("humanTLToggled");if(selected.length===0){this.csvBySelectionButton.classList.add("invisible");this.unsetSelectionButton.classList.add("invisible");}
|
||||
else{this.csvBySelectionButton.classList.remove("invisible");this.unsetSelectionButton.classList.remove("invisible");}}
|
||||
getOptionsSection(){function genButton(id,text,link=""){const output=document.createElement("span");output.id=id;output.setAttribute("tabindex","1");output.textContent=text;output.classList.add("buttonLike");if(link!=="")output.href=link;return output;}
|
||||
const options=document.createElement("div");options.classList.add("options");const app=this;const dlAllButton=genButton("dlAll",this.tls.download_csv_all);dlAllButton.cursor="pointer";dlAllButton.addEventListener('click',function(e){e.preventDefault();app.generateCsv();});options.appendChild(dlAllButton);this.csvBySelectionButton=genButton("csvBySelection",this.tls.download_csv_by_selection);this.csvBySelectionButton.classList.add("invisible");options.appendChild(this.csvBySelectionButton);const optionSelectRequired=genButton("selectRequired",this.tls.select_required_fields);options.appendChild(optionSelectRequired);const optionSelectAll=genButton("selectAll",this.tls.select_all_fields);options.appendChild(optionSelectAll);this.unsetSelectionButton=genButton("unsetSelection",this.tls.unset_selection);this.unsetSelectionButton.classList.add("invisible");options.appendChild(this.unsetSelectionButton);this.csvBySelectionButton.addEventListener('click',function(e){e.preventDefault();let selected=document.getElementsByClassName("humanTLToggled");let selectedFields=[];for(let i=0,max=selected.length;i<max;i++){selectedFields+=selected[i].getAttribute("data-value");}
|
||||
app.generateCsv(selectedFields);});optionSelectRequired.addEventListener('click',function(e){e.preventDefault();app.doForFieldList(function(field){if(field.classList.contains("requiredField")===false)return;if(field.classList.contains("humanTLToggled")===true)return;app.toggleListFieldSelectionState(field);app.checkCSVBySelectionAccessibility();});});optionSelectAll.addEventListener('click',function(e){e.preventDefault();app.doForFieldList(function(field){if(field.classList.contains("humanTLToggled")===true)return;app.toggleListFieldSelectionState(field);app.checkCSVBySelectionAccessibility();});});this.unsetSelectionButton.addEventListener('click',function(e){e.preventDefault();app.doForFieldList(function(field){if(field.classList.contains("humanTLToggled")===false)return;app.toggleListFieldSelectionState(field);app.checkCSVBySelectionAccessibility();});});return options;}
|
||||
renderMain(){const domH2=document.createElement("h2");domH2.textContent=this.tls.currently_approved_tags;this.domMainWrapper.appendChild(domH2);this.domMainWrapper.appendChild(this.getOptionsSection());for(let sectionName in this.fieldList){const domDiv=document.createElement("div");const domH3=document.createElement("h3");domH3.textContent=sectionName;domDiv.appendChild(domH3);const domUl=document.createElement("ul");domUl.classList.add("fieldList");const sectionFields=this.fieldList[sectionName];for(let fieldName in sectionFields){const field=sectionFields[fieldName];const domLi=document.createElement("li");domLi.textContent=fieldName;domLi.id=fieldName;domLi.setAttribute("data-alt",field.name_human_readable)
|
||||
domLi.setAttribute("data-value",fieldName)
|
||||
if(field.required===true)domLi.classList.add("requiredField");domUl.appendChild(domLi);const tooltipContent=document.createElement("div");const explicaP=document.createElement("p");explicaP.textContent=field.explica;tooltipContent.appendChild(explicaP);if(field.remarks!==undefined&&field.remarks!==''){const remarkHl=document.createElement("h4");remarkHl.textContent=this.tls.remarks;tooltipContent.appendChild(remarkHl)
|
||||
const remarkCont=document.createElement("p");remarkCont=field.remarks;tooltipContent.appendChild(remarkCont);}
|
||||
if(field.allowedValues!==undefined&&Object.values(field.allowedValues).length!==0){const allowedHl=document.createElement("h4");allowedHl.textContent=this.tls.allowed_values;tooltipContent.appendChild(allowedHl);const allowedList=document.createElement("p");allowedList.textContent=Object.values(field.allowedValues).join(', ');tooltipContent.appendChild(allowedList);}
|
||||
CsvxmlTooltip.bindTooltipToElement(domLi,field.name_human_readable,tooltipContent);}
|
||||
domDiv.appendChild(domUl);this.domMainWrapper.appendChild(domDiv);}
|
||||
document.body.appendChild(this.domMainWrapper);let app=this;this.doForFieldList(function(field){field.addEventListener('click',function(e){app.toggleListFieldSelectionState(field);app.checkCSVBySelectionAccessibility();});});}}
|
||||
(async function(){function getLang(){const allowedLangs=document.documentElement.getAttribute("data-allowed-langs").split(',');if(navigator.language===undefined)return 'en';const browserLang=navigator.language.toLowerCase().substr(0,2);console.log(browserLang);if(allowedLangs.includes(browserLang))return browserLang;else return 'en';}
|
||||
const lang=getLang();document.documentElement.setAttribute("lang",lang);document.body.classList.add("loading");let loaded=0;let fieldList;let tls;function loadPage(){document.body.classList.remove("loading");const page=new CsvxmlPage(fieldList,tls);page.renderGenHeader();page.renderHeader();page.renderUploader();page.renderMain();}
|
||||
window.fetch('/json/fields.'+lang+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin',}).then(function(response){return response.json();}).then(function(elements){fieldList=elements;loaded++;if(loaded===2)loadPage();});window.fetch('/json/tls.'+lang+'.json',{method:'GET',cache:'no-cache',credentials:'same-origin',}).then(function(response){return response.json();}).then(function(elements){tls=elements;loaded++;if(loaded===2)loadPage();});})();
|
16
public/assets/js/jszip/.codeclimate.yml
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
engines:
|
||||
duplication:
|
||||
enabled: true
|
||||
config:
|
||||
languages:
|
||||
- javascript
|
||||
eslint:
|
||||
enabled: true
|
||||
fixme:
|
||||
enabled: true
|
||||
ratings:
|
||||
paths:
|
||||
- "lib/*.js"
|
||||
exclude_paths:
|
||||
- "dist/*"
|
8
public/assets/js/jszip/.editorconfig
Normal file
@ -0,0 +1,8 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 4
|
43
public/assets/js/jszip/.eslintrc.js
Normal file
@ -0,0 +1,43 @@
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
"env": {
|
||||
"browser": true,
|
||||
"commonjs": true,
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest"
|
||||
},
|
||||
"ignorePatterns": ["vendor/*.js", "dist/*.js", "test/jquery-1.8.3.min.js"],
|
||||
"rules": {
|
||||
"indent": [
|
||||
"error",
|
||||
4
|
||||
],
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
],
|
||||
"quotes": [
|
||||
"error",
|
||||
"double"
|
||||
],
|
||||
"semi": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"curly": "error",
|
||||
"eqeqeq": "error",
|
||||
"no-new": "error",
|
||||
"no-caller": "error",
|
||||
"guard-for-in": "error",
|
||||
"no-extend-native": "error",
|
||||
"strict": [
|
||||
"error",
|
||||
"global"
|
||||
],
|
||||
}
|
||||
};
|
1
public/assets/js/jszip/.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1 @@
|
||||
github: Stuk
|
58
public/assets/js/jszip/.github/workflows/pr.yaml
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
name: pull-request
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
push:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Cache Node modules
|
||||
uses: actions/cache@v3
|
||||
id: npm-cache
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-node-
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install
|
||||
sudo npx playwright install-deps
|
||||
|
||||
- name: Lint
|
||||
run: npm run lint
|
||||
- name: Test
|
||||
run: npm test
|
||||
|
||||
- name: Benchmark
|
||||
run: npm run benchmark | tee benchmark.txt
|
||||
|
||||
- name: Download previous benchmark data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ./cache
|
||||
key: ${{ runner.os }}-benchmark
|
||||
|
||||
- name: Store benchmark result
|
||||
uses: benchmark-action/github-action-benchmark@v1
|
||||
with:
|
||||
tool: 'benchmarkjs'
|
||||
output-file-path: benchmark.txt
|
||||
external-data-json-path: ./cache/benchmark-data.json
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
alert-threshold: '150%'
|
||||
comment-on-alert: true
|
||||
fail-on-alert: true
|
||||
alert-comment-cc-users: '@Stuk'
|
7
public/assets/js/jszip/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
_site
|
||||
.c9revisions
|
||||
.DS_Store
|
||||
.jekyll-metadata
|
||||
*~
|
||||
node_modules
|
||||
sauce_connect.log
|
8
public/assets/js/jszip/.npmignore
Normal file
@ -0,0 +1,8 @@
|
||||
_config.yml
|
||||
bower.json
|
||||
component.json
|
||||
docs
|
||||
documentation
|
||||
Gruntfile.js
|
||||
index.html
|
||||
test
|
17
public/assets/js/jszip/.travis.yml
Normal file
@ -0,0 +1,17 @@
|
||||
language: node_js
|
||||
sudo: false
|
||||
matrix:
|
||||
include:
|
||||
- node_js: "stable"
|
||||
env: COMMAND=lint
|
||||
- node_js: "lts/*"
|
||||
env: COMMAND=test-node
|
||||
- node_js: "stable"
|
||||
env: COMMAND=test-node
|
||||
- node_js: "stable"
|
||||
env: COMMAND=test-browser
|
||||
env:
|
||||
global:
|
||||
- secure: MhA8GHU42X3GWTUMaqdZVvarx4BMjhQCUGNi3kvuD/iCmKVb7gMwj4jbds7AcJdsCRsRk8bBGzZs/E7HidBJMPDa5DhgLKy9EV1s42JlHq8lVzbJeWIGgrtyJvhVUkGRy2OJjnDSgh3U6elkQmvDn74jreSQc6m/yGoPFF1nqq8=
|
||||
- secure: qREw6aUu2DnB+2reMuHgygSkumRiJvt7Z5Fz4uEVoraqbe65e4PGhtzypr9uIgCN43vxS2D5tAIeDbfid5VQrWFUQnrC9O5Z5qgVPsKN94zZ1tvYurXI4wRlAg58nNjkfGXWhLI3VUjjDTp5gYcMqgfe5hpEFYUPnUQkKGnaqAk=
|
||||
script: npm run $COMMAND
|
651
public/assets/js/jszip/LICENSE.markdown
Normal file
@ -0,0 +1,651 @@
|
||||
JSZip is dual licensed. At your choice you may use it under the MIT license *or* the GPLv3
|
||||
license.
|
||||
|
||||
The MIT License
|
||||
===============
|
||||
|
||||
Copyright (c) 2009-2016 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
|
||||
GPL version 3
|
||||
=============
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
11577
public/assets/js/jszip/dist/jszip.js
vendored
Normal file
13
public/assets/js/jszip/dist/jszip.min.js
vendored
Normal file
@ -1,73 +0,0 @@
|
||||
/**
|
||||
* A simple implementation of a tooltip.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@jrenslin.de>
|
||||
*/
|
||||
|
||||
function generateToolTips() {
|
||||
|
||||
/**
|
||||
* Function for setting the alignment of an element.
|
||||
*
|
||||
* @param {Event} e Event triggering the execution of this function.
|
||||
* @param {DOMElement} elem Dom element to position.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
function getDirection(e, elem) {
|
||||
|
||||
if (window.innerHeight < e.clientY + elem.clientHeight) {
|
||||
elem.style.top = "";
|
||||
elem.style.bottom = (window.innerHeight - e.clientY) + "px";
|
||||
}
|
||||
else {
|
||||
elem.style.bottom = "";
|
||||
elem.style.top = (e.clientY + 2) + "px";
|
||||
}
|
||||
if (window.innerWidth < e.clientX + elem.clientWidth) {
|
||||
elem.style.left = "";
|
||||
elem.style.right = (window.innerWidth - e.clientX) + "px";
|
||||
} else {
|
||||
elem.style.right = "";
|
||||
elem.style.left = (e.clientX + 2) + "px";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
let triggers = document.getElementsByClassName("newToolTipTag");
|
||||
for (let i = 0, max = triggers.length; i < max; i++) {
|
||||
|
||||
let trigger = triggers[i];
|
||||
let dataTarget = trigger.getAttribute("data-for");
|
||||
let target = document.getElementById("tooltip_" + dataTarget);
|
||||
|
||||
trigger.addEventListener("mouseover", function(e) {
|
||||
let newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain !== null) return;
|
||||
newMain = target.cloneNode(true);
|
||||
newMain.id = "newToolTipMain";
|
||||
document.getElementsByTagName("body")[0].appendChild(newMain);
|
||||
newMain.classList.add("visible");
|
||||
getDirection(e, newMain);
|
||||
});
|
||||
trigger.addEventListener("mousemove", function(e) {
|
||||
let newMain = document.getElementById("newToolTipMain");
|
||||
getDirection(e, newMain);
|
||||
});
|
||||
trigger.addEventListener("mouseout", function(e) {
|
||||
let newMain = document.getElementById("newToolTipMain");
|
||||
if (newMain.classList.contains("sticked")) return;
|
||||
newMain.classList.remove("visible");
|
||||
document.getElementsByTagName("body")[0].removeChild(newMain);
|
||||
});
|
||||
/*
|
||||
trigger.addEventListener("click", function(e) {
|
||||
document.getElementById("newToolTipMain").classList.toggle("sticked");
|
||||
});
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
generateToolTips();
|
7
public/assets/js/papaparse/papaparse.min.js
vendored
Normal file
@ -1,80 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* Generates a CSV template based on the field list provided for CSVXML.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
if (session_status() != PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// This array contains all available languages
|
||||
$allowed_langs = ['ar', 'de', 'en', 'hu', 'id', 'it', 'pl','pt'];
|
||||
|
||||
// Some languages are in translation. They will only be available for logged in users.
|
||||
|
||||
if (isset($_GET['navlang'])) {
|
||||
$_SESSION['lang'] = $_GET['navlang'];
|
||||
if (!in_array($_SESSION['lang'], $allowed_langs)) $_SESSION['lang'] = 'de';
|
||||
}
|
||||
else if (!isset($_SESSION['lang'])) {
|
||||
$_SESSION['lang'] = MD_STD::lang_getfrombrowser($allowed_langs, 'en', "", false);
|
||||
}
|
||||
$lang = $_SESSION['lang'];
|
||||
|
||||
if (!empty($_POST) and !empty($_POST['selectedFields'])) {
|
||||
$selectionActive = true;
|
||||
$selectedFields = explode(",", trim($_POST['selectedFields'], ","));
|
||||
}
|
||||
else {
|
||||
$selectionActive = false;
|
||||
$selectedFields = [];
|
||||
}
|
||||
|
||||
$fieldsGetter = new CsvxmlAvailableFields($lang);
|
||||
$availableFields = $fieldsGetter->getFields();
|
||||
|
||||
$line1 = $line2 = $line3 = $line4 = [];
|
||||
|
||||
foreach ($availableFields as $headline => $fields) {
|
||||
|
||||
$i = 0;
|
||||
$tLine1 = $tLine2 = $tLine3 = $tLine4 = [];
|
||||
$tLine1[] = $headline;
|
||||
|
||||
foreach($fields as $fieldName => $field) {
|
||||
|
||||
if ($selectionActive === true and !in_array($fieldName, $selectedFields)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($i !== 0) $tLine1[] = "";
|
||||
$tLine2[] = $fieldName;
|
||||
$tLine3[] = $field->name_human_readable;
|
||||
# $tLine4[] = $field->remark;
|
||||
if (!empty($field->allowedValues)) $tLine4[] = end($field->allowedValues);
|
||||
else $tLine4[] = $field->name_human_readable;
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
if (empty($tLine2) or count($tLine2) === 0) continue;
|
||||
|
||||
for ($i = 1; $i <= 4; $i++) {
|
||||
${"line$i"} = array_merge(${"line$i"}, ${"tLine$i"});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
header('Content-Type: text/csv; charset=utf-8');
|
||||
if ($selectionActive === true)
|
||||
header("Content-Disposition: attachment; filename=csvxml_museum-digital_template-{$lang}_selection.csv");
|
||||
else
|
||||
header("Content-Disposition: attachment; filename=csvxml_museum-digital_template-{$lang}.csv");
|
||||
|
||||
for ($i = 2; $i <= 4; $i++) {
|
||||
echo mb_convert_encoding('"' . implode("\";\"", ${"line$i"}) . '"' . PHP_EOL, 'utf-16', 'utf-8');
|
||||
}
|
@ -5,16 +5,16 @@
|
||||
<title>Log in :: Translations :: museum-digital</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
||||
<link rel="manifest" href="./manifest.webmanifest" />
|
||||
<link rel="manifest" href="/manifest.webmanifest" />
|
||||
<meta name="description" content="Validate import CSV files for museum-digital" />
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css" />
|
||||
<link rel="shortcut icon" sizes="128x128" href="assets/img/mdlogo-csvxml.svg" />
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/csvxml.min.css" />
|
||||
<link rel="shortcut icon" sizes="128x128" href="/assets/img/mdlogo-csvxml.svg" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
<meta name="robots" content="noindex" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>
|
||||
<img src="assets/img/mdlogo-csvxml.svg" alt="" />
|
||||
<img src="/assets/img/mdlogo-csvxml.svg" alt="" />
|
||||
<span>museum-digital:csvxml</span>
|
||||
</h1>
|
||||
<h2>Error!</h2>
|
||||
|
33
public/index.htm
Normal file
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html data-allowed-langs="de,en,hu">
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css?v000003" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
|
||||
<title>CSVXML :: museum-digital</title>
|
||||
<meta name="twitter:title" content="CSVXML :: museum-digital" />
|
||||
<meta property="og:title" content="CSVXML :: museum-digital" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@museumdigital" />
|
||||
|
||||
<meta name="description" content="Validate import CSV files for museum-digital" />
|
||||
|
||||
<meta name="keywords" content="Imports, museum-digital" />
|
||||
|
||||
<link rel="shortcut icon" sizes="128x128" href="assets/img/mdlogo-csvxml.svg" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="assets/img/mdlogo-csvxml-192px.png" />
|
||||
<meta property="twitter:image" content="assets/img/mdlogo-csvxml.svg" />
|
||||
<meta property="og:image" content="assets/img/mdlogo-csvxml.svg" />
|
||||
|
||||
</head>
|
||||
<body class="loading">
|
||||
|
||||
<script src="assets/js/csvxmlV2.min.js?v000003" type="text/javascript" async></script>
|
||||
|
||||
</body>
|
||||
</html>
|
123
public/index.php
@ -1,123 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* New start page for CSVXML.
|
||||
*
|
||||
* @link https://groupit.museum-digital.de/csvxml/
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
if (session_status() != PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// This array contains all available languages
|
||||
$allowed_langs = ['ar', 'de', 'en', 'hu', 'id', 'it', 'pl','pt'];
|
||||
|
||||
// Some languages are in translation. They will only be available for logged in users.
|
||||
|
||||
if (isset($_GET['navlang'])) {
|
||||
$_SESSION['lang'] = $_GET['navlang'];
|
||||
if (!in_array($_SESSION['lang'], $allowed_langs)) $_SESSION['lang'] = 'de';
|
||||
}
|
||||
else if (!isset($_SESSION['lang'])) {
|
||||
$_SESSION['lang'] = MD_STD::lang_getfrombrowser($allowed_langs, 'en', "", false);
|
||||
}
|
||||
$lang = $_SESSION['lang'];
|
||||
|
||||
$outFormat = MD_STD_IN::get_http_input_text("output", "html", ['html', 'json']);
|
||||
|
||||
$tlLoader = new MDTlLoader("csxml_start", $lang);
|
||||
|
||||
$fieldsGetter = new CsvxmlAvailableFields($lang);
|
||||
$availableFields = $fieldsGetter->getFields();
|
||||
|
||||
if ($outFormat === 'json') {
|
||||
header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0'); // HTTP/1.1
|
||||
header('Pragma: no-cache'); // HTTP/1.0
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Methods: GET");
|
||||
header("Access-Control-Allow-Headers: X-PINGOTHER, Content-Type, Accept-Encoding, cache-control");
|
||||
header("Access-Control-Max-Age: 86400");
|
||||
header('content-type: application/json');
|
||||
echo json_encode($availableFields);
|
||||
return;
|
||||
}
|
||||
|
||||
$toInject = '
|
||||
<script src="assets/js/newToolTip.js" type="text/javascript" defer></script>
|
||||
';
|
||||
echo printHTMLHead($toInject);
|
||||
|
||||
echo '
|
||||
|
||||
<div class="uploader">
|
||||
<form enctype="multipart/form-data" action="upload.php" method="POST">
|
||||
<input type="hidden" id="csrf-token" name="csrf-token" aria-label="Anti-CSRF Token" value="' . htmlspecialchars(MD_STD_SEC::getAntiCsrfToken()) . '" />
|
||||
<label for="fileToUpload">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_csv_file_for_upload') . '</label>
|
||||
<input name="uploaded" type="file" accept=".csv" id="fileToUpload" required />
|
||||
<button type="submit">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'upload') . '</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h2>' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'currently_approved_tags') . '</h2>
|
||||
<div class="options">
|
||||
<a href="csv.php" class="buttonLike">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'download_csv_all') . '</a>
|
||||
<a class="buttonLike invisible" id="csvBySelection">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'download_csv_by_selection') . '</a>
|
||||
<br />
|
||||
<a class="buttonLike" id="selectRequired">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_required_fields') . '</a>
|
||||
<a class="buttonLike" id="selectAll">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_all_fields') . '</a>
|
||||
<a class="buttonLike invisible" id="unsetSelection">' . $tlLoader->tl("csvxml-overview", "csvxml_overview", 'unset_selection') . '</a>
|
||||
</div>
|
||||
';
|
||||
|
||||
$tooltips = [];
|
||||
foreach ($availableFields as $headline => $fields) {
|
||||
|
||||
echo "
|
||||
<h3>{$headline}</h3>
|
||||
<ul class='fieldList'>
|
||||
";
|
||||
|
||||
foreach($fields as $fieldName => $field) {
|
||||
|
||||
if (!empty($field->remark) or !empty($field->explica)) $hasTooltip = true;
|
||||
else $hasTooltip = false;
|
||||
|
||||
echo "
|
||||
<li id='{$fieldName}' data-alt='{$field->name_human_readable}' data-value='{$fieldName}' data-for='{$fieldName}' class='";
|
||||
if ($hasTooltip === true) echo " newToolTipTag";
|
||||
if (!empty($field->required) and $field->required === true) echo " requiredField";
|
||||
echo "'";
|
||||
if (!empty($field->dependsOn)) {
|
||||
echo " data-dependencies='" . htmlspecialchars(implode(";", $field->dependsOn)) . "'";
|
||||
}
|
||||
echo ">{$fieldName}";
|
||||
|
||||
if (!empty($field->explica)) $toolTipExplica = "</p><h5>General</h5><p>" . $field->explica;
|
||||
else $toolTipExplica = "";
|
||||
$toolTip = generateHelpTooltip($fieldName, "{$field->name_human_readable}", "{$field->remark}{$toolTipExplica}");
|
||||
if ($hasTooltip) $tooltips[] = $toolTip[0];
|
||||
echo "</li>";
|
||||
}
|
||||
|
||||
echo '
|
||||
</ul>
|
||||
';
|
||||
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>
|
||||
|
||||
';
|
||||
echo implode($tooltips);
|
||||
|
||||
echo '
|
||||
|
||||
</body>
|
||||
</html>
|
||||
';
|
@ -1,420 +0,0 @@
|
||||
<?PHP
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
if (session_status() != PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// This array contains all available languages
|
||||
$allowed_langs = ['ar', 'de', 'en', 'hu', 'id', 'it', 'pl','pt'];
|
||||
|
||||
// Some languages are in translation. They will only be available for logged in users.
|
||||
|
||||
if (isset($_GET['navlang'])) {
|
||||
$_SESSION['lang'] = $_GET['navlang'];
|
||||
if (!in_array($_SESSION['lang'], $allowed_langs)) $_SESSION['lang'] = 'de';
|
||||
} else if (!isset($_SESSION['lang'])) {
|
||||
$_SESSION['lang'] = MD_STD::lang_getfrombrowser($allowed_langs, 'en', "", false);
|
||||
}
|
||||
$lang = $_SESSION['lang'];
|
||||
$tlLoader = new MDTlLoader("csxml_evaluate", $lang);
|
||||
|
||||
$filename = $_GET['fnam'];
|
||||
$csv_datei = MD_STD::realpath(__DIR__ . '/../csv/' . $filename);
|
||||
|
||||
// Get allowed values * $fieldNoMultiplicator
|
||||
$fieldNoMultiplicator = 10;
|
||||
$fieldsGetter = new CsvxmlAvailableFields($lang);
|
||||
$availableFields = $fieldsGetter->getFields();
|
||||
$validator = new CSVXMLValidator();
|
||||
|
||||
$allowed = $eventpart = $eventpartsure = $fieldsWithDependency = $fieldsWithAllowedValueSet = [];
|
||||
|
||||
foreach ($availableFields as $categoryName => $fieldCategory) {
|
||||
$allowed = array_merge($allowed, array_keys($fieldCategory));
|
||||
|
||||
// Extended operations for events
|
||||
if (strpos($categoryName, $tlLoader->tl("basis", "basis", 'event')) !== false) {
|
||||
foreach ($fieldCategory as $key => $value) {
|
||||
if (strpos($key, "_annotation") !== false or strpos($key, "_gnd") !== false) continue;
|
||||
if (strpos($key, "_sure") !== false) $eventpartsure[] = $key;
|
||||
else $eventpart[] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($fieldCategory as $key => $value) {
|
||||
if (!empty($value->dependsOn)) {
|
||||
$fieldsWithDependency[$key] = $value->dependsOn;
|
||||
}
|
||||
if (!empty($value->allowedValues)) {
|
||||
$fieldsWithAllowedValueSet[$key] = $value->allowedValues;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$allowed_inclusion_kind_of = ['inclusion_kind_of', 'Schenkung', 'Kauf', 'Grabung', 'Notbergung', 'Erbschaft', 'Stiftung', 'Enteignung', 'Ursprungsbestand', 'Ajándékozás','Vétel','Feltárás','Hivatalos átadás','Csere','Gyűjtés','Saját előállítás','Törzsanyag','Letét', 'endowment', 'dispossession', 'old stock', ''];
|
||||
|
||||
echo printHTMLHead();
|
||||
|
||||
echo '<div class="maincontent">';
|
||||
echo 'Please wait ... (checking validity)';
|
||||
echo '<form action="index.php" style="margin:0px;padding:0px;">';
|
||||
echo '<input type="submit" value="Reload" />';
|
||||
echo '</form>';
|
||||
|
||||
///// Check #1
|
||||
//echo '<pre>';print_r($allowed);echo '</pre>';
|
||||
echo '1: Only allowed tags (column names) used?';
|
||||
$fp = fopen($csv_datei, 'r');
|
||||
$y = 0;
|
||||
while ($zeile = fgetcsv($fp, 100000, ';')) {
|
||||
|
||||
$y++;
|
||||
$maxLoopLen = count($zeile);
|
||||
for ($x = 0; $x < $maxLoopLen; $x++) {
|
||||
$inhalt[$y][$x] = str_replace("'", "\'", $zeile[$x]);
|
||||
if ($y == 1) {
|
||||
// remove byte order mark
|
||||
$inhalt[$y][$x] = str_replace("\xEF\xBB\xBF", "", $inhalt[$y][$x]);
|
||||
if (!in_array($inhalt[$y][$x], $allowed)) {
|
||||
$validator->addError(
|
||||
'<br><i style="font-style:normal;color:#990000;">ERROR in column ' . $x
|
||||
. ' created by value: ' . $inhalt[$y][$x] . '</i>'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
$erstezeile = $inhalt[1];
|
||||
if (count($validator->error_msgs) != 0) {
|
||||
echo '<br><b style="color:#990000;">Not allowed tags found !</b>';
|
||||
} else {
|
||||
echo '<br><i style="font-style:normal;color:#009900;">Only allowed tags used !</i>';
|
||||
}
|
||||
|
||||
//// Check #2
|
||||
echo '<br><br>2: Not allowed multiple use of tags (column names)?';
|
||||
$compare = array_unique($erstezeile);
|
||||
|
||||
if (count($erstezeile) != count($compare)) {
|
||||
$validator->addError(
|
||||
'<br><b style="color:#990000;">There are duplicate column names !</b>'
|
||||
);
|
||||
} else {
|
||||
echo '<br><i style="font-style:normal;color:#009900;">No duplicate column names !</i>';
|
||||
}
|
||||
|
||||
///// Check #3
|
||||
echo '<br><br>3: Mandatory tags available and always filled in?';
|
||||
unset($inv_array);
|
||||
|
||||
/**
|
||||
* Function for finding duplicates?.
|
||||
*
|
||||
* @param array $array Input array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function Get_duplicates(array $array):array
|
||||
{
|
||||
return array_unique(array_diff_assoc($array, array_unique($array)));
|
||||
|
||||
}
|
||||
|
||||
$mandatory = ['inventory_number','object_type','object_title','object_description'];
|
||||
foreach ($mandatory as $tMandatoryField) {
|
||||
if (!in_array($tMandatoryField, $erstezeile)) {
|
||||
$validator->addInvError(
|
||||
'<br><i style="font-style:normal;color:#990000;">Mandatory: Column <b>'
|
||||
. $tMandatoryField . '</b> missing</i>'
|
||||
);
|
||||
} else {
|
||||
$spaltenr = array_search($tMandatoryField, $erstezeile);
|
||||
for ($j = 0; $j < $y; $j++) {
|
||||
if ($inhalt[$j + 1][$spaltenr] == '') {
|
||||
$validator->addInvError(
|
||||
'<br><i style="font-style:normal;color:#990000;">Missing value for <b>'
|
||||
. $tMandatoryField . '</b> in row ' . ($j + 1) . '</i>'
|
||||
);
|
||||
}
|
||||
if ($tMandatoryField == 'inventory_number') {
|
||||
$inv_array[] = $inhalt[$j + 1][$spaltenr];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($validator->inv_errors) == 0) {
|
||||
echo '<br><i style="font-style:normal;color:#009900;">All mandatory tags available and with values !</i>';
|
||||
}
|
||||
|
||||
|
||||
///// Check #4
|
||||
echo '<br><br>4: Inventory_number unique ?';
|
||||
if (in_array('inventory_number', $erstezeile)) {
|
||||
$doppelte_inv = Get_duplicates($inv_array);
|
||||
$doppelte_inv = array_values($doppelte_inv);
|
||||
if (!empty($doppelte_inv)) {
|
||||
foreach ($doppelte_inv as $tDublicateInvNo) {
|
||||
$validator->addError(
|
||||
'<br><i style="font-style:normal;color:#990000;">Multiple use of inventory_number <b>'
|
||||
. $tDublicateInvNo . '</b></i>'
|
||||
);
|
||||
}
|
||||
} else {
|
||||
echo '<br><i style="font-style:normal;color:#009900;">All inventory_numbers are unique !</i>';
|
||||
}
|
||||
} else {
|
||||
$validator->addError(
|
||||
'<br><b style="font-style:normal;color:#990000;">Aborted, column inventory_number is missing</b>'
|
||||
);
|
||||
}
|
||||
|
||||
///// Check #5
|
||||
echo '<br><br>5: Dependent colums observed ?<br>';
|
||||
|
||||
|
||||
// Check for correct handling of dependent fields
|
||||
foreach ($fieldsWithDependency as $tField => $tDependentFields) {
|
||||
if (array_search($tField, $erstezeile) !== false) {
|
||||
foreach ($tDependentFields as $tDependentField) {
|
||||
if (array_search($tDependentField, $erstezeile) === false) {
|
||||
$depencymessage[] = "Dependency issue at column $tField: Corresponding column $tDependentField is missing";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($depencymessage)) {
|
||||
echo '<b style="color:#990000;">Dependent columns were not observed !</b>';
|
||||
foreach ($depencymessage as $tDepMsg) {
|
||||
$validator->addError('<br>' . $tDepMsg);
|
||||
}
|
||||
} else {
|
||||
echo '<i style="font-style:normal;color:#009900;">Dependent columns were observed !</i>';
|
||||
}
|
||||
|
||||
///// Check #6
|
||||
echo '<br><br>6: Dependency of content observed?';
|
||||
|
||||
//TODO: get the values for these arrays dynamically?
|
||||
// JRE: Maybe we can merge them into availablefields
|
||||
$crosscheck1 = ['object_other_title','detailed_description','detailed_description','inscription','inscription','dimensions_separate_length_value', 'dimensions_separate_width_value', 'dimensions_separate_height_value', 'dimensions_separate_diameter_value', 'dimensions_separate_wall_thickness_value', 'dimensions_separate_weight_value','closer_location','bought_for','worth_value','worth_insurance_value'];
|
||||
$crosscheck2 = ['object_other_title_kind_of','detailed_description_md','detailed_description_extern','inscription_md','inscription_extern','dimensions_separate_length_unit', 'dimensions_separate_width_unit', 'dimensions_separate_height_unit', 'dimensions_separate_diameter_unit', 'dimensions_separate_wall_thickness_unit', 'dimensions_separate_weight_unit','closer_location_as','bought_for_currency','worth_unit','worth_insurance_unit'];
|
||||
|
||||
foreach ($crosscheck1 as $l => $tCrossCheck) {
|
||||
|
||||
if (in_array($tCrossCheck, $erstezeile)) {
|
||||
|
||||
for ($j = 1; $j < ($y + 1); $j++) {
|
||||
if ($inhalt[$j][array_search($crosscheck2[$l], $erstezeile)] !== '' and $inhalt[$j][array_search($tCrossCheck, $erstezeile)] == '') {
|
||||
$validator->addDepconError(
|
||||
'<br>Tag <b>' . $crosscheck2[$l] . '</b> given but no entry for <b>'
|
||||
. $tCrossCheck . '</b> (row ' . $j . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
foreach ($eventpart as $l => $tEventPart) {
|
||||
if (in_array($tEventPart, $erstezeile)) {
|
||||
for ($j = 1; $j < ($y + 1); $j++) {
|
||||
if ($inhalt[$j][array_search($eventpartsure[$l], $erstezeile)] !== '' and $inhalt[$j][array_search($tEventPart, $erstezeile)] == '') {
|
||||
$validator->addDepconError(
|
||||
'<br>Tag <b>' . $eventpartsure[$l] . '</b> given but no entry for <b>'
|
||||
. $tEventPart . '</b> (row ' . $j . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array('dimensions_separate_show_md', $erstezeile)) {
|
||||
for ($j = 1; $j < ($y + 1); $j++) {
|
||||
if ($inhalt[$j][array_search('dimensions_separate_show_md', $erstezeile)] !== '' and ($inhalt[$j][array_search('dimensions_separate_length_value', $erstezeile)] == '') and $inhalt[$j][array_search('dimensions_separate_width_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_heigt_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_weight_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_diameter_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_wall_thickness_value', $erstezeile)] == '') {
|
||||
$validator->addDepconError(
|
||||
'<br>Tag <b>dimensions_separate_show_md</b> given but no separate values available (row '
|
||||
. $j . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array('dimensions_separate_show_extern', $erstezeile)) {
|
||||
for ($j = 1; $j < ($y + 1); $j++) {
|
||||
if ($inhalt[$j][array_search('dimensions_separate_show_extern', $erstezeile)] !== '' and ($inhalt[$j][array_search('dimensions_separate_length_value', $erstezeile)] == '') and $inhalt[$j][array_search('dimensions_separate_width_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_heigt_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_weight_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_diameter_value', $erstezeile)] == '' and $inhalt[$j][array_search('dimensions_separate_wall_thickness_value', $erstezeile)] == '') {
|
||||
$validator->addDepconError(
|
||||
'<br>Tag <b>dimensions_separate_show_extern</b> given but no separate values available (row '
|
||||
. $j . ')'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
for ($im=1;$im<11;$im++)
|
||||
{
|
||||
if (in_array('image_name'.$im,$erstezeile))
|
||||
{
|
||||
for ($j=1;$j<($y+1);$j++)
|
||||
{
|
||||
if ($inhalt[$j][array_search('image_rights'.$im,$erstezeile)]!=='')
|
||||
{
|
||||
echo '<br>TAG <b>image_name'.$im.'</b> given but no value available for image_rights'.$im.' (row '.$j.')';
|
||||
$depcon_error=$depcon_error+1;
|
||||
}
|
||||
if ($inhalt[$j][array_search('image_visible'.$im,$erstezeile)]!=='')
|
||||
{
|
||||
echo '<br>TAG <b>image_name'.$im.'</b> given but no value available for image_visible'.$im.' (row '.$j.')';
|
||||
$depcon_error=$depcon_error+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
if (count($validator->depcon_errors) == 0) {
|
||||
echo '<br><i style="font-style:normal;color:#009900;">Dependency of content was observed !</i>';
|
||||
}
|
||||
|
||||
///// Check #7
|
||||
echo '<br><br>7: Not allowed values in controlled lists?<br>';
|
||||
for ($i = 2; $i <= $y; $i++) {
|
||||
|
||||
foreach ($inhalt[$i] as $key => $value) {
|
||||
|
||||
$columnName = $inhalt[1][$key];
|
||||
// Only do the check if the field is not restricted
|
||||
if (isset($fieldsWithAllowedValueSet[$columnName])) {
|
||||
|
||||
// For others: check if the value is from the list of allowed values.
|
||||
if (!in_array($value, $fieldsWithAllowedValueSet[$columnName])) {
|
||||
|
||||
// It may be that the value is empty together with all dependent fields,
|
||||
// because it's in a repeat field that was needed earlier.
|
||||
if (empty($value) && !empty($fieldsWithDependency[$columnName])) {
|
||||
|
||||
$allDependentsEmpty = true;
|
||||
foreach ($fieldsWithDependency[$columnName] as $depField) {
|
||||
// Find keys of dependent field
|
||||
$depFieldKey = array_search($depField, $inhalt[1]);
|
||||
if (!empty($inhalt[$i][$depFieldKey])) {
|
||||
$allDependentsEmpty = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($allDependentsEmpty !== true) {
|
||||
$errormessage[] = "Disallowed value in column <code>{$columnName}</code> on row <code>{$i}</code>: <em>"
|
||||
. $value . "</em> (allowed values: <small>"
|
||||
. implode(", ", $fieldsWithAllowedValueSet[$columnName])
|
||||
. "</small>)";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($errormessage)) {
|
||||
echo '<b style="color:#990000;">Columns with controlled values contain invalid values !</b>';
|
||||
foreach ($errormessage as $tMsg) {
|
||||
$validator->addError('<br>' . $tMsg);
|
||||
}
|
||||
} else {
|
||||
echo '<i style="font-style:normal;color:#009900;">Values in controlled fields are all valid !</i>';
|
||||
}
|
||||
|
||||
///// Check #8
|
||||
unset($errormessage);
|
||||
echo '<br><br>8: Main image or main resource given?<br>';
|
||||
$hasanyimage = 0;
|
||||
for ($im = 1; $im < 29; $im++) {
|
||||
if (array_search('image_name' . $im, $erstezeile) != '') {
|
||||
$imagemain[$im]['name'] = array_search('image_name' . $im, $erstezeile);$hasanyimage++;
|
||||
}
|
||||
if (array_search('image_visible' . $im, $erstezeile) != '') {
|
||||
$imagemain[$im]['visible'] = array_search('image_visible' . $im, $erstezeile);
|
||||
}
|
||||
if (array_search('image_main' . $im, $erstezeile) != '') {
|
||||
$imagemain[$im]['main'] = array_search('image_main' . $im, $erstezeile);
|
||||
}
|
||||
}
|
||||
|
||||
if ($hasanyimage > 0) {
|
||||
$imagemain = array_values($imagemain);
|
||||
for ($i = 1; $i <= $y; $i++) {
|
||||
if ($i > 1) {
|
||||
//check if in a row any image_name is given
|
||||
$maimg = $hatimg = 0;
|
||||
foreach ($imagemain as $im => $tMainImage) {
|
||||
if ($inhalt[$i][$tMainImage["name"]] != '') $hatimg++;
|
||||
}
|
||||
if ($hatimg > 0) {
|
||||
// first check: how many main-images?
|
||||
foreach ($imagemain as $im => $tMainImage) {
|
||||
if ($inhalt[$i][$imagemain[$im]['main']] == 'y') {
|
||||
$maimg++;
|
||||
$merk = $im;
|
||||
}
|
||||
}
|
||||
// if there is exacly one main-image, is it visible?
|
||||
if ($maimg == 1) {
|
||||
if ($inhalt[$i][$imagemain[$merk]['visible']] == 'n') {
|
||||
$errormessage[] = '<b style="font-weight:normal;color:#990000">Main image in row ' . $i . ' is not visible</b>';
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($maimg == 0 and $hatimg > 0) {
|
||||
$errormessage[] = '<b style="font-weight:normal;color:#990000">There is no visible main image given in row ' . $i . '</b>';
|
||||
}
|
||||
if ($maimg > 1 and $hatimg > 0) {
|
||||
$errormessage[] = '<b style="font-weight:normal;color:#990000">There are ' . $maimg . ' main images given in row ' . $i . '</b>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($errormessage)) {
|
||||
echo '<b style="color:#990000;">There is not one main image for each object !</b>';
|
||||
foreach ($errormessage as $tMsg) {
|
||||
$validator->addError('<br>' . $tMsg);
|
||||
}
|
||||
} else {
|
||||
echo '<i style="font-style:normal;color:#009900;">For each object that has images attached exactly one main image is given !</i>';
|
||||
}
|
||||
} else {
|
||||
echo '<i style="font-style:normal;color:#009900;">No images to be imported !</i>';
|
||||
}
|
||||
|
||||
echo '<hr>';
|
||||
|
||||
if ($validator->overallErrorCount() > 0) {
|
||||
echo '
|
||||
<p>Error(s) found: ' . $validator->overallErrorCount() . '</p>';
|
||||
foreach ($validator->error_msgs as $msg) {
|
||||
echo $msg;
|
||||
}
|
||||
foreach ($validator->inv_errors as $msg) {
|
||||
echo $msg;
|
||||
}
|
||||
foreach ($validator->depcon_errors as $msg) {
|
||||
echo $msg;
|
||||
}
|
||||
echo '<a href="index6.php?fnam=' . htmlspecialchars($_GET['fnam']) . '" class="buttonLike">Create XML for md:import (utf8)</a><br>';
|
||||
} else {
|
||||
echo '<a href="index6.php?fnam=' . htmlspecialchars($_GET['fnam']) . '" class="buttonLike">Create XML for md:import (utf8)</a><br>';
|
||||
}
|
||||
echo '</div>';
|
||||
echo '
|
||||
|
||||
</body>
|
||||
</html>
|
||||
';
|
@ -1,86 +0,0 @@
|
||||
<?PHP
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
if (session_status() != PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
// This array contains all available languages
|
||||
$allowed_langs = ['ar', 'de', 'en', 'hu', 'id', 'it', 'pl','pt'];
|
||||
|
||||
// Some languages are in translation. They will only be available for logged in users.
|
||||
|
||||
if (isset($_GET['navlang'])) {
|
||||
$_SESSION['lang'] = $_GET['navlang'];
|
||||
if (!in_array($_SESSION['lang'], $allowed_langs)) $_SESSION['lang'] = 'de';
|
||||
}
|
||||
else if (!isset($_SESSION['lang'])) {
|
||||
$_SESSION['lang'] = MD_STD::lang_getfrombrowser($allowed_langs, 'en', "", false);
|
||||
}
|
||||
$lang = $_SESSION['lang'];
|
||||
|
||||
if (empty($filename = trim($_GET['fnam'], " ,./"))) {
|
||||
echo "Error: Invalid file name";
|
||||
exit;
|
||||
}
|
||||
$csv_datei = MD_STD::realpath(__DIR__ . '/../csv/' . $filename);
|
||||
|
||||
if (is_dir(__DIR__ . "/../xml")) rrmdir(__DIR__ . '/../xml');
|
||||
mkdir(__DIR__ . "/../xml", CACHE_DIR_PERMS);
|
||||
|
||||
if (!($fp = fopen($csv_datei, 'r'))) {
|
||||
throw new MDmainEntityNotExistentException("Failed opening file");
|
||||
}
|
||||
$y = 0;
|
||||
while ($zeile = fgetcsv($fp, 100000, ';')) {
|
||||
|
||||
$zeile = str_replace("\xEF\xBB\xBF", '', $zeile);
|
||||
|
||||
$y++;
|
||||
|
||||
$zieldatei = __DIR__ . '/../xml/' . $y . '.xml';
|
||||
if (!$handle = fopen($zieldatei, 'w')) {
|
||||
echo "Cannot open file ($zieldatei)";exit;
|
||||
}
|
||||
|
||||
$xmlDoc = new DOMDocument("1.0", "UTF-8");
|
||||
$xmlDoc->preserveWhiteSpace = false;
|
||||
$xmlDoc->formatOutput = true;
|
||||
# $xmlDoc->encoding = 'utf-8';
|
||||
$xmlMainElem = $xmlDoc->createElement("record");
|
||||
$record_node = $xmlDoc->appendChild($xmlMainElem); //add record element to XML node
|
||||
# $rss_node->setAttribute("version", "2.0"); //set RSS version
|
||||
|
||||
$lineCount = count($zeile);
|
||||
|
||||
for ($x = 0; $x < $lineCount; $x++) {
|
||||
$inhalt[$y][$x] = $zeile[$x];
|
||||
if ($inhalt[$y][$x] == '') $inhalt[$y][$x] = 'ERSATZ';
|
||||
|
||||
$record_node->appendChild(createTextDomElement($xmlDoc, trim($inhalt[1][$x]), trim($inhalt[$y][$x])));
|
||||
|
||||
}
|
||||
|
||||
$somecontent = '<?xml version="1.0" encoding="UTF-8"?>' . $xmlDoc->saveXML($xmlDoc->documentElement);
|
||||
|
||||
# $somecontent .= '</record>';
|
||||
//if ($y>1)
|
||||
//{
|
||||
if (fwrite($handle, $somecontent) === FALSE) {
|
||||
echo "Cannot write to file ($filename)";exit;
|
||||
}
|
||||
|
||||
fclose($handle);
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
|
||||
echo printHTMLHead();
|
||||
|
||||
echo '
|
||||
<div>
|
||||
' . ($y - 1) . ' files created<br />
|
||||
<hr/>
|
||||
<a href="zipit.php" class="buttonLike">Download as ZIP</a>
|
||||
</div>';
|
1
public/json/fields.de.json
Normal file
1
public/json/fields.en.json
Normal file
1
public/json/fields.hu.json
Normal file
1
public/json/tls.de.json
Normal file
@ -0,0 +1 @@
|
||||
{"remarks":"Notizen","download":"Download","upload":"Hochladen","select_csv_file_for_upload":"Bitte w\u00e4hlen Sie eine CSV Datei als Basis zum Erstellen von XML Dateien","currently_approved_tags":"Derzeit zum Import verf\u00fcgbare Tags \/ Felder","download_csv_all":"CSV-Vorlage mit allen Feldern runterladen","download_csv_by_selection":"CSV-Vorlage auf Basis der Auswahl herunterladen","select_required_fields":"Pflichtfelder ausw\u00e4hlen","select_all_fields":"Alle Felder ausw\u00e4hlen","unset_selection":"Auswahl entfernen","file_format":"Dateiformat","validation_errors":"Validierungsfehler","errors_parsing":"Parsing-Fehler","errors_mandatoryTags":"Fehlende Pflichtfelder","errors_duplicateInvNos":"Doppelte Inventarnummern","errors_dependentColumns":"Spaltenabh\u00e4ngigkeiten nicht ber\u00fccksichtigt","errors_controlledLists":"Kontrollierte Werte","errors_mainImageResource":"Fehlende Haupt-Bilder oder Ressourcen","allowed_values":"Zugelassene Werte","privacy_policy":"Datenschutzerkl\u00e4rung","contact":"Kontakt","news":"Neuigkeiten","imprint":"Impressum","about":"\u00dcber"}
|
1
public/json/tls.en.json
Normal file
@ -0,0 +1 @@
|
||||
{"remarks":"Remarks","download":"Download","upload":"Upload","select_csv_file_for_upload":"Please select a CSV file to create XML files","currently_approved_tags":"Currently approved tags (column names) for md:import","download_csv_all":"Download CSV template with all fields","download_csv_by_selection":"Download CSV template based on selection","select_required_fields":"Select required fields","select_all_fields":"Select all fields","unset_selection":"Unset selection","file_format":"File format","validation_errors":"Validation errors","errors_parsing":"Parse errors","errors_mandatoryTags":"Missing mandatory tags","errors_duplicateInvNos":"Duplicate inventory numbers","errors_dependentColumns":"Column dependencies unresolved","errors_controlledLists":"Controlled lists","errors_mainImageResource":"Missing main images or resources","allowed_values":"Allowed values","privacy_policy":"Privacy policy","contact":"Contact","news":"News","imprint":"Imprint","about":"About"}
|
1
public/json/tls.hu.json
Normal file
@ -0,0 +1 @@
|
||||
{"remarks":"Megjegyz\u00e9sek","download":"Let\u00f6lt\u00e9s","upload":"Felt\u00f6lt\u00e9s","select_csv_file_for_upload":"Please select a CSV file to create XML files","currently_approved_tags":"Jelenleg j\u00f3v\u00e1hagyott c\u00edmk\u00e9k (oszlopnevek) az md:importhoz","download_csv_all":"Download CSV template with all fields","download_csv_by_selection":"Download CSV template based on selection","select_required_fields":"K\u00f6telez\u0151 mez\u0151k kijel\u00f6l\u00e9se","select_all_fields":"\u00d6sszes mez\u0151 kijel\u00f6l\u00e9s","unset_selection":"Kijel\u00f6l\u00e9s megsz\u00fcntet\u00e9se","file_format":"Kiterjeszt\u00e9s","validation_errors":"Validation errors","errors_parsing":"Parse errors","errors_mandatoryTags":"Missing mandatory tags","errors_duplicateInvNos":"Duplicate inventory numbers","errors_dependentColumns":"Column dependencies unresolved","errors_controlledLists":"Controlled lists","errors_mainImageResource":"Missing main images or resources","allowed_values":"Allowed values","privacy_policy":"Privacy policy","contact":"Contact","news":"News","imprint":"Imprint","about":"About"}
|
19
public/manifest.json
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "csvxml :: museum-digital",
|
||||
"short_name": "csvxml",
|
||||
"start_url": "/",
|
||||
"display": "standalone",
|
||||
"background_color": "#F2F2F2",
|
||||
"theme_color": "#aa4400",
|
||||
"description": "Validate import CSV files for museum-digital.",
|
||||
"icons": [{
|
||||
"src": "assets/img/mdlogo-csvxml-1028x.png",
|
||||
"sizes": "1028x1028",
|
||||
"type": "image/png"
|
||||
}, {
|
||||
"src": "assets/img/mdlogo-csvxml.svg",
|
||||
"sizes": "48x48 72x72 96x96 128x128 256x256 512x512",
|
||||
"type": "image/svg+xml",
|
||||
"purpose": "any maskable"
|
||||
}]
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
||||
|
88
public/sw.js
Normal file
@ -0,0 +1,88 @@
|
||||
const debug = false;
|
||||
const CACHE_NAME = 'csvxml-cache-v1';
|
||||
const urlsToCache = [
|
||||
|
||||
'/index.htm',
|
||||
'/assets/js/jszip/dist/jszip.min.js',
|
||||
'/assets/js/csvxmlV2.min.js?v000003',
|
||||
'/assets/css/csvxml.min.css?v000003',
|
||||
|
||||
'/assets/fonts/SourceSansPro-Regular.woff2',
|
||||
|
||||
'/json/fields.de.json',
|
||||
'/json/fields.en.json',
|
||||
'/json/fields.hu.json',
|
||||
|
||||
'/json/tls.de.json',
|
||||
'/json/tls.en.json',
|
||||
'/json/tls.hu.json',
|
||||
|
||||
];
|
||||
|
||||
self.addEventListener('install', function(event) {
|
||||
// Perform install steps
|
||||
event.waitUntil(
|
||||
Promise.all([
|
||||
caches.open(CACHE_NAME)
|
||||
.then(function(cache) {
|
||||
if (debug === true) console.log('Opened cache');
|
||||
return cache.addAll(urlsToCache.map(url => new Request(url, {credentials: 'same-origin'})));
|
||||
}),
|
||||
|
||||
])
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', function(event) {
|
||||
|
||||
if (event.request.url.startsWith(location.origin) === false) return;
|
||||
|
||||
event.respondWith(
|
||||
caches.match(event.request)
|
||||
.then(function(response) {
|
||||
|
||||
if (response) {
|
||||
if (debug === true) console.log("Serving " + event.request.url + " from cache.");
|
||||
return response;
|
||||
}
|
||||
|
||||
// IMPORTANT: Clone the request. A request is a stream and
|
||||
// can only be consumed once. Since we are consuming this
|
||||
// once by cache and once by the browser for fetch, we need
|
||||
// to clone the response.
|
||||
var fetchRequest = event.request.clone();
|
||||
|
||||
return fetch(fetchRequest).then(
|
||||
function(response) {
|
||||
// Check if we received a valid response
|
||||
if(!response || response.status !== 200 || response.type !== 'basic') {
|
||||
return response;
|
||||
}
|
||||
|
||||
var responseToCache = response.clone();
|
||||
|
||||
caches.open(CACHE_NAME)
|
||||
.then(function(cache) {
|
||||
if (debug === true) console.log("Added " + event.request.url + "to cache");
|
||||
cache.put(event.request, responseToCache);
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
).catch(
|
||||
() => {
|
||||
console.log("Problem");
|
||||
if (event.request.url.indexOf("index.php?") == -1) return;
|
||||
else {
|
||||
console.log("Fixing");
|
||||
return caches.open(CACHE_NAME).then(
|
||||
function(cache) {
|
||||
// cache.keys().then(function(keys) { console.log(keys); })
|
||||
// return cache.match("index.php")
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
})
|
||||
);
|
||||
});
|
@ -1,35 +0,0 @@
|
||||
<?PHP
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
if (empty($_FILES)) {
|
||||
throw new MDFileDoesNotExist("No file uploaded");
|
||||
}
|
||||
|
||||
$targetpart = basename($_FILES['uploaded']['name']);
|
||||
$target = __DIR__ . "/../csv/" . $targetpart;
|
||||
|
||||
// TODO: File name needs to be sanitized, or tmp name used
|
||||
|
||||
if (session_status() != PHP_SESSION_ACTIVE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (MD_STD_SEC::validateAntiCsrfToken() === false) {
|
||||
throw new MDWrongCsrfTokenException();
|
||||
}
|
||||
|
||||
//This is our size condition
|
||||
if ($_FILES['uploaded']['size'] > 40000000) {
|
||||
echo "Your file is too large.<br>";
|
||||
return;
|
||||
}
|
||||
|
||||
//Here we check that $ok was not set to 0 by an error
|
||||
//If everything is ok we try to upload it
|
||||
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target)) {
|
||||
echo "Sorry, there was a problem uploading your file.";
|
||||
return;
|
||||
}
|
||||
|
||||
header("Location: index3.php?fnam=" . basename($_FILES['uploaded']['name']));
|
@ -1,43 +0,0 @@
|
||||
<?PHP
|
||||
require_once __DIR__ . "/../inc/zip.php";
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
$fileTime = date("D, d M Y H:i:s T");
|
||||
$fileDir = __DIR__ . '/../xml/';
|
||||
|
||||
$zip = new Zip();
|
||||
//$zip->setComment("Example Zip file.\nCreated on " . date('l jS \of F Y h:i:s A'));
|
||||
|
||||
if ($handle = opendir($fileDir)) {
|
||||
/* This is the correct way to loop over the directory. */
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if (strpos($file, ".xml") !== false) {
|
||||
$pathData = pathinfo($fileDir . $file);
|
||||
$fileName = $pathData['filename'];
|
||||
if ($file != '1.xml')
|
||||
$zip->addFile(MD_STD::file_get_contents($fileDir . $file), $file, filectime($fileDir . $file));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ini_get('zlib.output_compression')) {
|
||||
ini_set('zlib.output_compression', 'Off');
|
||||
}
|
||||
|
||||
$zip->finalize(); // Not scrictly necessary, the next line will call it anyway.
|
||||
$zipData = $zip->getZipData();
|
||||
$length = strlen($zipData);
|
||||
|
||||
header('Pragma: public');
|
||||
header("Last-Modified: " . $fileTime);
|
||||
header("Expires: 0");
|
||||
header("Accept-Ranges: bytes");
|
||||
header("Connection: close");
|
||||
header("Content-Type: application/zip");
|
||||
header('Content-Disposition: attachment; filename="csv_xml.zip";' );
|
||||
header("Content-Transfer-Encoding: binary");
|
||||
header("Content-Length: " . $length);
|
||||
echo $zipData;
|
||||
|
||||
rrmdir(__DIR__ . '/../xml');
|
||||
|
129
scripts/compile.php
Normal file
@ -0,0 +1,129 @@
|
||||
<?PHP
|
||||
/**
|
||||
* Compiles the client-side application from PHP parts.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
/**
|
||||
* Generates the json for a translation file.
|
||||
*
|
||||
* @param string $lang Language.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function generateFieldsIndex(string $lang):string {
|
||||
|
||||
$fieldsGetter = new CsvxmlAvailableFields($lang);
|
||||
$availableFields = $fieldsGetter->getFields();
|
||||
return MD_STD::json_encode($availableFields);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the json for a translation file.
|
||||
*
|
||||
* @param string $lang Language.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function generateTranslationFile(string $lang):string {
|
||||
|
||||
$tlLoader = new MDTlLoader("csvxml_tl_cache", $lang);
|
||||
|
||||
return MD_STD::json_encode([
|
||||
'remarks' => $tlLoader->tl('basis', 'basis', 'remarks'),
|
||||
'download' => $tlLoader->tl('export', 'export', 'download'),
|
||||
'upload' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'upload'),
|
||||
'select_csv_file_for_upload' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_csv_file_for_upload'),
|
||||
'currently_approved_tags' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'currently_approved_tags'),
|
||||
'download_csv_all' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'download_csv_all'),
|
||||
'download_csv_by_selection' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'download_csv_by_selection'),
|
||||
'select_required_fields' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_required_fields'),
|
||||
'select_all_fields' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'select_all_fields'),
|
||||
'unset_selection' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'unset_selection'),
|
||||
'file_format' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'file_format'),
|
||||
'validation_errors' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'validation_errors'),
|
||||
'errors_parsing' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_parsing'),
|
||||
'errors_mandatoryTags' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_mandatoryTags'),
|
||||
'errors_duplicateInvNos' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_duplicateInvNos'),
|
||||
'errors_dependentColumns' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_dependentColumns'),
|
||||
'errors_controlledLists' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_controlledLists'),
|
||||
'errors_mainImageResource' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'errors_mainImageResource'),
|
||||
'allowed_values' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'allowed_values'),
|
||||
|
||||
'privacy_policy' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'privacy_policy'),
|
||||
'contact' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'contact'),
|
||||
'news' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'news'),
|
||||
'imprint' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'imprint'),
|
||||
'about' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'about'),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate index.htm.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function generateAppShell():string {
|
||||
|
||||
return '<!DOCTYPE HTML>
|
||||
<html data-allowed-langs="' . htmlspecialchars(implode(',', ALLOWED_LANGS)) . '">
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css?v000003" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
|
||||
<title>CSVXML :: museum-digital</title>
|
||||
<meta name="twitter:title" content="CSVXML :: museum-digital" />
|
||||
<meta property="og:title" content="CSVXML :: museum-digital" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="twitter:site" content="@museumdigital" />
|
||||
|
||||
<meta name="description" content="Validate import CSV files for museum-digital" />
|
||||
|
||||
<meta name="keywords" content="Imports, museum-digital" />
|
||||
|
||||
<link rel="shortcut icon" sizes="128x128" href="assets/img/mdlogo-csvxml.svg" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="assets/img/mdlogo-csvxml-192px.png" />
|
||||
<meta property="twitter:image" content="assets/img/mdlogo-csvxml.svg" />
|
||||
<meta property="og:image" content="assets/img/mdlogo-csvxml.svg" />
|
||||
|
||||
</head>
|
||||
<body class="loading">
|
||||
|
||||
<script src="assets/js/csvxmlV2.min.js?v000003" type="text/javascript" async></script>
|
||||
|
||||
</body>
|
||||
</html>';
|
||||
|
||||
}
|
||||
|
||||
const SERVED_ROOT = __DIR__ . '/../public/';
|
||||
const SERVED_JSON_ROOT = __DIR__ . '/../public/json/';
|
||||
|
||||
if (!is_dir(SERVED_JSON_ROOT)) mkdir(SERVED_JSON_ROOT);
|
||||
|
||||
foreach (ALLOWED_LANGS as $lang) {
|
||||
file_put_contents(SERVED_JSON_ROOT . 'fields.' . $lang . '.json', generateFieldsIndex($lang));
|
||||
file_put_contents(SERVED_JSON_ROOT . 'tls.' . $lang . '.json', generateTranslationFile($lang));
|
||||
}
|
||||
|
||||
file_put_contents(SERVED_ROOT . 'index.htm', generateAppShell());
|
||||
|
||||
exec("minify \\
|
||||
-o " . escapeshellarg(__DIR__ . '/../public/assets/css/csvxml.min.css') . '\\
|
||||
' . escapeshellarg(__DIR__ . '/../public/assets/css/editMenu.css') . '\\
|
||||
' . escapeshellarg(__DIR__ . '/../public/assets/css/dialogue.css') . '\\
|
||||
' . escapeshellarg(__DIR__ . '/../public/assets/css/csvxml.css'));
|
||||
|
||||
exec("minify \\
|
||||
-o " . escapeshellarg(__DIR__ . '/../public/assets/js/csvxmlV2.min.js') . '\
|
||||
' . escapeshellarg(__DIR__ . '/../public/assets/js/csvxmlV2.js'));
|
21
security.php
@ -1,21 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* Generates a CSV template based on the field list provided for CSVXML.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@museum-digital.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
require_once __DIR__ . "/../functions/functions.php";
|
||||
|
||||
header("Content-type: text/plain");
|
||||
echo MD_JAIL::check_server_setup([
|
||||
"shell_access_whitelist" => [],
|
||||
"sys_function_whitelist" => ["getenv"],
|
||||
"file_function_whitelist" => [],
|
||||
"file_uploads" => true,
|
||||
"allow_url_fopen" => false,
|
||||
"max_input_vars" => 100, // Default: 1000
|
||||
"max_input_nesting_level" => 10, // Default: 1000
|
||||
"post_max_size" => "4M",
|
||||
"curl" => false,
|
||||
]);
|
@ -1,33 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* This script contains tests for the home page.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@jrenslin.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
|
||||
// phpcs:disable
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Test class for the start page.
|
||||
*/
|
||||
final class CsvTest extends TestCase {
|
||||
|
||||
/**
|
||||
* Test for HTML output.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testHTMLOutput():void {
|
||||
|
||||
include __DIR__ . "/../public/csv.php";
|
||||
$output = $this->getActualOutput();
|
||||
|
||||
self::assertIsString($output);
|
||||
ob_clean();
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
<?PHP
|
||||
/**
|
||||
* This script contains tests for the home page.
|
||||
*
|
||||
* @author Joshua Ramon Enslin <joshua@jrenslin.de>
|
||||
*/
|
||||
declare(strict_types = 1);
|
||||
|
||||
// phpcs:disable
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Test class for the start page.
|
||||
*/
|
||||
final class StartPageTest extends TestCase {
|
||||
|
||||
/**
|
||||
* Test for HTML output.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testHTMLOutput():void {
|
||||
|
||||
include __DIR__ . "/../public/index.php";
|
||||
$output = $this->getActualOutput();
|
||||
|
||||
self::assertIsString($output);
|
||||
ob_clean();
|
||||
|
||||
}
|
||||
|
||||
}
|