ShayanRl commited on
Commit
1f1bb3e
·
verified ·
1 Parent(s): c65a1a8

Create index.mjs

Browse files
Files changed (1) hide show
  1. index.mjs +184 -0
index.mjs ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // ECMAScript Module format for FormulaJS playground
2
+
3
+ // Check which FormulaJS API is available when page loads
4
+ document.addEventListener("DOMContentLoaded", function() {
5
+ console.log("FormulaJS API Check:");
6
+ if (window.formulajs) {
7
+ console.log("Using window.formulajs API");
8
+ } else if (window.Formula) {
9
+ console.log("Using window.Formula API");
10
+ } else {
11
+ console.warn("FormulaJS library not detected. Some functions may not work.");
12
+ }
13
+
14
+ const formulaSelect = document.getElementById("formula-select");
15
+ const paramsContainer = document.getElementById("params-container");
16
+ const calculateBtn = document.getElementById("calculate-btn");
17
+ const resultDiv = document.getElementById("result");
18
+ const formulaCodeDiv = document.getElementById("formula-code");
19
+
20
+ // Define parameters for each formula
21
+ const formulaParams = {
22
+ SUM: [
23
+ { name: "number1", type: "number", default: 1 },
24
+ { name: "number2", type: "number", default: 2 },
25
+ { name: "number3", type: "number", default: 3 }
26
+ ],
27
+ AVERAGE: [
28
+ { name: "number1", type: "number", default: 1 },
29
+ { name: "number2", type: "number", default: 2 },
30
+ { name: "number3", type: "number", default: 3 }
31
+ ],
32
+ MAX: [
33
+ { name: "number1", type: "number", default: 1 },
34
+ { name: "number2", type: "number", default: 2 },
35
+ { name: "number3", type: "number", default: 3 }
36
+ ],
37
+ MIN: [
38
+ { name: "number1", type: "number", default: 1 },
39
+ { name: "number2", type: "number", default: 2 },
40
+ { name: "number3", type: "number", default: 3 }
41
+ ],
42
+ PMT: [
43
+ { name: "rate", type: "number", default: 0.05 },
44
+ { name: "nper", type: "number", default: 36 },
45
+ { name: "pv", type: "number", default: 10000 }
46
+ ],
47
+ FV: [
48
+ { name: "rate", type: "number", default: 0.05 },
49
+ { name: "nper", type: "number", default: 10 },
50
+ { name: "pmt", type: "number", default: -100 },
51
+ { name: "pv", type: "number", default: -1000 }
52
+ ],
53
+ NPV: [
54
+ { name: "rate", type: "number", default: 0.1 },
55
+ { name: "value1", type: "number", default: -10000 },
56
+ { name: "value2", type: "number", default: 3000 },
57
+ { name: "value3", type: "number", default: 4200 },
58
+ { name: "value4", type: "number", default: 6800 }
59
+ ],
60
+ IRR: [
61
+ { name: "values", type: "array", default: "[-100, 39, 59, 55, 20]" }
62
+ ],
63
+ VLOOKUP: [
64
+ { name: "lookup_value", type: "number", default: 40 },
65
+ { name: "table_array", type: "array", default: "[[10, 'A'], [20, 'B'], [30, 'C'], [40, 'D'], [50, 'E']]" },
66
+ { name: "col_index_num", type: "number", default: 2 },
67
+ { name: "range_lookup", type: "boolean", default: false }
68
+ ],
69
+ REGEXEXTRACT: [
70
+ { name: "text", type: "string", default: "Extract 42 from this text" },
71
+ { name: "regular_expression", type: "string", default: "\\d+" }
72
+ ],
73
+ REGEXMATCH: [
74
+ { name: "text", type: "string", default: "Does this text contain numbers like 123?" },
75
+ { name: "regular_expression", type: "string", default: "\\d+" }
76
+ ]
77
+ };
78
+
79
+ // Update parameters when formula changes
80
+ formulaSelect.addEventListener("change", updateParams);
81
+
82
+ // Initial parameter setup
83
+ updateParams();
84
+
85
+ // Calculate result when button is clicked
86
+ calculateBtn.addEventListener("click", calculateResult);
87
+
88
+ function updateParams() {
89
+ const selectedFormula = formulaSelect.value;
90
+ const params = formulaParams[selectedFormula];
91
+
92
+ // Clear existing parameters
93
+ paramsContainer.innerHTML = "";
94
+
95
+ // Add parameter inputs
96
+ params.forEach(param => {
97
+ const paramContainer = document.createElement("div");
98
+ paramContainer.className = "param-container";
99
+
100
+ const label = document.createElement("label");
101
+ label.className = "param-label";
102
+ label.textContent = param.name;
103
+
104
+ const input = document.createElement("input");
105
+ input.type = "text";
106
+ input.id = `param-${param.name}`;
107
+ input.value = param.default;
108
+
109
+ paramContainer.appendChild(label);
110
+ paramContainer.appendChild(input);
111
+ paramsContainer.appendChild(paramContainer);
112
+ });
113
+ }
114
+
115
+ function calculateResult() {
116
+ const selectedFormula = formulaSelect.value;
117
+ const params = formulaParams[selectedFormula];
118
+
119
+ // Get parameter values
120
+ const paramValues = params.map(param => {
121
+ const value = document.getElementById(`param-${param.name}`).value;
122
+
123
+ if (param.type === "array") {
124
+ try {
125
+ return JSON.parse(value);
126
+ } catch (e) {
127
+ return value;
128
+ }
129
+ } else if (param.type === "number") {
130
+ return parseFloat(value);
131
+ } else if (param.type === "boolean") {
132
+ return value.toLowerCase() === "true";
133
+ }
134
+
135
+ return value;
136
+ });
137
+
138
+ try {
139
+ let result;
140
+
141
+ // FormulaJS has changed its export structure in newer versions
142
+ // First try window.formulajs (older versions)
143
+ if (window.formulajs && typeof window.formulajs[selectedFormula] === 'function') {
144
+ result = window.formulajs[selectedFormula](...paramValues);
145
+ }
146
+ // Then try window.Formula (newer versions)
147
+ else if (window.Formula && typeof window.Formula[selectedFormula] === 'function') {
148
+ result = window.Formula[selectedFormula](...paramValues);
149
+ }
150
+ // Custom implementation for regex functions if not available
151
+ else if (selectedFormula === 'REGEXEXTRACT') {
152
+ const [text, pattern] = paramValues;
153
+ const regex = new RegExp(pattern);
154
+ const match = text.match(regex);
155
+ result = match ? match[0] : null;
156
+ }
157
+ else if (selectedFormula === 'REGEXMATCH') {
158
+ const [text, pattern] = paramValues;
159
+ const regex = new RegExp(pattern);
160
+ result = regex.test(text);
161
+ }
162
+ else {
163
+ throw new Error(`Function ${selectedFormula} not found in FormulaJS`);
164
+ }
165
+
166
+ // Display result
167
+ resultDiv.textContent = result !== undefined ? result : "undefined";
168
+
169
+ // Show the code
170
+ const formulaNamespace = window.formulajs ? "formulajs" : "Formula";
171
+ formulaCodeDiv.textContent = `${formulaNamespace}.${selectedFormula}(${paramValues.map(v =>
172
+ typeof v === 'object' ? JSON.stringify(v) :
173
+ typeof v === 'string' ? `"${v}"` : v
174
+ ).join(", ")}) = ${result}`;
175
+ } catch (error) {
176
+ resultDiv.textContent = "Error";
177
+ formulaCodeDiv.textContent = error.message;
178
+ }
179
+ }
180
+ });
181
+
182
+ // Export any functions you want to make available to other modules
183
+ // This is optional and not needed for this playground
184
+ export const version = "1.0.0";