diff --git a/conf.example.json b/conf.example.json
new file mode 100644
index 0000000..3983d28
--- /dev/null
+++ b/conf.example.json
@@ -0,0 +1,31 @@
+{
+ "tags": {
+ "allowUnknownTags": true
+ },
+ "recurseDepth": 10,
+ "source": {
+ "include": ["docfiles"],
+ "include_2": ["../../develop/first/gui/js/providers"],
+ "include_3": ["../../develop/first/gui/js"],
+ "core": ["../../develop/first/core"],
+ "includePattern": ".+\\.js(doc|x)?$",
+ "excludePattern": "(^|\\/|\\\\)_"
+ },
+ "opts" : {
+ "template": "templates/jaguarjs-jsdoc",
+ "encoding": "utf8",
+ "readme": "",
+ "recurse": true,
+ "destination": "example-docs/"
+ },
+ "plugins": [
+ "plugins/markdown"
+ ],
+ "templates": {
+ "cleverLinks": false,
+ "monospaceLinks": false,
+ "default": {
+ "outputSourceFiles": true
+ }
+ }
+}
diff --git a/conf2.json b/conf2.json
new file mode 100644
index 0000000..899ab33
--- /dev/null
+++ b/conf2.json
@@ -0,0 +1,31 @@
+{
+ "tags": {
+ "allowUnknownTags": true
+ },
+ "recurseDepth": 10,
+ "source": {
+ "include": ["docfiles"],
+ "include_2": ["../../develop/first/gui/js/providers"],
+ "include_3": ["../../develop/first/gui/js"],
+ "core": ["../../develop/first/core"],
+ "includePattern": ".+\\.js(doc|x)?$",
+ "excludePattern": "(^|\\/|\\\\)_"
+ },
+ "opts" : {
+ "template": "templates/initi2",
+ "encoding": "utf8",
+ "readme": "",
+ "recurse": true,
+ "destination": "docs/"
+ },
+ "plugins": [
+ "plugins/markdown"
+ ],
+ "templates": {
+ "cleverLinks": false,
+ "monospaceLinks": false,
+ "default": {
+ "outputSourceFiles": true
+ }
+ }
+}
diff --git a/docfiles/custom/context.js b/docfiles/custom/context.js
new file mode 100644
index 0000000..3e4ab78
--- /dev/null
+++ b/docfiles/custom/context.js
@@ -0,0 +1,142 @@
+/**
+ * ### Документация по работе с GUI версии 2.9.1
+ *
+ * @name 01
+ * @context
+ * @memberof context
+ */
+
+/**
+ * ### Контекстное меню
+ *
+ *
+ *
+ * #### Протокол
+
+ | type | command | data |
+ |------------- |------------------------------ |----------------------------------------------------------------------------- |
+ | GUI => CORE | requestContext | |
+ | CORE => GUI | responseContext | result: List(VariableContainer)
proxyData: VariableContainer |
+ | GUI => CORE | executeContextAction | action: String,
data: VariableContainer,
proxyData: VariableContainer |
+ | CORE => GUI | executeContextActionResponse | wizard: Boolean,
result: Map(Integer, Integer) |
+
+
+
+ #### Описание содержимого responseContext.result
+
+ | name | type | description |
+ |---------- |------------------- |-------------------------------------------------------------------- |
+ | id | String | Идентификатор, пункта меню |
+ | type | Integer | Тип пункта меню |
+ | parentId | String | Родительский ПМ, если его нет, то "" |
+ | name | String | Локализация названия |
+ | options | VariableContainer | Данные, которые сопутствую ПМ, в зависимости от контекста действия |
+
+
+
+
+ #### Описание типов, пунктов контекстного меню
+
+ | id | name | descriptions | options |
+ |---- |----------- |--------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------ |
+ | 0 | group | пункт меню (ПМ), который содержит в себе подпункты | VariableContainer[] |
+ | 1 | simple | ПМ, который исполняет запрос к ядру (executeAction) | VariableContainer[] |
+ | 2 | guiAction | действие которое исполняется со стороны GUI. | Опции, специфичные для id |
+ | 3 | dialog | ПМ, который откроет диалог, который необходимо заполнить и исполнит запрос к ядру (executeAction) | VariableContainer [
type: String,
data: VariableContainer
] |
+ | 4 | widget | ПМ, который любой виджет | VariableContainer [
type: String,
data: VariableContainer
] |
+
+ * #### Пример ответа
+ *
+ * ```
+VariableContainer [
+ errCode : 0,
+ proxyData : VariableContainer [
+ nodeIds : Set(Integer) [
+ 0
+ ]
+ ],
+ result : List(VariableContainer) [
+ VariableContainer [
+ options : VariableContainer [
+
+ ],
+ id : "model",
+ parentId : "",
+ type : 2,
+ name : "Модель"
+ ],
+ VariableContainer [
+ options : VariableContainer [
+ data : VariableContainer [
+ label : "Введите название для нового контейнера",
+ formVC : VariableContainer [
+ data : VariableContainer [
+ rules : List(VariableContainer) [
+ VariableContainer [
+ id : "name",
+ message : "Имя не может быть пустым",
+ validator : "input.size() > 0"
+ ]
+ ],
+ data : List(VariableContainer) [
+ VariableContainer [
+ value : "",
+ id : "name",
+ title : "Название",
+ viewer : VariableContainer [
+ data : VariableContainer [
+ vc : true
+ ],
+ type : "LabelString"
+ ],
+ editor : "Textbox"
+ ]
+ ]
+ ],
+ type : "Form"
+ ],
+ windowOptions : VariableContainer [
+ width : VariableContainer [
+ type : 0,
+ data : 300
+ ],
+ height : VariableContainer [
+ type : 0,
+ data : 160
+ ]
+ ]
+ ],
+ type : "VariablesForm"
+ ],
+ id : "addContainer",
+ parentId : "",
+ type : 3,
+ name : "Добавить контейнер"
+ ],
+ VariableContainer [
+ options : VariableContainer [
+
+ ],
+ id : "shortcutTopology",
+ parentId : "",
+ type : 1,
+ name : "Создать ярлык на рабочем столе"
+ ],
+ VariableContainer [
+ options : VariableContainer [
+
+ ],
+ id : "inventory",
+ parentId : "",
+ type : 1,
+ name : "Синхронизация инвентаря"
+ ]
+ ],
+ command : "responseContext"
+]
+ * ```
+ *
+ * @name 02
+ * @context
+ * @memberof context
+ */
diff --git a/docfiles/custom/editors.js b/docfiles/custom/editors.js
new file mode 100644
index 0000000..67599da
--- /dev/null
+++ b/docfiles/custom/editors.js
@@ -0,0 +1,1593 @@
+/**
+ * ### Документация по эдиторам
+ * @name 01
+ * @editors
+ * @memberof editors
+ *
+ browserNodeSelector.js
+ componentID.js
+ componentIDS.js
+ componentType.js
+ dataStructure.js
+ dynamicForm.js
+ eventTypebox.js
+ filterEditor.js
+ gridRowSelecter.js
+ list.js
+ listSelector.js
+ panel.js
+ processorEditor.js
+ rightsSelector.js
+ rightsTree.js
+ selectGroup.js
+ tileContainer.js
+ tiles.js
+ toggleButton.js
+ tripleStateCheckbox.js
+ */
+
+/**
+ * #### Содержание:
+ * - ##### Текстовые
+ * - - ##### [Textbox](#textbox)
+ * - - ##### [Addressbox](#addressbox)
+ * - - ##### [Textarea](#textarea)
+ * - - ##### [Password](#password)
+ * - - ##### [Localebox](#localebox)
+ * - - ##### [CodeEditorbox](#code-editorbox)
+ * - ##### Булевые
+ * - - ##### [Switchbox](#switchbox)
+ * - - ##### [Checkbox](#checkbox)
+ * - ##### Числовые
+ * - - ##### [Floatbox](#floatbox)
+ * - - ##### [UUIDbox](#uuidbox)
+ * - - ##### [Timebox](#timebox)
+ * - - ##### [TimeDiffbox](#time-diffbox)
+ * - ##### Популярные
+ * - - ##### [Form](#form)
+ * - - ##### [GridEditor](#grid-editor)
+ * - - ##### [Combobox](#combobox)
+ * - - ##### [Address](#address)
+ * - - ##### [Ipbox](#ipbox)
+ * - - ##### [Oidbox](#oidbox)
+ * - - ##### [CustomStructureEditor](#custom-structure-editor)
+ * - ##### Другие
+ * - - ##### [Colorpicker](#colorpicker)
+ * - - ##### [IconEditor](#icon-editor)
+ * - - ##### [PresentationPicker](#presentation-picker)
+ * - - ##### [Slider](#slider)
+ * - ##### Не классифицированные
+ * - - ##### [TreeEditor](#tree-editor)
+ * - - ##### [DialogEditor](#dialog-editor)
+ * - - ##### [ProcessorEditor](#processor-editor)
+ * - ##### Устаревшие
+ * - - ##### [ComponentSelector](#component-selector) - устаревший (будет переработан)
+ * - - ##### [ComponentFilterEditor](#сomponent-filter-editor) - устаревший (будет удален)
+ * - - ##### [AttributeSelecter](#attribute-selecter) - устаревший (будет переработан)
+ * - - ##### [AttributeSetter](#attribute-setter) - устаревший (будет переработан)
+ *
+ * @name 01
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Textbox
+ * *Поле для ввода текста*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Textbox"
+ * data: VariableContainer [
+ * placeholder: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------- |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | placeholder | false | String | "" | Задает текст, который будет подставлен, без введенного текста |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ *
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Addressbox
+ * *Поле для ввода адреса*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Addressbox"
+ * data: VariableContainer [
+ * placeholder: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------- |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | placeholder | false | String | "" | Задает текст, который будет подставлен, без введенного текста |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Address
+ * ```
+ *
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Password
+ * *Поле для ввода пароля*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Password"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------- |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ *
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Localebox
+ * *Поле для ввода локализованного текста*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Localebox"
+ * data: VariableContainer [
+ * placeholder: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------- |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | placeholder | false | String | "" | Задает текст, который будет подставлен, без введенного текста |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * VariableContainer [ en: "", ru: "", ... "anyLng": ""]
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### CodeEditorbox
+ * *Редактор для ввода кода*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "CodeEditorbox"
+ * data: VariableContainer [
+ * enableHighlight: Boolean,
+ * highlightPlugin: String,
+ * enableTransition: Boolean
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | enableHighlight | false | Boolean | false | Подключает подсветку кода |
+ * | highlightPlugin | false | String | "smola" | Устанавливает плагин, который будет осуществлять подсветку |
+ * | enableTransition | false | Boolean | false | Будет ли меняться задний фон при наведении |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Switchbox
+ * *Переключатель. Редактор для булевого значения*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Switchbox"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Boolean
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Checkbox
+ * *Переключатель. Редактор для булевого значения*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Checkbox"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 20 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 20 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Boolean
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Combobox
+ * *Выпадающий список. Редактор для выбора из списка*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Combobox"
+ * data: VariableContainer [
+ * data: Deque(String)[],
+ * useEnum: false,
+ * enumList: null,
+ * maxPopupHeight: Integer,
+ * popupWidth: Integer,
+ * placeholder: String,
+ * viewType: String | VariableContainer,
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |---------------- |----------- |-------------------------- |----------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 100% | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | data | true | Deque(String) | Deque(String)[] | Список пунктов выпадающего списка |
+ * | maxPopupHeight | false | Integer | 100 | Максимальная высота, всплывающего окна, содержащего список |
+ * | popupWidth | false | Integer | -1 | Ширина всплывающего окна, если задан -1, то равно ширине редактора |
+ * | placeholder | false | String | "" | Текст заглушка |
+ * | viewType | false | String/VariableContainer | LabelString | Вьювер, отображающий текст |
+ * | useEnum | false | Boolean | false | Включает подмену типа, из заданного списка |
+ * | enumList | false | Deque(Any) | null | Список замен, по пунктам | *
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * // Если useEnum == false
+ * Integer
+ * // Если useEnum == true, тогда
+ * // Deque(Type) enumList
+ * Type
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Floatbox
+ * *Редактор для ввода значения с плавающей запятой*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Floatbox"
+ * data: VariableContainer [
+ * precision: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | precision | false | Integer | 5 | Задает кол-во числе после точки |
+ * | step | false | Integer | 1 | Надо узнать у автора, что это такое |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Float
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### UUIDbox
+ * *Ввод UUID*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "UUIDbox"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * UUID
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Timebox
+ * *Выбор времени (календарь с часами)*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Timebox"
+ * data: VariableContainer [
+ * mode: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | mode | false | Integer | 5 | Задает кол-во числе после точки |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Time
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### TimeDiffbox
+ * *Ввод временного интервала*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "TimeDiffbox"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * TimeDiff
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### ComponentSelector
+ * *Выбор типа компонента*
+ *
+ * _**устаревший** - необходима переработка_
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "ComponentSelector"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * ModelType
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### ComponentFilterEditor
+ * *Редактор фильтра по идентификатору фильтра*
+ *
+ * _**устаревший** - вместо него требуется использовать связку DialogEditor и TreeEditor_
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "ComponentFilterEditor"
+ * data: VariableContainer [
+ * nodeId: Integer,
+ * isSingleComponentMode: Boolean,
+ * componentType: ModelType
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | nodeId | true | Integer | null | идентификатор ноды в дереве flt |
+ * | isSingleComponentMode | false | Boolean | false | жестко задан тип компонента |
+ * | componentType | false | ModelType | null | тип компонента |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Integer
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Address
+ * *Поле, в которое можно перетащить модель*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Address"
+ * data: VariableContainer [
+ * onlyContainers: Boolean,
+ * helper: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | onlyContainers | false | Boolean | false | указвает, что выбранный элемент может быть только контейнером |
+ * | helper | false | String | "" | перевод для подсказки |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Address
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Ipbox
+ * *Ввод IP адреса*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Ipbox"
+ * data: VariableContainer [
+ * allowMultiple: Boolean
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | allowMultiple | false | Boolean | true | Позволяет задавать несколько адресов |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Oidbox
+ * *Редактор для ввода Oid'a*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Oidbox"
+ * data: VariableContainer [
+ * maxPopupHeight: Integer,
+ * maxHistorySize: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | maxPopupHeight | false | Integer | 200 | Позволяет задавать высоту выпадающего окна |
+ * | maxHistorySize | false | Integer | 14 | Ограничение на память истории |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Oid
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Colorpicker
+ * *Редактор, позволяющий выбрать цвет*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Colorpicker"
+ * data: VariableContainer [
+ * popupType: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | popupType | false | Integer | 0 | 0 - hsv picker, 1 - RGB Fields, 2 - color palette |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Textarea
+ * *Редактор текста*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Textarea"
+ * data: VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 74 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### IconEditor
+ * *Редактор иконок*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "IconEditor"
+ * data: VariableContainer [
+ * enabledKinds: Deque(String),
+ * iconType: Integer,
+ * background: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------ |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | enable | false | Boolean | true | Включение/выключение эдитора |
+ * | width | false | String/Integer/Float | 50 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "auto" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | enabledKinds | false | Deque(String) | Deque(String)[] | |
+ * | iconType | false | Integer | 0 | |
+ * | background | false | Integer | 1 | |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### PresentationPicker
+ * ### PresentationPicker
+ * *Позволяет выбрать виджет, эдитор и вьювер*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "PresentationPicker"
+ * data: VariableContainer [
+ * position: String,
+ * colsCount: Float,
+ * popupHeight: Integer,
+ * allowedWidgets: Boolean / Deque(String),
+ * allowedViewers: Boolean / Deque(String),
+ * allowedEditors: Boolean / Deque(String),
+ * idOnly: Boolean
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |---------------- |----------- |----------------------- |------------------ |--------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | "100%" | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | position | false | String | innerRightBottom | Задает политику позиционирования для выпадающего меню |
+ * | colsCount | false | Float | 1.5 | |
+ * | popupHeight | false | Integer | 300 | Высота выпадающего списка |
+ * | allowedWidgets | false | Deque(String)/Boolean | true | Будут ли отображены виджеты (или те виджеты, которые будут указаны) |
+ * | allowedViewers | false | Deque(String)/Boolean | true | Будут ли отображены вьюверы |
+ * | allowedEditors | false | Deque(String)/Boolean | true | Будут ли отображены эдиторы |
+ * | idOnly | false | Boolean | false | |
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Slider
+ * *Эдитор для отображения ползунка*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * isVertical: Boolean,
+ * sliderWidth: Integer,
+ * lineWidth: Integer,
+ * valueMin: Integer,
+ * valueMax: Integer,
+ * tooltip: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------- |----------- |---------------------- |--------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "100%" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | isVertical | false | Boolean | true | |
+ * | sliderWidth | false | Integer | 15 | Ширина ползунка |
+ * | lineWidth | false | Integer | 4 | Толщина линии |
+ * | valueMin | false | Integer | 0 | Минимальное допустимое значение |
+ * | valueMax | false | Integer | 100 | Максимальное допустимое значение |
+ * | tooltip | false | String | "" | Подсказка | *
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Integer
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### GridEditor
+ * *Эдитор для отображения редактируемой таблицы*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "GridEditor"
+ * data: VariableContainer [
+ * useHeaderLabelTranslationPrefix: Boolean,
+ * columns: Deque(VariableContainer),
+ * rootFormParameters: VariableContainer,
+ * allowAdd: Boolean,
+ * allowRemove: Boolean,
+ * allowEdit: Boolean,
+ * idColumn: String,
+ * isMultiple: Boolean,
+ * popupWidth: Integer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ *| name | mandatory | type | default value | description |
+ *|--------------------------------- |----------- |-------------------------- |---------------------------- |-------------------------------------------------------------------- |
+ *| width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ *| height | false | String/Integer/Float | 200 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *| useHeaderLabelTranslationPrefix | false | Boolean | true | Задает префикс, для перевода заголовков |
+ *| columns | true | Deque(VariableContainer) | Deque(VariableContainer)[] | Описание колонок для таблицы |
+ *| rootFormParameters | false | VariableContainer | VariableContainer [] | Описание параметров, формы редактирования строки в таблице |
+ *| allowAdd | false | Boolean | true | Можно ли добавлять строчку в таблицу |
+ *| allowRemove | false | Boolean | true | Можно ли добавлять строчку в таблицу |
+ *| allowEdit | false | Boolean | true | Можно ли редактировать строчку в таблицу |
+ *| idColumn | false | String | "" | Указывает, какая колонка является идентификатором |
+ *| isMultiple | false | Boolean | false | Может ли быть строчка многострочной |
+ *| popupWidth | false | Integer | 400 | Ширина окна редактирования строки |
+ *
+ *
+ *
+ * _**Описание параметров для Form.columns**_
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * Deque(VariableContainer) [
+ * VariableContainer [
+ * id: String,
+ * type: Type,
+ * label: String,
+ * optional: Boolean,
+ * showOptionalCheckbox: Boolaen,
+ * useInCellEditor: Boolean,
+ * editor: String/VariableContainer,
+ * viewer: String/VariableContainer,
+ * value: Type,
+ * visible: Boolean,
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |---------------------- |----------- |-------------------------- |--------------- |-------------------------------------------------------------------- |
+ * | id | true | String | undefined | Идентификатор колонки таблицы |
+ * | type | true | Type | undefined | Тип значения, который должен быть в этой колонке |
+ * | label | true | String | undefined | Название колонки |
+ * | optional | false | Boolean | false | Является ли колонка, необязательной к заполнению |
+ * | showOptionalCheckbox | false | Boolaen | false | Показывать ли чекбокс, необязательной колокнки |
+ * | useInCellEditor | false | Boolean | undefined | Будет ли отображен эдитор в ячейке этой колонки |
+ * | editor | false | String/VariableContainer | undefined | Редактор, которым можно осуществлять редактирование
этой ячейки |
+ * | viewer | false | String/VariableContainer | undefined | Вьювер, который будет отображать содержимое колонки |
+ * | value | false | Type | undefined | Значение |
+ * | visible | false | Boolean | undefined | Предустановленное значение при добавлении новой строчки |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * Deque(VariableContainer)
+ * ```
+ *
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### CustomStructureEditor
+ * *Редактор, кода, типов, шаблонов, структур в текстовом формате*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * mode: Integer,
+ * context: VariableContainer,
+ * desiredType: VariableContainer,
+ * description: String,
+ * hint: Boolean,
+ * validationButton: Boolean,
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ *| name | mandatory | type | default value | description |
+ *|------------------ |----------- |---------------------- |------------------------------- |--------------------------------------------------------------------------------------------------------- |
+ *| width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ *| height | false | String/Integer/Float | 300 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *| mode | false | Integer | 0 | Тип данных (0 - обычные литералы, 1 - шаблонизация (dbcl сериализация), 2 - описание типов, 3 - текст ) |
+ *| context | false | VariableContainer | VariableContainer [] | Объект, содержащий данные по ссылка, если это тип 1 |
+ *| desiredType | false | VariableContainer | VariableContainer [type: 257] | Тип данных, который ожидается на выходе |
+ *| description | false | String | "" | |
+ *| hint | false | Boolean | true | Показывать ли подсказку |
+ *| validationButton | false | Boolean | true | Кнопка валидации |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * // Зависит от опций
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### Form
+ * *Редактор, представляющий собой форму*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * viewMode: String,
+ * data: List(VariableContainer),
+ * showTitles: Boolean,
+ * viewsInData: Boolean,
+ * viewer: String,
+ * titlePadding: String,
+ * titleVAlign: String,
+ * showInvalids: Boolean,
+ * rules: Deque(VariableContainer),
+ * extra: List(Pair(String, String)),
+ * fixLayout: Boolean,
+ * dependencies: List(VariableContainer),
+ * defaultLayoutWidth: Float,
+ * focusField: String
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ *| name | mandatory | type | default value | description |
+ *|-------------------- |----------- |---------------------------- |------------------------------- |------------------------------------------------------------------------------------------------------------------------- |
+ *| width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ *| height | false | String/Integer/Float | "auto" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *| viewMode | false | String | "normal" | Тип формы. Варианты:
- **normal** - слева текст, справа редактор
- **smallTitles** - маленький текст над редактором |
+ *| data | true | List(VariableContainer) | List(VariableContainer) [] | Описание строчек формы |
+ *| showTitles | false | Boolean | true | Показывать ли заголовки |
+ *| viewsInData | false | Boolean | true | Обращаться к юре |
+ *| viewer | false | String | "Translation" | Вьювер для отображения текста в левой части |
+ *| titlePadding | false | String | "2px" | Отступы |
+ *| titleVAlign | false | String | "middle" | Полтика позицирования по вертикали |
+ *| showInvalids | false | Boolean | true | Показывать, какие поля некорректно заполнены |
+ *| rules | false | Deque(VariableContainer) | undefined | Правила по которым, будут проверены поля |
+ *| extra | false | List(Pair(String, String)) | List(Pair(String, String)) [] | Назначение неизвестно |
+ *| fixLayout | false | Boolean | false | Самостоятельный расчет ширины текста слева |
+ *| dependencies | false | List(VariableContainer) | List(VariableContainer)[] | Зависимости, между полями формы и вложенных форм |
+ *| defaultLayoutWidth | false | Float | 0 | Базовая ширина слоя для заголовков |
+ *| focusField | false | String | "" | Идентификатор поля, которое должно быть сфокусировано |
+ *
+ *
+ *
+ * _**Описание параметров для Form.data**_
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * List(VariableContainer) [
+ * VariableContainer [
+ * id: String,
+ * editor: String/VariableContainer,
+ * title: String,
+ * optional: Boolean,
+ * view: Boolean
+ * value: Type,
+ * viewer: String/VariableContainer,
+ * showOptionalCheckbox: Boolean,
+ * expanding: Boolean,
+ * valueViewer: Type
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |---------------------- |----------- |-------------------------- |--------------- |-------------------------------------------------------- |
+ * | id | true | String | undefined | Идентификатор поля |
+ * | editor | true | String/VariableContainer | undefined | Редактор, который будет вставлен с правой стороны |
+ * | title | true | String | undefined | Подставлять ли с правой стороны вьювер, а не эдитор |
+ * | optional | false | Boolean | false | Делает поле необязательным, (появляется переключатель) |
+ * | view | false | Boolean | true | если задан в true, то интерпретирует editor, как viewer |
+ * | value | false | Type | null | |
+ * | viewer | false | String/VariableContainer | Form.viewer | Вьювер, который будет подставлен с левой стороны |
+ * | extra | false | ?? | ?? | Неизвестное поле (Заполнять не нужно) |
+ * | showOptionalCheckbox | false | Boolean | true | Спрятать чекбокс необязательности |
+ * | expanding | false | Boolean | false | Занимать всю доступную высоту от формы. |
+ * | valueViewer | false | Type | undefined | Значение вьювера если view = true |
+ *
+ *
+ *
+ * _**Описание параметров для Form.dependencies**_
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * List(VariableContainer) [
+ * VariableContainer [
+ * source: String,
+ * target: String,
+ * asIs: Boolean,
+ * data: List(VariableContainer)[]
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |-------- |----------- |--------------------------- |--------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ * | source | true | String | undefined | Исходящий эдитор и параметер
Как задавать: **'rowId':'type':'optional'**
rowId может быть разделен точкой и указывать на вложенные формы или эдиторы
mySubForm.mySubSubForm.myNiceEditor
возможные значения для type: value/parameter
если задан parameter, то нужно указать параметр, который будет передан
если задан value, то данные будут взяты из getValue
пример **mySourceEditorId:value** |
+ * | target | true | String | undefined | Входящий эдитор и параметер
Как задавать: **'rowId':'type':'optional'**
возможные значения для type: value/parameter
если задан parameter, то нужно указать параметр, который будет передан
если задан value, то данные будут переданы в setValue
пример **mySubForm.mySubSubForm.myNiceEditor:value**
пример **mySubForm.mySubSubForm.myNiceEditor:parameter:width** |
+ * | asIs | false | Boolean | true | Передавать данные без изменений.
Если задан как false - будет использовать для этого data |
+ * | data | false | List(VariableContainer)[] | undefined | Правило подмены значений; |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * VariableContainer [
+ * : ,
+ * ...
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Пример**
+ * ```
+ * VariableContainer
+ * [
+ * type : "Form",
+ * data : VariableContainer
+ * [
+ * data : List(VariableContainer)
+ * [
+ * VariableContainer
+ * [
+ * editor : VariableContainer
+ * [
+ * data : VariableContainer
+ * [
+ * idOnly : true,
+ * popupHeight : 92,
+ * allowedWidgets : false,
+ * allowedEditors : List(String)
+ * [
+ * "ComponentType",
+ * "CustomStructureEditor"
+ * ],
+ * allowedViewers : false
+ * ],
+ * type : "PresentationPicker"
+ * ],
+ * title : "DataSourcesPanel.userGrid.editor",
+ * id : "type"
+ * ],
+ * VariableContainer [
+ * value : VariableContainer [],
+ * editor : VariableContainer
+ * [
+ * data : VariableContainer
+ * [
+ * hint : false,
+ * mode : 0,
+ * height : 150,
+ * desiredType : VariableContainer [type : 19],
+ * validationButton : false
+ * ],
+ * type : "CustomStructureEditor"
+ * ],
+ * title : "DataSourcesPanel.userGrid.options",
+ * id : "data"
+ * ]
+ * ],
+ * dependencies : List(VariableContainer)
+ * [
+ * VariableContainer
+ * [
+ * asIs : false,
+ * data : List(VariableContainer)
+ * [
+ * VariableContainer
+ * [
+ * method : "replace",
+ * map : Map(String, VariableContainer)
+ * [
+ * "Address" : VariableContainer [],
+ * "ComponentType" : VariableContainer [],
+ * "CustomStructureEditor" : VariableContainer
+ * [
+ * hint : false,
+ * mode : 0,
+ * height : 75,
+ * desiredType : VariableContainer [type : 19],
+ * validationButton : false
+ * ],
+ * "Floatbox" : VariableContainer [precision : 5,step : 1],
+ * "Integerbox" : VariableContainer [showArrows : true,step : 1],
+ * "Switchbox" : VariableContainer [],
+ * "Textbox" : VariableContainer [placeholder : "type text"],
+ * "TimeDiffbox" : VariableContainer [format : "(h=ap)(m=ap)(s=ap)"],
+ * "Timebox" : VariableContainer [],
+ * "UUIDbox" : VariableContainer []
+ * ]
+ * ]
+ * ],
+ * target : "data:value",
+ * source : "type:value"
+ * ]
+ * ]
+ * ]
+ * ]
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### TreeEditor
+ * *Редактор представляющий дерево, для выбора ноды*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * mode: String,
+ * treeTag: String,
+ * rootIds: Deque(Integer),
+ * extraIndication: VariableContainer,
+ * searchable: Boolean,
+ * filterData: VariableContainer,
+ * multiSelectable: Boolean,
+ * enableContextMenu: Boolean
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------------- |----------- |---------------------- |--------------------- |------------------------------------------------------------------------------------------ |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "100px" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | mode | false | String | "tree | Определяет какое будет отображение у дерева (browser или tree) |
+ * | treeTag | true | String | "" | Указывает, какой тип дерева нужно отображать |
+ * | rootIds | false | Deque(Integer) | defaultRootId | Список корневых узлов, от которых начнется дерево |
+ * | extraIndication | false | VariableContainer | VariableContainer[] | (Устаревший атрибут, не используется) Специальные иконки |
+ * | searchable | false | Boolean | null | (Устаревший атрибут, не используется) Осуществлять ли поиск |
+ * | filterData | false | VariableContainer | VariableContainer | Позволяет с помощью условия, осуществить фильтрацию на предмет
активности и выделения |
+ * | multiSelectable | false | Boolean | false | Позволяет выбирать несколько узлов в дереве |
+ * | enableContextMenu | false | Boolean | true | Позволяет отключить контекстное меню |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * // if option.multiSelectable != true
+ * Integer
+ * // else
+ * Deque(Integer)
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### DialogEditor
+ * *Редактор, который открывает содержащийся в нем редактор в новом окне и ждет результат*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * usePlaceholder: Boolean,
+ * placeholder: String,
+ * dialogWidth: Integer,
+ * dialogHeight: Integer,
+ * editor: String/VariableContainer,
+ * viewer: String/VariableContainer,
+ * activator: VariableContainer,
+ * defaultValue: Any
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |---------------- |----------- |-------------------------- |------------------------------------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "100px" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | usePlaceholder | false | Boolean | false | Использовать ли подсказку |
+ * | placeholder | false | String | null | Текст, который будет показан, как подсказка |
+ * | dialogWidth | false | Integer | 500 | Ширина окна, в котором будет открыт поддиалог |
+ * | dialogHeight | false | Integer | 300 | Высота окна, в котором будет открыт поддиалог |
+ * | editor | true | String/VariableContainer | null | Стандартная схема описания редактора |
+ * | viewer | false | String/VariableContainer | null | Стандартная схема описания вьювера |
+ * | activator | false | VariableContainer | VariableContainer [name: "gear", type: 4] | Иконка, которая отображена в правой части редактора. |
+ * | defaultValue | false | Any | null | Предустановленное значение, которое будет установлено редактору |
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * typeof options.editor
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### ProcessorEditor
+ * *Редактор, который может подменять входные и выходные данные*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "Slider"
+ * data: VariableContainer [
+ * processors: List(VariableContainer),
+ * validator: String,
+ * editor: String/VariableContainer
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------ |----------- |-------------------------- |---------------------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "100px" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | processors | false | List(VariableContainer) | List(VariableContainer) [] | Задает процессоры, для редактора |
+ * | validator | false | String | null | Задает условие для проверки значения. Пример "input.size() > 0" |
+ * | editor | true | String/VariableContainer | null | Стандартная схема описания редактора |
+ *
+ *
+ *
+ * **Пример**
+ * ```
+ * // пример описания процессоров
+ * List(VariableContainer)[
+ * VariableContainer [
+ * type: "convertNodeToModelAddr", // идентификатор процессора
+ * data: VariableContainer [ // специфичные данные процессора
+ * treeTag: "st"
+ * ]
+ * ]
+ * ]
+ *
+ * // пример простого процессора, который использует только валидатор
+ * VariableContainer [
+ * type : "ProcessorEditor",
+ * data : VariableContainer [
+ * validator : "input.size() >= 2", // input - это значение которое возвращает редактор
+ * editor : "Textbox"
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * // Тип возвращаемого значения зависит от options.editor и options.processors
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### AttributeSelecter
+ * *Редактор, который позволяет выбрать атрибут компонента*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "AttributeSelecter"
+ * data: VariableContainer [
+ * componentType: ModelType
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------ |----------- |-------------------------- |---------------------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | "100px" | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ * | componentType | false | ModelType | null | Тип компонента |
+ *
+ *
+ *
+ * **Пример**
+ * ```
+ * VariableContainer [
+ * type : "AttributeSelecter",
+ * data : VariableContainer [
+ * componentType : @component
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * String
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### AttributeSetter
+ * *Редактор, который позволяет выбрать атрибут компонента*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "AttributeSetter"
+ * data: VariableContainer [
+ * componentType: ModelType
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------ |----------- |-------------------------- |------------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Пример**
+ * ```
+ * VariableContainer [
+ * type : "AttributeSetter",
+ * data : VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * VariableContainer
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
+
+/**
+ * ### AttributeSetter
+ * *Редактор, который позволяет выбрать атрибут компонента*
+ *
+ *
+ *
+ * **Представление**
+ * ```
+ * VariableContainer [
+ * type: "AttributeSetter"
+ * data: VariableContainer [
+ * componentType: ModelType
+ * ]
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Опции**
+ * | name | mandatory | type | default value | description |
+ * |------------ |----------- |-------------------------- |------------------- |-------------------------------------------------------------------- |
+ * | width | false | String/Integer/Float | 25 | Задает ширину эдитору (в процентах или пикселях, если это Integer) |
+ * | height | false | String/Integer/Float | 30 | Задает высоту эдитору (в процентах или пикселях, если это Integer) |
+ *
+ *
+ *
+ * **Пример**
+ * ```
+ * VariableContainer [
+ * type : "AttributeSetter",
+ * data : VariableContainer []
+ * ]
+ * ```
+ *
+ *
+ *
+ * **Значение**
+ * ```
+ * VariableContainer
+ * ```
+ * @name _
+ * @editors
+ * @memberof editors
+ */
\ No newline at end of file
diff --git a/docfiles/custom/protocol.js b/docfiles/custom/protocol.js
new file mode 100644
index 0000000..1a25053
--- /dev/null
+++ b/docfiles/custom/protocol.js
@@ -0,0 +1,18 @@
+/**
+ * Created by Aleksey Chichenkov on 3/4/20.
+ */
+
+/**
+ * ### Документация по работе с GUI версии 2.9.1
+ *
+ * asdf
+ * as
+ * dfa
+ * sdf
+ * asdf
+ *
+ * @name 01
+ * @protocol
+ * @memberof protocol
+ */
+
diff --git a/docfiles/mainpage/main.js b/docfiles/mainpage/main.js
index d77ccb1..e16f45e 100644
--- a/docfiles/mainpage/main.js
+++ b/docfiles/mainpage/main.js
@@ -50,7 +50,11 @@
* - - #### {@link std} - реализация сишной библиотеки на js.
* - - #### {@link v2} - сериализуемые типы, которыми можно обмениваться с ядром.
* - - #### {@link tools} - разного рода хелперы и инструменты.
- *
+ * - #### Дополнительные материалы
+ * - - #### [Эдиторы](./editors.html)
+ * - - #### Протоколы
+ * - - - #### [Контекстное меню](./context.html)
+
* @name 02
* @mainpage
* @memberof mainpage
diff --git a/docfiles/providers/managers/entities/manager.js b/docfiles/providers/managers/entities/manager.js
new file mode 100644
index 0000000..b7e10c7
--- /dev/null
+++ b/docfiles/providers/managers/entities/manager.js
@@ -0,0 +1,4 @@
+/**
+ * Created by Aleksey Chichenkov on 12/16/19.
+ */
+
diff --git a/docfiles/providers/managers/trees/manager.js b/docfiles/providers/managers/trees/manager.js
index 9e451a7..7517efc 100644
--- a/docfiles/providers/managers/trees/manager.js
+++ b/docfiles/providers/managers/trees/manager.js
@@ -31,24 +31,34 @@
*
*
*
- * Список доступных тегов деревьев:
- * - "cmp" - Компоненты
- * - "cst" - Вложенность компонентов
- * - "dsk" - Рабочий стол
- * - "ect" - Дерево событий
- * - "flt" - Фильтры
- * - "edg" - Линки
- * - "cedg" - Вложенность линков
- * - "prf" - Профили
- * - "rmt" - Сборщики данных
- * - "st" - Схема объектов
- * - "uat" - Пользовательские данные
- * - "dptt" - ???
- * - "ecst" - ???
- * - "gat" - Глобальное дерево с атрибутами
- * - "gt" - Глобальное дерево
- * - "rlt" - ???
- * - "role" - ???
+ * Список доступных тегов деревьев:
+ *
+ * att - Массовые операций
+ * cedg - Вложенность линков
+ * chp - Провайдеры клик-хауса
+ * cmp - Компоненты
+ * cst - Вложенность компонентов
+ * dsk - Рабочий стол
+ * dst - Датасорсы
+ * ecst - Вложенность линков
+ * ect - Дерево событий
+ * edg - Дерево эджей (линков)
+ * gat - Глобальное дерево с атрибутами (Прототип)
+ * gt - Глобальное дерево (Прототип)
+ * flt - Фильтры
+ * fmt - Файловый менеджер
+ * ppt - Профили опроса
+ * prf - Профили авторизации
+ * rlt - Правила
+ * rmt - Сборщики данных
+ * rtt - Отчеты
+ * smptt - Мастер провайдеры
+ * ssptt - Слейв провайдеры
+ * st - Схема объектов
+ * uat - Пользовательские данные
+ * wmptt - WMI Master
+ * wsptt - WMI Slave
+ *
*
*
* Связанные объекты:
diff --git a/docfiles/providers/managers/trees/schemeTree/node.js b/docfiles/providers/managers/trees/schemeTree/node.js
index 5024037..afa0b3e 100644
--- a/docfiles/providers/managers/trees/schemeTree/node.js
+++ b/docfiles/providers/managers/trees/schemeTree/node.js
@@ -5,4 +5,29 @@
*/
function Node() {
+ /**
+ * Возвращает адрес модели связанный с этой нодой.
+ *
+ * @public
+ * @function model_addr
+ * @memberof Trees.SchemeTree.Node
+ * @returns {v2.address}
+ */
+ this.model_addr = function() {
+
+ };
+
+ /**
+ * Указывает, является ли данная нода контейнером.
+ *
+ * @public
+ * @function is_container
+ * @memberof Trees.SchemeTree.Node
+ * @returns {v2.boolean}
+ */
+ this.is_container = function() {
+
+ };
+
+
}
\ No newline at end of file
diff --git a/examples/test.js b/examples/test.js
new file mode 100644
index 0000000..44ae7ca
--- /dev/null
+++ b/examples/test.js
@@ -0,0 +1,4 @@
+/**
+ * Created by Aleksey Chichenkov on 12/17/19.
+ */
+
diff --git a/templates/initi/publish.js b/templates/initi/publish.js
index a002517..7fa7079 100644
--- a/templates/initi/publish.js
+++ b/templates/initi/publish.js
@@ -251,6 +251,7 @@ function generate(title, docs, filename, resolveLinks) {
}
fs.writeFileSync(outpath, html, 'utf8');
+ return outpath;
}
function generateSourceFiles(sourceFiles, encoding) {
@@ -650,6 +651,7 @@ var find_first_members = function (_parent, _clss) {
global.typedefs = {};
global.mainpage_content = [];
+global.cusomData = Object.create(null);
var find_tag_by_id = function (_tags, _tag_id) {
for (var a = 0; a < _tags.length; a++) {
@@ -718,17 +720,27 @@ exports.publish = function(taffyData, opts, tutorials) {
helper.addEventListeners(data);
data().each(function(doclet){
- // console.log(doclet);
if(doclet.kind == "typedef") {
typedefs[doclet.longname] = doclet;
}
if(doclet.tags && find_tag_by_id(doclet.tags, "mainpage")){
- // console.log(doclet);
-
mainpage_content.push(doclet);
}
+
+ if(doclet.meta && doclet.meta.path) {
+ var path = doclet.meta.path.split("/");
+ if(path[path.length - 1] === "custom") {
+ var id = doclet.meta.filename.split(".")[0];
+
+ if (!cusomData[id])
+ cusomData[id] = [];
+
+ if (doclet.tags && find_tag_by_id(doclet.tags, id))
+ cusomData[id].push(doclet);
+ }
+ }
});
@@ -877,6 +889,7 @@ exports.publish = function(taffyData, opts, tutorials) {
// add template helpers
view.content = mainpage_content;
+ view.cusomData = cusomData;
view.find = find;
view.linkto = linkto;
view.replace_enters_to_br = replace_enters_to_br;
@@ -910,9 +923,25 @@ exports.publish = function(taffyData, opts, tutorials) {
).concat(files), indexUrl);
console.log("outdir", outdir)
+ // console.log("indexUrl", indexUrl)
+ for(var id in cusomData) {
+ var out = generate(id,
+ packages.concat(
+ [{
+ subkind: id,
+ kind: 'custom',
+ readme: opts.readme,
+ longname: id
+ }]
+ ).concat(files), id + ".html");
+ console.log("generate", id, out)
+
+ }
+
+
var sih = require("./search_inheritance.js");
var inh_struct = sih.find(env.conf, helper, logger, generate);
diff --git a/templates/initi/static/styles/common.css b/templates/initi/static/styles/common.css
index 01ce9c6..3ccdd29 100644
--- a/templates/initi/static/styles/common.css
+++ b/templates/initi/static/styles/common.css
@@ -93,6 +93,12 @@ div.part > div.desc {
padding: 5px;
}
+pre.source {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+
div.container-overview > .desc > pre,
div.part > pre {
margin: 0px;
@@ -194,3 +200,15 @@ h4, h4 a
.compact-method * {
word-spacing: 0px;
}
+
+h3 > a.title {
+ cursor: pointer;
+ text-decoration: none;
+}
+
+h5 {
+ margin-block-start: 0;
+ margin-block-end: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+}
\ No newline at end of file
diff --git a/templates/initi/static/styles/jsdoc-default.css b/templates/initi/static/styles/jsdoc-default.css
index 0535e3f..17efb70 100644
--- a/templates/initi/static/styles/jsdoc-default.css
+++ b/templates/initi/static/styles/jsdoc-default.css
@@ -197,7 +197,7 @@ h5, .container-overview .subsection-title
font-size: 120%;
font-weight: bold;
letter-spacing: -0.01em;
- margin: 8px 0 3px 0;
+ /*margin: 8px 0 3px 0;*/
}
.container-overview > h3 {
@@ -235,6 +235,7 @@ table
td, th
{
+ background-color: #ffffff63;
border: 1px solid #ddd;
margin: 0px;
text-align: left;
diff --git a/templates/initi/tmpl/container.tmpl b/templates/initi/tmpl/container.tmpl
index 19519b6..51c2f6d 100644
--- a/templates/initi/tmpl/container.tmpl
+++ b/templates/initi/tmpl/container.tmpl
@@ -18,8 +18,16 @@
isGlobalPage = (doc.kind === 'globalobj');
}
?>
-
+
+
+
+
+
+
+
+
+
diff --git a/templates/initi/tmpl/custom.tmpl b/templates/initi/tmpl/custom.tmpl
new file mode 100644
index 0000000..b80e6ac
--- /dev/null
+++ b/templates/initi/tmpl/custom.tmpl
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/templates/initi2/publish.js b/templates/initi2/publish.js
new file mode 100644
index 0000000..04c04eb
--- /dev/null
+++ b/templates/initi2/publish.js
@@ -0,0 +1,14 @@
+/**
+ * Created by Aleksey Chichenkov on 12/16/19.
+ */
+const Render = require("./render");
+
+
+// do stuff here to generate your output files
+exports.publish = function(data, opts, tutorials) {
+
+ this.render = new Render(data, opts, tutorials);
+ this.render.init();
+
+};
+
diff --git a/templates/initi2/render.js b/templates/initi2/render.js
new file mode 100644
index 0000000..a14c594
--- /dev/null
+++ b/templates/initi2/render.js
@@ -0,0 +1,550 @@
+/**
+ * Created by Aleksey Chichenkov on 12/16/19.
+ */
+const fs = require("fs");
+const util = require('util');
+const helper = require('jsdoc/util/templateHelper');
+const path = require('jsdoc/path');
+const jfs = require('jsdoc/fs');
+const env = require('jsdoc/env');
+const template = require('jsdoc/template');
+const taffy = require('taffydb').taffy;
+const htmlsafe = helper.htmlsafe;
+const linkto = helper.linkto;
+
+class Render {
+
+ /**
+ *
+ * @param _taffyData
+ * @param _opts
+ */
+ constructor (_taffyData, _opts, _tutorials) {
+ this._taffyData = _taffyData;
+ this._opts = _opts;
+ this._tutorials = _tutorials;
+
+ this._sourceFiles = {};
+ this._sourceFilePaths = [];
+ }
+
+ init() {
+ this._outdir = path.normalize(this._opts.destination);
+ this._templatePath = path.normalize(this._opts.template);
+ this._conf = env.conf.templates || {};
+ this._conf.default = this._conf.default || {};
+ this._indexUrl = helper.getUniqueFilename('index');
+ this._outputSourceFiles = this._conf.default && this._conf.default.outputSourceFiles !== false;
+
+ this._upgradeData();
+ this._createFileWithDocklets();
+ this._createOutdir();
+ this._copyStaticFiles();
+ this._processExamples();
+ this._processSee();
+ this._buildListSourceFiles();
+ this._buildLinks();
+ this._addAttribsAndSignature(); // what it do is
+ this._buildMenu();
+ this._findMembers();
+ this._initTemplate();
+ this._generateFiles();
+
+ // index page displays information from package.json and lists files
+ var files = this.find({kind: 'file'});
+ var packages = this.find({kind: 'package'});
+ this.generate('Documentation: GUI 2.9.1-develop',
+ packages.concat(
+ [{
+ kind: 'mainpage',
+ readme: this._opts.readme,
+ longname: (this._opts.mainpagetitle) ? this._opts.mainpagetitle : 'Main Page'
+ }]
+ ).concat(files), this._indexUrl);
+ }
+
+ _upgradeData () {
+ this._data = helper.prune(this._taffyData);
+ this._data.sort('longname, version, since');
+ }
+
+ _createFileWithDocklets () {
+ var data = [];
+
+ this._taffyData().each(function (_data) {
+ data.push(_data);
+ });
+
+ fs.writeFileSync("taffy.json", JSON.stringify(data, true, 3));
+ }
+
+ _createOutdir () {
+ var packageInfo = (this.find({kind: 'package'}) || [])[0];
+
+ if (packageInfo && packageInfo.name) {
+ this._outdir = path.join(this._outdir, packageInfo.name, (packageInfo.version || ''));
+ }
+ jfs.mkPath(this._outdir);
+ }
+
+ _copyStaticFiles () {
+ var fromDir = path.join(this._templatePath, 'static');
+ var staticFiles = jfs.ls(fromDir, 3);
+
+ staticFiles.forEach(function(fileName) {
+ var toDir = jfs.toDir( fileName.replace(fromDir, outdir) );
+
+ jfs.mkPath(toDir);
+ jfs.copyFileSync(fileName, toDir);
+ });
+
+ if (this._conf.default.staticFiles) {
+ // The canonical property name is `include`. We accept `paths` for backwards compatibility
+ // with a bug in JSDoc 3.2.x.
+ var staticFilePaths = this._conf.default.staticFiles.include ||
+ this._conf.default.staticFiles.paths ||
+ [];
+ var staticFileFilter = new (require('jsdoc/src/filter')).Filter(this._conf.default.staticFiles);
+ var staticFileScanner = new (require('jsdoc/src/scanner')).Scanner();
+
+ staticFilePaths.forEach(function(filePath) {
+ var extraStaticFiles;
+
+ filePath = path.resolve(env.pwd, filePath);
+ extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter);
+
+ extraStaticFiles.forEach(function(fileName) {
+ var sourcePath = jfs.toDir(filePath);
+ var toDir = jfs.toDir( fileName.replace(sourcePath, outdir) );
+
+ jfs.mkPath(toDir);
+ jfs.copyFileSync(fileName, toDir);
+ }.bind(this));
+ }.bind(this));
+ }
+
+ }
+
+ _processExamples (){
+ this._data().each(function(doclet) {
+ doclet.attribs = '';
+
+ if (doclet.examples) {
+ doclet.examples = doclet.examples.map(function (example) {
+ var caption;
+ var code;
+
+ if (example.match(/^\s*([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) {
+ caption = RegExp.$1;
+ code = RegExp.$3;
+ }
+
+ return {
+ caption: caption || '',
+ code: code || example
+ };
+ }.bind(this));
+ }
+ }.bind(this))
+ }
+
+ _processSee (){
+ this._data().each(function(doclet) {
+ if (doclet.see) {
+ doclet.see.forEach(function(seeItem, i) {
+ doclet.see[i] = hashToLink(doclet, seeItem);
+ });
+ }
+ }.bind(this))
+ }
+
+ _buildListSourceFiles (){
+ var sourcePath;
+
+ this._data().each(function(doclet) {
+ // build a list of source files
+ if (doclet.meta) {
+ sourcePath = getPathFromDoclet(doclet);
+ this._sourceFiles[sourcePath] = {
+ resolved: sourcePath,
+ shortened: null
+ };
+ if (this._sourceFilePaths.indexOf(sourcePath) === -1) {
+ this._sourceFilePaths.push(sourcePath);
+ }
+ }
+ }.bind(this));
+
+ if (this._sourceFilePaths.length) {
+ this._sourceFiles = shortenPaths( this._sourceFiles, path.commonPrefix(this._sourceFilePaths) );
+ }
+ }
+
+ _buildLinks () {
+ this._data().each(function(doclet) {
+ var docletPath;
+ var url = helper.createLink(doclet);
+
+ helper.registerLink(doclet.longname, url);
+
+ // add a shortened version of the full path
+ if (doclet.meta) {
+ docletPath = getPathFromDoclet(doclet);
+ docletPath = this._sourceFiles[docletPath].shortened;
+ if (docletPath) {
+ doclet.meta.shortpath = docletPath;
+ }
+ }
+ }.bind(this));
+ }
+
+ _addAttribsAndSignature () {
+ this._data().each(function (doclet) {
+ var url = helper.longnameToUrl[doclet.longname];
+
+ if (url.indexOf('#') > -1) {
+ doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop();
+ } else {
+ doclet.id = doclet.name;
+ }
+
+ if (needsSignature(doclet)) {
+ addSignatureParams(doclet);
+ addSignatureReturns(doclet);
+ addAttribs(doclet);
+ }
+ }.bind(this));
+
+ // do this after the urls have all been generated
+ this._data().each(function(doclet) {
+ doclet.ancestors = this.getAncestorLinks(doclet);
+
+ if (doclet.kind === 'member') {
+ addSignatureTypes(doclet);
+ addAttribs(doclet);
+ }
+
+ if (doclet.kind === 'constant') {
+ addSignatureTypes(doclet);
+ addAttribs(doclet);
+ doclet.kind = 'member';
+ }
+ }.bind(this));
+
+ }
+
+ _buildMenu () {
+
+ }
+
+ _findMembers() {
+ this._members = helper.getMembers(this._data);
+ this._members.tutorials = this._tutorials.children;
+ }
+
+ _initTemplate () {
+ this._view = new template.Template( path.join(this._templatePath, 'tmpl') );
+ this._view.find = this.find.bind(this);
+ this._view.linkto = linkto;
+ this._view.resolveAuthorLinks = helper.resolveAuthorLinks;
+ this._view.tutoriallink = tutoriallink;
+ this._view.htmlsafe = htmlsafe;
+ this._view.outputSourceFiles = this._outputSourceFiles;
+
+ // set up templating
+ if(this._conf.default.layoutFile) {
+ this._view.layout = path.getResourcePath(path.dirname(this._conf.default.layoutFile), path.basename(this._conf.default.layoutFile))
+ } else {
+ this._view.layout = 'layout.tmpl'
+ }
+ }
+
+ _generateFiles() {
+ // output pretty-printed source files by default
+ if (this._outputSourceFiles) {
+ this.generateSourceFiles(this._sourceFiles, this._opts.encoding);
+ }
+
+ // set up the lists that we'll use to generate pages
+ this._classes = taffy(this._members.classes);
+ this._modules = taffy(this._members.modules);
+ this._namespaces = taffy(this._members.namespaces);
+ this._mixins = taffy(this._members.mixins);
+ this._externals = taffy(this._members.externals);
+ this._interfaces = taffy(this._members.interfaces);
+
+ Object.keys(helper.longnameToUrl).forEach(function(longname) {
+ var myClasses = helper.find(this._classes, {longname: longname});
+ var myExternals = helper.find(this._externals, {longname: longname});
+ var myInterfaces = helper.find(this._interfaces, {longname: longname});
+ var myMixins = helper.find(this._mixins, {longname: longname});
+ var myModules = helper.find(this._modules, {longname: longname});
+ var myNamespaces = helper.find(this._namespaces, {longname: longname});
+
+ if (myModules.length) {
+ this.generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]);
+ }
+
+ if (myClasses.length) {
+ this.generate(myClasses[0].name, myClasses, helper.longnameToUrl[longname]);
+ }
+
+ if (myNamespaces.length) {
+ this.generate(myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]);
+ }
+
+ if (myMixins.length) {
+ this.generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]);
+ }
+
+ if (myExternals.length) {
+ this.generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]);
+ }
+
+ if (myInterfaces.length) {
+ this.generate('Interface: ' + myInterfaces[0].name, myInterfaces, helper.longnameToUrl[longname]);
+ }
+ }.bind(this));
+ }
+
+ generate(title, docs, filename, resolveLinks) {
+ var docData;
+ var html;
+ var outpath;
+
+ resolveLinks = resolveLinks !== false;
+
+ docData = {
+ env: env,
+ title: title,
+ docs: docs
+ };
+
+ outpath = path.join(this._outdir, filename);
+
+ html = this._view.render('container.tmpl', docData);
+
+ if (resolveLinks) {
+ html = helper.resolveLinks(html); // turn {@link foo} into foo
+ }
+
+ fs.writeFileSync(outpath, html, 'utf8');
+ }
+
+ generateSourceFiles(sourceFiles, encoding) {
+ this._encoding = encoding || 'utf8';
+ Object.keys(this._sourceFiles).forEach(function(file) {
+ var source;
+ // links are keyed to the shortened path in each doclet's `meta.shortpath` property
+ var sourceOutfile = helper.getUniqueFilename(this._sourceFiles[file].shortened);
+
+ helper.registerLink(this._sourceFiles[file].shortened, sourceOutfile);
+
+ try {
+ source = {
+ kind: 'source',
+ code: helper.htmlsafe( fs.readFileSync(this._sourceFiles[file].resolved, this._encoding) )
+ };
+ }
+ catch (e) {
+ logger.error('Error while generating source file %s: %s', file, e.message);
+ }
+
+ this.generate('Source: ' + this._sourceFiles[file].shortened, [source], sourceOutfile, false);
+ }.bind(this));
+ }
+
+ getAncestorLinks(doclet) {
+ return helper.getAncestorLinks(this._data, doclet);
+ }
+
+ find(spec) {
+ return helper.find(this._data, spec);
+ }
+}
+
+
+// local functions
+
+function tutoriallink(tutorial) {
+ return helper.toTutorial(tutorial, null, {
+ tag: 'em',
+ classname: 'disabled',
+ prefix: 'Tutorial: '
+ });
+}
+
+function shortenPaths(files, commonPrefix) {
+ Object.keys(files).forEach(function(file) {
+ files[file].shortened = files[file].resolved.replace(commonPrefix, '')
+ // always use forward slashes
+ .replace(/\\/g, '/');
+ });
+
+ return files;
+}
+
+function getPathFromDoclet(doclet) {
+ if (!doclet.meta) {
+ return null;
+ }
+
+ return doclet.meta.path && doclet.meta.path !== 'null' ?
+ path.join(doclet.meta.path, doclet.meta.filename) :
+ doclet.meta.filename;
+}
+
+function needsSignature(doclet) {
+ var needsSig = false;
+
+ // function and class definitions always get a signature
+ if (doclet.kind === 'function' || doclet.kind === 'class') {
+ needsSig = true;
+ }
+ // typedefs that contain functions get a signature, too
+ else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
+ doclet.type.names.length) {
+ for (var i = 0, l = doclet.type.names.length; i < l; i++) {
+ if (doclet.type.names[i].toLowerCase() === 'function') {
+ needsSig = true;
+ break;
+ }
+ }
+ }
+ // and namespaces that are functions get a signature (but finding them is a
+ // bit messy)
+ else if (doclet.kind === 'namespace' && doclet.meta && doclet.meta.code &&
+ doclet.meta.code.type && doclet.meta.code.type.match(/[Ff]unction/)) {
+ needsSig = true;
+ }
+
+ return needsSig;
+}
+
+function addSignatureTypes(f) {
+ var types = f.type ? buildItemTypeStrings(f) : [];
+
+ f.signature = (f.signature || '') + '' +
+ (types.length ? ' :' + types.join('|') : '') + '';
+}
+
+function getSignatureAttributes(item) {
+ var attributes = [];
+
+ if (item.optional) {
+ attributes.push('opt');
+ }
+
+ if (item.nullable === true) {
+ attributes.push('nullable');
+ }
+ else if (item.nullable === false) {
+ attributes.push('non-null');
+ }
+
+ return attributes;
+}
+
+
+function updateItemName(item) {
+ var attributes = getSignatureAttributes(item);
+ var itemName = item.name || '';
+
+ if (item.variable) {
+ itemName = '…' + itemName;
+ }
+
+ if (attributes && attributes.length) {
+ itemName = util.format( '%s%s', itemName,
+ attributes.join(', ') );
+ }
+
+ return itemName;
+}
+
+function addParamAttributes(params) {
+ return params.filter(function(param) {
+ return param.name && param.name.indexOf('.') === -1;
+ }).map(updateItemName);
+}
+
+function addSignatureParams(f) {
+ var params = f.params ? addParamAttributes(f.params) : [];
+
+ f.signature = util.format( '%s(%s)', (f.signature || ''), params.join(', ') );
+}
+
+function buildItemTypeStrings(item) {
+ var types = [];
+
+ if (item && item.type && item.type.names) {
+ item.type.names.forEach(function(name) {
+ types.push( linkto(name, htmlsafe(name)) );
+ });
+ }
+
+ return types;
+}
+
+
+function addNonParamAttributes(items) {
+ var types = [];
+
+ items.forEach(function(item) {
+ types = types.concat( buildItemTypeStrings(item) );
+ });
+
+ return types;
+}
+
+function buildAttribsString(attribs) {
+ var attribsString = '';
+
+ if (attribs && attribs.length) {
+ attribsString = htmlsafe( util.format('(%s) ', attribs.join(', ')) );
+ }
+
+ return attribsString;
+}
+
+function addSignatureReturns(f) {
+ var attribs = [];
+ var attribsString = '';
+ var returnTypes = [];
+ var returnTypesString = '';
+ var source = f.yields || f.returns;
+
+ // jam all the return-type attributes into an array. this could create odd results (for example,
+ // if there are both nullable and non-nullable return types), but let's assume that most people
+ // who use multiple @return tags aren't using Closure Compiler type annotations, and vice-versa.
+ if (source) {
+ source.forEach(function(item) {
+ helper.getAttribs(item).forEach(function(attrib) {
+ if (attribs.indexOf(attrib) === -1) {
+ attribs.push(attrib);
+ }
+ });
+ });
+
+ attribsString = buildAttribsString(attribs);
+ }
+
+ if (source) {
+ returnTypes = addNonParamAttributes(source);
+ }
+ if (returnTypes.length) {
+ returnTypesString = util.format( ' → %s{%s}', attribsString, returnTypes.join('|') );
+ }
+
+ f.signature = '' + (f.signature || '') + '' +
+ '' + returnTypesString + '';
+}
+
+function addAttribs(f) {
+ var attribs = helper.getAttribs(f);
+ var attribsString = buildAttribsString(attribs);
+
+ f.attribs = util.format('%s', attribsString);
+}
+
+module.exports = Render;
\ No newline at end of file
diff --git a/templates/initi2/tmpl/container.tmpl b/templates/initi2/tmpl/container.tmpl
new file mode 100644
index 0000000..e69de29
diff --git a/templates/initi2/tmpl/layout.tmpl b/templates/initi2/tmpl/layout.tmpl
new file mode 100644
index 0000000..197a8e2
--- /dev/null
+++ b/templates/initi2/tmpl/layout.tmpl
@@ -0,0 +1,53 @@
+
+
+
+
+ Initi documentation for GUI(2.9.1-develop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+