{"version":3,"file":"js/admin-999d2af227ae43032d79.js","sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/controllers/application.js","webpack:///./app/javascript/controllers/counter_controller.js","webpack:///./app/javascript/controllers/dropzone_controller.js","webpack:///./app/javascript/controllers/index.js","webpack:///./app/javascript/controllers/metadata_controller.js","webpack:///./app/javascript/controllers/modals_controller.js","webpack:///./app/javascript/controllers/sortable_controller.js","webpack:///./app/javascript/controllers/visual_editor_controller.js","webpack:///./app/javascript/css/admin.css","webpack:///./app/javascript/grapesjs-techtown-block/src/blocks/index.js","webpack:///./app/javascript/grapesjs-techtown-block/src/blocks/techtown.js","webpack:///./app/javascript/grapesjs-techtown-block/src/components.js","webpack:///./app/javascript/grapesjs-techtown-block/src/index.js","webpack:///./app/javascript/helpers/index.js","webpack:///./app/javascript/images sync ^\\.\\/.*$","webpack:///./app/javascript/images/dashboard_logo.png","webpack:///./app/javascript/images/idle_logo.jpeg","webpack:///./app/javascript/images/monster.png","webpack:///./app/javascript/packs/admin.js","webpack:///./app/javascript/packs/ckeditor/config.js","webpack:///./app/javascript/packs/components/map/donut-chart.js","webpack:///./app/javascript/packs/components/map/line-chart.js","webpack:///./app/javascript/packs/components/particles.js","webpack:///./app/javascript/packs/components/select2.js","webpack:///./node_modules/@hotwired/stimulus/dist/stimulus.js","webpack:///./node_modules/@hotwired/stimulus/dist/stimulus.umd.js","webpack:///./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js","webpack:///./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js","webpack:///./node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js","webpack:///./node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js","webpack:///./node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js","webpack:///./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","webpack:///./node_modules/@popperjs/core/lib/createPopper.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack:///./node_modules/@popperjs/core/lib/enums.js","webpack:///./node_modules/@popperjs/core/lib/index.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/index.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack:///./node_modules/@popperjs/core/lib/popper-lite.js","webpack:///./node_modules/@popperjs/core/lib/popper.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack:///./node_modules/@popperjs/core/lib/utils/debounce.js","webpack:///./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack:///./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack:///./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack:///./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack:///./node_modules/@popperjs/core/lib/utils/math.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack:///./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack:///./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack:///./node_modules/@popperjs/core/lib/utils/within.js","webpack:///./node_modules/@rails/activestorage/app/assets/javascripts/activestorage.esm.js","webpack:///./node_modules/@rails/request.js/src/fetch_request.js","webpack:///./node_modules/@rails/request.js/src/fetch_response.js","webpack:///./node_modules/@rails/request.js/src/index.js","webpack:///./node_modules/@rails/request.js/src/lib/utils.js","webpack:///./node_modules/@rails/request.js/src/request_interceptor.js","webpack:///./node_modules/@rails/request.js/src/verbs.js","webpack:///./node_modules/apexcharts/dist/apexcharts.common.js","webpack:///./node_modules/dropzone/dist/dropzone.mjs","webpack:///./node_modules/flowbite/lib/esm/components/accordion/index.js","webpack:///./node_modules/flowbite/lib/esm/components/accordion/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/accordion/types.js","webpack:///./node_modules/flowbite/lib/esm/components/carousel/index.js","webpack:///./node_modules/flowbite/lib/esm/components/carousel/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/carousel/types.js","webpack:///./node_modules/flowbite/lib/esm/components/collapse/index.js","webpack:///./node_modules/flowbite/lib/esm/components/collapse/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/collapse/types.js","webpack:///./node_modules/flowbite/lib/esm/components/dial/index.js","webpack:///./node_modules/flowbite/lib/esm/components/dial/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/dial/types.js","webpack:///./node_modules/flowbite/lib/esm/components/dismiss/index.js","webpack:///./node_modules/flowbite/lib/esm/components/dismiss/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/dismiss/types.js","webpack:///./node_modules/flowbite/lib/esm/components/drawer/index.js","webpack:///./node_modules/flowbite/lib/esm/components/drawer/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/drawer/types.js","webpack:///./node_modules/flowbite/lib/esm/components/dropdown/index.js","webpack:///./node_modules/flowbite/lib/esm/components/dropdown/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/dropdown/types.js","webpack:///./node_modules/flowbite/lib/esm/components/index.js","webpack:///./node_modules/flowbite/lib/esm/components/modal/index.js","webpack:///./node_modules/flowbite/lib/esm/components/modal/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/modal/types.js","webpack:///./node_modules/flowbite/lib/esm/components/popover/index.js","webpack:///./node_modules/flowbite/lib/esm/components/popover/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/popover/types.js","webpack:///./node_modules/flowbite/lib/esm/components/tabs/index.js","webpack:///./node_modules/flowbite/lib/esm/components/tabs/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/tabs/types.js","webpack:///./node_modules/flowbite/lib/esm/components/tooltip/index.js","webpack:///./node_modules/flowbite/lib/esm/components/tooltip/interface.js","webpack:///./node_modules/flowbite/lib/esm/components/tooltip/types.js","webpack:///./node_modules/flowbite/lib/esm/dom/events.js","webpack:///./node_modules/flowbite/lib/esm/dom/instances.js","webpack:///./node_modules/flowbite/lib/esm/index.js","webpack:///./node_modules/hotkeys-js/dist/hotkeys.esm.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/just-extend/index.js","webpack:///./node_modules/select2/dist/css/select2.css","webpack:///./node_modules/select2/dist/js/select2.js","webpack:///./node_modules/sortablejs/modular/sortable.esm.js","webpack:///./node_modules/stimulus-notification/dist/stimulus-notification.mjs","webpack:///./node_modules/stimulus-use/dist/index.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./app/javascript/packs/admin.js\");\n","// import \"@hotwired/turbo-rails\"\nimport { Application } from \"@hotwired/stimulus\"\nimport Notification from 'stimulus-notification'\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus = application\n\napplication.register('notification', Notification)\n\nexport { application }\n","import { Controller } from \"@hotwired/stimulus\"\n\n// Connects to data-controller=\"counter\"\nexport default class extends Controller {\n \n static targets = [\"output\"]\n \n connect() {\n this.count = 0\n }\n\n increment(){\n this.count += 1;\n this.outputTarget.textContent = this.count\n }\n}\n","import Dropzone from \"dropzone\";\nimport { Controller } from \"@hotwired/stimulus\"\nimport { DirectUpload } from \"@rails/activestorage\";\nimport {\n getMetaValue,\n toArray,\n findElement,\n removeElement,\n insertAfter\n} from \"helpers\";\n\nexport default class extends Controller {\n static targets = [\"input\"];\n\n connect() {\n this.dropZone = createDropZone(this);\n this.hideFileInput();\n this.bindEvents();\n this.createThumbnailFromUrl();\n Dropzone.autoDiscover = false;\n }\n\n // Private\n hideFileInput() {\n this.inputTarget.disabled = true;\n this.inputTarget.style.display = \"none\";\n }\n\n createThumbnailFromUrl() {\n const url = this.currentUrl;\n\n // show in preview\n if (url) {\n const mockFile = { name: url, size: 12345 };\n this.dropZone.emit(\"addedfile\", mockFile);\n this.dropZone.emit(\"thumbnail\", mockFile, url);\n this.dropZone.emit(\"complete\", mockFile);\n this.dropZone.files.push(mockFile);\n }\n }\n\n bindEvents() {\n\n this.dropZone.on(\"addedfile\", file => {\n\n // Upload single file\n if ( this.maxFiles == 1 && this.dropZone.files.length > 1 ) {\n this.dropZone.removeFile(this.dropZone.files[0]);\n }\n\n setTimeout(() => {\n file.accepted && createDirectUploadController(this, file).start();\n }, 500);\n });\n\n this.dropZone.on(\"removedfile\", file => {\n file.controller && removeElement(file.controller.hiddenInput);\n });\n\n this.dropZone.on(\"canceled\", file => {\n file.controller && file.controller.xhr.abort();\n });\n\n this.dropZone.on(\"maxfilesexceeded\", file => {\n console.log('maxfilesexceeded: ', file )\n // this.dropZone.removeAllFiles();\n });\n\n this.dropZone.on(\"maxfilesreached\", file => {\n console.log('maxfilesreached: ', file )\n });\n\n }\n\n get headers() {\n return { \"X-CSRF-Token\": getMetaValue(\"csrf-token\") };\n }\n\n get url() {\n return this.inputTarget.getAttribute(\"data-direct-upload-url\");\n }\n\n get currentUrl() {\n return this.data.get(\"url\");\n }\n\n get maxFiles() {\n return this.data.get(\"maxFiles\") || 1;\n }\n\n get maxFileSize() {\n return this.data.get(\"maxFileSize\") || 256;\n }\n\n get acceptedFiles() {\n return this.data.get(\"acceptedFiles\");\n }\n\n get addRemoveLinks() {\n return this.data.get(\"addRemoveLinks\") || true;\n }\n}\n\nclass DirectUploadController {\n constructor(source, file) {\n this.directUpload = createDirectUpload(file, source.url, this);\n this.source = source;\n this.file = file;\n }\n\n start() {\n this.file.controller = this;\n this.hiddenInput = this.createHiddenInput();\n this.directUpload.create((error, attributes) => {\n if (error) {\n removeElement(this.hiddenInput);\n this.emitDropzoneError(error);\n } else {\n this.hiddenInput.value = attributes.signed_id;\n this.emitDropzoneSuccess();\n }\n });\n }\n\n createHiddenInput() {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = this.source.inputTarget.name;\n insertAfter(input, this.source.inputTarget);\n return input;\n }\n\n directUploadWillStoreFileWithXHR(xhr) {\n this.bindProgressEvent(xhr);\n this.emitDropzoneUploading();\n }\n\n bindProgressEvent(xhr) {\n this.xhr = xhr;\n this.xhr.upload.addEventListener(\"progress\", event =>\n this.uploadRequestDidProgress(event)\n );\n }\n\n uploadRequestDidProgress(event) {\n const element = this.source.element;\n const progress = (event.loaded / event.total) * 100;\n findElement(\n this.file.previewTemplate,\n \".dz-upload\"\n ).style.width = `${progress}%`;\n }\n\n emitDropzoneUploading() {\n this.file.status = Dropzone.UPLOADING;\n this.source.dropZone.emit(\"processing\", this.file);\n }\n\n emitDropzoneError(error) {\n this.file.status = Dropzone.ERROR;\n this.source.dropZone.emit(\"error\", this.file, error);\n this.source.dropZone.emit(\"complete\", this.file);\n }\n\n emitDropzoneSuccess() {\n this.file.status = Dropzone.SUCCESS;\n this.source.dropZone.emit(\"success\", this.file);\n this.source.dropZone.emit(\"complete\", this.file);\n }\n}\n\nfunction createDirectUploadController(source, file) {\n return new DirectUploadController(source, file);\n}\n\nfunction createDirectUpload(file, url, controller) {\n return new DirectUpload(file, url, controller);\n}\n\n\n\nfunction createDropZone(controller) {\n return new Dropzone(controller.element, {\n url: controller.url,\n headers: controller.headers,\n maxFiles: controller.maxFiles,\n maxFilesize: controller.maxFileSize,\n acceptedFiles: controller.acceptedFiles,\n addRemoveLinks: controller.addRemoveLinks,\n autoQueue: false,\n thumbnailWidth: controller.maxFiles == 1 ? 512 : 120,\n thumbnailHeight: controller.maxFiles == 1 ? 200 : 120,\n\n });\n}","// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\"\n\nimport CounterController from \"./counter_controller\"\napplication.register(\"counter\", CounterController)\n\nimport DropzoneController from \"./dropzone_controller\"\napplication.register(\"dropzone\", DropzoneController)\n\n// import EditorController from \"./editor_controller\"\n// application.register(\"editor\", EditorController)\n\nimport MetadataController from \"./metadata_controller\"\napplication.register(\"metadata\", MetadataController)\n\nimport ModalsController from \"./modals_controller\"\napplication.register(\"modals\", ModalsController)\n\nimport SortableController from \"./sortable_controller\"\napplication.register(\"sortable\", SortableController)\n\n// import ToolbarController from \"./toolbar_controller\"\n// application.register(\"toolbar\", ToolbarController)\n\nimport VisualEditorController from \"./visual_editor_controller\"\napplication.register(\"visual-editor\", VisualEditorController)\n","import { Controller } from \"@hotwired/stimulus\"\nimport $ from 'jquery'\n\n// Connects to data-controller=\"metadata\"\nexport default class extends Controller {\n static targets = [\n 'seoTitle','seoLink', 'seoDesc', 'seoPreviewTitle', 'seoPreviewLink', 'seoPreviewDesc', 'seoTitleCounter', 'seoDescCounter',//SEO METADATA\n 'fbTitle','fbLink', 'fbDesc', 'fbPreviewTitle', 'fbPreviewLink', 'fbPreviewDesc', 'fbTitleCounter', 'fbDescCounter',//Facebook CARD\n 'xTitle','xLink', 'xDesc', 'xPreviewTitle', 'xPreviewLink', 'xPreviewDesc', 'xTitleCounter', 'xDescCounter', //X CARD\n 'desc', 'descCounter'\n\n ]\n connect() {\n // this.updateMetadata(this.descTarget, null, this.descCounterTarget)\n this.updateMetadata(this.seoTitleTarget, this.seoPreviewTitleTarget, this.seoTitleCounterTarget)\n this.updateMetadata(this.seoLinkTarget, this.seoPreviewLinkTarget)\n this.updateMetadata(this.seoDescTarget, this.seoPreviewDescTarget, this.seoDescCounterTarget)\n\n this.updateMetadata(this.fbTitleTarget, this.fbPreviewTitleTarget,this.fbTitleCounterTarget)\n this.updateMetadata(this.fbDescTarget, this.fbPreviewDescTarget,this.fbDescCounterTarget)\n\n this.updateMetadata(this.xTitleTarget, this.xPreviewTitleTarget, this.xTitleCounterTarget)\n this.updateMetadata(this.xDescTarget, this.xPreviewDescTarget,this.xDescCounterTarget)\n this.multipleSelect()\n }\n\n updateMetadata(target, targetPreview, counter){\n if(targetPreview)\n targetPreview.innerHTML = target.value\n if(counter)\n counter.innerHTML = target.value.length + ''\n target.addEventListener('keyup', () => {\n if(targetPreview)\n targetPreview.innerHTML = target.value\n if(counter)\n counter.innerHTML = target.value.length + ''\n })\n }\n\n multipleSelect(){\n $('select#setting_email_notification').select2({\n tags: true,\n })\n $('select#page_category_ids').select2()\n $('.select2-container--default .select2-selection--multiple ').css({\n 'border-color': 'rgb(209, 213, 219)',\n })\n $('.select2-search--inline .select2-search__field').css({\n 'box-shadow': 'unset',\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { Drawer, Popover } from 'flowbite';\nimport $ from 'jquery'\nimport { get } from \"@rails/request.js\";\n// Connects to data-controller=\"modals\"\n// options with default values\nconst options = {\n placement: 'right',\n backdrop: true,\n bodyScrolling: false,\n edge: true,\n edgeOffset: '',\n backdropClasses: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-30',\n onHide: () => {\n },\n onShow: () => {\n },\n onToggle: () => {\n }\n};\n\nconst optionsPopover = {\n placement: 'bottom',\n triggerType: 'click',\n offset: 10,\n onHide: () => {\n },\n onShow: () => {\n },\n onToggle: () => {\n }\n};\n\nlet menuItemLabels = {\n 'Post categories': { label: 'categories', params: {}, label_id: 'category' },\n 'Posts': { label: 'posts', params: { post_type: 'post' }, label_id: 'page' },\n 'Pages': { label: 'pages', params: {}, label_id: 'page' },\n 'Tags': { label: 'tags', params: {}, label_id: 'tag' },\n 'Galleries': { label: 'posts', params: { post_type: 'gallery' }, label_id: 'page' }\n}\nexport default class extends Controller {\n static targets = ['url', 'inputUrl', 'form', 'popoverContent', 'childVal']\n\n connect() {\n this.modal = new Drawer(document.getElementById('modal').children[0], options)\n this.modal.show()\n this.selectField = $('#menu_item_menu_item_type')\n this.selectField.select2()\n // set the popover content element\n const $targetEl = document.getElementById('popover-click');\n // set the element that trigger the popover using hover or click\n const $triggerEl = document.getElementById('test');\n console.log('inside childVal')\n // options with default values\n this.popover = new Popover($targetEl, $triggerEl, optionsPopover);\n this.selectField.on('select2:select', (e) => {\n let data = e.params.data\n const classes = ['hidden']\n\n if (this.childValTarget.classList.contains('hidden')){\n this.childValTarget.classList.remove(...classes)\n }\n let label = $('label#child-val-label')\n var childVal = $('#childVal')\n\n label.empty();\n if (data.text != 'Homepage'){\n label.append(data.text);\n }\n console.log('data.text', data.text)\n let dataLabel = data.text.toLocaleLowerCase().replace(/ /g,'-')\n switch (dataLabel){\n case 'redirect-url':\n this.removeExist()\n childVal.append(`\n \n `)\n break\n case 'homepage':\n break\n default:\n this.removeExist()\n let menuItemLabel = menuItemLabels[`${data.text}`]\n\n let label_id = menuItemLabel.label_id\n childVal.append(`'\n options.append(optionsString)\n }\n\n getData(title, params='') {\n var client = $('.hidden-client-id').val()\n const req = fetch(`${window.location.origin}/api/v1/content/${title}?${new URLSearchParams(params)}`,{\n method: 'GET',\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\",\n \"CLIENT_ID\": client,\n }\n })\n req.then(res => {\n return res.json()\n }).then(data => {\n this.createSelectOption(data.data.items)\n })\n }\n\n submit(e) {\n e.preventDefault()\n this.formTarget.submit()\n\n }\n close(e) {\n e.preventDefault()\n this.modal.close()\n }\n}\n\n","import { Controller } from \"@hotwired/stimulus\"\nimport Sortable from \"sortablejs\"\nimport { put } from \"@rails/request.js\"\n// Connects to data-controller=\"sortable\"\nexport default class extends Controller {\n static values = {url: String}\n\n connect() {\n \n this.sortable = Sortable.create(this.element, {\n onEnd: this.onEnd.bind(this),\n handle: \"[data-sortable-handle]\",\n group: \"nested\",\n })\n }\n \n disconnect() {\n this.sortable.destroy()\n }\n\n onEnd(e) {\n const { newIndex, item} = e \n const id = item.dataset[\"sortableId\"]\n const url = this.urlValue.replace(\":id\", id)\n put(`${url}`, {\n body: JSON.stringify({position: newIndex})\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n// import grapesjs from \"grapesjs\"\n// Connects to data-controller=\"visual-editor\"\nimport techtown from \"../grapesjs-techtown-block/src/\";\nexport default class extends Controller {\n static values = {pageslug: String, accesstoken: String}\n csrfToken() {\n const metaTag = document.querySelector(\"meta[name='csrf-token']\");\n return metaTag ? metaTag.content : \"\";\n }\n async connect() {\n console.log('Connected Visual Editor')\n\n const escapeName = (name) => `${name}`.trim().replace(/([^a-z0-9\\w-:/]+)/gi, '-');\n \n this.visualEditor = grapesjs.init({\n container: '#gjs',\n plugins: [\"grapesjs-ga\", \"grapesjs-plugin-forms\",\n techtown, \"grapesjs-tailwind\"],\n pluginsOpts: {\n 'grapesjs-tailwind': { \n cover: ''\n }\n },\n fromElement: true, \n width: 'auto',\n height: '100vh',\n selectorManager: { escapeName },\n storageManager: {\n type: 'remote',\n autosave: true,\n autoload: true,\n stepsBeforeSave: 1,\n options: {\n remote: {\n headers: {\n 'X-CSRF-Token': this.csrfToken()\n },\n urlStore: `/113344/en/pages/${this.pageslugValue}/update_editor`,\n urlLoad: `/113344/en/pages/${this.pageslugValue}/html`,\n fetchOptions: opts => (opts.method === 'POST' ? { method: 'PATCH' } : {}),\n onLoad: result => result.data\n }\n }\n },\n assetManager:{\n headers: {\n 'X-CSRF-Token': this.csrfToken(),\n },\n upload: '/113344/pages/upload_image',\n uploadName: 'image'\n }\n })\n\n const assetManager = this.visualEditor.AssetManager;\n const assets = await fetch(`/113344/en/asset_images?slug=${this.pageslugValue}`, {\n method: 'GET',\n headers: {\n 'X-CSRF-Token': this.csrfToken()\n }\n }).then(response => response.json())\n .then(response => {\n return response\n })\n \n assetManager.add(assets)\n assetManager.render()\n const panelManager = this.visualEditor.Panels\n panelManager.addButton(\"options\", {\n id: \"update-theme\",\n className: \"fa fa-adjust\",\n command: \"open-update-theme\",\n attributes: {\n title: \"Update Theme\",\n \"data-tooltip-pos\": \"bottom\"\n }\n });\n // console.log(panelManager.getPanel())\n panelManager.addButton('options', {\n id: 'show-json',\n className: 'fa fa-heart',\n command(editor) {\n console.log({css: editor.getHtml()})\n // editor.Modal.setTitle('Components JSON')\n // .setContent(``).open();\n },\n context: 'show-json',\n attributes: { title: 'Some title'},\n active: false,\n })\n }\n}\n\n","// extracted by mini-css-extract-plugin","import loadTechtownBlocks from './techtown'\n\nexport default (editor, opts = {}, openBlock) => {\n loadTechtownBlocks(editor, opts, openBlock);\n}","\n\n\nconst getSvgHtml = (svg) => {\n if (typeof window === 'undefined') return ''\n svg.setAttribute('width', '100%')\n svg.setAttribute('height', '100%')\n return svg.outerHTML\n}\n\n\nexport default (editor, options = {}) => {\n const bm = editor.Blocks\n const { category, blocks, stylePrefix, flexGrid, rowHeight, addBasicStyle } = options;\n const clsRow = `gjs-row `;\n const clsCell = `gjs-cell`;\n\n const step = 0.2;\n const minDim = 1;\n const currentUnit = 1;\n const resizerBtm = {\n tl: 0,\n tc: 0,\n tr: 0,\n cl: 0,\n cr: 0,\n bl: 0,\n br: 0,\n minDim\n };\n const resizerRight = {\n ...resizerBtm,\n cr: 1,\n bc: 0,\n currentUnit,\n minDim,\n step\n };\n const rowAttr = {\n 'data-gjs-droppable': `.${clsCell}`,\n 'data-gjs-resizable': resizerBtm,\n 'data-gjs-name': 'Row'\n };\n const colAttr = {\n 'data-gjs-draggable': `.${clsRow}`,\n 'data-gjs-resizable': resizerRight,\n 'data-gjs-name': 'Cell'\n };\n\n const attrsToString = (attrs) => {\n const result = [];\n\n for (let key in attrs) {\n let value = attrs[key];\n const toParse = value instanceof Array || value instanceof Object;\n value = toParse ? JSON.stringify(value) : value;\n result.push(`${key}=${toParse ? `'${value}'` : `'${value}'`}`);\n }\n\n return result.length ? ` ${result.join(' ')}` : '';\n };\n const attrsRow = attrsToString(rowAttr);\n const attrsCell = attrsToString(colAttr);\n\n \n const sources = [\n {\n id: 'text-element-h1',\n class: '',\n label: 'Heading 1',\n content: { type: 'HEADING'},\n category: 'Element',\n order: 1\n },\n {\n id: 'section',\n class: '',\n label: 'Section',\n content: { type: 'SECTION'},\n category: 'Element',\n order: 1\n },\n {\n id: 'category',\n class: '',\n label: 'Category',\n content: { type: 'CATEGORY'},\n category: 'Element',\n order: 1\n },\n ]\n \n sources.forEach((s) => {\n \n bm.add(s.id, {\n label: s.label,\n attributes: { class: `${s.class}` },\n content: s.content,\n category: { label: s.category, open: s.category === options.openCategory },\n })\n })\n}\n","export default (editor, opts = {}) => {\n const domc = editor.DomComponents;\n \n const heading_style = {\n 'h1': 'mb-4 text-5xl font-extrabold',\n 'h2': 'mb-4 text-4xl font-bold',\n 'h3': 'mb-4 text-3xl font-bold',\n 'h4': 'mb-4 text-2xl font-bold',\n 'h5': 'mb-4 text-xl font-bold',\n 'h6': 'mb-4 text-lg font-bold'\n }\n domc.addType('HEADING', {\n model: {\n defaults: {\n tagName: 'h1',\n components: 'Insert your text here',\n traits: [\n {\n type: \"select\",\n name: \"heading\",\n label: \"Heading\",\n changeProp: 1,\n options: [\n { id: 'h1', name: 'H1'},\n { id: 'h2', name: 'H2'},\n { id: 'h3', name: 'H3'},\n { id: 'h4', name: 'H4'},\n { id: 'h5', name: 'H5'},\n { id: 'h6', name: 'H6'},\n ]\n }\n ]\n },\n init() {\n this.on(\"change:heading\", this.handleHeadingTagChange);\n this.updateHeadingStyles(); // Initial update\n },\n handleHeadingTagChange() {\n this.attributes.tagName = this.attributes.heading\n this.updateHeadingStyles();\n this.view.render();\n },\n updateHeadingStyles() {\n const identifier_class = (Math.random() + 1).toString(36).substring(2);\n this.setClass(heading_style[this.attributes.tagName] + ' techtown_' + identifier_class);\n }\n },\n view: {\n \n },\n });\n\n domc.addType('PARTICLES', {\n model: {\n defaults: {\n tagName: 'div',\n components: ''\n },\n },\n view: {\n \n },\n });\n domc.addType('SECTION', {\n model: {\n defaults: {\n tagName: 'section',\n components: '
Photo booth fam kinfolk cold-pressed sriracha leggings jianbing microdosing tousled waistcoat.
Learn MorePhoto booth fam kinfolk cold-pressed sriracha leggings jianbing microdosing tousled waistcoat.
Learn MorePhoto booth fam kinfolk cold-pressed sriracha leggings jianbing microdosing tousled waistcoat.
Learn MoreWhatever cardigan tote bag tumblr hexagon brooklyn asymmetrical gentrify, subway tile poke farm-to-table. Franzen you probably haven't heard of them man bun deep jianbing selfies heirloom prism food truck ugh squid celiac humblebrag.
Fingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.
Learn MoreFingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.
Learn MoreFingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.
Learn MoreFingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.
Learn More${data.category.desc}
\n${post.expert}
\n