]> git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/node/APT.js
2e5a77618c7a1efebd70d8b4c693b86a1c4ad02c
[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 'background-color': 'white',
120 'white-space': 'pre',
121 'font-family': 'monospace',
122 padding: '5px',
123 },
124 });
125
126 let win = Ext.create('Ext.window.Window', {
127 title: gettext('Changelog') + ": " + rec.data.Package,
128 width: 800,
129 height: 600,
130 layout: 'fit',
131 modal: true,
132 items: [view],
133 });
134
135 Proxmox.Utils.API2Request({
136 waitMsgTarget: me,
137 url: "/nodes/" + me.nodename + "/apt/changelog",
138 params: {
139 name: rec.data.Package,
140 version: rec.data.Version,
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));
150 },
151 });
152 };
153
154 let changelog_btn = new Proxmox.button.Button({
155 text: gettext('Changelog'),
156 selModel: sm,
157 disabled: true,
158 enableFn: rec => !!rec?.data?.ChangeLogUrl && !!rec?.data?.Package,
159 handler: (b, e, rec) => show_changelog(rec),
160 });
161
162 let verbose_desc_checkbox = new Ext.form.field.Checkbox({
163 boxLabel: gettext('Show details'),
164 value: false,
165 listeners: {
166 change: (f, val) => {
167 me.full_description = val;
168 me.getView().refresh();
169 },
170 },
171 });
172
173 if (me.upgradeBtn) {
174 me.tbar = [update_btn, me.upgradeBtn, changelog_btn, '->', verbose_desc_checkbox];
175 } else {
176 me.tbar = [update_btn, changelog_btn, '->', verbose_desc_checkbox];
177 }
178
179 Ext.apply(me, {
180 store: store,
181 stateful: true,
182 stateId: 'grid-update',
183 selModel: sm,
184 viewConfig: {
185 stripeRows: false,
186 emptyText: `<div style="display:flex;justify-content:center;"><p>${gettext('No updates available.')}</p></div>`,
187 },
188 features: [groupingFeature, rowBodyFeature],
189 listeners: {
190 activate: () => store.load(),
191 itemdblclick: (v, rec) => show_changelog(rec),
192 },
193 });
194
195 me.callParent();
196 },
197 });