app = angular.module('BitsAnyBackup', ['ui.bootstrap']) app.filter 'html', ($sce) -> (input) -> $sce.trustAsHtml(input) updateEmail = (email) -> -> $parentScope = angular.element("#dashboard").scope() $parentScope.$apply -> $parentScope.email = email updateStatus = () -> $parentScope = angular.element("#dashboard").scope() $parentScope.$apply -> $parentScope.updateStatus() $parentScope.updateBackupsForChosenDay() supportMessage = () -> $parentScope = angular.element("#dashboard").scope() $parentScope.$apply -> $parentScope.supportMessageSent() getEmail = () -> $parentScope = angular.element("#dashboard").scope() $parentScope.email planChanged = () -> $parentScope = angular.element("#dashboard").scope() $parentScope.$apply -> $parentScope.paid=true app.controller "BitsSettingsModal", ($scope, $http, $modalInstance) -> $scope.dismiss = -> $modalInstance.dismiss('cancel') $scope.getSites = -> request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_get_sites" } } request.success (data, status) -> $scope.sites = data['sites'] $scope.selected_site = data['current_site_id'] # Default the name for site in $scope.sites if $scope.selected_site == site.id && site.name == null site.name = "New site" $scope.saveSettings = -> data = { action: "bits_backup_save_settings" selected_site: $scope.selected_site } request = $http { url: ajaxurl, method: "POST", params: data } request.success (data, status, headers, config) => setTimeout updateStatus, 1 if(data.status == 200) $modalInstance.dismiss('complete') # TODO: error handling? $scope.getSites() app.controller "BitsSupportModal", ($scope, $http, $modalInstance, $modal) -> $scope.dismiss = -> $modalInstance.dismiss('cancel') $scope.upgradeToPaid = -> $modalInstance.dismiss('cancel') content = angular.element('#upgradeModal').html() $modal.open({ template: content, controller: 'BitsUpgradeModal', size: 'lg' }) $scope.sendSupport = -> data = { action: "bits_backup_send_support", content: $scope.content, urgent: $scope.urgent } request = $http { url: ajaxurl, method: "POST", params: data } request.success (data, status, headers, config) => if(data.status == 200) setTimeout supportMessage, 1 $modalInstance.dismiss('complete') else $scope.error = data # TODO: error handling? app.controller "BitsUpgradeModal", ($scope, $http, $modalInstance) -> $scope.loadPlans = -> request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_get_plans" } } request.success (data, status, headers, config) => $scope.plans = data.plans $scope.loadPlans() $scope.getStripeToken = () -> DEV_TOKEN="pk_096woK2npZnBc1cPETWmMsNmjod7e" PROD_TOKEN="pk_096wf6Q6pH1974ZLUF8lZXTUh3Ceg" if(window.location.href.match(/localhost/)) DEV_TOKEN else PROD_TOKEN $scope.dismiss = -> $modalInstance.dismiss('cancel') $scope.getPlan = (name) -> (plan for plan in $scope.plans when plan.name is name)[0] $scope.cancelAccount = ()-> plan_id = $scope.getPlan('free').id if(confirm("Are you sure you want to cancel your account? This may stop backup of your sites.")) $scope.updateAccount(plan_id) $scope.updateAccount = (plan_id, token_id=null)-> params = { action: "bits_backup_update_account", plan_id: plan_id, token: token_id } request = $http { url: ajaxurl, method: "POST", params:params } request.success (data, status, headers, config) => $scope.status = data.status setTimeout planChanged, 1 request.error (data, status, headers, config) => $scope.status = 500 $scope.openCheckout = (plan) -> handler = StripeCheckout.configure key: $scope.getStripeToken(), image: 'https://anybackup.io/images/logo-512x512.png', email: getEmail(), token: (token) -> $scope.updateAccount(plan.id, token.id) handler.open name: 'AnyBackup ' + plan.name, description: plan.price+'/m', amount: plan.price_in_cents app.controller "BitsLoginModal", ($scope, $http, $modalInstance) -> $scope.dismiss = -> $modalInstance.dismiss('cancel') $scope.loginAccount = -> $scope.loginFormSubmitting=true data = { action: "bits_login_account", email: $scope.email_input, password: $scope.password_input } request = $http { url: ajaxurl, method: "POST", params: data } request.success (data, status, headers, config) => $scope.status = data.status $scope.loginFormSubmitting=false if(data.status == 200) setTimeout updateEmail(data.email), 1 $modalInstance.dismiss('complete') request.error (data, status, headers, config) => $scope.loginFormSubmitting=false $scope.status = 500 false app.controller "BitsRegistrationModal", ($scope, $modalInstance, $http) -> $scope.dismiss = -> $modalInstance.dismiss('cancel') $scope.registerUser = -> $scope.registerFormSubmitting=true data = { action: "bits_register_account", email: $scope.email_input, password: $scope.password_input } request = $http { url: ajaxurl, method: "POST", params: data } request.success (data, status, headers, config) => if(data.status == 200) if(data.error) $scope.registerFormSubmitting=false $scope.error = data.error else setTimeout updateEmail(data.email), 1 $modalInstance.dismiss('complete') request.error (data, status, headers, config) => $scope.registerFormSubmitting=false $scope.error = "Error communicating with server" app.controller "BitsAnyBackupDashboard", ($scope, $http, $modal, $rootScope) -> $scope.selectedCalendarDate = new Date() $scope.format = 'dd-MMMM-yyyy' $scope.backups = [] $scope.loading = true $scope.plans = ['free', 'professional'] $scope.setInitialNextRunTimestamp = (timestamp) -> if(timestamp.length > 0) $scope.state = 'enabled' else $scope.state = 'welcome' $scope.dateOptions = { formatYear: 'yy', startingDay: 1 } $scope.updateBackupsForChosenDay = -> request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_for_date", date: $scope.selectedCalendarDate } } request.success (data, status, headers, config) => $scope.backups = data.backups $scope.loading = false #request.error (data, status, headers, config) => $scope.selectBackup = (backup) -> $scope.selectedBackup = backup request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_get_backup", id: backup.id } } request.success (data, status, headers, config) => $scope.selectedBackup = data #request.error (data, status, headers, config) => $scope.editName = () -> $scope.editingName=true focus = -> angular.element("#edit-name")[0].focus() window.setTimeout focus, 1 $scope.saveName = () -> $scope.editingName=false request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_update_backup", id: $scope.selectedBackup.id name: $scope.selectedBackup.name } } request.success (data, status, headers, config) => console?.log("Updated name.") $scope.open = ($event) -> $event.preventDefault() $event.stopPropagation() $scope.opened = true $scope.openSettings = -> content = angular.element('#settingsModal').html() $modal.open({ template: content, controller: 'BitsSettingsModal', size: 'sm' }) $scope.openSupport = -> content = angular.element('#supportModal').html() $modal.open({ template: content, controller: 'BitsSupportModal', size: 'sm' }) $scope.openUpgrade = -> content = angular.element('#upgradeModal').html() $modal.open({ template: content, controller: 'BitsUpgradeModal', size: 'lg' }) $scope.openLogin = -> content = angular.element('#loginModal').html() $modal.open({ template: content, controller: 'BitsLoginModal', size: 'sm' }) $scope.openRegister = -> content = angular.element('#registrationModal').html() $modal.open({ template: content, controller: 'BitsRegistrationModal', size: 'sm' }) $scope.enableBackups = -> $scope.backup_running = true data = { action: "bits_backup_start_job" } request = $http { url: ajaxurl, method: "POST", params: data } request.success -> $scope.state = "enabled" $scope.step_description = "Starting your backup" $scope.forceBackupNow = -> $scope.backup_running = true data = { action: "bits_backup_force_backup_now" } request = $http { url: ajaxurl, method: "POST", params: data } request.success -> $scope.state = "enabled" $scope.step_description = "Starting your backup" $scope.readableDate = (backup) -> if(backup && backup.committed_at) localTimeZone = new Date().getTimezoneOffset() moment.parseZone(backup.committed_at).zone(localTimeZone/60).calendar() else "" $scope.supportMessageSent = -> $scope.showSupportMessage = true $scope.restoreFromBackup = -> $scope.restore_running = true data = { action: "bits_restore_from_backup", id: $scope.selectedBackup.id } request = $http { url: ajaxurl, method: "post", params: data } #request.success -> $scope.step_description = "Starting restore. You can cancel at any step." $scope.cancel = () -> data = { action: "bits_force_cancel" } request = $http { url: ajaxurl, method: "POST", params: data } request.success -> $scope.backup_running = false $scope.restore_running = false $scope.step_description = "Cancelled." $scope.updateStatus() $scope.step_description = "Cancelling..." $scope.updateStatus = -> request = $http { url: ajaxurl, method: "GET", params: { action: "bits_backup_get_status" } } $scope.calls = 0 request.success (data, status, headers, config) => $scope.email=data.email $scope.status_known = true $scope.backup_allowed = data.backup_allowed $scope.restore_allowed = data.restore_allowed $scope.disabled_reason = data.disabled_reason $scope.previews_allowed = data.previews_allowed $scope.previews_remaining = data.previews_remaining $scope.onboarding_status = data.onboarding_status $rootScope.paid = data.paid $rootScope.plan = data.plan # if backup/restore running if(data.backup_id || data.restore_id) $scope.percent_complete = data.percent_complete if($scope.percent_complete < 15) $scope.percent_complete = 15 $scope.step_description = data.step_description $scope.status = data.status $scope.backup_running = data.backup_id $scope.restore_running = data.restore_id else if($scope.backup_running) $scope.updateBackupsForChosenDay() $scope.backup_running = false $scope.restore_running = false $scope.percent_complete = 0 if(data.next_scheduled_backup == false) $scope.step_description = "" else readable_time = moment().add(data.next_scheduled_backup, "seconds").fromNow() $scope.step_description = "Your next backup starts #{readable_time}. " request.finally -> clearTimeout($scope.updateStatusTimeout) if $scope.updateStatusTimeout $scope.updateStatusTimeout = setTimeout($scope.updateStatus, 7000) $scope.updateStatus() $scope.status = "Loading" $scope.step_number = -1 $scope.updateBackupsForChosenDay()