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 / examiner_controller.js
independent-analytics / javascript-source / controllers Last commit date
overview 1 year ago campaign_builder_controller.js 1 year ago chart_controller.js 2 months ago chart_interval_controller.js 2 years ago clipboard_controller.js 1 year ago copy_report_controller.js 2 years ago create_report_controller.js 1 year ago delete_data_controller.js 1 year ago delete_report_controller.js 2 years ago easepick_controller.js 2 years ago examiner_controller.js 2 months ago examiner_header_controller.js 11 months ago export_overview_controller.js 9 months ago export_reports_controller.js 2 years ago filters_controller.js 6 months ago group_controller.js 2 years ago import_reports_controller.js 2 years ago journey_controller.js 6 months ago map_controller.js 9 months ago migration_redirect_controller.js 2 years ago modal_controller.js 2 years ago pause_emails_controller.js 6 months ago pie_chart_controller.js 6 months ago plugin_group_options_controller.js 1 year ago pruner_controller.js 5 months ago quick_stats_controller.js 1 year ago real_time_controller.js 6 months ago refresh_overview_controller.js 1 year ago rename_report_controller.js 2 years ago report_controller.js 2 months ago reset_analytics_controller.js 1 year ago reset_overview_controller.js 1 year ago save_report_controller.js 2 years ago select_input_controller.js 2 years ago set_favorite_report_controller.js 2 years ago sort_controller.js 2 years ago sortable_reports_controller.js 2 years ago table_columns_controller.js 2 years ago tooltip_controller.js 6 months ago woocommerce_settings_controller.js 1 year ago
examiner_controller.js
136 lines
1 import {Controller} from "@hotwired/stimulus"
2 import MicroModal from "micromodal"
3
4 class ExaminerController extends Controller {
5 static targets = ['content']
6
7 options = null
8
9 // Track last opened frame to know if the loading screen should be disabled or not
10 lastOpenedFrame = null
11
12 // Track which windows are loaded so the loading state can be restored if examiner is closed and reopened
13 loadedWindows = new Set()
14
15 connect() {
16 document.addEventListener('iawp:showExaminer', this.showExaminer)
17 document.addEventListener('iawp:showUpsell', this.showUpsell)
18 window.addEventListener('message', this.processMessage)
19 }
20
21 disconnect() {
22 document.removeEventListener('iawp:showExaminer', this.showExaminer)
23 document.removeEventListener('iawp:showUpsell', this.showUpsell)
24 window.removeEventListener('message', this.processMessage)
25 }
26
27 showUpsell = (event) => {
28 MicroModal.show('iawp-solo-report-upsell-modal', {})
29 }
30
31 showExaminer = (event) => {
32 this.options = event.detail
33
34 this.element.querySelector('.examiner-skeleton .date-picker-parent .iawp-label').innerText = this.options.dateLabel
35 this.element.querySelector('.examiner-skeleton .report-title').innerText = this.options.title
36 this.element.querySelector('.examiner-skeleton .report-subtitle').innerText = this.options.reportName
37
38 const currentSvg = document.querySelector(`.reports-list .menu-section.current svg`)
39 if(currentSvg) {
40 const clonedSVG = currentSvg.cloneNode(true)
41 this.element.querySelector('.examiner-skeleton .report-subtitle').prepend(clonedSVG)
42 }
43
44 MicroModal.show('iawp-examiner-modal', {
45 onClose: () => {
46 this.cleanUp()
47 }
48 })
49
50 const existingFrame = Array.from(this.contentTarget.querySelectorAll('iframe.preserved')).find((frame) => {
51 return frame.src === this.options.url
52 })
53
54 if(existingFrame) {
55 this.lastOpenedFrame = existingFrame
56
57 if(this.loadedWindows.has(existingFrame.contentWindow)) {
58 this.hideLoadingScreen()
59 }
60
61 existingFrame.classList.remove('preserved')
62 return
63 }
64
65 const iframe = this.createInlineFrame(this.options.url)
66 this.contentTarget.appendChild(iframe)
67 this.lastOpenedFrame = iframe
68
69 clearTimeout(this.fallbackTimeout)
70 this.fallbackTimeout = setTimeout(() => {
71 this.hideLoadingScreen()
72 }, 10000)
73 }
74
75 processMessage = (event) => {
76 const fromCurrentWindow = event.source === window
77 const fromLastOpenedFrame = event.source === (this.lastOpenedFrame && this.lastOpenedFrame.contentWindow)
78
79 // Ignore events from the current window
80 if(fromCurrentWindow) {
81 return
82 }
83
84 if (event.data === 'iawpPageReady') {
85 this.loadedWindows.add(event.source)
86 }
87
88 if (event.data === 'iawpPageReady' && fromLastOpenedFrame) {
89 this.hideLoadingScreen()
90 }
91
92 if (event.data === 'iawpCloseExaminer') {
93 this.close()
94 }
95 }
96
97 createInlineFrame(url) {
98 const iframe = document.createElement('iframe');
99
100 iframe.src = url
101 iframe.classList.add('examiner-iframe')
102
103 return iframe
104 }
105
106 close() {
107 MicroModal.close('iawp-examiner-modal')
108 }
109
110 closeUpsell() {
111 MicroModal.close('iawp-solo-report-upsell-modal')
112 }
113
114 cleanUp() {
115 this.options = null
116 this.showLoadingScreen()
117 clearTimeout(this.fallbackTimeout)
118
119 const currentFrame = this.element.querySelector('iframe:not(.preserved)')
120
121 if(currentFrame) {
122 currentFrame.classList.add('preserved')
123 }
124 }
125
126 showLoadingScreen() {
127 this.element.querySelector('.examiner').classList.add('examiner--loading')
128 }
129
130 hideLoadingScreen() {
131 this.element.querySelector('.examiner').classList.remove('examiner--loading')
132 }
133 }
134
135 export default ExaminerController
136