{
  "schemaVersion": "1.0",
  "metadata": {
    "id": "review_demo",
    "title": "Dashport Demo",
    "locale": "en"
  },
  "compatibility": {
    "contract": "1.0",
    "requiredCapabilities": [
      "table",
      "form",
      "lookup",
      "money",
      "text",
      "settings",
      "request",
      "message",
      "canvas",
      "view",
      "kpi",
      "bar",
      "line",
      "navigate",
      "detail"
    ]
  },
  "connections": {
    "crm": {
      "origin": "https://dashport.org"
    }
  },
  "operations": {
    "login": {
      "connection": "crm",
      "method": "POST",
      "path": "/api/demo/v1/auth/login",
      "auth": "none",
      "response": {
        "data": "/data"
      },
      "body": {
        "email": {
          "kind": "binding",
          "source": "input",
          "pointer": "/email"
        },
        "password": {
          "kind": "binding",
          "source": "input",
          "pointer": "/password"
        }
      }
    },
    "refresh": {
      "connection": "crm",
      "method": "POST",
      "path": "/api/demo/v1/auth/refresh",
      "auth": "none",
      "response": {
        "data": "/data"
      },
      "body": {
        "refresh_token": {
          "kind": "binding",
          "source": "session",
          "pointer": "/refresh_token"
        }
      }
    },
    "me": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/me",
      "auth": "session",
      "response": {
        "data": "/data"
      }
    },
    "customers_list": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/customers",
      "auth": "session",
      "response": {
        "data": "/data"
      }
    },
    "customer_update": {
      "connection": "crm",
      "method": "PATCH",
      "path": "/api/demo/v1/customers/{id}",
      "auth": "session",
      "response": {
        "data": "/data",
        "fieldErrors": "/error/fields"
      },
      "pathParams": {
        "id": {
          "kind": "binding",
          "source": "record",
          "pointer": "/id"
        }
      },
      "body": {
        "name": {
          "kind": "binding",
          "source": "form",
          "pointer": "/name"
        },
        "company": {
          "kind": "binding",
          "source": "form",
          "pointer": "/company"
        }
      }
    },
    "companies_search": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/companies",
      "auth": "session",
      "response": {
        "data": "/data",
        "nextCursor": "/next"
      },
      "query": {
        "q": {
          "kind": "binding",
          "source": "input",
          "pointer": "/search"
        }
      },
      "pagination": {
        "mode": "cursor",
        "parameter": "cursor",
        "pageSize": 25
      }
    },
    "settings_load": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/settings",
      "auth": "session",
      "response": {
        "data": "/data"
      }
    },
    "settings_save": {
      "connection": "crm",
      "method": "PATCH",
      "path": "/api/demo/v1/settings",
      "auth": "session",
      "response": {
        "data": "/data",
        "fieldErrors": "/error/fields"
      },
      "body": {
        "title": {
          "kind": "binding",
          "source": "form",
          "pointer": "/title"
        }
      }
    },
    "logout": {
      "connection": "crm",
      "method": "POST",
      "path": "/api/demo/v1/auth/logout",
      "auth": "session",
      "response": {
        "data": "/data"
      },
      "body": {
        "refresh_token": {
          "kind": "binding",
          "source": "session",
          "pointer": "/refresh_token"
        }
      }
    },
    "customer_create": {
      "connection": "crm",
      "method": "POST",
      "path": "/api/demo/v1/customers",
      "auth": "session",
      "response": {
        "data": "/data",
        "fieldErrors": "/error/fields"
      },
      "body": {
        "name": {
          "kind": "binding",
          "source": "form",
          "pointer": "/name"
        },
        "company": {
          "kind": "binding",
          "source": "form",
          "pointer": "/company"
        }
      }
    },
    "revenue": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/revenue",
      "auth": "session",
      "response": {
        "data": "/data"
      }
    },
    "series": {
      "connection": "crm",
      "method": "GET",
      "path": "/api/demo/v1/series",
      "auth": "session",
      "response": {
        "data": "/data"
      }
    }
  },
  "auth": {
    "mode": "bearer",
    "connection": "crm",
    "login": "login",
    "refresh": "refresh",
    "me": "me",
    "tokenPointer": "/data/access_token",
    "refreshTokenPointer": "/data/refresh_token",
    "header": "Authorization",
    "prefix": "Bearer ",
    "subjectPointer": "/data/subject",
    "permissionsPointer": "/data/permissions",
    "tenantPointer": "/data/tenant",
    "logout": "logout"
  },
  "permissions": {
    "customers_read": "View customers",
    "customers_write": "Edit customers",
    "settings_write": "Edit company settings",
    "balance_read": "View balances"
  },
  "rules": {
    "has_name": {
      "operator": "ne",
      "left": {
        "kind": "binding",
        "source": "form",
        "pointer": "/name"
      },
      "right": {
        "kind": "literal",
        "value": ""
      }
    }
  },
  "actions": {
    "save_customer": {
      "type": "request",
      "operation": "customer_update",
      "permission": "customers_write",
      "visibleWhen": "has_name",
      "next": "saved"
    },
    "saved": {
      "type": "message",
      "text": "Saved"
    },
    "show_customers": {
      "type": "navigate",
      "view": "customers"
    }
  },
  "resources": {
    "customers": {
      "label": "Customers",
      "list": "customers_list",
      "update": "customer_update",
      "access": {
        "read": "customers_read",
        "write": "customers_write"
      },
      "fields": {
        "name": {
          "type": "text",
          "label": "Name",
          "required": true
        },
        "balance": {
          "type": "money",
          "label": "Balance",
          "number": {
            "scale": 2,
            "rounding": "half_even",
            "currency": "USD"
          },
          "access": {
            "read": "balance_read",
            "write": "customers_write"
          }
        },
        "company": {
          "type": "lookup",
          "label": "Company",
          "lookup": {
            "operation": "companies_search",
            "mode": "preload",
            "multiple": false,
            "minCharacters": 0,
            "debounceMs": 300,
            "valuePointer": "/id",
            "labelPointer": "/name"
          }
        }
      },
      "create": "customer_create"
    }
  },
  "views": {
    "customers": {
      "type": "table",
      "title": "Customers",
      "resource": "customers",
      "columns": [
        "name",
        "balance",
        "company"
      ]
    },
    "customer_edit": {
      "type": "form",
      "title": "Edit customer",
      "resource": "customers",
      "fields": [
        "name",
        "company"
      ],
      "actions": [
        "save_customer"
      ]
    },
    "company_settings": {
      "type": "settings",
      "title": "Company settings",
      "settingsGroup": "company"
    },
    "overview": {
      "type": "canvas",
      "title": "Overview",
      "widgets": [
        {
          "type": "kpi",
          "title": "Revenue · sample data",
          "operation": "revenue",
          "valuePointer": "",
          "clickAction": "show_customers"
        },
        {
          "type": "bar",
          "title": "Monthly revenue",
          "operation": "series",
          "labelPointer": "/label",
          "valuePointer": "/value"
        },
        {
          "type": "line",
          "title": "Revenue trend",
          "operation": "series",
          "labelPointer": "/label",
          "valuePointer": "/value"
        },
        {
          "type": "view",
          "title": "Customers",
          "view": "customers",
          "height": 380
        }
      ]
    }
  },
  "settings": {
    "company": {
      "title": "Company settings",
      "scope": "tenant",
      "load": "settings_load",
      "save": "settings_save",
      "fields": {
        "title": {
          "type": "text",
          "label": "Company name"
        }
      },
      "access": {
        "write": "settings_write"
      }
    }
  },
  "navigation": [
    {
      "label": "Overview",
      "view": "overview"
    },
    {
      "label": "Customers",
      "view": "customers",
      "permission": "customers_read"
    },
    {
      "label": "Settings",
      "view": "company_settings",
      "permission": "settings_write"
    }
  ]
}
