{"action":"created","issue":{"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/5523","repository_url":"https://api.github.com/repos/silverstripe/silverstripe-framework","labels_url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/5523/labels{/name}","comments_url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/5523/comments","events_url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/5523/events","html_url":"https://github.com/silverstripe/silverstripe-framework/issues/5523","id":154343332,"number":5523,"title":"Implement client-side form validation feedback in React forms","user":{"login":"chillu","id":111025,"avatar_url":"https://avatars.githubusercontent.com/u/111025?v=3","gravatar_id":"","url":"https://api.github.com/users/chillu","html_url":"https://github.com/chillu","followers_url":"https://api.github.com/users/chillu/followers","following_url":"https://api.github.com/users/chillu/following{/other_user}","gists_url":"https://api.github.com/users/chillu/gists{/gist_id}","starred_url":"https://api.github.com/users/chillu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chillu/subscriptions","organizations_url":"https://api.github.com/users/chillu/orgs","repos_url":"https://api.github.com/users/chillu/repos","events_url":"https://api.github.com/users/chillu/events{/privacy}","received_events_url":"https://api.github.com/users/chillu/received_events","type":"User","site_admin":false},"labels":[{"id":386316041,"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/labels/affects/v4","name":"affects/v4","color":"5319e7","default":false},{"id":34209120,"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/labels/type/enhancement","name":"type/enhancement","color":"0e8a16","default":false},{"id":77911647,"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/labels/type/frontend","name":"type/frontend","color":"c5def5","default":false}],"state":"open","locked":false,"assignee":{"login":"flamerohr","id":1064889,"avatar_url":"https://avatars.githubusercontent.com/u/1064889?v=3","gravatar_id":"","url":"https://api.github.com/users/flamerohr","html_url":"https://github.com/flamerohr","followers_url":"https://api.github.com/users/flamerohr/followers","following_url":"https://api.github.com/users/flamerohr/following{/other_user}","gists_url":"https://api.github.com/users/flamerohr/gists{/gist_id}","starred_url":"https://api.github.com/users/flamerohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flamerohr/subscriptions","organizations_url":"https://api.github.com/users/flamerohr/orgs","repos_url":"https://api.github.com/users/flamerohr/repos","events_url":"https://api.github.com/users/flamerohr/events{/privacy}","received_events_url":"https://api.github.com/users/flamerohr/received_events","type":"User","site_admin":false},"assignees":[{"login":"flamerohr","id":1064889,"avatar_url":"https://avatars.githubusercontent.com/u/1064889?v=3","gravatar_id":"","url":"https://api.github.com/users/flamerohr","html_url":"https://github.com/flamerohr","followers_url":"https://api.github.com/users/flamerohr/followers","following_url":"https://api.github.com/users/flamerohr/following{/other_user}","gists_url":"https://api.github.com/users/flamerohr/gists{/gist_id}","starred_url":"https://api.github.com/users/flamerohr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flamerohr/subscriptions","organizations_url":"https://api.github.com/users/flamerohr/orgs","repos_url":"https://api.github.com/users/flamerohr/repos","events_url":"https://api.github.com/users/flamerohr/events{/privacy}","received_events_url":"https://api.github.com/users/flamerohr/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/milestones/40","html_url":"https://github.com/silverstripe/silverstripe-framework/milestones/CMS%204.0.0-alpha3","labels_url":"https://api.github.com/repos/silverstripe/silverstripe-framework/milestones/40/labels","id":2002969,"number":40,"title":"CMS 4.0.0-alpha3","description":"","creator":{"login":"tractorcow","id":936064,"avatar_url":"https://avatars.githubusercontent.com/u/936064?v=3","gravatar_id":"","url":"https://api.github.com/users/tractorcow","html_url":"https://github.com/tractorcow","followers_url":"https://api.github.com/users/tractorcow/followers","following_url":"https://api.github.com/users/tractorcow/following{/other_user}","gists_url":"https://api.github.com/users/tractorcow/gists{/gist_id}","starred_url":"https://api.github.com/users/tractorcow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tractorcow/subscriptions","organizations_url":"https://api.github.com/users/tractorcow/orgs","repos_url":"https://api.github.com/users/tractorcow/repos","events_url":"https://api.github.com/users/tractorcow/events{/privacy}","received_events_url":"https://api.github.com/users/tractorcow/received_events","type":"User","site_admin":false},"open_issues":13,"closed_issues":34,"state":"open","created_at":"2016-09-14T01:20:37Z","updated_at":"2016-10-27T23:35:18Z","due_on":"2016-10-31T00:00:00Z","closed_at":null},"comments":2,"created_at":"2016-05-11T21:07:38Z","updated_at":"2016-10-28T02:04:02Z","closed_at":null,"body":"Likely requires us to choose a React forms library first (some options: https://react.rocks/tag/Form). Could use JSON Schema as part of the form field schema we're generating, as a way to communicate validation constraints from the server to the client. Includes styling through Bootstrap (http://v4-alpha.getbootstrap.com/components/forms/#validation).\r\n\r\nRedux Form has [pluggable validation](http://redux-form.com/5.2.5/#/examples/synchronous-validation?_k=edvj7l). Note that we can get quite far with powerful declarative validation, as the popularity of https://github.com/sheadawson/silverstripe-zenvalidator proves.\r\n\r\nOverview of adding validation to Redux Form: https://medium.com/@rajaraodv/adding-a-robust-form-validation-to-react-redux-apps-616ca240c124#.v8bfb62m7\r\n\r\n**TO DO:** Revisit the size after #5524 is complete.\r\n\r\n## Tasks\r\n\r\n * [ ] Require \"Name\" on File and Folder detail sidebar in AssetAdmin (split out from https://github.com/silverstripe/silverstripe-asset-admin/issues/156)\r\n\r\n# Related\r\n\r\n- Server-side validation: https://github.com/silverstripe/silverstripe-framework/issues/5522\r\n- Implement a React form library: https://github.com/silverstripe/silverstripe-framework/issues/5524"},"comment":{"url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/comments/256818491","html_url":"https://github.com/silverstripe/silverstripe-framework/issues/5523#issuecomment-256818491","issue_url":"https://api.github.com/repos/silverstripe/silverstripe-framework/issues/5523","id":256818491,"user":{"login":"chillu","id":111025,"avatar_url":"https://avatars.githubusercontent.com/u/111025?v=3","gravatar_id":"","url":"https://api.github.com/users/chillu","html_url":"https://github.com/chillu","followers_url":"https://api.github.com/users/chillu/followers","following_url":"https://api.github.com/users/chillu/following{/other_user}","gists_url":"https://api.github.com/users/chillu/gists{/gist_id}","starred_url":"https://api.github.com/users/chillu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chillu/subscriptions","organizations_url":"https://api.github.com/users/chillu/orgs","repos_url":"https://api.github.com/users/chillu/repos","events_url":"https://api.github.com/users/chillu/events{/privacy}","received_events_url":"https://api.github.com/users/chillu/received_events","type":"User","site_admin":false},"created_at":"2016-10-28T02:04:02Z","updated_at":"2016-10-28T02:04:02Z","body":"Oh my - written a long response, then closed the browser window... in short: ApproveJS is *very* young and unknown (300 monthly NPM downloads vs. 1,400,000 on validator.js). It's more constrained in scope, 44kb vs. 266kb source for validator.js. And overall its not a lot of code. So even if the library goes unmaintained in 2018, we could self-maintain it while managing a transition. It also doesn't try to solve client-side value sanitisation like validator.js, which I'd consider scope creep. So I'm fine with ApproveJS :)"}}
{"actor":{"display_login":"chillu"}}