@kalel1500/kalion-js 0.15.0-beta.0 → 0.15.2-beta.0

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.
@@ -492,7 +492,8 @@ var FModal = class FModal {
492
492
  $modalElement;
493
493
  $spinnerElements;
494
494
  $messageElements;
495
- static registryAbort = /* @__PURE__ */ new Map();
495
+ static registryAbortClick = /* @__PURE__ */ new Map();
496
+ static registryAbortChange = /* @__PURE__ */ new Map();
496
497
  static registryModal = /* @__PURE__ */ new Map();
497
498
  constructor(id, options) {
498
499
  this.id = id;
@@ -533,8 +534,10 @@ var FModal = class FModal {
533
534
  ...options?.instanceOptions
534
535
  });
535
536
  this.removeListener();
536
- const abortController = new AbortController();
537
- FModal.registryAbort.set(id, abortController);
537
+ const abortControllerClick = new AbortController();
538
+ const abortControllerChange = new AbortController();
539
+ FModal.registryAbortClick.set(id, abortControllerClick);
540
+ FModal.registryAbortChange.set(id, abortControllerChange);
538
541
  FModal.registryModal.set(id, this.modal);
539
542
  this.$modalElement?.addEventListener("click", async (e) => {
540
543
  const target = e.target;
@@ -562,7 +565,11 @@ var FModal = class FModal {
562
565
  }
563
566
  }
564
567
  if (options?.onModalClick) options?.onModalClick(this, target);
565
- }, { signal: abortController.signal });
568
+ }, { signal: abortControllerClick.signal });
569
+ this.$modalElement?.addEventListener("change", async (e) => {
570
+ const target = e.target;
571
+ if (options?.onModalChange) options?.onModalChange(this, target);
572
+ }, { signal: abortControllerChange.signal });
566
573
  }
567
574
  hide() {
568
575
  this.modal.hide();
@@ -583,10 +590,15 @@ var FModal = class FModal {
583
590
  FModal.removeListener(this.id);
584
591
  }
585
592
  static removeListener(id) {
586
- const abortController = FModal.registryAbort.get(id);
587
- if (abortController) {
588
- abortController.abort();
589
- FModal.registryAbort.delete(id);
593
+ const abortControllerClick = FModal.registryAbortClick.get(id);
594
+ if (abortControllerClick) {
595
+ abortControllerClick.abort();
596
+ FModal.registryAbortClick.delete(id);
597
+ }
598
+ const abortControllerChange = FModal.registryAbortChange.get(id);
599
+ if (abortControllerChange) {
600
+ abortControllerChange.abort();
601
+ FModal.registryAbortChange.delete(id);
590
602
  }
591
603
  }
592
604
  showMessage({ message, type, autoHide = false, hideAfter = 3e3 }) {
@@ -5246,6 +5258,17 @@ var DomService = class extends Instantiable {
5246
5258
  //#region src/app/global.ts
5247
5259
  var g = class g {
5248
5260
  static errorModalIsShowed = false;
5261
+ static resolveElement(target, name, context = "g") {
5262
+ const targetName = name ?? "element";
5263
+ if (target === void 0) throw new Error(`[${context}] The "${targetName}" parameter is required.`);
5264
+ const el = typeof target === "string" ? document.querySelector(target) : target;
5265
+ if (!el) {
5266
+ const details = typeof target === "string" ? ` with selector: "${target}".` : ".";
5267
+ const notFoundMessage = name ? `No element found for "${targetName}"${details}` : `No element found${details}`;
5268
+ throw new Error(`[${context}] ${notFoundMessage}`);
5269
+ }
5270
+ return el;
5271
+ }
5249
5272
  static isNotNull(variable) {
5250
5273
  return variable !== null;
5251
5274
  }
@@ -5273,44 +5296,55 @@ var g = class g {
5273
5296
  g.errorModalIsShowed = true;
5274
5297
  return false;
5275
5298
  }
5276
- static async fetchBase({ url, type = "GET", params = void 0 }, strict) {
5299
+ static async fetchBase({ url, type = "GET", params = void 0, headers = {} }, strict) {
5277
5300
  try {
5278
- let fetchParams = {
5279
- method: type,
5280
- headers: {
5281
- "Content-Type": "application/json",
5282
- "Accept": "application/json",
5283
- "X-Requested-With": "XMLHttpRequest",
5284
- "X-CSRF-TOKEN": __const("token")
5285
- }
5301
+ const isFormData = params instanceof FormData;
5302
+ const finalHeaders = {
5303
+ "Accept": "application/json",
5304
+ "X-Requested-With": "XMLHttpRequest",
5305
+ "X-CSRF-TOKEN": __const("token") ?? "",
5306
+ ...!isFormData ? { "Content-Type": "application/json" } : {},
5307
+ ...headers
5286
5308
  };
5287
- if (type !== "GET" && params !== void 0) fetchParams.body = JSON.stringify(params);
5309
+ const needsSpoofing = isFormData && [
5310
+ "PUT",
5311
+ "PATCH",
5312
+ "DELETE"
5313
+ ].includes(type);
5314
+ if (needsSpoofing && params instanceof FormData) params.append("_method", type);
5315
+ const fetchParams = {
5316
+ method: needsSpoofing ? "POST" : type,
5317
+ headers: finalHeaders
5318
+ };
5319
+ if (type !== "GET" && params !== void 0) fetchParams.body = isFormData ? params : JSON.stringify(params);
5288
5320
  const response = await fetch(url, fetchParams);
5289
5321
  const result = await response.json();
5290
5322
  if (typeof result === "string") {
5291
- const reason = result === "" ? "El servidor ha devuelto una respuesta vacia" : result;
5323
+ const reason = result === "" ? "The server returned an empty response." : result;
5292
5324
  return Promise.reject(reason);
5293
5325
  }
5294
5326
  result.ok = response.ok;
5295
5327
  if (strict && !response.ok) return Promise.reject(result);
5296
5328
  return Promise.resolve(result);
5297
5329
  } catch (e) {
5298
- console.error("Error con fetch");
5330
+ console.error("Fetch request failed.");
5299
5331
  return Promise.reject(e);
5300
5332
  }
5301
5333
  }
5302
- static async fetch({ url, type = "GET", params = void 0 }) {
5334
+ static async fetch({ url, type = "GET", params = void 0, headers = {} }) {
5303
5335
  return await g.fetchBase({
5304
5336
  url,
5305
5337
  type,
5306
- params
5338
+ params,
5339
+ headers
5307
5340
  }, false);
5308
5341
  }
5309
- static async fetchStrict({ url, type = "GET", params = void 0 }) {
5342
+ static async fetchStrict({ url, type = "GET", params = void 0, headers = {} }) {
5310
5343
  return await g.fetchBase({
5311
5344
  url,
5312
5345
  type,
5313
- params
5346
+ params,
5347
+ headers
5314
5348
  }, true);
5315
5349
  }
5316
5350
  static async fetchString({ url, type = "GET", params = void 0 }) {
@@ -5582,6 +5616,93 @@ var g = class g {
5582
5616
  }
5583
5617
  };
5584
5618
  //#endregion
5619
+ //#region src/app/Dropzone.ts
5620
+ var Dropzone = class {
5621
+ dropzone;
5622
+ fileInput;
5623
+ dragClasses;
5624
+ uploadFiles;
5625
+ onError;
5626
+ openPickerOnDropzoneClick;
5627
+ triggers;
5628
+ onClickHandler;
5629
+ onPreventDefault;
5630
+ onDragEnter;
5631
+ onDragLeave;
5632
+ onDrop;
5633
+ onFileChange;
5634
+ constructor(params) {
5635
+ this.dropzone = g.resolveElement(params.dropzone, "dropzone", "Dropzone");
5636
+ this.fileInput = g.resolveElement(params.input, "input", "Dropzone");
5637
+ this.dragClasses = params.dragClasses ?? [];
5638
+ this.uploadFiles = params.uploadFiles;
5639
+ this.onError = params.onError ?? ((error) => console.error("[Dropzone]", error));
5640
+ this.openPickerOnDropzoneClick = params.openPickerOnDropzoneClick ?? false;
5641
+ this.triggers = this.resolveTriggers(params.triggers);
5642
+ this.onClickHandler = () => this.fileInput.click();
5643
+ this.onPreventDefault = (e) => e.preventDefault();
5644
+ this.onDragEnter = () => {
5645
+ if (this.dragClasses.length) this.dropzone.classList.add(...this.dragClasses);
5646
+ };
5647
+ this.onDragLeave = () => {
5648
+ if (this.dragClasses.length) this.dropzone.classList.remove(...this.dragClasses);
5649
+ };
5650
+ this.onDrop = (e) => {
5651
+ const dt = e.dataTransfer;
5652
+ if (dt && dt.files.length) this.uploadFiles(dt.files).catch(this.onError);
5653
+ };
5654
+ this.onFileChange = () => {
5655
+ if (this.fileInput.files && this.fileInput.files.length) this.uploadFiles(this.fileInput.files).catch(this.onError);
5656
+ };
5657
+ this.init();
5658
+ }
5659
+ resolveTriggers(triggers) {
5660
+ if (!triggers) return [];
5661
+ return (Array.isArray(triggers) ? triggers : [triggers]).map((t) => g.resolveElement(t, "triggers", "Dropzone"));
5662
+ }
5663
+ init() {
5664
+ if (this.openPickerOnDropzoneClick) this.dropzone.addEventListener("click", this.onClickHandler);
5665
+ this.triggers.forEach((trigger) => trigger.addEventListener("click", this.onClickHandler));
5666
+ [
5667
+ "dragenter",
5668
+ "dragover",
5669
+ "dragleave",
5670
+ "drop"
5671
+ ].forEach((eventName) => {
5672
+ this.dropzone.addEventListener(eventName, this.onPreventDefault, false);
5673
+ });
5674
+ ["dragenter", "dragover"].forEach((eventName) => {
5675
+ this.dropzone.addEventListener(eventName, this.onDragEnter);
5676
+ });
5677
+ ["dragleave", "drop"].forEach((eventName) => {
5678
+ this.dropzone.addEventListener(eventName, this.onDragLeave);
5679
+ });
5680
+ this.dropzone.addEventListener("drop", this.onDrop);
5681
+ this.fileInput.addEventListener("change", this.onFileChange);
5682
+ }
5683
+ /** Removes all event listeners registered by this instance. */
5684
+ destroy() {
5685
+ if (this.openPickerOnDropzoneClick) this.dropzone.removeEventListener("click", this.onClickHandler);
5686
+ this.triggers.forEach((trigger) => trigger.removeEventListener("click", this.onClickHandler));
5687
+ [
5688
+ "dragenter",
5689
+ "dragover",
5690
+ "dragleave",
5691
+ "drop"
5692
+ ].forEach((eventName) => {
5693
+ this.dropzone.removeEventListener(eventName, this.onPreventDefault);
5694
+ });
5695
+ ["dragenter", "dragover"].forEach((eventName) => {
5696
+ this.dropzone.removeEventListener(eventName, this.onDragEnter);
5697
+ });
5698
+ ["dragleave", "drop"].forEach((eventName) => {
5699
+ this.dropzone.removeEventListener(eventName, this.onDragLeave);
5700
+ });
5701
+ this.dropzone.removeEventListener("drop", this.onDrop);
5702
+ this.fileInput.removeEventListener("change", this.onFileChange);
5703
+ }
5704
+ };
5705
+ //#endregion
5585
5706
  //#region src/app/Html.ts
5586
5707
  var Html = class {
5587
5708
  static compareTailwindClassesHTML(htmlA, htmlB) {
@@ -5797,6 +5918,25 @@ var Notify = class Notify {
5797
5918
  }
5798
5919
  };
5799
5920
  //#endregion
5921
+ //#region src/app/Spinner.ts
5922
+ var Spinner = class {
5923
+ $spinner;
5924
+ $spinnerBackdrop;
5925
+ constructor(parent) {
5926
+ const parentElement = g.resolveElement(parent, "parent", "Spinner");
5927
+ this.$spinner = parentElement?.querySelector("[data-is-spinner=\"true\"]");
5928
+ this.$spinnerBackdrop = parentElement?.querySelector("[data-is-spinner-backdrop=\"true\"]");
5929
+ }
5930
+ show() {
5931
+ this.$spinner?.classList.remove("hidden");
5932
+ this.$spinnerBackdrop?.classList.remove("hidden");
5933
+ }
5934
+ hide() {
5935
+ this.$spinner?.classList.add("hidden");
5936
+ this.$spinnerBackdrop?.classList.add("hidden");
5937
+ }
5938
+ };
5939
+ //#endregion
5800
5940
  //#region src/app/SSelect.ts
5801
5941
  var SLIM_EVENT_KEYS = [
5802
5942
  "search",
@@ -6461,6 +6601,7 @@ exports.Component = Component;
6461
6601
  exports.Constants = Constants;
6462
6602
  exports.Cookie = Cookie;
6463
6603
  exports.DomService = DomService;
6604
+ exports.Dropzone = Dropzone;
6464
6605
  exports.EchoService = EchoService;
6465
6606
  exports.EnumVo = EnumVo;
6466
6607
  exports.FModal = FModal;
@@ -6479,6 +6620,7 @@ exports.Route = Route;
6479
6620
  exports.SModal = SModal;
6480
6621
  exports.SSelect = SSelect;
6481
6622
  exports.SidebarState = SidebarState;
6623
+ exports.Spinner = Spinner;
6482
6624
  exports.StorageProcessKeys = StorageProcessKeys;
6483
6625
  exports.StringVo = StringVo;
6484
6626
  exports.Test = Test;