{"version":3,"sources":["updates/src/UpdatesUtility.js"],"names":["$","Craft","UpdatesUtility","Garnish","Base","extend","$body","showUpdates","criticalUpdateAvailable","allowUpdates","init","$status","installableUpdates","forceRefresh","processUpdate","updates","cms","info","this","plugins","length","i","remove","headingText","text","t","createUpdateForm","insertAfter","addClass","Update","updateInfo","update","installable","isPlugin","releases","abandoned","label","push","value","$form","append","getCsrfInput","type","name","packageName","handle","latestVersion","$releaseContainer","class","licenseSubmitAction","updatesPage","$container","$header","createPane","$contents","initReleases","$showAllLink","licenseHud","status","createHeading","statusText","insertBefore","ctaUrl","appendTo","href","createCta","releaseInfo","$buttonContainer","$headingContainer","ctaText","createContainer","FieldToggle","Release","notesId","Math","floor","random","notes","critical","formatDate","data-target","createReleaseNotes","version","date","$notes","id","maxInitialUpdateHeight","html","find","jQuery"],"mappings":"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","file":"UpdatesUtility.min.js","sourcesContent":["(function($) {\n    /** global: Craft */\n    /** global: Garnish */\n    Craft.UpdatesUtility = Garnish.Base.extend({\n        $body: null,\n        showUpdates: false,\n        criticalUpdateAvailable: false,\n        allowUpdates: null,\n        installableUpdates: null,\n\n        init: function() {\n            this.$body = $('#content');\n\n            var $graphic = $('#graphic'),\n                $status = $('#status');\n\n            this.installableUpdates = [];\n\n            var data = {\n                forceRefresh: true,\n                includeDetails: true\n            };\n\n            Craft.cp.checkForUpdates(true, true, function(info) {\n                this.allowUpdates = info.allowUpdates;\n\n                // Craft CMS update?\n                if (info.updates.cms) {\n                    this.processUpdate(info.updates.cms, false);\n                }\n\n                // Plugin updates?\n                if (info.updates.plugins && info.updates.plugins.length) {\n                    for (var i = 0; i < info.updates.plugins.length; i++) {\n                        this.processUpdate(info.updates.plugins[i], true);\n                    }\n                }\n\n                if (this.showUpdates) {\n                    $graphic.remove();\n                    $status.remove();\n\n                    if (this.installableUpdates.length) {\n                        // Add the page title\n                        var headingText = Craft.t('app', '{num, number} {num, plural, =1{Available Update} other{Available Updates}}', {\n                            num: this.installableUpdates.length,\n                        });\n\n                        $('#header h1').text(headingText);\n                    }\n\n                    if (this.allowUpdates && this.installableUpdates.length > 1) {\n                        this.createUpdateForm(Craft.t('app', 'Update all'), this.installableUpdates)\n                            .insertAfter($('#header > .flex:last'));\n                    }\n                } else {\n                    $graphic.addClass('success');\n                    $status.text(Craft.t('app', 'You’re all up-to-date!'));\n                }\n            }.bind(this));\n        },\n\n        processUpdate: function(updateInfo, isPlugin) {\n            if (updateInfo.releases.length || updateInfo.abandoned) {\n                this.showUpdates = true;\n                var update = new Update(this, updateInfo, isPlugin);\n                if (update.installable) {\n                    this.installableUpdates.push(update);\n                }\n            }\n        },\n\n        createUpdateForm: function(label, updates) {\n            var $form = $('<form/>', {\n                method: 'post'\n            });\n\n            $form.append(Craft.getCsrfInput());\n            $form.append($('<input/>', {\n                type: 'hidden',\n                name: 'action',\n                value: 'updater'\n            }));\n            $form.append($('<input/>', {\n                type: 'hidden',\n                name: 'return',\n                value: 'utilities/updates'\n            }));\n\n            for (var i = 0; i < updates.length; i++) {\n                $form.append($('<input/>', {\n                    type: 'hidden',\n                    name: 'install[' + updates[i].updateInfo.handle + ']',\n                    value: updates[i].updateInfo.latestVersion\n                }));\n                $form.append($('<input/>', {\n                    type: 'hidden',\n                    name: 'packageNames[' + updates[i].updateInfo.handle + ']',\n                    value: updates[i].updateInfo.packageName\n                }));\n            }\n\n            $form.append($('<button/>', {\n                type: 'submit',\n                text: label,\n                class: 'btn submit'\n            }));\n\n            return $form;\n        }\n    });\n\n    var Update = Garnish.Base.extend({\n        updateInfo: null,\n        isPlugin: null,\n        installable: false,\n\n        $container: null,\n        $header: null,\n        $contents: null,\n        $releaseContainer: null,\n        $showAllLink: null,\n\n        licenseHud: null,\n        $licenseSubmitBtn: null,\n        licenseSubmitAction: null,\n\n        init: function(updatesPage, updateInfo, isPlugin) {\n            this.updatesPage = updatesPage;\n            this.updateInfo = updateInfo;\n            this.isPlugin = isPlugin;\n            this.installable = !!this.updateInfo.releases.length;\n\n            this.createPane();\n            this.initReleases();\n            this.createHeading();\n            this.createCta();\n\n            // Is the plugin abandoned?\n            if (this.updateInfo.abandoned) {\n                $('<blockquote class=\"note\"><p>' + this.updateInfo.statusText + '</p></blockquote>').insertBefore(this.$releaseContainer);\n            }\n            // Any ineligible releases?\n            else if (this.updateInfo.status !== 'eligible') {\n                $('<blockquote class=\"note ineligible\"><p>' + this.updateInfo.statusText + '</p></blockquote>').insertBefore(this.$releaseContainer);\n\n                if (this.updateInfo.status === 'expired' || this.updateInfo.latestVersion === null) {\n                    this.installable = false;\n                }\n            }\n        },\n\n        createPane: function() {\n            this.$container = $('<div class=\"update\"/>').appendTo(this.updatesPage.$body);\n            this.$header = $('<div class=\"update-header\"/>').appendTo(this.$container);\n            this.$contents = $('<div class=\"readable\"/>').appendTo(this.$container);\n            this.$releaseContainer = $('<div class=\"releases\"/>').appendTo(this.$contents);\n        },\n\n        createHeading: function() {\n            $('<div class=\"readable left\"/>').appendTo(this.$header).append(\n                $('<h1/>', {text: this.updateInfo.name})\n            );\n        },\n\n        createCta: function() {\n            if (!this.updatesPage.allowUpdates || !this.updateInfo.latestVersion || this.updateInfo.ctaUrl === false) {\n                return;\n            }\n\n            var $buttonContainer = $('<div class=\"buttons right\"/>').appendTo(this.$header);\n            if (typeof this.updateInfo.ctaUrl !== 'undefined') {\n                $('<a/>', {\n                    'class': 'btn submit',\n                    text: this.updateInfo.ctaText,\n                    href: this.updateInfo.ctaUrl\n                }).appendTo($buttonContainer);\n            } else {\n                this.updatesPage.createUpdateForm(this.updateInfo.ctaText, [this])\n                    .appendTo($buttonContainer);\n            }\n        },\n\n        initReleases: function() {\n            for (var i = 0; i < this.updateInfo.releases.length; i++) {\n                new Release(this, this.updateInfo.releases[i]);\n            }\n        }\n    });\n\n    var Release = Garnish.Base.extend({\n        update: null,\n        releaseInfo: null,\n        notesId: null,\n\n        $container: null,\n        $headingContainer: null,\n\n        init: function(update, releaseInfo) {\n            this.update = update;\n            this.releaseInfo = releaseInfo;\n            this.notesId = 'notes-' + Math.floor(Math.random() * 1000000);\n\n            this.createContainer();\n            this.createHeading();\n\n            if (this.releaseInfo.notes) {\n                this.createReleaseNotes();\n                new Craft.FieldToggle(this.$headingContainer);\n            }\n        },\n\n        createContainer: function() {\n            this.$container = $('<div class=\"pane release\"/>').appendTo(this.update.$releaseContainer);\n\n            if (this.releaseInfo.critical) {\n                this.$container.addClass('critical');\n            }\n        },\n\n        createHeading: function() {\n            if (this.releaseInfo.notes) {\n                this.$headingContainer = $('<a/>', {'class': 'release-info fieldtoggle', 'data-target': this.notesId});\n            } else {\n                this.$headingContainer = $('<div/>', {'class': 'release-info'});\n            }\n            this.$headingContainer.appendTo(this.$container);\n            $('<h2/>', {text: this.releaseInfo.version}).appendTo(this.$headingContainer);\n            if (this.releaseInfo.critical) {\n                $('<strong/>', {'class': 'critical', text: Craft.t('app', 'Critical')}).appendTo(this.$headingContainer);\n            }\n            if (this.releaseInfo.date) {\n                $('<span/>', {'class': 'date', text: Craft.formatDate(this.releaseInfo.date)}).appendTo(this.$headingContainer);\n            }\n        },\n\n        createReleaseNotes: function() {\n            var $notes = $('<div/>', {id: this.notesId})\n                .appendTo(this.$container)\n                .append($('<div/>', {'class': 'release-notes'}).html(this.releaseInfo.notes));\n\n            // Auto-expand if this is a critical release, or there are any tips/warnings in the release notes\n            if (this.releaseInfo.critical || $notes.find('blockquote').length) {\n                this.$headingContainer.addClass('expanded');\n            } else {\n                $notes.addClass('hidden');\n            }\n        }\n    }, {\n        maxInitialUpdateHeight: 500\n    });\n})(jQuery);\n"]}