{"version":3,"sources":["updater/src/Updater.js"],"names":["$","Craft","Updater","Garnish","Base","extend","$graphic","$status","error","actionPrefix","init","parseStatus","escapeHtml","status","html","replace","showErrorDetails","this","tabindex","details","appendTo","showStatus","data","id","postActionRequest","textStatus","setState","response","action","complete","noop","proxy","jqXHR","handleFatalError","state","errorDetails","nextAction","showOptions","returnUrl","showError","option","options","finished","onFinish","submit","$button","class","i","length","email","attr","getEmailLink","text","label","$buttonContainer","addListener","url","onOptionSelect","ev","encodeURIComponent","subject","addClass","window","body","location","getUrl","t","statusText","responseText","jQuery"],"mappings":"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","file":"Updater.min.js","sourcesContent":["(function($) {\n    /** global: Craft */\n    /** global: Garnish */\n    Craft.Updater = Garnish.Base.extend({\n        $graphic: null,\n        $status: null,\n        error: null,\n        data: null,\n        actionPrefix: null,\n\n        init: function(actionPrefix) {\n            this.actionPrefix = actionPrefix;\n            this.$graphic = $('#graphic');\n            this.$status = $('#status');\n        },\n\n        parseStatus: function(status) {\n            return '<p>' +\n                Craft.escapeHtml(status)\n                    .replace(/\\n{2,}/g, '</p><p>')\n                    .replace(/\\n/g, '<br>')\n                    .replace(/`(.*?)`/g, '<code>$1</code>') +\n                '</p>';\n        },\n\n        showStatus: function(status) {\n            this.$status.html(this.parseStatus(status));\n        },\n\n        showError: function(error) {\n            this.$graphic.addClass('error');\n            this.showStatus(error);\n        },\n\n        showErrorDetails: function(details) {\n            $('<div/>', {\n                id: 'error',\n                class: 'code',\n                tabindex: 0,\n                html: this.parseStatus(details),\n            }).appendTo(this.$status);\n        },\n\n        postActionRequest: function(action) {\n            var data = {\n                data: this.data\n            };\n\n            Craft.postActionRequest(this.actionPrefix + '/' + action, data, $.proxy(function(response, textStatus, jqXHR) {\n                if (textStatus === 'success') {\n                    this.setState(response);\n                } else {\n                    this.handleFatalError(jqXHR);\n                }\n            }, this), {\n                complete: $.noop\n            });\n        },\n\n        setState: function(state) {\n            this.$graphic.removeClass('error');\n\n            // Data probably won't be set if this is coming from an option\n            if (state.data) {\n                this.data = state.data;\n            }\n\n            if (state.status) {\n                this.showStatus(state.status);\n            } else if (state.error) {\n                this.showError(state.error);\n                if (state.errorDetails) {\n                    this.showErrorDetails(state.errorDetails);\n                }\n            }\n\n            if (state.nextAction) {\n                this.postActionRequest(state.nextAction);\n            } else if (state.options) {\n                this.showOptions(state);\n            } else if (state.finished) {\n                this.onFinish(state.returnUrl);\n            }\n        },\n\n        showOptions: function(state) {\n            var $buttonContainer = $('<div/>', {id: 'options', 'class': 'buttons'}).appendTo(this.$status);\n\n            for (var i = 0; i < state.options.length; i++) {\n                var option = state.options[i],\n                    $button = $('<a/>', {\n                        'class': 'btn big',\n                        text: option.label\n                    }).appendTo($buttonContainer);\n\n                if (option.submit) {\n                    $button.addClass('submit');\n                }\n\n                if (option.email) {\n                    $button.attr('href', this.getEmailLink(state, option));\n                } else if (option.url) {\n                    $button.attr('href', option.url);\n                    $button.attr('target', '_blank');\n                } else {\n                    $button.attr('role', 'button');\n                    this.addListener($button, 'click', option, 'onOptionSelect');\n                }\n            }\n        },\n\n        getEmailLink: function(state, option) {\n            var link = 'mailto:' + option.email +\n                '?subject=' + encodeURIComponent(option.subject || 'Craft update failure');\n\n            var body = 'Describe what happened here.';\n            if (state.errorDetails) {\n                body += '\\n\\n-----------------------------------------------------------\\n\\n' + state.errorDetails;\n            }\n            link += '&body=' + encodeURIComponent(body);\n\n            return link;\n        },\n\n        onOptionSelect: function(ev) {\n            this.setState(ev.data);\n        },\n\n        onFinish: function(returnUrl) {\n            this.$graphic.addClass('success');\n\n            // Redirect in a moment\n            setTimeout(function() {\n                if (returnUrl) {\n                    window.location = Craft.getUrl(returnUrl);\n                } else {\n                    window.location = Craft.getUrl('dashboard');\n                }\n            }, 750);\n        },\n\n        handleFatalError: function(jqXHR) {\n            var details = Craft.t('app', 'Status:') + ' ' + jqXHR.statusText + '\\n\\n' +\n                Craft.t('app', 'Response:') + ' ' + jqXHR.responseText + '\\n\\n';\n\n            this.setState({\n                error: Craft.t('app', 'A fatal error has occurred:'),\n                errorDetails: details,\n                options: [\n                    {\n                        label: Craft.t('app', 'Troubleshoot'),\n                        url: 'https://craftcms.com/guides/failed-updates'\n                    }, {\n                        label: Craft.t('app', 'Send for help'),\n                        email: 'support@craftcms.com'\n                    }\n                ]\n            });\n\n            // Tell Craft to disable maintenance mode\n            Craft.postActionRequest(this.actionPrefix + '/finish', {data: this.data});\n        }\n    });\n})(jQuery);\n"]}