feat: add repeated dual-QR A4 resource headers

This commit is contained in:
user
2026-07-15 21:31:34 +02:00
parent da1e37eea9
commit 01a5f18414
7 changed files with 1601 additions and 114 deletions
+203 -5
View File
@@ -47,6 +47,23 @@
"side_margin_tree_layout": {
"$ref": "#/$defs/sideMarginLayout"
},
"reference_registries": {
"type": "array",
"items": {
"type": "object",
"required": ["uuid", "source"],
"properties": {
"uuid": {
"$ref": "#/$defs/uuid"
},
"source": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}
},
"learning_effects": {
"type": "object",
"minProperties": 1,
@@ -147,6 +164,26 @@
}
},
"$defs": {
"uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
},
"externalReference": {
"type": "object",
"required": ["kind", "registry_uuid", "uuid"],
"properties": {
"kind": {
"enum": ["strategy", "card", "content", "formula"]
},
"registry_uuid": {
"$ref": "#/$defs/uuid"
},
"uuid": {
"$ref": "#/$defs/uuid"
}
},
"additionalProperties": false
},
"stringList": {
"type": "array",
"items": {
@@ -174,6 +211,10 @@
"type": "string",
"minLength": 1
},
"series_title": {
"type": "string",
"minLength": 1
},
"number": {
"type": "string",
"minLength": 1
@@ -242,18 +283,65 @@
"checked_by": { "type": "string" },
"approved_by": { "type": "string" },
"title": { "type": "string" },
"url": { "type": "string" },
"url_host_uuid": { "type": "string" },
"url": {
"type": "string",
"pattern": "^https?://"
},
"repository_url": {
"type": "string",
"pattern": "^https?://"
},
"url_host_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"url_port": { "type": ["string", "integer"] },
"doc_uuid": { "type": "string" },
"doc_uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"revision": { "type": "string" },
"issued_on": { "type": "string" },
"series": { "type": "string" },
"document_type": { "type": "string" },
"tool": { "type": "string" },
"sheet": { "type": "string" },
"show_qr": { "type": "boolean" }
"sheet": {
"type": "string",
"description": "Legacy static sheet label. Repeated page headers compute page/total dynamically."
},
"show_qr": { "type": "boolean" },
"show_repository_qr": { "type": "boolean" },
"height_cm": { "const": 3 },
"repeat_on_every_page": { "const": true },
"replace_front_matter": { "const": true }
},
"allOf": [
{
"if": {
"required": ["show_qr"],
"properties": {
"show_qr": { "const": true }
}
},
"then": {
"anyOf": [
{ "required": ["url"] },
{ "required": ["url_host_uuid", "doc_uuid"] }
]
}
},
{
"if": {
"required": ["show_repository_qr"],
"properties": {
"show_repository_qr": { "const": true }
}
},
"then": {
"required": ["repository_url"]
}
}
],
"additionalProperties": false
},
"sideMarginLayout": {
@@ -469,10 +557,49 @@
"items": {
"$ref": "#/$defs/sectionStep"
}
},
"assets": {
"type": "array",
"items": {
"$ref": "#/$defs/sectionAsset"
}
}
},
"additionalProperties": true
},
"sectionAsset": {
"type": "object",
"required": ["path", "caption", "label"],
"properties": {
"path": {
"type": "string",
"minLength": 1
},
"caption": {
"type": "string",
"minLength": 1
},
"label": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9:.-]*$"
},
"alt": {
"type": "string"
},
"kind": {
"enum": ["screenshot", "figure", "diagram"]
},
"width": {
"type": "number",
"minimum": 0.1,
"maximum": 1.0
},
"full_size_link": {
"type": "boolean"
}
},
"additionalProperties": false
},
"sectionStep": {
"type": "object",
"required": ["id", "title", "tree_refs"],
@@ -506,6 +633,12 @@
},
"figure_refs": {
"$ref": "#/$defs/stringList"
},
"references": {
"type": "array",
"items": {
"$ref": "#/$defs/externalReference"
}
}
},
"additionalProperties": true
@@ -520,6 +653,21 @@
"criterion": {
"type": "string"
},
"title": {
"type": "string",
"minLength": 1
},
"uuid": {
"type": "string",
"minLength": 1
},
"flow": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/taskFlowItem"
}
},
"assessment_criterion_ref": {
"type": "string"
},
@@ -532,6 +680,56 @@
},
"additionalProperties": true
},
"taskFlowItem": {
"oneOf": [
{ "$ref": "#/$defs/taskBlock" },
{ "$ref": "#/$defs/taskExercise" }
]
},
"taskBlock": {
"type": "object",
"required": ["kind", "id", "title"],
"properties": {
"kind": { "const": "block" },
"id": { "type": "string", "minLength": 1 },
"title": { "type": "string", "minLength": 1 },
"content_tex": { "type": "string" },
"steps": {
"type": "array",
"items": { "$ref": "#/$defs/taskBlockStep" }
}
},
"additionalProperties": false
},
"taskBlockStep": {
"type": "object",
"required": ["id", "title"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"title": { "type": "string", "minLength": 1 },
"content_tex": { "type": "string" },
"tree_refs": { "$ref": "#/$defs/stringList" },
"references": {
"type": "array",
"items": { "$ref": "#/$defs/externalReference" }
}
},
"additionalProperties": false
},
"taskExercise": {
"type": "object",
"required": ["kind", "id", "title", "prompt_tex", "criterion"],
"properties": {
"kind": { "const": "exercise" },
"id": { "type": "string", "minLength": 1 },
"title": { "type": "string", "minLength": 1 },
"prompt_tex": { "type": "string", "minLength": 1 },
"evidence_tex": { "type": "string" },
"criterion": { "type": "string", "minLength": 1 },
"based_on": { "$ref": "#/$defs/stringList" }
},
"additionalProperties": false
},
"procedureStep": {
"type": "object",
"required": ["step", "action", "condition"],