]> git.proxmox.com Git - proxmox-widget-toolkit.git/blame - src/node/APT.js
node apt: cleanup and modernize code
[proxmox-widget-toolkit.git] / src / node / APT.js
CommitLineData
5f93e010
DM
1Ext.define('apt-pkglist', {
2 extend: 'Ext.data.Model',
261f5581
TL
3 fields: [
4 'Package', 'Title', 'Description', 'Section', 'Arch', 'Priority', 'Version', 'OldVersion',
5 'ChangeLogUrl', 'Origin',
6 ],
01031528 7 idProperty: 'Package',
5f93e010
DM
8});
9
10Ext.define('Proxmox.node.APT', {
11 extend: 'Ext.grid.GridPanel',
12
13 xtype: 'proxmoxNodeAPT',
14
15 upgradeBtn: undefined,
16
17 columns: [
18 {
19 header: gettext('Package'),
20 width: 200,
21 sortable: true,
01031528 22 dataIndex: 'Package',
5f93e010
DM
23 },
24 {
25 text: gettext('Version'),
26 columns: [
27 {
28 header: gettext('current'),
29 width: 100,
30 sortable: false,
01031528 31 dataIndex: 'OldVersion',
5f93e010
DM
32 },
33 {
34 header: gettext('new'),
35 width: 100,
36 sortable: false,
01031528
TL
37 dataIndex: 'Version',
38 },
39 ],
5f93e010
DM
40 },
41 {
42 header: gettext('Description'),
43 sortable: false,
44 dataIndex: 'Title',
01031528
TL
45 flex: 1,
46 },
5f93e010
DM
47 ],
48
01031528 49 initComponent: function() {
05a977a2 50 let me = this;
5f93e010
DM
51
52 if (!me.nodename) {
53 throw "no node name specified";
54 }
55
05a977a2 56 let store = Ext.create('Ext.data.Store', {
5f93e010
DM
57 model: 'apt-pkglist',
58 groupField: 'Origin',
59 proxy: {
f12e1aba 60 type: 'proxmox',
261f5581 61 url: `/api2/json/nodes/${me.nodename}/apt/update`,
5f93e010
DM
62 },
63 sorters: [
64 {
01031528
TL
65 property: 'Package',
66 direction: 'ASC',
67 },
68 ],
5f93e010 69 });
261f5581 70 Proxmox.Utils.monStoreErrors(me, store, true);
5f93e010 71
05a977a2 72 let groupingFeature = Ext.create('Ext.grid.feature.Grouping', {
5f93e010 73 groupHeaderTpl: '{[ "Origin: " + values.name ]} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})',
01031528 74 enableGroupingMenu: false,
5f93e010
DM
75 });
76
05a977a2 77 let rowBodyFeature = Ext.create('Ext.grid.feature.RowBody', {
01031528 78 getAdditionalData: function(data, rowIndex, record, orig) {
05a977a2
TL
79 let headerCt = this.view.headerCt;
80 let colspan = headerCt.getColumnCount();
f12e1aba 81 return {
261f5581 82 rowBody: `<div style="padding: 1em">${Ext.htmlEncode(data.Description)}</div>`,
6895e13f 83 rowBodyCls: me.full_description ? '' : Ext.baseCSSPrefix + 'grid-row-body-hidden',
01031528 84 rowBodyColspan: colspan,
f12e1aba 85 };
01031528 86 },
5f93e010
DM
87 });
88
05a977a2 89 let apt_command = function(cmd) {
5f93e010 90 Proxmox.Utils.API2Request({
261f5581 91 url: `/nodes/${me.nodename}/apt/${cmd}`,
5f93e010 92 method: 'POST',
261f5581
TL
93 success: ({ result }) => Ext.create('Proxmox.window.TaskViewer', {
94 autoShow: true,
95 upid: result.data,
96 listeners: {
97 close: () => store.load(),
98 },
99 }),
5f93e010
DM
100 });
101 };
102
05a977a2 103 let sm = Ext.create('Ext.selection.RowModel', {});
5f93e010 104
05a977a2 105 let update_btn = new Ext.Button({
5f93e010 106 text: gettext('Refresh'),
261f5581 107 handler: () => Proxmox.Utils.checked_command(function() { apt_command('update'); }),
5f93e010
DM
108 });
109
05a977a2 110 let show_changelog = function(rec) {
261f5581
TL
111 if (!rec?.data?.ChangeLogUrl || !rec?.data?.Package) {
112 console.debug('cannot show changelog, missing Package and/or ChangeLogUrl', rec);
5f93e010
DM
113 return;
114 }
115
05a977a2 116 let view = Ext.createWidget('component', {
5f93e010
DM
117 autoScroll: true,
118 style: {
119 'background-color': 'white',
120 'white-space': 'pre',
121 'font-family': 'monospace',
01031528
TL
122 padding: '5px',
123 },
5f93e010
DM
124 });
125
05a977a2 126 let win = Ext.create('Ext.window.Window', {
5f93e010
DM
127 title: gettext('Changelog') + ": " + rec.data.Package,
128 width: 800,
129 height: 400,
130 layout: 'fit',
131 modal: true,
01031528 132 items: [view],
5f93e010
DM
133 });
134
135 Proxmox.Utils.API2Request({
136 waitMsgTarget: me,
137 url: "/nodes/" + me.nodename + "/apt/changelog",
138 params: {
139 name: rec.data.Package,
01031528 140 version: rec.data.Version,
5f93e010
DM
141 },
142 method: 'GET',
143 failure: function(response, opts) {
144 win.close();
145 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
146 },
147 success: function(response, opts) {
148 win.show();
149 view.update(Ext.htmlEncode(response.result.data));
01031528 150 },
5f93e010 151 });
5f93e010
DM
152 };
153
05a977a2 154 let changelog_btn = new Proxmox.button.Button({
5f93e010
DM
155 text: gettext('Changelog'),
156 selModel: sm,
157 disabled: true,
261f5581
TL
158 enableFn: rec => !!rec?.data?.ChangeLogUrl && !!rec?.data?.Package,
159 handler: (b, e, rec) => show_changelog(rec),
5f93e010
DM
160 });
161
05a977a2 162 let verbose_desc_checkbox = new Ext.form.field.Checkbox({
6895e13f
TL
163 boxLabel: gettext('Show details'),
164 value: false,
165 listeners: {
166 change: (f, val) => {
167 me.full_description = val;
168 me.getView().refresh();
01031528
TL
169 },
170 },
6895e13f
TL
171 });
172
5f93e010 173 if (me.upgradeBtn) {
01031528 174 me.tbar = [update_btn, me.upgradeBtn, changelog_btn, '->', verbose_desc_checkbox];
5f93e010 175 } else {
01031528 176 me.tbar = [update_btn, changelog_btn, '->', verbose_desc_checkbox];
5f93e010
DM
177 }
178
179 Ext.apply(me, {
180 store: store,
181 stateful: true,
182 stateId: 'grid-update',
183 selModel: sm,
184 viewConfig: {
185 stripeRows: false,
01031528 186 emptyText: '<div style="display:table; width:100%; height:100%;"><div style="display:table-cell; vertical-align: middle; text-align:center;"><b>' + gettext('No updates available.') + '</div></div>',
5f93e010 187 },
01031528 188 features: [groupingFeature, rowBodyFeature],
5f93e010 189 listeners: {
261f5581
TL
190 activate: () => store.load(),
191 itemdblclick: (v, rec) => show_changelog(rec),
01031528 192 },
5f93e010
DM
193 });
194
195 me.callParent();
01031528 196 },
5f93e010 197});