Dependency cycle when validating editable fields in table

I have an editable table with an unknown number of editable values, and need to make sure that the table can only be saved when the sum of those values is equal to 100. Since there isn't an easy way to sum the changed + original values of the column in my version of Retool (self-hosted 3.8.8), I decided to just compare the sum of the changeset to the sum of the original values of the rows that were changed, which has the same effect.

However, when I try and disable saving in the table, I run into a Dependency Cycle Found error. Inside the table's validation function, I need to check the values of the table itself. This seems to be the root cause of the dependency cycle itself.

I think the workaround here is to avoid using the table's save mechanisms at all and use a "Save" button outside the table itself that is conditionally enabled/disabled using the same logic, but I was wondering if it would be possible to do this exclusively via the table without relying on other input fields, buttons, etc...

  • Goal: In the Retool table component, I can use the values of the table itself to conditionally disable the "Save" button

  • Steps: I tried moving my validation logic to multiple transformers, but the dependency cycle errors persist

  • Details: Self-hosted Retool 3.8.8

  • Screenshots: Posted above

  • App JSON below:

{"uuid":"5251716e-028e-11ef-8908-975675e4afb7","page":{"id":18775,"data":{"appState":"[\"~#iR\",[\"^ \",\"n\",\"appTemplate\",\"v\",[\"^ \",\"isFetching\",false,\"plugins\",[\"~#iOM\",[\"table\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"table\",\"type\",\"widget\",\"subtype\",\"TableWidget2\",\"namespace\",null,\"resourceName\",null,\"resourceDisplayName\",null,\"template\",[\"^3\",[\"selectedRowKey\",null,\"_nextAfterCursor\",\"\",\"_columnBackgroundColor\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_defaultSort\",null,\"_clearChangesetOnSave\",true,\"heightType\",\"auto\",\"disableEdits\",false,\"_rowHeight\",\"medium\",\"_columnIds\",[\"~#iL\",[\"39593\",\"0eba5\"]],\"_isSaving\",false,\"_actionIds\",[\"^:\",[]],\"_clearChangeset\",false,\"caseSensitiveFiltering\",false,\"_limitOffsetRowCount\",null,\"selectedSourceRow\",null,\"_dynamicColumnsEnabled\",false,\"disableSave\",\"{{sameSum.value}}\",\"_columnEditableOptions\",[\"^3\",[\"39593\",[\"^3\",[]],\"0eba5\",[\"^3\",[\"showStepper\",true,\"min\",\"0\",\"max\",\"100\"]]]],\"_toolbarPosition\",\"bottom\",\"_groupByColumns\",[\"^:\",[]],\"_toolbarButtonLabel\",[\"^3\",[\"1a\",\"Filter\",\"3c\",\"Download\",\"4d\",\"Refresh\"]],\"_nextBeforeCursor\",\"\",\"_persistRowSelection\",false,\"_toolbarButtonIcon\",[\"^3\",[\"1a\",\"bold/interface-text-formatting-filter-2\",\"3c\",\"bold/interface-download-button-2\",\"4d\",\"bold/interface-arrows-round-left\"]],\"changesetArray\",[],\"_toolbarButtonType\",[\"^3\",[\"1a\",\"filter\",\"3c\",\"custom\",\"4d\",\"custom\"]],\"_columnOptionList\",[\"^3\",[\"39593\",[\"^3\",[]],\"0eba5\",[\"^3\",[]]]],\"_columnValueOverride\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"marginType\",\"normal\",\"_showBorder\",true,\"_templatePageSize\",null,\"_dynamicColumnProperties\",[\"^3\",[]],\"_showHeader\",true,\"_currentPage\",0,\"_columnKey\",[\"^3\",[\"39593\",\"id\",\"0eba5\",\"value\"]],\"hidden\",false,\"_toolbarButtonIds\",[\"^:\",[\"1a\",\"3c\",\"4d\"]],\"data\",\"[{id: 1, value: 10}, {id: 2, value: 20}, {id: 3, value: 30}, {id: 4, value: 40}]\",\"_cellSelection\",\"none\",\"_serverPaginated\",false,\"_linkedFilterId\",null,\"searchMode\",\"fuzzy\",\"_columnCellTooltip\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_columnFormat\",[\"^3\",[\"39593\",\"decimal\",\"0eba5\",\"decimal\"]],\"_cursorCache\",[\"^ \"],\"_calculatedPageSize\",null,\"_primaryKeyColumnId\",\"39593\",\"selectedDataIndex\",null,\"_columnAlignment\",[\"^3\",[\"39593\",\"center\",\"0eba5\",\"center\"]],\"_actionIcon\",[\"^3\",[]],\"_columnTooltip\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_columnIcon\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_columnCellTooltipMode\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_pageSize\",null,\"showInEditor\",false,\"selectedSourceRows\",[],\"_enableExpandableRows\",false,\"_selectMultipleRowsOnActionClick\",\"no\",\"_columnSortDisabled\",[\"^3\",[\"39593\",false,\"0eba5\",false]],\"_showSummaryRow\",false,\"filterStack\",null,\"_expandedRows\",null,\"changesetObject\",null,\"_actionDisabled\",[\"^3\",[]],\"_columnReferenceId\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_dynamicColumnSource\",[],\"_rowSelection\",\"single\",\"_columnCaption\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_dynamicColumnFormatOptions\",[\"^3\",[]],\"_dynamicRowHeights\",false,\"_columnFormatOptions\",[\"^3\",[\"39593\",[\"^3\",[\"notation\",\"standard\"]],\"0eba5\",[\"^3\",[\"showSeparators\",true,\"notation\",\"standard\"]]]],\"_changeset\",null,\"_afterCursor\",\"\",\"selectedRowKeys\",[],\"_beforeCursor\",\"\",\"_columnSummaryAggregationMode\",[\"^3\",[\"39593\",\"none\",\"0eba5\",\"none\"]],\"searchTerm\",\"\",\"selectedRows\",[],\"_disabledVirtualization\",false,\"_showColumnBorders\",false,\"_columnStatusIndicatorOptions\",[\"^3\",[\"39593\",[\"^3\",[]],\"0eba5\",[\"^3\",[]]]],\"_columnSize\",[\"^3\",[\"39593\",439,\"0eba5\",100]],\"_serverPaginationType\",\"limitOffsetBased\",\"_selectSingleRowsOnActionClick\",\"replace\",\"_showFooter\",true,\"_groupedColumnConfig\",[\"^3\",[]],\"_virtualizeStartIndex\",0,\"_toolbarButtonHidden\",[\"^3\",[\"1a\",\"\",\"3c\",\"\",\"4d\",\"\"]],\"_defaultFilters\",[\"^3\",[]],\"events\",[\"^:\",[[\"^3\",[\"event\",\"save\",\"type\",\"datasource\",\"method\",\"trigger\",\"pluginId\",\"submit\",\"targetId\",null,\"params\",[\"^3\",[]],\"waitType\",\"debounce\",\"waitMs\",\"0\"]]]],\"_columnEditable\",[\"^3\",[\"39593\",\"false\",\"0eba5\",\"true\"]],\"pagination\",null,\"selectedDataIndexes\",[],\"_columnGroupAggregationMode\",[\"^3\",[\"39593\",\"countDistinct\",\"0eba5\",\"sum\"]],\"sortArray\",[],\"_selectedCell\",null,\"overflowType\",\"scroll\",\"selectedCell\",null,\"_defaultSelectedRow\",[\"^3\",[\"mode\",\"index\",\"indexType\",\"display\",\"index\",0]],\"_hasNextPage\",false,\"_includeRowInChangesetArray\",false,\"_columnPosition\",[\"^3\",[\"39593\",\"center\",\"0eba5\",\"center\"]],\"_enableSaveActions\",true,\"_columnPlaceholder\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"Enter value\"]],\"_defaultFilterOperator\",\"and\",\"_actionLabel\",[\"^3\",[]],\"_virtualizeEndIndex\",0,\"selectedRow\",null,\"_actionHidden\",[\"^3\",[]],\"maintainSpaceWhenHidden\",false,\"_columnHidden\",[\"^3\",[\"39593\",\"\",\"0eba5\",\"\"]],\"_columnLabel\",[\"^3\",[\"39593\",\"ID\",\"0eba5\",\"Value\"]],\"_showToolbar\",false]],\"style\",[\"^3\",[]],\"position2\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"container\",\"\",\"rowGroup\",\"body\",\"subcontainer\",\"\",\"row\",0,\"col\",0,\"height\",1,\"width\",8,\"tabNum\",0]]],\"mobilePosition2\",null,\"mobileAppPosition\",null,\"tabIndex\",null,\"^=\",\"\",\"createdAt\",\"~m1713999598643\",\"updatedAt\",\"~m1714018624162\",\"folder\",\"\",\"screen\",null]]],\"$main\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"$main\",\"^4\",\"frame\",\"^5\",\"Frame\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"type\",\"main\",\"sticky\",null,\"paddingType\",\"normal\",\"enableFullBleed\",false,\"isHiddenOnDesktop\",false,\"isHiddenOnMobile\",false]],\"^;\",[\"^3\",[]],\"^<\",null,\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1713999598699\",\"^G\",\"~m1713999598699\",\"^H\",\"\",\"^I\",null]]],\"changesetSum\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"changesetSum\",\"^4\",\"function\",\"^5\",\"Function\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"funcBody\",\"const table = {{table}}\\n      \\nconst tableChanges = table?.changesetArray || []\\n\\nconst changedSum = tableChanges.reduce((acc, cur) => acc + cur.value, 0)\\n\\nreturn changedSum\",\"value\",\"\"]],\"^;\",null,\"^<\",null,\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714001783701\",\"^G\",\"~m1714016719687\",\"^H\",\"\",\"^I\",null]]],\"submit\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"submit\",\"^4\",\"datasource\",\"^5\",\"JavascriptQuery\",\"^6\",null,\"^7\",\"JavascriptQuery\",\"^8\",null,\"^9\",[\"^3\",[\"queryRefreshTime\",\"\",\"lastReceivedFromResourceAt\",null,\"queryDisabledMessage\",\"\",\"servedFromCache\",false,\"offlineUserQueryInputs\",\"\",\"successMessage\",\"\",\"queryDisabled\",\"\",\"playgroundQuerySaveId\",\"latest\",\"workflowParams\",null,\"resourceNameOverride\",\"\",\"runWhenModelUpdates\",false,\"workflowRunId\",null,\"showFailureToaster\",true,\"query\",\"console.log(\\\"submitted!\\\")\",\"playgroundQueryUuid\",\"\",\"playgroundQueryId\",null,\"error\",null,\"workflowRunBodyType\",\"raw\",\"privateParams\",[\"^:\",[]],\"runWhenPageLoadsDelay\",\"\",\"data\",null,\"importedQueryInputs\",[\"^3\",[]],\"_additionalScope\",[\"^:\",[]],\"isImported\",false,\"showSuccessToaster\",true,\"cacheKeyTtl\",\"\",\"requestSentTimestamp\",null,\"metadata\",null,\"workflowActionType\",null,\"queryRunTime\",null,\"changesetObject\",\"\",\"errorTransformer\",\"// The variable 'data' allows you to reference the request's data in the transformer. \\n// example: return data.find(element => element.isError)\\nreturn data.error\",\"finished\",null,\"confirmationMessage\",null,\"isFetching\",false,\"changeset\",\"\",\"rawData\",null,\"queryTriggerDelay\",\"0\",\"resourceTypeOverride\",null,\"watchedParams\",[\"^:\",[]],\"enableErrorTransformer\",false,\"showLatestVersionUpdatedWarning\",false,\"timestamp\",0,\"importedQueryDefaults\",[\"^3\",[]],\"enableTransformer\",false,\"showUpdateSetValueDynamicallyToggle\",true,\"runWhenPageLoads\",false,\"transformer\",\"// Query results are available as the `data` variable\\nreturn formatDataAsArray(data)\",\"events\",[\"^:\",[]],\"queryTimeout\",\"10000\",\"workflowId\",null,\"requireConfirmation\",false,\"queryFailureConditions\",\"\",\"changesetIsObject\",false,\"enableCaching\",false,\"allowedGroups\",[\"^:\",[]],\"workflowBlockPluginId\",null,\"offlineQueryType\",\"None\",\"queryThrottleTime\",\"750\",\"updateSetValueDynamically\",false,\"notificationDuration\",\"\"]],\"^;\",null,\"^<\",null,\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016393932\",\"^G\",\"~m1714016406458\",\"^H\",\"\",\"^I\",null]]],\"numberInput1\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"numberInput1\",\"^4\",\"widget\",\"^5\",\"NumberInputWidget\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"readOnly\",false,\"iconAfter\",\"\",\"max\",null,\"preventScroll\",false,\"inputValue\",0,\"marginType\",\"normal\",\"hidden\",false,\"customValidation\",\"\",\"showSeparators\",true,\"hideValidationMessage\",false,\"textBefore\",\"\",\"validationMessage\",\"\",\"textAfter\",\"\",\"showInEditor\",false,\"allowNull\",false,\"showClear\",false,\"tooltipText\",\"\",\"currency\",\"USD\",\"labelAlign\",\"left\",\"formDataKey\",\"{{ self.id }}\",\"value\",\"{{changesetSum.value}}\",\"labelCaption\",\"\",\"min\",null,\"labelWidth\",\"33\",\"placeholder\",\"Enter value\",\"showStepper\",true,\"label\",\"Changed\",\"_validate\",false,\"labelWidthUnit\",\"%\",\"invalid\",false,\"format\",\"decimal\",\"iconBefore\",\"\",\"textAlign\",\"left\",\"inputTooltip\",\"\",\"events\",[\"^3\",[]],\"loading\",false,\"disabled\",\"true\",\"labelPosition\",\"left\",\"decimalPlaces\",null,\"labelWrap\",false,\"padDecimal\",false,\"maintainSpaceWhenHidden\",false,\"required\",false]],\"^;\",[\"^3\",[]],\"^<\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"^=\",\"\",\"^>\",\"body\",\"^?\",\"\",\"row\",0,\"col\",8,\"^@\",1,\"^A\",4,\"^B\",0]]],\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016676611\",\"^G\",\"~m1714016839368\",\"^H\",\"\",\"^I\",null]]],\"originalSum\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"originalSum\",\"^4\",\"function\",\"^5\",\"Function\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"funcBody\",\"const table = {{table}}\\n      \\nconst tableChanges = table?.changesetArray || []\\nconst tableData = table?.data || []\\n\\nif (tableChanges.length < 1 || tableData.length < 1) {\\n  return true\\n}\\n\\nconst ids = tableChanges.map(row => row.id)\\n\\nconst originalSum = tableData.filter(row => ids.includes(row.id)).reduce((acc, cur) => acc + cur.value, 0)\\n\\nreturn originalSum\",\"value\",\"\"]],\"^;\",null,\"^<\",null,\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016741118\",\"^G\",\"~m1714016819639\",\"^H\",\"\",\"^I\",null]]],\"numberInput2\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"numberInput2\",\"^4\",\"widget\",\"^5\",\"NumberInputWidget\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"readOnly\",false,\"iconAfter\",\"\",\"max\",null,\"preventScroll\",false,\"inputValue\",0,\"marginType\",\"normal\",\"hidden\",false,\"customValidation\",\"\",\"showSeparators\",true,\"hideValidationMessage\",false,\"textBefore\",\"\",\"validationMessage\",\"\",\"textAfter\",\"\",\"showInEditor\",false,\"allowNull\",false,\"showClear\",false,\"tooltipText\",\"\",\"currency\",\"USD\",\"labelAlign\",\"left\",\"formDataKey\",\"{{ self.id }}\",\"value\",\"{{originalSum.value}}\",\"labelCaption\",\"\",\"min\",null,\"labelWidth\",\"33\",\"placeholder\",\"Enter value\",\"showStepper\",true,\"label\",\"Original\",\"_validate\",false,\"labelWidthUnit\",\"%\",\"invalid\",false,\"format\",\"decimal\",\"iconBefore\",\"\",\"textAlign\",\"left\",\"inputTooltip\",\"\",\"events\",[\"^3\",[]],\"loading\",false,\"disabled\",\"true\",\"labelPosition\",\"left\",\"decimalPlaces\",null,\"labelWrap\",false,\"padDecimal\",false,\"maintainSpaceWhenHidden\",false,\"required\",false]],\"^;\",[\"^3\",[]],\"^<\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"^=\",\"\",\"^>\",\"body\",\"^?\",\"\",\"row\",1,\"col\",8,\"^@\",1,\"^A\",4,\"^B\",0]]],\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016823389\",\"^G\",\"~m1714016846226\",\"^H\",\"\",\"^I\",null]]],\"sameSum\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"sameSum\",\"^4\",\"function\",\"^5\",\"Function\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"funcBody\",\"return Math.abs({{changesetSum.value}} - {{originalSum.value}}) < 0.001\",\"value\",\"\"]],\"^;\",null,\"^<\",null,\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016878260\",\"^G\",\"~m1714016907212\",\"^H\",\"\",\"^I\",null]]],\"checkbox1\",[\"^0\",[\"^ \",\"n\",\"pluginTemplate\",\"v\",[\"^ \",\"id\",\"checkbox1\",\"^4\",\"widget\",\"^5\",\"CheckboxWidget2\",\"^6\",null,\"^7\",null,\"^8\",null,\"^9\",[\"^3\",[\"marginType\",\"normal\",\"hidden\",false,\"customValidation\",\"\",\"hideValidationMessage\",false,\"validationMessage\",\"\",\"showInEditor\",false,\"tooltipText\",\"\",\"labelAlign\",\"left\",\"formDataKey\",\"{{ self.id }}\",\"value\",\"{{sameSum.value}}\",\"labelCaption\",\"\",\"label\",\"Same Sum\",\"_validate\",false,\"invalid\",false,\"events\",[\"^3\",[]],\"disabled\",\"true\",\"labelPosition\",\"right\",\"labelWrap\",false,\"maintainSpaceWhenHidden\",false,\"required\",false]],\"^;\",[\"^3\",[]],\"^<\",[\"^0\",[\"^ \",\"n\",\"position2\",\"v\",[\"^ \",\"^=\",\"\",\"^>\",\"body\",\"^?\",\"\",\"row\",2,\"col\",8,\"^@\",0.6,\"^A\",4,\"^B\",0]]],\"^C\",null,\"^D\",null,\"^E\",null,\"^=\",\"\",\"^F\",\"~m1714016921957\",\"^G\",\"~m1714017839726\",\"^H\",\"\",\"^I\",null]]]]],\"^F\",null,\"version\",\"3.8.8\",\"appThemeId\",null,\"appMaxWidth\",\"1560px\",\"preloadedAppJavaScript\",null,\"preloadedAppJSLinks\",[],\"testEntities\",[],\"tests\",[],\"appStyles\",\"\",\"responsiveLayoutDisabled\",false,\"loadingIndicatorsDisabled\",false,\"urlFragmentDefinitions\",[\"^:\",[]],\"pageLoadValueOverrides\",[\"^:\",[]],\"customDocumentTitle\",\"\",\"customDocumentTitleEnabled\",false,\"customShortcuts\",[],\"isGlobalWidget\",false,\"isMobileApp\",false,\"isFormApp\",false,\"multiScreenMobileApp\",false,\"mobileAppSettings\",[\"^ \",\"mobileOfflineModeEnabled\",false,\"mobileOfflineModeDelaySync\",false,\"mobileOfflineModeBannerMode\",\"default\",\"displaySetting\",[\"^ \",\"landscapeMode\",false,\"tabletMode\",false]],\"folders\",[\"^:\",[]],\"queryStatusVisibility\",false,\"markdownLinkBehavior\",\"auto\",\"inAppRetoolPillAppearance\",\"NO_OVERRIDE\",\"rootScreen\",null,\"instrumentationEnabled\",false,\"experimentalFeatures\",[\"^ \",\"sourceControlTemplateDehydration\",false,\"multiplayerEditingEnabled\",false,\"disableMultiplayerEditing\",false],\"experimentalPerfFeatures\",[\"^ \",\"useRuntimeV2\",true,\"runtimeV2OptOut\",false],\"experimentalStabilityFeatures\",[\"^ \",\"lockModelForUpdates\",false],\"experimentalDataTabEnabled\",true]]]"},"changesRecord":[{"type":"WIDGET_TEMPLATE_UPDATE","payload":{"plugin":{"id":"table","type":"widget","style":{},"folder":"","screen":null,"subtype":"TableWidget2","tabIndex":null,"template":{"data":"[{id: 1, value: 10}, {id: 2, value: 20}, {id: 3, value: 30}, {id: 4, value: 40}]","events":[{"type":"datasource","event":"save","method":"trigger","params":{},"waitMs":"0","pluginId":"submit","targetId":null,"waitType":"debounce"}],"hidden":false,"_isSaving":false,"_pageSize":null,"sortArray":[],"_actionIds":[],"_changeset":null,"_columnIds":["39593","0eba5"],"_columnKey":{"39593":"id","0eba5":"value"},"_rowHeight":"medium","heightType":"auto","marginType":"normal","pagination":null,"searchMode":"fuzzy","searchTerm":"","_actionIcon":{},"_columnIcon":{"39593":"","0eba5":""},"_columnSize":{"39593":439,"0eba5":100},"_showBorder":true,"_showFooter":true,"_showHeader":true,"disableSave":"{{!sameSum.value}}","filterStack":null,"selectedRow":null,"_actionLabel":{},"_afterCursor":"","_columnLabel":{"39593":"ID","0eba5":"Value"},"_currentPage":0,"_cursorCache":{},"_defaultSort":null,"_hasNextPage":false,"_showToolbar":false,"disableEdits":false,"overflowType":"scroll","selectedCell":null,"selectedRows":[],"showInEditor":false,"_actionHidden":{},"_beforeCursor":"","_columnFormat":{"39593":"decimal","0eba5":"decimal"},"_columnHidden":{"39593":"","0eba5":""},"_expandedRows":null,"_rowSelection":"single","_selectedCell":null,"_cellSelection":"none","_columnCaption":{"39593":"","0eba5":""},"_columnTooltip":{"39593":"","0eba5":""},"changesetArray":[],"selectedRowKey":null,"_actionDisabled":{},"_clearChangeset":false,"_columnEditable":{"39593":"false","0eba5":"true"},"_columnPosition":{"39593":"center","0eba5":"center"},"_defaultFilters":{},"_groupByColumns":[],"_linkedFilterId":null,"_showSummaryRow":false,"changesetObject":null,"selectedRowKeys":[],"_columnAlignment":{"39593":"center","0eba5":"center"},"_nextAfterCursor":"","_serverPaginated":false,"_toolbarPosition":"bottom","_columnOptionList":{"39593":{},"0eba5":{}},"_nextBeforeCursor":"","_templatePageSize":null,"_toolbarButtonIds":["1a","3c","4d"],"selectedDataIndex":null,"selectedSourceRow":null,"_columnCellTooltip":{"39593":"","0eba5":""},"_columnPlaceholder":{"39593":"","0eba5":"Enter value"},"_columnReferenceId":{"39593":"","0eba5":""},"_dynamicRowHeights":false,"_enableSaveActions":true,"_showColumnBorders":false,"_toolbarButtonIcon":{"1a":"bold/interface-text-formatting-filter-2","3c":"bold/interface-download-button-2","4d":"bold/interface-arrows-round-left"},"_toolbarButtonType":{"1a":"filter","3c":"custom","4d":"custom"},"selectedSourceRows":[],"_calculatedPageSize":null,"_columnSortDisabled":{"39593":false,"0eba5":false},"_defaultSelectedRow":{"mode":"index","index":0,"indexType":"display"},"_primaryKeyColumnId":"39593","_toolbarButtonLabel":{"1a":"Filter","3c":"Download","4d":"Refresh"},"_virtualizeEndIndex":0,"selectedDataIndexes":[],"_columnFormatOptions":{"39593":{"notation":"standard"},"0eba5":{"notation":"standard","showSeparators":true}},"_columnValueOverride":{"39593":"","0eba5":""},"_dynamicColumnSource":[],"_groupedColumnConfig":{},"_limitOffsetRowCount":null,"_persistRowSelection":false,"_toolbarButtonHidden":{"1a":"","3c":"","4d":""},"_clearChangesetOnSave":true,"_enableExpandableRows":false,"_serverPaginationType":"limitOffsetBased","_virtualizeStartIndex":0,"_columnBackgroundColor":{"39593":"","0eba5":""},"_columnCellTooltipMode":{"39593":"","0eba5":""},"_columnEditableOptions":{"39593":{},"0eba5":{"max":"100","min":"0","showStepper":true}},"_defaultFilterOperator":"and","_dynamicColumnsEnabled":false,"caseSensitiveFiltering":false,"_disabledVirtualization":false,"maintainSpaceWhenHidden":false,"_dynamicColumnProperties":{},"_columnGroupAggregationMode":{"39593":"countDistinct","0eba5":"sum"},"_dynamicColumnFormatOptions":{},"_includeRowInChangesetArray":false,"_columnStatusIndicatorOptions":{"39593":{},"0eba5":{}},"_columnSummaryAggregationMode":{"39593":"none","0eba5":"none"},"_selectSingleRowsOnActionClick":"replace","_selectMultipleRowsOnActionClick":"no"},"container":"","createdAt":"2024-04-24T22:59:58.643Z","namespace":null,"position2":{"col":0,"row":0,"width":8,"height":1,"tabNum":0,"rowGroup":"body","container":"","subcontainer":""},"updatedAt":"2024-04-25T04:13:54.465Z","resourceName":null,"mobilePosition2":null,"mobileAppPosition":null,"resourceDisplayName":null},"update":{"disableSave":"{{sameSum.value}}"},"widgetId":"table","shouldRecalculateTemplate":true},"isUserTriggered":true}],"gitSha":null,"checksum":null,"createdAt":"2024-04-25T04:17:06.412Z","updatedAt":"2024-04-25T04:17:06.412Z","pageId":40,"userId":8,"branchId":null},"modules":{}}

Can you simply export the app as a JSON file - the JSON you posted doesn't work when I try to create an app from it.

I just re-exported the app as a JSON file and the diff checker says identical to the one I pasted/embedded in my post. I originally tried uploading the JSON file itself, but it seems like this forum won't allow new users to add non-image attachments to their posts.

This is what I am seeing when I use the JSON you provided.

Screenshot 2024-04-26 at 11.38.03 AM

Hello @bw_lira!

If you want to limit saves to the DB inside the table and not have to use outside components here is one option.

In the table's on Save event, you could run a script or a Javascript query to run the calculation you are currently doing in sameSum. If the sum of the values in the changeSet is === 100, run the query to save the data. Else open a notification or alert to the page to let the user know that the values do not sum to 100.