]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/panel/NotesView.js
ui: notes view: render node and guest notes as Markdown
[pve-manager.git] / www / manager6 / panel / NotesView.js
CommitLineData
b49fb084
DM
1Ext.define('PVE.panel.NotesView', {
2 extend: 'Ext.panel.Panel',
ade55c15 3 xtype: 'pveNotesView',
b49fb084 4
6f68dcbe 5 title: gettext("Notes"),
6f68dcbe
EK
6 bodyPadding: 10,
7 scrollable: true,
300c0f73 8 animCollapse: false,
6f68dcbe 9
9db54b1f
DC
10 tbar: {
11 itemId: 'tbar',
12 hidden: true,
13 items: [
14 {
15 text: gettext('Edit'),
16 handler: function() {
193df2f3
DJ
17 let view = this.up('panel');
18 view.run_editor();
f6710aac
TL
19 },
20 },
21 ],
9db54b1f
DC
22 },
23
24 run_editor: function() {
dbf3563f
TL
25 let me = this;
26 Ext.create('PVE.window.NotesEdit', {
9db54b1f 27 pveSelNode: me.pveSelNode,
f6710aac 28 url: me.url,
dbf3563f
TL
29 listeners: {
30 destroy: () => me.load(),
31 },
32 autoShow: true,
a78362cf 33 }).setMaxLength(me.maxLength);
9db54b1f
DC
34 },
35
b49fb084
DM
36 load: function() {
37 var me = this;
9db54b1f 38
e7ade592 39 Proxmox.Utils.API2Request({
b49fb084
DM
40 url: me.url,
41 waitMsgTarget: me,
42 failure: function(response, opts) {
43 me.update(gettext('Error') + " " + response.htmlStatus);
300c0f73 44 me.setCollapsed(false);
b49fb084
DM
45 },
46 success: function(response, opts) {
47 var data = response.result.data.description || '';
236b33e2
TL
48
49 let mdHTML = Proxmox.Markdown.parse(data);
50 me.update(mdHTML);
300c0f73
TL
51
52 if (me.collapsible && me.collapseMode === 'auto') {
53 me.setCollapsed(data === '');
54 }
f6710aac 55 },
b49fb084
DM
56 });
57 },
58
9db54b1f
DC
59 listeners: {
60 render: function(c) {
61 var me = this;
62 me.getEl().on('dblclick', me.run_editor, me);
300c0f73
TL
63 },
64 afterlayout: function() {
65 let me = this;
66 if (me.collapsible && !me.getCollapsed() && me.collapseMode === 'always') {
67 me.setCollapsed(true);
68 me.collapseMode = ''; // only once, on initial load!
69 }
70 },
9db54b1f
DC
71 },
72
73 tools: [{
74 type: 'gear',
75 handler: function() {
193df2f3
DJ
76 let view = this.up('panel');
77 view.run_editor();
f6710aac 78 },
9db54b1f
DC
79 }],
80
8058410f 81 initComponent: function() {
b49fb084
DM
82 var me = this;
83
84 var nodename = me.pveSelNode.data.node;
85 if (!nodename) {
86 throw "no node name specified";
87 }
88
dbf3563f 89 let type = me.pveSelNode.data.type;
9db54b1f
DC
90 if (!Ext.Array.contains(['node', 'qemu', 'lxc'], type)) {
91 throw 'invalid type specified';
92 }
93
b49fb084 94 var vmid = me.pveSelNode.data.vmid;
9db54b1f 95 if (!vmid && type !== 'node') {
b49fb084
DM
96 throw "no VM ID specified";
97 }
98
dbf3563f 99 me.url = `/api2/extjs/nodes/${nodename}/`;
b49fb084 100
dbf3563f 101 // add the type specific path if qemu/lxc and set the backend's maxLen
9db54b1f 102 if (type === 'qemu' || type === 'lxc') {
dbf3563f 103 me.url += `${type}/${vmid}/`;
a78362cf
TL
104 me.maxLength = 8 * 1024;
105 } else {
106 me.maxLength = 64 * 1024;
b49fb084
DM
107 }
108
9db54b1f 109 me.url += 'config';
b49fb084
DM
110
111 me.callParent();
9db54b1f
DC
112 if (type === 'node') {
113 me.down('#tbar').setVisible(true);
6751013a 114 } else if (me.pveSelNode.data.template !== 1) {
300c0f73
TL
115 me.setCollapsible(true);
116 me.collapseDirection = 'right';
117
118 let sp = Ext.state.Manager.getProvider();
119 me.collapseMode = sp.get('guest-notes-collapse', 'never');
120
121 if (me.collapseMode === 'auto') {
122 me.setCollapsed(true);
123 }
9db54b1f 124 }
abbf0eb7 125 me.load();
f6710aac 126 },
b49fb084 127});