From 25f79203511d729d68adbc9f1e9dfd6429282b6d Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sat, 7 Dec 2013 15:26:10 +0100 Subject: [PATCH] Removed the old ExtJS based UI --- .../webroot/Duplicati/CountDownHelper.js | 61 -- .../Server/webroot/Duplicati/ListUtility.js | 118 --- Duplicati/Server/webroot/Duplicati/Service.js | 319 ------ Duplicati/Server/webroot/Duplicati/Utility.js | 168 ---- .../Duplicati/controller/BackupConfig.js | 168 ---- .../webroot/Duplicati/controller/Schedules.js | 36 - .../controller/StatuswindowFooter.js | 16 - .../controller/StatuswindowHeader.js | 60 -- .../webroot/Duplicati/model/BackupJob.js | 35 - .../webroot/Duplicati/model/Schedule.js | 41 - .../Duplicati/model/ScheduleItems/Metadata.js | 73 -- .../Server/webroot/Duplicati/model/Task.js | 88 -- .../model/TaskItems/BackendSettings.js | 18 - .../model/TaskItems/BackupLocation.js | 14 - .../model/TaskItems/CompressionSettings.js | 3 - .../model/TaskItems/EncryptionSettings.js | 3 - .../Duplicati/model/TaskItems/Extensions.js | 120 --- .../Duplicati/model/TaskItems/Overrides.js | 3 - .../Duplicati/model/override/BackupJob.js | 38 - .../Duplicati/store/AdditionalPathStore.js | 23 - .../webroot/Duplicati/store/BackupJob.js | 24 - .../Duplicati/store/DefaultSizeRangeStore.js | 26 - .../Duplicati/store/DefaultTimeRangesStore.js | 28 - .../store/DeleteOldChainsWhenStore.js | 24 - .../Duplicati/store/EncryptionMethodStore.js | 44 - .../webroot/Duplicati/store/LabelStore.js | 21 - .../Duplicati/store/MyComputerTreeStore.js | 37 - .../store/NewBackupChainWhenStore.js | 25 - .../webroot/Duplicati/store/Schedules.js | 95 -- .../webroot/Duplicati/view/AboutWindow.js | 32 - .../webroot/Duplicati/view/BackupConfig.js | 927 ------------------ .../Duplicati/view/LostConnectionWindow.js | 67 -- .../Duplicati/view/StatuswindowFooter.js | 37 - .../Duplicati/view/StatuswindowHeader.js | 138 --- .../Duplicati/view/override/BackupConfig.js | 229 ----- .../webroot/Duplicati/view/schedule/List.js | 107 -- .../webroot/Duplicati/view/wndAddFilter.js | 14 - .../webroot/Duplicati/view/wndAddLocation.js | 70 -- .../Duplicati/view/wndCreateConnection.js | 16 - Duplicati/Server/webroot/app.js | 162 --- Duplicati/Server/webroot/icons/add-backup.png | Bin 3496 -> 0 bytes Duplicati/Server/webroot/icons/drive.gif | Bin 945 -> 0 bytes .../Server/webroot/icons/folder_locked.gif | Bin 988 -> 0 bytes .../webroot/icons/folder_locked_red.gif | Bin 978 -> 0 bytes Duplicati/Server/webroot/icons/hourglass.png | Bin 46838 -> 0 bytes Duplicati/Server/webroot/icons/hourglass2.png | Bin 41967 -> 0 bytes Duplicati/Server/webroot/icons/main-logo.png | Bin 1795 -> 0 bytes .../Server/webroot/icons/schedule-active.png | Bin 717 -> 0 bytes .../webroot/icons/schedule-in-queue.png | Bin 943 -> 0 bytes .../Server/webroot/icons/schedule-waiting.png | Bin 882 -> 0 bytes .../Server/webroot/icons/status-pause.png | Bin 3500 -> 0 bytes .../Server/webroot/icons/status-play.png | Bin 3453 -> 0 bytes Duplicati/Server/webroot/status-window.html | 22 - .../webroot/stylesheets/status-window.css | 217 ---- Duplicati/Server/webroot/test-add.html | 71 -- Duplicati/Server/webroot/test-update.html | 72 -- 56 files changed, 3910 deletions(-) delete mode 100644 Duplicati/Server/webroot/Duplicati/CountDownHelper.js delete mode 100644 Duplicati/Server/webroot/Duplicati/ListUtility.js delete mode 100644 Duplicati/Server/webroot/Duplicati/Service.js delete mode 100644 Duplicati/Server/webroot/Duplicati/Utility.js delete mode 100644 Duplicati/Server/webroot/Duplicati/controller/BackupConfig.js delete mode 100644 Duplicati/Server/webroot/Duplicati/controller/Schedules.js delete mode 100644 Duplicati/Server/webroot/Duplicati/controller/StatuswindowFooter.js delete mode 100644 Duplicati/Server/webroot/Duplicati/controller/StatuswindowHeader.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/BackupJob.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/Schedule.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/ScheduleItems/Metadata.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/Task.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/BackendSettings.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/BackupLocation.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/CompressionSettings.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/EncryptionSettings.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/Extensions.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/TaskItems/Overrides.js delete mode 100644 Duplicati/Server/webroot/Duplicati/model/override/BackupJob.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/AdditionalPathStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/BackupJob.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/DefaultSizeRangeStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/DefaultTimeRangesStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/DeleteOldChainsWhenStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/EncryptionMethodStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/LabelStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/MyComputerTreeStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/NewBackupChainWhenStore.js delete mode 100644 Duplicati/Server/webroot/Duplicati/store/Schedules.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/AboutWindow.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/BackupConfig.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/LostConnectionWindow.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/StatuswindowFooter.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/StatuswindowHeader.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/override/BackupConfig.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/schedule/List.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/wndAddFilter.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/wndAddLocation.js delete mode 100644 Duplicati/Server/webroot/Duplicati/view/wndCreateConnection.js delete mode 100644 Duplicati/Server/webroot/app.js delete mode 100644 Duplicati/Server/webroot/icons/add-backup.png delete mode 100644 Duplicati/Server/webroot/icons/drive.gif delete mode 100644 Duplicati/Server/webroot/icons/folder_locked.gif delete mode 100644 Duplicati/Server/webroot/icons/folder_locked_red.gif delete mode 100644 Duplicati/Server/webroot/icons/hourglass.png delete mode 100644 Duplicati/Server/webroot/icons/hourglass2.png delete mode 100644 Duplicati/Server/webroot/icons/main-logo.png delete mode 100644 Duplicati/Server/webroot/icons/schedule-active.png delete mode 100644 Duplicati/Server/webroot/icons/schedule-in-queue.png delete mode 100644 Duplicati/Server/webroot/icons/schedule-waiting.png delete mode 100644 Duplicati/Server/webroot/icons/status-pause.png delete mode 100644 Duplicati/Server/webroot/icons/status-play.png delete mode 100644 Duplicati/Server/webroot/status-window.html delete mode 100644 Duplicati/Server/webroot/stylesheets/status-window.css delete mode 100644 Duplicati/Server/webroot/test-add.html delete mode 100644 Duplicati/Server/webroot/test-update.html diff --git a/Duplicati/Server/webroot/Duplicati/CountDownHelper.js b/Duplicati/Server/webroot/Duplicati/CountDownHelper.js deleted file mode 100644 index e28955854..000000000 --- a/Duplicati/Server/webroot/Duplicati/CountDownHelper.js +++ /dev/null @@ -1,61 +0,0 @@ -Ext.define('Duplicati.CountDownHelper', { - mixins: { - observable: 'Ext.util.Observable' - }, - - statics: { - callbackkeycounter: 0, - callbacklookup: {}, - callbackhelper: function(id) { - this.callbacklookup["" + id].onCallback(); - } - }, - - expireTime: null, - intervalId : null, - - constructor: function(config) { - this.mixins.observable.constructor.call(this, config); - this.addEvents('count-down-tick', 'count-down-complete'); - }, - - isRunning: function() { - return this.intervalId != null; - }, - - start: function(time) { - if (this.intervalId != null) - this.stop(false); - - this.expireTime = time; - var selfid = Duplicati.CountDownHelper.callbackkeycounter++; - - Duplicati.CountDownHelper.callbacklookup["" + selfid] = this; - this.intervalId = window.setInterval('Duplicati.CountDownHelper.callbackhelper(' + selfid + ');', 500); - }, - - onCallback: function() { - var secondsLeft = parseInt((this.expireTime.getTime() - new Date().getTime()) / 1000); - this.fireEvent('count-down-tick', Math.max(0, secondsLeft)); - if (secondsLeft <= 0) - this.stop(true); - }, - - stop: function(activateEvent) { - if (this.intervalId != null) { - window.clearInterval(this.intervalId); - this.intervalId = null; - } - - for(var k in Duplicati.CountDownHelper.callbacklookup) { - if (Duplicati.CountDownHelper.callbacklookup[k] == this) { - delete Duplicati.CountDownHelper.callbacklookup[k]; - break; - } - } - - if (activateEvent || activateEvent === undefined) - this.fireEvent('count-down-complete'); - } - -}) diff --git a/Duplicati/Server/webroot/Duplicati/ListUtility.js b/Duplicati/Server/webroot/Duplicati/ListUtility.js deleted file mode 100644 index bd5d69890..000000000 --- a/Duplicati/Server/webroot/Duplicati/ListUtility.js +++ /dev/null @@ -1,118 +0,0 @@ -Ext.define('Duplicati.ListUtility', { - statics: { - - currentScheduleId: null, - - showContextMenu: function(id, el) { - var lst = Ext.getCmp('status-window-schedule-list'); - var mnu = lst.elementContextMenu; - this.currentScheduleId = id; - var elx = Ext.get(el); - mnu.showBy(elx, 'tr-br?'); - }, - - formatSizeString: function(size) { return Duplicati.Utility.formatSizeString(size); }, - timeAgo: function(date) { return Duplicati.Utility.timeAgo(date); }, - formatCountString: function(count, singular, plural) { - count = parseInt(count); - if (count == 1) - return 1 + ' ' + singluar; - - //Make a string - count = count + ''; - var tmp = ''; - while (count.length > 3) { - tmp = count.substr(count.length - 3, 3) + (tmp.length == 0 ? '' : '.') + tmp; - count = count.substr(0, count.length - 3); - } - - tmp = count + (tmp.length == 0 ? '' : '.') + tmp; - - return tmp + ' ' + plural; - }, - - formatBackupScheduleDetails: function(values) - { - var metadata = ''; - - if (values.Metadata != null) - { - var metadataItems = []; - var mt = values.Metadata; - - var sourceData = ''; - if (mt['source-file-size'] != null && mt['source-file-count'] != null) - sourceData = this.formatSizeString(mt['source-file-size']) + ' (' + this.formatCountString(mt['source-file-count'], 'file', 'files') + ')'; - else if (mt['source-file-size'] != null) - sourceData = this.formatSizeString(mt['source-file-size']); - else if (mt['source-file-count'] != null) - sourceData = this.formatCountString(mt['source-file-count'], 'file', 'files'); - - if (sourceData != '') - metadataItems.push('Source: ' + sourceData + ''); - - var backupData = ''; - if (mt['total-backup-size'] != null && parseInt(mt['total-backup-size']) > 0 && mt['total-file-count'] != null && parseInt(mt['total-file-count']) > 0) - backupData = this.formatSizeString(mt['total-backup-size']) + ' (' + this.formatCountString(mt['total-file-count'], 'file', 'files') + ')'; - else if (mt['total-backup-size'] != null && parseInt(mt['total-backup-size']) > 0) - backupData = this.formatSizeString(mt['total-backup-size']); - else if (mt['total-file-count'] != null && parseInt(mt['total-file-count']) > 0) - backupData = this.formatCountString(mt['total-file-count'], 'file', 'files'); - - if (backupData != '') - metadataItems.push('Backup: ' + backupData + ''); - - if (mt['assigned-quota-space'] != null || mt['free-quota-space'] != null) - { - var spaceLeft = null; - if (mt['assigned-quota-space'] != null && mt['free-quota-space'] != null && mt['total-backup-size'] != null) - spaceLeft = Math.min(parseInt(mt['assigned-quota-space']) - parseInt(mt['total-backup-size']), parseInt(mt['free-quota-space'])); - else if (mt['assigned-quota-space'] != null && mt['total-backup-size'] != null) - spaceLeft = parseInt(mt['assigned-quota-space']) - parseInt(mt['total-backup-size']); - else if (mt['free-quota-space'] != null) - spaceLeft = parseInt(mt['free-quota-space']); - - var extracls = ''; - if (mt['total-backup-size'] != null) - { - //We mark it as low if there is less than 10% free - if (spaceLeft < (parseInt(mt['total-backup-size']) * 0.1)) - extracls = 'class="low-storage-space"'; - } - - if (spaceLeft != null) - metadataItems.push('Free space: ' + this.formatSizeString(spaceLeft) + ''); - } - - if (mt['changed-file-count'] != null) - { - var changedFiles = parseInt(mt['changed-file-count']); - var str = changedFiles + ' ' + changedFiles == 1 ? "change" : "changes"; - - if (mt['last-backup-date'] != null) - str += ' since ' + this.timeAgo(new Date(mt['last-backup-date'])); - - metadataItems.push('' + str + ''); - } else if (mt['last-backup-date'] != null || mt['last-backup-completed-time'] != null) { - if (mt['last-backup-completed-time'] != null) - metadataItems.push('Last backup: ' + this.timeAgo(new Date(mt['last-backup-completed-time'])) + ''); - else - metadataItems.push('Last backup: ' + this.timeAgo(new Date(mt['last-backup-date'])) + ''); - } - - for(var ix = 0; ix < metadataItems.length; ix++) - { - /*if (ix != 0) - metadata += ", "; */ - - metadata += metadataItems[ix]; - } - } - - if (metadata == '') - metadata = 'No backup information was found, run a backup to obtain data' - - return metadata; - } - } -}) \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/Service.js b/Duplicati/Server/webroot/Duplicati/Service.js deleted file mode 100644 index 31838ff36..000000000 --- a/Duplicati/Server/webroot/Duplicati/Service.js +++ /dev/null @@ -1,319 +0,0 @@ -Ext.define('Duplicati.Service', { - requires: [ - 'Duplicati.CountDownHelper' - ], - mixins: { - observable: 'Ext.util.Observable' - }, - - controlUrl: '/control.cgi', - pauseCountDownHelper: null, - lostConnectionCountDownHelper: null, - updateRequestParams: { - action: 'get-current-state', - longpoll: true, - lasteventid: '-1', - duration: '5m' - }, - updateRequestRunning: false, - updateRequestFailureCount: 0, - - //Cache for server responses - serverdata: { - 'current-state': null, - 'installed-backends': null, - 'installed-compression-modules': null, - 'installed-encryption-modules': null, - 'installed-generic-modules': null, - 'backup-defaults': null, - 'system-info': null - }, - - constructor: function(config) { - this.mixins.observable.constructor.call(this, config); - this.addEvents('current-state-updated', 'count-down-pause-timer', 'lost-connection', 'reconnected', 'lost-connection-retry', 'lost-connection-retry-delay'); - this.lostConnectionCountDownHelper = new Duplicati.CountDownHelper(); - this.pauseCountDownHelper = new Duplicati.CountDownHelper(); - - this.pauseCountDownHelper.on({ - 'count-down-tick': function(secondsleft) { - this.fireEvent('count-down-pause-timer', secondsleft); - }, - 'count-down-complete': function() { - this.fireEvent('count-down-pause-timer', 0); - }, - scope: this - }); - - this.lostConnectionCountDownHelper.on({ - 'count-down-tick': function(seconds) { - this.fireEvent('lost-connection-retry-delay', seconds); - }, - 'count-down-complete': function() { - this.updateCurrentState(); - this.fireEvent('lost-connection-retry'); - }, - scope: this - }) - - this.loadSystemInfo(false); - }, - - loadSystemInfo: function(reload) { - - if (reload || this.serverdata['system-info'] == null) { - - Ext.Ajax.request({ - url: this.controlUrl, - params: {action: 'system-info'}, - scope: this, - success: function(response) { - var res = eval('(' + response.responseText + ')'); - if (res != null) - this.serverdata['system-info'] = res; - - if (this.serverdata['system-info'] == null) - window.setTimeout(this.loadSystemInfo, 1000); - }, - - error: function() { - if (this.serverdata['system-info'] == null) - window.setTimeout(this.loadSystemInfo, 1000); - } - }); - } - }, - - reconnectNow: function() { - if (this.lostConnectionCountDownHelper.isRunning()) { - this.lostConnectionCountDownHelper.stop(true); - } - }, - - updateCurrentState: function(force) { - if (this.updateRequestRunning && !force) - return; - - var params = force ? { action: 'get-current-state' } : this.updateRequestParams; - var timeout = force ? 5000 : (1000 * ((60 * 5) + 5)); - - if (!force) - { - this.updateRequestRunning = true; - if (this.updateRequestFailureCount > 0) - { - //Last request failed, so lets retry, - // with a short timeout and make sure we - // don't wait for an update - timeout = 10000; //10 sec - this.updateRequestParams.lasteventid = -1; - } - } - - Ext.Ajax.request({ - url: this.controlUrl, - params: params, - timeout: timeout, - scope: this, - success: function(response) { - var res = eval('(' + response.responseText + ')'); - if (res != null) - { - if (this.updateRequestFailureCount >= 2) - this.fireEvent('reconnected'); - - this.updateRequestFailureCount = 0; - Ext.log('Got update: ' + res.LastEventID + ', last: ' + this.updateRequestParams.lasteventid); - var realUpdate = this.updateRequestParams.lasteventid != res.LastEventID; - this.serverdata['current-state'] = res; - this.updateRequestParams.lasteventid = res.LastEventID; - - //Register next request - if (!force) - { - this.updateRequestRunning = false; - this.updateCurrentState(); - } - - if (realUpdate) - this.fireEvent('current-state-updated', this.serverdata['current-state']); - if (this.getExpectedPauseEnd() != null) - this.pauseCountDownHelper.start(this.getExpectedPauseEnd()); - else if (this.pauseCountDownHelper.isRunning()) - this.pauseCountDownHelper.stop(true); - - } - }, - failure: function(response, opts) { - //Register next request - if (!force) - { - Ext.log('Failure in longpoll: ' + response.status + ', timeout: ' + response.timedout); - - this.updateRequestFailureCount++; - this.updateRequestRunning = false; - - if (this.updateRequestFailureCount == 2) - this.fireEvent('lost-connection'); - - if (this.updateRequestFailureCount >= 2) { - - this.lostConnectionCountDownHelper.start(Ext.Date.add(new Date(), Ext.Date.SECOND, 30)); - } - else - { - this.updateCurrentState(); - } - } - } - }); - }, - - getExpectedPauseEnd: function() { - var pauseEnd = this.serverdata['current-state'].EstimatedPauseEnd; - if (pauseEnd != null) { - pauseEnd = Duplicati.Utility.parseJsonDate(pauseEnd); - if (pauseEnd != null && pauseEnd.getTime() > new Date().getTime()) - return pauseEnd; - } - return null; - }, - - getSchedulePosition: function(id) { - var state = this.serverdata['current-state']; - if (state == null) - return -1; - - if (id == state.ActiveScheduleId) - return 0; - else if (state.SchedulerQueueIds != null) - for(var i = 0; i < state.SchedulerQueueIds.length; i++) - if (state.SchedulerQueueIds[i] == id) - return i+1; - - return -1; - }, - - pause: function(duration) { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { - action: 'send-command', - command: 'pause', - duration: duration - }, - success: function(response) { } - }); - }, - - resume: function() { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { - action: 'send-command', - command: 'resume' - }, - success: function(response) { } - }); - }, - - isPaused: function() { - var state = this.serverdata['current-state']; - if (state != null) - return state.ProgramState != 'Running'; - - return true; - }, - - togglePause: function() { - if (this.isPaused()) - this.resume(); - else - this.pause(); - }, - - getInstalledCompressionModules: function(callback) { - if (this.serverdata['installed-compression-modules'] == null) { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { action: 'list-installed-compression-modules' }, - success: function(response) { - self.serverdata['installed-compression-modules'] = eval('(' + response.responseText + ')'); - callback(self.serverdata['installed-compression-modules']); - } - }); - } else { - callback(this.serverdata['installed-compression-modules']); - } - }, - - getInstalledGenericModules: function(callback) { - if (this.serverdata['installed-generic-modules'] == null) { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { action: 'list-installed-generic-modules' }, - success: function(response) { - self.serverdata['installed-generic-modules'] = eval('(' + response.responseText + ')'); - callback(self.serverdata['installed-generic-modules']); - } - }); - } else { - callback(this.serverdata['installed-generic-modules']); - } - }, - - getInstalledEncryptionModules: function(callback) { - if (this.serverdata['installed-encryption-modules'] == null) { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { action: 'list-installed-encryption-modules' }, - success: function(response) { - self.serverdata['installed-encryption-modules'] = eval('(' + response.responseText + ')'); - callback(self.serverdata['installed-encryption-modules']); - } - }); - } else { - callback(this.serverdata['installed-encryption-modules']); - } - }, - - getBackupDefaults: function(callback) { - if (this.serverdata['backup-defaults'] == null) { - var self = this; - Ext.Ajax.request({ - url: this.controlUrl, - params: { action: 'get-backup-defaults' }, - success: function(response) { - self.serverdata['backup-defaults'] = eval('(' + response.responseText + ')'); - callback(self.serverdata['backup-defaults']); - }, - scope: this - }); - } else { - callback(this.serverdata['backup-defaults']); - } - }, - - runBackup: function(id, full) { - var self = this; - - Ext.Ajax.request({ - url: this.controlUrl, - params: { - action: 'send-command', - command: 'run-backup', - id: id, - full: full - }, - success: function(response) { - } - }); - - } - -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/Utility.js b/Duplicati/Server/webroot/Duplicati/Utility.js deleted file mode 100644 index 43db5b39f..000000000 --- a/Duplicati/Server/webroot/Duplicati/Utility.js +++ /dev/null @@ -1,168 +0,0 @@ -Ext.define('Duplicati.Utility', { - statics: { - - strings: { - terabyteShort: 'TB', - gigabyteShort: 'GB', - megabyteShort: 'MB', - kilobyteShort: 'KB', - bytesShort: 'bytes', - - prefixAgo: null, - prefixFromNow: "in", - suffixAgo: "ago", - suffixFromNow: null, - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "about an hour", - hours: "about %d hours", - day: "a day", - days: "%d days", - month: "about a month", - months: "%d months", - year: "about a year", - years: "%d years", - wordSeparator: " " - }, - - timeAgoTimer: window.setInterval('Duplicati.Utility.updateTimeAgoFields()', 1000 * 150), - - //Simplified version of jquery.timeago - timeAgo: function(date) { - var distanceMillis = (new Date().getTime() - date.getTime()); - var strings = this.strings; - - var prefix = strings.prefixAgo; - var suffix = strings.suffixAgo; - if (distanceMillis < 0) { - prefix = strings.prefixFromNow; - suffix = strings.suffixFromNow; - } - - var seconds = Math.abs(distanceMillis) / 1000; - var minutes = seconds / 60; - var hours = minutes / 60; - var days = hours / 24; - var years = days / 365; - - var words = seconds < 45 && strings.seconds.replace(/%d/i, Math.round(seconds)) || - seconds < 90 && strings.minute || - minutes < 45 && strings.minutes.replace(/%d/i, Math.round(minutes)) || - minutes < 90 && strings.hour || - hours < 24 && strings.hours.replace(/%d/i, Math.round(hours)) || - hours < 42 && strings.day || - days < 30 && strings.days.replace(/%d/i, Math.round(days)) || - days < 45 && strings.month || - days < 365 && strings.months.replace(/%d/i, Math.round(days / 30)) || - years < 1.5 && strings.year || - strings.years.replace(/%d/i, Math.round(years)); - - var separator = strings.wordSeparator === undefined ? " " : strings.wordSeparator; - return Ext.String.trim([prefix, words, suffix].join(separator)); - }, - - updateTimeAgoFields: function() { - var parent = Ext.get(document); - var els = parent.query('.marker-time-ago'); - for(var i = 0; i < els.length; i++) { - var time = this.parseJsonDate(els[i].title); - if (els[i].nextSibling.nodeType == 3) - els[i].nextSibling.nodeValue = this.timeAgo(time); - else if (els[i].nextSibling.innerText != null) - els[i].nextSibling.innerText = this.timeAgo(time); - } - }, - - - parseJsonDate: function(str) { - if (str == null) - return null; - - if (Ext.String.trim(str).length == 0) - return null; - - if (str.indexOf("\/") == 0) - { - var strtmp = str.replace(/\/Date\((-?\d+(((\+|\-)\d+)|Z|z)?)\)\//gi, "new Date($1)"); - return eval(strtmp); - } - else - { - return new Date(str); - } - }, - - formatSecondsAsTime: function(seconds) { - seconds = parseInt(seconds); - var hours = parseInt(Math.floor(seconds / (60 * 60))); - seconds = seconds - (hours * 60 * 60); - var minutes = parseInt(Math.floor(seconds / 60)); - seconds = seconds - (minutes * 60); - var res = ''; - if (hours > 0) { - res += hours + ':'; - if (minutes < 10) - res += '0'; - } - - res += minutes + ':' ; - if (seconds < 10) - res += '0'; - res += seconds; - - return res; - }, - - formatSizeString: function(size) { - size = parseInt(size); - if (isNaN(size)) - return size; - - var strings = this.strings; - - if (size >= 1024 * 1024 * 1024 * 1024) - return (size / (1024 * 1024 * 1024 * 1024.0)).toFixed(2) + ' ' + strings.terabyteShort; - else if (size >= 1024 * 1024 * 1024) - return (size / (1024 * 1024 * 1024.0)).toFixed(2) + ' ' + strings.gigabyteShort; - else if (size >= 1024 * 1024) - return (size / (1024 * 1024.0)).toFixed(2) + ' ' + strings.megabyteShort; - else if (size >= 1024) - return (size / (1024.0)).toFixed(2) + ' ' + strings.kilobyteShort; - else - return size + ' ' + strings.bytesShort; - }, - - estimatedFreeSpace: function(assignedQuota, freeQuota, backupSize) { - if (assignedQuota != null && freeQuota != null && backupSize != null) - return Math.min(parseInt(assignedQuota) - parseInt(backupSize), parseInt(freeQuota)); - else if (assignedQuota != null && backupSize != null) - return parseInt(assignedQuota) - parseInt(backupSize); - else if (freeQuota != null) - return parseInt(freeQuota); - else - return null; - }, - - createRecordFromData: function(classname, data) { - var entry = Ext.create(classname); - var model = Ext.ModelManager.getModel(classname); - var fields = model.getFields(); - var associations = entry.associations; - - for(var i = 0; i < fields.length; i++) { - var key = fields[i].mapping || fields[i].name; - if (data[key] !== undefined) - entry.set(fields[i].name, data[key]); - } - - for(var i = 0; i < associations.length; i++) { - var a = associations.getAt(i); - if (data[a.associationKey]) - entry[a.setterName](Duplicati.Utility.createRecordFromData(a.associatedName, data[a.associationKey])); - } - - return entry; - } - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/controller/BackupConfig.js b/Duplicati/Server/webroot/Duplicati/controller/BackupConfig.js deleted file mode 100644 index c47c8bdd0..000000000 --- a/Duplicati/Server/webroot/Duplicati/controller/BackupConfig.js +++ /dev/null @@ -1,168 +0,0 @@ -Ext.define('Duplicati.controller.BackupConfig', { - extend: 'Ext.app.Controller', - - onBtnGeneratePasswordClick: function(button, e, options) { - var text = ""; - var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.,_:;+#?=)(/&%$§"; - for( var i=0; i < 16; i++ ) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - var t = Ext.getCmp('sEncryptionPassword'); - var t2 = Ext.getCmp('sEncryptionPasswordCheck'); - var pwdButton = Ext.getCmp('btnPassword'); - t.inputEl.dom.type = t2.inputEl.dom.type = 'text'; - pwdButton.setText( 'Hide Password' ); - t.setValue(text); - }, - - onButtonClick: function(button, e, options) { - var t = Ext.getCmp('sEncryptionPassword'); - var t2 = Ext.getCmp('sEncryptionPasswordCheck'); - var pwdButton = Ext.getCmp('btnPassword'); - t.inputEl.dom.type = t2.inputEl.dom.type = ( t.inputEl.dom.type == 'password' )?'text':'password'; - pwdButton.setText( ( t.inputEl.dom.type == 'password' )?'Show Password':'Hide Password' ); - }, - - onTAddLocationClick: function(tool, e, options) { - Ext.create('Duplicati.view.wndAddLocation').show(); - }, - - onTAddFilterClick: function(tool, e, options) { - Ext.create('Duplicati.view.wndAddFilter').show(); - }, - - onBtnBuildURLClick: function(button, e, options) { - Ext.create('Duplicati.view.wndCreateConnection').show(); - }, - - onTAddOverrideClick: function(tool, e, options) { - Ext.create('Duplicati.view.wndAddOverride').show(); - }, - - onBtnNextClick: function(button, e, options) { - if( Ext.getCmp('btnNext').getText() == 'Finish' ) { - // Save all the stuff and Finish work - // Checks need to happen here, if everything is filled in proper - alert( "DONE!!"); - button.findParentByType('window').destroy(); - } else { - var wizardTabs = Ext.getCmp('panelWizard'); - wizardTabs.setActiveTab( wizardTabs.getActiveTab().activeItem + 1 ); - } - }, - - onAddLocationsClick: function(button, e, options) { - var records = Ext.getCmp('treeLocation').getChecked(); - Ext.getCmp('Locations').getStore().removeAll(); - - Ext.Array.each(records, function(rec){ - Ext.getCmp('Locations').getStore().add( - new Duplicati.model.TaskItems.BackupLocation ( { - Location: rec.get('id'), - TotalSize:0 - } - ) - ); - }); - - Ext.getCmp("winAddLocation").destroy(); - }, - - onBtnCloseClick: function(button, e, options) { - button.findParentByType('window').destroy(); - }, - - afterWindowLayout: function(abstractcontainer, layout, options) { - if (abstractcontainer.scheduleId == null || abstractcontainer.scheduleId < 0) - { - Duplicati.service.getBackupDefaults(function(data) { - var entry = Duplicati.Utility.createRecordFromData('Duplicati.model.BackupJob', data.data); - abstractcontainer.loadRecord(entry); - }); - } - else - { - var backupJobModel = Ext.ModelManager.getModel('Duplicati.model.BackupJob'); - backupJobModel.load(abstractcontainer.scheduleId, { - scope: this, - success : function(backupJobResult, operation) { - abstractcontainer.loadRecord(backupJobResult); - } - }); - } - }, - - onControllerClickStub: function() { - - }, - - onWizardTabChange: function(tabPanel, newCard, oldCard, eOpts) { - if (newCard.activeItem == -1) { - Ext.getCmp('btnNext').setText( 'Finish' ); - } else { - Ext.getCmp('btnNext').setText( 'Next >' ); - } - }, - - afterEncryptionModuleChange: function() { - var combo = Ext.getCmp('EncryptionModule'); - var t = Ext.getCmp('sEncryptionPassword'); - var t2 = Ext.getCmp('sEncryptionPasswordCheck'); - var b = Ext.getCmp('btnPassword'); - var b2 = Ext.getCmp('btnGeneratePassword'); - - if (combo.getValue() == '') { - t.disable(); - t2.disable(); - b.disable(); - b2.disable(); - } else { - t.enable(); - t2.enable(); - b.enable(); - b2.enable(); - } - }, - - init: function() { - this.control({ - "#btnGeneratePassword": { - click: this.onBtnGeneratePasswordClick - }, - "#btnPassword": { - click: this.onButtonClick - }, - "#tAddLocation": { - click: this.onTAddLocationClick - }, - "#tAddFilter": { - click: this.onTAddFilterClick - }, - "#tAddOverride": { - click: this.onTAddOverrideClick - }, - "#btnBuildURL": { - click: this.onBtnBuildURLClick - }, - "#btnNext": { - click: this.onBtnNextClick - }, - "#btnAddLocations": { - click: this.onAddLocationsClick - }, - "#btnClose": { - click: this.onBtnCloseClick - }, - "backupconfigpanel": { - afterlayout: this.afterWindowLayout - }, - "#EncryptionModule": { - change: this.afterEncryptionModuleChange - }, - "#panelWizard": { - tabchange: this.onWizardTabChange - } - }); - } - -}); diff --git a/Duplicati/Server/webroot/Duplicati/controller/Schedules.js b/Duplicati/Server/webroot/Duplicati/controller/Schedules.js deleted file mode 100644 index 0acea3cda..000000000 --- a/Duplicati/Server/webroot/Duplicati/controller/Schedules.js +++ /dev/null @@ -1,36 +0,0 @@ -Ext.define('Duplicati.controller.Schedules', { - extend: 'Ext.app.Controller', - stores: [ 'Schedules' ], - views: [ 'schedule.List' ], - - refs: [{ - selector: 'viewport > panel', - ref: 'basicPanel' - }], - - lastEventID: -1, - - init: function() { - this.control({ - 'viewport > panel': { - render: this.onPanelRendered - } - }); - - this.application.on({ - 'current-state-updated': function(data) { - - //Update the data store if there is new metadata - if (data.LastEventID != this.lastEventID) - this.getSchedulesStore().load(); - - this.lastEventID = data.LastEventID; - }, - scope: this - }); - }, - - onPanelRendered: function() { - //console.log('The panel was rendered'); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/controller/StatuswindowFooter.js b/Duplicati/Server/webroot/Duplicati/controller/StatuswindowFooter.js deleted file mode 100644 index 681a63488..000000000 --- a/Duplicati/Server/webroot/Duplicati/controller/StatuswindowFooter.js +++ /dev/null @@ -1,16 +0,0 @@ -Ext.define('Duplicati.controller.StatuswindowFooter', { - extend: 'Ext.app.Controller', - views: [ 'StatuswindowFooter' ], - - init: function() { - this.control({ - 'viewport > panel': { - render: this.onPanelRendered - } - }); - }, - - onPanelRendered: function() { - //console.log('The footer panel was rendered'); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/controller/StatuswindowHeader.js b/Duplicati/Server/webroot/Duplicati/controller/StatuswindowHeader.js deleted file mode 100644 index d837a063f..000000000 --- a/Duplicati/Server/webroot/Duplicati/controller/StatuswindowHeader.js +++ /dev/null @@ -1,60 +0,0 @@ -Ext.define('Duplicati.controller.StatuswindowHeader', { - extend: 'Ext.app.Controller', - views: [ 'StatuswindowHeader' ], - - refs: [{ - selector: '#status-window-header-pause-button', - ref: 'pauseButton' - }, { - selector: '#status-window-header-pause-menu', - ref: 'pauseMenu' - }], - - init: function() { - this.application.on({ - 'current-state-updated': function() { - var btn = this.getPauseButton(); - var mnu = this.getPauseMenu(); - var srv = this.application.service; - var util = Duplicati.Utility; - - if (srv.isPaused()) { - if (srv.getExpectedPauseEnd() != null) - btn.setText('Resume (' + util.formatSecondsAsTime((srv.getExpectedPauseEnd().getTime() - new Date().getTime()) / 1000) + ')'); - else - btn.setText('Resume'); - btn.setIconCls('backups-paused'); - mnu.setText('Resume Duplicati'); - } else { - btn.setText('Pause'); - btn.setIconCls('backups-running'); - mnu.setText('Pause Duplicati'); - } - }, - scope: this - }); - - this.application.on({ - 'count-down-pause-timer': function(data) { - var btn = this.getPauseButton(); - var srv = this.application.service; - var util = Duplicati.Utility; - if (data <= 0) - btn.setText('Pause'); - else - btn.setText('Resume (' + util.formatSecondsAsTime(data) + ')'); - }, - scope: this - }); - - this.control({ - 'viewport > panel': { - render: this.onPanelRendered - } - }); - }, - - onPanelRendered: function() { - //console.log('The header panel was rendered'); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/BackupJob.js b/Duplicati/Server/webroot/Duplicati/model/BackupJob.js deleted file mode 100644 index 7c8c802eb..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/BackupJob.js +++ /dev/null @@ -1,35 +0,0 @@ -Ext.define('Duplicati.model.BackupJob', { - extend: 'Ext.data.Model', - uses: [ - 'Duplicati.model.Task', - 'Duplicati.model.Schedule' - ], - - proxy: { - type: 'ajax', - url: '/control.cgi?action=get-schedule-details', - reader: { - type: 'json', - idProperty: 'ID', - root: 'data' - } - }, - - associations: [{ - name: 'task', - type: 'hasOne', - associationKey: 'Task', - primaryKey: 'ID', - getterName: 'getTask', - setterName: 'setTask', - model: 'Duplicati.model.Task' - },{ - name: 'schedule', - type: 'hasOne', - associationKey: 'Schedule', - primaryKey: 'ID', - getterName: 'getSchedule', - setterName: 'setSchedule', - model: 'Duplicati.model.Schedule' - }] -}); diff --git a/Duplicati/Server/webroot/Duplicati/model/Schedule.js b/Duplicati/Server/webroot/Duplicati/model/Schedule.js deleted file mode 100644 index bf7e040d4..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/Schedule.js +++ /dev/null @@ -1,41 +0,0 @@ -Ext.define('Duplicati.model.Schedule', { - extend: 'Ext.data.Model', - - associations: [{ - name: 'task', - type: 'hasOne', - model: 'Duplicati.model.Task', - primaryKey: 'ID', - foreignKey: 'ScheduleID' - }], - - fields: [ - { - name: 'NextScheduledTime' - }, - { - name: 'AllowedWeekdays' - }, - { - name: 'ID' - }, - { - name: 'Name' - }, - { - name: 'Path' - }, - { - name: 'When' - }, - { - name: 'Repeat' - }, - { - name: 'Weekdays' - }, - { - name: 'Metadata' - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/ScheduleItems/Metadata.js b/Duplicati/Server/webroot/Duplicati/model/ScheduleItems/Metadata.js deleted file mode 100644 index 56b2a0639..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/ScheduleItems/Metadata.js +++ /dev/null @@ -1,73 +0,0 @@ -Ext.define('Duplicati.model.ScheduleItems.Metadata', { - extend: 'Ext.data.Model', - - fields: [ - { - name: 'total_size', - mapping: 'total-size' - }, - { - name: 'full_backup_count' - }, - { - name: 'total_volume_count' - }, - { - name: 'total_file_count' - }, - { - name: 'longest_chain_length' - }, - { - name: 'current_chain_length' - }, - { - name: 'current_full_date' - }, - { - name: 'current_chain_size' - }, - { - name: 'last_backup_date' - }, - { - name: 'last_backup_size' - }, - { - name: 'total_backup_size' - }, - { - name: 'total_quota_space' - }, - { - name: 'free_quota_space' - }, - { - name: 'source_file_size' - }, - { - name: 'source_file_count' - }, - { - name: 'source_folder_count' - }, - { - name: 'orphan_file_count' - }, - { - name: 'orphan_file_size' - }, - { - name: 'alien_file_count' - }, - { - name: 'alien_file_size' - }, - { - name: 'total_backup_sets' - }, - { - name: 'last_backup_completed_time' - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/Task.js b/Duplicati/Server/webroot/Duplicati/model/Task.js deleted file mode 100644 index 4290e50cc..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/Task.js +++ /dev/null @@ -1,88 +0,0 @@ -Ext.define('Duplicati.model.Task', { - extend: 'Ext.data.Model', - uses: [ - 'Duplicati.model.TaskItems.BackendSettings', - 'Duplicati.model.TaskItems.Extensions', - 'Duplicati.model.TaskItems.Overrides', - 'Duplicati.model.TaskItems.EncryptionSettings', - 'Duplicati.model.TaskItems.CompressionSettings' - ], - - associations: [{ - name: 'backendSettings', - associationKey: 'BackendSettings', - type: 'hasOne', - model: 'Duplicati.model.TaskItems.BackendSettings', - getterName: 'getBackendSettings', - setterName: 'setBackendSettings' - },{ - name: 'extensions', - associationKey: 'Extensions', - type: 'hasOne', - model: 'Duplicati.model.TaskItems.Extensions', - getterName: 'getExtensions', - setterName: 'setExtensions' - },{ - name: 'overrides', - associationKey: 'Overrides', - type: 'hasOne', - model: 'Duplicati.model.TaskItems.Overrides', - getterName: 'getOverrides', - setterName: 'setOverrides' - },{ - name: 'encryptionSettings', - associationKey: 'EncryptionSettings', - type: 'hasOne', - model: 'Duplicati.model.TaskItems.EncryptionSettings', - getterName: 'getEncryptionSettings', - setterName: 'setEncryptionSettings' - },{ - name: 'compressionSettings', - associationKey: 'CompressionSettings', - type: 'hasOne', - model: 'Duplicati.model.TaskItems.CompressionSettings', - getterName: 'getCompressionSettings', - setterName: 'setCompressionSettings' - }], - - - fields: [ - { - name: 'Filter' - }, - { - name: 'ID' - }, - { - name: 'Service' - }, - { - name: 'Encryptionkey' - }, - { - name: 'SourcePath' - }, - { - name: 'ScheduleID' - }, - { - name: 'KeepFull' - }, - { - name: 'KeepTime' - }, - { - name: 'FullAfter' - }, - { - name: 'IncludeSetup', - type: 'boolean' - }, - { - name: 'EncryptionModule' - }, - { - name: 'CompressionModule' - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackendSettings.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackendSettings.js deleted file mode 100644 index 6d03863b2..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackendSettings.js +++ /dev/null @@ -1,18 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.BackendSettings', { - extend: 'Ext.data.Model', - - fields: [ - { - name: 'UI_Checked_empty' - }, - { - name: 'Destination' - }, - { - name: 'Username' - }, - { - name: 'Password' - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackupLocation.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackupLocation.js deleted file mode 100644 index 6f6377406..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/BackupLocation.js +++ /dev/null @@ -1,14 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.BackupLocation', { - extend: 'Ext.data.Model', - - fields: [ - { - name: 'Location', - type: 'string' - }, - { - name: 'TotalSize', - type: 'float' - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/CompressionSettings.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/CompressionSettings.js deleted file mode 100644 index 343ffdc6c..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/CompressionSettings.js +++ /dev/null @@ -1,3 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.CompressionSettings', { - extend: 'Ext.data.Model' -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/EncryptionSettings.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/EncryptionSettings.js deleted file mode 100644 index f029f928b..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/EncryptionSettings.js +++ /dev/null @@ -1,3 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.EncryptionSettings', { - extend: 'Ext.data.Model' -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/Extensions.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/Extensions.js deleted file mode 100644 index 897c8b5ac..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/Extensions.js +++ /dev/null @@ -1,120 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.Extensions', { - extend: 'Ext.data.Model', - - fields: [ - { - name: 'UploadBandwidth', - mapping: "Upload Bandwidth" - }, - { - name: 'DownloadBandwidth', - mapping: 'Download Bandwidth' - }, - { - name: 'MaxUploadSize', - mapping: 'Max Upload Size' - }, - { - name: 'VolumeSize', - mapping: 'Volume Size' - }, - { - name: 'ThreadPriority', - mapping: 'Thread Priority' - }, - { - name: 'AsyncTransfer', - mapping: 'Async Transfer', - type: 'boolean', - convert: parseBool - }, - { - name: 'IgnoreTimestamps', - mapping: 'Ignore Timestamps', - type: 'boolean', - convert: parseBool - }, - { - name: 'FileSizeLimit', - mapping: 'File Size Limit' - }, - { - name: 'DisableAESfallbackencryption', - mapping: 'Disable AES fallback encryption', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesVersion', - mapping: 'Select Files - Version', - type: 'int', - convert: parseInt - }, - { - name: 'SelectFilesUseSimpleMode', - mapping: 'Select Files - Use Simple Mode', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesIncludeDocuments', - mapping: 'Select Files - Include Documents', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesIncludeDesktop', - mapping: 'Select Files - Include Desktop', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesIncludeMusic', - mapping: 'Select Files - Include Music', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesIncludeImages', - mapping: 'Select Files - Include Images', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectFilesIncludeAppData', - mapping: 'Select Files - Include AppData', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectWhenWarnedNoSchedule', - mapping: 'Select When - Warned No Schedule', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectWhenWarnedTooManyIncrementals', - mapping: 'Select When - Warned Too Many Incrementals', - type: 'boolean', - convert: parseBool - }, - { - name: 'SelectWhenWarnedNoIncrementals', - mapping: 'Select When - Warned No Incrementals', - type: 'boolean', - convert: parseBool - }, - { - name: 'PasswordSettingsWarnedNoPassword', - mapping: 'Password Settings - Warned No Password', - type: 'boolean', - convert: parseBool - }, - { - name: 'CleanupSettingsWarnedNoCleanup', - mapping: 'Cleanup Settings - Warned No Cleanup', - type: 'boolean', - convert: parseBool - } - ] -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/TaskItems/Overrides.js b/Duplicati/Server/webroot/Duplicati/model/TaskItems/Overrides.js deleted file mode 100644 index f4bfa1be2..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/TaskItems/Overrides.js +++ /dev/null @@ -1,3 +0,0 @@ -Ext.define('Duplicati.model.TaskItems.Overrides', { - extend: 'Ext.data.Model' -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/model/override/BackupJob.js b/Duplicati/Server/webroot/Duplicati/model/override/BackupJob.js deleted file mode 100644 index 2e83f86ae..000000000 --- a/Duplicati/Server/webroot/Duplicati/model/override/BackupJob.js +++ /dev/null @@ -1,38 +0,0 @@ -Ext.define('Duplicati.model.override.BackupJob', { - requires: 'Duplicati.model.BackupJob' -}, function() { - Ext.override(Duplicati.model.BackupJob, { - - setValues: function(values, arrayField) { - var me = this; - - function setVal(fieldId, val) { - if (arrayField) { - fieldId = arrayField + '.' + fieldId; - } - var field = me.findField(fieldId); - if (field) { - field.setValue(val); - if (me.trackResetOnLoad) { - field.resetOriginalValue(); - } - } else if(Ext.isObject(val)) { - me.setValues(val, fieldId); - } - } - - alert( "Servus setValues" ); - - if (Ext.isArray(values)) { - // array of objects - Ext.each(values, function(val) { - setVal(val.id, val.value); - }); - } else { - // object hash - Ext.iterate(values, setVal); - } - return this; - } - }); -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/AdditionalPathStore.js b/Duplicati/Server/webroot/Duplicati/store/AdditionalPathStore.js deleted file mode 100644 index 071c4c5df..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/AdditionalPathStore.js +++ /dev/null @@ -1,23 +0,0 @@ -Ext.define('Duplicati.store.AdditionalPathStore', { - extend: 'Ext.data.Store', - requires: [ - 'Duplicati.model.TaskItems.BackupLocation' - ], - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - autoLoad: true, - storeId: 'pathStore', - model: 'Duplicati.model.TaskItems.BackupLocation', - proxy: { - type: 'memory', - reader: { - type: 'json', - root: 'root' - } - } - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/BackupJob.js b/Duplicati/Server/webroot/Duplicati/store/BackupJob.js deleted file mode 100644 index 5f25dab9b..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/BackupJob.js +++ /dev/null @@ -1,24 +0,0 @@ -Ext.define('Duplicati.store.BackupJob', { - extend: 'Ext.data.Store', - requires: [ - 'Duplicati.model.BackupJob' - ], - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'MyJsonStore', - model: 'Duplicati.model.BackupJob', - proxy: { - type: 'ajax', - url: '/control.cgi?action=get-schedule-details', - reader: { - type: 'json', - idProperty: 'ID', - root: 'data' - } - } - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/DefaultSizeRangeStore.js b/Duplicati/Server/webroot/Duplicati/store/DefaultSizeRangeStore.js deleted file mode 100644 index b65d7004a..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/DefaultSizeRangeStore.js +++ /dev/null @@ -1,26 +0,0 @@ -Ext.define('Duplicati.store.DefaultSizeRangeStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'DefaultSizeRangeStore', - data: [ - {key: 'b', value: 'bytes'}, - {key: 'kb', value: 'Kilobytes'}, - {key: 'mb', value: 'Megabytes'}, - {key: 'gb', value: 'Gigabytes'}, - {key: 'tb', value: 'Terabyts'} - ], - fields: [ - { - name: 'key' - }, - { - name: 'value' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/DefaultTimeRangesStore.js b/Duplicati/Server/webroot/Duplicati/store/DefaultTimeRangesStore.js deleted file mode 100644 index 4da9330f0..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/DefaultTimeRangesStore.js +++ /dev/null @@ -1,28 +0,0 @@ -Ext.define('Duplicati.store.DefaultTimeRangesStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'DefaultTimeRangesStore', - data: [ - {key: 's', value: 'Seconds'}, - {key: 'm', value: 'Minutes'}, - {key: 'h', value: 'Hours'}, - {key: 'D', value: 'Days'}, - {key: 'W', value: 'Weeks'}, - {key: 'M', value: 'Months'}, - {key: 'Y', value: 'Years'} - ], - fields: [ - { - name: 'key' - }, - { - name: 'value' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/DeleteOldChainsWhenStore.js b/Duplicati/Server/webroot/Duplicati/store/DeleteOldChainsWhenStore.js deleted file mode 100644 index 1663ecf64..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/DeleteOldChainsWhenStore.js +++ /dev/null @@ -1,24 +0,0 @@ -Ext.define('Duplicati.store.DeleteOldChainsWhenStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'DeleteOldChainsWhenStore', - data: [ - {key: '0', value: 'When there are more chains than ...'}, - {key: '1', value: 'When the last backup in the chain is older than ...'}, - {key: '2', value: 'Never'} - ], - fields: [ - { - name: 'key' - }, - { - name: 'value' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/EncryptionMethodStore.js b/Duplicati/Server/webroot/Duplicati/store/EncryptionMethodStore.js deleted file mode 100644 index 6f72407a9..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/EncryptionMethodStore.js +++ /dev/null @@ -1,44 +0,0 @@ -Ext.define('Duplicati.store.EncryptionMethodStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - autoLoad: true, - filterOnLoad: false, - sortOnLoad: false, - storeId: 'EncryptionMethodStore', - - /*listeners: { - load: function(records, success, eOpts) { - alert('WS'); - } - - //TODO: Should we add the empty row here instad? - - },*/ - - fields: [ - { - mapping: 'DisplayName', - name: 'encryptionMethodName', - type: 'string' - }, - { - mapping: 'FilenameExtension', - name: 'encryptionMethodIdentifier', - type: 'string' - } - ], - proxy: { - type: 'ajax', - url: '/control.cgi?action=list-installed-encryption-modules', - reader: { - type: 'array', - idProperty: 'id' - } - } - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/LabelStore.js b/Duplicati/Server/webroot/Duplicati/store/LabelStore.js deleted file mode 100644 index ae3fc772d..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/LabelStore.js +++ /dev/null @@ -1,21 +0,0 @@ -Ext.define('Duplicati.store.LabelStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'LabelStore', - data: [ - {name: 'private'}, - {name: 'important'}, - {name: 'weekly'} - ], - fields: [ - { - name: 'name' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/MyComputerTreeStore.js b/Duplicati/Server/webroot/Duplicati/store/MyComputerTreeStore.js deleted file mode 100644 index 0bd4fd38e..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/MyComputerTreeStore.js +++ /dev/null @@ -1,37 +0,0 @@ -Ext.define('Duplicati.store.MyComputerTreeStore', { - extend: 'Ext.data.TreeStore', - - constructor: function(cfg) { - cfg = cfg || {}; - this.callParent([Ext.apply({ - autoLoad: true, - filterOnLoad: false, - sortOnLoad: false, - storeId: 'MyComputerTreeStore', - folderSort: false, - nodeParam: 'path', - root: { - text: 'My Computer', - id: '/', - expanded: false - }, - proxy: { - type: 'ajax', - url: '/control.cgi?action=get-folder-contents&onlyfolders=true', - reader: { - type: 'json', - root: '/' - } - }, - fields: [ - { - mapping: 'check', - name: 'checked' - }, - { - name: 'text' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/NewBackupChainWhenStore.js b/Duplicati/Server/webroot/Duplicati/store/NewBackupChainWhenStore.js deleted file mode 100644 index c7f92307d..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/NewBackupChainWhenStore.js +++ /dev/null @@ -1,25 +0,0 @@ -Ext.define('Duplicati.store.NewBackupChainWhenStore', { - extend: 'Ext.data.Store', - - constructor: function(cfg) { - var me = this; - cfg = cfg || {}; - me.callParent([Ext.apply({ - storeId: 'NewBackupChainWhenStore', - data: [ - {key: '0', value: 'When there are more backups in the chain than ...'}, - {key: '1', value: 'When the chain is older than ...'}, - {key: '2', value: 'Once, and then backup changes only'}, - {key: '3', value: 'Every time'} - ], - fields: [ - { - name: 'key' - }, - { - name: 'value' - } - ] - }, cfg)]); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/store/Schedules.js b/Duplicati/Server/webroot/Duplicati/store/Schedules.js deleted file mode 100644 index 7b89c2507..000000000 --- a/Duplicati/Server/webroot/Duplicati/store/Schedules.js +++ /dev/null @@ -1,95 +0,0 @@ -Ext.define('Duplicati.store.Schedules', { - extend: 'Ext.data.Store', - model: 'Duplicati.model.Schedule', - autoLoad: true, - - /* Sort order, - * first by queue position - * second by next schedule time, - * third by last backup time - * */ - sorters: [{ - sorterFn: function(a, b) { - var schedulePosA = Duplicati.service.getSchedulePosition(a.get("ID")); - var schedulePosB = Duplicati.service.getSchedulePosition(b.get("ID")); - - if(schedulePosA >= 0 && schedulePosB >= 0) - { - if (schedulePosA == schedulePosB) - return 0; - else - return schedulePosA < schedulePosB ? -1 : 1; - } - else if (schedulePosA >= 0) - return -1; - else if (schedulePosB >= 0) - return 1; - else - return 0; - } - }, { - sorterFn: function(a, b) { - var nextTimeA = Duplicati.Utility.parseJsonDate(a.get('NextScheduledTime')); - var nextTimeB = Duplicati.Utility.parseJsonDate(b.get('NextScheduledTime')); - var now = new Date().getTime(); - - //Scheduled time in past, but not in queue, so it will not run - if (nextTimeA != null && nextTimeA < now) - nextTimeA = null; - if (nextTimeB != null && nextTimeB < now) - nextTimeB = null; - - if (nextTimeA != null && nextTimeB != null) - { - nextTimeA = nextTimeA.getTime(); - nextTimeB = nextTimeB.getTime(); - if (nextTimeA == nextTimeB) - return 0; - else - return nextTimeA < nextTimeB ? -1 : 1; - } - else if (nextTimeA != null) - return -1; - else if (nextTimeB != null) - return 1; - else - return 0; - } - }, { - sorterFn: function(a, b) { - var lastTimeA = Duplicati.Utility.parseJsonDate(a.data.Metadata['last-backup-completed-time']); - var lastTimeB = Duplicati.Utility.parseJsonDate(b.data.Metadata['last-backup-completed-time']); - if (lastTimeA == null) - lastTimeA = Duplicati.Utility.parseJsonDate(a.data.Metadata['last-backup-date']); - if (lastTimeB == null) - lastTimeB = Duplicati.Utility.parseJsonDate(b.data.Metadata['last-backup-date']); - - if ((lastTimeA != null && lastTimeB != null)) - { - lastTimeA = lastTimeA.getTime(); - lastTimeB = lastTimeB.getTime(); - - if (lastTimeA == lastTimeB) - return 0; - else - return lastTimeA > lastTimeB ? -1 : 1; - } - else if (lastTimeA != null) - return -1; - else if (lastTimeB != null) - return 1; - else - return 0; - } - }, { - property: 'Name' - }], - - proxy: { - type: 'ajax', - url: 'control.cgi?action=list-schedules', - reader: { - type: 'json' - } - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/AboutWindow.js b/Duplicati/Server/webroot/Duplicati/view/AboutWindow.js deleted file mode 100644 index 68724e4e2..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/AboutWindow.js +++ /dev/null @@ -1,32 +0,0 @@ -Ext.define('Duplicati.view.AboutWindow', { - statics: { - dialogWindow: null, - show: function() { - if (this.dialogWindow == null) - this.dialogWindow = Ext.create('Ext.window.Window', { - title: 'About Duplicati', - height: 200, - width: 400, - modal: true, - resizable: false, - buttonAlign: 'center', - closeAction: 'hide', - layout: 'auto', - items: [{ - xtype: 'label', - text: 'Duplicati 2.0' - }], - buttons: [{ - xtype: 'button', - text: 'OK', - handler: function() { - Duplicati.view.AboutWindow.dialogWindow.hide(); - } - }] - }); - - this.dialogWindow.show(); - } - } -}); - diff --git a/Duplicati/Server/webroot/Duplicati/view/BackupConfig.js b/Duplicati/Server/webroot/Duplicati/view/BackupConfig.js deleted file mode 100644 index ae8fae9e3..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/BackupConfig.js +++ /dev/null @@ -1,927 +0,0 @@ -Ext.define('Duplicati.view.BackupConfig', { - extend: 'Ext.form.Panel', - - xtype: 'backupconfigpanel', - draggable: false, - floating: false, - frame: false, - height: 550, - width: 698, - autoScroll: false, - resizable: false, - layout: { - type: 'absolute' - }, - bodyBorder: false, - closable: false, - collapsed: false, - collapsible: false, - frameHeader: false, - hideCollapseTool: false, - overlapHeader: false, - preventHeader: true, - title: 'Backup Job', - titleCollapse: true, - waitMsgTarget: true, - - initComponent: function(params) { - var me = this; - - me.scheduleId = me.initialConfig.scheduleId; - - me.initialConfig = Ext.apply({ - waitMsgTarget: true - }, me.initialConfig); - - Ext.applyIf(me, { - items: [ - { - xtype: 'tabpanel', - height: 484, - id: 'panelWizard', - activeTab: 0, - plain: true, - layout: { - deferredRender: true, - type: 'card' - }, - items: [ - { - xtype: 'panel', - height: 409, - activeItem: 0, - layout: { - type: 'anchor' - }, - hideCollapseTool: false, - title: 'General', - items: [ - { - xtype: 'fieldset', - margin: 10, - padding: 10, - collapsed: false, - collapsible: false, - title: 'Name & Label', - formBind: false, - items: [ - { - xtype: 'textfield', - id: 'Name', - name: 'Schedule.Name', - fieldLabel: 'Name of Backup', - labelAlign: 'right', - labelWidth: 140, - msgTarget: 'side', - allowBlank: false, - blankText: 'Required: Short Description to identify your Backup', - disableKeyFilter: false, - emptyText: 'Short Description to identify your Backup', - enableKeyEvents: false, - minLength: 6, - anchor: '100%', - formBind: false - }, - { - xtype: 'combobox', - id: 'sLabel', - name: 'Schedule.Path', - fieldLabel: 'Labels/Groups', - labelAlign: 'right', - labelWidth: 140, - msgTarget: 'side', - blankText: 'Required: Select a Label or Create a new one', - emptyText: 'Select a Label or Create a new one', - displayField: 'name', - multiSelect: true, - store: 'LabelStore', - anchor: '100%', - formBind: false, - listeners: { - change: { - fn: me.onSLabelChange, - scope: me - } - } - }, - { - xtype: 'container', - height: 27, - hidden: true, - layout: { - align: 'stretchmax', - pack: 'end', - type: 'hbox' - }, - items: [ - { - xtype: 'button', - text: 'Manage Labels', - flex: 1 - } - ] - } - ] - }, - { - xtype: 'fieldset', - height: 220, - hidden: false, - margin: 10, - padding: 10, - styleHtmlContent: false, - activeItem: 0, - title: 'Security', - formBind: false, - items: [ - { - xtype: 'component', - floating: false, - html: 'It is recommended to encrypt all backups which are stored on remote Servers', - margin: 10, - padding: 10, - tpl: [ - '

sepp

' - ], - autoScroll: false - }, - { - xtype: 'combobox', - id: 'EncryptionModule', - name: 'Task.EncryptionModule', - fieldLabel: 'Encryption method', - labelAlign: 'right', - labelWidth: 140, - editable: false, - forceSelection: true, - queryParam: 'encryptionMethodName', - store: 'EncryptionMethodStore', - displayField: 'encryptionMethodName', - valueField: 'encryptionMethodIdentifier', - anchor: '100%', - formBind: false, - queryMode: 'local' - }, - { - xtype: 'textfield', - disabled: false, - id: 'sEncryptionPassword', - stateful: false, - inputType: 'password', - name: 'sEncryptionPassword', - fieldLabel: 'Encryption Password', - labelAlign: 'right', - labelWidth: 140, - msgTarget: 'side', - disableKeyFilter: false, - minLength: 6, - anchor: '100%', - formBind: false - }, - { - xtype: 'textfield', - validator: function(value) { - var password1 = Ext.getCmp('sEncryptionPassword'); - return (value === password1.getValue() || value.length < 6) ? true : 'Passwords do not match.'; - }, - id: 'sEncryptionPasswordCheck', - stateful: false, - maintainFlex: false, - inputType: 'password', - name: 'sEncryptionPasswordCheck', - readOnly: false, - fieldLabel: 'Repeat Password', - labelAlign: 'right', - labelWidth: 140, - minLength: 6, - anchor: '100%', - formBind: false - }, - { - xtype: 'button', - id: 'btnGeneratePassword', - style: 'float:right', - autoWidth: true, - scale: 'medium', - text: 'Generate Password', - formBind: false - }, - { - xtype: 'button', - id: 'btnPassword', - style: 'float:right', - autoWidth: true, - repeat: false, - scale: 'medium', - text: 'Show Password', - formBind: false - } - ] - } - ] - }, - { - xtype: 'panel', - height: 367, - activeItem: 1, - title: 'Source Data', - items: [ - { - xtype: 'fieldset', - margin: 10, - padding: 10, - title: 'Standard Locations', - items: [ - { - xtype: 'checkboxgroup', - id: 'chkgStandardLocations', - margin: '', - width: 400, - fieldLabel: '', - columns: 1, - vertical: true, - name: 'Files', - items: [ - { - xtype: 'checkboxfield', - id: 'chkMyDocuments', - name: 'Task.Extensions.SelectFilesIncludeDocuments', - hideLabel: false, - labelPad: 10, - boxLabel: 'My Documents' - }, - { - xtype: 'checkboxfield', - id: 'chkMyMusic', - name: 'Task.Extensions.SelectFilesIncludeMusic', - boxLabel: 'My Music' - }, - { - xtype: 'checkboxfield', - id: 'chkMyVideos', - name: 'Task.Extensions.SelectFilesIncludeMyVideos', - boxLabel: 'My Videos' - }, - { - xtype: 'checkboxfield', - id: 'chkMyPictures', - name: 'Task.Extensions.SelectFilesIncludeImages', - boxLabel: 'My Pictures' - }, - { - xtype: 'checkboxfield', - id: 'chkAppSettings', - name: 'Task.Extensions.SelectFilesIncludeAppData', - boxLabel: 'Application Settings' - } - ] - } - ] - }, - { - xtype: 'gridpanel', - id: 'Locations', - margin: 10, - bodyBorder: false, - title: 'Additional Locations', - sortableColumns: false, - store: 'AdditionalPathStore', - columnLines: false, - tools: [ - { - xtype: 'tool', - id: 'tAddLocation', - type: 'plus' - } - ], - listeners: { - added: { - fn: me.onLocationsAdded, - scope: me - } - }, - columns: [ - { - xtype: 'gridcolumn', - renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { - // this works only for Windows ... - // ...need to identify OS before - if( value.indexOf("/") == 0 && value.length > 2 && value[2] == ':') { - value = value.substr( 1, value.length); - value = value.replace(/\//g,"\\"); - } - return value; - }, - dataIndex: 'Location', - text: 'Location' - }, - { - xtype: 'numbercolumn', - dataIndex: 'TotalSize', - text: 'Size' - } - ] - }, - { - xtype: 'gridpanel', - margin: 10, - bodyBorder: false, - title: 'Filter Rules', - forceFit: true, - hideHeaders: true, - scroll: 'none', - sortableColumns: false, - store: 'LabelStore', - columnLines: false, - columns: [ - { - xtype: 'gridcolumn', - id: 'fldFilter', - margin: '', - dataIndex: 'string', - menuDisabled: false, - text: 'Filter' - } - ], - tools: [ - { - xtype: 'tool', - id: 'tAddFilter', - type: 'plus' - } - ] - } - ] - }, - { - xtype: 'panel', - activeItem: 2, - closable: false, - title: 'Target', - items: [ - { - xtype: 'fieldset', - frame: false, - id: 'pConnection', - margin: 10, - padding: 10, - title: 'Connection', - items: [ - { - xtype: 'textfield', - id: 'sNameOfConnection', - name: 'NameOfConnection', - fieldLabel: 'Name of Connection', - labelAlign: 'right', - labelWidth: 140, - anchor: '100%' - }, - { - xtype: 'fieldcontainer', - height: 27, - layout: { - align: 'stretch', - type: 'hbox' - }, - combineErrors: true, - combineLabels: false, - fieldLabel: 'Label', - hideLabel: true, - msgTarget: 'side', - anchor: '100%', - formBind: false, - items: [ - { - xtype: 'textfield', - floating: false, - id: 'sConnectionURL', - name: 'ConnectionURL', - fieldLabel: 'Connection URL', - labelAlign: 'right', - labelWidth: 140, - flex: 10 - }, - { - xtype: 'button', - id: 'btnBuildURL', - text: '...', - flex: 1, - margins: '0 0 5 5' - } - ] - }, - { - xtype: 'container', - padding: '0 0 0 145', - items: [ - { - xtype: 'fieldset', - height: 110, - id: 'pCredentials', - margin: '', - padding: 10, - layout: { - align: 'stretchmax', - pack: 'center', - padding: 10, - type: 'vbox' - }, - collapsible: false, - title: 'Credentials', - items: [ - { - xtype: 'textfield', - id: 'sUsername', - maxWidth: 330, - minWidth: 330, - width: 330, - name: 'sUsername', - fieldLabel: 'Username', - labelAlign: 'right', - labelWidth: 70 - }, - { - xtype: 'textfield', - id: 'sPassword', - maxWidth: 330, - minWidth: 330, - width: 330, - inputType: 'password', - name: 'sPassword', - fieldLabel: 'Password', - labelAlign: 'right', - labelWidth: 70 - } - ] - }, - { - xtype: 'button', - margin: '5 0 0 0', - text: 'Test Connection' - } - ] - } - ] - } - ] - }, - { - xtype: 'panel', - activeItem: 3, - title: 'Run & Delete', - items: [ - { - xtype: 'fieldset', - id: 'fsSchedule', - margin: 10, - padding: 10, - title: 'Schedule', - items: [ - { - xtype: 'checkboxfield', - id: 'chkRunRegular', - margin: '0 0 20 0', - name: 'chkRunRegular', - fieldLabel: 'Label', - hideLabel: true, - boxLabel: 'Run regulary at the specified times', - checked: true, - anchor: '100%', - listeners: { - change: { - fn: me.onChkRunRegularChange, - scope: me - } - } - }, - { - xtype: 'fieldcontainer', - layout: { - align: 'stretchmax', - type: 'hbox' - }, - fieldLabel: 'Label', - hideLabel: true, - items: [ - { - xtype: 'timefield', - margin: '0 5 0 0', - fieldLabel: 'Next Time', - name: 'Schedule.When.Time', - labelSeparator: ' ', - flex: 5 - }, - { - xtype: 'datefield', - maintainFlex: false, - name: 'Schedule.When.Date', - fieldLabel: 'Label', - hideLabel: true, - flex: 3 - }, - { - xtype: 'container', - flex: 10 - } - ] - }, - { - xtype: 'fieldcontainer', - layout: { - align: 'stretchmax', - type: 'hbox' - }, - fieldLabel: '', - hideLabel: true, - items: [ - { - xtype: 'numberfield', - margin: '0 5 0 0', - fieldLabel: 'Run again every', - name: 'Schedule.Repeat.Number', - minValue: 0, - labelSeparator: ' ', - flex: 5 - }, - { - xtype: 'combobox', - fieldLabel: 'Label', - hideLabel: true, - flex: 3, - name: 'Schedule.Repeat.Suffix', - store: 'DefaultTimeRangesStore', - editable: false, - forceSelection: true, - displayField: 'value', - valueField: 'key' - }, - { - xtype: 'container', - flex: 10 - } - ] - }, - { - xtype: 'fieldcontainer', - layout: { - align: 'stretchmax', - type: 'hbox' - }, - fieldLabel: '', - hideLabel: true, - items: [ - { - xtype: 'checkboxgroup', - width: 400, - fieldLabel: 'Allowed Days', - flex: 5, - name: 'Schedule.AllowedWeekdays', - items: [ - { - xtype: 'checkboxfield', - boxLabel: 'Mon' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Tue' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Wed' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Thu' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Fri' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Sat' - }, - { - xtype: 'checkboxfield', - boxLabel: 'Sun' - } - ] - }, - { - xtype: 'container', - flex: 2 - } - ] - } - ] - }, - { - xtype: 'fieldset', - margin: 10, - padding: 10, - title: 'Full or incremental', - items: [ - { - xtype: 'combobox', - fieldLabel: 'Make a full backup', - labelWidth: 120, - store: 'NewBackupChainWhenStore', - displayField: 'value', - valueField: 'key', - editable: false, - forceSelection: true, - anchor: '100%' - }, - { - xtype: 'fieldcontainer', - height: 27, - layout: { - align: 'stretch', - type: 'hbox' - }, - fieldLabel: 'Label', - hideLabel: true, - items: [ - { - xtype: 'numberfield', - hideEmptyLabel: false, - labelWidth: 120, - minValue: 0, - flex: 5, - margins: '0 5 0 0' - }, - { - xtype: 'combobox', - fieldLabel: 'Label', - store: 'DefaultTimeRangesStore', - displayField: 'value', - valueField: 'key', - editable: false, - forceSelection: true, - hideLabel: true, - flex: 2 - }, - { - xtype: 'container', - flex: 8 - } - ] - } - ] - }, - { - xtype: 'fieldset', - margin: 10, - padding: 10, - title: 'Delete old backups', - items: [ - { - xtype: 'displayfield', - margin: '0 0 10 0', - value: 'Please note: A full and its incremental backups are called a chain. Duplicati deletes entire backup chains only. A chain is deleted, when all its backups match the specified rule.', - hideEmptyLabel: false, - labelWidth: 120, - anchor: '100%' - }, - { - xtype: 'combobox', - fieldLabel: 'Delete backups', - labelWidth: 120, - store: 'DeleteOldChainsWhenStore', - editable: false, - forceSelection: true, - displayField: 'value', - valueField: 'key', - anchor: '100%' - }, - { - xtype: 'fieldcontainer', - height: 27, - layout: { - align: 'stretch', - type: 'hbox' - }, - fieldLabel: 'Label', - hideLabel: true, - items: [ - { - xtype: 'numberfield', - hideEmptyLabel: false, - labelWidth: 120, - minValue: 0, - flex: 5, - margins: '0 5 0 0' - }, - { - xtype: 'combobox', - fieldLabel: 'Label', - store: 'DefaultTimeRangesStore', - displayField: 'value', - valueField: 'key', - editable: false, - forceSelection: true, - hideLabel: true, - flex: 2 - }, - { - xtype: 'container', - flex: 8 - } - ] - } - ] - } - ] - }, - { - xtype: 'panel', - activeItem: -1, - title: 'Options', - items: [ - { - xtype: 'fieldset', - margin: 10, - padding: 10, - title: 'Options', - items: [ - { - xtype: 'combobox', - fieldLabel: 'Missed Backup', - anchor: '100%' - }, - { - xtype: 'displayfield', - margin: '0 0 30 0 0', - value: 'When the computer or Duplicati turned off when a backup should have been made, this defines how Duplicati will handle this situation', - hideEmptyLabel: false, - hideLabel: false, - anchor: '100%' - }, - { - xtype: 'fieldcontainer', - height: 27, - layout: { - align: 'stretch', - type: 'hbox' - }, - fieldLabel: 'Label', - hideLabel: true, - items: [ - { - xtype: 'numberfield', - fieldLabel: 'Max archive size', - name: 'Task.Extensions.VolumeSize.Number', - minValue: 0, - flex: 2, - margins: '0 5 0 0' - }, - { - xtype: 'combobox', - name: 'Task.Extensions.VolumeSize.Suffix', - fieldLabel: 'Label', - hideLabel: true, - store: 'DefaultSizeRangeStore', - valueField: 'key', - displayField: 'value', - editable: false, - forceSelection: true, - flex: 1 - }, - { - xtype: 'container', - flex: 4 - } - ] - }, - { - xtype: 'displayfield', - margin: '0 0 30 0', - value: 'Duplicati splitts his backup archives into smaller chunks. This setting defines what the maximum filesize is for this chunks.', - hideEmptyLabel: false, - hideLabel: false, - anchor: '100%' - }, - { - xtype: 'textfield', - fieldLabel: 'Backup file prefix', - anchor: '100%' - }, - { - xtype: 'displayfield', - value: 'This prefix is used for all backup file names. This must be set to unique values if multiple backups are stored in the same target path.', - hideEmptyLabel: false, - hideLabel: false, - anchor: '100%' - } - ] - }, - { - xtype: 'propertygrid', - height: 115, - margin: 10, - autoScroll: true, - title: 'Advanced', - scroll: 'vertical', - columnLines: true, - nameColumnWidth: 180, - tools: [ - { - xtype: 'tool', - id: 'tAddOverride', - type: 'plus' - } - ], - source: { - 'Property 1': 'String', - 'Property 2': true, - 'Property 3': '2012-07-28T23:31:46', - 'Property 4': 123 - } - } - ] - } - ] - } - ], - dockedItems: [ - { - xtype: 'toolbar', - frame: false, - height: 40, - width: 40, - vertical: true, - dock: 'bottom', - layout: { - align: 'middle', - pack: 'end', - padding: 0, - type: 'hbox' - }, - items: [ - { - xtype: 'buttongroup', - border: '', - minButtonWidth: 100, - titleCollapse: false, - columns: 2, - layout: { - columns: 2, - type: 'table' - }, - items: [ - { - xtype: 'button', - frame: false, - id: 'btnClose', - scale: 'medium', - text: 'Close' - } - ] - }, - { - xtype: 'buttongroup', - border: '', - minButtonWidth: 100, - titleCollapse: false, - columns: 2, - layout: { - columns: 2, - type: 'table' - }, - items: [ - { - xtype: 'button', - id: 'btnNext', - scale: 'medium', - text: 'Next >' - } - ] - } - ] - } - ], - listeners: { - } - }); - - me.callParent(arguments); - }, - - onSLabelChange: function(field, newValue, oldValue, options) { - //Add new Label, by capturing the typing of the user - - }, - - onLocationsAdded: function(abstractcomponent, container, pos, options) { - // calculate consumed space of entry - }, - - onChkRunRegularChange: function(field, newValue, oldValue, options) { - Ext.Array.forEach(Ext.getCmp("fsSchedule").query("combobox,datefield,timefield,numberfield,checkboxgroup"), function(field) { - field.setDisabled(!newValue); - if (!Ext.isIE6 && field.el != null) { - field.el.animate({opacity: !newValue ? .5 : 1}); - } - }); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/LostConnectionWindow.js b/Duplicati/Server/webroot/Duplicati/view/LostConnectionWindow.js deleted file mode 100644 index 901d74d65..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/LostConnectionWindow.js +++ /dev/null @@ -1,67 +0,0 @@ -Ext.define('Duplicati.view.LostConnectionWindow', { - statics: { - dialogWindow: null, - setStatusAsRunning: function() { - if (this.dialogWindow != null) { - var txt = this.dialogWindow.queryById('status-window-lost-connection-text'); - var btn = this.dialogWindow.queryById('status-window-lost-connection-retry-button'); - btn.setDisabled(true); - txt.setText('Connection to server is lost, retrying ...'); - } - }, - - setStatusAsWaiting: function(seconds) { - if (Duplicati.service.updateRequestRunning) - { - this.setStatusAsRunning(); - } - else - { - if (this.dialogWindow != null) { - var txt = this.dialogWindow.queryById('status-window-lost-connection-text'); - var btn = this.dialogWindow.queryById('status-window-lost-connection-retry-button'); - txt.setText('Connection to server is lost, retry in ' + Duplicati.Utility.formatSecondsAsTime(seconds)); - btn.setDisabled(false); - } - } - }, - - hide: function() { - if (this.dialogWindow != null) - this.dialogWindow.hide(); - - }, - - show: function() { - if (this.dialogWindow == null) - this.dialogWindow = Ext.create('Ext.window.Window', { - title: 'Lost connection to server', - height: 200, - width: 400, - modal: true, - closable: false, - resizable: false, - buttonAlign: 'center', - closeAction: 'hide', - layout: 'fit', - items: [{ - xtype: 'label', - id: 'status-window-lost-connection-text', - text: 'Connection to server is lost, retrying ...' - }], - buttons: [{ - xtype: 'button', - id: 'status-window-lost-connection-retry-button', - text: 'Retry now', - disabled: true, - handler: function() { - Duplicati.service.reconnectNow(); - } - }] - }); - - this.dialogWindow.show(); - } - } -}); - diff --git a/Duplicati/Server/webroot/Duplicati/view/StatuswindowFooter.js b/Duplicati/Server/webroot/Duplicati/view/StatuswindowFooter.js deleted file mode 100644 index 51327b7d3..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/StatuswindowFooter.js +++ /dev/null @@ -1,37 +0,0 @@ -Ext.define('Duplicati.view.StatuswindowFooter' ,{ - extend: 'Ext.panel.Panel', - alias : 'widget.statuswindowfooter', - - title : 'Status line', - header: false, - border: 0, - layout: 'column', - cls: 'footer-panel', - - items: [{ - xtype: 'label', - html: 'A new version is available', - handler: function() { window.open('https://www.facebook.com/pages/Duplicati/105118456272281') }, - columnWidth: 1, - margin: 10 - },{ - xtype: 'button', - text: 'Facebook', - handler: function() { window.open('https://www.facebook.com/pages/Duplicati/105118456272281') }, - margin: 10 - },{ - xtype: 'button', - text: 'Google+', - handler: function() { window.open('https://plus.google.com/105271984558189185842/posts') }, - margin: 10 - },{ - xtype: 'button', - text: 'Donate!', - handler: function() { window.open('https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=paypal%40hexad%2edk&item_name=Duplicati%20Donation&no_shipping=2&no_note=1&tax=0¤cy_code=EUR&bn=PP%2dDonationsBF&charset=UTF%2d8&lc=US') }, - margin: 10 - }], - - initComponent: function() { - this.callParent(arguments); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/StatuswindowHeader.js b/Duplicati/Server/webroot/Duplicati/view/StatuswindowHeader.js deleted file mode 100644 index 004065214..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/StatuswindowHeader.js +++ /dev/null @@ -1,138 +0,0 @@ -Ext.define('Duplicati.view.StatuswindowHeader' ,{ - extend: 'Ext.panel.Panel', - alias : 'widget.statuswindowheader', - - title : 'Main App controls', - header: false, - border: 0, - layout: 'column', - cls: 'header-panel', - - items: [{ - xtype: 'button', - cls: 'main-button', - text: 'Duplicati', - iconCls: 'unused-marker', - minHeight: 35, - id: 'status-window-header-main-button', - margin: 10, - menu: [{ - id: 'status-window-header-pause-menu', - text: 'Pause Duplicati', - handler: function() { Duplicati.service.togglePause(); } - },{ - id: 'status-window-header-pause-duration-menu', - xtype: 'form', - layout: 'hbox', - plain: true, - items: [{ - xtype: 'label', - cls: 'x-menu-item-text', - text: 'Pause ' - },{ - id: 'status-window-header-pause-duration-picker', - cls: 'x-menu-item-text', - xtype: 'numberfield', - hideLabel: true, - minValue: 1, - maxValue: 600, - value: 5, - flex: 1, - handler: function() { Duplicati.service.pause('5m'); } - },{ - xtype: 'label', - cls: 'x-menu-item-text', - text: ' min.' - }] - }/*{ - text: 'Pause for x minutes', - menu: [{ - text: 'Pause for 5 minutes', - handler: function() { Duplicati.service.pause('5m'); } - },{ - text: 'Pause for 15 minutes', - handler: function() { Duplicati.service.pause('15m'); } - },{ - text: 'Pause for 30 minutes', - handler: function() { Duplicati.service.pause('30m'); } - },{ - text: 'Pause for 60 minutes', - handler: function() { Duplicati.service.pause('60m'); } - }] - }*/,{ - text: '*** Throttle ...' - },{ - xtype: 'menuseparator' - },{ - text: '*** Run backups', - menu: [{ - text: 'All backups' - },{ - text: 'Label: Work' - },{ - text: 'Label: Home' - },{ - text: 'Label: Amazon S3' - }] - },{ - xtype: 'menuseparator' - },{ - text: '*** Settings' - },{ - text: 'About', - handler: function() { Duplicati.view.AboutWindow.show(); } - }] - },{ - xtype: 'label', - html: ' ', - columnWidth: 1 - },{ - xtype: 'panel', - layout: 'vbox', - align: 'center', - margin: 5, - border: 0, - items: [{ - xtype: 'label', - cls: 'throttle-label', - text: '*** Throttle upload' - },{ - xtype: 'slider', - width: 200, - value: 80, - minValue: 0, - maxValue: 100 - }] - },{ - xtype: 'button', - cls: 'add-new-backup-button', - text: 'Add new backup', - iconCls: 'unused-marker', - minHeight: 35, - margin: 10, - handler: function() { - Ext.create('Ext.window.Window', { - title: 'Add new backup', - bodyBorder: false, - layout: 'fit', - items: { - xtype: 'backupconfigpanel' - } - }).show(); - } - },{ - xtype: 'button', - id: 'status-window-header-pause-button', - cls: 'pause-backup-button', - iconCls: 'backups-paused', - minHeight: 35, - text: 'Pause', - margin: 10, - handler: function() { Duplicati.service.togglePause(); } - }], - - initComponent: function() { - - this.callParent(arguments); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/override/BackupConfig.js b/Duplicati/Server/webroot/Duplicati/view/override/BackupConfig.js deleted file mode 100644 index 16da0421a..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/override/BackupConfig.js +++ /dev/null @@ -1,229 +0,0 @@ -Ext.define('Duplicati.view.override.BackupConfig', { - requires: 'Duplicati.view.BackupConfig' -}, function() { - Ext.override(Duplicati.view.BackupConfig, { - setFieldValue: function(fieldId, val) { - var field = this.getForm().findField(fieldId); - if (field) { - - field.setValue(val); - if (this.trackResetOnLoad) { - field.resetOriginalValue(); - } - return true; - - } else { - - Ext.log('No mapping for field ' + fieldId); - return false; - } - }, - - setValues: function(record, parentFieldName) { - var me = this; - var form = me.getForm(); - - function setVal(fieldId, val) { - if (parentFieldName) { - fieldId = parentFieldName + '.' + fieldId; - } - var field = form.findField(fieldId); - if (field) { - field.setValue(val); - if (me.trackResetOnLoad) { - field.resetOriginalValue(); - } - } else if(Ext.isObject(val)) { - me.setValues(val, fieldId); - } else { - Ext.log('No mapping for field ' + fieldId); - } - } - - if (record.getData) { - Ext.iterate(record.getData(), setVal); - - if (record.getAssociatedData && record.getAssociatedData()) { - for(k in record.getAssociatedData()) { - //The property name has a lower first character, but the method format is getCamelCase() - var propName = k[0].toUpperCase() + k.substring(1); - if (record['get' + propName] != null) - me.setValues(record['get' + propName](), parentFieldName + '.' + propName); - } - } - } - - return this; - }, - - updateRecord: function(record) { - var values = this.getFieldValues(), - name, - obj = {}; - - alert( "Servus updateRecord" ); - - function populateObj(record, values) { - var obj = {}, - name; - - record.fields.each(function(field) { - name = field.name; - if (field.model) { - var nestedValues = {}; - var hasValues = false; - for(var v in values) { - if (v.indexOf('.') > 0) { - var parent = v.substr(0, v.indexOf('.')); - if (parent == field.name) { - var key = v.substr(v.indexOf('.') + 1); - nestedValues[key] = values[v]; - hasValues = true; - } - } - } - if (hasValues) { - obj[name] = populateObj(Ext.create(field.model), nestedValues); - } - } else if (name in values) { - obj[name] = values[name]; - } - }); - return obj; - } - - obj = populateObj(record, values); - - record.beginEdit(); - record.set(obj); - record.endEdit(); - - return this; - }, - - setEncryptionModule: function(value) { - value = value || ''; - var form = this.getForm(); - var combo = form.findField('Task.EncryptionModule'); - var store = combo.getStore(); - - //Make sure we have the empty element - if (store.findRecord("id", -1) == null) { - store.add({encryptionMethodName: 'No encryption', encryptionMethodIdentifier: '', id: -1}); - } - - this.setFieldValue('Task.EncryptionModule', value); - }, - - setEncryptionPassword: function(value) { - value = value || ''; - - this.setFieldValue('sEncryptionPassword', value); - this.setFieldValue('sEncryptionPasswordCheck', value); - }, - - setBackupRepeatAndWhen: function(valueRepeat, valueWhen) { - valueWhen = valueWhen || ''; - valueRepeat = valueRepeat || ''; - - var form = this.getForm(); - var chk = form.findField('chkRunRegular'); - - if (valueWhen == '' || valueRepeat == '') { - chk.setValue(false); - } else { - chk.setValue(true); - - var date = Duplicati.Utility.parseJsonDate(valueWhen); - - this.setFieldValue('Schedule.Repeat.Number', parseInt(valueRepeat.substr(0, valueRepeat.length - 1))); - this.setFieldValue('Schedule.Repeat.Suffix', valueRepeat.substr(valueRepeat.length - 1, 1)); - - this.setFieldValue('Schedule.When.Time', date); - this.setFieldValue('Schedule.When.Date', date); - } - }, - - setAllowedWeekdays: function(value) { - var form = this.getForm(); - - var t = form.findField('Schedule.AllowedWeekdays'); - }, - - setVolumeSize: function(value) { - value = value || ''; - - var number = parseInt(value); - var suffix = 'b'; - - function isNumber(n) { - switch(n) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - return true; - default: - return false; - } - } - - if (value != '' && value.length >= 2) { - - var i = value.length - 1; - while(i >= 0 && !isNumber(value[i])) - i--; - - i++; - - suffix = value.substr(i, value.length - i).toLowerCase(); - number = parseInt(value.substr(0, i)); - } - - this.setFieldValue('Task.Extensions.VolumeSize.Number', number); - this.setFieldValue('Task.Extensions.VolumeSize.Suffix', suffix); - }, - - setSourcePaths: function(value) { - var store = Ext.getCmp('Locations').getStore(); - store.removeAll(); - - if (value != null && value != '') { - var pathSep = Duplicati.service.serverdata['system-info'].PathSeparator; - - Ext.Array.each(value.split(pathSep), function(rec){ - Ext.getCmp('Locations').getStore().add( - new Duplicati.model.TaskItems.BackupLocation ( { - Location: rec, - TotalSize:0 - }) - ); - }); - } - }, - - loadRecord: function(loaderObject) { - var schedule = loaderObject.getSchedule(); - var task = loaderObject.getTask(); - - this.setValues(schedule, "Schedule") - this.setValues(task, "Task") - - this.setEncryptionModule(task.getData().EncryptionModule); - this.setEncryptionPassword(task.getData().Encryptionkey); - - this.setBackupRepeatAndWhen(schedule.getData().Repeat, schedule.getData().When); - this.setAllowedWeekdays(schedule.getData().AllowedWeekdays); - this.setVolumeSize(task.getExtensions().getData().VolumeSize); - this.setSourcePaths(task.getData().SourcePath); - } - - - }); -}); diff --git a/Duplicati/Server/webroot/Duplicati/view/schedule/List.js b/Duplicati/Server/webroot/Duplicati/view/schedule/List.js deleted file mode 100644 index fbf94413c..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/schedule/List.js +++ /dev/null @@ -1,107 +0,0 @@ -Ext.define('Duplicati.view.schedule.List' ,{ - extend: 'Ext.grid.Panel', - alias : 'widget.schedulelist', - - title : 'All Schedules', - header: false, - border: 0, - id: 'status-window-schedule-list', - - hideHeaders: true, - selType: 'rowmodel', - - store: 'Schedules', - - elementTemplateStr: - '{Name}
' + - '' + - '' + - /* The template for this became un-readable, so now it is a function */ - '{[Duplicati.ListUtility.formatBackupScheduleDetails(values)]}' + - '' + - '' + - '
' + - '
Labels: {Path}' + - '
' + - '
' + - '
', - - - elementTemplate: null, - - elementContextMenu: Ext.create('Ext.menu.Menu', { - floating: true, - items: [{ - text: '*** Show files' - },{ - text: 'Run now', - handler: function() { - Ext.log('Running backup ' + Duplicati.ListUtility.currentScheduleId); - Duplicati.service.runBackup(Duplicati.ListUtility.currentScheduleId, false); - } - },{ - text: 'Run a full backup now', - handler: function() { - Ext.log('Running full backup ' + Duplicati.ListUtility.currentScheduleId); - Duplicati.service.runBackup(Duplicati.ListUtility.currentScheduleId, true); - } - },{ - text: '*** Cancel' - },{ - xtype: 'menuseparator' - },{ - text: 'Edit settings', - handler: function() { - Ext.create('Ext.window.Window', { - layout: 'fit', - bodyBorder: false, - title: 'Edit backup', - items: [ - Ext.create('Duplicati.view.BackupConfig', { - scheduleId: Duplicati.ListUtility.currentScheduleId - }) - ] - }).show(); - } - },{ - text: '*** Delete backup' - },{ - xtype: 'menuseparator' - },{ - text: '*** Create a copy' - }] - }), - - columns: - [ - {header: 'ScheduleTime', dataIndex: 'NextScheduledTime', flex: 0.8, align: 'center', renderer: - function(value, metaData, record) { - var schedulePos = Duplicati.service.getSchedulePosition(record.get("ID")); - if (schedulePos == 0) { - return '
In progress
Cancel
'; - } else if (schedulePos > 0) { - return '
No. ' + schedulePos + ' in queue
'; - } else if (value != null) { - var scdate = Duplicati.Utility.parseJsonDate(value); - if (scdate > new Date().getTime()) - return '
' + Duplicati.Utility.timeAgo(scdate) + '
'; - } - - return ''; - } - }, - {header: 'Name', dataIndex: 'Name', flex: 1, align: 'center', renderer: - function(value, metaData, record) { - return this.elementTemplate.apply(record.data); - } - }, - {header: 'Path', dataIndex: 'ID', flex: 0.8, align: 'left', renderer: - function(value) { return value; } - } - ], - - initComponent: function() { - this.elementTemplate = new Ext.XTemplate(this.elementTemplateStr, {formatSizeString: function(v) { return Duplicati.Utility.formatSizeString(v); } }); - this.callParent(arguments); - } -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/wndAddFilter.js b/Duplicati/Server/webroot/Duplicati/view/wndAddFilter.js deleted file mode 100644 index 7d6caff94..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/wndAddFilter.js +++ /dev/null @@ -1,14 +0,0 @@ -Ext.define('Duplicati.view.wndAddFilter', { - extend: 'Ext.window.Window', - - height: 342, - width: 550, - title: 'Add Filter', - - initComponent: function() { - var me = this; - - me.callParent(arguments); - } - -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/wndAddLocation.js b/Duplicati/Server/webroot/Duplicati/view/wndAddLocation.js deleted file mode 100644 index d14931fc2..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/wndAddLocation.js +++ /dev/null @@ -1,70 +0,0 @@ -Ext.define('Duplicati.view.wndAddLocation', { - extend: 'Ext.window.Window', - - height: 539, - id: 'winAddLocation', - width: 349, - title: 'Add Location', - modal: true, - - initComponent: function() { - var me = this; - - Ext.applyIf(me, { - items: [ - { - xtype: 'treepanel', - height: 467, - id: 'treeLocation', - iconCls: '', - title: 'My Computer', - hideHeaders: true, - store: 'MyComputerTreeStore', - folderSort: true, - rootVisible: false, - singleExpand: true, - useArrows: true, - viewConfig: { - autoScroll: true, - blockRefresh: true, - loadingText: 'Retrieving File Structure', - multiSelect: true, - simpleSelect: true - } - } - ], - dockedItems: [ - { - xtype: 'toolbar', - dock: 'bottom', - layout: { - pack: 'end', - type: 'hbox' - }, - items: [ - { - xtype: 'buttongroup', - columns: 2, - layout: { - columns: 2, - type: 'table' - }, - items: [ - { - xtype: 'button', - id: 'btnAddLocations', - maintainFlex: false, - scale: 'medium', - text: 'Add selected Nodes' - } - ] - } - ] - } - ] - }); - - me.callParent(arguments); - } - -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/Duplicati/view/wndCreateConnection.js b/Duplicati/Server/webroot/Duplicati/view/wndCreateConnection.js deleted file mode 100644 index 0629b8ff6..000000000 --- a/Duplicati/Server/webroot/Duplicati/view/wndCreateConnection.js +++ /dev/null @@ -1,16 +0,0 @@ -Ext.define('Duplicati.view.wndCreateConnection', { - extend: 'Ext.window.Window', - - height: 342, - id: 'wndCreateConnection', - width: 418, - title: 'Create Connection', - titleCollapse: false, - - initComponent: function() { - var me = this; - - me.callParent(arguments); - } - -}); \ No newline at end of file diff --git a/Duplicati/Server/webroot/app.js b/Duplicati/Server/webroot/app.js deleted file mode 100644 index f07bc1238..000000000 --- a/Duplicati/Server/webroot/app.js +++ /dev/null @@ -1,162 +0,0 @@ -function parseBool(v) { - if (v == null) - return false; - if (typeof(v) == 'boolean') - return v; - v = (v + '').toLowerCase(); - return (v == 'true' || v == 'on' || v == '1'); -} - - -{ -// This helps in a debug setup -var extdefined = false; -try { extdefined = Ext !== undefined; } catch (e) {} -if (!extdefined) { alert('ExtJS failed to load!\n If this is a debug build,\nplease download and extract:\n\nExtJS 4.2.0\n\ninto the folder:\nDuplicati/Server/webroot/extjs-4.2.0'); } -delete extdefined; -} - -Ext.application({ - requires: [ - 'Ext.container.Viewport', - 'Ext.layout.container.Border', - 'Duplicati.Service', - 'Duplicati.Utility', - 'Duplicati.ListUtility', - 'Duplicati.view.AboutWindow', - 'Duplicati.view.LostConnectionWindow', - - // Override for handling nested Model 2 Form - 'Duplicati.view.override.BackupConfig', - 'Duplicati.model.override.BackupJob' - ], - name: 'Duplicati', - appFolder: 'Duplicati', - - controllers: [ - 'Schedules', - 'StatuswindowHeader', - 'StatuswindowFooter', - 'BackupConfig' - ], - - stores: [ - 'LabelStore', - 'EncryptionMethodStore', - 'AdditionalPathStore', - 'MyComputerTreeStore', - 'BackupJob', - 'DefaultTimeRangesStore', - 'NewBackupChainWhenStore', - 'DeleteOldChainsWhenStore', - 'DefaultSizeRangeStore' - ], - - views: [ - 'BackupConfig', - 'wndAddLocation', - 'wndAddFilter', - 'wndCreateConnection' - ], - - models: [ - 'BackupJob', - 'Schedule', - 'Task', - 'TaskItems.BackupLocation', - 'TaskItems.CompressionSettings', - 'TaskItems.EncryptionSettings', - 'TaskItems.Overrides', - 'TaskItems.Extensions', - 'TaskItems.BackendSettings', - 'ScheduleItems.Metadata' - ], - - //This object encapsulates all access to the web service - service: null, - - launch: function() { - - Ext.log = function(msg) { - console.log(msg); - } - - //Pretend the app fires events too - this.addEvents('current-state-updated', 'count-down-pause-timer'); - - //Make a service object - this.service = new Duplicati.Service(); - //Make the service globally accesible - Duplicati.service = this.service; - Duplicati.instance = this; - Duplicati.utility = this.utility; - - //Pretend the app can fire the update event, this helps with initialization in controllers - this.service.on({ - 'current-state-updated': function(e) { - var updatedTitle = false; - if (e.ActiveScheduleId >= 0) { - var store = Ext.getStore('Schedules'); - if (store != null) { - var index = store.find('ID', e.ActiveScheduleId); - if (index >= 0) { - updatedTitle = true; - document.title = 'Duplicati backup - running ' + store.getAt(index).get('Name'); - } - } - } - - if (!updatedTitle) - { - if (e.SuggestedStatusIcon == 'Paused') - document.title = 'Duplicati backup - Paused'; - else - document.title = 'Duplicati backup - Ready'; - } - - this.fireEvent('current-state-updated', e); - }, - - 'lost-connection': function() { - Duplicati.view.LostConnectionWindow.show(); - }, - - 'reconnected': function() { - Duplicati.view.LostConnectionWindow.hide(); - }, - - 'lost-connection-retry': function() { - Duplicati.view.LostConnectionWindow.setStatusAsRunning(); - }, - - 'lost-connection-retry-delay': function(seconds) { - Duplicati.view.LostConnectionWindow.setStatusAsWaiting(seconds); - }, - - 'count-down-pause-timer': function(e) { - Duplicati.instance.fireEvent('count-down-pause-timer', e); - }, - scope: this - }); - - //Fetch the current status - this.service.updateCurrentState(); - - Ext.create('Ext.container.Viewport', { - layout: 'border', - items: [{ - region: 'center', - xtype: 'schedulelist' - },{ - region: 'north', - xtype: 'statuswindowheader' - },{ - region: 'south', - xtype: 'statuswindowfooter' - }], - - renderTo: Ext.getBody() - - }); - } -}); diff --git a/Duplicati/Server/webroot/icons/add-backup.png b/Duplicati/Server/webroot/icons/add-backup.png deleted file mode 100644 index 0940ab07d5dafacd47b4425419b205c3c84f7118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3496 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 diff --git a/Duplicati/Server/webroot/icons/drive.gif b/Duplicati/Server/webroot/icons/drive.gif deleted file mode 100644 index 042203fa5ae16e43728af00391593d29051c3504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmZ?wbhEHb6krfw`2L?^le@?E)U-`)UCWlOUbAM?`t@5kZrrkc`_66K_U_rUZ`ZDa zd-onX)YE_9z~LiDjvqX9;^@(nM~|L4apKg;lV{GIyL$2BwX0X}-M;<&oBx`LtyZSz<&nCpDc`A4F4H)K#m3F2?mZnhX0&09vc=MY~~Oai&0=~ zI^51DE};51r9=o8W~v>LOc{UGpV_9v2E0W(4wxPe@vj;CPskLp;W7Y89gs1EY9L)`g4)hj3!*GmH)+o-MmUJR;aVD=Q^Bkd!Mu*Hk;Rs8Q83v6^;hZvQ zQ6~Zyv2?PV)cm>d@i2QYyRr5Y0mto)oFYaHM?4Z29XwMnC#%81n8en=ujr&U?$1sp^WY zO|rY%mG*Y29_-URI!X7$RD;tqjL)^#o$IK-y*=pm_QEHV>i%EJ|9`vm|C9QQ6PvEi zYri_bd8UAz1cx+H`6y$JjF{m(TKP+KrXYfb;kV|K`xNpUa z0}GXz8x^t&o734-A{v>GckwW@RK;v? zXk_44&U>Jc=y>3Oq!H8U0*8gi+IUSg9A^B`XK3XT)nG`_+2Gi~z|X?Q!e9*mR0ykS diff --git a/Duplicati/Server/webroot/icons/hourglass.png b/Duplicati/Server/webroot/icons/hourglass.png deleted file mode 100644 index 5b36882bdae3c87063531b6c3bce82e14e10b762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46838 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

?6SH)Z4&uNaxq{+rRW8K{Lq;5}-5nGT9VF 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 diff --git a/Duplicati/Server/webroot/icons/hourglass2.png b/Duplicati/Server/webroot/icons/hourglass2.png deleted file mode 100644 index f6964802dcfa4e009c783ad278c7326727baea53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41967 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&i9Bd2>40S$%rVI=WoCO|{#S9GG!XV7ZFl&wk z0|S?Trn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st+~PJA;B-jY`@?8;^f`YFvUAR zNR&e%$f>(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D 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 Y?O*1pn0z*8U|?YIboFyt=akR{090=8YybcN diff --git a/Duplicati/Server/webroot/icons/main-logo.png b/Duplicati/Server/webroot/icons/main-logo.png deleted file mode 100644 index 1e291e564d8d845cc6538b68071cbbe04ef4ac99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNf2AR&z0iMpz3IRp=X_+~x z3=9>w*7oi7IvgP3aGtlxbzvCKqXz}*fdM|z>_;{KF63z1YNc{>mPv@F@1e6_m-9b- zaqZyIyXpl+B?2Pz510qcv9fSE@j#&|-Rl0s$B&s0Z<5}+EU+nYN$B#>$$hU+zEtNr zv&muV-Mk5EWxMzC3mgqR!EYBY$Z%e|Z1J@x`Da)I!<FdgVhgFh?llRqz z`-}_>tRbE*jv*0;w@%N_32_xUUT<9f{@u5Omo8oMimnXXut)R8B9o9_wNvbl%xZ2u z`Yz0FK0Qe)R|E`&d{l&-d|Xty)LfdJdS)arJ>8|}YwztfuDh|V zWOwu~5zCWL-rchZxLvozpm5gBCChr$ zbxUjR{5g1J;+bP!t(iHuocESn?>msXq(G^KS)jpf@r6@NiYHG;`Z&Jh=JB3CM?}C- zg86H&wMBe*<6((uTSB*SO?s)BTJ-Swj#$g>tVRk9r?Vcvc@}M|Ka<}bPksF z$JPdF`Fxx*H>D!&=$`3&Jz5s5tK;_iX?T|BnSF`M%d^UM`r`UAOP-xk^-6ztc(PsZ zzj;$Ho$QZUAD8MGHdNj>(AdU#99Pmc5PDJ$h|J+H`jLK{y%q~ z?~E37QdrvTb3SIurX)6}g2i70^ex=|r<|Kz%W>Gl(@Ir+^1kJ^J7#(;>HRlF$}MWW zoV&=zBX4)*3$!Y{c(R!P`s1%voGm(Y-kE&*^f_{WQk;_*&%;9n&-nI=eYtywZ~Mla zm#bT3^qBrJaLf9CMy9axm`J4ihZeA<*++`QB*5-TQU-mP{zW zR>yrvN{C@*%U_p2<~Jjy9kkDG7M)%2BKrO&F8SmjFP61OZJ8FZ9$Y8A!-rY-u8vMo zp*9~Y)7jnH^WW$Nd}nH4sDB>H!`XKF$jpSM>>cSR+|5=>7|cB!DCOd!dQ9W#1jZBp zc3LVjgsXXFZ)lpsd34fR(>ZnpDlhLCG;o{D-N#+>Gb_1Gzks#j%NwRM0UU}V(%0X< z$~#i!*YT)(Rhy&mlxtE;510JX6WSJ)9IMds6e?@uR_INmfRSGvQ90^N!?~+*Q6~O7ee3OI3c}$|FKWz;RRbPdwt{Un?kr6r+2Isj>=zczn4;3sqwl(CkTApIHOXZd?Wu}||A8@o{nzSggSW{0+;o6J3 z|GQovzj(R(1N*BPHi^tTmBm%^PD;(Ldsq|8>U3hqv{fm;?1F-iseITfXTm$*;`cRssYIXh0F@W}ttPnoxN`z312Z(jaS z;`)mt1{W?@g@;aGuu)j6)UtR+LOt^erfzA?bR5!qkr* zMY%h3*?)dM@>t`k`~joZ%V!R~-8FwrkI|iVHB-1QzO?p^b~im(pzPHu=#+H3E=?p? z*}Ax{D7W(dgVifzeS=TeEiuV=E}q}*_5H<77tQWTlGUF6x_dTvd&XNu-|i0#{wjGkvP67#J8BJYD@< J);T3K0RVh)KS2Nh diff --git a/Duplicati/Server/webroot/icons/schedule-active.png b/Duplicati/Server/webroot/icons/schedule-active.png deleted file mode 100644 index f8c8ec683edd6a974eacc253332f903d643dbe41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^zbpD<_bdda}R zAX(xXQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGS!BGfhpe8#WBR<^wP<``9gsr zZNHiSu>RqT*i~|P-7LLb#)Zj;jva9g4p%k3>YB`zs1xWj`x={;VD_qQDI&HJA_p7${xxUnKnr^#`u=hVonPXeAj zG(SB54hU6JR9_Nq>Zx+LMJTz6x_D`A=idd$x~nXru^v3+q79a<=xti zH~JWPee8a*x2E!NOZ?3zr^njct1RwcKP=hJj?~+yaX=QH#A3&O|)9rS)fK#-l)vKZbloqMZ^a zPpPiidEGLl^I)NgAJ2vw-eV3-=VcH4=$ZfL^rlN2y7Y9`@43QzCVrpVi(NMw+m^i8 zoAls_OfBoVIonU1UD91zu;We@x7v1lXHhTH7vCEjesXtCv9|l%d4OZtXIWB8w z%QGvT=4X2C>$;w8I;ZjSZkro1a)q}xeyyJ97G8NzcH6ot^O*rE%&cJw#s}vKSMqIR z4xCZ0V;KDHd;R)PFOqltR?44QyU*7)GG?Ky|J*xGb05jwj`_0Xtoz+%lm6HF{Qo?s ao>8_!H2ln=d8!Ny3=E#GelF{r5}E+)nL_RW diff --git a/Duplicati/Server/webroot/icons/schedule-in-queue.png b/Duplicati/Server/webroot/icons/schedule-in-queue.png deleted file mode 100644 index fb4ebc850a94b2c8c59502f38230ac54f164dc7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 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 diff --git a/Duplicati/Server/webroot/icons/status-play.png b/Duplicati/Server/webroot/icons/status-play.png deleted file mode 100644 index 6941af7fac9a87c8d55a30afa9d5874190b361eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3453 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 - - - - -Duplicati Backup - - - - - - - - - - - - - - - - diff --git a/Duplicati/Server/webroot/stylesheets/status-window.css b/Duplicati/Server/webroot/stylesheets/status-window.css deleted file mode 100644 index 7b1b8296f..000000000 --- a/Duplicati/Server/webroot/stylesheets/status-window.css +++ /dev/null @@ -1,217 +0,0 @@ -.footer-panel .x-panel-body -{ - background-color: #ccffcc; -} - -.header-panel .x-panel-body -{ - background-color: #ccffcc; -} - -.main-button .x-btn-arrow, .add-new-backup-button .x-btn-center, .pause-backup-button .x-btn-center -{ - height: 40px; -} - -.main-button .x-btn-inner, .add-new-backup-button .x-btn-inner, .pause-backup-button .x-btn-inner -{ - font-size: 2em; - height: 20px; - padding-left: 36px; -} - -.main-button .x-btn-icon, .add-new-backup-button .x-btn-icon, .pause-backup-button .x-btn-icon -{ - width: 32px; - height: 32px; - top: 4px; -} - -.main-button .x-btn-icon -{ - background-image: url(../icons/main-logo.png); -} - -.add-new-backup-button .x-btn-icon -{ - background-image: url(../icons/add-backup.png); -} - -.pause-backup-button .backups-paused -{ - background-image: url(../icons/status-play.png); -} - -.pause-backup-button .backups-running -{ - background-image: url(../icons/status-pause.png); -} - -.throttle-label -{ - font-size: 2em; - padding-left: 20px; -} - -.low-storage-space -{ - color: red; -} - -.important-information -{ - font-weight: bold; -} - -.info-icon -{ - padding: 8px; - margin-right: 4px; - margin-top: 40px; - background-repeat: no-repeat; - background-position-y: 4px; - display: inline; - float: right; -} - -.schedule-activity-text -{ - margin-top: 40px; - margin-right: 20px; - display: inline; - float: right; -} - -.schedule-waiting -{ - background: url(../icons/schedule-waiting.png) - -} - -.schedule-active -{ - background: url(../icons/schedule-active.png) - -} - -.schedule-in-queue -{ - background: url(../icons/schedule-in-queue.png) - -} - -.backup-schedule-tags -{ - padding-top: 2px; -} - -.marker-time-ago -{ - display: none; -} - -.backup-schedule-detail-source-size, -.backup-schedule-detail-backup-size, -.backup-schedule-detail-free-size, -.backup-schedule-detail-change-count, -.backup-schedule-detail-last-backup, -.backup-schedule-tags -{ - display: block; - padding-left: 15px; - padding-right: 15px; - text-align: left; -} - -.backup-schedule-details-inner -{ - padding-left: 15px; - padding-right: 15px; - text-align: left; -} - -.backup-schedule-name -{ - display: block; - border: 1px lightgrey solid; - margin-left: 20px; - margin-right: 20px; - padding-top: 8px; - padding-bottom: 8px; - margin-top: 10px; - background-color: #aaeeaa; - - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - -khtml-border-radius: 6px; - border-radius: 6px; -} - -.backup-schedule-drop-arrow -{ - background-image: url(../extjs-4.1.0/resources/themes/images/default/button/arrow.gif); - background-repeat: no-repeat; - width: 16px; - height: 10px; - background-position-x: 6px; - display: inline-block; -} - -.backup-schedule-name-inner -{ - display: block; - font-weight: bold; - font-size: 1.5em; - overflow: hidden; - white-space: wrap; - margin-left: 8px; - margin-right: 8px; - padding-top: 2px; - padding-bottom: 4px; - cursor: pointer; -} - -.backup-schedule-details -{ - display: block; - border: 1px lightgrey solid; - padding-top: 10px; - padding-bottom: 8px; - padding-left: 4px; - padding-right: 4px; - overflow: auto; - white-space: normal; - margin-bottom: 10px; - background-color: #ccffcc; - margin-top: -2px; - font-size: 1.2em; - - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - -khtml-border-radius: 6px; - border-radius: 6px; -} - -#status-window-header-pause-duration-menu -{ - color: #222; - font-size: 11px; -} - -#status-window-header-pause-duration-menu div -{ - padding-left: 32px; - border: 0px none; - background-color: transparent; -} - -#status-window-header-pause-duration-picker -{ - margin-left: 6px; - margin-right: 6px; -} -#status-window-header-pause-duration-picker div -{ - padding-left: 0px; -} - diff --git a/Duplicati/Server/webroot/test-add.html b/Duplicati/Server/webroot/test-add.html deleted file mode 100644 index 27ec303f6..000000000 --- a/Duplicati/Server/webroot/test-add.html +++ /dev/null @@ -1,71 +0,0 @@ - - - -

- -
- -
- - -
- - - - - \ No newline at end of file diff --git a/Duplicati/Server/webroot/test-update.html b/Duplicati/Server/webroot/test-update.html deleted file mode 100644 index 2f85f7227..000000000 --- a/Duplicati/Server/webroot/test-update.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -
- - -
- -
- - -
- - -
- - \ No newline at end of file