{
  "custom": {
    "api_region_name": "na",
    "filter_menu_data": [
      {
        "filters": [
          {
            "color": "#8B008B",
            "column": "test1",
            "group": 1,
            "id": 0,
            "text": "value1"
          }
        ],
        "group_name": "test1",
        "instancePosition": {},
        "instanceStyle": {
          "classes": ""
        }
      },
      {
        "filters": [
          {
            "color": "#00CED1",
            "column": "test2",
            "group": 2,
            "id": 1,
            "text": "value2"
          }
        ],
        "group_name": "test2",
        "instancePosition": {},
        "instanceStyle": {
          "classes": ""
        }
      }
    ],
    "filtered_table_data": [],
    "filters": {
      "active": [],
      "default_colors": [
        "#8B008B",
        "#00CED1",
        "#FF8C00",
        "#708090",
        "#DC143C",
        "#FFDEAD",
        "#7B68EE",
        "#4169E1",
        "#F4A460",
        "#9ACD32"
      ],
      "number_of_groups": "value",
      "selection_active": false
    },
    "stage_config": {
      "account_id": "925510716640",
      "endpoint": "https://scada-s3-management.narme-scada.rme.amazon.dev/",
      "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod",
      "region": "us-east-2",
      "repo_bucket": "na-ignition-image-repo",
      "s3_region": "us-east-1",
      "source_bucket": "na-ignition-image-source"
    },
    "table_data": [],
    "use_filtered_table": false
  },
  "params": {
    "DoubleClick": {
      "Enabled": false,
      "MP": "MP",
      "Sts": "STATUS",
      "TextCode": "TEXT_CODE",
      "WHID": "WHID"
    },
    "NavigationSettings": {
      "BaseUrl": "",
      "Column": "",
      "Enabled": false
    },
    "SelectedRow": [],
    "VisibleColCount": 5,
    "filters": [
      {
        "column": "test1",
        "group": 1,
        "text": "value1"
      },
      {
        "column": "test2",
        "group": 2,
        "text": "value2"
      }
    ],
    "header_order": [
      {
        "field": "VersionId",
        "title": "VERSION ID",
        "visible": true
      },
      {
        "field": "LastModified",
        "title": "LAST MODIFIED",
        "visible": true
      },
      {
        "field": "Size",
        "title": "SIZE (Bytes)",
        "visible": true
      },
      {
        "field": "IsLatest",
        "title": "IS LATEST?",
        "visible": true
      },
      {
        "field": "Key",
        "title": "OBJECT KEY",
        "visible": true
      },
      {
        "field": "StorageClass",
        "title": "STORAGE CLASS",
        "visible": false
      },
      {
        "field": "ETag",
        "title": "ETAG",
        "visible": false
      }
    ],
    "key_to_read_from": "use_param",
    "puToDismiss": "",
    "table_data": [],
    "title": "SCADA S3 Version History"
  },
  "propConfig": {
    "custom.api_region_name": {
      "binding": {
        "config": {
          "path": "session.custom.aws.prefix"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.filter_menu_data": {
      "binding": {
        "config": {
          "path": "view.custom.filters.deactive"
        },
        "transforms": [
          {
            "code": "\tinstances \u003d []\n\tgroups \u003d {}\n\tfor filter in value:\n\t \tif not groups.has_key(filter.column):\n\t \t\tgroups[filter.column] \u003d []\n\t \tgroups[filter.column].append(filter)\n\tfor key in groups:\n\t\tinstance \u003d {\"instanceStyle\": {\n\t    \t\t\t\"classes\": \"\"},\n\t \t\t\t \"instancePosition\": {}}\n\t \tgroups[key].sort()\n\t \tinstance[\u0027filters\u0027] \u003d groups[key]\n\t \tinstance[\u0027group_name\u0027] \u003d key\n\t \tinstances.append(instance)\n\treturn instances",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.filtered_table_data": {
      "binding": {
        "config": {
          "expression": "if({view.custom.table_data} !\u003d {view.custom.filters.active},\r\n{view.custom.filters.active},\r\n{view.custom.filters.active})"
        },
        "transforms": [
          {
            "code": "\tfiltered_table \u003d []\n\tif len(value) \u003e 0:\n\t\tfilter_lookup \u003d {}\n\t\tfor act_filter in value:\n\t\t\tif act_filter[\u0027column\u0027] not in filter_lookup:\n\t\t\t\tfilter_lookup[act_filter[\u0027column\u0027]] \u003d []\n\t\t\tfilter_lookup[act_filter[\u0027column\u0027]].append(act_filter[\u0027text\u0027])\n\t\tfor row in self.custom.table_data:\n\t\t\tsystem.perspective.print(row)\n\t\t\tshould_filter \u003d {}\t\t\n\t\t\t# Handles stylized rows\t\n\t\t\tif \u0027style\u0027 in row and \u0027value\u0027 in row and len(row) \u003d\u003d2:\n\t\t\t\t#for column in row:\n\t\t\t\t\t#system.perspective.print(\u0027value:%s\u0027%column)\n\t\t\t\t\tdata_columns \u003d row[\u0027value\u0027]\n\t\t\t\t\tfor s_column in data_columns:\n\t\t\t\t\t\tif s_column in filter_lookup:\n\t\t\t\t\t\t\tif data_columns[s_column] in filter_lookup[s_column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d True\n\t\t\t\t\t\t\telse:\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\t\n\t\t\telse:\n\t\t\t\tfor column in row:\n\t\t\t\t\tif column in filter_lookup:\n\t\t\t\t\t\tif row[column] in filter_lookup[column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tshould_filter[column] \u003d True\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\t\t\telse:\n\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\tif sum(should_filter.values()) \u003d\u003d len(filter_lookup.keys()):\n\t\t\t\tfiltered_table.append(row)\n\n\treturn filtered_table",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.filters": {
      "persistent": true
    },
    "custom.filters.deactive": {
      "binding": {
        "config": {
          "path": "view.params.filters"
        },
        "transforms": [
          {
            "code": "\t\n\tfilters \u003d []\n\tgroups \u003d []\n\tfor index, filter in enumerate(value):\n\t\tnew_filter \u003d {}\t\n\t\tif not filter.has_key(\u0027group\u0027):\n\t\t\tnew_filter[\u0027group\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027group\u0027] \u003d filter.group\n\t\tif not filter.has_key(\u0027color\u0027):\n\t\t\tif new_filter[\u0027group\u0027] not in groups:\n\t\t\t\tgroups.append(new_filter[\u0027group\u0027])\n\t\t\tnew_filter[\u0027color\u0027] \u003d self.custom.filters.default_colors[groups.index(new_filter[\u0027group\u0027])]\n\t\telse:\n\t\t\tnew_filter[\u0027color\u0027] \u003d filter.color\n\t\tif not filter.has_key(\u0027text\u0027):\n\t\t\tnew_filter[\u0027text\u0027] \u003d \u0027Filter \u0027 + str(index)\n\t\telse:\n\t\t\tnew_filter[\u0027text\u0027] \u003d filter.text\n\t\tif not filter.has_key(\u0027column\u0027):\n\t\t\tnew_filter[\u0027column\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027column\u0027] \u003d filter.column\n\t\tnew_filter[\u0027id\u0027] \u003d index\n\t\tfilters.append(new_filter)\t\t\t\t\n\treturn filters",
            "type": "script"
          }
        ],
        "type": "property"
      }
    },
    "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.table_data": {
      "binding": {
        "config": {
          "expression": "if({view.params.key_to_read_from} \u003d \u0027use_param\u0027,\r\n{view.params.table_data},\r\nproperty(concat(\u0027session.custom.tableComponentData.\u0027,{view.params.key_to_read_from})))"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.use_filtered": {
      "persistent": true
    },
    "custom.use_filtered_table": {
      "binding": {
        "config": {
          "path": "view.custom.filtered_table_data"
        },
        "transforms": [
          {
            "code": "\treturn len(value) \u003e 0",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "params.DoubleClick": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.NavigationSettings": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.SelectedRow": {
      "binding": {
        "config": {
          "path": "/root/Table.props.selection.data"
        },
        "type": "property"
      },
      "paramDirection": "output",
      "persistent": true
    },
    "params.VisibleColCount": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.filters": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.header_order": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.key_to_read_from": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.puToDismiss": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.table_data": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.title": {
      "paramDirection": "input",
      "persistent": true
    }
  },
  "props": {
    "defaultSize": {
      "height": 844
    }
  },
  "root": {
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Title"
                },
                "position": {
                  "basis": "100%"
                },
                "propConfig": {
                  "props.text": {
                    "binding": {
                      "config": {
                        "path": "view.params.title"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "style": {
                    "classes": "Title/Text",
                    "fontSize": 14,
                    "overflow": "visible"
                  }
                },
                "type": "ia.display.label"
              }
            ],
            "meta": {
              "name": "Title"
            },
            "position": {
              "basis": "50%"
            },
            "props": {
              "style": {
                "fontSize": 1,
                "marginLeft": 10,
                "overflow": "visible"
              }
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "FilterCheck",
                  "tooltip": {
                    "enabled": true,
                    "location": "top-left",
                    "text": "Enable Table Search"
                  }
                },
                "position": {
                  "basis": "108px"
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "LEN({..../Table.props.data})\u003e0"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "checkedIcon": {
                    "style": {
                      "fontSize": 16
                    }
                  },
                  "indeterminateIcon": {
                    "style": {
                      "fontSize": 16
                    }
                  },
                  "style": {
                    "fontSize": 12
                  },
                  "text": "Search?",
                  "textPosition": "left",
                  "uncheckedIcon": {
                    "style": {
                      "fontSize": 16
                    }
                  }
                },
                "type": "ia.input.checkbox"
              },
              {
                "meta": {
                  "name": "Spacer1"
                },
                "position": {
                  "basis": "1px"
                },
                "props": {
                  "style": {
                    "classes": "General/Divider"
                  }
                },
                "type": "ia.container.flex"
              },
              {
                "events": {
                  "dom": {
                    "onClick": {
                      "config": {
                        "script": "\ttable \u003d self.parent.parent.parent.getChild(\"Table\")\n\t# ignition perspective has a bug with table where the only way to \n\t# actually de-select and remove the row highlight is to set the\n\t# row and column to -1 and THEN None\n\t# this will automatically clear the selection.data array\n\ttable.props.selection.selectedRow \u003d -1\n\ttable.props.selection.selectedColumn \u003d -1\n\ttable.props.selection.selectedRow \u003d None\n\ttable.props.selection.selectedColumn \u003d None"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "ClearSelectionButton",
                  "tooltip": {
                    "enabled": true,
                    "location": "top-left",
                    "text": "Clear Selection"
                  }
                },
                "position": {
                  "basis": "31px"
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "len({..../Table.props.selection.data})\u003e0"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "path": "material/clear",
                  "style": {
                    "classes": "General/Button"
                  }
                },
                "type": "ia.display.icon"
              },
              {
                "meta": {
                  "name": "Spacer2"
                },
                "position": {
                  "basis": "1px"
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "path": "../ClearSelectionButton.position.display"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "style": {
                    "classes": "General/Divider"
                  }
                },
                "type": "ia.container.flex"
              },
              {
                "events": {
                  "dom": {
                    "onClick": {
                      "config": {
                        "draggable": false,
                        "id": "ColumnSelection",
                        "modal": true,
                        "overlayDismiss": true,
                        "position": {
                          "relativeLocation": "bottom-left"
                        },
                        "positionType": "relative",
                        "resizable": true,
                        "showCloseIcon": true,
                        "type": "toggle",
                        "viewParams": {
                          "Columns": "{/root/TableHeader/TableActions/ColumnSelectionButton.custom.Columns}"
                        },
                        "viewPath": "Objects/PowerTable/ColumnSelection",
                        "viewportBound": false
                      },
                      "scope": "C",
                      "type": "popup"
                    }
                  }
                },
                "meta": {
                  "name": "ColumnSelectionButton",
                  "tooltip": {
                    "enabled": true,
                    "location": "top-left",
                    "text": "+/- Columns"
                  }
                },
                "position": {
                  "basis": "29px"
                },
                "propConfig": {
                  "custom.Columns": {
                    "binding": {
                      "config": {
                        "path": "..../Table.props.columns"
                      },
                      "transforms": [
                        {
                          "code": "\tcolumns \u003d {}\n\tif len(value) \u003e 0:\n\t\tfor column in value:\n\t\t\t#field \u003d column.field\n\t\t\tfield \u003d column.header.title\n\t\t\tif field \u003d\u003d \u0027\u0027:\n\t\t\t\tfield \u003d \u0027None\u0027\n\t\t\tcolumns[field] \u003d column.visible\n\treturn columns",
                          "type": "script"
                        }
                      ],
                      "type": "property"
                    }
                  },
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "LEN({..../Table.props.data})\u003e0"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "path": "material/view_column",
                  "style": {
                    "classes": "General/Button",
                    "fontSize": 12,
                    "marginBottom": 5,
                    "marginTop": 5
                  }
                },
                "type": "ia.display.icon"
              },
              {
                "meta": {
                  "name": "Spacer4"
                },
                "position": {
                  "basis": "1px"
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "LEN({..../Table.props.data})\u003e0"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "style": {
                    "classes": "General/Divider"
                  }
                },
                "type": "ia.container.flex"
              },
              {
                "events": {
                  "dom": {
                    "onClick": {
                      "config": {
                        "script": "\tself.view.custom.filters.selection_active \u003d not self.view.custom.filters.selection_active"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "FilterButton",
                  "tooltip": {
                    "enabled": true,
                    "location": "top-left",
                    "text": "Filter Table"
                  }
                },
                "position": {
                  "basis": "29px",
                  "display": false
                },
                "props": {
                  "path": "material/filter_list",
                  "style": {
                    "classes": "General/Button",
                    "fontSize": 12,
                    "marginBottom": 5,
                    "marginTop": 5
                  }
                },
                "type": "ia.display.icon"
              },
              {
                "meta": {
                  "name": "Spacer3"
                },
                "position": {
                  "basis": "1px"
                },
                "props": {
                  "style": {
                    "classes": "General/Divider"
                  }
                },
                "type": "ia.container.flex"
              },
              {
                "events": {
                  "dom": {
                    "onClick": {
                      "config": {
                        "script": "\n\tcsv_headers \u003d []\n\tcsv_data \u003d []\n\tsystem.perspective.print(\u0027DOWNLOADING TABLE DATA\u0027)\n\tsource_data \u003d  self.parent.parent.parent.getChild(\"Table\").props.data\n\theaders \u003d source_data[0].keys()\n\t\n\tif \u0027style\u0027 in headers and \u0027value\u0027 in headers and len(headers) \u003d\u003d 2:\n\t\tdata \u003d [row[\u0027value\u0027] for row in source_data]\n\telse:\n\t\tdata \u003d source_data\n\t\t\n\tfor record in data:\n\t\tif len(csv_headers) \u003d\u003d 0:\n\t\t\tcsv_headers \u003d record.keys()\n\t\t\tcsv_headers.sort()\n\t\t\tcsv_headers \u003d [str(i) for i in csv_headers]\n\t\tcsv_row \u003d []\n\t\tfor index in range(len(record)):\n\t\t\tcsv_row.append(str(record[csv_headers[index]]))\n\t\tcsv_data.append(csv_row)\n\t\n\ttry:\n\t\tcsv_dataset \u003d system.dataset.toDataSet(csv_headers, csv_data)\n\texcept Exception, e:\n\t\tsystem.perspective.print(str(e))\n\tcsv_export \u003d system.dataset.toCSV(csv_dataset)\n\tfilename \u003d \u0027{0}.csv\u0027.format(str(system.date.now()).replace(\u0027 \u0027, \u0027_\u0027))\n\tsystem.perspective.download(filename, csv_export)\n\t\n\tsystem.perspective.print(\u0027DONE DOWNLOADING TABLE DATA\u0027)"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "SettingsButton",
                  "tooltip": {
                    "enabled": true,
                    "location": "top-left",
                    "text": "Download Table Contents"
                  }
                },
                "position": {
                  "basis": "30px"
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "LEN({..../Table.props.data})\u003e0"
                      },
                      "type": "expr"
                    }
                  }
                },
                "props": {
                  "path": "material/cloud_download",
                  "style": {
                    "classes": "General/Button",
                    "marginRight": 10
                  }
                },
                "type": "ia.display.icon"
              }
            ],
            "meta": {
              "name": "TableActions",
              "tooltip": {
                "location": "top-right"
              }
            },
            "position": {
              "grow": 1
            },
            "props": {
              "justify": "flex-end"
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "TableHeader"
        },
        "position": {
          "shrink": 0
        },
        "props": {
          "justify": "space-between",
          "style": {
            "borderBottomStyle": "solid",
            "borderBottomWidth": 1,
            "cursor": "pointer"
          }
        },
        "type": "ia.container.flex"
      },
      {
        "children": [
          {
            "meta": {
              "name": "FilterMenu"
            },
            "position": {
              "grow": 1
            },
            "propConfig": {
              "props.instances": {
                "binding": {
                  "config": {
                    "path": "view.custom.filter_menu_data"
                  },
                  "type": "property"
                }
              }
            },
            "props": {
              "alignContent": "flex-start",
              "alignItems": "flex-start",
              "path": "Components/PowerTable/FilterMenuGroup",
              "style": {
                "overflow": "visible"
              },
              "useDefaultViewHeight": false,
              "useDefaultViewWidth": false,
              "wrap": "wrap"
            },
            "type": "ia.display.flex-repeater"
          }
        ],
        "meta": {
          "name": "FilterSelection"
        },
        "position": {
          "grow": 1
        },
        "propConfig": {
          "position.display": {
            "binding": {
              "config": {
                "path": "view.custom.filters.selection_active"
              },
              "type": "property"
            }
          }
        },
        "props": {
          "style": {
            "borderBottomStyle": "solid",
            "borderBottomWidth": 1,
            "classes": "Menu/Menu",
            "overflow": "visible",
            "paddingLeft": 10,
            "paddingRight": 10
          }
        },
        "type": "ia.container.flex"
      },
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "FiltersLabel"
                },
                "position": {
                  "basis": "80px"
                },
                "propConfig": {
                  "props.text": {
                    "binding": {
                      "config": {
                        "path": "view.custom.filters.active"
                      },
                      "transforms": [
                        {
                          "code": "\t\n\treturn \u0027\u0027.join([\u0027FILTERS (\u0027, str(len(value)), \u0027):\u0027])",
                          "type": "script"
                        }
                      ],
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "style": {
                    "classes": "Menu/Menu Page/Text",
                    "fontSize": 10,
                    "textAlign": "center"
                  }
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "FiltersCarousel"
                },
                "propConfig": {
                  "props.views": {
                    "binding": {
                      "config": {
                        "path": "view.custom.filters.active"
                      },
                      "transforms": [
                        {
                          "code": "\n\tviews \u003d []\n\tfor filter in value:\n\t\tcarousel_view \u003d {\n\t\t\t\u0027viewPath\u0027:\u0027Components/PowerTable/FilterTile\u0027,\n\t\t\t\u0027direction\u0027 : \u0027row\u0027,\n\t\t\t\u0027viewParams\u0027: {},\n\t\t\t\u0027justify\u0027:\u0027flex-start\u0027,\n\t\t\t\u0027alignItems\u0027: \u0027center\u0027}\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027color\u0027] \u003d filter[\u0027color\u0027]\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027text\u0027] \u003d filter[\u0027text\u0027]\t\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027id\u0027] \u003d filter[\u0027id\u0027]\t\n\t\t\n\t\tviews.append(carousel_view)\n\treturn views",
                          "type": "script"
                        }
                      ],
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "appearance": {
                    "arrows": {
                      "next": {
                        "style": {
                          "marginRight": 5
                        }
                      },
                      "previous": {
                        "style": {
                          "marginLeft": 5
                        }
                      }
                    },
                    "dots": {
                      "enabled": false
                    },
                    "slidePadding": 3,
                    "slidesToShow": 5,
                    "useDefaultViewHeight": true,
                    "useDefaultViewWidth": true
                  },
                  "style": {
                    "overflow": "visible",
                    "textAlign": "left"
                  }
                },
                "type": "ia.display.carousel"
              }
            ],
            "meta": {
              "name": "Left"
            },
            "position": {
              "basis": "90%"
            },
            "props": {
              "style": {
                "overflow": "visible"
              }
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "events": {
                  "component": {
                    "onActionPerformed": {
                      "config": {
                        "script": "\tself.view.custom.filters.active \u003d []\n\tsystem.perspective.sendMessage(\u0027deactivate-filter\u0027, payload \u003d {\u0027id\u0027:-1}, scope \u003d \u0027page\u0027)"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "ClearButton"
                },
                "position": {
                  "basis": "51px"
                },
                "props": {
                  "primary": false,
                  "style": {
                    "classes": "Menu/Item",
                    "fontSize": 12,
                    "marginBottom": 5,
                    "marginLeft": 5,
                    "marginRight": 5,
                    "marginTop": 5
                  },
                  "text": "Clear",
                  "textStyle": {
                    "classes": "Page/Text"
                  }
                },
                "type": "ia.input.button"
              }
            ],
            "meta": {
              "name": "Right"
            },
            "position": {
              "basis": "10%"
            },
            "props": {
              "justify": "flex-end",
              "style": {
                "overflow": "visible"
              }
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "Filters"
        },
        "position": {
          "shrink": 0
        },
        "propConfig": {
          "position.display": {
            "binding": {
              "config": {
                "path": "view.custom.filters.active"
              },
              "transforms": [
                {
                  "code": "\treturn len(value) \u003e 0",
                  "type": "script"
                }
              ],
              "type": "property"
            }
          }
        },
        "props": {
          "style": {
            "overflow": "visible"
          }
        },
        "type": "ia.container.flex"
      },
      {
        "meta": {
          "name": "ReulstLengthLabel"
        },
        "position": {
          "grow": 1
        },
        "propConfig": {
          "position.display": {
            "binding": {
              "config": {
                "path": "view.custom.filters.active"
              },
              "transforms": [
                {
                  "code": "\treturn len(value) \u003e 0",
                  "type": "script"
                }
              ],
              "type": "property"
            }
          },
          "props.text": {
            "binding": {
              "config": {
                "path": "../Table.props.data"
              },
              "transforms": [
                {
                  "code": "\treturn \u0027\u0027.join([str(len(value)), \u0027 results within filters\u0027])",
                  "type": "script"
                }
              ],
              "type": "property"
            }
          }
        },
        "props": {
          "style": {
            "classes": "Menu/Item Page/Text",
            "fontSize": 12,
            "paddingLeft": 5,
            "textTransform": "lowercase"
          }
        },
        "type": "ia.display.label"
      },
      {
        "meta": {
          "name": "pager"
        },
        "position": {
          "basis": "35px",
          "display": false,
          "shrink": 0
        },
        "propConfig": {
          "props.params.number_of_pages": {
            "binding": {
              "config": {
                "expression": "len({../Table.custom.raw_data})"
              },
              "type": "expr"
            }
          },
          "props.params.options_for_pagers": {
            "binding": {
              "config": {
                "path": "../Table.props.pager.options"
              },
              "type": "property"
            }
          }
        },
        "props": {
          "params": {
            "number_of_items_per_page": 100,
            "page_selected": 0
          },
          "path": "Components/PowerTable/pager"
        },
        "type": "ia.display.view"
      },
      {
        "events": {
          "component": {
            "onRowDoubleClick": {
              "config": {
                "script": "\t# grab row JSON from double-click\n\td \u003d event.value\n\t# build out the stage, site, flow-view, and copy_option from the object-key in row\n\tobj_key \u003d d.Key\n\tpath \u003d obj_key.split(\u0027/\u0027)\n\tsite \u003d path[1]\n\tfilename \u003d path[-1]\n\tview \u003d filename.replace(\".svg\",\"\").replace(\".drawio\",\"\")\n\t# from filename suffix, fetch bucket name from \"stage_config\" custom prop\n\tstage_config \u003d self.view.custom.stage_config\n\tbucket \u003d None\n\tif filename.endswith(\".svg\"):\n\t\tbucket \u003d stage_config.repo_bucket\n\tif filename.endswith(\".drawio\"):\n\t\tbucket \u003d stage_config.source_bucket\n\t# build out query_params from row values\n\t# flowview, site, and stage are multi-select dropdowns so need to be cast as lists\n\tnull \u003d None\n\tquery_params \u003d {\n\t\t\"copy_option\": null,\n\t\t\"destination_view\": view,\n\t\t\"destination_site\": site,\n\t\t\"destination_bucket\": bucket,\n\t\t\"end_time\": null,\n\t\t\"error_occurred\": null,\n\t\t\"operation\": null,\n\t\t\"source_view\": \"\",\n\t\t\"source_site\": null,\n\t\t\"source_bucket\": null,\n\t\t\"start_time\": null,\n\t\t\"username\": \"\"\n\t}\n\t# Open audit log viewer\n\tview_path \u003d \u0027PopUp-Views/S3/Audit/Log_Viewer\u0027\n\tparams \u003d {\u0027query_params\u0027: query_params}\n\tsystem.perspective.openPopup(\u0027Audit Log Viewer\u0027, view_path, \n\t\t\t\t\t\t\t\tparams, \u0027SCADA S3 Audit Logs\u0027)\n"
              },
              "scope": "G",
              "type": "script"
            }
          }
        },
        "meta": {
          "name": "Table"
        },
        "position": {
          "grow": 1
        },
        "propConfig": {
          "custom.raw_data": {
            "binding": {
              "config": {
                "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)"
              },
              "transforms": [
                {
                  "code": "\tlist_of_data \u003d []\n\tsingle_list \u003d []\n\tfor item in value:\n\t\tif len(single_list) \u003c self.getSibling(\"pager\").props.params.number_of_items_per_page:\n\t\t\tsingle_list.append(item)\n\t\telse:\n\t\t\tlist_of_data.append(single_list)\n\t\t\tsingle_list \u003d []\n\t\t\tsingle_list.append(item)\n\tif len(single_list) \u003e 0:\n\t\tlist_of_data.append(single_list)\n\treturn list_of_data",
                  "type": "script"
                }
              ],
              "type": "expr"
            }
          },
          "props.columns": {
            "binding": {
              "config": {
                "path": "view.custom.table_data"
              },
              "transforms": [
                {
                  "code": "\tfrom helper.helper import sanitize_tree\n\tcolumns \u003d []\n\tif len(value) \u003e 0:\n\t\trequestedHeaders \u003d sanitize_tree(self.view.params.header_order)\n\t\tfrom pprint import pformat\n#\t\tsystem.perspective.print(pformat(requestedHeaders))\n\t\theaders \u003d []\n\t\tif len(requestedHeaders) \u003e 0:\n\t\t\tfor item in requestedHeaders:\n\t\t\t\tif \u0027style\u0027 in value[0].keys() and \u0027value\u0027 in value[0].keys() and len(value[0].keys()) \u003d\u003d2:\n\t\t\t\t\tif item in value[0][\u0027value\u0027].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\telse:\n\t\t\t\t\tif item in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\t\tif isinstance(item, dict) and \u0027field\u0027 in item and item[\u0027field\u0027] in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\tif len(headers) \u003d\u003d 0:\n\t\t\theaders \u003d value[0].keys()\n\t\tfor header in headers:\t\n\t\t\tfield \u003d header\n\t\t\tvisible \u003d True\n\t\t\ttry:\n\t\t\t\ttitle \u003d str(header).replace(\u0027_\u0027, \u0027 \u0027).upper()\n\t\t\texcept:\n\t\t\t\ttitle \u003d \u0027\u0027\n\t\t\tif isinstance(header, dict):\n\t\t\t\tfield \u003d header.get(\u0027field\u0027, \u0027\u0027)\n\t\t\t\tvisible \u003d header.get(\u0027visible\u0027, True)\n\t\t\t\ttitle \u003d header.get(\u0027title\u0027, field.replace(\u0027_\u0027, \u0027 \u0027).upper())\n\t\t\tcolumn \u003d {\n\t\t\t  \"field\": field,\n\t\t\t  \"visible\": visible,\n\t\t\t  \"editable\": True,\n\t\t\t  \"render\": \"auto\",\n\t\t\t  \"justify\": \"center\",\n\t\t\t  \"align\": \"center\",\n\t\t\t  \"resizable\": True,\n\t\t\t  \"sortable\": True,\n\t\t\t  \"sort\": \"none\",\n\t\t\t  \"viewPath\": \"\",\n\t\t\t  \"viewParams\": {},\n\t\t\t  \"boolean\": \"checkbox\",\n\t\t\t  \"number\": \"value\",\n\t\t\t  \"progressBar\": {\n\t\t\t\t\"max\": 100,\n\t\t\t\t\"min\": 0,\n\t\t\t\t\"bar\": {\n\t\t\t\t  \"color\": \"\",\n\t\t\t\t  \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t  }\n\t\t\t\t},\n\t\t\t\t\"track\": {\n\t\t\t\t  \"color\": \"\",\n\t\t\t\t  \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t  }\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t  \"enabled\": True,\n\t\t\t\t  \"format\": \"0,0.##\",\n\t\t\t\t  \"justify\": \"center\",\n\t\t\t\t  \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t  }\n\t\t\t\t}\n\t\t\t  },\n\t\t\t  \"toggleSwitch\": {\n\t\t\t\t\"color\": {\n\t\t\t\t  \"selected\": \"\",\n\t\t\t\t  \"unselected\": \"\"\n\t\t\t\t}\n\t\t\t  },\n\t\t\t  \"numberFormat\": \"0,0.##\",\n\t\t\t  \"dateFormat\": \"MM/DD/YYYY\",\n\t\t\t  \"width\": \"\",\n\t\t\t  \"strictWidth\": False,\n\t\t\t  \"style\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t  },\n\t\t\t  \"header\": {\n\t\t\t\t\"title\": title,\n\t\t\t\t\"justify\": \"center\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t  \"classes\": \"\",\n\t\t\t\t  \u0027fontSize\u0027:\u002712px\u0027\n\t\t\t\t}\n\t\t\t  },\n\t\t\t  \"footer\": {\n\t\t\t\t\"title\": \"\",\n\t\t\t\t\"justify\": \"left\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t  \"classes\": \"\"\n\t\t\t\t}\n\t\t\t  }\n\t\t\t}\t\t\t\n\t\t\tcolumns.append(column)\n#\t\tif self.view.params.header_order !\u003d [] and len(headers) \u003d\u003d len(self.view.params.header_order):\n#\t\t\tnew_columns \u003d [None] * len(columns)\n#\t\t\tfor column in columns:\n#\t\t\t\tindex \u003d self.view.params.header_order.index(column[\u0027field\u0027])\n#\t\t\t\tnew_columns[index] \u003d column\n#\t\t\tcolumns \u003d new_columns\n\treturn columns",
                  "type": "script"
                }
              ],
              "type": "property"
            }
          },
          "props.data": {
            "binding": {
              "config": {
                "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)"
              },
              "type": "expr"
            }
          },
          "props.filter.enabled": {
            "binding": {
              "config": {
                "path": "../TableHeader/TableActions/FilterCheck.props.selected"
              },
              "type": "property"
            },
            "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": {
          "cells": {
            "allowEditOn": "long-press",
            "style": {
              "fontSize": 12
            }
          },
          "filter": {},
          "pager": {
            "initialOption": 100,
            "options": [
              25,
              50,
              100,
              500,
              1000
            ]
          },
          "style": {
            "overflow": "visible"
          }
        },
        "type": "ia.display.table"
      }
    ],
    "meta": {
      "name": "root"
    },
    "props": {
      "direction": "column",
      "style": {
        "overflow": "visible"
      }
    },
    "scripts": {
      "customMethods": [],
      "extensionFunctions": null,
      "messageHandlers": [
        {
          "messageType": "activate-filter",
          "pageScope": true,
          "script": "\t# implement your handler here\n\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\tadd \u003d True\n\tfor filter in self.view.custom.filters.active:\n\t\tif filter.id \u003d\u003d filter_position:\n\t\t\tadd \u003d False\n\tif add:\n\t\tfor filter in self.view.custom.filters.deactive:\n\t\t\tif filter.id \u003d\u003d filter_position:\t\t\t\t\n\t\t\t\tself.view.custom.filters.active.append(filter)",
          "sessionScope": true,
          "viewScope": false
        },
        {
          "messageType": "deactivate-filter",
          "pageScope": true,
          "script": "\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\t\n\tif filter_position \u003d\u003d -1 :\n\t\tself.view.custom.filters.active \u003d []\n\telse:\n\t\tfor index, filter in enumerate(self.view.custom.filters.active):\n\t\t\tif filter.id \u003d\u003d filter_position:\n\t\t\t\tsystem.perspective.print(filter.id)\n\t\t\t\tself.view.custom.filters.active.pop(index)\n\n#\tfor filter in self.view.custom.filter_menu_data:\n#\t\tif filter.filter_id \u003d\u003d filter_position:\n#\t\t\tsystem.perspective.print(filter.filter_id)\n#\t\t\tfilter.active \u003d False\n#\t\t\tbreak",
          "sessionScope": false,
          "viewScope": false
        },
        {
          "messageType": "column-visibility",
          "pageScope": true,
          "script": "\t# implement your handler here\n\ttable_columns \u003d self.getChild(\"Table\").props.columns\n\tfor table_column in table_columns:\n\t\t#if payload.keys()[0] \u003d\u003d table_column[\u0027field\u0027]:\n\t\tif payload.keys()[0] \u003d\u003d table_column[\u0027header\u0027][\u0027title\u0027]:\n\t\t\ttable_column.visible \u003d payload.values()[0]\n",
          "sessionScope": false,
          "viewScope": false
        }
      ]
    },
    "type": "ia.container.flex"
  }
}