From cf6782315fe162ed08d6fed02f7eea933ad54cd2 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 11:18:17 -0800 Subject: [PATCH 01/27] refresh released form table --- public/javascripts/forms.js | 48 +++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/public/javascripts/forms.js b/public/javascripts/forms.js index fff1e266..cf88d733 100644 --- a/public/javascripts/forms.js +++ b/public/javascripts/forms.js @@ -145,13 +145,19 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, bDeferRender: true, aoColumns: formAoColumns, - aaSorting: [[11, 'desc'], [10, 'desc']], + aaSorting: [ + [11, 'desc'], + [10, 'desc'], + ], sDom: sDomNoTools, }); fnAddFilterFoot('#form-table', formAoColumns); @@ -187,13 +193,19 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, bDeferRender: true, aoColumns: transferredFormAoColumns, - aaSorting: [[11, 'desc'], [12, 'desc']], + aaSorting: [ + [11, 'desc'], + [12, 'desc'], + ], sDom: sDomNoTools, }); fnAddFilterFoot('#transferred-form-table', transferredFormAoColumns); @@ -226,7 +238,10 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, @@ -251,7 +266,10 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, @@ -275,7 +293,7 @@ $(function() { releasedByColumn, releasedOnColumn, ]; - $('#released-form-table').dataTable({ + var releasedFormTable = $('#released-form-table').dataTable({ sAjaxSource: '/released-forms/json', sAjaxDataProp: '', fnDrawCallback: function() { @@ -286,7 +304,10 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, @@ -321,7 +342,10 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, @@ -354,7 +378,10 @@ $(function() { bAutoWidth: false, bProcessing: true, iDisplayLength: 10, - aLengthMenu: [[10, 50, 100, -1], [10, 50, 100, 'All']], + aLengthMenu: [ + [10, 50, 100, -1], + [10, 50, 100, 'All'], + ], oLanguage: { sLoadingRecords: 'Please wait - loading data from the server ...', }, @@ -492,6 +519,7 @@ $(function() { transferredFormTable.fnReloadAjax(); sharedFormTable.fnReloadAjax(); groupSharedFormTable.fnReloadAjax(); + releasedFormTable.fnReloadAjax(); archivedFormTable.fnReloadAjax(); archivedReleasedFormTable.fnReloadAjax(); }); From e0939a5362a5e0a20b7a56975f6dbe2d6181d490 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 11:21:13 -0800 Subject: [PATCH 02/27] display status text for released form --- routes/form-management.js | 2 ++ views/released-form.jade | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/routes/form-management.js b/routes/form-management.js index 3efaeccb..bc647c72 100644 --- a/routes/form-management.js +++ b/routes/form-management.js @@ -3,6 +3,7 @@ const mongoose = require('mongoose'); const routesUtilities = require('../utilities/routes.js'); const Form = mongoose.model('Form'); const ReleasedForm = mongoose.model('ReleasedForm'); +const { statusMap } = require('../model/released-form'); const reqUtils = require('../lib/req-utils'); const logger = require('../lib/loggers').getLogger(); const config = require('../config/config.js'); @@ -84,6 +85,7 @@ module.exports = function(app) { title: releasedForm.title, formType: releasedForm.formType, status: releasedForm.status, + statusText: statusMap['' + releasedForm.status], ver: releasedForm.ver, base: releasedForm.base, discrepancy: releasedForm.discrepancy, diff --git a/views/released-form.jade b/views/released-form.jade index 56668e87..ceb0317e 100644 --- a/views/released-form.jade +++ b/views/released-form.jade @@ -19,7 +19,7 @@ block content .span9 h3 #{title} h4 type: #{formType} - h4 status: #{status} + h4 status: #{statusText} h4 version:  span#version #{ver} .well-large From 471b935e9b7bb278cb2289082e51fde4f5517296 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 16:32:12 -0800 Subject: [PATCH 03/27] remove old link --- views/docs/hero.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/views/docs/hero.md b/views/docs/hero.md index 5412860b..86fa8fbf 100644 --- a/views/docs/hero.md +++ b/views/docs/hero.md @@ -1,5 +1,3 @@ -# FRIB Traveler v3.0 +# Traveler + ## A Web application to design, carry out and organize processes -
-*You might find the previous version document at [github](http://dongliu.github.io/traveler/) is still helpful before I have all the sections finished in this document.* -
From bc029334ad837dbe968a7e2eb0c8ece1360efee4 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 16:33:09 -0800 Subject: [PATCH 04/27] wrap --- views/docs/api.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/views/docs/api.md b/views/docs/api.md index d1905e47..ee542e2d 100644 --- a/views/docs/api.md +++ b/views/docs/api.md @@ -2,4 +2,8 @@ **Audience: developers** -The traveler application provides a limited API (application programming interface) besides the Web interface. The API is designed in a [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer) style. Currently, other applications can read the information of travelers through the API. +The traveler application provides a limited API (application programming +interface) besides the Web interface. The API is designed in a +[RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer) style. +Currently, other applications can read the information of travelers through the +API. From abab2338996e567f705964022a711e2b4aa247f7 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 16:33:32 -0800 Subject: [PATCH 05/27] update how to par --- views/doc-in-one.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/doc-in-one.jade b/views/doc-in-one.jade index 671af8cd..e67a0581 100644 --- a/views/doc-in-one.jade +++ b/views/doc-in-one.jade @@ -1,7 +1,7 @@ extends layout block head - title #{orgName} Traveler - documentation + title #{orgName} Traveler - user manual meta(name='viewport', content='width=device-width, initial-scale=1.0') link(rel='stylesheet', href='#{prefix}/bootstrap/css/bootstrap.css') link(rel='stylesheet', href='#{prefix}/bootstrap/css/bootstrap-responsive.css') @@ -19,7 +19,7 @@ block content .span9 section#how-to-use h2 How to use this document - p There is an Audience statement on the top of each section. If you are not the target audience, then you can skip the section. + p There is an Audience statement at the top of each section. If you are not the target audience, please feel free to skip that section. section#basics include ./docs/basics.jade section#travelers From 20eb1debe79180fbca5c67dc08a57450db206247 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 1 Mar 2020 16:37:53 -0800 Subject: [PATCH 06/27] update basics --- views/docs/basics.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/views/docs/basics.md b/views/docs/basics.md index 995f715e..1e19c08f 100644 --- a/views/docs/basics.md +++ b/views/docs/basics.md @@ -2,4 +2,9 @@ **Audience: all users** -The traveler application is a Web application for design, carry out, and organize electrical process documents, which we call [travelers](#traveler). It provides a Web interface for edit and manage [forms](#form). Furthermore, users can organize travelers by [binder](#binder). The application provides a limited HTTP [API](#api) to read the traveler information. +The traveler application is a Web application for design, carry out, and +organize electrical process documents, which we call [travelers](#traveler). It +provides a Web interface for edit and manage [forms/templates](#form). +Furthermore, users can organize travelers by [binder](#binder). The application +provides a limited HTTP [API](#api) to read information from the traveler +application. From 83bffc2468332d26d4233d0b5296c870f6c355c6 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Wed, 4 Mar 2020 23:26:21 -0800 Subject: [PATCH 07/27] update home page and doc basics --- public/images/traveler-flow.png | Bin 0 -> 28383 bytes views/doc-in-one.jade | 8 ++++---- views/docs/basics.jade | 4 ++-- views/docs/basics.md | 2 ++ views/docs/contact.md | 3 ++- views/docs/form.md | 10 ++++++++-- views/docs/forms.jade | 2 +- views/docs/hero.md | 2 +- views/main.jade | 6 +++--- 9 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 public/images/traveler-flow.png diff --git a/public/images/traveler-flow.png b/public/images/traveler-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..bdfdc020e4f5787be3fd8379833d752e65212e45 GIT binary patch literal 28383 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 diff --git a/views/docs/contact.md b/views/docs/contact.md index 4992b77f..62e6ef6d 100644 --- a/views/docs/contact.md +++ b/views/docs/contact.md @@ -1,2 +1,3 @@ ## Contact -Please contact Dong Liu () if you have questions and need more supports. + +Please contact Dong Liu (https://github.com/dongliu) if you have questions and need more supports. diff --git a/views/docs/form.md b/views/docs/form.md index 852095cc..74f85c56 100644 --- a/views/docs/form.md +++ b/views/docs/form.md @@ -1,2 +1,8 @@ -### What is a form? -A form is a user-designed template in order to create travelers. We implement it with HTML form elements as the name suggests. A user can create forms, edit them, and make copies. A user can share her/his forms with other users with read or write permission. A user can create a new form based on the form shared with her/him. The traveler application provides a WYSIWYG (what you see is what you get) editor for form design. A form can be archived. An archived form can only accessed by its owner. The [forms section](#forms) describes the details of how to work with forms. +### What is a template? + +A template is a structured document composed of sequenced sections and inputs. +Travelers need to be initialized from template. The inputs in a template are +standard HTML form elements. A user can create and update a template in a a +WYSIWYG (what you see is what you get) editor. Each template has a life cycle, +and can be managed by users with special roles. The [templates section](#forms) +describes the details of how to work with templates. diff --git a/views/docs/forms.jade b/views/docs/forms.jade index e7c10874..78c501ce 100644 --- a/views/docs/forms.jade +++ b/views/docs/forms.jade @@ -1,5 +1,5 @@ article - h2 Forms doc to be added later. + h2 Design with templates //- header //- include:marked forms.md //- section#builder diff --git a/views/docs/hero.md b/views/docs/hero.md index 86fa8fbf..ea960c3c 100644 --- a/views/docs/hero.md +++ b/views/docs/hero.md @@ -1,3 +1,3 @@ # Traveler -## A Web application to design, carry out and organize processes +## A Web application to design, perform and organize workflows and data collections diff --git a/views/main.jade b/views/main.jade index 029d069d..6a839397 100644 --- a/views/main.jade +++ b/views/main.jade @@ -24,17 +24,17 @@ block content h1 a(href='#{prefix}/forms/', target='#{viewConfig.linkTarget}') i.fa.fa-list-ol.fa-4x - h2 Design forms + h2 Design .span4 h1 a(href='#{prefix}/travelers/', target='#{viewConfig.linkTarget}') i.fa.fa-check-square-o.fa-4x - h2 Carry out + h2 Perform .span4 h1 a(href='#{prefix}/binders/', target='#{viewConfig.linkTarget}') i.fa.fa-briefcase.fa-4x - h2 Organize works + h2 Organize //var shareUsers = !{viewConfig.shareUsers}; var shareGroups = !{viewConfig.shareGroups}; if (! (!viewConfig.shareUsers && !viewConfig.shareGroups && !viewConfig.transferOwnership)) From 9bba35c78a84cb24b92f145fc1210951f6d73f6e Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sat, 28 Mar 2020 17:56:28 -0700 Subject: [PATCH 08/27] update form and traveler basics --- views/docs/form.md | 10 +++++++++- views/docs/traveler.md | 28 +++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/views/docs/form.md b/views/docs/form.md index 74f85c56..41577e87 100644 --- a/views/docs/form.md +++ b/views/docs/form.md @@ -2,7 +2,15 @@ A template is a structured document composed of sequenced sections and inputs. Travelers need to be initialized from template. The inputs in a template are -standard HTML form elements. A user can create and update a template in a a +standard HTML form elements. A user can create and update a template in a WYSIWYG (what you see is what you get) editor. Each template has a life cycle, and can be managed by users with special roles. The [templates section](#forms) describes the details of how to work with templates. + +There are two types of templates --- normal templates and discrepancy templates. +A normal template defines a sequence of actions and data points to collect. A +discrepancy is for special QA tasks. The biggest difference between a normal +template and a discrepancy template is that a traveler must be created from a +released normal template. In order to use a discrepancy template, the user needs +to create a released template that contains **one** normal template and **one** +discrepancy template. diff --git a/views/docs/traveler.md b/views/docs/traveler.md index 960ebacc..26d0c148 100644 --- a/views/docs/traveler.md +++ b/views/docs/traveler.md @@ -1,10 +1,28 @@ ### What is a traveler? -A traveler is an electrical document that is designed to support the execution of a predefined process and to collect user input data and notes in the process. A typical traveler user case is to implement a work instruction that specifies all the steps to accomplish a work. -A traveler has properties like title, description, deadline, locations, and tags. The user can add/remove a tag into the tag list. The tag can be a device name defined in CCDB or any string. A traveler is **initialized** when it is created. Its state can be changed to **active**, **submitted for completion**, **completed**, and **frozen**. A traveler can be archived. Only the traveler owner can access the traveler when it is archived. A traveler owner can [share](#ownership) her/his traveler with other users/groups. A user can also [transfer](#ownership) the ownership of a traveler to other user. +A traveler is an electrical document that is designed to support the execution +of a predefined process and to collect user input data and notes in the process. +A typical traveler user case is to implement a work instruction that specifies +all the steps to accomplish a work. It also supports collections of discrepancy +data during QA processes. -The process and inside user inputs are defined in a [form](#form). The users with written permission can input values into an active traveler. The input history is kept in the traveler, and shown under each input. Each input can also have user notes attached to it. A traveler can be considered as the composition of a form, the input data, and the notes: +A traveler has properties like title, description, deadline, locations, and +tags. The user can add/remove a tag into the tag list. The user can also +associate a traveler to a list of devices. A traveler is **initialized** from a +**released** template. Its state can be changed to **active**, **submitted for +completion**, **completed**, and **frozen**. A traveler can be **archived**. +Only the traveler owner can access the traveler when it is archived. A traveler +owner can [share](#ownership) her/his traveler with other users/groups. A user +can also [transfer](#ownership) the ownership of a traveler to other user. -**traveler = form + data + notes** +The process and inside user inputs are defined in a [template](#form). The users +with written permission can input values into an **active** traveler. The input +**history** is kept with the traveler. Each input can also have user notes +attached to it. Optionally, a traveler can contain the history of discrepancies. A traveler +can be considered as the composition of a released form, the input data, and the +notes: -The [travelers section](#travelers) provides more detailed information about how to use and manage travelers. +**traveler = template + data + notes [+ discrepancies]** + +The [travelers section](#travelers) provides more detailed information about how +to use and manage travelers. From 3b3abe86bff8ab6adfffc90b3761cb4d8d2e6713 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sat, 28 Mar 2020 17:59:37 -0700 Subject: [PATCH 09/27] update binder details --- views/docs/binder.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/views/docs/binder.md b/views/docs/binder.md index 44d0d511..39a50c85 100644 --- a/views/docs/binder.md +++ b/views/docs/binder.md @@ -1,4 +1,14 @@ ### What is a binder? -A binder is a collection of travelers that a user put together to manage or present them together. For example, an engineer can put all the travelers related to a specific device into one binder. A workshop manager can put all the traveler involving the workshop into one binder. A traveler can be put into different binders. -When a traveler is added into a binder, it has properties like sequence, priority, value, and color. The sequence and priority help to sort the travelers. The value can be used to estimate the binder's progress. The color defines a flag for attention. It is possible to add a binder into another binder. This is useful for higher management to oversee the progress of sub teams. For more details, see the [binders section](#binders). +A binder is a collection of travelers that a user put together for easier and +better management and presentations. For example, an engineer can put all the +travelers related to a specific device into one binder. A workshop manager can +put all the traveler involving the workshop into one binder. A traveler can be +put into different binders. + +When a traveler is added into a binder, it has properties like sequence, +priority, value, and color. The sequence and priority help to sort the +travelers. The value can be used to estimate the binder's progress. The color +defines a flag for attention. It is possible to add a binder into another +binder. This is useful for higher management to oversee the progress of sub +teams. For more details, see the [binders section](#binders). From c41970c584a751832991cf5ebd70111777b688d6 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sat, 28 Mar 2020 18:01:24 -0700 Subject: [PATCH 10/27] update login page --- views/docs/log.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/views/docs/log.md b/views/docs/log.md index 45c2bd45..5e9f58aa 100644 --- a/views/docs/log.md +++ b/views/docs/log.md @@ -1,2 +1,9 @@ ### Log in and out -Besides this document and the main page, all other resources are only accessible to authenticated users. Users can use their lab computer user name and password to log in. Users are encouraged to log out when they do not work with the application. If not log out, a user's session will expire after a period. When a user tries to access a resource URL on a browser with no live session, the user will be directed to the log in page, and be redirected back to the requested URL if login succeeds. + +Besides this document and the main page, all other resources are only accessible +to **authenticated** users. Users can use their lab computer user name and +password to log in. Users are encouraged to log out when they do not work with +the application. If not log out, a user's session will expire after a period. +When a user tries to access a resource URL on a browser with no live session, +the user will be directed to the log in page, and be redirected back to the +requested URL if login succeeds. From 7b029acfc08237f033c90632d0342f99998981a2 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 11:31:49 -0700 Subject: [PATCH 11/27] ignore vscode --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f5fbaa18..ad3e7549 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ node_modules/ *.sublime-workspace *.idea +# vscode +.vscode + # system related # .DS_Store From b9b386fc61c8364111b4b72e08123a10c2988917 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 11:32:18 -0700 Subject: [PATCH 12/27] update ownership --- views/doc-in-one.jade | 2 +- views/docs/ownership.md | 44 +++++++++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/views/doc-in-one.jade b/views/doc-in-one.jade index b7e672ee..364dece6 100644 --- a/views/doc-in-one.jade +++ b/views/doc-in-one.jade @@ -40,7 +40,7 @@ block content li a(href='#basics') Basics li - a(href='#forms') Forms + a(href='#forms') Templates li a(href='#travelers') Travelers li diff --git a/views/docs/ownership.md b/views/docs/ownership.md index a3fddb50..7bb84548 100644 --- a/views/docs/ownership.md +++ b/views/docs/ownership.md @@ -1,12 +1,44 @@ ### Ownership and access control -The traveler application has three types of important entities: forms, travelers, and binders. Every such an entity has a owner. The owner is the user who creates the entity at the beginning. The ownership can be transferred to a different user by current owner. The owner has full privileges of an entity. The owner of an entity is responsible to **design**, **develop**, and **deliver** it. -There are three levels of access control for an entity that its owner can configure. The first level is **public access**. An entity can be no access, readable, or writable to any authenticated user. It an entity is publicly readable, then any authenticated user will be able to view the entity's details. +The access control in the traveler application is both **role based** and also +**attribute based**. With role based access control, some functionalities can be +performed only by user with specific **roles**. E.g. only administrators can +modify user roles. Only managers or administrations can release a form. With +attribute based access control, a traveler entity can be configured to be +readable or writable by various users or user groups. -The second level of access control is via **shared groups**. The owner can add an AD (active directory) group into the shared group list with read or write permission. If an entity is configured to the readable by a group named *a.b.c* then all the members of the group will be able to view it when log in. The shared entity will also appear in the *group shared entity* tab of the group members. +The traveler application has three types of important entities: templates, +travelers, and binders. Each entity has a owner. The **owner** is the user who +creates the entity at the beginning. The ownership can be transferred to a +different user by current owner. The owner has full privileges of an entity. The +owner of an entity is responsible to **design**, **develop**, and **deliver** +the entity. The owner, by default, has the privilege to configure important +properties of the entity including, most importantly, the access control. -The third level of access control is via **shared users**. The owner can add an AD user into the shared user list with read or write permission. The shared entity will also appear in the *shared entity* tab of the user. +There are three levels of access control for an entity that its owner can +configure. The first level is **public access**. An entity can be inaccessible, +readable, or writable to any **authenticated** user. It an entity is publicly +readable, then any authenticated user will be able to view the entity's details. +The default value of public access for a new entity in the traveler application +is configurable. -Whether a user can read or write an entity is decided by the combination of the three levels of rules. The strong permissions override the weak ones. For example, an entity is readable by a group named *a.b.c*, and writable by a group named *a.b.c.d*, then a member of group *a.b.c.d* will have the write permission. +The second level of access control is via **shared users**. The owner can add a +user into the shared user list with read or write permission. The shared entity +will also appear in the _shared entity_ tab of the user. -In practice, you can share an entity with write permission to a few individual uses, and share it with a group with read permission. Or you can share an entity with read permission with a big group like *a.b.c*, and at the same time share it with write permission with a small group like *a.b.c.d*. +The third level of access control is via **shared groups**. The owner can add a +group into the shared group list with read or write permission. If an entity is +configured to the readable by a group named _a.b.c_ then all the members of the +group will be able to view it when log in. The shared entity will also appear in +the _group shared entity_ tab of the group members. + +Whether a user can read or write an entity is decided by the combination of the +three levels of rules. The strong permissions override the weak ones. For +example, an entity is readable by a group named _a.b.c_, and writable by a group +named _a.b.c.d_, then a member of group _a.b.c.d_ will have both read and write +permission. A member of group _a.b.c.e_ will have only read permission. + +In practice, the owner can share an entity with write permission to a few +individual uses, and share it with a group with read permission. Or you can +share an entity with read permission with a big group like _a.b.c_, and at the +same time share it with write permission with a small group like _a.b.c.d_. From 40db443af9a5212a3548277f55585e794be0a15d Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 12:15:45 -0700 Subject: [PATCH 13/27] update tab --- views/docs/tab.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/views/docs/tab.md b/views/docs/tab.md index c8a1002c..e2fed68b 100644 --- a/views/docs/tab.md +++ b/views/docs/tab.md @@ -1,16 +1,23 @@ -### Tabs and tables -The forms, travelers, and binders pages use tabs for different list of entities. In each tab, the entities are listed in a table. There are two places that a button can be placed on a tabbed page. If a button is located on top of the tabs, the button's action is applicable to all the tabs and tables inside the tabs. If a button is location **inside** a tab, then the button's action only is applicable to that tab and table. +### Tabs and tables -A typical table has 6 areas each of which either hold a tool or display information. +The forms, travelers, and binders pages use tabs for different list of entities. +In each tab, the entities are listed in a table. There are two places that a +button can be placed on a tabbed page. If a button is located on top of the +tabs, the button's action is applicable to all the tabs and tables inside the +tabs. If a button is location **inside** a tab, then the button's action only is +applicable to that tab and table. -|area | location | content| -|---------| --------|-------- | -|1 | top left | a select input to change the number of records shown per table page | -|2 | top middle | show a message when the data inside the table is in processing | -|3 | top right | a text input to filter all the columns in the table | -|4 | bottom row | text inputs to filter the corresponding table column | -|5 | bottom left | the numbers of entries out of the total number shown in the view | -|6 | bottom right | pagination controls | +A typical table has 6 areas each of which either hold a tool or display +information. + +| area | location | content | +| ---- | ------------ | ------------------------------------------------------------------- | +| 1 | top left | a select input to change the number of records shown per table page | +| 2 | top middle | show a message when the data inside the table is in processing | +| 3 | top right | a text input to filter all the columns in the table | +| 4 | bottom row | text inputs to filter the corresponding table column | +| 5 | bottom left | the numbers of entries out of the total number shown in the view | +| 6 | bottom right | pagination controls |
the areas of a data table From 6372e10114453927484edc9013d5303eefc35e10 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 12:29:06 -0700 Subject: [PATCH 14/27] update color --- views/docs/color.md | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/views/docs/color.md b/views/docs/color.md index d708b665..ed574300 100644 --- a/views/docs/color.md +++ b/views/docs/color.md @@ -1,22 +1,33 @@ -### Colors and graphical design -The Web presentation layer of the traveler application is developed on [Bootstrap](http://getbootstrap.com/). Therefore, the application uses a similar color convention as Bootstrap in the interface design. The buttons are colored according to the possible impact of the actions. +### Colors and graphical design -the colors of buttons +The Web presentation layer of the traveler application is developed on +[Bootstrap](http://getbootstrap.com/). Therefore, the application uses a similar +color convention as Bootstrap in the interface design. The buttons are colored +according to the possible impact of the actions. -Each traveler or binder has an estimated progress. The progress is visualized by a bar. The bar color and corresponding entity status is listed in the following table. +
+
+
+
+
-| progress bar | status | -|---------| --------|-------- | -|
0 / 7
| initial | -|
2 / 7
| active | -|
| completion | -|
6 / 7
| submitted for completion or frozen | +Each traveler or binder has an estimated progress. The progress is visualized by +a bar. The bar color and corresponding entity status is listed in the following +table. + +| progress bar | status | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | +|
0 / 7
| initial | +|
2 / 7
| active | +|
| completion | +|
6 / 7
| submitted for completion or frozen |
-Some progress bars have values on it. The formats of the value notations are listed in the following table. -| entity type | progress bar | values | -|---------| --------|-------- | -| traveler |
2 / 7
| updated input number / total input number | -| binder or entity in a binder |
0 + 3 / 10
| finished value + in-progress value / total value | +Some progress bars have values on it. The formats of the value notations are +listed in the following table. +| entity type | progress bar | values | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------ | +| traveler |
2 / 7
| updated input number / total input number | +| binder or entity in a binder |
0 + 3 / 10
| finished value + in-progress value / total value | From f595bdf0635d752a9b167554c2d9a6c0a4c116e3 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 15:19:15 -0700 Subject: [PATCH 15/27] restructur and start template --- views/docs/basics.jade | 20 ++++++++++---------- views/docs/{ => basics}/binder.md | 0 views/docs/{ => basics}/color.md | 0 views/docs/{basics.md => basics/header.md} | 0 views/docs/{log.md => basics/login.md} | 0 views/docs/{ => basics}/ownership.md | 0 views/docs/{ => basics}/tab.md | 0 views/docs/{form.md => basics/template.md} | 0 views/docs/{ => basics}/traveler.md | 0 views/docs/forms.jade | 20 ++++++++++++++++---- views/docs/template/archive.md | 1 + views/docs/template/header.md | 0 12 files changed, 27 insertions(+), 14 deletions(-) rename views/docs/{ => basics}/binder.md (100%) rename views/docs/{ => basics}/color.md (100%) rename views/docs/{basics.md => basics/header.md} (100%) rename views/docs/{log.md => basics/login.md} (100%) rename views/docs/{ => basics}/ownership.md (100%) rename views/docs/{ => basics}/tab.md (100%) rename views/docs/{form.md => basics/template.md} (100%) rename views/docs/{ => basics}/traveler.md (100%) create mode 100644 views/docs/template/archive.md create mode 100644 views/docs/template/header.md diff --git a/views/docs/basics.jade b/views/docs/basics.jade index c9b4b0e9..230d34f4 100644 --- a/views/docs/basics.jade +++ b/views/docs/basics.jade @@ -1,17 +1,17 @@ article header - include:marked basics.md - section#form - include:marked form.md + include:marked basics/header.md + section#template + include:marked basics/template.md section#traveler - include:marked traveler.md + include:marked basics/traveler.md section#binder - include:marked binder.md - section#log - include:marked log.md + include:marked basics/binder.md + section#login + include:marked basics/login.md section#ownership - include:marked ownership.md + include:marked basics/ownership.md section#tab - include:marked tab.md + include:marked basics/tab.md section#color - include:marked color.md + include:marked basics/color.md diff --git a/views/docs/binder.md b/views/docs/basics/binder.md similarity index 100% rename from views/docs/binder.md rename to views/docs/basics/binder.md diff --git a/views/docs/color.md b/views/docs/basics/color.md similarity index 100% rename from views/docs/color.md rename to views/docs/basics/color.md diff --git a/views/docs/basics.md b/views/docs/basics/header.md similarity index 100% rename from views/docs/basics.md rename to views/docs/basics/header.md diff --git a/views/docs/log.md b/views/docs/basics/login.md similarity index 100% rename from views/docs/log.md rename to views/docs/basics/login.md diff --git a/views/docs/ownership.md b/views/docs/basics/ownership.md similarity index 100% rename from views/docs/ownership.md rename to views/docs/basics/ownership.md diff --git a/views/docs/tab.md b/views/docs/basics/tab.md similarity index 100% rename from views/docs/tab.md rename to views/docs/basics/tab.md diff --git a/views/docs/form.md b/views/docs/basics/template.md similarity index 100% rename from views/docs/form.md rename to views/docs/basics/template.md diff --git a/views/docs/traveler.md b/views/docs/basics/traveler.md similarity index 100% rename from views/docs/traveler.md rename to views/docs/basics/traveler.md diff --git a/views/docs/forms.jade b/views/docs/forms.jade index 78c501ce..23e30802 100644 --- a/views/docs/forms.jade +++ b/views/docs/forms.jade @@ -1,7 +1,19 @@ article h2 Design with templates - //- header - //- include:marked forms.md - //- section#builder - //- include:marked builder.md + header + include:marked template/header.md + section#normal + //- include:marked normal-template.md + section#discrepancy + //- include:marked discrepancy-template.md + section#template-life + //- include:marked template-lifecycle.md + section#builder + //- include:marked template-builder.md + section#clone + //- include:marked template-clone.md + section#release + //- include:marked template-release.md + section#archive + include:marked template/archive.md diff --git a/views/docs/template/archive.md b/views/docs/template/archive.md new file mode 100644 index 00000000..facb0fca --- /dev/null +++ b/views/docs/template/archive.md @@ -0,0 +1 @@ +#### Archive a template diff --git a/views/docs/template/header.md b/views/docs/template/header.md new file mode 100644 index 00000000..e69de29b From 7364b8fa48a7f988d0b1112a0aebca17021ca8b7 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 17:26:25 -0700 Subject: [PATCH 16/27] restructure traveler --- views/docs/traveler-status.md | 30 ------------------- .../config.md} | 9 ++---- .../docs/{travelers.md => traveler/header.md} | 2 +- .../manage-forms.md} | 4 +++ views/docs/traveler/status.md | 30 +++++++++++++++++++ .../update-status.md} | 16 ++++------ .../update.md} | 11 ++++--- .../{view-traveler.md => traveler/view.md} | 19 ++++++------ views/docs/travelers.jade | 20 ++++++------- 9 files changed, 67 insertions(+), 74 deletions(-) delete mode 100644 views/docs/traveler-status.md rename views/docs/{config-traveler.md => traveler/config.md} (91%) rename views/docs/{travelers.md => traveler/header.md} (98%) rename views/docs/{manage-traveler-forms.md => traveler/manage-forms.md} (99%) create mode 100644 views/docs/traveler/status.md rename views/docs/{update-traveler-status.md => traveler/update-status.md} (92%) rename views/docs/{update-traveler.md => traveler/update.md} (94%) rename views/docs/{view-traveler.md => traveler/view.md} (87%) diff --git a/views/docs/traveler-status.md b/views/docs/traveler-status.md deleted file mode 100644 index ba2372b6..00000000 --- a/views/docs/traveler-status.md +++ /dev/null @@ -1,30 +0,0 @@ -### Traveler status - -**Audience: traveler owners and others with write permission** - -During the life cycle of a traveler, it can be in different statuses. The status decides the user's access of traveler artifacts. The transitions between different statuses, and allowed access are shown in the following diagram, where **r** for read and **w** for write. -the statues of a traveler - -The details of the status, artifact, and corresponding allowed access for users with write permission including the owner are listed in the following table. - -| status | artifact | allowed access | -|---------| --------|---------| -| new | data | no data available -| new | notes | read and write -| active | data | read and write -| active | notes | read and write -| frozen, submitted for completion, or complete | data | read only -| frozen, submitted for completion, or complete | notes | read and write -| archived | data | read only -| archived | notes | read only - -
-The details of the allowed actions to trigger status changes and user types are listed in the following table. - -| user type | allowed actions | -|---------| --------| -| users with read permission | no action -| users with write permission | submit -| owner | all actions - -
diff --git a/views/docs/config-traveler.md b/views/docs/traveler/config.md similarity index 91% rename from views/docs/config-traveler.md rename to views/docs/traveler/config.md index f46db438..a7e2bbdf 100644 --- a/views/docs/config-traveler.md +++ b/views/docs/traveler/config.md @@ -1,8 +1,9 @@ -### Configure a traveler +### Configure a traveler **Audience: traveler owner** The traveler owner is responsible to configure a traveler. The configuration options include + - traveler title - traveler description - deadline @@ -10,8 +11,4 @@ The traveler owner is responsible to configure a traveler. The configuration opt - forms - status -Click the icon in order to navigate to the traveler configuration page. The configuration page's URL is like `/travelers/longstringid/config`. In the configuration page, click on the button to update the traveler title or description. The deadline is a date picker. Click the button to add a tag. If the traveler has a list of tags, click the button after a tag to remove it from the list. - - - - +Click the icon in order to navigate to the traveler configuration page. The configuration page's URL is like `/travelers/longstringid/config`. In the configuration page, click on the button to update the traveler title or description. The deadline is a date picker. Click the button to add a tag. If the traveler has a list of tags, click the button after a tag to remove it from the list. diff --git a/views/docs/travelers.md b/views/docs/traveler/header.md similarity index 98% rename from views/docs/travelers.md rename to views/docs/traveler/header.md index 029a9ac3..6b8b5f76 100644 --- a/views/docs/travelers.md +++ b/views/docs/traveler/header.md @@ -4,4 +4,4 @@ The start page for working with travelers is [/travelers/](/travelers/). There are five tabs on the page: [My travelers](/travelers/#travelers), [Transfered travelers](/travelers/#transferredtravelers), [Shared travelers](/travelers/#sharedtravelers), [Group shared travelers](/travelers/#groupsharedtravelers), and [Archived travelers](/travelers/#archivedtravelers). The [My travelers](/travelers/#travelers) tab contains a table of the travelers **created** by you. The [Transfered travelers](/travelers/#transferredtravelers) tab contains a table of the travelers **transferred** to you by other users. The [Shared travelers](/travelers/#sharedtravelers) tab contains a table of the travelers **shared** with you by other users. The [Group shared travelers](/travelers/#groupsharedtravelers) tab contains a table of the travelers **shared** with **your groups** by other users. The [Archived travelers](/travelers/#archivedtravelers) tab contains a table of the travelers **archived** by you. You are the **owner** of all the travelers in [My travelers](/travelers/#travelers) tab, [Transfered travelers](/travelers/#transferredtravelers) tab, and [Archived travelers](/travelers/#archivedtravelers) tab. The owner is responsible to [configure](#config-traveler), [share](#share-traveler), [active the traveler and approve the completion](#traveler-status) of a traveler. -A traveler can be located by its URL. The URL is like `/travelers/longstringid/` where the `longstringid` is the traveler's unique identity. You can bookmark the traveler's URL or send it in your messages to other users. A user needs to have at least read permission to view a traveler. See the [sharing traveler](#share-traveler) section for details. +A traveler can be located by its URL. The URL is like `/travelers/longstringid/` where the `longstringid` is the traveler's unique identity. You can bookmark the traveler's URL or send it in your messages to other users. A user needs to have at least read permission to view a traveler. See the [sharing traveler](#share-traveler) section for details. diff --git a/views/docs/manage-traveler-forms.md b/views/docs/traveler/manage-forms.md similarity index 99% rename from views/docs/manage-traveler-forms.md rename to views/docs/traveler/manage-forms.md index 093898e8..23c6832c 100644 --- a/views/docs/manage-traveler-forms.md +++ b/views/docs/traveler/manage-forms.md @@ -11,17 +11,21 @@ Click the Manage forms button to go t The available forms table contains the same set of forms as in the "My forms" tab on the main page of the traveler application. A form will be selected and highlighted when you click the icon, and the preview on the right side of the page will be refreshed. A icon in the "Reference" column links to the form that was originally based on. You might want to use an updated version of that form to update the traveler. Note that a traveler contains only the snapshot copy of the form when it is used. #### Use an available form + First locate the form that you want to use in the available forms table. You can filter the table by the title of the forms. Then you need to click the icon of the wanted form, the right side traveler preview will be updated, and the form row is highlighted. Click the and confirm, and the form will be added to be traveler and become active. The new form will appear in the active form table, and the previously active form will appear in the used forms table. The change will be seem by all users. #### Switch back to a used form + Sometimes, you might find one of the previously used forms is better than the current active one. You can easily switch by choosing the one you like in the "Used forms" table, and click the button. After switching, the active form and used forms table will be adjusted accordingly. The traveler update will be seen when it is loaded or refreshed. #### Set the alias of a form + Every form that has been used by the traveler has an alias. When a form was first used by the traveler, the alias is the same as the form's title. You can update it by selecting it and click the button. The alias can help to distinguish forms. #### The impact on the estimated traveler progress + The traveler progress is estimated by (number of finished inputs / total number of inputs). When the traveler form is changed, the total number of inputs will also be updated. However, the traveler updates the number of finished inputs only when the traveler is loaded with the collected data after the change. It is recommended that you load the traveler in a new browser window right after the form change in order to verify the change and also update the progress estimation. diff --git a/views/docs/traveler/status.md b/views/docs/traveler/status.md new file mode 100644 index 00000000..449fa902 --- /dev/null +++ b/views/docs/traveler/status.md @@ -0,0 +1,30 @@ +### Traveler status + +**Audience: traveler owners and others with write permission** + +During the life cycle of a traveler, it can be in different statuses. The status decides the user's access of traveler artifacts. The transitions between different statuses, and allowed access are shown in the following diagram, where **r** for read and **w** for write. +the statues of a traveler + +The details of the status, artifact, and corresponding allowed access for users with write permission including the owner are listed in the following table. + +| status | artifact | allowed access | +| --------------------------------------------- | -------- | ----------------- | +| new | data | no data available | +| new | notes | read and write | +| active | data | read and write | +| active | notes | read and write | +| frozen, submitted for completion, or complete | data | read only | +| frozen, submitted for completion, or complete | notes | read and write | +| archived | data | read only | +| archived | notes | read only | + +
+The details of the allowed actions to trigger status changes and user types are listed in the following table. + +| user type | allowed actions | +| --------------------------- | --------------- | +| users with read permission | no action | +| users with write permission | submit | +| owner | all actions | + +
diff --git a/views/docs/update-traveler-status.md b/views/docs/traveler/update-status.md similarity index 92% rename from views/docs/update-traveler-status.md rename to views/docs/traveler/update-status.md index 2b7f5bcc..6b7b499a 100644 --- a/views/docs/update-traveler-status.md +++ b/views/docs/traveler/update-status.md @@ -1,17 +1,11 @@ -### Update a traveler's status +### Update a traveler's status **Audience: traveler owner and other users with write permission** -The traveler owner is responsible to update the status of her/his travelers. The possible statuses and changes of status of a traveler is described in the [traveler status](#traveler-status) section. A user with write permission can change the status of a traveler from **active** to **submitted for completion** by click the button in the traveler page. The owner can change the status of a traveler in either the traveler page or the traveler configuration page. The possible status change actions are displayed on those pages according to the current traveler status. - -The traveler owner should change the status of a traveler to **active** by clicking on the button when the traveler is ready to accept data. - -The traveler owner should change the status of a traveler to **complete** by clicking on the button when the traveler is submitted for completion, and the work represented by the traveler is complete. On the contrary, click on the button if the work is not complete. - -The traveler owner should change the status of a traveler to **frozen** by clicking on the button when the traveler is required to stop accepting data because of an unsolved obstacle. When the obstacle is resolved, click the button to resume work. - - - +The traveler owner is responsible to update the status of her/his travelers. The possible statuses and changes of status of a traveler is described in the [traveler status](#traveler-status) section. A user with write permission can change the status of a traveler from **active** to **submitted for completion** by click the button in the traveler page. The owner can change the status of a traveler in either the traveler page or the traveler configuration page. The possible status change actions are displayed on those pages according to the current traveler status. +The traveler owner should change the status of a traveler to **active** by clicking on the button when the traveler is ready to accept data. +The traveler owner should change the status of a traveler to **complete** by clicking on the button when the traveler is submitted for completion, and the work represented by the traveler is complete. On the contrary, click on the button if the work is not complete. +The traveler owner should change the status of a traveler to **frozen** by clicking on the button when the traveler is required to stop accepting data because of an unsolved obstacle. When the obstacle is resolved, click the button to resume work. diff --git a/views/docs/update-traveler.md b/views/docs/traveler/update.md similarity index 94% rename from views/docs/update-traveler.md rename to views/docs/traveler/update.md index 1796b836..fca5035d 100644 --- a/views/docs/update-traveler.md +++ b/views/docs/traveler/update.md @@ -1,17 +1,16 @@ -### Update the data and notes in a traveler +### Update the data and notes in a traveler **Audience: traveler users with write permission** -To update traveler data and notes might be the most important feature of the traveler application. It is also the most popular feature used by the users. In order to be able to update the data and notes of a traveler, you have to have the write permission of the traveler, which means you are the owner of the traveler, or the owner shared with you or your group with write permission. +To update traveler data and notes might be the most important feature of the traveler application. It is also the most popular feature used by the users. In order to be able to update the data and notes of a traveler, you have to have the write permission of the traveler, which means you are the owner of the traveler, or the owner shared with you or your group with write permission. A traveler's data can be updated only when it is in the [active status](#traveler-status). When the traveler is in other statuses, you will see all the inputs are disabled when you load the `/travelers/longstringid/` page. Note that `/travelers/longstringid/view` is dedicated for view only access, so that you cannot update data or notes on that page even if you have write permission. -In order to update the value of an input element, a user need to click on the input, and type the new value. When the new value is different from the old value, two buttons will appear on the right side of the input element. Click the button to submit the change to the traveler server. Or click the button to reset to the old value. Before you click either button, the rest of the traveler is disabled. That means you cannot make other change before submitting the current change or resetting it. If the change is saved on the server, there will be a +In order to update the value of an input element, a user need to click on the input, and type the new value. When the new value is different from the old value, two buttons will appear on the right side of the input element. Click the button to submit the change to the traveler server. Or click the button to reset to the old value. Before you click either button, the rest of the traveler is disabled. That means you cannot make other change before submitting the current change or resetting it. If the change is saved on the server, there will be a +
Success
message on the top of the page. If something is wrong, then an
Error
message will appear. -In order to add a new note, click the icon. Click the n icon to show/hide the notes. - - +In order to add a new note, click the icon. Click the n icon to show/hide the notes. diff --git a/views/docs/view-traveler.md b/views/docs/traveler/view.md similarity index 87% rename from views/docs/view-traveler.md rename to views/docs/traveler/view.md index 356a1195..5baba4e0 100644 --- a/views/docs/view-traveler.md +++ b/views/docs/traveler/view.md @@ -1,20 +1,19 @@ -### View a traveler +### View a traveler **Audience: traveler users** -If you know the traveler's URL, you can directly load the traveler in browser. A traveler's URL is like `/travelers/longstringid/`. If you have only read permission of the traveler, the browser will redirect to `/travelers/longstringid/view` automatically. +If you know the traveler's URL, you can directly load the traveler in browser. A traveler's URL is like `/travelers/longstringid/`. If you have only read permission of the traveler, the browser will redirect to `/travelers/longstringid/view` automatically. -You can also locate the traveler in your tabs, and then click on the icon to go to the traveler page. +You can also locate the traveler in your tabs, and then click on the icon to go to the traveler page. -In a traveler page, the top line is the traveler's title. Below the title is the traveler status, and progress. The progress tells the number of inputs updated out of the total inputs. The numbers represent only rough progress **estimation** of the traveler. A traveler can be complete when some inputs have not be updated. +In a traveler page, the top line is the traveler's title. Below the title is the traveler status, and progress. The progress tells the number of inputs updated out of the total inputs. The numbers represent only rough progress **estimation** of the traveler. A traveler can be complete when some inputs have not be updated. -The button shows/hides some detailed information of the traveler including the description, creation user/time and last update user/time. The details information is hidden by default. +The button shows/hides some detailed information of the traveler including the description, creation user/time and last update user/time. The details information is hidden by default. -The buttons show/hide the validation information for the traveler inputs. The validation information include a summary section shown under the buttons, and a validation message under each input. The [validation rules](#builder) are defined in the form that is used as the active form. +The buttons show/hide the validation information for the traveler inputs. The validation information include a summary section shown under the buttons, and a validation message under each input. The [validation rules](#builder) are defined in the form that is used as the active form. -The buttons show/hide the notes under each input. The n icon shows the number of notes. +The buttons show/hide the notes under each input. The n icon shows the number of notes. -The value displayed in an input is the latest value submitted to the server. The history of the input value changes is shown including the submitted value, submitter id and submission time. - -When a traveler is composed of several sections, you will see a side navigation menu on the right side. The side navigation is affixed, so that you can use it to jump to any section when you want. The section corresponding to the content in the view is automatically highlighted in the navigation menu. +The value displayed in an input is the latest value submitted to the server. The history of the input value changes is shown including the submitted value, submitter id and submission time. +When a traveler is composed of several sections, you will see a side navigation menu on the right side. The side navigation is affixed, so that you can use it to jump to any section when you want. The section corresponding to the content in the view is automatically highlighted in the navigation menu. diff --git a/views/docs/travelers.jade b/views/docs/travelers.jade index d9b8d220..40edc5d8 100644 --- a/views/docs/travelers.jade +++ b/views/docs/travelers.jade @@ -1,15 +1,15 @@ article header - include:marked travelers.md + include:marked traveler/header.md section#traveler-status - include:marked traveler-status.md - section#view-traveler - include:marked view-traveler.md - section#update-traveler - include:marked update-traveler.md - section#config-traveler - include:marked config-traveler.md - include:marked manage-traveler-forms.md - include:marked update-traveler-status.md + include:marked traveler/status.md + section#traveler-view + include:marked traveler/view.md + section#traveler-update + include:marked traveler/update.md + section#traveler-config + include:marked traveler/config.md + include:marked traveler/manage-forms.md + include:marked traveler/update-status.md section#share-traveler From 2c162779510b8a7716f72d19ecb26a7b77ca738a Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 17:42:08 -0700 Subject: [PATCH 17/27] restructure api --- views/docs/api.jade | 12 ++++++------ views/docs/{api-auth.md => api/auth.md} | 1 + views/docs/{api-data.md => api/data.md} | 7 +++++-- views/docs/{api.md => api/header.md} | 0 views/docs/{api-notes.md => api/notes.md} | 3 ++- views/docs/{api-traveler.md => api/traveler.md} | 3 ++- views/docs/{api-travelers.md => api/travelers.md} | 6 ++++-- 7 files changed, 20 insertions(+), 12 deletions(-) rename views/docs/{api-auth.md => api/auth.md} (99%) rename views/docs/{api-data.md => api/data.md} (89%) rename views/docs/{api.md => api/header.md} (100%) rename views/docs/{api-notes.md => api/notes.md} (91%) rename views/docs/{api-traveler.md => api/traveler.md} (95%) rename views/docs/{api-travelers.md => api/travelers.md} (94%) diff --git a/views/docs/api.jade b/views/docs/api.jade index 3d18a2bc..5092385c 100644 --- a/views/docs/api.jade +++ b/views/docs/api.jade @@ -1,13 +1,13 @@ article header - include:marked api.md + include:marked api/header.md section#api-auth - include:marked api-auth.md + include:marked api/auth.md section#api-travelers - include:marked api-travelers.md + include:marked api/travelers.md section#api-traveler - include:marked api-traveler.md + include:marked api/traveler.md section#data - include:marked api-data.md + include:marked api/data.md section#notes - include:marked api-notes.md + include:marked api/notes.md diff --git a/views/docs/api-auth.md b/views/docs/api/auth.md similarity index 99% rename from views/docs/api-auth.md rename to views/docs/api/auth.md index 9778dba0..5c88209f 100644 --- a/views/docs/api-auth.md +++ b/views/docs/api/auth.md @@ -1,2 +1,3 @@ ### API authentication + The API's are protected by basic authentication. If a client gets 401 response with "api" realm challenge, then the client either did not present the credential in the request or the presented credential was not right. Please contact the application operator for available credentials. diff --git a/views/docs/api-data.md b/views/docs/api/data.md similarity index 89% rename from views/docs/api-data.md rename to views/docs/api/data.md index 933d553d..910bc300 100644 --- a/views/docs/api-data.md +++ b/views/docs/api/data.md @@ -1,7 +1,8 @@ ### Data collected in a traveler + - Method: GET - URL: https://hostname:port/apis/travelers/:id/data/ - where :id is the id of the traveler whose data is retrieved + where :id is the id of the traveler whose data is retrieved - Sample response: ```json @@ -29,7 +30,9 @@ Each data item in the list contains the input name in the form, the input type and the value. Besides, it also records who input the value at what time, by which the input history can be generated. For file input, the value is the file's original name when it was uploaded. In order to retrieve the content of the file, the following file API can be used. #### File uploaded in a traveler + Files are special data collected, and they can be retrieved by + - Method: GET - URL: https://hostname:port/apis/data/:id/ -where :id is the id of the data whose type is file. + where :id is the id of the data whose type is file. diff --git a/views/docs/api.md b/views/docs/api/header.md similarity index 100% rename from views/docs/api.md rename to views/docs/api/header.md diff --git a/views/docs/api-notes.md b/views/docs/api/notes.md similarity index 91% rename from views/docs/api-notes.md rename to views/docs/api/notes.md index e3529fdc..65f8c720 100644 --- a/views/docs/api-notes.md +++ b/views/docs/api/notes.md @@ -1,7 +1,8 @@ ### Notes in a traveler + - Method: GET - URL: https://hostname:port/apis/travelers/:id/notes/ -where :id is the id of the traveler whose notes are retrieved + where :id is the id of the traveler whose notes are retrieved - Sample response: ```json diff --git a/views/docs/api-traveler.md b/views/docs/api/traveler.md similarity index 95% rename from views/docs/api-traveler.md rename to views/docs/api/traveler.md index a01f2b06..dffd1a6b 100644 --- a/views/docs/api-traveler.md +++ b/views/docs/api/traveler.md @@ -1,7 +1,8 @@ ### The details of a traveler + - Method: GET - URL: https://hostname:port/apis/travelers/:id/ -where :id is the id of the traveler to be retrieved + where :id is the id of the traveler to be retrieved - Sample response: ```json diff --git a/views/docs/api-travelers.md b/views/docs/api/travelers.md similarity index 94% rename from views/docs/api-travelers.md rename to views/docs/api/travelers.md index a48f86ac..6bb14b34 100644 --- a/views/docs/api-travelers.md +++ b/views/docs/api/travelers.md @@ -1,4 +1,5 @@ ### The list of travelers + - Method: GET - URL: https://hostname:port/apis/travelers/ - Sample response: @@ -46,6 +47,7 @@ The response will be a JSON array containing the list of travelers. Each traveler in the list is represented by a JSON object with traveler id, title, status, devices, createdBy, clonedBy, createdOn, deadline, updatedBy, updatedOn, sharedWith, finishedInput, and totalInput information. The traveler id can be used to retrieve more details of a traveler, https://hostname:port/apis/travelers/:id/ for the JSON representation and http://hostname:port/travelers/:id/ for the HTML representation. The travler list can also be retrieved by a device name. + - URL: https://hostname:port/apis/travelers/?device=:devicename -where :devicename is the name of device that was assigned to the travelers. -section#traveler + where :devicename is the name of device that was assigned to the travelers. + section#traveler From ea772f8b747c1599e491ce2335d57630b850c1be Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 17:48:59 -0700 Subject: [PATCH 18/27] rename to templates --- views/doc-in-one.jade | 6 +++--- views/docs/{forms.jade => templates.jade} | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename views/docs/{forms.jade => templates.jade} (100%) diff --git a/views/doc-in-one.jade b/views/doc-in-one.jade index 364dece6..c6a41623 100644 --- a/views/doc-in-one.jade +++ b/views/doc-in-one.jade @@ -22,8 +22,8 @@ block content p There is an Audience statement at the top of each section. If you are not the target audience, please feel free to skip that section. section#basics include ./docs/basics.jade - section#forms - include ./docs/forms.jade + section#templates + include ./docs/templates.jade section#travelers include ./docs/travelers.jade section#binders @@ -40,7 +40,7 @@ block content li a(href='#basics') Basics li - a(href='#forms') Templates + a(href='#templates') Templates li a(href='#travelers') Travelers li diff --git a/views/docs/forms.jade b/views/docs/templates.jade similarity index 100% rename from views/docs/forms.jade rename to views/docs/templates.jade From aba9c6d6beb5f8f60aa27eb356f2a32c6034d346 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 20:44:44 -0700 Subject: [PATCH 19/27] template header --- views/docs/template/header.md | 11 +++++++++++ views/docs/templates.jade | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/views/docs/template/header.md b/views/docs/template/header.md index e69de29b..338b4cf0 100644 --- a/views/docs/template/header.md +++ b/views/docs/template/header.md @@ -0,0 +1,11 @@ +## Design with templates + +**Audience: traveler users, especially lead engineers** + +To design a template and release it for use is the very first step of using the +traveler application. The template is almost the same as the empty paper +traveler that an engineer specifies and hands out for a piece of work. + +Before starts working on a template with the [builder](#builder), one should +understand the difference between two template types, and the life cycle of a +template. diff --git a/views/docs/templates.jade b/views/docs/templates.jade index 23e30802..10d3e9e1 100644 --- a/views/docs/templates.jade +++ b/views/docs/templates.jade @@ -1,5 +1,4 @@ article - h2 Design with templates header include:marked template/header.md section#normal From 73ae337ae139ba41a5f2e9e1a1cc79f89e867292 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 21:14:01 -0700 Subject: [PATCH 20/27] add normal template --- views/docs/template/normal.md | 9 +++++++++ views/docs/templates.jade | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 views/docs/template/normal.md diff --git a/views/docs/template/normal.md b/views/docs/template/normal.md new file mode 100644 index 00000000..75c71989 --- /dev/null +++ b/views/docs/template/normal.md @@ -0,0 +1,9 @@ +### normal templates + +When the traveler application was first designed, there is only one type of +template, and it is what we call normal template in this document. A normal +template should satisfy most use cases for the traveler application. One can +include instructive directions with text, diagrams, and formulas in a template. +It can include most common HTML input type, like numbers, date, short text, long +text, radio button, checkbox, and file upload. One can also structure the +template into sections for better reference and organization. diff --git a/views/docs/templates.jade b/views/docs/templates.jade index 10d3e9e1..5177f1c7 100644 --- a/views/docs/templates.jade +++ b/views/docs/templates.jade @@ -2,7 +2,7 @@ article header include:marked template/header.md section#normal - //- include:marked normal-template.md + include:marked template/normal.md section#discrepancy //- include:marked discrepancy-template.md section#template-life From 86ed35196894589752eb80c79804a0bb659be198 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 29 Mar 2020 21:40:24 -0700 Subject: [PATCH 21/27] add discrepancy template --- views/docs/template/discrepancy.md | 15 +++++++++++++++ views/docs/template/normal.md | 3 +++ views/docs/templates.jade | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 views/docs/template/discrepancy.md diff --git a/views/docs/template/discrepancy.md b/views/docs/template/discrepancy.md new file mode 100644 index 00000000..58c5aad2 --- /dev/null +++ b/views/docs/template/discrepancy.md @@ -0,0 +1,15 @@ +### discrepancy template + +As the name suggests, we introduced the discrepancy template into the traveler +application mainly for the quality assurance (QA) process. When the task +specified in a traveler reaches the stage of completion or milestone, a QA +personal will check if the data collected satisfy the expectation. If not, it is +a discrepancy. Very naturally, a discrepancy will require a correction. When a +correction finishes, the traveler is updated, and a QA process will kick in +again. By recording each instance of discrepancy, the team will have better +understanding of the task in the aspects like which part of the work is more +error prone, which might suggest an improvement of workflow. + +A discrepancy template is designed as an HTML form. A user inputs data in a form +view inside a traveler, and represented in a table each row of which is a +discrepancy instance. diff --git a/views/docs/template/normal.md b/views/docs/template/normal.md index 75c71989..60aa6865 100644 --- a/views/docs/template/normal.md +++ b/views/docs/template/normal.md @@ -7,3 +7,6 @@ include instructive directions with text, diagrams, and formulas in a template. It can include most common HTML input type, like numbers, date, short text, long text, radio button, checkbox, and file upload. One can also structure the template into sections for better reference and organization. + +A normal template is designed as an HTML form, and represented as an HTML form +in the traveler during the execution and when finished. diff --git a/views/docs/templates.jade b/views/docs/templates.jade index 5177f1c7..bad95852 100644 --- a/views/docs/templates.jade +++ b/views/docs/templates.jade @@ -4,7 +4,8 @@ article section#normal include:marked template/normal.md section#discrepancy - //- include:marked discrepancy-template.md + include:marked template/discrepancy.md + section#version section#template-life //- include:marked template-lifecycle.md section#builder From 3379a484430e25136b5bbc40a64ee3be6aac50e6 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 5 Apr 2020 17:50:38 -0700 Subject: [PATCH 22/27] fix typo --- routes/api.js | 6 +++--- routes/traveler.js | 24 +++++++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/routes/api.js b/routes/api.js index 036700f3..42d517d6 100644 --- a/routes/api.js +++ b/routes/api.js @@ -299,7 +299,7 @@ module.exports = function(app) { /** * get the latest value for the given name from the data list * @param {String} name input name - * @param {Array} data an arrya of TravelerData + * @param {Array} data an array of TravelerData * @return {Number|String|null} the value for the given name */ function dataForName(name, data) { @@ -368,7 +368,7 @@ module.exports = function(app) { * @param {Function} cb callback function * @return {Object} the json representation */ - function retrieveKeyLableValue(traveler, props, cb) { + function retrieveKeyLabelValue(traveler, props, cb) { var output = {}; props.forEach(function(p) { output[p] = traveler[p]; @@ -416,7 +416,7 @@ module.exports = function(app) { app.get('/apis/travelers/:id/keylabelvalue/', function(req, res) { Traveler.findById(req.params.id, function(travelerErr, traveler) { - retrieveKeyLableValue( + retrieveKeyLabelValue( traveler, ['id', 'title', 'status', 'tags', 'devices'], function(err, output) { diff --git a/routes/traveler.js b/routes/traveler.js index e453f868..d63f8907 100644 --- a/routes/traveler.js +++ b/routes/traveler.js @@ -448,9 +448,7 @@ module.exports = function(app) { return res .status(400) .send( - `cannot find the released ${ - config.viewConfig.terminology.form - } with id ${req.body.form}` + `cannot find the released ${config.viewConfig.terminology.form} with id ${req.body.form}` ); } }); @@ -639,7 +637,7 @@ module.exports = function(app) { * @param {Function} cb callback function * @return {Object} the json representation */ - function retrieveKeyLableValue(traveler, props, cb) { + function retrieveKeyLabelValue(traveler, props, cb) { var output = {}; props.forEach(function(p) { output[p] = traveler[p]; @@ -736,7 +734,7 @@ module.exports = function(app) { reqUtils.exist('id', Traveler), reqUtils.canReadMw('id'), function(req, res) { - retrieveKeyLableValue( + retrieveKeyLabelValue( req[req.params.id], ['id', 'title', 'status', 'tags', 'devices'], function(err, output) { @@ -938,7 +936,10 @@ module.exports = function(app) { reqUtils.archived('id', false), function(req, res) { var doc = req[req.params.id]; - if (reqUtils.isOwner(req, doc) || routesUtilities.checkUserRole(req, 'admin')) { + if ( + reqUtils.isOwner(req, doc) || + routesUtilities.checkUserRole(req, 'admin') + ) { return res.render( 'traveler-config', routesUtilities.getRenderObject(req, { @@ -947,9 +948,7 @@ module.exports = function(app) { }) ); } else { - res - .status(403) - .send('you are not authorized to access this resource'); + res.status(403).send('you are not authorized to access this resource'); } } ); @@ -964,7 +963,10 @@ module.exports = function(app) { reqUtils.sanitize('body', ['title', 'description', 'deadline']), function(req, res) { var doc = req[req.params.id]; - if (reqUtils.isOwner(req, doc) || routesUtilities.checkUserRole(req, 'admin')) { + if ( + reqUtils.isOwner(req, doc) || + routesUtilities.checkUserRole(req, 'admin') + ) { var k; for (k in req.body) { if (req.body.hasOwnProperty(k) && req.body[k] !== null) { @@ -973,7 +975,7 @@ module.exports = function(app) { } doc.updatedBy = req.session.userid; doc.updatedOn = Date.now(); - doc.save(function (saveErr, newDoc) { + doc.save(function(saveErr, newDoc) { if (saveErr) { logger.error(saveErr); return res.status(500).send(saveErr.message); From dd77c7d67b766fadfaa0ff10333cad0f9f5883f0 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 5 Apr 2020 17:51:16 -0700 Subject: [PATCH 23/27] add template life cycle --- public/images/template-life.png | Bin 0 -> 30638 bytes views/docs/template/header.md | 4 ++-- views/docs/template/lifecycle.md | 39 +++++++++++++++++++++++++++++++ views/docs/template/version.md | 1 + views/docs/templates.jade | 5 ++-- 5 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 public/images/template-life.png create mode 100644 views/docs/template/lifecycle.md create mode 100644 views/docs/template/version.md diff --git a/public/images/template-life.png b/public/images/template-life.png new file mode 100644 index 0000000000000000000000000000000000000000..8cfc960593f764820a7e65b968e57c4478747526 GIT binary patch literal 30638 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 +template life cycle +
+States and life cycle of templates +
+ + +Overall, there are two different templates, draft and released. A traveler can +be created from only a released template, not from a draft template. This allow +a manager or lead engineer to enforce a template approval process so that a +draft must be approved before it can be used in the field. + +When a new template is created, it is a draft. Updating will not change its +draft status. When there is no need to continue working on a draft template, it +can be archived. This will help keep a clean work space. Archiving is like soft +deletion. However, one can also clone from an archived template to generate a +new draft template. + +When one think a template is ready to be used in the field, s/he can submit the +template for approval. A user with manager or admin role can review the +submitted template, and approve or reject it. When a draft template is approved, +a released template will be created with version. The draft template still +exists so that its owner can continue to improve it. When a submission is +rejected, the template becomes a draft. After a draft template is submitted for +approval, and before the decision is made, no one can update the content of the +template. + +No one can update the content of a released template, so that all the travelers +created from the same released template for a specific version share the same +look. A released traveler can be archived as well. When it becomes archived, no +traveler can be created from it. + +When a template needs to be improved, a manager can release a new version of +template, and archive an old version of template. diff --git a/views/docs/template/version.md b/views/docs/template/version.md new file mode 100644 index 00000000..0e51bb57 --- /dev/null +++ b/views/docs/template/version.md @@ -0,0 +1 @@ +### version control diff --git a/views/docs/templates.jade b/views/docs/templates.jade index bad95852..0199fd03 100644 --- a/views/docs/templates.jade +++ b/views/docs/templates.jade @@ -5,15 +5,16 @@ article include:marked template/normal.md section#discrepancy include:marked template/discrepancy.md - section#version section#template-life - //- include:marked template-lifecycle.md + include:marked template/lifecycle.md section#builder //- include:marked template-builder.md section#clone //- include:marked template-clone.md section#release //- include:marked template-release.md + section#version + include:marked template/version.md section#archive include:marked template/archive.md From 82222fb6e98990a224d2dda417afb3f1af9fad55 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 5 Apr 2020 22:18:09 -0700 Subject: [PATCH 24/27] new template --- public/images/template-type.png | Bin 0 -> 84884 bytes views/docs/template/archive.md | 2 +- views/docs/template/builder.md | 36 ++++++++++++++++++++++++++++++++ views/docs/templates.jade | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 public/images/template-type.png create mode 100644 views/docs/template/builder.md diff --git a/public/images/template-type.png b/public/images/template-type.png new file mode 100644 index 0000000000000000000000000000000000000000..71ea2dc72fe41fd2e182f348088e0b8db92e2e56 GIT binary patch literal 84884 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 literal 0 HcmV?d00001 diff --git a/views/docs/template/archive.md b/views/docs/template/archive.md index facb0fca..e76b4b5d 100644 --- a/views/docs/template/archive.md +++ b/views/docs/template/archive.md @@ -1 +1 @@ -#### Archive a template +### Archive a template diff --git a/views/docs/template/builder.md b/views/docs/template/builder.md new file mode 100644 index 00000000..f4321c91 --- /dev/null +++ b/views/docs/template/builder.md @@ -0,0 +1,36 @@ +### Template builder + +Template builder is one of the most important components in the traveler +application. The template builder is a what-you-see-is-what-you-get one-page +application that most users will work with. It was designed to be user friendly. +However, the instruction in this section will definitely save time for a first +time user. + +#### Choose the right type + +Log in the traveler application, and navigate to the Forms +page. Then click on the + + New form + +button. + +A new page will load the following page. + +
+new template page +
+New template +
+
+ +The user needs to set the new template's name, and choose the type. The default +type is [normal](#normal). The [discrepancy](#discrepancy) type is specially for +a recurrent process like QA. Click to go to next step. + +#### Add Inputs + +#### Sections diff --git a/views/docs/templates.jade b/views/docs/templates.jade index 0199fd03..9b67e118 100644 --- a/views/docs/templates.jade +++ b/views/docs/templates.jade @@ -8,7 +8,7 @@ article section#template-life include:marked template/lifecycle.md section#builder - //- include:marked template-builder.md + include:marked template/builder.md section#clone //- include:marked template-clone.md section#release From 7f10bf36a12ff339846fbf60ed00f8681cda3f64 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Wed, 8 Apr 2020 08:40:30 -0700 Subject: [PATCH 25/27] deprecated feature --- views/docs/traveler/manage-forms.md | 66 ++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/views/docs/traveler/manage-forms.md b/views/docs/traveler/manage-forms.md index 23c6832c..7762a733 100644 --- a/views/docs/traveler/manage-forms.md +++ b/views/docs/traveler/manage-forms.md @@ -1,31 +1,77 @@ -### Manage forms in a traveler +### Manage templates in a traveler (deprecated) + +This feature was **removed** after we implemented a template release process. The +rational is that we should not change the traveler specification (templates) +once it is executed in the field. If there is any change to the work, there +should be a new traveler based on a new versions of released templates. **Audience: traveler owner** -When you want to change the procedure described in a traveler, you will need to update the corresponding form of the traveler. Such a change can be to adjust the sequence of the elements in the form or to add/remove elements. You can always create a new traveler from the updated form, and start from there. However, you might want to update an active traveler that already collected data and notes. The traveler form management feature is designed for this purpose. The owner of a traveler can use a new form in the traveler. S/he can also switch back to a form previously used in the traveler when needed. +When you want to change the procedure described in a traveler, you will need to +update the corresponding form of the traveler. Such a change can be to adjust +the sequence of the elements in the form or to add/remove elements. You can +always create a new traveler from the updated form, and start from there. +However, you might want to update an active traveler that already collected data +and notes. The traveler form management feature is designed for this purpose. +The owner of a traveler can use a new form in the traveler. S/he can also switch +back to a form previously used in the traveler when needed. -Click the Manage forms button to go to the form manager page for the traveler. The left side of the form manager page has three tables: the active form, the used forms, and the available forms. The right side is a preview of the traveler with the selected form and the data and notes already collected in the traveler. When the page first loaded, the active form is highlighted. The active and used forms table contains form aliases and their last activation date. +Click the Manage forms button to go +to the form manager page for the traveler. The left side of the form manager +page has three tables: the active form, the used forms, and the available forms. +The right side is a preview of the traveler with the selected form and the data +and notes already collected in the traveler. When the page first loaded, the +active form is highlighted. The active and used forms table contains form +aliases and their last activation date. form manager page -The available forms table contains the same set of forms as in the "My forms" tab on the main page of the traveler application. A form will be selected and highlighted when you click the icon, and the preview on the right side of the page will be refreshed. A icon in the "Reference" column links to the form that was originally based on. You might want to use an updated version of that form to update the traveler. Note that a traveler contains only the snapshot copy of the form when it is used. +The available forms table contains the same set of forms as in the "My forms" +tab on the main page of the traveler application. A form will be selected and +highlighted when you click the icon, and +the preview on the right side of the page will be refreshed. A icon in the "Reference" column links to the form that +was originally based on. You might want to use an updated version of that form +to update the traveler. Note that a traveler contains only the snapshot copy of +the form when it is used. #### Use an available form -First locate the form that you want to use in the available forms table. You can filter the table by the title of the forms. Then you need to click the icon of the wanted form, the right side traveler preview will be updated, and the form row is highlighted. Click the and confirm, and the form will be added to be traveler and become active. +First locate the form that you want to use in the available forms table. You can +filter the table by the title of the forms. Then you need to click the icon of the wanted form, the right side +traveler preview will be updated, and the form row is highlighted. Click the + and confirm, and the form will be added +to be traveler and become active. -The new form will appear in the active form table, and the previously active form will appear in the used forms table. The change will be seem by all users. +The new form will appear in the active form table, and the previously active +form will appear in the used forms table. The change will be seem by all users. #### Switch back to a used form -Sometimes, you might find one of the previously used forms is better than the current active one. You can easily switch by choosing the one you like in the "Used forms" table, and click the button. +Sometimes, you might find one of the previously used forms is better than the +current active one. You can easily switch by choosing the one you like in the +"Used forms" table, and click the button. -After switching, the active form and used forms table will be adjusted accordingly. The traveler update will be seen when it is loaded or refreshed. +After switching, the active form and used forms table will be adjusted +accordingly. The traveler update will be seen when it is loaded or refreshed. #### Set the alias of a form -Every form that has been used by the traveler has an alias. When a form was first used by the traveler, the alias is the same as the form's title. You can update it by selecting it and click the button. The alias can help to distinguish forms. +Every form that has been used by the traveler has an alias. When a form was +first used by the traveler, the alias is the same as the form's title. You can +update it by selecting it and click the +button. The alias can help to distinguish forms. #### The impact on the estimated traveler progress -The traveler progress is estimated by (number of finished inputs / total number of inputs). When the traveler form is changed, the total number of inputs will also be updated. However, the traveler updates the number of finished inputs only when the traveler is loaded with the collected data after the change. It is recommended that you load the traveler in a new browser window right after the form change in order to verify the change and also update the progress estimation. +The traveler progress is estimated by (number of finished inputs / total number +of inputs). When the traveler form is changed, the total number of inputs will +also be updated. However, the traveler updates the number of finished inputs +only when the traveler is loaded with the collected data after the change. It is +recommended that you load the traveler in a new browser window right after the +form change in order to verify the change and also update the progress +estimation. From 83d435d2178c68ea289f89d0cb53b1eef0605f9f Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 19 Apr 2020 20:37:13 -0700 Subject: [PATCH 26/27] how to save when sessen expired --- views/docs/basics/login.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/views/docs/basics/login.md b/views/docs/basics/login.md index 5e9f58aa..ffdf64a4 100644 --- a/views/docs/basics/login.md +++ b/views/docs/basics/login.md @@ -7,3 +7,9 @@ the application. If not log out, a user's session will expire after a period. When a user tries to access a resource URL on a browser with no live session, the user will be directed to the log in page, and be redirected back to the requested URL if login succeeds. + +When a page contains unsaved content and the session is expired, an error +message will appear on the top of the page when you try to save. Log in the +application in a **new** tab or page, and then save the change again. Do not +close or navigate away from the page that contains the unsaved changes, +otherwise you will lost the change. From 60d2bf47919075acb8cb9ba587eda14235991505 Mon Sep 17 00:00:00 2001 From: Dong Liu Date: Sun, 19 Apr 2020 20:37:40 -0700 Subject: [PATCH 27/27] basic inputs --- views/docs/template/builder.md | 68 ++++++++++++++++++++++++++++++---- views/docs/template/version.md | 2 +- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/views/docs/template/builder.md b/views/docs/template/builder.md index f4321c91..f2f02798 100644 --- a/views/docs/template/builder.md +++ b/views/docs/template/builder.md @@ -9,13 +9,9 @@ time user. #### Choose the right type Log in the traveler application, and navigate to the Forms -page. Then click on the - - New form - -button. +fa-lg">
 New form button. A new page will load the following page. @@ -29,8 +25,64 @@ New template The user needs to set the new template's name, and choose the type. The default type is [normal](#normal). The [discrepancy](#discrepancy) type is specially for a recurrent process like QA. Click to go to next step. +btn-primary">Confirm to go to next step. Always start with the normal +type for your first try. #### Add Inputs -#### Sections +A new template has no inputs inside. The designer of a template is responsible +to add inputs and sections into it, and arrange them in the desired order. + +##### Basic inputs + +The template builder support 8 basic inputs types: + +| input name | usage | properties | +| ----------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | +| Checkbox | specify a boolean value, true or false | Label, User defined key, Text, Required | +| Radio | choose one out of multiple available options | Label, User defined key, Text, Required, Radio button value | +| Text | a single line text to record | Label, User defined key, Placeholder, Required, Help | +| Figure | not a user input, a visual instruction for traveler user | Select an image, Image alternate text, Width, Figure caption | +| Paragraph | multiple line text to record | Label, User defined key, Placeholder, Row Required, Help | +| Number | either an integer or a float value | Label, User defined key, Placeholder, Help, Min, Max, Required | +| Upload file | use upload file | Label, User defined key, Help, Required | +| Other types | Text/Number/Date/Date Time/Email/Phone number/Time/URL HTML5 input types with validation support | Label, User defined key, Placeholder, Help, Required | + +Each input is specified by a list of properties. Some property control the input +presentation, and some control its behavior, and some are for internal traveler +application. The details of the input properties are listed in the following +table. + +| property name | usage | notes | +| -------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Label | appears in front of the input, short description | default as "label", SHOULD be short and unique in the template | +| User defined key | does not appear in the template, but used for report and API | MUST be unique within the template; **only** letter, number, and "\_" allowed (Example: MagMeas_1) | +| Radio button value | appears behind the radio button | the value will be recorded in DB; each radio button value MUST be unique within the radio group | +| Required | whether the input is required | when an input is required, the value MUST be present to pass template validation; for checkbox, required means it MUST be checked | +| Placeholder | appears inside the input before the user touches | a short hint to the user | +| Select an image | upload an image for the figure | choose an image file from local file system and then click upload | +| Image alternate text | the text appears in the place when the image is not loaded | meaningful text for the image | +| Width | the width of image appearing in the template | when the image is too large, use this property to resize it. The unit is pixel, and the height will be adjusted accordingly to keep the original aspect. | +| Figure caption | appears below the image | a long text to describe the image | +| Row | the number of rows for the text box | provide enough space so that the user can input or viw the text without scrolling | +| Min | minimum allowed value for a number | useful for validation | +| Max | minimum allowed value for a number | useful for validation | +| Help | appear below the input | a long hint to the user for the input | + +#### Save + +##### edit + +##### duplicate + +##### remove + +#### Advances control + +##### Section + +##### Rich instruction + +#### Preview and validation + +#### Save as diff --git a/views/docs/template/version.md b/views/docs/template/version.md index 0e51bb57..aecdd629 100644 --- a/views/docs/template/version.md +++ b/views/docs/template/version.md @@ -1 +1 @@ -### version control +### Version control