PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.14.10
Independent Analytics – WordPress Analytics Plugin v2.14.10
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / javascript-source / controllers / overview / module_list.js
independent-analytics / javascript-source / controllers / overview Last commit date
add_module.js 1 year ago checkbox_group.js 1 year ago module.js 1 year ago module_editor.js 1 year ago module_list.js 1 year ago module_picker.js 1 year ago reorder_modules.js 1 year ago
module_list.js
131 lines
1 import {Controller} from "@hotwired/stimulus"
2 import Sortable from 'sortablejs'
3 import {StickySidebar} from "../../modules/sticky-sidebar"
4
5 export default class extends Controller {
6 static targets = ['list']
7
8 connect() {
9 const modulesSortable = new Sortable(this.listTarget, {
10 animation: 400,
11 ghostClass: 'iawp-sortable-ghost',
12 handle: '.draggable-module', // ANDREW: you could use .module and just toggle "disabled" on/off instead. I don't have access to modulesSortable in my JS file
13 delay: 2000,
14 delayOnTouchOnly: true,
15 onUpdate: (event) => {
16 this.unwrapSideBySideModules()
17 this.saveModuleOrder(modulesSortable, event)
18 },
19 onStart: (event) => {
20 document.getElementById('module-list').classList.add('dragging-active')
21
22 if(this.isFullWidthModule(event.item)) {
23 this.wrapSideBySideModules()
24 }
25 },
26 onEnd: (event) => {
27 document.getElementById('module-list').classList.remove('dragging-active')
28 this.unwrapSideBySideModules()
29 }
30 })
31 }
32
33 wrapSideBySideModules() {
34 if (window.innerWidth < 900
35 || (window.innerWidth >= 1000 && window.innerWidth < 1200 && !document.getElementById('iawp-layout').classList.contains('collapsed'))
36 ) {
37 return;
38 }
39 const modules = Array.from(this.listTarget.querySelectorAll('.iawp-module:not(.module-picker)'))
40 const pairsToWrap = []
41 let columnsRemaining = 2
42
43 modules.forEach((current, index) => {
44 const next = current.nextElementSibling
45 const isLast = !next || next.matches('.iawp-module.module-picker')
46
47 if (this.isFullWidthModule(current)) {
48 columnsRemaining = 2 // Next module will always be on the next row
49 return
50 }
51
52 columnsRemaining--;
53
54 if(columnsRemaining === 1 && !isLast && !this.isFullWidthModule(next)) {
55 pairsToWrap.push(current)
56 }
57
58 if(columnsRemaining === 0) {
59 columnsRemaining = 2
60 }
61 })
62
63 pairsToWrap.forEach(module => {
64 const nextSibling = module.nextElementSibling
65
66 const wrapper = document.createElement('div')
67 wrapper.classList.add('iawp-module-reorder-wrapper')
68
69 module.parentNode.insertBefore(wrapper, module)
70 wrapper.appendChild(module)
71 wrapper.appendChild(nextSibling)
72 })
73 }
74
75 unwrapSideBySideModules() {
76 const wrappers = this.listTarget.querySelectorAll('.iawp-module-reorder-wrapper')
77
78 wrappers.forEach(wrapper => {
79 const parent = wrapper.parentNode
80 const fragment = document.createDocumentFragment()
81
82 // Move children into a fragment to avoid reflow during insert
83 while (wrapper.firstChild) {
84 fragment.appendChild(wrapper.firstChild)
85 }
86
87 parent.replaceChild(fragment, wrapper)
88 })
89 }
90
91 isFullWidthModule(element) {
92 return element.classList.contains('full-width')
93 }
94
95 saveModuleOrder(sortable, event) {
96 const elements = Array.from(event.target.querySelectorAll('.iawp-module'))
97 const ids = elements.map((element) => {
98 return this.application.getControllerForElementAndIdentifier(element, 'module')
99 }).filter((controller) => {
100 return controller !== null
101 }).map((controller) => {
102 return controller.moduleIdValue
103 })
104
105 const data = {
106 ...iawpActions.reorder_modules,
107 module_ids: ids,
108 }
109
110 jQuery.post(ajaxurl, data, (response) => {
111 // Do nothing
112 }).fail((error) => {
113 sortable.sort(
114 this.moveArrayItem(sortable.toArray(), event.newIndex, event.oldIndex)
115 )
116 })
117 }
118
119 moveArrayItem(array, fromIndex, toIndex) {
120 const newArray = [...array]
121
122 if (fromIndex === toIndex) {
123 return newArray
124 }
125
126 const itemToMove = newArray.splice(fromIndex, 1)[0]
127 newArray.splice(toIndex, 0, itemToMove)
128
129 return newArray
130 }
131 }