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.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.es.js +10 -10
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.es.js +3 -3
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +2 -2
- package/dist/chunks/{ChatView-BN2Rl2UP.js → ChatView-Bvm6s3lL.js} +2 -2
- package/dist/chunks/{ChatView-BN2Rl2UP.js.map → ChatView-Bvm6s3lL.js.map} +1 -1
- package/dist/chunks/{ChatView-CGiNfhMt.js → ChatView-f83l3Xdw.js} +6 -6
- package/dist/chunks/{ChatView-CGiNfhMt.js.map → ChatView-f83l3Xdw.js.map} +1 -1
- package/dist/chunks/{ContextMenu-BBy3nk5G.js → ContextMenu-CaRTIPyI.js} +2 -2
- package/dist/chunks/{ContextMenu-BBy3nk5G.js.map → ContextMenu-CaRTIPyI.js.map} +1 -1
- package/dist/chunks/{ContextMenu-9lS3qUwW.js → ContextMenu-xR2hFn_G.js} +2 -2
- package/dist/chunks/{ContextMenu-9lS3qUwW.js.map → ContextMenu-xR2hFn_G.js.map} +1 -1
- package/dist/chunks/{DataView-CvD3EvJ9.js → DataView-BChtBLLm.js} +2 -2
- package/dist/chunks/{DataView-CvD3EvJ9.js.map → DataView-BChtBLLm.js.map} +1 -1
- package/dist/chunks/{DataView-PSRYZfrq.js → DataView-CdxyJy4U.js} +2 -2
- package/dist/chunks/{DataView-PSRYZfrq.js.map → DataView-CdxyJy4U.js.map} +1 -1
- package/dist/chunks/{Dialog-BUZ3RRPM.js → Dialog-C9WBKR7l.js} +5 -5
- package/dist/chunks/{Dialog-BUZ3RRPM.js.map → Dialog-C9WBKR7l.js.map} +1 -1
- package/dist/chunks/{Dialog-C_HOebyH.js → Dialog-yZyU8QbA.js} +2 -2
- package/dist/chunks/{Dialog-C_HOebyH.js.map → Dialog-yZyU8QbA.js.map} +1 -1
- package/dist/chunks/{FormView-Di5zdS39.js → FormView-DGeNywQz.js} +2 -2
- package/dist/chunks/FormView-DGeNywQz.js.map +1 -0
- package/dist/chunks/{FormView-CeoubZ-s.js → FormView-Dh8Yqk2d.js} +136 -20
- package/dist/chunks/FormView-Dh8Yqk2d.js.map +1 -0
- package/dist/chunks/{MetricsMiniChartWidget-Df_aqXiH.js → MetricsMiniChartWidget-BDoykhIh.js} +3 -3
- package/dist/chunks/{MetricsMiniChartWidget-Df_aqXiH.js.map → MetricsMiniChartWidget-BDoykhIh.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-RKmQrR86.js → MetricsMiniChartWidget-CmH0UNxw.js} +2 -2
- package/dist/chunks/{MetricsMiniChartWidget-RKmQrR86.js.map → MetricsMiniChartWidget-CmH0UNxw.js.map} +1 -1
- package/dist/chunks/{PDFViewer-CQDTUfSe.js → PDFViewer-Bqih2-YH.js} +3 -3
- package/dist/chunks/{PDFViewer-CQDTUfSe.js.map → PDFViewer-Bqih2-YH.js.map} +1 -1
- package/dist/chunks/{PDFViewer-DL3ALPrt.js → PDFViewer-C8tWPu9l.js} +2 -2
- package/dist/chunks/{PDFViewer-DL3ALPrt.js.map → PDFViewer-C8tWPu9l.js.map} +1 -1
- package/dist/chunks/{Page-B2QytRMU.js → Page-ChnmGaXN.js} +2 -2
- package/dist/chunks/{Page-B2QytRMU.js.map → Page-ChnmGaXN.js.map} +1 -1
- package/dist/chunks/{Page-DpnZbCfy.js → Page-DecngD1D.js} +2 -2
- package/dist/chunks/{Page-DpnZbCfy.js.map → Page-DecngD1D.js.map} +1 -1
- package/dist/chunks/{TopNav-BUxuDl2O.js → TopNav-C0GKPOSi.js} +5 -5
- package/dist/chunks/{TopNav-BUxuDl2O.js.map → TopNav-C0GKPOSi.js.map} +1 -1
- package/dist/chunks/{TopNav-DB42WdTi.js → TopNav-DEf4Q_5K.js} +2 -2
- package/dist/chunks/{TopNav-DB42WdTi.js.map → TopNav-DEf4Q_5K.js.map} +1 -1
- package/dist/chunks/{WebApp-BsUzNFg3.js → WebApp-CCK9ce5Y.js} +13 -13
- package/dist/chunks/{WebApp-BsUzNFg3.js.map → WebApp-CCK9ce5Y.js.map} +1 -1
- package/dist/chunks/{WebApp-DdLjexxg.js → WebApp-zMt0FZbX.js} +2 -2
- package/dist/chunks/{WebApp-DdLjexxg.js.map → WebApp-zMt0FZbX.js.map} +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +5 -5
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +11 -11
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/FormView-CeoubZ-s.js.map +0 -1
- 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-
|
|
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(
|
|
987
|
-
optionsHTML =
|
|
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
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
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
|
|
2748
|
-
this.selectedValue = this.selectedValue
|
|
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 =
|
|
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 =
|
|
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
|
|
3078
|
-
newValue = newValue
|
|
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-
|
|
6222
|
+
//# sourceMappingURL=FormView-Dh8Yqk2d.js.map
|