{
  "custom": {
    "api_region_name": "eu",
    "developer_user": true,
    "enable_add_new_site": true,
    "enabled_whids": [
      "DNK7",
      "EWR4"
    ],
    "expanded": false,
    "loading": false,
    "new_site_is_not_in_S3": true,
    "new_site_to_add": "EWR4",
    "show_add_new_site": false,
    "stage_config": {
      "account_id": "006306898152",
      "api_call_role": "arn:aws:iam::609617486056:role/RMESDScadaS3ManagementAPIcallRole-prod-eu-west-1",
      "endpoint": "https://eu-west-1.scada-s3-management.scada.eurme.amazon.dev/",
      "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod",
      "region": "eu-west-1",
      "repo_bucket": "ignition-image-repo",
      "s3_region": "eu-west-1",
      "source_bucket": "ignition-image-source"
    },
    "whid": "",
    "whids_in_s3": [
      "BOS3",
      "BRS1",
      "CGN9",
      "DAO1",
      "DAO3",
      "DAR2",
      "DBE2",
      "DBH3",
      "DBI7",
      "DBT3",
      "DCT7",
      "DCT9",
      "DCZ3",
      "DCZ4",
      "DEH1",
      "DER1",
      "DER2",
      "DER3",
      "DER5",
      "DFV1",
      "DHA1",
      "DHE3",
      "DHE4",
      "DHE6",
      "DIF2",
      "DIF6",
      "DIP1",
      "DLO1",
      "DLO2",
      "DLO3",
      "DLO4",
      "DLO5",
      "DLO7",
      "DLZ1",
      "DLZ2",
      "DLZ3",
      "DMA3",
      "DMA4",
      "DMA6",
      "DMV1",
      "DMV3",
      "DMZ2",
      "DMZ4",
      "DNC1",
      "DNC2",
      "DNE2",
      "DNG2",
      "DNM7",
      "DNP1",
      "DNX3",
      "DNZ2",
      "DPI3",
      "DPU1",
      "DRM2",
      "DSI2",
      "DSO2",
      "DSY6",
      "DTC2",
      "DVN1",
      "DVN2",
      "DVN5",
      "DWN2",
      "IST2",
      "MAD6",
      "MAN2",
      "QCB6"
    ]
  },
  "events": {
    "system": {
      "onStartup": {
        "config": {
          "script": "\tself.custom.expanded \u003d False\n\tself.custom.new_site_to_add \u003d self.params.selected_whid"
        },
        "scope": "G",
        "type": "script"
      }
    }
  },
  "params": {
    "enables": {},
    "selected_whid": "EWR4"
  },
  "propConfig": {
    "custom.api_region_name": {
      "binding": {
        "config": {
          "path": "session.custom.aws.prefix"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.developer_user": {
      "binding": {
        "config": {
          "expression": "isAuthorized(false, \u0027Authenticated/Roles/eurme-ignition-developers\u0027)"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.enable_add_new_site": {
      "binding": {
        "config": {
          "expression": "isAuthorized(false, \u0027Authenticated/Roles/rme-c4\u0027, \u0027Authenticated/Roles/narme-ignition-developers\u0027,\r\n\t\t\t\u0027Authenticated/Roles/eurme-ignition-developers\u0027)\r\n"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.enabled_whids": {
      "binding": {
        "config": {
          "expression": "{session.custom.fc}"
        },
        "transforms": [
          {
            "code": "\tchild_projects \u003d config.project_config.get_child_scada_projects()\n\treturn [x.replace(\u0027_SCADA\u0027,\u0027\u0027) for x in child_projects]",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.expanded": {
      "persistent": true
    },
    "custom.loading": {
      "persistent": true
    },
    "custom.new_site_is_not_in_S3": {
      "binding": {
        "config": {
          "expression": "{view.custom.new_site_to_add}+toStr({view.custom.whids_in_s3})"
        },
        "transforms": [
          {
            "code": "\tnew_site \u003d self.custom.new_site_to_add\n\twhids \u003d self.custom.whids_in_s3\n\tif new_site and new_site not in whids:\n\t\treturn True\n\treturn False",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.new_site_to_add": {
      "persistent": true
    },
    "custom.show_add_new_site": {
      "persistent": true
    },
    "custom.stage_config": {
      "binding": {
        "config": {
          "expression": "{view.custom.api_region_name}"
        },
        "transforms": [
          {
            "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.whid": {
      "binding": {
        "config": {
          "path": "session.custom.fc"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.whids_in_s3": {
      "binding": {
        "config": {
          "expression": "{session.custom.fc}"
        },
        "transforms": [
          {
            "code": "\tfrom AWS.s3 import S3Manager\n\t\n\tusername \u003d self.session.props.auth.user.userName\n\tapi_region_name \u003d self.custom.api_region_name\n\t\n\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\n\tbucket \u003d self.custom.stage_config.repo_bucket\n\treturn s3m.fetch_site_list(bucket)\n",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "params.enables": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.selected_whid": {
      "onChange": {
        "enabled": null,
        "script": "\tself.custom.new_site_to_add \u003d getattr(currentValue, \u0027value\u0027, \u0027\u0027)"
      },
      "paramDirection": "input",
      "persistent": true
    }
  },
  "props": {
    "defaultSize": {
      "height": 330,
      "width": 600
    }
  },
  "root": {
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "125px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "S3 Image Bucket:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "label_LeftAlign"
                },
                "position": {
                  "basis": "200px",
                  "grow": 1
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "!{view.params.enables.bucket}"
                      },
                      "type": "expr"
                    }
                  },
                  "props.params.text": {
                    "binding": {
                      "config": {
                        "path": "view.custom.stage_config.repo_bucket"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "path": "Objects/Templates/Labels/label_LeftAlign",
                  "style": {
                    "classes": "Framework/Card/Value"
                  }
                },
                "type": "ia.display.view"
              }
            ],
            "meta": {
              "name": "FlexContainer Image Bucket"
            },
            "position": {
              "basis": "26px",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "125px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "S3 Source Bucket:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "label_LeftAlign"
                },
                "position": {
                  "basis": "200px",
                  "grow": 1
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "!{view.params.enables.bucket}"
                      },
                      "type": "expr"
                    }
                  },
                  "props.params.text": {
                    "binding": {
                      "config": {
                        "path": "view.custom.stage_config.source_bucket"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "path": "Objects/Templates/Labels/label_LeftAlign",
                  "style": {
                    "classes": "Framework/Card/Value"
                  }
                },
                "type": "ia.display.view"
              }
            ],
            "meta": {
              "name": "FlexContainer Source Bucket"
            },
            "position": {
              "basis": "26px",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "125px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Child Projects:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "label_LeftAlign"
                },
                "position": {
                  "basis": "200px",
                  "grow": 1
                },
                "propConfig": {
                  "props.params.text": {
                    "binding": {
                      "config": {
                        "expression": "len({view.custom.enabled_whids})"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "path": "Objects/Templates/Labels/label_LeftAlign",
                  "style": {
                    "classes": "Framework/Card/Value"
                  }
                },
                "type": "ia.display.view"
              },
              {
                "meta": {
                  "name": "Label_0"
                },
                "position": {
                  "basis": "100px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Sites in S3:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "label_LeftAlign_0"
                },
                "position": {
                  "basis": "200px",
                  "grow": 1
                },
                "propConfig": {
                  "props.params.text": {
                    "binding": {
                      "config": {
                        "expression": "len({view.custom.whids_in_s3})"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "path": "Objects/Templates/Labels/label_LeftAlign",
                  "style": {
                    "classes": "Framework/Card/Value"
                  }
                },
                "type": "ia.display.view"
              },
              {
                "children": [
                  {
                    "events": {
                      "component": {
                        "onActionPerformed": {
                          "config": {
                            "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded"
                          },
                          "scope": "G",
                          "type": "script"
                        }
                      }
                    },
                    "meta": {
                      "name": "Button"
                    },
                    "propConfig": {
                      "props.image.icon.path": {
                        "binding": {
                          "config": {
                            "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)"
                          },
                          "type": "expr"
                        }
                      }
                    },
                    "props": {
                      "image": {
                        "icon": {}
                      },
                      "primary": false,
                      "style": {
                        "classes": "Input/Button/Secondary_minimal"
                      },
                      "text": ""
                    },
                    "type": "ia.input.button"
                  }
                ],
                "meta": {
                  "name": "FlexContainer"
                },
                "position": {
                  "grow": 1,
                  "shrink": 0
                },
                "props": {
                  "justify": "flex-end"
                },
                "type": "ia.container.flex"
              }
            ],
            "meta": {
              "name": "FlexContainer Sites"
            },
            "position": {
              "basis": "26px",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "children": [
                  {
                    "meta": {
                      "name": "Label"
                    },
                    "position": {
                      "basis": "125px",
                      "shrink": 0
                    },
                    "props": {
                      "style": {
                        "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                        "paddingLeft": "5px"
                      },
                      "text": "Site to Add:"
                    },
                    "type": "ia.display.label"
                  },
                  {
                    "meta": {
                      "name": "label_LeftAlign"
                    },
                    "position": {
                      "grow": 1
                    },
                    "propConfig": {
                      "props.params.text": {
                        "binding": {
                          "config": {
                            "path": "view.custom.new_site_to_add"
                          },
                          "type": "property"
                        }
                      }
                    },
                    "props": {
                      "path": "Objects/Templates/Labels/label_LeftAlign",
                      "style": {
                        "classes": "Framework/Card/Value"
                      }
                    },
                    "type": "ia.display.view"
                  },
                  {
                    "events": {
                      "component": {
                        "onActionPerformed": {
                          "config": {
                            "script": "\t# show confirm dialog for user before adding site\n\tself.show_confirm_dialog()\n"
                          },
                          "scope": "G",
                          "type": "script"
                        }
                      }
                    },
                    "meta": {
                      "name": "Button Add New Site",
                      "tooltip": {
                        "location": "bottom",
                        "style": {
                          "whiteSpace": "pre"
                        }
                      }
                    },
                    "position": {
                      "shrink": 0
                    },
                    "propConfig": {
                      "meta.tooltip.enabled": {
                        "binding": {
                          "config": {
                            "path": "this.props.enabled"
                          },
                          "type": "property"
                        }
                      },
                      "meta.tooltip.text": {
                        "binding": {
                          "config": {
                            "expression": "stringFormat(\u0027Add %s site folder to the image and source buckets:\\n[%s, %s]\u0027,\r\n\t{view.custom.new_site_to_add},{view.custom.stage_config.repo_bucket},\r\n\t{view.custom.stage_config.source_bucket})"
                          },
                          "type": "expr"
                        }
                      },
                      "props.enabled": {
                        "binding": {
                          "config": {
                            "expression": "!isNull({view.custom.new_site_to_add})\r\n\u0026\u0026len({view.custom.new_site_to_add})\r\n\u0026\u0026{view.custom.new_site_is_not_in_S3}\r\n\u0026\u0026{view.custom.developer_user}"
                          },
                          "type": "expr"
                        }
                      }
                    },
                    "props": {
                      "image": {
                        "icon": {
                          "path": "material/library_add"
                        }
                      },
                      "style": {
                        "margin": "2px"
                      },
                      "text": "Add Site"
                    },
                    "scripts": {
                      "customMethods": [
                        {
                          "name": "show_success_dialog",
                          "params": [
                            "msg\u003dNone"
                          ],
                          "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"success\", \n\t\t\"New Site Added\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t"
                        },
                        {
                          "name": "show_warning_dialog",
                          "params": [
                            "msg\u003dNone"
                          ],
                          "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"warning\", \n\t\t\"New Site NOT Added\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t"
                        },
                        {
                          "name": "show_error_dialog",
                          "params": [
                            "msg\u003dNone"
                          ],
                          "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"error\", \n\t\t\"New Site Add Error!\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t"
                        },
                        {
                          "name": "show_confirm_dialog",
                          "params": [
                            "payload\u003dNone"
                          ],
                          "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add payload of data to pass to the popup\n\tmsg \u003d (\u0027Are you sure you want to add %s site to S3? \u0027\n\t\t\u0027\\nThis will create a new folder in the in each of the image repo and source file S3 buckets\u0027) % (\n\t\tself.view.custom.new_site_to_add)\n\tpayload \u003d {}\t\t\n\tAlerts.showAlert(\n\t\t\"info\", \n\t\t\"Add New Site to S3?\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"Continue\", \n\t\t\"Cancel\", \n\t\t\"library_add\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"confirm_add_new_site\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\tpayload\n\t)\n\t\t\t"
                        },
                        {
                          "name": "update_bindings",
                          "params": [],
                          "script": "\t\"\"\"\n\t\tAfter data saved to S3, refresh session and view bindings\n\t\"\"\"\n\tself.view.refreshBinding(\u0027custom.enabled_whids\u0027)\n\tself.view.refreshBinding(\u0027custom.whids_in_s3\u0027)\n\tproject_table \u003d self.parent.parent.getChild(\"FlexContainer Tables\").getChild(\"FlexContainer Projects\").getChild(\"Table\")\n\tproject_table.refreshBinding(\u0027props.data\u0027)\n\tsystem.perspective.sendMessage(\u0027update_enabled_whids\u0027, {}, scope\u003d\u0027session\u0027)\n\tself.view.custom.new_site_to_add \u003d None\n\tself.view.custom.loading \u003d False\n\t\t"
                        },
                        {
                          "name": "add_new_site",
                          "params": [],
                          "script": "\t\"\"\"\n\t\tCall AWS.s3.S3Manager.add_new_site() method with user selections\n\t\"\"\"\n\tfrom AWS.s3 import S3Manager\n\tfrom pprint import pformat\n\tfrom helper.helper import sanitize_tree\n\t\n\tapi_region_name \u003d self.view.custom.api_region_name\n\tusername \u003d self.session.props.auth.user.userName\n\tsite \u003d self.view.custom.new_site_to_add\n\tself.view.custom.loading \u003d True\n\n\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\t# Setting `bucket` \u003d \u0027both\u0027 will add the site folder to both the image and source buckets\n\tbucket \u003d \u0027both\u0027\n\toperation \u003d \u0027add_new_site\u0027\n\tparams \u003d {\u0027site\u0027: site, \u0027bucket\u0027: bucket}\n\ttry:\n\t\tresp \u003d getattr(s3m, operation)(**params)\n\t\tmsg \u003d pformat(sanitize_tree(resp))\n\t\tsystem.perspective.print(msg)\n\t\tresp_code \u003d resp.get(\u0027code\u0027, None)\n\t\tif (resp_code and resp_code !\u003d 200) or (not resp_code and \u0027message\u0027 in resp):\n\t\t\t# \u0027code\u0027 in resp indicates API encountered and returned an error\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\telse:\n\t\t\tself.show_success_dialog(msg)\n\t\t\tself.update_bindings()\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027Error executing %s operation! \\nError: %s\u0027 % (\n\t\t\t\toperation, traceback.format_exc())\n\t\tsystem.perspective.print(msg)\n\t\tself.view.custom.loading \u003d False\n\t\tself.show_error_dialog(msg)\n\t"
                        }
                      ],
                      "extensionFunctions": null,
                      "messageHandlers": [
                        {
                          "messageType": "confirm_add_new_site",
                          "pageScope": false,
                          "script": "\tsystem.perspective.closePopup(\u0027alertDialog\u0027)\n\t# call the add_new_site custom method\n\tself.add_new_site()\n\t\t\t",
                          "sessionScope": true,
                          "viewScope": true
                        }
                      ]
                    },
                    "type": "ia.input.button"
                  }
                ],
                "meta": {
                  "name": "FlexContainer Add New Site"
                },
                "position": {
                  "basis": "32px",
                  "shrink": 0
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "{view.custom.developer_user}\r\n\u0026\u0026!isNull({view.custom.new_site_to_add})\r\n\u0026\u0026{view.custom.new_site_is_not_in_S3}"
                      },
                      "type": "expr"
                    }
                  }
                },
                "type": "ia.container.flex"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "events": {
                          "component": {
                            "onSelectionChange": {
                              "config": {
                                "script": "\t# validate the selection data is not null\n\tif self.props.selection.data:\n\t\tproject \u003d self.props.selection.data[0].Project\n\t\tif getattr(project, \u0027value\u0027, None):\n\t\t\t# if this returns something, the row is styled, grab the value\n\t\t\tproject \u003d project.get(\u0027value\u0027)\n\t\tproject_site \u003d project.replace(\"_SCADA\", \"\")\n\t\tself.view.custom.new_site_to_add \u003d project_site\n"
                              },
                              "scope": "G",
                              "type": "script"
                            }
                          }
                        },
                        "meta": {
                          "name": "Table"
                        },
                        "position": {
                          "basis": "200px",
                          "shrink": 0
                        },
                        "propConfig": {
                          "props.data": {
                            "binding": {
                              "config": {
                                "expression": "toStr({view.custom.enabled_whids})+toStr({view.custom.whids_in_s3})"
                              },
                              "transforms": [
                                {
                                  "code": "\tenabled_whids \u003d self.view.custom.enabled_whids\n\twhids_in_s3 \u003d self.view.custom.whids_in_s3\n\tdata \u003d [{\u0027Project\u0027: x + \u0027_SCADA\u0027} for x in enabled_whids]\n\tfor row in data:\n\t\tproject \u003d row[\u0027Project\u0027]\n\t\twhid \u003d project.replace(\u0027_SCADA\u0027,\u0027\u0027)\n\t\tif whid not in whids_in_s3:\n\t\t\tstyle \u003d {\u0027backgroundColor\u0027: \u0027#FFFF00\u0027}\n\t\t\trow[\u0027Project\u0027] \u003d {\u0027value\u0027: project, \u0027style\u0027: style}\n\treturn data",
                                  "type": "script"
                                }
                              ],
                              "type": "expr"
                            }
                          },
                          "props.filter.enabled": {
                            "onChange": {
                              "enabled": null,
                              "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t"
                            }
                          }
                        },
                        "props": {
                          "columns": [
                            {
                              "align": "center",
                              "boolean": "checkbox",
                              "dateFormat": "MM/DD/YYYY",
                              "editable": false,
                              "field": "Project",
                              "filter": {
                                "boolean": {
                                  "condition": ""
                                },
                                "date": {
                                  "condition": "",
                                  "value": ""
                                },
                                "enabled": false,
                                "number": {
                                  "condition": "",
                                  "value": ""
                                },
                                "string": {
                                  "condition": "",
                                  "value": ""
                                },
                                "visible": "on-hover"
                              },
                              "footer": {
                                "align": "center",
                                "justify": "left",
                                "style": {
                                  "classes": ""
                                },
                                "title": ""
                              },
                              "header": {
                                "align": "center",
                                "justify": "center",
                                "style": {
                                  "classes": ""
                                },
                                "title": "Child Project"
                              },
                              "justify": "center",
                              "number": "value",
                              "numberFormat": "0,0.##",
                              "progressBar": {
                                "bar": {
                                  "color": "",
                                  "style": {
                                    "classes": ""
                                  }
                                },
                                "max": 100,
                                "min": 0,
                                "track": {
                                  "color": "",
                                  "style": {
                                    "classes": ""
                                  }
                                },
                                "value": {
                                  "enabled": true,
                                  "format": "0,0.##",
                                  "justify": "center",
                                  "style": {
                                    "classes": ""
                                  }
                                }
                              },
                              "render": "auto",
                              "resizable": true,
                              "sort": "none",
                              "sortable": true,
                              "strictWidth": false,
                              "style": {
                                "classes": ""
                              },
                              "toggleSwitch": {
                                "color": {
                                  "selected": "",
                                  "unselected": ""
                                }
                              },
                              "viewParams": {},
                              "viewPath": "",
                              "visible": true,
                              "width": ""
                            }
                          ],
                          "style": {
                            "margin": "5px"
                          }
                        },
                        "type": "ia.display.table"
                      }
                    ],
                    "meta": {
                      "name": "FlexContainer Projects"
                    },
                    "position": {
                      "basis": "50%",
                      "grow": 1
                    },
                    "props": {
                      "direction": "column"
                    },
                    "type": "ia.container.flex"
                  },
                  {
                    "children": [
                      {
                        "meta": {
                          "name": "Table"
                        },
                        "position": {
                          "basis": "200px",
                          "shrink": 0
                        },
                        "propConfig": {
                          "props.data": {
                            "binding": {
                              "config": {
                                "path": "view.custom.whids_in_s3"
                              },
                              "transforms": [
                                {
                                  "code": "\treturn [{\u0027WHID\u0027: x} for x in value]",
                                  "type": "script"
                                }
                              ],
                              "type": "property"
                            }
                          },
                          "props.filter.enabled": {
                            "onChange": {
                              "enabled": null,
                              "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t"
                            }
                          }
                        },
                        "props": {
                          "columns": [
                            {
                              "align": "center",
                              "boolean": "checkbox",
                              "dateFormat": "MM/DD/YYYY",
                              "editable": false,
                              "field": "WHID",
                              "filter": {
                                "boolean": {
                                  "condition": ""
                                },
                                "date": {
                                  "condition": "",
                                  "value": ""
                                },
                                "enabled": false,
                                "number": {
                                  "condition": "",
                                  "value": ""
                                },
                                "string": {
                                  "condition": "",
                                  "value": ""
                                },
                                "visible": "on-hover"
                              },
                              "footer": {
                                "align": "center",
                                "justify": "left",
                                "style": {
                                  "classes": ""
                                },
                                "title": ""
                              },
                              "header": {
                                "align": "center",
                                "justify": "center",
                                "style": {
                                  "classes": ""
                                },
                                "title": "FC"
                              },
                              "justify": "center",
                              "number": "value",
                              "numberFormat": "0,0.##",
                              "progressBar": {
                                "bar": {
                                  "color": "",
                                  "style": {
                                    "classes": ""
                                  }
                                },
                                "max": 100,
                                "min": 0,
                                "track": {
                                  "color": "",
                                  "style": {
                                    "classes": ""
                                  }
                                },
                                "value": {
                                  "enabled": true,
                                  "format": "0,0.##",
                                  "justify": "center",
                                  "style": {
                                    "classes": ""
                                  }
                                }
                              },
                              "render": "auto",
                              "resizable": true,
                              "sort": "none",
                              "sortable": true,
                              "strictWidth": false,
                              "style": {
                                "classes": ""
                              },
                              "toggleSwitch": {
                                "color": {
                                  "selected": "",
                                  "unselected": ""
                                }
                              },
                              "viewParams": {},
                              "viewPath": "",
                              "visible": true,
                              "width": ""
                            }
                          ],
                          "style": {
                            "margin": "5px"
                          }
                        },
                        "type": "ia.display.table"
                      }
                    ],
                    "meta": {
                      "name": "FlexContainer Site Folders"
                    },
                    "position": {
                      "basis": "50%",
                      "grow": 1
                    },
                    "props": {
                      "direction": "column"
                    },
                    "type": "ia.container.flex"
                  }
                ],
                "meta": {
                  "name": "FlexContainer Tables"
                },
                "type": "ia.container.flex"
              }
            ],
            "meta": {
              "name": "FlexContainer Projects vs Folders"
            },
            "propConfig": {
              "position.display": {
                "binding": {
                  "config": {
                    "path": "view.custom.expanded"
                  },
                  "type": "property"
                }
              }
            },
            "props": {
              "direction": "column"
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "FlexContainer"
        },
        "position": {
          "basis": "100%",
          "grow": 1
        },
        "props": {
          "direction": "column"
        },
        "type": "ia.container.flex"
      }
    ],
    "meta": {
      "name": "root"
    },
    "props": {
      "direction": "column"
    },
    "type": "ia.container.flex"
  }
}