From c174a593c176fe0f0e2bc2374c7063ea1397a899 Mon Sep 17 00:00:00 2001 From: Quimet <63587466+DnomaidGit@users.noreply.github.com> Date: Sun, 31 Mar 2024 17:09:31 +0200 Subject: [PATCH] Table --- .../CustomControls/CWC_manifest_Schema.json | 504 ++++++++++++++++++ Sources/CustomControls/manifest.json | 73 +++ ...{9DE938AC-F10E-4DED-B46D-5B3B0618B180}.zip | Bin 871260 -> 871875 bytes 3 files changed, 577 insertions(+) create mode 100644 Sources/CustomControls/CWC_manifest_Schema.json create mode 100644 Sources/CustomControls/manifest.json diff --git a/Sources/CustomControls/CWC_manifest_Schema.json b/Sources/CustomControls/CWC_manifest_Schema.json new file mode 100644 index 0000000..a0a166f --- /dev/null +++ b/Sources/CustomControls/CWC_manifest_Schema.json @@ -0,0 +1,504 @@ +{ + "type": "object", + "required": [ + "mver", + "control" + ], + "properties": { + "mver": { + "type": "string", + "title": "Defines the internal version of the manifest structure, not the version of the CWC itself", + "examples": [ + "1.2.0" + ] + }, + "$schema": { + "type": "string", + "title": "Defines the schema file", + "examples": [ + "./CWC_manifest_Schema.json" + ] + }, + "control": { + "type": "object", + "title": "Defines the kind of manifest", + "required": [ + "identity", + "contracts", + "types" + ], + "properties": { + "identity": { + "type": "object", + "required": [ + "name", + "version", + "displayname", + "type", + "start" + ], + "properties": { + "name": { + "type": "string", + "default": "", + "title": "Defines the name of the CWC as default name when placing this CWC in a screen", + "examples": [ + "LTW Control" + ] + }, + "version": { + "type": "string", + "default": "", + "title": "Defines the version of the CWC", + "examples": [ + "1.0" + ] + }, + "displayname": { + "type": "string", + "default": "", + "title": "Defines the name shown in TIA Portal", + "examples": [ + "LTW Control" + ] + }, + "icon": { + "type": "string", + "default": "", + "title": "Contains the path to the icon of the CWC", + "examples": [ + "./assets/ltw.png" + ] + }, + "type": { + "type": "string", + "default": "", + "title": "Contains the GUID. This needs to be the same as the name of the .zip file.", + "examples": [ + "guid://051efb1b-08cd-4a41-96bd-cd507cd9d2f0" + ] + }, + "start": { + "type": "string", + "default": "", + "title": "defines the starting point of the CWC for the browser", + "examples": [ + "./control/index.html" + ] + }, + "config": { + "type": "string", + "default": "", + "title": "defines the starting point of the Dialogue of the CWC (HMI extension 'Dialogues' required)", + "examples": [ + "./control/configurator.html" + ] + } + }, + "additionalProperties": false + }, + "contracts": { + "type": "object", + "title": "contains methods, events and properties as an interface for the usage in TIA Portal", + "required": [ + "api" + ], + "properties": { + "api": { + "type": "object", + "required": [ + "methods", + "events", + "properties" + ], + "properties": { + "methods": { + "type": "object", + "default": "", + "title": "contains a list of methods the CWC can use.", + "patternProperties": { + "^.*$": { + "type": "object", + "properties": { + "parameters": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "default": "", + "title": "contains a list of parameters of the event.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "default": "", + "enum": [ + "number", + "string", + "boolean", + "object" + ], + "title": "Provides a type for the item", + "examples": [ + "string" + ] + } + } + } + }, + "additionalProperties": false + }, + "description": { + "type": "string", + "default": "", + "title": "Provides a description for the method", + "examples": [ + "downloads the content to the user in the given fileName" + ] + }, + "return": { + "type": "object", + "default": "", + "title": "Defines the return type of the method", + "properties": { + "type": { + "type": "string", + "default": "", + "enum": [ + "number", + "string", + "boolean", + "object", + "null" + ], + "title": "Provides a type for the item", + "examples": [ + "string" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "events": { + "type": "object", + "default": "", + "title": "contains a list of events the CWC can work with.", + "patternProperties": { + "^.*$": { + "type": "object", + "properties": { + "arguments": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "default": "", + "title": "contains a list of parameters of the event.", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "default": "", + "enum": [ + "number", + "string", + "boolean" + ], + "title": "Provides a type for the item", + "examples": [ + "string" + ] + } + } + } + }, + "additionalProperties": false + }, + "description": { + "type": "string", + "default": "", + "title": "Provides a description for the method", + "examples": [ + "get triggered whenever the screen width or height changes" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "properties": { + "type": "object", + "default": "", + "title": "contains a list of properties the CWC can work with.", + "patternProperties": { + "^.*$": { + "type": "object", + "anyOf": [ + { + "required": [ + "type" + ] + }, + { + "required": [ + "$ref" + ] + } + ], + "properties": { + "type": { + "type": "string", + "default": "", + "enum": [ + "number", + "string", + "boolean" + ], + "title": "Provides a type for the item", + "examples": [ + "string" + ] + }, + "$ref": { + "type": "string", + "default": "", + "title": "use the user defined types ", + "examples": [ + "#/control/types/Zones" + ] + }, + "default": { + "type": [ + "string", + "number", + "boolean" + ], + "default": "", + "title": "Defines the default value", + "examples": [ + "0" + ] + }, + "description": { + "type": "string", + "default": "", + "title": "Describes what this property is used for.", + "examples": [ + "get triggered whenever the screen width or height changes" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "environment": { + "type": "object", + "title": "containing ��prerequisites�� and ��extensions��.", + "properties": { + "prerequisites": { + "type": "object", + "default": "", + "title": "some basic properties", + "properties": { + "renderingspace": { + "type": "object", + "properties": { + "minwidth": { + "type": "number" + }, + "maxwidth": { + "type": "number" + }, + "defaultwidth": { + "type": "number" + }, + "minheight": { + "type": "number" + }, + "maxheight": { + "type": "number" + }, + "defaultheight": { + "type": "number" + }, + "units": { + "type": "string", + "enum": [ + "px", + "cm", + "mm", + "in", + "pt" + ] + } + } + } + }, + "additionalProperties": false + }, + "extensions": { + "type": "object", + "default": "", + "title": "Defines extensions and if they are mandatory or not,", + "properties": { + "HMI": { + "type": "object", + "properties": { + "mandatory": { + "type": "boolean", + "title": "if it is mandatoried", + "examples": [ + "true" + ] + }, + "version": { + "type": "string", + "title": "the version of this item", + "examples": [ + "~1.0.0" + ] + } + }, + "additionalProperties": false + } + } + } + }, + "additionalProperties": false + }, + "metadata": { + "type": "object", + "title": "It is possible to add more user defined metadata", + "patternProperties": { + "author": { + "type": "string", + "default": "", + "examples": [ + "Siemens" + ] + }, + "keywords": { + "type": "array", + "items": { + "type": "string" + } + }, + "description": { + "type": "string", + "default": "", + "examples": [ + "This is a demo project" + ] + }, + "homepage": { + "type": "string", + "default": "", + "examples": [ + "TestPage01" + ] + } + } + }, + "types": { + "type": "object", + "title": "contains local definitions for user defined datatypes, objects and arrays", + "patternProperties": { + "^.*$": { + "type": "object", + "default": "", + "title": "contains a list of parameters of the event.", + "properties": { + "$id": { + "type": "string", + "default": "", + "title": "the user defined types ", + "enum":[ + "http://tia.siemens.com/wincc-unified/types/s/color", + "http://tia.siemens.com/wincc-unified/types/s/datetime", + "http://tia.siemens.com/wincc-unified/types/s/string", + "http://tia.siemens.com/wincc-unified/types/s/bool", + "http://tia.siemens.com/wincc-unified/types/s/real" + ], + "examples": [ + "http://tia.siemens.com/wincc-unified/types/s/color" + ] + }, + "$ref": { + "type": "string", + "default": "", + "title": "use the user defined types ", + "examples": [ + "#/control/types/Zones" + ] + }, + "type": { + "type": "string", + "default": "", + "enum": [ + "number", + "string", + "boolean", + "object", + "array", + "integer" + ], + "title": "Provides a type for the item", + "examples": [ + "string" + ] + }, + "default": { + "type": [ + "string", + "number", + "boolean" + ], + "default": "", + "title": "The default value", + "examples": [ + "Center" + ] + }, + "enum": { + "type": "array", + "items": { + "type": ["string", "number"] + }, + "title": "The choices", + "examples": [ + "Top", + "Center", + "Bottom" + ] + } + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/Sources/CustomControls/manifest.json b/Sources/CustomControls/manifest.json new file mode 100644 index 0000000..19d172c --- /dev/null +++ b/Sources/CustomControls/manifest.json @@ -0,0 +1,73 @@ +{ + "$schema": "./CWC_manifest_Schema.json", + "mver": "1.2.0", + "control": { + "identity": { + "name": "TableDnomaid", + "version": "1.0", + "displayname": "Table Dnomaid", + "icon": "./assets/TableDnomaid.ico", + "type": "guid://9DE938AC-F10E-4DED-B46D-5B3B0618B180", + "start": "./control/index.html" + }, + "environment": { + "prerequisites": { + "renderingspace": { + "defaultwidth": 810, + "defaultheight": 195, + "unit": "px" + } + }, + "extensions": { + "HMI": { + "mandatory": true, + "version": "~1.0.0" + } + } + }, + "metadata": { + "author": "Quimet", + "keywords": [ + "Template", + "Dnomaid" + ], + "homepage": "https://github.com/DnomaidGit", + "company": "Dnomaid" + }, + "contracts": { + "api": { + "methods": { + "DrawTableData": { + "parameters": { + "tableDataString": { + "type": "string" + } + }, + "description": "Table Data String(JSON)" + } + }, + "events": { + "SelectedRow": { + "arguments": { + "RowContent": { + "type": "string" + } + }, + "description": "Selected row" + } + }, + "properties": { + "TableDataString": { + "type": "string", + "default": "[{\"ID\":\"1\",\"Name\":\"Test1\",\"Temperature\":\"1°C\",\"Time\":\"00_00_00 00-00-1999\"},{\"ID\":\"2\",\"Name\":\"Test2\",\"Temperature\":\"2°C\",\"Time\":\"00_00_01 00-00-1999\"}]" + }, + "ColumnStyleString" :{ + "type": "string", + "default": "[{\"title\":\"ID\", \"field\":\"ID\"},{\"title\":\"Name\", \"field\":\"Name\"},{\"title\":\"Temperature\", \"field\":\"Temperature\"},{\"title\":\"Time\", \"field\":\"Time\"}]" + } + } + } + }, + "types": {} + } +} \ No newline at end of file diff --git a/Sources/CustomControls/{9DE938AC-F10E-4DED-B46D-5B3B0618B180}.zip b/Sources/CustomControls/{9DE938AC-F10E-4DED-B46D-5B3B0618B180}.zip index 8515f90cd63d15685141fdedded14caf9ddc4b22..dfd3512f4a713d6043d31b99fa97f81e44c8ce8c 100644 GIT binary patch delta 5474 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 Wal%J=1mZCK=SV~#cE~Z0FaHB4PHP4L delta 4807 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