Compare commits
67 Commits
02bd7fce11
...
master
Author | SHA1 | Date | |
---|---|---|---|
e56ae1f366
|
|||
e5e64335a1
|
|||
eb6add3d29
|
|||
f0ce5a9a58
|
|||
01d958cdc2
|
|||
7b3f67ed15
|
|||
22195b2263
|
|||
dba2ba182e
|
|||
dcb06a4b60
|
|||
57cae5314f
|
|||
02b8fdb15e
|
|||
ac6665ce00
|
|||
6e01abc74f
|
|||
8f67d9b04d
|
|||
6e41153a82
|
|||
f8656d4178
|
|||
0381f349d6
|
|||
cf0c7d75da
|
|||
1415884ebc
|
|||
99fb3f6afb
|
|||
818cb7dab6
|
|||
5677cc051a
|
|||
fa4b563532
|
|||
af65bd99da
|
|||
66a94fcf9f
|
|||
6eba06808a
|
|||
34c2b5618b
|
|||
47f52c4a10
|
|||
35843ee590
|
|||
e62e36a68c
|
|||
36457a6d0c
|
|||
fa53ec387a
|
|||
0873302e5e
|
|||
e7887ac1c7
|
|||
befe228396
|
|||
d13972229f
|
|||
91186de676
|
|||
54f146831f
|
|||
80785406bb
|
|||
726146eb2a | |||
86e9ab66e9
|
|||
b938059875
|
|||
4f8f041133
|
|||
de322fb41f
|
|||
495bb4b670
|
|||
8a9f51bf9d
|
|||
cc39f204d1
|
|||
b9f83b7dcc
|
|||
ddf26e7e52
|
|||
3ee4174863
|
|||
6337291a9d
|
|||
65fa859490
|
|||
50f682dbc2
|
|||
063a330f74
|
|||
d528321219
|
|||
49fee443c8
|
|||
139933fa9a
|
|||
977e7511ec
|
|||
543a80413c
|
|||
7192b03ead
|
|||
c04d63e026
|
|||
5146305caf
|
|||
20810aa850
|
|||
f5ea1f850a
|
|||
f81089ac79
|
|||
10012db20d
|
|||
34fcc4905a
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -16,9 +16,9 @@
|
||||
[submodule "l10n/musdb"]
|
||||
path = l10n/musdb
|
||||
url = gitea:museum-digital/translation-musdb.git
|
||||
[submodule "l10n/importer"]
|
||||
path = l10n/importer
|
||||
url = gitea:museum-digital/translations-importer.git
|
||||
[submodule "classes/MD_QA"]
|
||||
path = classes/MD_QA
|
||||
url = gitea:museum-digital/MD_QA.git
|
||||
[submodule "l10n/translation-csvxml"]
|
||||
path = l10n/translation-csvxml
|
||||
url = gitea:museum-digital/translation-csvxml.git
|
||||
|
36
README.md
36
README.md
@ -1,10 +1,38 @@
|
||||
# Validator for the standard csv format for imports to museum-digital
|
||||
# Validator for the standard CSV format for imports to museum-digital
|
||||
|
||||
# Development
|
||||
The validation and transformation service for import CSV files to an instance of museum-digital is centrally hosted at <https://csvxml.imports.museum-digital.org/>. This repository contains
|
||||
|
||||
To update, run `scripts/compile.php`.
|
||||
a) The statically generated progressive web app that is being served
|
||||
b) The simple static page generator for generating it
|
||||
|
||||
## Dependencies
|
||||
## CSVXML as a "Format" / Purpose of This Tool
|
||||
|
||||
Many smaller museums still do not use a dedicated application for managing their collections. This often leads to the need to import Excel or CSV tables. The format described and validated by the present tool helps museums and administrators who want to import data from such sources to pre-prepare their import data. If the data is not yet recorded, this tool allows the generation of a CSV file with the expected table headings. If an existing CSV file is to be imported, users can rename their table headings to the ones listed in CSVXML and then validate their import data using this application.
|
||||
|
||||
Finally, this tool will return a ZIP file containing one XML file per object in the validated CSV file. The application works completely on the client side, meaning that no data is uploaded to the server as the import data is validated. This also allows for offline use.
|
||||
|
||||
## To-Do
|
||||
|
||||
- [ ] Add missing translation files for explanations
|
||||
- Translations and explanations for most fields exist in the musdb translation files. They now only need to be entered at the relevant positions in [`CsvxmlAvailableFields.php`](./src/CsvxmlAvailableFields.php).
|
||||
|
||||
## Deployment
|
||||
|
||||
1. Clone this repository and set up git subrepositories
|
||||
- Before doing this, ensure that an alias `gitea` is available in your SSH config (`~/.ssh/config`)
|
||||
2. Point a web server to serve the [`/public`](./public) subdirectory
|
||||
|
||||
## Development
|
||||
|
||||
To update, run [`scripts/compile.php`](./scripts/compile.php).
|
||||
|
||||
All relevant development files can be found in [`/src`](./src). [`CsvxmlAvailableFields.php`](./src/CsvxmlAvailableFields.php) is the central file used for generating one large array defining the allowed table headings / fields and their relevant accompanying data (e.g. explanations).
|
||||
|
||||
### Dependencies
|
||||
|
||||
- [JSZip](https://github.com/Stuk/jszip), dual-licensed under MIT & GPLv3
|
||||
- [PapaParse](https://github.com/mholt/PapaParse), licensed under the MIT license
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the AGPL License. See the [LICENSE](./LICENSE) file for the full license text.
|
||||
|
Submodule classes/MDAllowedValueSets updated: 824a86d715...5ec93ba619
Submodule classes/MDErrorReporter updated: ac9b12618d...4ec6bc49ea
Submodule classes/MDMailer updated: 942de26411...88b805b221
Submodule classes/MDTlLoader updated: 94fd36dadd...8377f474da
Submodule classes/MD_QA updated: 8018f7309a...93d26dc1b6
Submodule classes/MD_STD updated: 23232f4e6a...5433811176
@ -1,13 +1,13 @@
|
||||
{
|
||||
"require": {
|
||||
"phpmailer/phpmailer": "^6.1",
|
||||
"phpunit/phpunit": "^9.4",
|
||||
"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"
|
||||
"phpmailer/phpmailer": "*",
|
||||
"phpunit/phpunit": "*",
|
||||
"phpstan/phpstan": "*",
|
||||
"phpstan/phpstan-strict-rules": "*",
|
||||
"ergebnis/phpstan-rules": "*",
|
||||
"phpstan/phpstan-deprecation-rules": "*",
|
||||
"spaze/phpstan-disallowed-calls": "*",
|
||||
"thecodingmachine/phpstan-strict-rules": "*",
|
||||
"phpstan/phpstan-phpunit": "*"
|
||||
}
|
||||
}
|
||||
|
@ -10,11 +10,11 @@ declare(strict_types = 1);
|
||||
|
||||
const CACHE_DIR_PERMS = 0775;
|
||||
|
||||
const ALLOWED_LANGS = ['de', 'en', 'hu'];
|
||||
const ALLOWED_LANGS = ['de', 'en', 'hu', 'ru', 'uk'];
|
||||
|
||||
const TL_FILE_DIRS = [
|
||||
__DIR__ . "/../l10n/musdb/",
|
||||
__DIR__ . "/../l10n/importer/",
|
||||
__DIR__ . "/../l10n/translation-csvxml/",
|
||||
__DIR__ . "/../classes/MDAllowedValueSets/l18n/",
|
||||
];
|
||||
|
||||
@ -23,6 +23,7 @@ const AUTOLOAD_DIRS = [
|
||||
__DIR__ . "/../classes/MDTlLoader/src",
|
||||
__DIR__ . "/../classes/MD_STD/src",
|
||||
__DIR__ . "/../classes/MDAllowedValueSets/src",
|
||||
__DIR__ . "/../classes/MDAllowedValueSets/src/enums",
|
||||
__DIR__ . "/../classes/MDExportFormats/src",
|
||||
__DIR__ . "/../classes/MDErrorReporter",
|
||||
__DIR__ . "/../classes/MDMailer/src",
|
||||
|
Submodule l10n/importer deleted from 3bfb6f9ac2
Submodule l10n/musdb updated: 024c9bf8ba...8d93e4a64a
1
l10n/translation-csvxml
Submodule
1
l10n/translation-csvxml
Submodule
Submodule l10n/translation-csvxml added at 9d17569182
156
phpstan-baseline.neon
Normal file
156
phpstan-baseline.neon
Normal file
@ -0,0 +1,156 @@
|
||||
parameters:
|
||||
ignoreErrors:
|
||||
-
|
||||
message: "#^Class MDInvalidNodaLinkException is neither abstract nor final\\.$#"
|
||||
count: 1
|
||||
path: classes/MDAllowedValueSets/exceptions/MDInvalidNodaLinkException.php
|
||||
|
||||
-
|
||||
message: "#^Class \"MDInvalidNodaLinkLcshIdIsGeneralLoc\" is not allowed to extend \"MDInvalidNodaLinkException\"\\.$#"
|
||||
count: 1
|
||||
path: classes/MDAllowedValueSets/exceptions/MDInvalidNodaLinkLcshIdIsGeneralLoc.php
|
||||
|
||||
-
|
||||
message: "#^Class \"MDInvalidNodaLinkLocIdIsSh\" is not allowed to extend \"MDInvalidNodaLinkException\"\\.$#"
|
||||
count: 1
|
||||
path: classes/MDAllowedValueSets/exceptions/MDInvalidNodaLinkLocIdIsSh.php
|
||||
|
||||
-
|
||||
message: "#^Match arm comparison between \\$this\\(MDCopyrightCollective\\)&MDCopyrightCollective\\:\\:vg_bildkunst and MDCopyrightCollective\\:\\:vg_bildkunst is always true\\.$#"
|
||||
count: 3
|
||||
path: classes/MDAllowedValueSets/src/enums/MDCopyrightCollective.php
|
||||
|
||||
-
|
||||
message: "#^Match expression does not handle remaining values\\: MDMeasurementType\\:\\:height_frame\\|MDMeasurementType\\:\\:height_image_size\\|MDMeasurementType\\:\\:height_sheet_size\\|MDMeasurementType\\:\\:height_socle\\|MDMeasurementType\\:\\:length_frame\\|MDMeasurementType\\:\\:length_image_size\\|MDMeasurementType\\:\\:length_sheet_size\\|MDMeasurementType\\:\\:length_socle\\|MDMeasurementType\\:\\:width_frame\\|MDMeasurementType\\:\\:width_image_size\\|MDMeasurementType\\:\\:width_sheet_size\\|MDMeasurementType\\:\\:width_socle$#"
|
||||
count: 1
|
||||
path: classes/MDAllowedValueSets/src/enums/MDMeasurementType.php
|
||||
|
||||
-
|
||||
message: "#^Class MDInvalidNodaLink is neither abstract nor final\\.$#"
|
||||
count: 1
|
||||
path: classes/MDErrorReporter/exceptions/updates/MDInvalidNodaLink.php
|
||||
|
||||
-
|
||||
message: "#^Strict comparison using \\=\\=\\= between '35CA0E31F6F44FB5' and null will always evaluate to false\\.$#"
|
||||
count: 1
|
||||
path: classes/MDMailer/src/MDMailerHelper.php
|
||||
|
||||
-
|
||||
message: "#^Calling file_get_contents\\(\\) is forbidden, use MD_STD\\:\\:file_get_contents\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MDTlLoader/src/MDTlLoader.php
|
||||
|
||||
-
|
||||
message: "#^Calling json_encode\\(\\) is forbidden, use MD_STD\\:\\:json_encode\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MDTlLoader/src/MDTlLoader.php
|
||||
|
||||
-
|
||||
message: "#^Calling mkdir\\(\\) is forbidden, use MD_STD\\:\\:mkdir\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MDTlLoader/src/MDTlLoader.php
|
||||
|
||||
-
|
||||
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
|
||||
count: 3
|
||||
path: classes/MDTlLoader/src/MDTlLoader.php
|
||||
|
||||
-
|
||||
message: "#^Variable variables are not allowed\\.$#"
|
||||
count: 3
|
||||
path: classes/MDTlLoader/src/MDTlLoader.php
|
||||
|
||||
-
|
||||
message: "#^Calling file_get_contents\\(\\) is forbidden, use MD_STD\\:\\:file_get_contents\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling json_encode\\(\\) is forbidden, use MD_STD\\:\\:json_encode\\(\\) instead\\.$#"
|
||||
count: 2
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling levenshtein\\(\\) is forbidden, use MD_STD\\:\\:levenshtein\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling mkdir\\(\\) is forbidden, use MD_STD\\:\\:mkdir\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling realpath\\(\\) is forbidden, use MD_STD\\:\\:realpath\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling scandir\\(\\) is forbidden, use MD_STD\\:\\:scandir\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling unlink\\(\\) is forbidden, use MD_STD\\:\\:unlink\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Method MD_STD\\:\\:scandir\\(\\) should return array\\<non\\-empty\\-string\\> but returns list\\<string\\>\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Parameter \\#3 \\$value of function curl_setopt expects resource, resource\\|false given\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD.php
|
||||
|
||||
-
|
||||
message: "#^Calling move_uploaded_file\\(\\) is forbidden, use MD_STD_IN\\:\\:move_uploaded_file\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD_IN.php
|
||||
|
||||
-
|
||||
message: "#^Variable \\$output in empty\\(\\) always exists and is not falsy\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/src/MD_STD_IN.php
|
||||
|
||||
-
|
||||
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
|
||||
count: 2
|
||||
path: classes/MD_STD/src/MD_STD_SEC.php
|
||||
|
||||
-
|
||||
message: "#^Unreachable statement \\- code above always terminates\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/tests/MD_STD_IN_Test.php
|
||||
|
||||
-
|
||||
message: "#^Calling scandir\\(\\) is forbidden, use MD_STD\\:\\:scandir\\(\\) instead\\.$#"
|
||||
count: 1
|
||||
path: classes/MD_STD/tests/MD_STD_Test.php
|
||||
|
||||
-
|
||||
message: "#^Access to undefined constant MDErrorReporter\\:\\:MD_ERROR_KNOWN\\.$#"
|
||||
count: 1
|
||||
path: functions/functions.php
|
||||
|
||||
-
|
||||
message: "#^Cannot access constant MD_ERROR_KNOWN on MDErrorReporter\\.$#"
|
||||
count: 2
|
||||
path: functions/functions.php
|
||||
|
||||
-
|
||||
message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertTrue\\(\\) with true and non\\-falsy\\-string will always evaluate to true\\.$#"
|
||||
count: 1
|
||||
path: tests/CsvxmlAvailableFieldsTest.php
|
||||
|
||||
-
|
||||
message: "#^Instanceof between FieldEntry and FieldEntry will always evaluate to true\\.$#"
|
||||
count: 1
|
||||
path: tests/CsvxmlAvailableFieldsTest.php
|
@ -6,14 +6,15 @@ parameters:
|
||||
- functions
|
||||
- inc
|
||||
- public
|
||||
- src
|
||||
- tests
|
||||
ignoreErrors:
|
||||
- '#Class MDDBConnectionImpossible not found.#'
|
||||
- '#Class MDMysqliExpectedError not found.#'
|
||||
excludePaths:
|
||||
- classes/MDAllowedValueSets/l18n
|
||||
bootstrapFiles:
|
||||
- inc/constants.php
|
||||
excludes_analyse:
|
||||
- classes/MDAllowedValueSets/l18n
|
||||
disallowedFunctionCalls:
|
||||
-
|
||||
function: 'ini_alter()'
|
||||
@ -63,3 +64,4 @@ parameters:
|
||||
includes:
|
||||
- classes/MD_QA/rules/phpstan-rules.neon
|
||||
- vendor/spaze/phpstan-disallowed-calls/extension.neon
|
||||
- phpstan-baseline.neon
|
||||
|
@ -65,11 +65,21 @@ h1 img:hover { opacity: 1; }
|
||||
|
||||
main,
|
||||
body > div,
|
||||
body > footer,
|
||||
body > form { display: block; max-width: 90vw; margin: 0 auto 3em auto; padding-bottom: 3em; }
|
||||
|
||||
form > div { margin-bottom: 1em; }
|
||||
label { display: block; font-weight: bold; margin-bottom: .5em; }
|
||||
|
||||
body > footer { border-top: .1em solid var(--color-borders); }
|
||||
|
||||
body > footer > div { display: block; }
|
||||
body > footer > div a,
|
||||
body > footer > div span { display: block; font-weight: bold; cursor: pointer;
|
||||
color: var(--color-fg-less); transition: color .4s; }
|
||||
body > footer > div a:hover,
|
||||
body > footer > div span:hover { color: var(--color-accent-hover); }
|
||||
|
||||
.invisible { display: none !important; opacity: 0; }
|
||||
|
||||
.buttonLike,
|
||||
@ -127,11 +137,11 @@ td { padding: .3em .5em; border-bottom: 1px solid var(--color-borders); }
|
||||
background: var(--color-borders); border-radius: .2em;
|
||||
color: var(--color-borders-dark); }
|
||||
|
||||
@media screen and (min-width: 75em) {
|
||||
@media screen and (min-width: 768px) {
|
||||
#helpSection > div { display: grid; grid-template-columns: 1fr 1fr; }
|
||||
#helpSection > div > div { display: inline-block; grid-column: auto; }
|
||||
}
|
||||
@media screen and (min-width: 95em) {
|
||||
@media screen and (min-width: 1366px) {
|
||||
#helpSection > div { grid-template-columns: 1fr 1fr 1fr; }
|
||||
}
|
||||
|
||||
@ -181,7 +191,7 @@ header { display: block; width: 100%; padding: 0 2em; font-size: 1rem; z-ind
|
||||
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) {
|
||||
@media screen and (max-width: 768px) {
|
||||
header#mainHeader > * { min-width: 20%; }
|
||||
}
|
||||
header#mainHeader > *:last-child { text-align: right; }
|
||||
@ -205,7 +215,7 @@ header#mainHeader h2 { display: inline-block; vertical-align: middle; font-weigh
|
||||
header#mainHeader > a:focus > img,
|
||||
header#mainHeader > a:hover > img { opacity: .7; }
|
||||
|
||||
@media screen and (min-width: 75em) {
|
||||
@media screen and (min-width: 768px) {
|
||||
|
||||
header nav > div > div { display: none; position: absolute; right: 0; top: 100%; width: 300px;
|
||||
background: var(--color-fg-less); text-align: left; }
|
||||
@ -222,7 +232,7 @@ header#mainHeader > a:hover > img { opacity: .7; }
|
||||
header { padding: 0 10em; }
|
||||
}
|
||||
|
||||
@media screen and (max-width: 75em) {
|
||||
@media screen and (max-width: 768px) {
|
||||
body { font-size: 1.08em; }
|
||||
h1 img { display: none; }
|
||||
header .branding { padding: .7rem; }
|
||||
|
2
public/assets/css/csvxml.min.css
vendored
2
public/assets/css/csvxml.min.css
vendored
File diff suppressed because one or more lines are too long
@ -10,7 +10,7 @@
|
||||
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) {
|
||||
@media screen and (min-width: 768px) {
|
||||
#newToolTipMain.visible { display: block !important; }
|
||||
}
|
||||
|
||||
|
@ -24,10 +24,22 @@ class CsvxmlValidator {
|
||||
|
||||
this.fieldList = Object.freeze(fieldList);
|
||||
|
||||
const data = Papa.parse(csvRaw.trim(), {header: true});
|
||||
const data = Papa.parse(csvRaw.trim(), {
|
||||
delimiter: ";", // auto-detect
|
||||
escapeChar: '"',
|
||||
skipEmptyLines: true,
|
||||
header: true,
|
||||
});
|
||||
|
||||
if (data.errors.length !== 0) {
|
||||
window.alert(data.errors);
|
||||
console.log("Errors encountered: ");
|
||||
console.error(data.errors);
|
||||
|
||||
let msg = '';
|
||||
for (let err of data.errors) {
|
||||
msg += err.type + ': ' + err.message + "\n";
|
||||
}
|
||||
window.alert(msg);
|
||||
}
|
||||
|
||||
let toValidate = data.data;
|
||||
@ -44,6 +56,7 @@ class CsvxmlValidator {
|
||||
validate() {
|
||||
|
||||
this.validateMandatoryTagsPresent();
|
||||
this.validateInvalidTagsPresent();
|
||||
this.checkDuplicateInvNos();
|
||||
this.checkDependentColumns();
|
||||
this.checkControlledLists();
|
||||
@ -73,6 +86,18 @@ class CsvxmlValidator {
|
||||
|
||||
}
|
||||
|
||||
validateInvalidTagsPresent() {
|
||||
|
||||
const headers = Object.keys(this.toValidate[0]);
|
||||
|
||||
for (let header of headers) {
|
||||
if (this.fieldList[header] === undefined) {
|
||||
this.errors.parsing.push("Invalid column \"" + header + "\" detected! Please remove this column or use the appropriate name!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkDuplicateInvNos() {
|
||||
|
||||
let invNoEncountered = [];
|
||||
@ -97,11 +122,34 @@ class CsvxmlValidator {
|
||||
let dependencies = this.fieldList[header].dependsOn;
|
||||
for (let dep of dependencies) {
|
||||
if (headers.includes(dep) === false) {
|
||||
console.error("Dependency issue at column " + header + ": Corresponding column " + dep + " is missing");
|
||||
console.log(headers);
|
||||
this.errors.dependentColumns.push("Dependency issue at column " + header + ": Corresponding column " + dep + " is missing");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let lineCounter = 1;
|
||||
for (let line of this.toValidate) {
|
||||
for (let fieldName in line) {
|
||||
|
||||
if (line[fieldName] === '') continue;
|
||||
if (this.fieldList[fieldName] === undefined) continue; // This may be the case if invalid fields are present
|
||||
|
||||
const dependencies = this.fieldList[fieldName].dependsOn;
|
||||
if (dependencies === undefined) continue;
|
||||
|
||||
for (let dependency of dependencies) {
|
||||
if (line[dependency] === '') {
|
||||
console.error("Dependency issue at column " + fieldName + ": Corresponding column " + dependency + " is missing [on line " + lineCounter + "]");
|
||||
console.log(line);
|
||||
this.errors.dependentColumns.push("Dependency issue at column " + fieldName + " (current value: " + line[fieldName] + "): Corresponding column " + dependency + " is empty [on line " + lineCounter + "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
lineCounter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
checkControlledLists() {
|
||||
@ -115,7 +163,7 @@ class CsvxmlValidator {
|
||||
continue;
|
||||
}
|
||||
|
||||
let allowedValues = this.fieldList[fieldName].allowedValues;
|
||||
const allowedValues = this.fieldList[fieldName].allowedValues;
|
||||
|
||||
// No error if the field doesn't have a controlled list
|
||||
if (allowedValues === undefined || allowedValues === null) continue;
|
||||
@ -124,6 +172,7 @@ class CsvxmlValidator {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (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++;
|
||||
@ -385,7 +434,9 @@ class CsvxmlPage {
|
||||
if (field.allowedValues !== undefined) {
|
||||
// Join for object
|
||||
let values = [];
|
||||
for (let key in field.allowedValues) values.push(field.allowedValues[key]);
|
||||
for (let key in field.allowedValues) {
|
||||
values.push(field.allowedValues[key]);
|
||||
}
|
||||
line3.push(values.join(","));
|
||||
}
|
||||
else line3.push("");
|
||||
@ -532,7 +583,8 @@ class CsvxmlPage {
|
||||
uploadFileForValidation(file) {
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.readAsText(file);
|
||||
let utf8 = true;
|
||||
reader.readAsText(file, utf8 ? 'UTF-8' : 'CP1251');
|
||||
|
||||
let app = this;
|
||||
|
||||
@ -542,6 +594,13 @@ class CsvxmlPage {
|
||||
|
||||
function handleValidation() {
|
||||
|
||||
(async function() {
|
||||
const result = reader.result;
|
||||
if (utf8 && result.includes('<27>')) {
|
||||
window.alert('The file encoding appears to not be UTF-8!\n\nTry exporting the file using the format "CSV (UTF-8)" if you use MS Excel or set the encoding to UTF-8 when exporting through LibreOffice!');
|
||||
}
|
||||
})();
|
||||
|
||||
// On loading success, check if the upload is valid JSON
|
||||
console.log("Read file");
|
||||
// Validate the file
|
||||
@ -703,6 +762,8 @@ class CsvxmlPage {
|
||||
const div = document.createElement("div");
|
||||
|
||||
div.appendChild(appendQA(app.tls.help_where_am_i, app.tls.help_where_am_i_content));
|
||||
div.appendChild(appendQA(app.tls.help_what_is_csv, app.tls.help_what_is_csv_content));
|
||||
div.appendChild(appendQA(app.tls.help_how_to_format_csv, app.tls.help_how_to_format_csv_content));
|
||||
|
||||
app.domHelpWrapper.appendChild(div);
|
||||
|
||||
@ -987,6 +1048,45 @@ class CsvxmlPage {
|
||||
|
||||
}
|
||||
|
||||
renderFooter() {
|
||||
|
||||
const footer = document.createElement("footer");
|
||||
|
||||
const licenseStatement = document.createElement("p");
|
||||
licenseStatement.textContent = "This work is licensed under the GNU Affero Public License Version 3.";
|
||||
footer.appendChild(licenseStatement);
|
||||
|
||||
const footerOptions = document.createElement("div");
|
||||
|
||||
const codeLink = document.createElement("a");
|
||||
codeLink.textContent = "Source code";
|
||||
codeLink.href = "https://gitea.armuli.eu/museum-digital/csvxml";
|
||||
footerOptions.appendChild(codeLink);
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
const refreshB = document.createElement("span");
|
||||
refreshB.textContent = "Reload application";
|
||||
refreshB.setAttribute("tabindex", 1);
|
||||
refreshB.addEventListener('click', function(e) {
|
||||
|
||||
Promise.all(['csvxml-cache-v1'].map(function(cache) {
|
||||
caches.has(cache).then(function(hasCache) {
|
||||
if (hasCache === true) {
|
||||
caches.delete(cache).then(function(deletionStatus) {});
|
||||
}
|
||||
})
|
||||
}))
|
||||
location.reload()
|
||||
|
||||
}, {passive: true, once: true});
|
||||
footerOptions.appendChild(refreshB);
|
||||
}
|
||||
|
||||
footer.appendChild(footerOptions);
|
||||
document.body.appendChild(footer);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
(async function() {
|
||||
@ -1025,6 +1125,7 @@ class CsvxmlPage {
|
||||
page.renderHelpTexts();
|
||||
page.renderUploader();
|
||||
page.renderMain();
|
||||
page.renderFooter();
|
||||
|
||||
}
|
||||
|
||||
|
76
public/assets/js/csvxmlV2.min.js
vendored
76
public/assets/js/csvxmlV2.min.js
vendored
File diff suppressed because one or more lines are too long
4
public/assets/js/papaparse/papaparse.min.js
vendored
4
public/assets/js/papaparse/papaparse.min.js
vendored
File diff suppressed because one or more lines are too long
2
public/assets/js/papaparse/update.txt
Normal file
2
public/assets/js/papaparse/update.txt
Normal file
@ -0,0 +1,2 @@
|
||||
Last update: 2024-07-01
|
||||
v5.4.1
|
@ -1,10 +1,10 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html data-allowed-langs="de,en,hu">
|
||||
<html data-allowed-langs="de,en,hu,ru,uk">
|
||||
<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?v000005" />
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css?68373532391e5" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
</head>
|
||||
<body class="loading">
|
||||
|
||||
<script src="assets/js/csvxmlV2.min.js?v000005" type="text/javascript" async></script>
|
||||
<script src="assets/js/csvxmlV2.min.js?68373532391e7" type="text/javascript" async></script>
|
||||
|
||||
</body>
|
||||
</html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
public/json/fields.ru.json
Normal file
1
public/json/fields.ru.json
Normal file
File diff suppressed because one or more lines are too long
1
public/json/fields.uk.json
Normal file
1
public/json/fields.uk.json
Normal file
File diff suppressed because one or more lines are too long
@ -1 +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","help_where_am_i":"What is this page for?","help_where_am_i_content":" CSVXML helps validate import object data for museum-digital following museum-digital's standard import format."}
|
||||
{"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","help_where_am_i":"Wo bin ich hier?","help_where_am_i_content":"CSVXML ist ein Werkzeug um Objektdaten, die im sogenannten CSV-Format vorliegen in ein XML-Format zu \u00fcbertragen. Mehr noch: Es ist ein Pr\u00fcfprogramm, mit welchem das Vorhandensein von f\u00fcr den Import bei museum-digital verpflichtenden Informationen und die Ber\u00fccksichtigung von Abh\u00e4ngigkeiten getestet werden kann. Nach jeder Pr\u00fcfung gibt das Programm Auskunft, wo Nachbesserungen n\u00f6tig sind. Werden diese ber\u00fccksichtigt, so kann am Ende des Pr\u00fcfprozesses eine ZIP-Datei vom Programm erstellt werden, die zu jedem Objekt eine XML-Datei enth\u00e4lt, die jeweils in einer Form und Vollst\u00e4ndigkeit vorliegt, dass ein direkter Import nach museum-digital m\u00f6glich wird.\r\n\r\nEine CSV-Datei mit den f\u00fcr den Import erlaubten Datenfeldern kann unten generiert werden.","help_what_is_csv":"Was hei\u00dft CSV?","help_what_is_csv_content":"CSV steht f\u00fcr Comma Separated Value. Es handelt sich dabei um ein Dateiformat, mit dem tabellarische Informationen in einer reinen Textdatei ausgedr\u00fcckt werden k\u00f6nnen, und wird auch von den meisten Tabellenkalkulationsprogrammen wie Excel und LibreOffice Calc unterst\u00fctzt. W\u00e4hrend nach der urspr\u00fcnglichen Definition des Standards nur eine ASCii-Kodierung der Daten erlaubt war, zeigte sich im Laufe der Jahre, dass die Benutzung breiterer Kodierungen wie UTF-8 in der Praxis n\u00f6tig ist. Ebenso lassen sich in den meisten Kalkulationsprogrammen Semikola oder andere Trennzeichen statt eines Kommas setzen. CSV ist keinesfalls identisch mit Standard-Excel-Dateien. Jedoch kann jede Excel-Datei \u2013 \u00fcber \u201eSpeichern unter \u2026\u201c als CSV-Datei gespeichert werden.","help_how_to_format_csv":"Wie muss das CSV geformt sein?","help_how_to_format_csv_content":"Damit CSVXML mit einer CSV-Datei umgehen kann und importierbare Daten generieren kann, muss die CSV-Datei in passender Form heraufgeladen werden. Dazu geh\u00f6rt vor allem, dass Semikola als Trennzeichen und doppelte Anf\u00fchrungsstriche als Delimiter ausgew\u00e4hlt sein m\u00fcssen. Die enthaltenen Daten m\u00fcssen in der Kodierung UTF-8 vorliegen, sonst erscheinen z.B. im XML statt Umlauten unerwartete Zeichen. Neuere Excel-Versionen erlauben im Dialog \u201eSpeichern unter\u201c die Auswahl \u201eCSV UTF-8 (durch Trennzeichen getrennt) (*.csv)\u201c. Hier\u00fcber k\u00f6nnen Sie ihre urspr\u00fcngliche Excel-Datei im f\u00fcr CSVXML passenden Format speichern. LibreOffice Calc bietet eine \u00e4quivalente Option.","file_encoding_is_not_utf8":"Die Datei scheint nicht UTF-8-kodiert zu sein!","non_utf8_file_instruction":"Versuchen Sie die Datei als \"CSV (UTF-8)\" zu speichern, falls sie MS Excel verwenden, oder die Dateikodierung beim Speichern auf \"UTF-8\" einzustellen, falls Sie LibreOffice Calc verwenden."}
|
@ -1 +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","help_where_am_i":"What is this page for?","help_where_am_i_content":" CSVXML helps validate import object data for museum-digital following museum-digital's standard import format."}
|
||||
{"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","help_where_am_i":"What is this page for?","help_where_am_i_content":"In its most simple usage, CSVXML is a tool for generating XML files from a given CSV table. It comes with a validation tool for checking the validity of the data against the standard import format at museum-digital, e.g. in terms of the availability of required fields and dependencies between fields. After the validation, a ZIP file containing one XML file per object is generated. If the validation proceeded without errors, these XML files can be imported to museum-digital without any further issues. A sample CSV file formatted according to the standard format for imports at museum-digital can be generated below.","help_what_is_csv":"What is CSV?","help_what_is_csv_content":"CSV is the abbreviation for \u201eComma Separated Value\u201c. It describes a file format for expressing tabular information in plain text files, that is supported by most table calculation programms such as MS Excel and LibreOffice Calc. It is thus a useful choice for quickly generating and sharing semi-structured data that can be further processed by other programms.","help_how_to_format_csv":"How to format CSV files for CSVXML?","help_how_to_format_csv_content":"CSVXML first of all requires CSV file using semicolons as a separator and double quotation marks as a delimiter. For generating actually importable data, it is advisable to save the CSV file in UTF-8 rather than the standard-conformant ASCII. Both current versions of MS Excel and LibreOffice Calc support export options for exporting CSV files using UTF-8 encoding.","file_encoding_is_not_utf8":"The file encoding appears to not be UTF-8!","non_utf8_file_instruction":"Try exporting the file using the format \"CSV (UTF-8)\" if you use MS Excel or set the encoding to UTF-8 when exporting through LibreOffice!"}
|
@ -1 +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","help_where_am_i":"What is this page for?","help_where_am_i_content":" CSVXML helps validate import object data for museum-digital following museum-digital's standard import format."}
|
||||
{"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","help_where_am_i":"What is this page for?","help_where_am_i_content":"In its most simple usage, CSVXML is a tool for generating XML files from a given CSV table. It comes with a validation tool for checking the validity of the data against the standard import format at museum-digital, e.g. in terms of the availability of required fields and dependencies between fields. After the validation, a ZIP file containing one XML file per object is generated. If the validation proceeded without errors, these XML files can be imported to museum-digital without any further issues. A sample CSV file formatted according to the standard format for imports at museum-digital can be generated below.","help_what_is_csv":"What is CSV?","help_what_is_csv_content":"CSV is the abbreviation for \u201eComma Separated Value\u201c. It describes a file format for expressing tabular information in plain text files, that is supported by most table calculation programms such as MS Excel and LibreOffice Calc. It is thus a useful choice for quickly generating and sharing semi-structured data that can be further processed by other programms.","help_how_to_format_csv":"How to format CSV files for CSVXML?","help_how_to_format_csv_content":"CSVXML first of all requires CSV file using semicolons as a separator and double quotation marks as a delimiter. For generating actually importable data, it is advisable to save the CSV file in UTF-8 rather than the standard-conformant ASCII. Both current versions of MS Excel and LibreOffice Calc support export options for exporting CSV files using UTF-8 encoding.","file_encoding_is_not_utf8":"The file encoding appears to not be UTF-8!","non_utf8_file_instruction":"Try exporting the file using the format \"CSV (UTF-8)\" if you use MS Excel or set the encoding to UTF-8 when exporting through LibreOffice!"}
|
1
public/json/tls.ru.json
Normal file
1
public/json/tls.ru.json
Normal file
File diff suppressed because one or more lines are too long
1
public/json/tls.uk.json
Normal file
1
public/json/tls.uk.json
Normal file
File diff suppressed because one or more lines are too long
@ -62,6 +62,14 @@ function generateTranslationFile(string $lang):string {
|
||||
|
||||
'help_where_am_i' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_where_am_i'),
|
||||
'help_where_am_i_content' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_where_am_i_content'),
|
||||
'help_what_is_csv' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_what_is_csv'),
|
||||
'help_what_is_csv_content' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_what_is_csv_content'),
|
||||
'help_how_to_format_csv' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_how_to_format_csv'),
|
||||
'help_how_to_format_csv_content' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'help_how_to_format_csv_content'),
|
||||
|
||||
'file_encoding_is_not_utf8' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'file_encoding_is_not_utf8'),
|
||||
'non_utf8_file_instruction' => $tlLoader->tl("csvxml-overview", "csvxml_overview", 'non_utf8_file_instruction'),
|
||||
|
||||
]);
|
||||
|
||||
}
|
||||
@ -79,7 +87,7 @@ function generateAppShell():string {
|
||||
|
||||
<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?v000005" />
|
||||
<link rel="stylesheet" type="text/css" href="assets/css/csvxml.min.css?' . uniqid() . '" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<meta name="theme-color" content="#aa4400" />
|
||||
|
||||
@ -102,7 +110,7 @@ function generateAppShell():string {
|
||||
</head>
|
||||
<body class="loading">
|
||||
|
||||
<script src="assets/js/csvxmlV2.min.js?v000005" type="text/javascript" async></script>
|
||||
<script src="assets/js/csvxmlV2.min.js?' . uniqid() . '" type="text/javascript" async></script>
|
||||
|
||||
</body>
|
||||
</html>';
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -32,9 +32,9 @@ final class FieldEntry {
|
||||
* @param string $explica Explanation.
|
||||
*/
|
||||
public function __construct(
|
||||
bool $required, array $allowedValues,
|
||||
array $dependsOn, string $remark,
|
||||
string $name_human_readable, string $explica
|
||||
bool $required = false, array $allowedValues = [],
|
||||
array $dependsOn = [], string $remark = "",
|
||||
string $name_human_readable = "", string $explica = ""
|
||||
) {
|
||||
$this->required = $required;
|
||||
$this->allowedValues = $allowedValues;
|
||||
|
Reference in New Issue
Block a user