ru.coon 2.7.47 → 2.7.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.gitattributes +1 -1
  2. package/.husky/pre-commit +4 -4
  3. package/.lintstagedrc.json +2 -2
  4. package/CHANGELOG.md +14 -1
  5. package/Readme.md +24 -24
  6. package/TODO.md +7 -7
  7. package/doc/changelog.md +118 -118
  8. package/doc/shortcuts.md +5 -5
  9. package/jsdoc.config.json +29 -29
  10. package/package.json +78 -78
  11. package/sass/src/common/plugin/form/PeriodPicker.scss +8 -8
  12. package/src/Function.scss +4 -4
  13. package/src/app/viewPort/Main.scss +133 -133
  14. package/src/command/Readme.md +4 -4
  15. package/src/common/component/ColorPalette.scss +102 -102
  16. package/src/common/component/ExternalFrame.scss +8 -8
  17. package/src/common/component/HotkeyHelpText.scss +34 -34
  18. package/src/common/component/TreeComponentStructure.scss +5 -5
  19. package/src/common/component/editor/CharacteristicGridEditor.scss +66 -66
  20. package/src/common/component/editor/TypedCharacteristicEditor.scss +7 -7
  21. package/src/common/component/formeditor/UiCustomFilterForm.scss +7 -7
  22. package/src/common/component/formeditor/UiCustomFormEditor.scss +42 -42
  23. package/src/common/component/visualeditor/UiCPVisualEditor.scss +108 -108
  24. package/src/common/field/EditorJs.scss +41 -41
  25. package/src/common/field/FieldsHelper.js +0 -0
  26. package/src/common/field/ReportValueField.scss +2 -2
  27. package/src/common/field/combo/CommandComboBox.scss +19 -19
  28. package/src/common/panel/DayPicker.scss +15 -15
  29. package/src/common/panel/MainUploadPanel.scss +13 -13
  30. package/src/common/panel/SelectIconClassPanel.scss +38 -38
  31. package/src/common/panel/SelectIconClassPanelTemplate.scss +14 -14
  32. package/src/common/panel/WindowWrap.js +0 -0
  33. package/src/common/panel/WindowWrap.scss +8 -8
  34. package/src/common/panel/dropzone/UniversalMultiUploadForm.scss +29 -29
  35. package/src/common/panel/dropzone/UploadDropZone.scss +36 -36
  36. package/src/common/panel/widget/WidgetPanel.scss +157 -157
  37. package/src/info.scss +12 -12
  38. package/src/nav/AppNavTab.scss +20 -20
  39. package/src/nav/AppNavigationBar.scss +9 -9
  40. package/src/nav/AppNavigationMenu.scss +60 -60
  41. package/src/nav/AppNavigationToggleButton.scss +6 -6
  42. package/src/nav/editor/menu/NavMenuTreeView.scss +104 -104
  43. package/src/nav/editor/workspace/NavWorkspaceListView.scss +35 -35
  44. package/src/nav/menu/NavMenuPanel.scss +11 -11
  45. package/src/nav/menu/WorkspaceMenuView.scss +218 -218
  46. package/src/nav/windowHolderTab.scss +13 -13
  47. package/src/report/column/MultiFilesColumn.scss +8 -8
  48. package/src/report/component/BoundListPagingToolbar.scss +7 -7
  49. package/src/report/component/ErrorWindow.scss +15 -15
  50. package/src/report/component/ParameterizedReportCombo.scss +85 -85
  51. package/src/report/component/ReportPanel.scss +69 -69
  52. package/src/report/component/SimpleReportTag.scss +22 -22
  53. package/src/report/component/reportpanel/CopyReportPanel.scss +14 -14
  54. package/src/report/component/reportpanel/FilterPanel.scss +16 -16
  55. package/src/report/component/reportpanel/FilterPanelLegend.scss +23 -23
  56. package/src/report/component/reportpanel/NorthPanel.scss +18 -18
  57. package/src/report/component/reportpanel/ReportGrid.scss +37 -37
  58. package/src/report/component/settings/ReportFormEditPanel.scss +87 -87
  59. package/src/report/component/settings/ReportPropertiesGrid.scss +25 -25
  60. package/src/report/component/settings/field/ReportFormFieldsGrid.scss +5 -5
  61. package/src/report/component/settings/property/ReportPropertiesPanel.scss +12 -12
  62. package/src/report/plugin/SettingsManagerPlugin/view/SMPMainView.scss +3 -3
  63. package/src/report/plugin/configPanel/AddFilterConditionPluginConfigPanel.scss +53 -53
  64. package/src/report/plugin/configPanel/ExecuteCommandButtonPluginConfigPanel.scss +5 -5
  65. package/src/report/plugin/configPanel/GroupRowsPluginConfigPanel.scss +3 -3
  66. package/src/report/plugin/configPanel/UiAceEditorField.scss +20 -20
  67. package/src/report/plugin/configPanel/common/pluginDescriptionLabel.scss +8 -8
  68. package/src/report/plugin/grid/CopyRowsFromGrid.js +1 -1
  69. package/src/report/plugin/grid/GridRowStylePlugin.scss +56 -56
  70. package/src/report/plugin/grid/ReportColumnStatePlugin.js +1 -1
  71. package/src/report/plugin/grid/ReportTabContainerPlugin.scss +3 -3
  72. package/src/report/plugin/grid/ToggleColumnsPlugin.scss +7 -7
  73. package/src/report/plugin/grid/ToolbarButtonPlugin.scss +3 -3
  74. package/src/research/ResearchTreeView.scss +19 -19
  75. package/src/ringBuffer.js +36 -0
  76. package/src/security/component/RoleFileUploadForm.scss +4 -4
  77. package/src/security/component/ui/UiCPRestrictionEditor.scss +4 -4
  78. package/src/security/securitySettingComponent/RoleEditPanel.scss +16 -16
  79. package/src/uielement/component/MenuItemList.scss +35 -35
  80. package/src/uielement/component/UiCustomController.js +20 -2
  81. package/src/uielement/component/UiCustomPanel.js +17 -1
  82. package/src/uielement/component/UiCustomPanelTraceWindow.js +161 -0
  83. package/src/uielement/component/formchips/FilterConditionToolbar.scss +74 -74
  84. package/src/uielement/component/settings/UiAceEditor.js +1 -0
  85. package/src/uielement/component/settings/UiCustomPanelEditor.scss +9 -9
  86. package/src/uielement/component/settings/config/UiCPConfigPanelController.scss +24 -24
  87. package/src/uielement/component/settings/plugin/UiCustomPanelPluginGrid.scss +11 -11
  88. package/src/uielement/component/settings/plugin/UiCustomPanelPluginPanel.scss +30 -30
  89. package/src/uielement/component/settings/version/UiCPVersionPanel.scss +15 -15
  90. package/src/uielement/plugin/AddBindingsPlugin.js +4 -1
  91. package/src/uielement/plugin/AddDoInitSupportPlugin.js +4 -1
  92. package/src/uielement/plugin/CustomPanelPlugin.js +44 -3
  93. package/src/uielement/plugin/ExecuteCommandPlugin.js +4 -1
  94. package/src/uielement/plugin/ExecuteFunctionPlugin.js +10 -3
  95. package/src/uielement/plugin/FireEventPlugin.js +4 -1
  96. package/src/uielement/plugin/MethodChainPlugin.js +4 -1
  97. package/src/uielement/plugin/OpenPanelPlugin.js +4 -1
  98. package/src/uielement/plugin/PrintPdfPlugin.js +4 -1
  99. package/src/uielement/plugin/configPanel/AddBindingsPluginConfigPanelFormEditor.scss +29 -29
  100. package/src/uielement/plugin/configPanel/executeCommand/ExecuteCommandPluginConfigPanelFormEditor.scss +22 -22
  101. package/src/util.js +24 -3
  102. package/src/version.js +1 -1
@@ -1,53 +1,53 @@
1
- .AddFilterConditionPluginConfigPanel {
2
- .svg-icon{
3
- height: 24px;
4
- width: 24px;
5
- }
6
- .fa{
7
- height: 24px;
8
- width: 24px;
9
- padding-top: 6px;
10
- color: black;
11
- }
12
-
13
- .x-segmented-button-item{
14
- background-color: transparent;
15
- }
16
- .x-segmented-button-item:hover{
17
- background-color: rgba(61, 103, 128, 0.04);
18
- }
19
- .x-segmented-button-item:active{
20
- background-color: rgba(61, 103, 128, 0.12);
21
- }
22
- .x-btn-pressed .x-btn-icon-el {
23
- color: #ffffff !important;
24
- }
25
- .x-segmented-button .x-segmented-button-item .x-btn-inner{
26
- color: #3D6780;
27
- }
28
- .x-segmented-button .x-segmented-button-item .x-btn-icon-el{
29
- color: #3D6780;
30
- }
31
- .x-btn-icon-el{
32
- color: #3D6780;
33
- }
34
- }
35
-
36
- @include extjs-button-small-ui(
37
- $ui: 'FilterSegmentedButton',
38
- $padding: 8px 12px,
39
- $color: #3D6780,
40
- $icon-size: 16px,
41
-
42
- $background-color-over: rgba(61, 103, 128, 0.04),
43
- $background-color-focus-over: rgba(61, 103, 128, 0.04),
44
-
45
- $background-color-pressed: rgba(61, 103, 128, 0.12),
46
- $background-color-focus-pressed: rgba(61, 103, 128, 0.12),
47
-
48
-
49
- $border-color: 'none',
50
- $background-color: transparent,
51
- $border-color-focus: #3D6780,
52
- $background-color-focus: rgba(61, 103, 128, 0.12)
53
- );
1
+ .AddFilterConditionPluginConfigPanel {
2
+ .svg-icon{
3
+ height: 24px;
4
+ width: 24px;
5
+ }
6
+ .fa{
7
+ height: 24px;
8
+ width: 24px;
9
+ padding-top: 6px;
10
+ color: black;
11
+ }
12
+
13
+ .x-segmented-button-item{
14
+ background-color: transparent;
15
+ }
16
+ .x-segmented-button-item:hover{
17
+ background-color: rgba(61, 103, 128, 0.04);
18
+ }
19
+ .x-segmented-button-item:active{
20
+ background-color: rgba(61, 103, 128, 0.12);
21
+ }
22
+ .x-btn-pressed .x-btn-icon-el {
23
+ color: #ffffff !important;
24
+ }
25
+ .x-segmented-button .x-segmented-button-item .x-btn-inner{
26
+ color: #3D6780;
27
+ }
28
+ .x-segmented-button .x-segmented-button-item .x-btn-icon-el{
29
+ color: #3D6780;
30
+ }
31
+ .x-btn-icon-el{
32
+ color: #3D6780;
33
+ }
34
+ }
35
+
36
+ @include extjs-button-small-ui(
37
+ $ui: 'FilterSegmentedButton',
38
+ $padding: 8px 12px,
39
+ $color: #3D6780,
40
+ $icon-size: 16px,
41
+
42
+ $background-color-over: rgba(61, 103, 128, 0.04),
43
+ $background-color-focus-over: rgba(61, 103, 128, 0.04),
44
+
45
+ $background-color-pressed: rgba(61, 103, 128, 0.12),
46
+ $background-color-focus-pressed: rgba(61, 103, 128, 0.12),
47
+
48
+
49
+ $border-color: 'none',
50
+ $background-color: transparent,
51
+ $border-color-focus: #3D6780,
52
+ $background-color-focus: rgba(61, 103, 128, 0.12)
53
+ );
@@ -1,5 +1,5 @@
1
- .addActionColumnMsg {
2
- font-size: 15px;
3
- margin: 0 0 0 12px;
4
- color: red;
5
- }
1
+ .addActionColumnMsg {
2
+ font-size: 15px;
3
+ margin: 0 0 0 12px;
4
+ color: red;
5
+ }
@@ -1,3 +1,3 @@
1
- .tpl-key {
2
- font-weight: bold;
3
- }
1
+ .tpl-key {
2
+ font-weight: bold;
3
+ }
@@ -1,20 +1,20 @@
1
- .UiAceEditorField {
2
- .ace-editor-editor{
3
- width: 100%;
4
- height: 100px;
5
- display: block;
6
- background-color: red !important;
7
- min-height: 30px !important;
8
- }
9
- .ace-editor-content .x-grid-cell-editor{
10
- width: 100%;
11
- height: 100%;
12
- display: block;
13
- position: relative !important;
14
- min-height: 100px;
15
- }
16
- .ace-editor-content .ace_editor{
17
- height: 100%;
18
- min-height: 100px;
19
- }
20
- }
1
+ .UiAceEditorField {
2
+ .ace-editor-editor{
3
+ width: 100%;
4
+ height: 100px;
5
+ display: block;
6
+ background-color: red !important;
7
+ min-height: 30px !important;
8
+ }
9
+ .ace-editor-content .x-grid-cell-editor{
10
+ width: 100%;
11
+ height: 100%;
12
+ display: block;
13
+ position: relative !important;
14
+ min-height: 100px;
15
+ }
16
+ .ace-editor-content .ace_editor{
17
+ height: 100%;
18
+ min-height: 100px;
19
+ }
20
+ }
@@ -1,9 +1,9 @@
1
- .pluginDescriptionLabel {
2
- height: 2.5em;
3
- margin: 5px 10px;
4
- text-overflow: clip;
5
- overflow: hidden;
6
- .x-form-display-field {
7
- color: #555!important;
8
- }
1
+ .pluginDescriptionLabel {
2
+ height: 2.5em;
3
+ margin: 5px 10px;
4
+ text-overflow: clip;
5
+ overflow: hidden;
6
+ .x-form-display-field {
7
+ color: #555!important;
8
+ }
9
9
  }
@@ -434,7 +434,7 @@ Ext.define('Coon.report.plugin.grid.CopyRowsFromGrid', {
434
434
  }
435
435
  try {
436
436
  fileName = new Ext.XTemplate(fileName, {strict: true}).apply({
437
- parameters: this.component.up('ReportPanel').currentParamList,
437
+ parameters: this.component.up('ReportPanel').currentParamList || {},
438
438
  });
439
439
  } catch (err) {
440
440
  Coon.log.warn(err);
@@ -1,56 +1,56 @@
1
-
2
- .boldOnRow.x-grid-row {
3
- font-weight: bold;
4
- }
5
-
6
- .italicOnRow.x-grid-row {
7
- font-style: italic;
8
- }
9
-
10
- .underlineOnRow.x-grid-row {
11
- text-decoration: underline;
12
- }
13
-
14
- .linkColor.x-grid-row {
15
- a {
16
- color: inherit;
17
- }
18
- }
19
-
20
- .boldOnRow .x-grid-row {
21
- font-weight: bold;
22
- }
23
-
24
- .italicOnRow .x-grid-row {
25
- font-style: italic;
26
- }
27
-
28
- .underlineOnRow .x-grid-row {
29
- text-decoration: underline;
30
- }
31
-
32
- .linkColor .x-grid-row {
33
- a {
34
- color: inherit;
35
- }
36
- }
37
-
38
- .x-grid-checkcolumn::after {
39
- color: inherit !important;
40
- font-weight: inherit;
41
- font-style: inherit;
42
- }
43
-
44
- .x-grid-cell-inner .link-button {
45
- color: inherit !important;
46
- font-weight: inherit;
47
- font-style: inherit;
48
- }
49
-
50
- .x-grid-cell-inner {
51
- a {
52
- font-weight: inherit;
53
- font-style: inherit;
54
- color: inherit;
55
- }
56
- }
1
+
2
+ .boldOnRow.x-grid-row {
3
+ font-weight: bold;
4
+ }
5
+
6
+ .italicOnRow.x-grid-row {
7
+ font-style: italic;
8
+ }
9
+
10
+ .underlineOnRow.x-grid-row {
11
+ text-decoration: underline;
12
+ }
13
+
14
+ .linkColor.x-grid-row {
15
+ a {
16
+ color: inherit;
17
+ }
18
+ }
19
+
20
+ .boldOnRow .x-grid-row {
21
+ font-weight: bold;
22
+ }
23
+
24
+ .italicOnRow .x-grid-row {
25
+ font-style: italic;
26
+ }
27
+
28
+ .underlineOnRow .x-grid-row {
29
+ text-decoration: underline;
30
+ }
31
+
32
+ .linkColor .x-grid-row {
33
+ a {
34
+ color: inherit;
35
+ }
36
+ }
37
+
38
+ .x-grid-checkcolumn::after {
39
+ color: inherit !important;
40
+ font-weight: inherit;
41
+ font-style: inherit;
42
+ }
43
+
44
+ .x-grid-cell-inner .link-button {
45
+ color: inherit !important;
46
+ font-weight: inherit;
47
+ font-style: inherit;
48
+ }
49
+
50
+ .x-grid-cell-inner {
51
+ a {
52
+ font-weight: inherit;
53
+ font-style: inherit;
54
+ color: inherit;
55
+ }
56
+ }
@@ -51,7 +51,7 @@ Ext.define('Coon.report.plugin.grid.ReportColumnStatePlugin', {
51
51
  const currentColumnState = {
52
52
  columnId: e.dataIndex,
53
53
  position: e.fullColumnIndex,
54
- width: e.getWidth(),
54
+ width: e.width,
55
55
  hidden: e.getHidden(),
56
56
  };
57
57
  currentState.push(currentColumnState);
@@ -1,3 +1,3 @@
1
- .x-tab-bar-default-top .x-tab-bar-body-default {
2
- padding-top: 0;
3
- }
1
+ .x-tab-bar-default-top .x-tab-bar-body-default {
2
+ padding-top: 0;
3
+ }
@@ -1,7 +1,7 @@
1
- .ToggleColumnsPlugin {
2
- .toggle-pressed {
3
- .x-btn-icon-el-blue-text-button-small.svg-icon {
4
- background-color: #1E3B4B;
5
- }
6
- }
7
- }
1
+ .ToggleColumnsPlugin {
2
+ .toggle-pressed {
3
+ .x-btn-icon-el-blue-text-button-small.svg-icon {
4
+ background-color: #1E3B4B;
5
+ }
6
+ }
7
+ }
@@ -1,3 +1,3 @@
1
- .x-grid-cell-inner-action-col {
2
- text-align: center !important;
3
- }
1
+ .x-grid-cell-inner-action-col {
2
+ text-align: center !important;
3
+ }
@@ -1,19 +1,19 @@
1
- .ResearchTreeView {
2
- span.field-rep-name {
3
- font-weight: bold;
4
- }
5
-
6
- span.field-ui-name {
7
- font-weight: bold;
8
- }
9
-
10
- span.component-type-name {
11
- font-weight: bold;
12
- }
13
-
14
- .x-tab-default .x-tab-close-btn:before {
15
- content: '\f00d';
16
- color: gray;
17
- }
18
-
19
- }
1
+ .ResearchTreeView {
2
+ span.field-rep-name {
3
+ font-weight: bold;
4
+ }
5
+
6
+ span.field-ui-name {
7
+ font-weight: bold;
8
+ }
9
+
10
+ span.component-type-name {
11
+ font-weight: bold;
12
+ }
13
+
14
+ .x-tab-default .x-tab-close-btn:before {
15
+ content: '\f00d';
16
+ color: gray;
17
+ }
18
+
19
+ }
@@ -0,0 +1,36 @@
1
+ Ext.define('Coon.ringBuffer', {
2
+ statics: {
3
+ maxLength: 2000,
4
+ },
5
+
6
+ constructor(cfg) {
7
+ const buffer = [];
8
+ let cursor = 0;
9
+ this.getLength = () => (cfg.length || this.self.maxLength) - 1;
10
+ this.getBuffer = () => buffer;
11
+ this.getCursor = () => cursor;
12
+ this.advanceCursor = () => {
13
+ if (cursor < this.getLength()) {
14
+ cursor += 1;
15
+ } else {
16
+ cursor = 0;
17
+ }
18
+ return cursor;
19
+ };
20
+ Ext.apply(this, cfg);
21
+ },
22
+
23
+ push(el) {
24
+ this.getBuffer()[this.getCursor()] = {el, idx: Date.now()};
25
+ this.advanceCursor();
26
+ return this;
27
+ },
28
+
29
+ get() {
30
+ return this.getBuffer().sort((a, b) => a.idx - b.idx);
31
+ },
32
+
33
+ getElements() {
34
+ return this.get().map(({el, idx}) => Object.assign(el, {time: new Date(idx)}));
35
+ },
36
+ });
@@ -1,5 +1,5 @@
1
- .RoleFileUploadForm {
2
- .x-btn-inner {
3
- color: black!important;
4
- }
1
+ .RoleFileUploadForm {
2
+ .x-btn-inner {
3
+ color: black!important;
4
+ }
5
5
  }
@@ -1,5 +1,5 @@
1
- .UiCPRestrictionEditor {
2
- .saveBtn:not(.x-item-disabled) .x-btn-inner{
3
- color: red;
4
- }
1
+ .UiCPRestrictionEditor {
2
+ .saveBtn:not(.x-item-disabled) .x-btn-inner{
3
+ color: red;
4
+ }
5
5
  }
@@ -1,17 +1,17 @@
1
- .RoleEditPanel {
2
- .x-grid-item {
3
- .checked-row {
4
- background-color: #f7f7f8;
5
- }
6
- }
7
- .x-grid-item {
8
- .unchecked-row {
9
- background-color: white;
10
- }
11
- }
12
- .x-grid-row {
13
- &:hover {
14
- background-color: #ebecee;
15
- }
16
- }
1
+ .RoleEditPanel {
2
+ .x-grid-item {
3
+ .checked-row {
4
+ background-color: #f7f7f8;
5
+ }
6
+ }
7
+ .x-grid-item {
8
+ .unchecked-row {
9
+ background-color: white;
10
+ }
11
+ }
12
+ .x-grid-row {
13
+ &:hover {
14
+ background-color: #ebecee;
15
+ }
16
+ }
17
17
  }
@@ -1,35 +1,35 @@
1
- .MenuItemList {
2
- .list-box {
3
- border: 1px solid #e0e0e0;
4
- margin: 3px;
5
- //padding: 7px;
6
- border-radius: 10px;
7
- }
8
-
9
- .parent-menu-item .x-treelist-item-text {
10
- font-size: 16px;
11
- color: #111;
12
- font-weight: 600;
13
- }
14
-
15
- .x-treelist-item-text {
16
- color: #1f5a8a;
17
- }
18
-
19
- .empty-bg {
20
- background-color: #eeeeee !important;
21
- }
22
-
23
- .icon-orange {
24
- background-color: #ff9800;
25
- margin-top: 5px;
26
- }
27
-
28
- .x-treelist-row-over, .x-treelist-item-selected .x-treelist-row {
29
- background-color: #FFFFFFFF;
30
- }
31
-
32
- .x-treelist-row-over .x-treelist-item-text, .x-treelist-item-selected .x-treelist-item-text {
33
- color: #112b39;
34
- }
35
- }
1
+ .MenuItemList {
2
+ .list-box {
3
+ border: 1px solid #e0e0e0;
4
+ margin: 3px;
5
+ //padding: 7px;
6
+ border-radius: 10px;
7
+ }
8
+
9
+ .parent-menu-item .x-treelist-item-text {
10
+ font-size: 16px;
11
+ color: #111;
12
+ font-weight: 600;
13
+ }
14
+
15
+ .x-treelist-item-text {
16
+ color: #1f5a8a;
17
+ }
18
+
19
+ .empty-bg {
20
+ background-color: #eeeeee !important;
21
+ }
22
+
23
+ .icon-orange {
24
+ background-color: #ff9800;
25
+ margin-top: 5px;
26
+ }
27
+
28
+ .x-treelist-row-over, .x-treelist-item-selected .x-treelist-row {
29
+ background-color: #FFFFFFFF;
30
+ }
31
+
32
+ .x-treelist-row-over .x-treelist-item-text, .x-treelist-item-selected .x-treelist-item-text {
33
+ color: #112b39;
34
+ }
35
+ }
@@ -3,7 +3,12 @@ Ext.define('Coon.uielement.component.UiCustomController', {
3
3
  alias: 'controller.UiCustomController',
4
4
  requires: ['Coon.security.Manager'],
5
5
 
6
+ locals: {},
7
+
6
8
  init: function(view) {
9
+ if (this.isTracePluginsEnabled()) {
10
+ this.getTraceBuffer();
11
+ }
7
12
  const config = view.propertyData || view.initialConfig;
8
13
  if (!view || typeof view.on !== 'function') {
9
14
  Coon.log.debug(` [Error]UiCustomController.init - view not found or view.on is not a function`);
@@ -16,7 +21,6 @@ Ext.define('Coon.uielement.component.UiCustomController', {
16
21
  return;
17
22
  }
18
23
  const viewButtons = view.query('button');
19
- // console.time('UiCustomController.buttons');
20
24
  const allowedMap = new Set(accessDecision.allowedItems);
21
25
  if (Ext.isObject(securePoints.buttons) && Object.keys(securePoints.buttons).length) {
22
26
  Coon.log.debug(`used securePoints, allowed: ${accessDecision.allowedItems}, secureButtons: ${Object.keys(securePoints.buttons)}`);
@@ -45,7 +49,6 @@ Ext.define('Coon.uielement.component.UiCustomController', {
45
49
  }
46
50
  });
47
51
  }
48
- // console.timeEnd('UiCustomController.buttons');
49
52
  }, this);
50
53
  },
51
54
 
@@ -94,6 +97,7 @@ Ext.define('Coon.uielement.component.UiCustomController', {
94
97
  Coon.util.copyToClipboard(url);
95
98
  Ext.toast('Ссылка скопирована в буфер обмена!');
96
99
  },
100
+
97
101
  applyRestrictions(map) {
98
102
  Coon.security.Manager.sync({map, component: this.getView()});
99
103
  },
@@ -107,4 +111,18 @@ Ext.define('Coon.uielement.component.UiCustomController', {
107
111
  const map = ctx.toJSON().map;
108
112
  return {buttons: map && map.buttons};
109
113
  },
114
+
115
+ getTraceBuffer() {
116
+ if (!this.locals.traceBuffer) {
117
+ this.locals.traceBuffer = Ext.create('Coon.ringBuffer', {length: 1000});
118
+ }
119
+ return this.locals.traceBuffer;
120
+ },
121
+
122
+ isTracePluginsEnabled() {
123
+ return Boolean(
124
+ Coon.setup.get('trace.cpPlugins')
125
+ );
126
+ },
127
+
110
128
  });
@@ -4,12 +4,28 @@ Ext.define('Coon.uielement.component.UiCustomPanel', {
4
4
  xtype: 'UiCustomPanel',
5
5
  uses: [],
6
6
  requires: [
7
- 'Coon.uielement.component.UiCustomController'
7
+ 'Coon.uielement.component.UiCustomController',
8
+ 'Coon.uielement.plugin.CustomPanelPlugin',
9
+ 'Coon.uielement.component.UiCustomPanelTraceWindow'
8
10
  ],
9
11
  controller: {type: 'UiCustomController'},
10
12
  viewModel: {type: 'UiCustomPanelViewModel'},
11
13
 
12
14
  keyMap: {
15
+ 'Ctrl+Shift+Alt+F8': {
16
+ handler(_, view) {
17
+ const scope = view.getController();
18
+ if (!scope) {
19
+ return;
20
+ }
21
+ const win = Ext.create({xtype: 'UiCustomPanelTraceWindow'});
22
+ if (win.isTraceEnabled(scope)) {
23
+ const traceBuffer = scope.getTraceBuffer();
24
+ win.loadLogs(traceBuffer.getElements());
25
+ win.show();
26
+ }
27
+ },
28
+ },
13
29
  'Ctrl+Alt+U': {
14
30
  handler: function(_, scope) {
15
31
  const inputParameters = scope.getController().inputParameters().map((el) => el.name);