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