11import { OutputFormat } from "./parser/parser" ;
2- import { createFormulaInput , type FormulaInput } from "./formula_input_element" ;
2+ import { createFormulaInput } from "./formula_input_element" ;
33
44const tableElement = document . querySelector ( "table" ) ! ;
55
6+ function createIntermediateFormulaHeader (
7+ formula : string ,
8+ formulaId : number ,
9+ format : OutputFormat ,
10+ data : Record < string , unknown > ,
11+ enabled : boolean ,
12+ ) : HTMLTableCellElement {
13+ const cellElement = document . createElement ( "th" ) ;
14+
15+ const formulaInput = createFormulaInput ( formula , format , enabled ) ;
16+ cellElement . appendChild ( formulaInput . element ) ;
17+
18+ if ( enabled ) {
19+ formulaInput . inputElement . addEventListener ( "change" , ( ) => {
20+ const formulas = ( data [ "intermediate-formulas" ] ?? { } ) as Record < string , string > ;
21+ formulas [ formulaId ] = formulaInput . getInput ( ) ;
22+ data [ "intermediate-formulas" ] = formulas ;
23+ } ) ;
24+
25+ const editButton = document . createElement ( "button" ) ;
26+ editButton . tabIndex = - 1 ;
27+ editButton . innerHTML = "✏️" ;
28+
29+ editButton . addEventListener ( "mousedown" , ( e ) => {
30+ // This prevents the edit button to trigger the blur event of the input element.
31+ e . preventDefault ( ) ;
32+ } ) ;
33+
34+ editButton . addEventListener ( "click" , ( e ) => {
35+ e . preventDefault ( ) ;
36+ e . stopPropagation ( ) ;
37+ formulaInput . viewInputField ( ) ;
38+ } ) ;
39+ cellElement . appendChild ( editButton ) ;
40+ }
41+
42+ return cellElement ;
43+ }
44+
645export function setupButtonToAddIntermediateFormula ( attempt : object , total_rows : number , format : OutputFormat ) {
746 // @ts -expect-error Attempt object definition is not here.
847 const data = attempt . data as Record < string , unknown > ;
@@ -15,31 +54,22 @@ export function setupButtonToAddIntermediateFormula(attempt: object, total_rows:
1554 const rows = tableElement . querySelectorAll ( "tr" ) ;
1655
1756 for ( const [ index , row ] of rows . entries ( ) ) {
18- let cellElement , intermediateFormulaInput ;
57+ let cellElement ;
1958 if ( index === 0 ) {
2059 // The first row of the table contains the formulas.
21- cellElement = document . createElement ( "th" ) ;
22- intermediateFormulaInput = createIntermediateFormulaInput (
60+ cellElement = createIntermediateFormulaHeader (
2361 "" ,
2462 intermediateFormulaId ,
2563 format ,
26- true ,
2764 data ,
65+ // @ts -expect-error Attempt object definition is not here.
66+ ! attempt . readOnly ,
2867 ) ;
2968 initValues ( data , intermediateFormulaId , total_rows ) ;
3069 } else {
31- cellElement = document . createElement ( "td" ) ;
32- intermediateFormulaInput = createIntermediateResultInput (
33- "" ,
34- intermediateFormulaId ,
35- index - 1 ,
36- format ,
37- true ,
38- data ,
39- ) ;
70+ cellElement = createIntermediateResultInput ( "" , intermediateFormulaId , index - 1 , true , data ) ;
4071 }
4172
42- cellElement . appendChild ( intermediateFormulaInput . element ) ;
4373 row . appendChild ( cellElement ) ;
4474 }
4575
@@ -58,7 +88,7 @@ function initValues(data: Record<string, unknown>, intermediateFormulaId: number
5888 data [ "intermediate-results" ] = intermediateResults ;
5989}
6090
61- export function viewExistingIntermediateFormulas ( format : OutputFormat , attempt : object ) {
91+ export function initIntermediateFormulas ( format : OutputFormat , attempt : object ) {
6292 // @ts -expect-error Attempt object definition is not here.
6393 const data = attempt . data as Record < string , unknown > ;
6494 // @ts -expect-error Attempt object definition is not here.
@@ -69,83 +99,58 @@ export function viewExistingIntermediateFormulas(format: OutputFormat, attempt:
6999 const rows = tableElement . querySelectorAll ( "tr" ) ;
70100
71101 for ( const [ intermediateFormulaId , intermediateFormula ] of Object . entries ( intermediateFormulas ) ) {
72- const cellElement = document . createElement ( "th" ) ;
73- const intermediateFormulaInput = createIntermediateFormulaInput (
102+ const cellElement = createIntermediateFormulaHeader (
74103 intermediateFormula ,
75104 parseInt ( intermediateFormulaId ) ,
76105 format ,
77- isActive ,
78106 data ,
107+ isActive ,
79108 ) ;
80- cellElement . appendChild ( intermediateFormulaInput . element ) ;
81109 rows [ 0 ] . appendChild ( cellElement ) ;
82110
83111 for ( const [ index , intermediateResult ] of Object . entries ( intermediateResults [ intermediateFormulaId ] ) ) {
84- const cellElement = document . createElement ( "td" ) ;
85- const intermediateResultInput = createIntermediateResultInput (
112+ const cellElement = createIntermediateResultInput (
86113 intermediateResult ,
87114 parseInt ( intermediateFormulaId ) ,
88115 parseInt ( index ) ,
89- format ,
90116 isActive ,
91117 data ,
92118 ) ;
93- cellElement . appendChild ( intermediateResultInput . element ) ;
94119 rows [ parseInt ( index ) + 1 ] . appendChild ( cellElement ) ;
95120 }
96121 }
97122}
98123
99- function createIntermediateFormulaInput (
100- formula : string ,
101- intermediateFormulaId : number ,
102- format : OutputFormat ,
103- enabled : boolean ,
104- data : Record < string , unknown > ,
105- ) : FormulaInput {
106- const formulaInputElement = createFormulaInput ( formula , format , enabled ) ;
107- formulaInputElement . inputElement . setAttribute ( "data-intermediate-formula" , `${ intermediateFormulaId } ` ) ;
108-
109- const intermediateFormulas = ( data [ "intermediate-formulas" ] ?? { } ) as Record < string , string > ;
110-
111- if ( enabled ) {
112- formulaInputElement . inputElement . addEventListener ( "change" , ( ) => {
113- const formulaId = formulaInputElement . inputElement . getAttribute ( "data-intermediate-formula" ) ! ;
114- intermediateFormulas [ formulaId ] = formulaInputElement . getInput ( ) ;
115- data [ "intermediate-formulas" ] = intermediateFormulas ;
116- } ) ;
117- }
118-
119- return formulaInputElement ;
120- }
121-
122124function createIntermediateResultInput (
123125 formula : string ,
124126 intermediateFormulaId : number ,
125127 row : number ,
126- format : OutputFormat ,
127128 enabled : boolean ,
128129 data : Record < string , unknown > ,
129- ) : FormulaInput {
130- const resultInputElement = createFormulaInput ( formula , format , enabled ) ;
131- resultInputElement . inputElement . maxLength = 1 ;
132- resultInputElement . inputElement . pattern = "0|1" ;
133- resultInputElement . inputElement . setAttribute ( "data-intermediate-result" , `${ row } ` ) ;
134- resultInputElement . inputElement . setAttribute ( "data-intermediate-result-belongs-to" , `${ intermediateFormulaId } ` ) ;
130+ ) : HTMLTableCellElement {
131+ const cellElement = document . createElement ( "td" ) ;
132+ // Create the input element for the result.
133+ const resultInputElement = document . createElement ( "input" ) ;
134+ resultInputElement . value = formula ;
135+ resultInputElement . maxLength = 1 ;
136+ resultInputElement . pattern = "0|1" ;
137+ resultInputElement . disabled = ! enabled ;
135138
136139 const intermediateResults = ( data [ "intermediate-results" ] ?? { } ) as Record < string , string [ ] > ;
137140
138141 if ( enabled ) {
139- resultInputElement . inputElement . addEventListener ( "change" , ( ) => {
140- const resultId = parseInt ( resultInputElement . inputElement . getAttribute ( "data-intermediate-result" ) ! ) ;
141- const belongsToFormulaId = resultInputElement . inputElement . getAttribute (
142- "data-intermediate-result-belongs-to" ,
143- ) ! ;
144-
145- intermediateResults [ belongsToFormulaId ] [ resultId ] = resultInputElement . getInput ( ) ;
142+ resultInputElement . addEventListener ( "change" , ( ) => {
143+ intermediateResults [ intermediateFormulaId ] [ row ] = resultInputElement . value ;
146144 data [ "intermediate-results" ] = intermediateResults ;
147145 } ) ;
146+
147+ resultInputElement . addEventListener ( "keydown" , ( event ) => {
148+ if ( event . key === "Enter" ) {
149+ event . preventDefault ( ) ;
150+ }
151+ } ) ;
148152 }
149153
150- return resultInputElement ;
154+ cellElement . appendChild ( resultInputElement ) ;
155+ return cellElement ;
151156}
0 commit comments