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