{"version":3,"sources":["tablesettings/src/TableFieldSettings.js"],"names":["$","Craft","TableFieldSettings","Garnish","Base","extend","columnsTableName","defaultsTableName","columnsData","columnsTableId","defaultsTableId","columnsTableInputPath","defaults","columnSettings","dropdownSettingsCols","columnsTable","defaultsTable","init","dropdownSettingsHtml","formatInputId","this","split","initColumnsTable","filterArray","rowIdPrefix","defaultValues","onAddRow","initDefaultsTable","ColumnTable","type","$tr","reconstructDefaultsTable","$container","addListener","EditableTable","onAddColumn","initColumnSettingInputs","$textareas","find","colId","options","getPostData","$tbody","i","key","expandPostArray","defaultsTableInputPath","length","hasOwnProperty","rowObj","data","append","theadHtml","rowId","createRow","appendTo","$table","id","fieldSettings","replaceWith","destroy","$typeSelect","$settingsBtn","settingsModal","baseName","columns","settings","optionsTable","base","table","initialize","$typeSelectContainer","$typeCell","proxy","createRowObj","role","Row","tr","handleTypeChange","removeClass","Math","class","$modal","html","row","val","addClass","$closeButton","text","ev","$body","show","floor","random","$bod","hide","replace","onDeleteRow","handleOptionsRowChange","addRow","label","updateSizeAndPosition","value","prop","default","$rows","eq","$row","t","Modal","onHide","currentTarget","first","trigger","handleSettingsModalHide","push","handleFormSubmit","name","JSON","stringify","jQuery"],"mappings":"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","file":"TableFieldSettings.min.js","sourcesContent":["(function($) {\n    /** global: Craft */\n    /** global: Garnish */\n    Craft.TableFieldSettings = Garnish.Base.extend({\n        columnsTableName: null,\n        defaultsTableName: null,\n        columnsData: null,\n        columnsTableId: null,\n        defaultsTableId: null,\n        columnsTableInputPath: null,\n        defaultsTableInputPath: null,\n\n        defaults: null,\n        columnSettings: null,\n\n        dropdownSettingsHtml: null,\n        dropdownSettingsCols: null,\n\n        columnsTable: null,\n        defaultsTable: null,\n\n        init: function(columnsTableName, defaultsTableName, columnsData, defaults, columnSettings, dropdownSettingsHtml, dropdownSettingsCols) {\n            this.columnsTableName = columnsTableName;\n            this.defaultsTableName = defaultsTableName;\n            this.columnsData = columnsData;\n\n            this.columnsTableId = Craft.formatInputId(this.columnsTableName);\n            this.defaultsTableId = Craft.formatInputId(this.defaultsTableName);\n\n            this.columnsTableInputPath = Craft.filterArray(this.columnsTableName.split(/[\\[\\]]+/));\n            this.defaultsTableInputPath = Craft.filterArray(this.defaultsTableName.split(/[\\[\\]]+/));\n\n            this.defaults = defaults;\n            this.columnSettings = columnSettings;\n\n            this.dropdownSettingsHtml = dropdownSettingsHtml;\n            this.dropdownSettingsCols = dropdownSettingsCols;\n\n            this.initColumnsTable();\n            this.initDefaultsTable();\n        },\n\n        initColumnsTable: function() {\n            this.columnsTable = new ColumnTable(this, this.columnsTableId, this.columnsTableName, this.columnSettings, {\n                rowIdPrefix: 'col',\n                defaultValues: {\n                    type: 'singleline'\n                },\n                onAddRow: $.proxy(this, 'onAddColumn'),\n                onDeleteRow: $.proxy(this, 'reconstructDefaultsTable')\n            });\n        },\n\n        initDefaultsTable: function() {\n            this.defaultsTable = new Craft.EditableTable(this.defaultsTableId, this.defaultsTableName, this.columnsData, {\n                rowIdPrefix: 'row'\n            });\n        },\n\n        onAddColumn: function($tr) {\n            this.reconstructDefaultsTable();\n            this.initColumnSettingInputs($tr);\n        },\n\n        initColumnSettingInputs: function($container) {\n            var $textareas = $container.find('td:first-child textarea, td:nth-child(3) textarea');\n            this.addListener($textareas, 'input', 'reconstructDefaultsTable');\n        },\n\n        reconstructDefaultsTable: function() {\n            this.columnsData = Craft.expandPostArray(Garnish.getPostData(this.columnsTable.$tbody));\n            var defaults = Craft.expandPostArray(Garnish.getPostData(this.defaultsTable.$tbody));\n\n            var i, key;\n\n            for (i = 0; i < this.columnsTableInputPath.length; i++) {\n                key = this.columnsTableInputPath[i];\n                this.columnsData = this.columnsData[key];\n            }\n\n            // Add in the dropdown options\n            for (let colId in this.columnsData) {\n                if (this.columnsData.hasOwnProperty(colId) && this.columnsData[colId].type === 'select') {\n                    var rowObj = this.columnsTable.$tbody.find('tr[data-id=\"' + colId + '\"]').data('editable-table-row');\n                    this.columnsData[colId].options = rowObj.options || [];\n                }\n            }\n\n            for (i = 0; i < this.defaultsTableInputPath.length; i++) {\n                key = this.defaultsTableInputPath[i];\n\n                if (typeof defaults[key] === 'undefined') {\n                    defaults = {};\n                    break;\n                } else {\n                    defaults = defaults[key];\n                }\n            }\n\n            var theadHtml = '<thead>' +\n                '<tr>';\n\n            for (let colId in this.columnsData) {\n                if (!this.columnsData.hasOwnProperty(colId)) {\n                    continue;\n                }\n\n                theadHtml += '<th scope=\"col\">' + (this.columnsData[colId].heading ? this.columnsData[colId].heading : '&nbsp;') + '</th>';\n            }\n\n            theadHtml += '<th colspan=\"2\"></th>' +\n                '</tr>' +\n                '</thead>';\n\n            var $table = $('<table/>', {\n                id: this.defaultsTableId,\n                'class': 'editable fullwidth'\n            }).append(theadHtml);\n\n            var $tbody = $('<tbody/>').appendTo($table);\n\n            for (var rowId in defaults) {\n                if (!defaults.hasOwnProperty(rowId)) {\n                    continue;\n                }\n\n                Craft.EditableTable.createRow(rowId, this.columnsData, this.defaultsTableName, defaults[rowId]).appendTo($tbody);\n            }\n\n            this.defaultsTable.$table.replaceWith($table);\n            this.defaultsTable.destroy();\n            delete this.defaultsTable;\n            this.initDefaultsTable();\n        }\n    });\n\n    var ColumnTable = Craft.EditableTable.extend({\n        fieldSettings: null,\n\n        init: function(fieldSettings, id, baseName, columns, settings) {\n            this.fieldSettings = fieldSettings;\n            this.base(id, baseName, columns, settings);\n        },\n\n        initialize: function() {\n            if (!this.base()) {\n                return false;\n            }\n\n            this.fieldSettings.initColumnSettingInputs(this.$tbody);\n            this.sorter.settings.onSortChange = $.proxy(this.fieldSettings.reconstructDefaultsTable, this.fieldSettings);\n            return true;\n        },\n\n        createRowObj: function($tr) {\n            return new ColumnTable.Row(this, $tr);\n        }\n    });\n\n    ColumnTable.Row = Craft.EditableTable.Row.extend({\n        $typeSelect: null,\n        $settingsBtn: null,\n\n        options: null,\n        settingsModal: null,\n        optionsTable: null,\n\n        init: function(table, tr) {\n            this.base(table, tr);\n\n            if (this.table.fieldSettings.columnsData[this.id]) {\n                this.options = this.table.fieldSettings.columnsData[this.id].options || null;\n            }\n\n            var $typeCell = this.$tr.find('td:nth-child(4)');\n            var $typeSelectContainer = $typeCell.find('.select');\n            this.$settingsBtn = $typeCell.find('.settings');\n\n            if (!this.$settingsBtn.length) {\n                this.$settingsBtn = $('<a/>', {\n                    'class': 'settings light invisible',\n                    role: 'button',\n                    'data-icon': 'settings'\n                });\n                $('<div/>', {'class': 'flex flex-nowrap'})\n                    .appendTo($typeCell)\n                    .append($typeSelectContainer)\n                    .append(this.$settingsBtn);\n            }\n\n            this.$typeSelect = $typeSelectContainer.find('select');\n            this.addListener(this.$typeSelect, 'change', 'handleTypeChange');\n            this.addListener(this.$settingsBtn, 'click', 'showSettingsModal');\n\n            this.addListener(this.$tr.closest('form'), 'submit', 'handleFormSubmit');\n        },\n\n        handleTypeChange: function() {\n            if (this.$typeSelect.val() === 'select') {\n                this.$settingsBtn.removeClass('invisible');\n            } else {\n                this.$settingsBtn.addClass('invisible');\n            }\n\n            this.table.fieldSettings.reconstructDefaultsTable();\n        },\n\n        showSettingsModal: function(ev) {\n            if (!this.settingsModal) {\n                var id = 'dropdownsettingsmodal' + Math.floor(Math.random() * 1000000);\n                var $modal = $('<div/>', {'class': 'modal dropdownsettingsmodal'}).appendTo(Garnish.$bod);\n                var $body = $('<div/>', {'class': 'body'})\n                    .appendTo($modal)\n                    .html(this.table.fieldSettings.dropdownSettingsHtml.replace(/__ID__/g, id));\n\n                this.optionsTable = new Craft.EditableTable(id, '__NAME__', this.table.fieldSettings.dropdownSettingsCols, {\n                    onAddRow: $.proxy(this, 'handleOptionsRowChange'),\n                    onDeleteRow: $.proxy(this, 'handleOptionsRowChange')\n                });\n\n                if (this.options && this.options.length) {\n                    var row;\n                    for (var i = 0; i < this.options.length; i++) {\n                        row = this.optionsTable.addRow(false);\n                        row.$tr.find('.option-label textarea').val(this.options[i].label);\n                        row.$tr.find('.option-value textarea').val(this.options[i].value);\n                        row.$tr.find('.option-default input[type=\"checkbox\"]').prop('checked', !!this.options[i].default);\n                    }\n                } else {\n                    this.optionsTable.addRow(false);\n                }\n\n                var $closeButton = $('<button/>', {\n                    type: 'button',\n                    class: 'btn submit',\n                    text: Craft.t('app', 'Done')\n                }).appendTo($body);\n\n                this.settingsModal = new Garnish.Modal($modal, {\n                    onHide: $.proxy(this, 'handleSettingsModalHide')\n                });\n\n                this.addListener($closeButton, 'click', function() {\n                    this.settingsModal.hide();\n                });\n            } else {\n                this.settingsModal.show();\n            }\n\n            setTimeout($.proxy(function() {\n                this.optionsTable.$tbody.find('textarea').first().trigger('focus')\n            }, this), 100);\n        },\n\n        handleOptionsRowChange: function() {\n            if (this.settingsModal) {\n                this.settingsModal.updateSizeAndPosition();\n            }\n        },\n\n        handleSettingsModalHide: function() {\n            this.options = [];\n            var $rows = this.optionsTable.$table.find('tbody tr');\n            for (var i = 0; i < $rows.length; i++) {\n                let $row = $rows.eq(i);\n                this.options.push({\n                    label: $row.find('.option-label textarea').val(),\n                    value: $row.find('.option-value textarea').val(),\n                    default: $row.find('.option-default input[type=checkbox]').prop('checked')\n                })\n            }\n\n            this.table.fieldSettings.reconstructDefaultsTable();\n        },\n\n        handleFormSubmit: function(ev) {\n            if (this.$typeSelect.val() === 'select') {\n                $('<input/>', {\n                    type: 'hidden',\n                    name: this.table.fieldSettings.columnsTableName + '[' + this.id + '][options]',\n                    value: JSON.stringify(this.options)\n                }).appendTo(ev.currentTarget);\n            }\n        }\n    });\n})(jQuery);\n"]}