@ -1,12 +1,12 @@
import { cloneDeep } from "lodash/fp"
import { get } from "svelte/store"
import {
findAllMatchingComponents ,
findComponent ,
findComponentPath ,
findAllMatchingComponents ,
} from "./storeUtils"
import { store } from "builderStore"
import { tables as tablesStore , queries as queriesStores } from "stores/backend"
import { queries as queriesStores , tables as tablesStore } from "stores/backend"
import { makePropSafe } from "@budibase/string-templates"
import { TableNames } from "../constants"
@ -422,6 +422,10 @@ function shouldReplaceBinding(currentValue, from, convertTo) {
return ! invalids . find ( invalid => noSpaces ? . includes ( invalid ) )
}
function replaceBetween ( string , start , end , replacement ) {
return string . substring ( 0 , start ) + replacement + string . substring ( end )
}
/ * *
* utility function for the readableToRuntimeBinding and runtimeToReadableBinding .
* /
@ -431,6 +435,7 @@ function bindingReplacement(bindableProperties, textWithBindings, convertTo) {
if ( typeof textWithBindings !== "string" ) {
return textWithBindings
}
// work from longest to shortest
const convertFromProps = bindableProperties
. map ( el => el [ convertFrom ] )
. sort ( ( a , b ) => {
@ -440,12 +445,29 @@ function bindingReplacement(bindableProperties, textWithBindings, convertTo) {
let result = textWithBindings
for ( let boundValue of boundValues ) {
let newBoundValue = boundValue
// we use a search string, where any time we replace something we blank it out
// in the search, working from longest to shortest so always use best match first
let searchString = newBoundValue
for ( let from of convertFromProps ) {
if ( shouldReplaceBinding ( newBoundValue , from , convertTo ) ) {
const binding = bindableProperties . find ( el => el [ convertFrom ] === from )
while ( newBoundValue . includes ( from ) ) {
newBoundValue = newBoundValue . replace ( from , binding [ convertTo ] )
}
let idx
do {
// see if any instances of this binding exist in the search string
idx = searchString . indexOf ( from )
if ( idx !== - 1 ) {
let end = idx + from . length ,
searchReplace = Array ( binding [ convertTo ] . length ) . join ( "*" )
// blank out parts of the search string
searchString = replaceBetween ( searchString , idx , end , searchReplace )
newBoundValue = replaceBetween (
newBoundValue ,
idx ,
end ,
binding [ convertTo ]
)
}
} while ( idx !== - 1 )
}
}
result = result . replace ( boundValue , newBoundValue )