myio-js-library 0.1.204 → 0.1.207

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -25657,9 +25657,12 @@ var AnnotationsTab = class {
25657
25657
  attachEventListeners() {
25658
25658
  const openModalBtn = this.container.querySelector("#open-new-annotation-modal");
25659
25659
  if (openModalBtn) {
25660
- openModalBtn.onclick = () => {
25660
+ openModalBtn.addEventListener("click", (e) => {
25661
+ e.preventDefault();
25662
+ e.stopPropagation();
25663
+ console.log("[AnnotationsTab] Create button clicked");
25661
25664
  this.showNewAnnotationModal();
25662
- };
25665
+ });
25663
25666
  } else {
25664
25667
  console.warn("[AnnotationsTab] Create button not found");
25665
25668
  }
@@ -36125,14 +36128,18 @@ function injectCSS7() {
36125
36128
  document.head.appendChild(style);
36126
36129
  cssInjected7 = true;
36127
36130
  }
36131
+ var HIDE_DELAY_MS = 2500;
36132
+ var SAFETY_TIMEOUT_MS = 15e3;
36128
36133
  var state3 = {
36129
36134
  hideTimer: null,
36135
+ safetyTimer: null,
36130
36136
  isMouseOverTooltip: false,
36131
36137
  isMaximized: false,
36132
36138
  isDragging: false,
36133
36139
  dragOffset: { x: 0, y: 0 },
36134
36140
  savedPosition: null,
36135
- pinnedCounter: 0
36141
+ pinnedCounter: 0,
36142
+ isPinned: false
36136
36143
  };
36137
36144
  function generateHeaderHTML3(icon, title) {
36138
36145
  return `
@@ -36168,6 +36175,7 @@ function setupHoverListeners3(container) {
36168
36175
  clearTimeout(state3.hideTimer);
36169
36176
  state3.hideTimer = null;
36170
36177
  }
36178
+ resetSafetyTimer();
36171
36179
  };
36172
36180
  container.onmouseleave = () => {
36173
36181
  state3.isMouseOverTooltip = false;
@@ -36349,15 +36357,42 @@ function toggleMaximize3(container) {
36349
36357
  }
36350
36358
  }
36351
36359
  function startDelayedHide3() {
36352
- if (state3.isMouseOverTooltip) return;
36360
+ if (state3.isMouseOverTooltip || state3.isPinned) return;
36353
36361
  if (state3.hideTimer) {
36354
36362
  clearTimeout(state3.hideTimer);
36355
36363
  }
36356
36364
  state3.hideTimer = setTimeout(() => {
36357
36365
  hideWithAnimation3();
36358
- }, 1500);
36366
+ }, HIDE_DELAY_MS);
36367
+ }
36368
+ function resetSafetyTimer() {
36369
+ if (state3.safetyTimer) {
36370
+ clearTimeout(state3.safetyTimer);
36371
+ state3.safetyTimer = null;
36372
+ }
36373
+ const container = document.getElementById("myio-info-tooltip");
36374
+ if (container && container.classList.contains("visible") && !state3.isPinned) {
36375
+ state3.safetyTimer = setTimeout(() => {
36376
+ console.log("[InfoTooltip] Safety timeout reached - forcing hide");
36377
+ InfoTooltip.destroy();
36378
+ }, SAFETY_TIMEOUT_MS);
36379
+ }
36380
+ }
36381
+ function clearAllTimers() {
36382
+ if (state3.hideTimer) {
36383
+ clearTimeout(state3.hideTimer);
36384
+ state3.hideTimer = null;
36385
+ }
36386
+ if (state3.safetyTimer) {
36387
+ clearTimeout(state3.safetyTimer);
36388
+ state3.safetyTimer = null;
36389
+ }
36359
36390
  }
36360
36391
  function hideWithAnimation3() {
36392
+ if (state3.safetyTimer) {
36393
+ clearTimeout(state3.safetyTimer);
36394
+ state3.safetyTimer = null;
36395
+ }
36361
36396
  const container = document.getElementById("myio-info-tooltip");
36362
36397
  if (container && container.classList.contains("visible")) {
36363
36398
  container.classList.add("closing");
@@ -36402,12 +36437,10 @@ var InfoTooltip = {
36402
36437
  * Show tooltip
36403
36438
  */
36404
36439
  show(triggerElement, options) {
36405
- if (state3.hideTimer) {
36406
- clearTimeout(state3.hideTimer);
36407
- state3.hideTimer = null;
36408
- }
36440
+ clearAllTimers();
36409
36441
  const container = this.getContainer();
36410
36442
  container.classList.remove("closing");
36443
+ state3.isPinned = false;
36411
36444
  container.innerHTML = `
36412
36445
  <div class="myio-info-tooltip__panel">
36413
36446
  ${generateHeaderHTML3(options.icon, options.title)}
@@ -36421,6 +36454,7 @@ var InfoTooltip = {
36421
36454
  setupHoverListeners3(container);
36422
36455
  setupButtonListeners3(container);
36423
36456
  setupDragListeners3(container);
36457
+ resetSafetyTimer();
36424
36458
  },
36425
36459
  /**
36426
36460
  * Start delayed hide
@@ -36432,10 +36466,7 @@ var InfoTooltip = {
36432
36466
  * Hide immediately
36433
36467
  */
36434
36468
  hide() {
36435
- if (state3.hideTimer) {
36436
- clearTimeout(state3.hideTimer);
36437
- state3.hideTimer = null;
36438
- }
36469
+ clearAllTimers();
36439
36470
  state3.isMouseOverTooltip = false;
36440
36471
  const container = document.getElementById(this.containerId);
36441
36472
  if (container) {
@@ -36446,19 +36477,36 @@ var InfoTooltip = {
36446
36477
  * Close and reset all states
36447
36478
  */
36448
36479
  close() {
36480
+ clearAllTimers();
36449
36481
  state3.isMaximized = false;
36450
36482
  state3.isDragging = false;
36451
36483
  state3.savedPosition = null;
36452
- if (state3.hideTimer) {
36453
- clearTimeout(state3.hideTimer);
36454
- state3.hideTimer = null;
36455
- }
36456
36484
  state3.isMouseOverTooltip = false;
36485
+ state3.isPinned = false;
36457
36486
  const container = document.getElementById(this.containerId);
36458
36487
  if (container) {
36459
36488
  container.classList.remove("visible", "pinned", "maximized", "dragging", "closing");
36460
36489
  }
36461
36490
  },
36491
+ /**
36492
+ * Destroy tooltip completely - guaranteed cleanup
36493
+ * Removes from DOM and clears all timers/state
36494
+ */
36495
+ destroy() {
36496
+ clearAllTimers();
36497
+ state3.isMaximized = false;
36498
+ state3.isDragging = false;
36499
+ state3.savedPosition = null;
36500
+ state3.isMouseOverTooltip = false;
36501
+ state3.isPinned = false;
36502
+ const container = document.getElementById(this.containerId);
36503
+ if (container) {
36504
+ container.remove();
36505
+ }
36506
+ const pinnedClones = document.querySelectorAll('[id^="myio-info-tooltip-pinned-"]');
36507
+ pinnedClones.forEach((clone) => clone.remove());
36508
+ console.log("[InfoTooltip] Destroyed - all tooltips removed");
36509
+ },
36462
36510
  /**
36463
36511
  * Attach tooltip to trigger element with hover behavior
36464
36512
  */
@@ -42141,24 +42189,25 @@ var ContractDevicesModalView = class {
42141
42189
  <h4>Energia</h4>
42142
42190
  </div>
42143
42191
  <div class="domain-fields">
42144
- <div class="field-group">
42192
+ <div class="field-group field-total">
42145
42193
  <label for="energy_total">Total Contratado</label>
42146
- <input type="number" id="energy_total" name="energy_total" min="0" step="1" placeholder="0">
42194
+ <input type="number" id="energy_total" name="energy_total" min="0" step="1" placeholder="0" readonly class="input-readonly">
42147
42195
  <small class="field-key">${DEVICE_COUNT_KEYS.energy.total}</small>
42196
+ <small class="field-hint">Soma automatica</small>
42148
42197
  </div>
42149
42198
  <div class="field-group">
42150
42199
  <label for="energy_entries">Entradas</label>
42151
- <input type="number" id="energy_entries" name="energy_entries" min="0" step="1" placeholder="0">
42200
+ <input type="number" id="energy_entries" name="energy_entries" min="0" step="1" placeholder="0" data-domain="energy">
42152
42201
  <small class="field-key">${DEVICE_COUNT_KEYS.energy.entries}</small>
42153
42202
  </div>
42154
42203
  <div class="field-group">
42155
42204
  <label for="energy_commonArea">Area Comum</label>
42156
- <input type="number" id="energy_commonArea" name="energy_commonArea" min="0" step="1" placeholder="0">
42205
+ <input type="number" id="energy_commonArea" name="energy_commonArea" min="0" step="1" placeholder="0" data-domain="energy">
42157
42206
  <small class="field-key">${DEVICE_COUNT_KEYS.energy.commonArea}</small>
42158
42207
  </div>
42159
42208
  <div class="field-group">
42160
42209
  <label for="energy_stores">Lojas</label>
42161
- <input type="number" id="energy_stores" name="energy_stores" min="0" step="1" placeholder="0">
42210
+ <input type="number" id="energy_stores" name="energy_stores" min="0" step="1" placeholder="0" data-domain="energy">
42162
42211
  <small class="field-key">${DEVICE_COUNT_KEYS.energy.stores}</small>
42163
42212
  </div>
42164
42213
  </div>
@@ -42171,24 +42220,25 @@ var ContractDevicesModalView = class {
42171
42220
  <h4>Agua</h4>
42172
42221
  </div>
42173
42222
  <div class="domain-fields">
42174
- <div class="field-group">
42223
+ <div class="field-group field-total">
42175
42224
  <label for="water_total">Total Contratado</label>
42176
- <input type="number" id="water_total" name="water_total" min="0" step="1" placeholder="0">
42225
+ <input type="number" id="water_total" name="water_total" min="0" step="1" placeholder="0" readonly class="input-readonly">
42177
42226
  <small class="field-key">${DEVICE_COUNT_KEYS.water.total}</small>
42227
+ <small class="field-hint">Soma automatica</small>
42178
42228
  </div>
42179
42229
  <div class="field-group">
42180
42230
  <label for="water_entries">Entradas</label>
42181
- <input type="number" id="water_entries" name="water_entries" min="0" step="1" placeholder="0">
42231
+ <input type="number" id="water_entries" name="water_entries" min="0" step="1" placeholder="0" data-domain="water">
42182
42232
  <small class="field-key">${DEVICE_COUNT_KEYS.water.entries}</small>
42183
42233
  </div>
42184
42234
  <div class="field-group">
42185
42235
  <label for="water_commonArea">Area Comum</label>
42186
- <input type="number" id="water_commonArea" name="water_commonArea" min="0" step="1" placeholder="0">
42236
+ <input type="number" id="water_commonArea" name="water_commonArea" min="0" step="1" placeholder="0" data-domain="water">
42187
42237
  <small class="field-key">${DEVICE_COUNT_KEYS.water.commonArea}</small>
42188
42238
  </div>
42189
42239
  <div class="field-group">
42190
42240
  <label for="water_stores">Lojas</label>
42191
- <input type="number" id="water_stores" name="water_stores" min="0" step="1" placeholder="0">
42241
+ <input type="number" id="water_stores" name="water_stores" min="0" step="1" placeholder="0" data-domain="water">
42192
42242
  <small class="field-key">${DEVICE_COUNT_KEYS.water.stores}</small>
42193
42243
  </div>
42194
42244
  </div>
@@ -42201,19 +42251,20 @@ var ContractDevicesModalView = class {
42201
42251
  <h4>Temperatura</h4>
42202
42252
  </div>
42203
42253
  <div class="domain-fields">
42204
- <div class="field-group">
42254
+ <div class="field-group field-total">
42205
42255
  <label for="temperature_total">Total Contratado</label>
42206
- <input type="number" id="temperature_total" name="temperature_total" min="0" step="1" placeholder="0">
42256
+ <input type="number" id="temperature_total" name="temperature_total" min="0" step="1" placeholder="0" readonly class="input-readonly">
42207
42257
  <small class="field-key">${DEVICE_COUNT_KEYS.temperature.total}</small>
42258
+ <small class="field-hint">Soma automatica</small>
42208
42259
  </div>
42209
42260
  <div class="field-group">
42210
42261
  <label for="temperature_internal">Sensores Internos</label>
42211
- <input type="number" id="temperature_internal" name="temperature_internal" min="0" step="1" placeholder="0">
42262
+ <input type="number" id="temperature_internal" name="temperature_internal" min="0" step="1" placeholder="0" data-domain="temperature">
42212
42263
  <small class="field-key">${DEVICE_COUNT_KEYS.temperature.internal}</small>
42213
42264
  </div>
42214
42265
  <div class="field-group">
42215
- <label for="temperature_stores">Lojas</label>
42216
- <input type="number" id="temperature_stores" name="temperature_stores" min="0" step="1" placeholder="0">
42266
+ <label for="temperature_stores">Sensores Externos</label>
42267
+ <input type="number" id="temperature_stores" name="temperature_stores" min="0" step="1" placeholder="0" data-domain="temperature">
42217
42268
  <small class="field-key">${DEVICE_COUNT_KEYS.temperature.stores}</small>
42218
42269
  </div>
42219
42270
  </div>
@@ -42412,6 +42463,26 @@ var ContractDevicesModalView = class {
42412
42463
  font-family: 'Courier New', monospace;
42413
42464
  }
42414
42465
 
42466
+ .myio-contract-devices-modal .field-hint {
42467
+ font-size: 10px;
42468
+ color: #6c757d;
42469
+ font-style: italic;
42470
+ }
42471
+
42472
+ .myio-contract-devices-modal .input-readonly {
42473
+ background: #f0f0f0;
42474
+ color: #555;
42475
+ cursor: not-allowed;
42476
+ font-weight: 600;
42477
+ }
42478
+
42479
+ .myio-contract-devices-modal .field-total {
42480
+ background: #f8f9fa;
42481
+ padding: 10px;
42482
+ border-radius: 6px;
42483
+ margin-bottom: 4px;
42484
+ }
42485
+
42415
42486
  .myio-contract-devices-modal .modal-footer {
42416
42487
  padding: 16px 24px;
42417
42488
  border-top: 1px solid #e0e0e0;
@@ -42490,22 +42561,22 @@ var ContractDevicesModalView = class {
42490
42561
  }
42491
42562
  };
42492
42563
  if (data.energy) {
42493
- setValue("energy_total", data.energy.total);
42494
42564
  setValue("energy_entries", data.energy.entries);
42495
42565
  setValue("energy_commonArea", data.energy.commonArea);
42496
42566
  setValue("energy_stores", data.energy.stores);
42497
42567
  }
42498
42568
  if (data.water) {
42499
- setValue("water_total", data.water.total);
42500
42569
  setValue("water_entries", data.water.entries);
42501
42570
  setValue("water_commonArea", data.water.commonArea);
42502
42571
  setValue("water_stores", data.water.stores);
42503
42572
  }
42504
42573
  if (data.temperature) {
42505
- setValue("temperature_total", data.temperature.total);
42506
42574
  setValue("temperature_internal", data.temperature.internal);
42507
42575
  setValue("temperature_stores", data.temperature.stores);
42508
42576
  }
42577
+ this.calculateDomainTotal("energy");
42578
+ this.calculateDomainTotal("water");
42579
+ this.calculateDomainTotal("temperature");
42509
42580
  }
42510
42581
  attachEventListeners() {
42511
42582
  const closeBtn = this.modal.querySelector(".close-btn");
@@ -42537,6 +42608,50 @@ var ContractDevicesModalView = class {
42537
42608
  this.config.onClose();
42538
42609
  }
42539
42610
  });
42611
+ this.setupAutoCalculation();
42612
+ }
42613
+ setupAutoCalculation() {
42614
+ const energyFields = ["energy_entries", "energy_commonArea", "energy_stores"];
42615
+ energyFields.forEach((fieldName) => {
42616
+ const input = this.form.querySelector(`[name="${fieldName}"]`);
42617
+ if (input) {
42618
+ input.addEventListener("input", () => this.calculateDomainTotal("energy"));
42619
+ }
42620
+ });
42621
+ const waterFields = ["water_entries", "water_commonArea", "water_stores"];
42622
+ waterFields.forEach((fieldName) => {
42623
+ const input = this.form.querySelector(`[name="${fieldName}"]`);
42624
+ if (input) {
42625
+ input.addEventListener("input", () => this.calculateDomainTotal("water"));
42626
+ }
42627
+ });
42628
+ const temperatureFields = ["temperature_internal", "temperature_stores"];
42629
+ temperatureFields.forEach((fieldName) => {
42630
+ const input = this.form.querySelector(`[name="${fieldName}"]`);
42631
+ if (input) {
42632
+ input.addEventListener("input", () => this.calculateDomainTotal("temperature"));
42633
+ }
42634
+ });
42635
+ }
42636
+ calculateDomainTotal(domain) {
42637
+ const getValue = (name) => {
42638
+ const input = this.form.querySelector(`[name="${name}"]`);
42639
+ if (!input || input.value === "") return 0;
42640
+ const num = parseInt(input.value, 10);
42641
+ return isNaN(num) ? 0 : num;
42642
+ };
42643
+ let total = 0;
42644
+ if (domain === "energy") {
42645
+ total = getValue("energy_entries") + getValue("energy_commonArea") + getValue("energy_stores");
42646
+ } else if (domain === "water") {
42647
+ total = getValue("water_entries") + getValue("water_commonArea") + getValue("water_stores");
42648
+ } else if (domain === "temperature") {
42649
+ total = getValue("temperature_internal") + getValue("temperature_stores");
42650
+ }
42651
+ const totalInput = this.form.querySelector(`[name="${domain}_total"]`);
42652
+ if (totalInput) {
42653
+ totalInput.value = String(total);
42654
+ }
42540
42655
  }
42541
42656
  setupAccessibility() {
42542
42657
  const firstInput = this.modal.querySelector("input");