]> git.proxmox.com Git - proxmox-backup.git/blob - www/form/PermissionPathSelector.js
docs: add note for not using remote storages
[proxmox-backup.git] / www / form / PermissionPathSelector.js
1 Ext.define('PBS.data.PermissionPathsStore', {
2 extend: 'Ext.data.Store',
3 alias: 'store.pbsPermissionPaths',
4 fields: ['value'],
5 autoLoad: false,
6 data: [
7 { 'value': '/' },
8 { 'value': '/access' },
9 { 'value': '/access/acl' },
10 { 'value': '/access/users' },
11 { 'value': '/access/domains' },
12 { 'value': '/access/openid' },
13 { 'value': '/datastore' },
14 { 'value': '/remote' },
15 { 'value': '/system' },
16 { 'value': '/system/certificates' },
17 { 'value': '/system/disks' },
18 { 'value': '/system/log' },
19 { 'value': '/system/network' },
20 { 'value': '/system/network/dns' },
21 { 'value': '/system/network/interfaces' },
22 { 'value': '/system/notifications' },
23 { 'value': '/system/services' },
24 { 'value': '/system/status' },
25 { 'value': '/system/tasks' },
26 { 'value': '/system/time' },
27 { 'value': '/tape' },
28 { 'value': '/tape/device' },
29 { 'value': '/tape/pool' },
30 { 'value': '/tape/job' },
31 ],
32
33 constructor: function(config) {
34 let me = this;
35
36 config = config || {};
37 me.callParent([config]);
38
39 // TODO: this is but a HACK until we have some sort of resource storage like PVE
40 let datastores = Ext.data.StoreManager.lookup('pbs-datastore-list');
41
42 if (datastores) {
43 let donePaths = {};
44 me.suspendEvents();
45 datastores.each(function(record) {
46 let path = `/datastore/${record.data.store}`;
47 if (path !== undefined && !donePaths[path]) {
48 me.add({ value: path });
49 donePaths[path] = 1;
50 }
51 });
52 me.resumeEvents();
53
54 if (me.datastore) {
55 me.setDatastore(me.datastore);
56 }
57
58 me.fireEvent('refresh', me);
59 me.fireEvent('datachanged', me);
60 }
61
62 me.sort({
63 property: 'value',
64 direction: 'ASC',
65 });
66 me.initialized = true;
67 },
68
69 setDatastore: async function(datastore) {
70 let me = this;
71 if (!datastore) {
72 me.clearFilter();
73 return;
74 }
75 let url = `/api2/extjs/admin/datastore/${datastore}/namespace?max-depth=7`;
76 let { result: { data: ns } } = await Proxmox.Async.api2({ url });
77 // TODO: remove "old" datastore's ns paths?
78 if (ns.length > 0) {
79 if (me.initialized) {
80 me.suspendEvents();
81 }
82 for (const item of ns) {
83 if (item.ns !== '') {
84 me.add({ value: `/datastore/${datastore}/${item.ns}` });
85 }
86 }
87 if (me.initialized) {
88 me.resumeEvents();
89 me.fireEvent('refresh', me);
90 me.fireEvent('datachanged', me);
91 }
92 }
93 me.filter(item => item.get('value')?.startsWith(`/datastore/${datastore}`));
94 },
95 });
96
97 Ext.define('PBS.form.PermissionPathSelector', {
98 extend: 'Ext.form.field.ComboBox',
99 xtype: 'pbsPermissionPathSelector',
100 mixins: ['Proxmox.Mixin.CBind'],
101
102 config: {
103 datastore: null, // set to filter by a datastore, could be also made generic path
104 },
105
106 setDatastore: function(datastore) {
107 let me = this;
108 if (me.datastore === datastore) {
109 return;
110 }
111 me.datastore = datastore;
112 let store = me.getStore();
113 if (!me.rendered) {
114 if (store) {
115 store.datastore = datastore;
116 }
117 } else {
118 store.setDatastore(datastore);
119 }
120 },
121
122 valueField: 'value',
123 displayField: 'value',
124 cbind: {
125 typeAhead: '{editable}',
126 },
127 anyMatch: true,
128 queryMode: 'local',
129
130 store: {
131 type: 'pbsPermissionPaths',
132 },
133 regexText: gettext('Invalid permission path.'),
134 regex: /\/((access|datastore|remote|system)\/.*)?/,
135 });