2011-11-03 10:59:57 -07:00

540 lines
18 KiB
JavaScript

(function(cloudStack, $, testData) {
cloudStack.sections.storage = {
title: 'Storage',
id: 'storage',
sectionSelect: {
label: 'Select view'
},
sections: {
/**
* Volumes
*/
volumes: {
type: 'select',
title: 'Volumes',
listView: {
id: 'volumes',
label: 'Volumes',
fields: {
name: { label: 'Name', editable: true },
type: { label: 'Type' },
zonename: { label: 'Zone' },
size: { label: 'Size' },
state: {
label: 'Status',
indicator: {
'Ready': 'on'
}
}
},
filters: {
mine: { label: 'My volumes' },
large: { label: 'Large volumes' },
small: { label: 'Small volumes' }
},
// List view actions
actions: {
// Add volume
add: {
label: 'Add volume',
action: function(args) {
args.response.success({
_custom: { jobID: new Date() }
});
},
messages: {
confirm: function(args) {
return 'Are you sure you want to add ' + args.name + '?';
},
notification: function(args) {
return 'Creating new volume';
}
},
createForm: {
title: 'Add volume',
desc: 'Please fill in the following data to add a new volume.',
fields: {
name: {
label: 'Name',
validation: { required: true }
},
availabilityZone: {
label: 'Availability Zone',
select: function(args) {
args.response.success({
descriptionField: 'displayname',
data: [
{ id: 'sanjose', displayname: 'San Jose' },
{ id: 'Chicago', displayname: 'Chicago' }
]
});
}
},
diskOffering: {
label: 'Disk Offering',
dependsOn: 'availabilityZone',
select: function(args) {
/**
* Example to show/hide fields
*
* -Select Pod2 to show conditional fields
* -Select any other field to hide conditional fields
*/
args.$select.change(function() {
var $input = $(this);
var $form = $input.closest('form');
// Note: need to actually select the .form-item div containing the input
var $diskSize = $form.find('.form-item[rel=diskSize]');
$diskSize.hide();
if ($input.val() == 'custom') {
// Note: need to show by setting display=inline-block, not .show()
$diskSize.css('display', 'inline-block');
}
});
args.response.success({
descriptionField: 'description',
data: [
{ id: 'small', description: 'Small Disk, 5GB' },
{ id: 'medium', description: 'Medium Disk, 20GB' },
{ id: 'large', description: 'Large Disk, 100GB' },
{ id: 'custom', description: 'Custom Disk Size' }
]
});
}
},
diskSize: {
label: 'Disk size (in GB)',
validation: { required: true, number: true },
hidden: true
}
}
},
notification: {
poll: testData.notifications.customPoll(
testData.data.storage[0]
)
}
},
edit: {
label: 'Edit volume name',
action: function(args) {
args.response.success(args.data[0]);
}
},
snapshot: {
label: 'Take snapshot',
messages: {
confirm: function(args) {
return 'Please confirm that you want to take a snapshot of ' + args.name;
},
notification: function(args) {
return 'Made snapshot of volume: ' + args.name;
}
},
action: function(args) {
args.response.success({
data: { state: 'Shapshotting' }
});
},
notification: {
poll: testData.notifications.customPoll({
state: 'Ready'
})
}
},
recurringSnapshot: {
label: 'Setup recurring snapshots',
action: {
custom: cloudStack.uiCustom.recurringSnapshots({
desc: 'You can setup recurring snapshot schedules by selecting from the available options below and applying your policy preference.',
dataProvider: function(args) {
setTimeout(function() {
args.response.success({
data: [
{
type: 0,
time: 10,
timezone: 'Pacific/Samoa',
keep: 23
},
{
type: 3,
time: '12:33 AM',
timezone: 'Pacific/Samoa',
keep: 23,
'day-of-month': 31
}
]
});
}, 100);
},
actions: {
add: function(args) {
var snap = args.snapshot;
var data = {
keep: snap.maxsnaps,
timezone: snap.timezone
};
switch (snap['snapshot-type']) {
case 'hourly': // Hourly
$.extend(data, {
type: 0,
time: snap.schedule
}); break;
case 'daily': // Daily
$.extend(data, {
type: 1,
time: snap['time-hour'] + ':' + snap['time-minute'] + ' ' + snap['time-meridiem']
}); break;
case 'weekly': // Weekly
$.extend(data, {
type: 2,
time: snap['time-hour'] + ':' + snap['time-minute'] + ' ' + snap['time-meridiem'],
'day-of-week': snap['day-of-week']
}); break;
case 'monthly': // Monthly
$.extend(data, {
type: 3,
time: snap['time-hour'] + ':' + snap['time-minute'] + ' ' + snap['time-meridiem'],
'day-of-month': snap['day-of-month']
}); break;
}
setTimeout(function() {
args.response.success({
data: data
});
}, 300);
},
remove: function(args) {
args.response.success();
}
},
// Select data
selects: {
schedule: function(args) {
var time = [];
for (var i = 1; i <= 59; i++) {
time.push({
id: i,
name: i
});
}
args.response.success({
data: time
});
},
timezone: function(args) {
args.response.success({
data: [
{
id: 'Etc/GMT+12',
name: '[UTC-12:00] GMT-12:00'
},
{
id: 'Pacific/Samoa',
name: '[UTC-11:00] Samoa Standard Time'
}
]
});
},
'day-of-week': function(args) {
args.response.success({
data: [
{ id: 1, name: 'Sunday' },
{ id: 2, name: 'Monday' },
{ id: 3, name: 'Tuesday' },
{ id: 4, name: 'Wednesday' },
{ id: 5, name: 'Thursday' },
{ id: 6, name: 'Friday' },
{ id: 7, name: 'Saturday' }
]
});
},
'day-of-month': function(args) {
var time = [];
for (var i = 1; i <= 31; i++) {
time.push({
id: i,
name: i
});
}
args.response.success({
data: time
});
},
'time-hour': function(args) {
var time = [];
for (var i = 1; i <= 12; i++) {
time.push({
id: i,
name: i
});
}
args.response.success({
data: time
});
},
'time-minute': function(args) {
var time = [];
for (var i = 0; i <= 59; i++) {
time.push({
id: i < 10 ? '0' + i : i,
name: i < 10 ? '0' + i : i
});
}
args.response.success({
data: time
});
},
'time-meridiem': function(args) {
args.response.success({
data: [
{ id: 'AM', name: 'AM' },
{ id: 'PM', name: 'PM' }
]
});
}
}
})
},
messages: {
notification: function(args) {
return 'Setup recurring snapshot';
}
},
notification: {
poll: testData.notifications.testPoll
}
},
create: {
label: 'Create template',
addRow: 'false',
messages: {
notification: function(args) {
return 'Making new template: ' + args.name;
}
},
action: function(args) {
args.response.success({
data: {
state: 'Templating'
}
});
},
createForm: {
title: 'Create a template',
desc: 'To create a template from the selected volume, please complete the fields below.',
fields: {
name: { label: 'Name' },
displayText: { label: 'Display text' },
'public': {
label: 'Public', isBoolean: true
},
osType: {
label: 'OS Type',
dependsOn: 'public',
hidden: true,
select: function(args) {
args.response.success({
descriptionField: 'description',
data: [
{ id: 'centos53-64', description: 'CentOS 5.3 (64-bit)' },
{ id: 'rhel5-64', description: 'Red Hat Enterprise Linux 5.0 (64-bit)' },
{ id: 'deb6-32', description: 'Debian GNU/Linux 6.0 (32-bit)' }
]
});
}
},
usePassword: {
label: 'Use Password?',
isBoolean: true,
hidden: true,
dependsOn: 'public'
},
password: {
label: 'Password',
hidden: true,
dependsOn: 'usePassword',
password: true
}
}
},
notification: {
poll: testData.notifications.customPoll({
state: 'Ready'
})
}
}
},
dataProvider: testData.dataProvider.listView('storage'),
detailView: {
name: 'Volume details',
viewAll: { path: 'storage.snapshots', label: 'Snapshots' },
actions: {
edit: {
label: 'Edit volume details',
action: function(args) {
args.response.success();
},
notification: {
poll: testData.notifications.testPoll
}
},
snapshot: {
label: 'Take snapshot',
messages: {
confirm: function(args) {
return 'Please confirm that you want to take a snapshot of ' + args.name;
},
notification: function(args) {
return 'Made snapshot of volume: ' + args.name;
}
},
action: function(args) {
args.response.success();
},
notification: {
poll: testData.notifications.testPoll
}
},
createTemplate: {
label: 'Create template',
messages: {
success: function(args) {
return 'Your new template ' + args.name + ' is being created.';
},
notification: function(args) {
return 'Making new template: ' + args.name;
}
},
action: function(args) {
args.response.success();
},
createForm: {
title: 'Create a template',
desc: 'To create a template from the selected volume, please complete the fields below.',
fields: {
name: { label: 'Name', validation: { required: true } },
displayText: { label: 'Display text' },
osType: {
label: 'OS Type',
select: function(args) {
args.response.success({
descriptionField: 'description',
data: [
{ id: 'centos53-64', description: 'CentOS 5.3 (64-bit)' },
{ id: 'rhel5-64', description: 'Red Hat Enterprise Linux 5.0 (64-bit)' },
{ id: 'deb6-32', description: 'Debian GNU/Linux 6.0 (32-bit)' }
]
});
}
},
'public': {
label: 'Public', isBoolean: true
},
usePassword: {
label: 'Use password?', isBoolean: true
}
}
},
notification: {
poll: testData.notifications.testPoll
}
}
},
tabs: {
details: {
title: 'Details',
fields: [
{
name: { label: 'Name', isEditable: true }
},
{
id: { label: 'ID' },
type: { label: 'Type' },
zone: { label: 'Zone' }
}
],
dataProvider: testData.dataProvider.detailView('storage')
}
}
}
}
},
/**
* Snapshots
*/
snapshots: {
type: 'select',
title: 'Snapshots',
listView: {
id: 'snapshots',
label: 'Snapshots',
fields: {
volumename: { label: 'Volume' },
state: { label: 'State' },
intervaltype: { label: 'Interval Type' },
created: { label: 'Date' }
},
filters: {
mine: { label: 'My snapshots' }
},
dataProvider: testData.dataProvider.listView('snapshots'),
detailView: {
name: 'Snapshot detail',
tabs: {
details: {
title: 'Details',
fields: [
{
name: { label: 'Name' }
},
{
id: { label: 'ID' },
volume: { label: 'Volume' },
state: { label: 'State' },
intervalType: { label: 'Interval Type' },
account: { label: 'Account' },
domain: { label: 'Domain' }
}
],
dataProvider: testData.dataProvider.detailView('snapshots')
}
}
}
}
}
}
};
})(cloudStack, jQuery, testData);