From ff10a77d72baddadc2033ee19d49116b23e5906e Mon Sep 17 00:00:00 2001 From: Adriano Caloiaro Date: Tue, 11 Feb 2025 08:31:12 -0700 Subject: [PATCH] feat: add 'not' logic --- handlers/collector.go | 4 ++-- handlers/handlers.go | 3 +++ types/fieldlogiccomparator_enumer.go | 20 ++++++++++++-------- types/types.go | 1 + ui/builder/common.templ | 11 ++++++++--- ui/builder/common_templ.go | 19 ++++++++++++------- ui/common.templ | 3 +++ ui/common_templ.go | 6 +++--- ui/common_templ.txt | 2 +- 9 files changed, 45 insertions(+), 24 deletions(-) diff --git a/handlers/collector.go b/handlers/collector.go index e1b9390..fc0f1cb 100644 --- a/handlers/collector.go +++ b/handlers/collector.go @@ -111,7 +111,7 @@ func Collect(w http.ResponseWriter, r *http.Request) { submission := r.Form errs := validate(f, submission) if errs.Any() { - slog.Info("[collector] failed validation", "errors", errs) + slog.Debug("[collector] failed validation", "errors", errs) w.WriteHeader(http.StatusBadRequest) err = ui.ValidationErrors(errs).Render(r.Context(), w) if err != nil { @@ -141,7 +141,7 @@ func Collect(w http.ResponseWriter, r *http.Request) { // TODO: Keep track of the submission id // submissionID := r.Form.Get("id") - // Validation renders whether there are errors or not errors, so that non-erroneous fields can be cleared of error messages + // Validation renders whether there are errors or not, so that non-erroneous fields can be cleared of error messages // as the user corrects validation errors allFields := slices.Collect(maps.Keys(f.Fields)) err = ui.Validation(allFields, errs).Render(ctx, w) diff --git a/handlers/handlers.go b/handlers/handlers.go index 8210453..e80dc81 100644 --- a/handlers/handlers.go +++ b/handlers/handlers.go @@ -459,6 +459,7 @@ func UpdateFields(w http.ResponseWriter, r *http.Request) { } oldField.Logic.TargetFieldID = targetFieldID updatedFields[fieldID] = oldField + // field logic, subject field chosen case fieldGroup == builder.FieldGroupLogic && fieldName == builder.FieldLogicTargetFieldValue: oldField := draft.Fields[fieldID] if oldField.Logic == nil { @@ -466,6 +467,7 @@ func UpdateFields(w http.ResponseWriter, r *http.Request) { } oldField.Logic.TriggerValues = fieldValues updatedFields[fieldID] = oldField + // field logic, comparator chosen case fieldGroup == builder.FieldGroupLogic && fieldName == builder.FieldLogicComparator: oldField := draft.Fields[fieldID] if oldField.Logic == nil { @@ -473,6 +475,7 @@ func UpdateFields(w http.ResponseWriter, r *http.Request) { } oldField.Logic.TriggerComparator, _ = types.FieldLogicComparatorString(fieldValues[0]) updatedFields[fieldID] = oldField + // field logic, action to take case fieldGroup == builder.FieldGroupLogic && fieldName == types.FieldLogicTriggerShow.String(): oldField := draft.Fields[fieldID] if oldField.Logic == nil { diff --git a/types/fieldlogiccomparator_enumer.go b/types/fieldlogiccomparator_enumer.go index d8ec9fe..2d1d8d2 100644 --- a/types/fieldlogiccomparator_enumer.go +++ b/types/fieldlogiccomparator_enumer.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _FieldLogicComparatorName = "equalcontains" +const _FieldLogicComparatorName = "equalcontainsnot" -var _FieldLogicComparatorIndex = [...]uint8{0, 5, 13} +var _FieldLogicComparatorIndex = [...]uint8{0, 5, 13, 16} -const _FieldLogicComparatorLowerName = "equalcontains" +const _FieldLogicComparatorLowerName = "equalcontainsnot" func (i FieldLogicComparator) String() string { if i < 0 || i >= FieldLogicComparator(len(_FieldLogicComparatorIndex)-1) { @@ -27,20 +27,24 @@ func _FieldLogicComparatorNoOp() { var x [1]struct{} _ = x[FieldLogicComparatorEqual-(0)] _ = x[FieldLogicComparatorContains-(1)] + _ = x[FieldLogicComparatorNot-(2)] } -var _FieldLogicComparatorValues = []FieldLogicComparator{FieldLogicComparatorEqual, FieldLogicComparatorContains} +var _FieldLogicComparatorValues = []FieldLogicComparator{FieldLogicComparatorEqual, FieldLogicComparatorContains, FieldLogicComparatorNot} var _FieldLogicComparatorNameToValueMap = map[string]FieldLogicComparator{ - _FieldLogicComparatorName[0:5]: FieldLogicComparatorEqual, - _FieldLogicComparatorLowerName[0:5]: FieldLogicComparatorEqual, - _FieldLogicComparatorName[5:13]: FieldLogicComparatorContains, - _FieldLogicComparatorLowerName[5:13]: FieldLogicComparatorContains, + _FieldLogicComparatorName[0:5]: FieldLogicComparatorEqual, + _FieldLogicComparatorLowerName[0:5]: FieldLogicComparatorEqual, + _FieldLogicComparatorName[5:13]: FieldLogicComparatorContains, + _FieldLogicComparatorLowerName[5:13]: FieldLogicComparatorContains, + _FieldLogicComparatorName[13:16]: FieldLogicComparatorNot, + _FieldLogicComparatorLowerName[13:16]: FieldLogicComparatorNot, } var _FieldLogicComparatorNames = []string{ _FieldLogicComparatorName[0:5], _FieldLogicComparatorName[5:13], + _FieldLogicComparatorName[13:16], } // FieldLogicComparatorString retrieves an enum value from the enum constants string name. diff --git a/types/types.go b/types/types.go index 5e50765..61b9e94 100644 --- a/types/types.go +++ b/types/types.go @@ -49,6 +49,7 @@ type FieldLogicComparator int const ( FieldLogicComparatorEqual FieldLogicComparator = iota // target field value is equal to the subject value FieldLogicComparatorContains // target field value contains the subject value + FieldLogicComparatorNot // target field value is "not" the subject value ) // FieldLogicTriggerAction enum enumerates all possible field logic trigger actions diff --git a/ui/builder/common.templ b/ui/builder/common.templ index 26892f8..71c3b0c 100644 --- a/ui/builder/common.templ +++ b/ui/builder/common.templ @@ -463,15 +463,20 @@ func comparatorOptionsFor(field types.FormField) (options selector.FieldOptions) switch field.Type { default: options = selector.FieldOptions{ + selector.Option{ + Value: fmt.Sprint(types.FieldLogicComparatorContains), + Label: "Contains", + Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorContains, + }, selector.Option{ Value: fmt.Sprint(types.FieldLogicComparatorEqual), Label: "Equal to =", Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorEqual, }, selector.Option{ - Value: fmt.Sprint(types.FieldLogicComparatorContains), - Label: "Contains", - Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorContains, + Value: fmt.Sprint(types.FieldLogicComparatorNot), + Label: "NOT", + Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorNot, }, } } diff --git a/ui/builder/common_templ.go b/ui/builder/common_templ.go index 10135d0..0899943 100644 --- a/ui/builder/common_templ.go +++ b/ui/builder/common_templ.go @@ -1478,15 +1478,20 @@ func comparatorOptionsFor(field types.FormField) (options selector.FieldOptions) switch field.Type { default: options = selector.FieldOptions{ + selector.Option{ + Value: fmt.Sprint(types.FieldLogicComparatorContains), + Label: "Contains", + Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorContains, + }, selector.Option{ Value: fmt.Sprint(types.FieldLogicComparatorEqual), Label: "Equal to =", Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorEqual, }, selector.Option{ - Value: fmt.Sprint(types.FieldLogicComparatorContains), - Label: "Contains", - Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorContains, + Value: fmt.Sprint(types.FieldLogicComparatorNot), + Label: "NOT", + Selected: field.Logic != nil && field.Logic.TriggerComparator == types.FieldLogicComparatorNot, }, } } @@ -1540,7 +1545,7 @@ func LogicConfiguratorStepThree(form frm.Form, field types.FormField, targetFiel var templ_7745c5c3_Var68 string templ_7745c5c3_Var68, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s-logic-chosen-field-value", field.ID.String())) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 499, Col: 70} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 504, Col: 70} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var68)) if templ_7745c5c3_Err != nil { @@ -1553,7 +1558,7 @@ func LogicConfiguratorStepThree(form frm.Form, field types.FormField, targetFiel var templ_7745c5c3_Var69 string templ_7745c5c3_Var69, templ_7745c5c3_Err = templ.JoinStringErrs(fields.FieldName(field, FieldGroupLogic, FieldLogicTargetFieldValue)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 500, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 505, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var69)) if templ_7745c5c3_Err != nil { @@ -1571,7 +1576,7 @@ func LogicConfiguratorStepThree(form frm.Form, field types.FormField, targetFiel var templ_7745c5c3_Var70 string templ_7745c5c3_Var70, templ_7745c5c3_Err = templ.JoinStringErrs(field.Logic.TriggerValues[0]) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 505, Col: 41} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 510, Col: 41} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var70)) if templ_7745c5c3_Err != nil { @@ -1589,7 +1594,7 @@ func LogicConfiguratorStepThree(form frm.Form, field types.FormField, targetFiel var templ_7745c5c3_Var71 string templ_7745c5c3_Var71, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("on keyup debounced at 600ms trigger '%s'", FieldsFormUpdateEvent)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 507, Col: 86} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/builder/common.templ`, Line: 512, Col: 86} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var71)) if templ_7745c5c3_Err != nil { diff --git a/ui/common.templ b/ui/common.templ index b936526..dc6c082 100644 --- a/ui/common.templ +++ b/ui/common.templ @@ -117,6 +117,9 @@ templ Head(pageTitle string) { case 'contains': match = watchingField.logic.trigger_values.some(val => newValue.toLowerCase().includes(val.toLowerCase())) break; + case 'not': + match = watchingField.logic.trigger_values.some(val => newValue.toLowerCase() !== val.toLowerCase()) + break; } // Most actions are likely to be performed upon the containing element, such as show/hide/require. diff --git a/ui/common_templ.go b/ui/common_templ.go index 44445c3..fddaf1a 100644 --- a/ui/common_templ.go +++ b/ui/common_templ.go @@ -464,7 +464,7 @@ func Head(pageTitle string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\"> ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "\"> ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -619,7 +619,7 @@ func ValidationErrors(errs types.ValidationErrors) templ.Component { var templ_7745c5c3_Var32 string templ_7745c5c3_Var32, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("errors-%s", fieldID)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/common.templ`, Line: 196, Col: 46} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/common.templ`, Line: 199, Col: 46} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var32)) if templ_7745c5c3_Err != nil { @@ -632,7 +632,7 @@ func ValidationErrors(errs types.ValidationErrors) templ.Component { var templ_7745c5c3_Var33 string templ_7745c5c3_Var33, templ_7745c5c3_Err = templ.JoinStringErrs(err.Error()) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/common.templ`, Line: 198, Col: 18} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/common.templ`, Line: 201, Col: 18} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var33)) if templ_7745c5c3_Err != nil { diff --git a/ui/common_templ.txt b/ui/common_templ.txt index 69c0a76..bd329d8 100644 --- a/ui/common_templ.txt +++ b/ui/common_templ.txt @@ -25,7 +25,7 @@ \" nonce=\" \" async> +\">