summaryrefslogtreecommitdiffstats
path: root/app/class
diff options
context:
space:
mode:
authorMalf Furious <m@lfurio.us>2017-04-05 22:31:50 -0400
committerMalf Furious <m@lfurio.us>2017-04-09 18:37:31 -0400
commit5340dce8ad70a8cfc62116144f668f22845a2f31 (patch)
tree54e5762dad2003704b82740e6574ab694b68e651 /app/class
parente6070d1314f3161a346371154beb02c24506454a (diff)
downloadscrott-5340dce8ad70a8cfc62116144f668f22845a2f31.tar.gz
scrott-5340dce8ad70a8cfc62116144f668f22845a2f31.zip
Add stage class
Diffstat (limited to 'app/class')
-rw-r--r--app/class/stage.class.php137
1 files changed, 137 insertions, 0 deletions
diff --git a/app/class/stage.class.php b/app/class/stage.class.php
new file mode 100644
index 0000000..31f6a94
--- /dev/null
+++ b/app/class/stage.class.php
@@ -0,0 +1,137 @@
+<?php
+
+/*
+ * SCROTT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * For more information, please refer to UNLICENSE
+ */
+
+require_once "class/object.class.php";
+require_once "class/pad.class.php";
+
+/*
+ * This class models Scrott pad stages. Stages form a pipeline through
+ * which issues can progress.
+ */
+class stage extends object
+{
+ /*
+ * Constructor
+ */
+ public function __construct(?string $guid = NULL)
+ {
+ $this->fields['stages'] = array(
+ "guid",
+ "stage",
+ );
+
+ parent::__construct($guid);
+ $this->expectType("stage");
+ }
+
+ /*
+ * Initialize a new stage object with the given name and parent
+ * pad.
+ */
+ public static function initNew(string $name, pad $parent) : stage
+ {
+ $stage = new stage();
+ $stage->setParent($parent);
+ $stage->name = $name;
+ $stage->objtype = "stage";
+ return $stage;
+ }
+
+ /*
+ * Get the stage following this one in the pipeline. NULL is
+ * returned if no stage is next.
+ */
+ public function getNext() : ?stage
+ {
+ if (!isset($this->stage) || $this->stage == "")
+ return NULL;
+
+ return new stage($this->stage);
+ }
+
+ /*
+ * Get the stage preceding this one in the pipeline. NULL is
+ * returned if no stage is previous.
+ */
+ public function getPrev() : ?stage
+ {
+ $pad = new pad($this->getParent());
+
+ if ($pad->stage == $this->guid)
+ return NULL;
+
+ $query = "SELECT guid FROM stages WHERE stage = '" . database::esc($this->guid) . "'";
+ $res = database::query($query);
+
+ if (count($res) == 0)
+ return NULL;
+
+ return new stage($res[0]['guid']);
+ }
+
+ /*
+ * Get an array of all stages reachable from this one. The array
+ * is in proper order and includes the current stage.
+ */
+ public function getArray() : array
+ {
+ $stages = array();
+ $curr = $this;
+
+ do $stages[] = $curr;
+ while (($curr = $curr->getNext()));
+
+ return $stages;
+ }
+
+ /*
+ * Reorder the stages of a pipeline by moving this one forward.
+ * This swaps the places of the current stage and the one following
+ * it. If this stage is the last in its pipeline, nothing is done
+ * and false is returned.
+ */
+ public function moveForward() : bool
+ {
+ if (!($next = $this->getNext()))
+ return false;
+
+ if (!($prev = $this->getPrev()))
+ $prev = new pad($this->getParent());
+
+ $tmp = $next->stage;
+ $prev->stage = $next->guid;
+ $next->stage = $this->guid;
+ $this->stage = $tmp;
+
+ $next->saveObj();
+ $prev->saveObj();
+ return true;
+ }
+
+ /*
+ * Reorder the stages of a pipeline by moving this one backward.
+ * This swaps the places of the current stage and the one preceding
+ * it. If this stage is the first in its pipeline, nothing is done
+ * and false is returned.
+ */
+ public function moveBackward() : bool
+ {
+ if (!($prev = $this->getPrev()))
+ return false;
+
+ return $prev->moveForward();
+ }
+}
+
+?>