mirror of
https://github.com/pretix/pretix.git
synced 2026-05-04 15:04:03 +00:00
Writable API for ticket layouts (#3004)
Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
7
src/pretix/static/ajv/ajv2020.bundle.min.js
vendored
Normal file
7
src/pretix/static/ajv/ajv2020.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -118,6 +118,7 @@ var editor = {
|
||||
uploaded_file_id: null,
|
||||
_window_loaded: false,
|
||||
_fabric_loaded: false,
|
||||
schema: null,
|
||||
|
||||
_px2mm: function (v) {
|
||||
return v / editor.pdf_scale / 72 * editor.pdf_page.userUnit * 25.4;
|
||||
@@ -988,8 +989,26 @@ var editor = {
|
||||
},
|
||||
|
||||
_source_save: function () {
|
||||
editor.load(JSON.parse($("#source-textarea").val()));
|
||||
$("#source-container").hide();
|
||||
try {
|
||||
var Ajv = window.ajv2020
|
||||
var ajv = new Ajv()
|
||||
var validate = ajv.compile(editor.schema)
|
||||
var data = JSON.parse($("#source-textarea").val())
|
||||
var valid = validate(data)
|
||||
|
||||
if (!valid) {
|
||||
console.log(validate.errors)
|
||||
alert("Invalid input syntax. If you're familiar with this, check out the developer console for a full " +
|
||||
"error log. Otherwise, please contact support.")
|
||||
} else {
|
||||
editor.load(data);
|
||||
$("#source-container").hide();
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
alert("Parsing error. If you're familiar with this, check out the developer console for a full " +
|
||||
"error log. Otherwise, please contact support.")
|
||||
}
|
||||
},
|
||||
|
||||
_create_empty_background: function () {
|
||||
@@ -1098,6 +1117,10 @@ var editor = {
|
||||
$("#toolbox-source").bind('click', editor._source_show);
|
||||
$("#source-close").bind('click', editor._source_close);
|
||||
$("#source-save").bind('click', editor._source_save);
|
||||
|
||||
$.getJSON($("#schema-url").text(), function (data) {
|
||||
editor.schema = data;
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
371
src/pretix/static/schema/pdf-layout.schema.json
Normal file
371
src/pretix/static/schema/pdf-layout.schema.json
Normal file
@@ -0,0 +1,371 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "Ticket Layout",
|
||||
"description": "Dynamic elements for a PDF layout",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"description": "Layout object",
|
||||
"oneOf": [
|
||||
{
|
||||
"required": [
|
||||
"type",
|
||||
"left",
|
||||
"bottom",
|
||||
"size"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"const": "barcodearea"
|
||||
},
|
||||
"page": {
|
||||
"description": "Page number this will be shown on, defaults to 1.",
|
||||
"type": "number"
|
||||
},
|
||||
"left": {
|
||||
"description": "Position of the element on the x axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"bottom": {
|
||||
"description": "Position of the element on the y axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"content": {
|
||||
"description": "Name of a variable to use. The available values depend on event configuration and installed plugins. Defaults to 'secret'.",
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"description": "Custom text. Only used when 'content' is set to 'other'.",
|
||||
"type": "string"
|
||||
},
|
||||
"text_i18n": {
|
||||
"description": "Custom text in multiple languages. Only used when 'content' is set to 'other_i18n'.",
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"[a-zA-Z-]+": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"size": {
|
||||
"description": "Size of the barcode in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"nowhitespace": {
|
||||
"description": "Whether a barcode should be rendered without margins. Only used for type 'barcodearea'.",
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"required": [
|
||||
"type",
|
||||
"left",
|
||||
"bottom",
|
||||
"content",
|
||||
"width",
|
||||
"height"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"const": "imagearea"
|
||||
},
|
||||
"page": {
|
||||
"description": "Page number this will be shown on, defaults to 1.",
|
||||
"type": "number"
|
||||
},
|
||||
"left": {
|
||||
"description": "Position of the element on the x axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"bottom": {
|
||||
"description": "Position of the element on the y axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"content": {
|
||||
"description": "Name of a variable to use. The available values depend on event configuration and installed plugins.",
|
||||
"type": "string"
|
||||
},
|
||||
"width": {
|
||||
"description": "Width of the element in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"height": {
|
||||
"description": "Height of the element in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"required": [
|
||||
"type",
|
||||
"left",
|
||||
"bottom",
|
||||
"content",
|
||||
"width",
|
||||
"fontsize",
|
||||
"fontfamily",
|
||||
"bold",
|
||||
"italic",
|
||||
"align",
|
||||
"color"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"const": "textarea"
|
||||
},
|
||||
"page": {
|
||||
"description": "Page number this will be shown on, defaults to 1.",
|
||||
"type": "number"
|
||||
},
|
||||
"left": {
|
||||
"description": "Position of the element on the x axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"bottom": {
|
||||
"description": "Position of the element on the y axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"width": {
|
||||
"description": "Width of the element in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"content": {
|
||||
"description": "Name of a variable to use. The available values depend on event configuration and installed plugins.",
|
||||
"type": "string"
|
||||
},
|
||||
"text": {
|
||||
"description": "Custom text. Only used when 'content' is set to 'other'.",
|
||||
"type": "string"
|
||||
},
|
||||
"text_i18n": {
|
||||
"description": "Custom text in multiple languages. Only used when 'content' is set to 'other_i18n'.",
|
||||
"type": "object",
|
||||
"patternProperties": {
|
||||
"[a-zA-Z-]+": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
"locale": {
|
||||
"description": "Locale to render the text in.",
|
||||
"type": ["string", "null"],
|
||||
"pattern": "[a-zA-Z-]*"
|
||||
},
|
||||
"fontsize": {
|
||||
"description": "Font size.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"fontfamily": {
|
||||
"description": "Font family. The available values depend on installed plugins.",
|
||||
"type": "string"
|
||||
},
|
||||
"bold": {
|
||||
"description": "Use bold font variant.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"italic": {
|
||||
"description": "Use italic font variant.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"align": {
|
||||
"description": "Text alignment.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"left",
|
||||
"center",
|
||||
"right"
|
||||
]
|
||||
},
|
||||
"color": {
|
||||
"description": "Text color as a tuple of three integers in the 0-255 range and one float in the 0-1 range. The last value (alpha) is ignored by the current implementation but might be used in the future.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 4
|
||||
},
|
||||
"downward": {
|
||||
"description": "Downward rendering of text (recommended for new layouts), but default is false for backwards-compatibility.",
|
||||
"type": "boolean"
|
||||
},
|
||||
"rotation": {
|
||||
"description": "Rotation in degrees.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"required": [
|
||||
"type",
|
||||
"left",
|
||||
"bottom",
|
||||
"content",
|
||||
"size"
|
||||
],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"const": "poweredby"
|
||||
},
|
||||
"page": {
|
||||
"description": "Page number this will be shown on, defaults to 1.",
|
||||
"type": "number"
|
||||
},
|
||||
"left": {
|
||||
"description": "Position of the element on the x axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"bottom": {
|
||||
"description": "Position of the element on the y axis in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
},
|
||||
"content": {
|
||||
"description": "Name of a style to use. The available values currently are 'dark' and 'white'.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"dark",
|
||||
"white"
|
||||
]
|
||||
},
|
||||
"size": {
|
||||
"description": "Size of the logo in millimeters.",
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "number"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]+(\\.[0-9]+)?$"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user