From 284d6d0a5ee34bc75f140a9278c765904dd56758 Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Tue, 26 Jul 2016 17:39:11 -0500 Subject: [PATCH 01/29] remove dreamweaver _notes folders, remove echo text, add gitignore to ignore DW _notes --- .gitignore | 1 + src/classes/_notes/dwsync.xml | 4 ---- src/dbquery/_notes/dwsync.xml | 4 ---- src/dbquery/qryGROUP/_notes/dwsync.xml | 4 ---- src/dbquery/qryUSER/_notes/dwsync.xml | 4 ---- src/page_content/ADMIN/_notes/dwsync.xml | 5 ----- src/resources/library/forms_db_controller.php | 2 +- 7 files changed, 2 insertions(+), 22 deletions(-) create mode 100644 .gitignore delete mode 100644 src/classes/_notes/dwsync.xml delete mode 100644 src/dbquery/_notes/dwsync.xml delete mode 100644 src/dbquery/qryGROUP/_notes/dwsync.xml delete mode 100644 src/dbquery/qryUSER/_notes/dwsync.xml delete mode 100644 src/page_content/ADMIN/_notes/dwsync.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a24bab5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +_notes/ \ No newline at end of file diff --git a/src/classes/_notes/dwsync.xml b/src/classes/_notes/dwsync.xml deleted file mode 100644 index c41608b..0000000 --- a/src/classes/_notes/dwsync.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/dbquery/_notes/dwsync.xml b/src/dbquery/_notes/dwsync.xml deleted file mode 100644 index d0995bc..0000000 --- a/src/dbquery/_notes/dwsync.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/dbquery/qryGROUP/_notes/dwsync.xml b/src/dbquery/qryGROUP/_notes/dwsync.xml deleted file mode 100644 index 73bb1e4..0000000 --- a/src/dbquery/qryGROUP/_notes/dwsync.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/dbquery/qryUSER/_notes/dwsync.xml b/src/dbquery/qryUSER/_notes/dwsync.xml deleted file mode 100644 index db1e8f0..0000000 --- a/src/dbquery/qryUSER/_notes/dwsync.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/page_content/ADMIN/_notes/dwsync.xml b/src/page_content/ADMIN/_notes/dwsync.xml deleted file mode 100644 index 632fa37..0000000 --- a/src/page_content/ADMIN/_notes/dwsync.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/resources/library/forms_db_controller.php b/src/resources/library/forms_db_controller.php index 092e769..6ccca32 100644 --- a/src/resources/library/forms_db_controller.php +++ b/src/resources/library/forms_db_controller.php @@ -199,7 +199,7 @@ public function renderFormsList() $delformid = "delform" . $formid; echo "
-X".$pg_encrypt_key."
"; +X"; echo ""; } echo ""; From 39a0a730b269b1b822b488aedd2d951fb181b314 Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Thu, 4 Aug 2016 06:53:52 -0500 Subject: [PATCH 02/29] empty district level approver list validates and works. --- src/includes/pageformsbuild.php | 3 ++- src/resources/library/approver.php | 10 ++++++++++ src/resources/library/forms_db_controller.php | 1 - src/views/createworkorder.php | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/includes/pageformsbuild.php b/src/includes/pageformsbuild.php index 4a22218..c0efb70 100644 --- a/src/includes/pageformsbuild.php +++ b/src/includes/pageformsbuild.php @@ -83,7 +83,7 @@ function handleNotificationsSelectOnChange(value) - + @@ -274,6 +274,7 @@ function handleNotificationsSelectOnChange(value) $(template).formRender(formRenderOpts); jQuery('#formPreviewModal').modal(); }); + // Use the required attribute on required form fields, then set the message below for the form field. jQuery("#formsaveform").validate({ submitHandler: function(form){ var xmlString = formBuilder.data('formBuilder').formData; diff --git a/src/resources/library/approver.php b/src/resources/library/approver.php index ced2bf1..3a3bebd 100644 --- a/src/resources/library/approver.php +++ b/src/resources/library/approver.php @@ -178,6 +178,16 @@ public static function MergeApproverArrays($groupApprovers, $approvers) return $approvers; } } + /** Parse raw workflow data from form element. Expects a CSV of email addresses. returns array of email addresses. */ + public static function ParseRawWorkflowData($workflowCsvData) + { + if ($workflowCsvData == "") { + $approverArray = array(); + } else { + $approverArray = explode(',', $workflowCsvData); + } + return $approverArray; + } } /** Approve State for Workorders */ diff --git a/src/resources/library/forms_db_controller.php b/src/resources/library/forms_db_controller.php index 3932b9f..b498677 100644 --- a/src/resources/library/forms_db_controller.php +++ b/src/resources/library/forms_db_controller.php @@ -61,7 +61,6 @@ public function verifyAddFormFields($name, $desc, $xml, $workflow, $notifyOnFina if ($desc == ""){$valid = False;} if ($xml !== ""){ // TODO: Check for valid XML - if ($workflow == ""){$valid = false;} } return $valid; } diff --git a/src/views/createworkorder.php b/src/views/createworkorder.php index 7d3fd2b..6a66a98 100644 --- a/src/views/createworkorder.php +++ b/src/views/createworkorder.php @@ -68,7 +68,7 @@ $formName = $formPostHandler->formName; //$_POST['form-name']; $formDescription = $formPostHandler->formDescription; //$_POST['form-description']; // Form Workflow field holds array of approver email addresses. We need to transform this to work with the data. - $approverArray = explode(',', $form['Workflow']); + $approverArray = ApproverHelper::ParseRawWorkflowData($form['Workflow']); $approvers = ApproverHelper::NewApproverArrayFromEmailArray($approverArray); // Get the groupWorkflow for the users group $groupWorkflows = $form['GroupWorkflows']; From 4a81052d1c1c7ed8e8ed3dc2f4ca38e536f138e3 Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Thu, 4 Aug 2016 08:47:05 -0500 Subject: [PATCH 03/29] Fixes #11 --- src/includes/pageformsbuild.php | 1 - src/resources/library/workorder.php | 4 +++- src/views/workorder.php | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/includes/pageformsbuild.php b/src/includes/pageformsbuild.php index c0efb70..cb0aeb7 100644 --- a/src/includes/pageformsbuild.php +++ b/src/includes/pageformsbuild.php @@ -239,7 +239,6 @@ function handleNotificationsSelectOnChange(value) -hello \ No newline at end of file diff --git a/src/resources/appconfig.php b/src/resources/appconfig.php index 8fbc1a9..b174afc 100644 --- a/src/resources/appconfig.php +++ b/src/resources/appconfig.php @@ -10,11 +10,7 @@ abstract class Config { const BaseUrl = "http://www.example.com/"; const SiteTitleShort = "FLOW"; const SiteTitleLong = "Work Flow"; - const DbDsn = "mysql:host=localhost;dbname=formsdb"; - const DbUsername = ""; - const DbPassword = ""; const WorkorderApproverScript = "workorderview.php"; const WorkorderViewOnlyScript = "workorderview.php"; } - ?> \ No newline at end of file diff --git a/src/resources/library/forms_db_controller.php b/src/resources/library/forms_db_controller.php index 77baaf2..8b12314 100644 --- a/src/resources/library/forms_db_controller.php +++ b/src/resources/library/forms_db_controller.php @@ -1,57 +1,44 @@ conn = new PDO($dsn, $user_name, $pass_word); + $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } + function __destruct() + { + // tear down the db connection, no longer needed + $this->conn = null; + } + public function createFormDefinitionsTable(){ - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $sql = "CREATE TABLE FormDefinitions (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, FormName VARCHAR( 30 ), Description VARCHAR( 150 ), FormXml TEXT, Workflow TEXT, notifyOnFinalApproval TEXT, Available BOOLEAN DEFAULT 0)"; - $conn->exec($sql); + $this->conn->exec($sql); echo "Form definitions table created..."; } catch(PDOException $e) { echo $sql . "
" . $e->getMessage(); } - $conn = null; } - public function createFormDataTable(){ - // DEPRECATED: FormData table will be replaced by Workorder table. Handled in workorder.php in the resources/library folder. - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - try { - $sql = "CREATE TABLE FormData (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, FormName VARCHAR( 30 ), Description VARCHAR( 150 ), CurrentApproverEmail VARCHAR( 80 ), FormXml TEXT, FormData TEXT, Workflow TEXT)"; - $conn->exec($sql); - echo "Form data table created..."; - } - catch(PDOException $e) - { - echo $sql . "
" . $e->getMessage(); - } - $conn = null; - } - public function dropFormDefinitionsTable() { - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $sql = "DROP TABLE FormDefinitions"; - $conn->exec($sql); + $this->conn->exec($sql); echo "Form definitions table DROPPED..."; } catch(PDOException $e) { echo $sql . "
" . $e->getMessage(); } - $conn = null; } public function verifyAddFormFields($name, $desc, $xml, $workflow, $notifyOnFinalApproval) @@ -73,14 +60,9 @@ public function addForm($name, $desc, $xml, $workflow, $notifyOnFinalApproval, $ $xml = trim($xml); $valid = $this->verifyAddFormFields($name, $desc, $xml, $workflow, $notifyOnFinalApproval, $groupWorkflows); if($valid){ - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO FormDefinitions (FormName, Description, FormXml, Workflow, notifyOnFinalApproval, Available, GroupWorkflows) VALUES (:FormName, :Description, :FormXml, :Workflow, :notifyOnFinalApproval, :Available, :GroupWorkflows)"; - $result = $conn->prepare($sql); + $result = $this->conn->prepare($sql); $status = $result->execute(array('FormName' => $name, 'Description' => $desc, 'FormXml' => base64_encode($xml), 'Workflow' => $workflow, 'notifyOnFinalApproval' => $notifyOnFinalApproval, 'Available' => $available, 'GroupWorkflows' => $groupWorkflows)); - $conn = null; return true; } else { return false; @@ -91,14 +73,9 @@ public function addSubmittedFormData($data) { // DEPRECATED: FormData table will be replaced by Workorder table. Handled in workorder.php in the resources/library folder. if($data->InputIsValid()){ - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO FormData (FormName, Description, FormXml, FormData) VALUES (:FormName, :Description, :FormXml, :FormData)"; - $result = $conn->prepare($sql); + $result = $this->conn->prepare($sql); $status = $result->execute(array('FormName' => $data->formName, 'Description' => $data->formDescription, 'FormXml' => base64_encode($data->asFormXML()), 'FormData' => $data->asJSON())); - $conn = null; return true; } else { return false; @@ -112,14 +89,9 @@ public function updateForm($id, $name, $desc, $xml, $workflow, $notifyOnFinalApp $xml = trim($xml); $valid = $this->verifyAddFormFields($name, $desc, $xml, $workflow, $notifyOnFinalApproval, $groupWorkflows); if($valid){ - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE FormDefinitions SET FormName = :FormName, Description = :Description, FormXml = :FormXml, Workflow = :Workflow, notifyOnFinalApproval = :notifyOnFinalApproval, Available = :Available, GroupWorkflows = :GroupWorkflows WHERE id = :id"; - $result = $conn->prepare($sql); + $result = $this->conn->prepare($sql); $status = $result->execute(array('FormName' => $name, 'Description' => $desc, 'FormXml' => base64_encode($xml), 'Workflow' => $workflow, 'notifyOnFinalApproval' => $notifyOnFinalApproval, 'Available' => $available, 'GroupWorkflows' => $groupWorkflows, 'id' => $id)); - $conn = null; return true; } else { return false; @@ -128,26 +100,17 @@ public function updateForm($id, $name, $desc, $xml, $workflow, $notifyOnFinalApp public function deleteForm($id) { - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "DELETE FROM FormDefinitions WHERE id = :id"; - $result = $conn->prepare($sql); + $result = $this->conn->prepare($sql); $status = $result->execute(array('id' => $id)); - $conn = null; } public function getFormById($id){ // returns saved form data - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $formdata = null; try { $sql = "SELECT * FROM FormDefinitions WHERE id = :id"; - $stmt = $conn->prepare($sql); + $stmt = $this->conn->prepare($sql); $stmt->execute(array(':id' => $id)); $formdata = $stmt->fetch(); } catch (PDOException $e) { @@ -159,15 +122,9 @@ public function getFormById($id){ public function renderFormsList() { // renders all saved forms in a boostrap table - require "./config/db.php"; - //include_once "./resources/page_encryption.php"; - - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $sql = "SELECT * FROM FormDefinitions"; - $stmt = $conn->prepare($sql); + $stmt = $this->conn->prepare($sql); $stmt->execute(); $form = $stmt->fetchAll(); @@ -208,17 +165,12 @@ public function renderFormsList() { echo $sql . "
" . $e->getMessage(); } - $conn = null; } public function renderFormDefinitionsData() { - require "./config/db.php"; - $conn = new PDO($dsn, $user_name, $pass_word); - $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $sql = "SELECT * FROM FormDefinitions"; - $stmt = $conn->prepare($sql); + $stmt = $this->conn->prepare($sql); $stmt->execute(); $form = $stmt->fetchAll(); @@ -261,7 +213,6 @@ public function renderFormDefinitionsData() { echo $sql . "
" . $e->getMessage(); } - $conn = null; } public function renderDbInfo(){ @@ -276,13 +227,9 @@ public function renderDbInfo(){ * @since 2012 */ require_once "dBug!.php"; - require "./config/db.php"; - $connect = new PDO($dsn, $user_name, $pass_word); - $connect->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM FormDefinitions"; - $result = $connect->prepare($sql); + $result = $this->conn->prepare($sql); $status = $result->execute(); if (($status) && ($result->rowCount() > 0)) { @@ -295,7 +242,6 @@ public function renderDbInfo(){ //dump all data from associative array converted from query result new dBug($results); } - $connect = null; } } ?> diff --git a/src/resources/library/user.php b/src/resources/library/user.php index ff2b0af..ae86b15 100644 --- a/src/resources/library/user.php +++ b/src/resources/library/user.php @@ -136,28 +136,21 @@ function AdminUpdate($user_id, $user_email, $user_fname,$user_lname,$user_group, } if($INFO->INFO_request){ $sql = "UPDATE users set - user_email = '".$user_email."', - user_fname = '".$user_fname."', - user_lname = '".$user_lname."', - user_group = '".$user_group."', - user_perms = ".$user_perms.$password." - where user_id = ".$user_id.""; + user_email = :user_email, + user_fname = :user_fname, + user_lname = :user_lname, + user_group = :user_group, + user_perms = :user_perms + where user_id = :user_id"; - echo $sql; $result = $this->conn->prepare($sql); - $status = $result->execute(); + $params = array('user_email' => $user_email, 'user_fname' => $user_fname, 'user_lname' => $user_lname, 'user_group' => $user_group, 'user_perms' => $user_perms, 'user_id' => $user_id); + $status = $result->execute($params); return $status; }else{ return "ERROR|The email domain is not allowed"; } - /* - $sql = "UPDATE groups set GRP_name = '".$GRP_name."'where GRP_id = ".$GRP_id.""; - $result = $this->conn->prepare($sql); - $status = $result->execute(); - return $status; - */ - } } diff --git a/src/views/createworkorder.php b/src/views/createworkorder.php index 6a66a98..de38672 100644 --- a/src/views/createworkorder.php +++ b/src/views/createworkorder.php @@ -1,4 +1,5 @@ getFormById($formId); $formName = $formToRender['FormName']; $formDescription = $formToRender['Description']; @@ -61,7 +64,7 @@ // POST['id'] is not present. Should handle posted form data here $formPostHandler = new Pacman($_POST); // Need to load the form. Form data is stored with new workorder. - $formsDataAdapter = new FormsDataController(); + $formsDataAdapter = new FormsDataController($dsn, $user_name, $pass_word); $form = $formsDataAdapter->getFormById($formPostHandler->formId); // Setup data needed for creating workorder and rendering page $hideFormRenderingClassString = "hidden"; diff --git a/src/views/formsbuild.php b/src/views/formsbuild.php index a144ba4..1c85aa7 100644 --- a/src/views/formsbuild.php +++ b/src/views/formsbuild.php @@ -1,3 +1,10 @@ +Get('System Version'); +?> diff --git a/src/views/workorder.php b/src/views/workorder.php index 514dac8..66d4126 100644 --- a/src/views/workorder.php +++ b/src/views/workorder.php @@ -1,4 +1,5 @@ Date: Thu, 11 Aug 2016 09:48:52 -0500 Subject: [PATCH 08/29] correct spelling error --- src/_page_processor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_page_processor.php b/src/_page_processor.php index 89e2061..9cff621 100644 --- a/src/_page_processor.php +++ b/src/_page_processor.php @@ -163,7 +163,7 @@
- ALERT Your are on the local server + ALERT You are on the local server
Date: Thu, 11 Aug 2016 09:50:29 -0500 Subject: [PATCH 09/29] stub out code for collaborator feature --- src/js/library/collaborator.js | 53 ++++++++++++++++++++++++++ src/resources/library/collaborator.php | 51 +++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 src/js/library/collaborator.js create mode 100644 src/resources/library/collaborator.php diff --git a/src/js/library/collaborator.js b/src/js/library/collaborator.js new file mode 100644 index 0000000..80c4f1a --- /dev/null +++ b/src/js/library/collaborator.js @@ -0,0 +1,53 @@ +// a simple pubsub module to handle eventing for collaborator +var collaboratorEvents = (function(){ + var topics = {}; + var hOP = topics.hasOwnProperty; + + return { + subscribe: function(topic, listener) { + // Create the topic's object if not yet created + if(!hOP.call(topics, topic)) topics[topic] = []; + + // Add the listener to queue + var index = topics[topic].push(listener) -1; + + // Provide handle back for removal of topic + return { + remove: function() { + delete topics[topic][index]; + } + }; + }, + publish: function(topic, info) { + // If the topic doesn't exist, or there's no listeners in queue, just leave + if(!hOP.call(topics, topic)) return; + + // Cycle through topics queue, fire! + topics[topic].forEach(function(item) { + item(info != undefined ? info : {}); + }); + } + }; +})(); + +var collaboratorViewModel = function(allAvailCollabsAsJson){ + this.allAvailable = allAvailCollabsAsJson; + this.hasSelection = false; + this.selectedCollab = {}; + this.setCollab = function(collab){ + this.selectedCollab = collab; + this.hasSelection = true; + collaboratorEvents.publish('collabChanged', { + hasSelection: this.hasSelection, + selectedCollab: this.selectedCollab + }); + }; + this.clearCollab = function(){ + this.selectedCollab = {}; + this.hasSelection = false; + collaboratorEvents.publish('collabChanged', { + hasSelection: this.hasSelection, + selectedCollab: this.selectedCollab + }); + }; +}; \ No newline at end of file diff --git a/src/resources/library/collaborator.php b/src/resources/library/collaborator.php new file mode 100644 index 0000000..f874aca --- /dev/null +++ b/src/resources/library/collaborator.php @@ -0,0 +1,51 @@ +conn = new PDO($dsn, $user_name, $pass_word); + $this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + if ($currentUserEmail != "") { + $this->currentUserEmail = $currentUserEmail; + } + // Load all users into $collabUsers who are flagged as a collab and are available (not forwarded) + + } + function __destruct() + { + // tear down the db connection, no longer needed + $this->conn = null; + } + + protected $collabUsers; + + public function allAvailable() { + // return $collabUsers as array of Collaborator + } + public function allAvailableAsJson() { + // encode $collabUsers as JSON and return + } +} + +?> \ No newline at end of file From aef3dc3f180d226221b401e96505b4f27f37264c Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Thu, 11 Aug 2016 09:52:14 -0500 Subject: [PATCH 10/29] add simple pubsub for easy eventing --- src/js/library/pubsub.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/js/library/pubsub.js diff --git a/src/js/library/pubsub.js b/src/js/library/pubsub.js new file mode 100644 index 0000000..8605462 --- /dev/null +++ b/src/js/library/pubsub.js @@ -0,0 +1,32 @@ +// a simple pubsub function. just add to a page and use events.subscribe and events.publish +// see https://davidwalsh.name/pubsub-javascript for details +var events = (function(){ + var topics = {}; + var hOP = topics.hasOwnProperty; + + return { + subscribe: function(topic, listener) { + // Create the topic's object if not yet created + if(!hOP.call(topics, topic)) topics[topic] = []; + + // Add the listener to queue + var index = topics[topic].push(listener) -1; + + // Provide handle back for removal of topic + return { + remove: function() { + delete topics[topic][index]; + } + }; + }, + publish: function(topic, info) { + // If the topic doesn't exist, or there's no listeners in queue, just leave + if(!hOP.call(topics, topic)) return; + + // Cycle through topics queue, fire! + topics[topic].forEach(function(item) { + item(info != undefined ? info : {}); + }); + } + }; +})(); \ No newline at end of file From 66bda01d2e77e0aec27012ac715b670ad078258c Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Tue, 16 Aug 2016 17:34:58 -0500 Subject: [PATCH 11/29] Structure for working with collaborators --- src/dbquery/qryWORKORDER/add_collab_qry.php | 20 ++++++++++++++++++++ src/page_content/WORKORDER/collab.php | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/dbquery/qryWORKORDER/add_collab_qry.php create mode 100644 src/page_content/WORKORDER/collab.php diff --git a/src/dbquery/qryWORKORDER/add_collab_qry.php b/src/dbquery/qryWORKORDER/add_collab_qry.php new file mode 100644 index 0000000..6eaacd7 --- /dev/null +++ b/src/dbquery/qryWORKORDER/add_collab_qry.php @@ -0,0 +1,20 @@ +UpdateFormData($formPostHandler->woId, $formPostHandler->asJSON()); + +?> \ No newline at end of file diff --git a/src/page_content/WORKORDER/collab.php b/src/page_content/WORKORDER/collab.php new file mode 100644 index 0000000..02ea504 --- /dev/null +++ b/src/page_content/WORKORDER/collab.php @@ -0,0 +1,16 @@ +Select($woId); + $woViewModel = new WorkorderViewModel($wo, $approveKey); + +?> +

Collaborate

\ No newline at end of file From c8e16751b19426e75f584349a26f049814ef9298 Mon Sep 17 00:00:00 2001 From: Raymond Brady Date: Tue, 16 Aug 2016 17:39:50 -0500 Subject: [PATCH 12/29] Wires up select element and allows event subscribe --- src/js/library/collaborator.js | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/js/library/collaborator.js b/src/js/library/collaborator.js index 80c4f1a..31300e8 100644 --- a/src/js/library/collaborator.js +++ b/src/js/library/collaborator.js @@ -30,12 +30,20 @@ var collaboratorEvents = (function(){ }; })(); -var collaboratorViewModel = function(allAvailCollabsAsJson){ - this.allAvailable = allAvailCollabsAsJson; +var CollaboratorViewModel = function(allAvailCollabsJson){ + var vm = this; + this.allAvailable = allAvailCollabsJson; + this.collabIndex = {}; + allAvailCollabsJson.map(function(obj){ + vm.collabIndex[obj.user_id] = obj; + }); this.hasSelection = false; this.selectedCollab = {}; - this.setCollab = function(collab){ - this.selectedCollab = collab; + this.collabSelectElement; + this.collabSelectJ; // jQuery + + this.setCollab = function(collabId){ + this.selectedCollab = this.collabIndex[collabId]; this.hasSelection = true; collaboratorEvents.publish('collabChanged', { hasSelection: this.hasSelection, @@ -45,9 +53,25 @@ var collaboratorViewModel = function(allAvailCollabsAsJson){ this.clearCollab = function(){ this.selectedCollab = {}; this.hasSelection = false; + this.collabSelectElement.selectedIndex = "0"; collaboratorEvents.publish('collabChanged', { hasSelection: this.hasSelection, selectedCollab: this.selectedCollab }); }; + this.subscribeCollabChanged = function(listener){ + // Return handle back for removal of topic. use: handle.remove(); + return collaboratorEvents.subscribe('collabChanged', listener); + }; + this.connectSelectElement = function(selectElementId){ + this.collabSelectElement = document.getElementById(selectElementId); + this.collabSelectJ = jQuery("#" + selectElementId); + this.collabSelectJ.on('change', function(e){ + vm.setCollab(this.value); + }); + jQuery(cvm.allAvailable).each(function(index, o){ + var $option = jQuery("