ShayanRl commited on
Commit
e945b07
·
verified ·
1 Parent(s): 7bc6506

Update index.mjs

Browse files
Files changed (1) hide show
  1. index.mjs +174 -169
index.mjs CHANGED
@@ -2,183 +2,188 @@
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";
 
 
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
+ REGEXREPLACE: [
78
+ { name: "text", type: "string", default: "Replace all numbers like 42 and 123 in this text" },
79
+ { name: "regular_expression", type: "string", default: "\\d+" },
80
+ { name: "replacement", type: "string", default: "[number]" }
81
+ ]
82
+ };
83
+
84
+ // Update parameters when formula changes
85
+ formulaSelect.addEventListener("change", updateParams);
86
+
87
+ // Initial parameter setup
88
+ updateParams();
89
+
90
+ // Calculate result when button is clicked
91
+ calculateBtn.addEventListener("click", calculateResult);
92
+
93
+ function updateParams() {
94
+ const selectedFormula = formulaSelect.value;
95
+ const params = formulaParams[selectedFormula];
96
 
97
+ // Clear existing parameters
98
+ paramsContainer.innerHTML = "";
99
 
100
+ // Add parameter inputs
101
+ params.forEach(param => {
102
+ const paramContainer = document.createElement("div");
103
+ paramContainer.className = "param-container";
104
 
105
+ const label = document.createElement("label");
106
+ label.className = "param-label";
107
+ label.textContent = param.name;
108
 
109
+ const input = document.createElement("input");
110
+ input.type = "text";
111
+ input.id = `param-${param.name}`;
112
+ input.value = param.default;
113
+
114
+ paramContainer.appendChild(label);
115
+ paramContainer.appendChild(input);
116
+ paramsContainer.appendChild(paramContainer);
117
+ });
118
+ }
119
+
120
+ function calculateResult() {
121
+ const selectedFormula = formulaSelect.value;
122
+ const params = formulaParams[selectedFormula];
 
 
 
 
 
123
 
124
+ // Get parameter values
125
+ const paramValues = params.map(param => {
126
+ const value = document.getElementById(`param-${param.name}`).value;
127
 
128
+ if (param.type === "array") {
129
+ try {
130
+ return JSON.parse(value);
131
+ } catch (e) {
132
+ return value;
 
 
 
 
 
 
 
 
 
133
  }
134
+ } else if (param.type === "number") {
135
+ return parseFloat(value);
136
+ } else if (param.type === "boolean") {
137
+ return value.toLowerCase() === "true";
138
+ }
139
 
140
+ return value;
141
+ });
142
+
143
+ try {
144
+ let result;
145
+
146
+ // FormulaJS has changed its export structure in newer versions
147
+ // First try window.formulajs (older versions)
148
+ if (window.formulajs && typeof window.formulajs[selectedFormula] === 'function') {
149
+ result = window.formulajs[selectedFormula](...paramValues);
150
+ }
151
+ // Then try window.Formula (newer versions)
152
+ else if (window.Formula && typeof window.Formula[selectedFormula] === 'function') {
153
+ result = window.Formula[selectedFormula](...paramValues);
154
+ }
155
+ // Custom implementation for regex functions if not available
156
+ else if (selectedFormula === 'REGEXEXTRACT') {
157
+ const [text, pattern] = paramValues;
158
+ const regex = new RegExp(pattern);
159
+ const match = text.match(regex);
160
+ result = match ? match[0] : null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  }
162
+ else if (selectedFormula === 'REGEXMATCH') {
163
+ const [text, pattern] = paramValues;
164
+ const regex = new RegExp(pattern);
165
+ result = regex.test(text);
166
+ }
167
+ else {
168
+ throw new Error(`Function ${selectedFormula} not found in FormulaJS`);
169
+ }
170
+
171
+ // Display result
172
+ resultDiv.textContent = result !== undefined ? result : "undefined";
173
+
174
+ // Show the code
175
+ const formulaNamespace = window.formulajs ? "formulajs" : "Formula";
176
+ formulaCodeDiv.textContent = `${formulaNamespace}.${selectedFormula}(${paramValues.map(v =>
177
+ typeof v === 'object' ? JSON.stringify(v) :
178
+ typeof v === 'string' ? `"${v}"` : v
179
+ ).join(", ")}) = ${result}`;
180
+ } catch (error) {
181
+ resultDiv.textContent = "Error";
182
+ formulaCodeDiv.textContent = error.message;
183
  }
184
+ }
185
+ });
186
+
187
+ // Export any functions you want to make available to other modules
188
+ // This is optional and not needed for this playground
189
+ export const version = "1.0.0";