]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - src/panel/NotesView.js
Buttons: add AltText
[proxmox-widget-toolkit.git] / src / panel / NotesView.js
CommitLineData
e9144532
SS
1Ext.define('Proxmox.panel.NotesView', {
2 extend: 'Ext.panel.Panel',
3 xtype: 'pmxNotesView',
11d4f4de 4 mixins: ['Proxmox.Mixin.CBind'],
e9144532
SS
5
6 title: gettext("Notes"),
7 bodyPadding: 10,
8 scrollable: true,
9 animCollapse: false,
10 maxLength: 64 * 1024,
11d4f4de
SS
11 enableTBar: false,
12 onlineHelp: 'markdown_basics',
e9144532
SS
13
14 tbar: {
15 itemId: 'tbar',
16 hidden: true,
17 items: [
18 {
19 text: gettext('Edit'),
20 handler: function() {
21 let view = this.up('panel');
22 view.run_editor();
23 },
24 },
25 ],
26 },
27
11d4f4de
SS
28 cbindData: function(initalConfig) {
29 let me = this;
30 let type = '';
31
32 if (me.node) {
33 me.url = `/api2/extjs/nodes/${me.node}/config`;
34 } else if (me.pveSelNode?.data?.id === 'root') {
35 me.url = '/api2/extjs/cluster/options';
36 type = me.pveSelNode?.data?.type;
37 } else {
38 const nodename = me.pveSelNode?.data?.node;
39 type = me.pveSelNode?.data?.type;
40
41 if (!nodename) {
42 throw "no node name specified";
43 }
44
45 if (!Ext.Array.contains(['node', 'qemu', 'lxc'], type)) {
46 throw 'invalid type specified';
47 }
48
49 const vmid = me.pveSelNode?.data?.vmid;
50
51 if (!vmid && type !== 'node') {
52 throw "no VM ID specified";
53 }
54
55 me.url = `/api2/extjs/nodes/${nodename}/`;
56
57 // add the type specific path if qemu/lxc and set the backend's maxLen
58 if (type === 'qemu' || type === 'lxc') {
59 me.url += `${type}/${vmid}/`;
60 me.maxLength = 8 * 1024;
61 }
62
63 me.url += 'config';
64 }
65
66 me.pveType = type;
67
68 me.load();
69 return {};
70 },
71
e9144532
SS
72 run_editor: function() {
73 let me = this;
74 Ext.create('Proxmox.window.NotesEdit', {
e9144532 75 url: me.url,
11d4f4de 76 onlineHelp: me.onlineHelp,
e9144532
SS
77 listeners: {
78 destroy: () => me.load(),
79 },
80 autoShow: true,
81 }).setMaxLength(me.maxLength);
82 },
83
11d4f4de
SS
84 setNotes: function(value = '') {
85 let me = this;
86
87 let mdHtml = Proxmox.Markdown.parse(value);
88 me.update(mdHtml);
89
90 if (me.collapsible && me.collapseMode === 'auto') {
91 me.setCollapsed(!value);
92 }
93 },
94
e9144532 95 load: function() {
11d4f4de 96 let me = this;
e9144532
SS
97
98 Proxmox.Utils.API2Request({
99 url: me.url,
100 waitMsgTarget: me,
11d4f4de 101 failure: (response, opts) => {
e9144532
SS
102 me.update(gettext('Error') + " " + response.htmlStatus);
103 me.setCollapsed(false);
104 },
11d4f4de 105 success: ({ result }) => me.setNotes(result.data.description),
e9144532
SS
106 });
107 },
108
109 listeners: {
110 render: function(c) {
11d4f4de 111 let me = this;
e9144532
SS
112 me.getEl().on('dblclick', me.run_editor, me);
113 },
114 afterlayout: function() {
115 let me = this;
116 if (me.collapsible && !me.getCollapsed() && me.collapseMode === 'always') {
117 me.setCollapsed(true);
118 me.collapseMode = ''; // only once, on initial load!
119 }
120 },
121 },
122
11d4f4de
SS
123 tools: [
124 {
125 type: 'gear',
126 handler: function() {
127 let view = this.up('panel');
128 view.run_editor();
129 },
e9144532 130 },
11d4f4de 131 ],
e9144532
SS
132
133 initComponent: function() {
11d4f4de 134 let me = this;
e9144532 135 me.callParent();
11d4f4de
SS
136
137 // '' is for datacenter
138 if (me.enableTBar === true || me.pveType === 'node' || me.pveType === '') {
e9144532 139 me.down('#tbar').setVisible(true);
11d4f4de 140 } else if (me.pveSelNode?.data?.template !== 1) {
e9144532
SS
141 me.setCollapsible(true);
142 me.collapseDirection = 'right';
143
144 let sp = Ext.state.Manager.getProvider();
145 me.collapseMode = sp.get('guest-notes-collapse', 'never');
146
147 if (me.collapseMode === 'auto') {
148 me.setCollapsed(true);
149 }
150 }
e9144532
SS
151 },
152});