web-mojo 2.1.697 → 2.1.699

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.
Files changed (57) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.es.js +10 -10
  3. package/dist/auth.cjs.js +1 -1
  4. package/dist/auth.cjs.js.map +1 -1
  5. package/dist/auth.es.js +3 -3
  6. package/dist/auth.es.js.map +1 -1
  7. package/dist/charts.cjs.js +1 -1
  8. package/dist/charts.es.js +2 -2
  9. package/dist/chunks/{ChatView-BN2Rl2UP.js → ChatView-Bvm6s3lL.js} +2 -2
  10. package/dist/chunks/{ChatView-BN2Rl2UP.js.map → ChatView-Bvm6s3lL.js.map} +1 -1
  11. package/dist/chunks/{ChatView-CGiNfhMt.js → ChatView-f83l3Xdw.js} +6 -6
  12. package/dist/chunks/{ChatView-CGiNfhMt.js.map → ChatView-f83l3Xdw.js.map} +1 -1
  13. package/dist/chunks/{ContextMenu-BBy3nk5G.js → ContextMenu-CaRTIPyI.js} +2 -2
  14. package/dist/chunks/{ContextMenu-BBy3nk5G.js.map → ContextMenu-CaRTIPyI.js.map} +1 -1
  15. package/dist/chunks/{ContextMenu-9lS3qUwW.js → ContextMenu-xR2hFn_G.js} +2 -2
  16. package/dist/chunks/{ContextMenu-9lS3qUwW.js.map → ContextMenu-xR2hFn_G.js.map} +1 -1
  17. package/dist/chunks/{DataView-CvD3EvJ9.js → DataView-BChtBLLm.js} +2 -2
  18. package/dist/chunks/{DataView-CvD3EvJ9.js.map → DataView-BChtBLLm.js.map} +1 -1
  19. package/dist/chunks/{DataView-PSRYZfrq.js → DataView-CdxyJy4U.js} +2 -2
  20. package/dist/chunks/{DataView-PSRYZfrq.js.map → DataView-CdxyJy4U.js.map} +1 -1
  21. package/dist/chunks/{Dialog-BUZ3RRPM.js → Dialog-C9WBKR7l.js} +5 -5
  22. package/dist/chunks/{Dialog-BUZ3RRPM.js.map → Dialog-C9WBKR7l.js.map} +1 -1
  23. package/dist/chunks/{Dialog-C_HOebyH.js → Dialog-yZyU8QbA.js} +2 -2
  24. package/dist/chunks/{Dialog-C_HOebyH.js.map → Dialog-yZyU8QbA.js.map} +1 -1
  25. package/dist/chunks/{FormView-Di5zdS39.js → FormView-DGeNywQz.js} +2 -2
  26. package/dist/chunks/FormView-DGeNywQz.js.map +1 -0
  27. package/dist/chunks/{FormView-CeoubZ-s.js → FormView-Dh8Yqk2d.js} +136 -20
  28. package/dist/chunks/FormView-Dh8Yqk2d.js.map +1 -0
  29. package/dist/chunks/{MetricsMiniChartWidget-Df_aqXiH.js → MetricsMiniChartWidget-BDoykhIh.js} +3 -3
  30. package/dist/chunks/{MetricsMiniChartWidget-Df_aqXiH.js.map → MetricsMiniChartWidget-BDoykhIh.js.map} +1 -1
  31. package/dist/chunks/{MetricsMiniChartWidget-RKmQrR86.js → MetricsMiniChartWidget-CmH0UNxw.js} +2 -2
  32. package/dist/chunks/{MetricsMiniChartWidget-RKmQrR86.js.map → MetricsMiniChartWidget-CmH0UNxw.js.map} +1 -1
  33. package/dist/chunks/{PDFViewer-CQDTUfSe.js → PDFViewer-Bqih2-YH.js} +3 -3
  34. package/dist/chunks/{PDFViewer-CQDTUfSe.js.map → PDFViewer-Bqih2-YH.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-DL3ALPrt.js → PDFViewer-C8tWPu9l.js} +2 -2
  36. package/dist/chunks/{PDFViewer-DL3ALPrt.js.map → PDFViewer-C8tWPu9l.js.map} +1 -1
  37. package/dist/chunks/{Page-B2QytRMU.js → Page-ChnmGaXN.js} +2 -2
  38. package/dist/chunks/{Page-B2QytRMU.js.map → Page-ChnmGaXN.js.map} +1 -1
  39. package/dist/chunks/{Page-DpnZbCfy.js → Page-DecngD1D.js} +2 -2
  40. package/dist/chunks/{Page-DpnZbCfy.js.map → Page-DecngD1D.js.map} +1 -1
  41. package/dist/chunks/{TopNav-BUxuDl2O.js → TopNav-C0GKPOSi.js} +5 -5
  42. package/dist/chunks/{TopNav-BUxuDl2O.js.map → TopNav-C0GKPOSi.js.map} +1 -1
  43. package/dist/chunks/{TopNav-DB42WdTi.js → TopNav-DEf4Q_5K.js} +2 -2
  44. package/dist/chunks/{TopNav-DB42WdTi.js.map → TopNav-DEf4Q_5K.js.map} +1 -1
  45. package/dist/chunks/{WebApp-BsUzNFg3.js → WebApp-CCK9ce5Y.js} +13 -13
  46. package/dist/chunks/{WebApp-BsUzNFg3.js.map → WebApp-CCK9ce5Y.js.map} +1 -1
  47. package/dist/chunks/{WebApp-DdLjexxg.js → WebApp-zMt0FZbX.js} +2 -2
  48. package/dist/chunks/{WebApp-DdLjexxg.js.map → WebApp-zMt0FZbX.js.map} +1 -1
  49. package/dist/docit.cjs.js +1 -1
  50. package/dist/docit.es.js +5 -5
  51. package/dist/index.cjs.js +1 -1
  52. package/dist/index.es.js +11 -11
  53. package/dist/lightbox.cjs.js +1 -1
  54. package/dist/lightbox.es.js +4 -4
  55. package/package.json +1 -1
  56. package/dist/chunks/FormView-CeoubZ-s.js.map +0 -1
  57. package/dist/chunks/FormView-Di5zdS39.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-BsUzNFg3.js";
1
+ import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-CCK9ce5Y.js";
2
2
  class FormBuilder {
3
3
  constructor(config = {}) {
4
4
  this.fields = config.fields || [];
@@ -974,7 +974,14 @@ class FormBuilder {
974
974
  searchable = false,
975
975
  class: fieldClass = "",
976
976
  attributes = {},
977
- help = field.helpText || field.help || ""
977
+ help = field.helpText || field.help || "",
978
+ // Auto-generation parameters
979
+ start = field.start,
980
+ end = field.end,
981
+ step = field.step,
982
+ format = field.format,
983
+ prefix = field.prefix,
984
+ suffix = field.suffix
978
985
  } = field;
979
986
  const inputClass = `form-select ${fieldClass}`.trim();
980
987
  const error = this.errors[name];
@@ -982,9 +989,15 @@ class FormBuilder {
982
989
  const fieldValue = dataValue ?? value;
983
990
  const attrs = Object.entries(attributes).map(([key, val]) => `${key}="${this.escapeHtml(val)}"`).join(" ");
984
991
  const fieldId = this.getFieldId(name);
992
+ let generatedOptions = [...options];
993
+ if (start !== void 0 && end !== void 0) {
994
+ const stepValue = step !== void 0 ? step : 1;
995
+ const autoOptions = this.generateSelectOptions(start, end, stepValue, { format, prefix, suffix });
996
+ generatedOptions = [...generatedOptions, ...autoOptions];
997
+ }
985
998
  let optionsHTML = "";
986
- if (Array.isArray(options)) {
987
- optionsHTML = options.map((option) => {
999
+ if (Array.isArray(generatedOptions)) {
1000
+ optionsHTML = generatedOptions.map((option) => {
988
1001
  if (typeof option === "string") {
989
1002
  const selected = option === fieldValue ? "selected" : "";
990
1003
  return `<option value="${this.escapeHtml(option)}" ${selected}>${this.escapeHtml(option)}</option>`;
@@ -1616,6 +1629,7 @@ class FormBuilder {
1616
1629
  maxItems = 10,
1617
1630
  emptyFetch = false,
1618
1631
  debounceMs = 300,
1632
+ requiresActiveGroup = false,
1619
1633
  help = field.helpText || field.help || ""
1620
1634
  } = field;
1621
1635
  const fieldId = this.getFieldId(name);
@@ -1638,7 +1652,8 @@ class FormBuilder {
1638
1652
  debounceMs,
1639
1653
  disabled,
1640
1654
  readonly,
1641
- required
1655
+ required,
1656
+ requiresActiveGroup
1642
1657
  })}'>
1643
1658
  <input type="text"
1644
1659
  id="${fieldId}"
@@ -1873,6 +1888,78 @@ class FormBuilder {
1873
1888
  }
1874
1889
  return `btn btn-${variant}`;
1875
1890
  }
1891
+ /**
1892
+ * Generate select options automatically from numeric range or patterns
1893
+ * Supports multiple generation modes:
1894
+ * - Numeric ranges: start, end, step
1895
+ * - Formatting: format function, prefix, suffix
1896
+ *
1897
+ * @param {number} start - Start value (inclusive)
1898
+ * @param {number} end - End value (inclusive)
1899
+ * @param {number} step - Step increment (default: 1)
1900
+ * @param {Object} options - Additional options
1901
+ * @param {Function|string} options.format - Format function or preset ('padded', 'ordinal')
1902
+ * @param {string} options.prefix - Prefix for label
1903
+ * @param {string} options.suffix - Suffix for label
1904
+ * @returns {Array} Array of option objects {value, label}
1905
+ *
1906
+ * @example
1907
+ * // Hours 1-24
1908
+ * generateSelectOptions(1, 24, 1)
1909
+ *
1910
+ * // Minutes in 15-min increments with padding
1911
+ * generateSelectOptions(0, 45, 15, { format: 'padded' })
1912
+ *
1913
+ * // Days with ordinal suffix
1914
+ * generateSelectOptions(1, 31, 1, { format: 'ordinal' })
1915
+ *
1916
+ * // Years with prefix
1917
+ * generateSelectOptions(2020, 2030, 1, { prefix: 'Year ' })
1918
+ *
1919
+ * // Percentages
1920
+ * generateSelectOptions(0, 100, 10, { suffix: '%' })
1921
+ *
1922
+ * // Custom formatter
1923
+ * generateSelectOptions(1, 12, 1, {
1924
+ * format: (v) => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
1925
+ * 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][v-1]
1926
+ * })
1927
+ */
1928
+ generateSelectOptions(start, end, step = 1, options = {}) {
1929
+ const { format, prefix = "", suffix = "" } = options;
1930
+ const results = [];
1931
+ const increment = start <= end ? Math.abs(step) : -Math.abs(step);
1932
+ for (let i = start; start <= end ? i <= end : i >= end; i += increment) {
1933
+ let label = String(i);
1934
+ if (typeof format === "function") {
1935
+ label = format(i);
1936
+ } else if (format === "padded" || format === "pad") {
1937
+ const maxLength = String(Math.max(Math.abs(start), Math.abs(end))).length;
1938
+ label = String(i).padStart(maxLength, "0");
1939
+ } else if (format === "ordinal") {
1940
+ label = this.formatOrdinal(i);
1941
+ }
1942
+ label = `${prefix}${label}${suffix}`;
1943
+ results.push({
1944
+ value: i,
1945
+ label
1946
+ });
1947
+ }
1948
+ return results;
1949
+ }
1950
+ /**
1951
+ * Format number with ordinal suffix (1st, 2nd, 3rd, etc.)
1952
+ * @param {number} num - Number to format
1953
+ * @returns {string} Formatted ordinal string
1954
+ */
1955
+ formatOrdinal(num) {
1956
+ const j = num % 10;
1957
+ const k = num % 100;
1958
+ if (j === 1 && k !== 11) return num + "st";
1959
+ if (j === 2 && k !== 12) return num + "nd";
1960
+ if (j === 3 && k !== 13) return num + "rd";
1961
+ return num + "th";
1962
+ }
1876
1963
  /**
1877
1964
  * Escape HTML characters to prevent XSS
1878
1965
  * @param {string} str - String to escape
@@ -2649,14 +2736,18 @@ class CollectionDropdownView extends View {
2649
2736
  this.focusedIndex = options.focusedIndex || -1;
2650
2737
  }
2651
2738
  async getViewData() {
2652
- const items = this.collection ? this.collection.toJSON().map((item, index) => ({
2653
- ...item,
2654
- labelField: item[this.labelField],
2655
- valueField: item[this.valueField],
2656
- isSelected: item[this.valueField] == this.selectedValue,
2657
- isFocused: index === this.focusedIndex,
2658
- index
2659
- })) : [];
2739
+ const items = this.collection ? this.collection.toJSON().map((item, index) => {
2740
+ const labelValue = MOJOUtils.getNestedValue(item, this.labelField);
2741
+ const fieldValue = MOJOUtils.getNestedValue(item, this.valueField);
2742
+ return {
2743
+ ...item,
2744
+ labelField: labelValue,
2745
+ valueField: fieldValue,
2746
+ isSelected: fieldValue == this.selectedValue,
2747
+ isFocused: index === this.focusedIndex,
2748
+ index
2749
+ };
2750
+ }) : [];
2660
2751
  return {
2661
2752
  loading: this.loading,
2662
2753
  hasSearched: this.hasSearched,
@@ -2734,6 +2825,7 @@ class CollectionSelectView extends View {
2734
2825
  this.debounceMs = options.debounceMs || 1e3;
2735
2826
  this.name = options.name || "collection_select";
2736
2827
  this.emptyFetch = options.emptyFetch !== false;
2828
+ this.requiresActiveGroup = options.requiresActiveGroup || false;
2737
2829
  this.selectedValue = options.value || "0";
2738
2830
  this.selectedLabel = "";
2739
2831
  this.searchValue = "";
@@ -2744,8 +2836,8 @@ class CollectionSelectView extends View {
2744
2836
  this.hasError = false;
2745
2837
  this.errorMessage = "";
2746
2838
  if (this.selectedValue && typeof this.selectedValue === "object") {
2747
- this.selectedLabel = this.selectedValue[this.labelField] || "";
2748
- this.selectedValue = this.selectedValue[this.valueField] || "0";
2839
+ this.selectedLabel = MOJOUtils.getNestedValue(this.selectedValue, this.labelField) || "";
2840
+ this.selectedValue = MOJOUtils.getNestedValue(this.selectedValue, this.valueField) || "0";
2749
2841
  }
2750
2842
  this.searchTimer = null;
2751
2843
  this.dropdownView = null;
@@ -2763,6 +2855,13 @@ class CollectionSelectView extends View {
2763
2855
  this.defaultParams = { ...this.collection.params };
2764
2856
  this.collection.params.size = this.maxItems;
2765
2857
  this.defaultParams.size = this.maxItems;
2858
+ if (this.requiresActiveGroup) {
2859
+ const app = this.getApp();
2860
+ if (app && app.activeGroup && app.activeGroup.id) {
2861
+ this.collection.params.group = app.activeGroup.id;
2862
+ this.defaultParams.group = app.activeGroup.id;
2863
+ }
2864
+ }
2766
2865
  this.collection.on("fetch:start", () => {
2767
2866
  this.loading = true;
2768
2867
  this.showDropdown = true;
@@ -2796,13 +2895,13 @@ class CollectionSelectView extends View {
2796
2895
  if (this.selectedLabel) return;
2797
2896
  const selectedModel = this.collection?.get(this.selectedValue);
2798
2897
  if (selectedModel) {
2799
- this.selectedLabel = selectedModel.get(this.labelField);
2898
+ this.selectedLabel = this.getFieldValue(selectedModel, this.labelField);
2800
2899
  this.render(false);
2801
2900
  return;
2802
2901
  }
2803
2902
  let model = await this.collection.fetchOne(this.selectedValue);
2804
2903
  if (model) {
2805
- this.selectedLabel = model.get(this.labelField, `${model.constructor.name} #${model.id}`);
2904
+ this.selectedLabel = this.getFieldValue(model, this.labelField) || `${model.constructor.name} #${model.id}`;
2806
2905
  this.render(false);
2807
2906
  }
2808
2907
  } catch (error) {
@@ -3074,8 +3173,8 @@ class CollectionSelectView extends View {
3074
3173
  let newValue = value;
3075
3174
  let newLabel = "";
3076
3175
  if (newValue && typeof newValue === "object") {
3077
- newLabel = newValue[this.labelField] || "";
3078
- newValue = newValue[this.valueField];
3176
+ newLabel = MOJOUtils.getNestedValue(newValue, this.labelField) || "";
3177
+ newValue = MOJOUtils.getNestedValue(newValue, this.valueField);
3079
3178
  }
3080
3179
  newValue = newValue || "0";
3081
3180
  if (newValue == this.selectedValue) {
@@ -3096,6 +3195,23 @@ class CollectionSelectView extends View {
3096
3195
  this.render();
3097
3196
  }
3098
3197
  }
3198
+ /**
3199
+ * Helper method to get field value from model or plain object with dot notation support
3200
+ * @param {Object|Model} item - The item to get value from
3201
+ * @param {string} fieldPath - The field path (supports dot notation)
3202
+ * @returns {*} The field value
3203
+ */
3204
+ getFieldValue(item, fieldPath) {
3205
+ if (!item || !fieldPath) return void 0;
3206
+ if (typeof item.get === "function") {
3207
+ const value = item.get(fieldPath);
3208
+ if (value === void 0 && fieldPath.includes(".")) {
3209
+ return MOJOUtils.getNestedValue(item, fieldPath);
3210
+ }
3211
+ return value;
3212
+ }
3213
+ return MOJOUtils.getNestedValue(item, fieldPath);
3214
+ }
3099
3215
  }
3100
3216
  class DatePicker extends View {
3101
3217
  constructor(options = {}) {
@@ -6103,4 +6219,4 @@ export {
6103
6219
  applyFileDropMixin as a,
6104
6220
  FormView$1 as b
6105
6221
  };
6106
- //# sourceMappingURL=FormView-CeoubZ-s.js.map
6222
+ //# sourceMappingURL=FormView-Dh8Yqk2d.js.map