Giter Club home page Giter Club logo

forms-product-doc's Introduction

Overview

This describes a product that lets anonymous users create, send, and submit forms. It focuses on requirements, data models, and business logic. It ignores delivery timelines, pricing, infrastructure, monitoring, e.t.c.

Product Requirements

  1. Users should be able to anonymously create forms that support:

    • Dropdowns
    • File uploads up to 2 megabytes.
    • Text fields
    • Email fields
    • Yes or No radio buttons
  2. Users can create rules on a field that must evaluate to true before it is displayed. This rules are based on the values of other fields(except file uploads).

  3. Users who create forms can have the links to their forms mailed to respondents. They can also copy the link and share it manually.

  4. Anyone with the link to a form should be able to fill and submit it.

  5. Allow creators update forms that are already accessible to respondents. They can:

  • Change form title and/or description
  • Add new form fields
  • remove form fields
  • Add/remove rules for conditional fields
  • Add new options for dropdown fields
  • Change the size allowed for file uploads

Data Models

Form

  • id
  • title
  • description
  • reference (For use in web links)
  • creationDate
  • lastModifiedDate
  • fields: Field[]

Field

  • id:
  • type: Type [TEXT, EMAIL, DROPDOWN, BOOLEAN, FILE]
  • question
  • isRequired: boolean
  • isConditional: boolean
  • conditions: Condition[]

Condition

  • id:
  • operator: Operator [AND, OR]
  • rules: Rule[]

Rule

  • id
  • target: Field
  • expectedValue: string

FormResponse

  • id
  • form: Form
  • submissionDate:
  • fieldResponses: FieldResponse[]

FieldResponse

  • id
  • formResponse: FormResponse
  • field: Field
  • value: string // For files, this is a reference from an object store

Workflows

Create Form

  • Generate a unique reference that is used in the link for accessing the form. Set it as the value of form.reference. This useful to avoid exposing internal ID of the form.

  • When field.isConditional is true

    • Check that field.isRequired is false.
    • Check that field.conditions has at least one element.
    • Check that rule.target.type is never FILE.

Conditional Fields:

  • A Rule represents the value that must be present on another field(the target) before the field containing the rule can be displayed.

  • A Condition has a collection of Rules that are combined by it's Operator(AND or OR) to produce a boolean. A field is only displayed if all it's Conditions evaluates to true.

  • When a Condition has only one rule, then the field is only displayed if the current value of the target field is equal to rule.expectedValue.

For example: A field for Employer Address can have the following condition(s):

[
    {
      "operator": "AND",
      "rules": [
        {"target":"isEmployed", "expectedValue": true}
        {"target": "country", "expectedValue": "Argentina"}
      ]
    },
    {
      "operator": "OR",
      "rules": [
        {"target":"title", "expectedValue": "Software Engineer"}
        {"target": "city", "expectedValue": "Buenos Aires"}
      ]
    }
]

This means the employer address field is only displayed if the following evaluates to true: ((isEmployed = true AND country = Argentina) AND (title = Software Engineer OR city = Buenos Aires)).

Send Form

  • Get form.reference and combine with it base URL of current environment to create a link.
  • This link can be sent in a mail or displayed.

Accept Response

  • Where field.type is FILE, upload the bytes to object storage and set the ID received as fieldResponse.value. Where this upload fails, the form submission is not successful and has to be retried.

  • Where field.isRequired is true, ensure that fieldResponse.value is not empty or null.

Update Form - Add/Update Field

  • Set/Update the value of form.lastModifiedDate
  • Create any new field(s) or field condition(s), and add to form.fields.
  • If an existing field is to be deleted:
    • Find the FormResponse for the form.
    • Remove all FieldResponse where fieldResponse.field.id matches the ID of the field to be deleted.

Possible Improvements

  • Form sections: This would let form creators separate forms into logical sections. Only one section would be displayed on a single page.

  • Responses Dashboard: This would visualize the number and nature of responses to a form. Form creators can see the number answers to questions, form submission times e.t.c.

  • Form Settings: This lets form creators decide how respondents can interact with a form. For example, form creators can set when forms expire.

forms-product-doc's People

Contributors

adeshinao avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.