From c959b10db11d62566e3217dec95f3e6b258e6ae0 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Mon, 21 Aug 2017 13:27:03 +0200 Subject: [PATCH 01/16] prepare db and model for skipping subencoding checks --- src/Application/Controller/XMLRPC/Handler.php | 2 +- src/Application/Migrations/04_projects.sql | 1 + src/Application/Migrations/06_tickets.sql | 4 +-- .../Migrations/15_function_ticket_state.sql | 30 +++++++++++++++---- src/Application/Model/ProjectTicketState.php | 18 +++++------ src/Application/Model/Ticket.php | 12 ++++---- 6 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/Application/Controller/XMLRPC/Handler.php b/src/Application/Controller/XMLRPC/Handler.php index 1d7f1b3..de18bab 100644 --- a/src/Application/Controller/XMLRPC/Handler.php +++ b/src/Application/Controller/XMLRPC/Handler.php @@ -437,7 +437,7 @@ public function setCommenceTicketState($ticket_id) { throw new Exception(__FUNCTION__.': ticket is not in initial state!',1304); } - $commenceState = ProjectTicketState::getCommenceState($ticket['project_id'], $ticket['ticket_type']); + $commenceState = ProjectTicketState::getCommenceState($ticket['project_id'], $ticket['ticket_type'], $ticket_id); if(!$commenceState) { throw new Exception(__FUNCTION__.': ticket has no commence state!',1305); } diff --git a/src/Application/Migrations/04_projects.sql b/src/Application/Migrations/04_projects.sql index f6a6799..86a5ab9 100644 --- a/src/Application/Migrations/04_projects.sql +++ b/src/Application/Migrations/04_projects.sql @@ -50,6 +50,7 @@ CREATE TABLE tbl_project_ticket_state ticket_type enum_ticket_type NOT NULL, ticket_state enum_ticket_state NOT NULL, service_executable boolean NOT NULL DEFAULT false, + skip_on_dependent boolean NOT NULL DEFAULT false, CONSTRAINT tbl_project_ticket_state_pk PRIMARY KEY (project_id, ticket_type, ticket_state), CONSTRAINT tbl_project_ticket_state_project_fk FOREIGN KEY (project_id) REFERENCES tbl_project (id) MATCH SIMPLE diff --git a/src/Application/Migrations/06_tickets.sql b/src/Application/Migrations/06_tickets.sql index f8e83e2..e7d2ce8 100644 --- a/src/Application/Migrations/06_tickets.sql +++ b/src/Application/Migrations/06_tickets.sql @@ -40,7 +40,7 @@ $BODY$ DECLARE next_state record; BEGIN - next_state := ticket_state_next(NEW.project_id, NEW.ticket_type, NEW.ticket_state); + next_state := ticket_state_next(NEW.project_id, NEW.ticket_type, NEW.ticket_state, NEW.id); NEW.ticket_state_next := next_state.ticket_state; NEW.service_executable := next_state.service_executable; @@ -76,7 +76,7 @@ $BODY$ (progress, ticket_state_next, service_executable) = (tp, (n).ticket_state, (n).service_executable) FROM ( - SELECT id, ticket_state_next(t2.project_id, t2.ticket_type, t2.ticket_state) AS n, ticket_progress(t2.id) as tp + SELECT id, ticket_state_next(t2.project_id, t2.ticket_type, t2.ticket_state, t2.id) AS n, ticket_progress(t2.id) as tp FROM tbl_ticket t2 WHERE t2.project_id = param_project_id AND param_project_id IS NOT NULL ) AS x diff --git a/src/Application/Migrations/15_function_ticket_state.sql b/src/Application/Migrations/15_function_ticket_state.sql index 01c6d67..0e93d8d 100644 --- a/src/Application/Migrations/15_function_ticket_state.sql +++ b/src/Application/Migrations/15_function_ticket_state.sql @@ -2,7 +2,7 @@ BEGIN; SET ROLE TO postgres; -CREATE OR REPLACE FUNCTION ticket_state_next(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state) +CREATE OR REPLACE FUNCTION ticket_state_next(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state, param_ticket_id bigint default NULL) RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS $$ DECLARE @@ -19,7 +19,16 @@ BEGIN WHERE pts.project_id = param_project_id AND ts2.ticket_type = param_ticket_type AND - ts2.ticket_state = param_ticket_state + ts2.ticket_state = param_ticket_state AND + (pts.skip_on_dependent = false OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL + ) ORDER BY ts1.sort ASC LIMIT 1; @@ -30,7 +39,7 @@ END $$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION ticket_state_previous(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state) +CREATE OR REPLACE FUNCTION ticket_state_previous(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state, param_ticket_id bigint default NULL) RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS $$ DECLARE @@ -47,7 +56,16 @@ BEGIN WHERE pts.project_id = param_project_id AND ts2.ticket_type = param_ticket_type AND - ts2.ticket_state = param_ticket_state + ts2.ticket_state = param_ticket_state AND + (pts.skip_on_dependent = false OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL + ) ORDER BY ts1.sort DESC LIMIT 1; @@ -96,7 +114,7 @@ END $$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION ticket_state_commence(param_project_id bigint, param_ticket_type enum_ticket_type) +CREATE OR REPLACE FUNCTION ticket_state_commence(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_id bigint) RETURNS enum_ticket_state AS $$ DECLARE @@ -111,7 +129,7 @@ BEGIN ret := (SELECT ticket_state_initial(param_project_id, param_ticket_type)); WHILE ret IS NOT NULL LOOP - SELECT * INTO next_state FROM ticket_state_next(param_project_id, param_ticket_type, ret); + SELECT * INTO next_state FROM ticket_state_next(param_project_id, param_ticket_type, ret, param_ticket_id); IF NOT FOUND THEN ret := NULL; EXIT; diff --git a/src/Application/Model/ProjectTicketState.php b/src/Application/Model/ProjectTicketState.php index 89226f9..8868f9a 100644 --- a/src/Application/Model/ProjectTicketState.php +++ b/src/Application/Model/ProjectTicketState.php @@ -21,30 +21,30 @@ class ProjectTicketState extends Model { ]; // TODO: use Ticket::queryNextState / queryPreviousState? - public static function getNextState($project, $type, $state) { + public static function getNextState($project, $type, $state, $ticket) { $handle = Database::$Instance->query( - 'SELECT * FROM ticket_state_next(?, ?, ?)', - [$project, $type, $state] + 'SELECT * FROM ticket_state_next(?, ?, ?, ?)', + [$project, $type, $state, $ticket] ); $row = $handle->fetch(); return ($row === false)? null : $row; } - public static function getPreviousState($project, $type, $state) { + public static function getPreviousState($project, $type, $state, $ticket) { $handle = Database::$Instance->query( - 'SELECT * FROM ticket_state_previous(?, ?, ?)', - [$project, $type, $state] + 'SELECT * FROM ticket_state_previous(?, ?, ?, ?)', + [$project, $type, $state, $ticket] ); $row = $handle->fetch(); return ($row === false)? null : $row; } - public static function getCommenceState($project, $type) { + public static function getCommenceState($project, $type, $ticket) { $handle = Database::$Instance->query( - 'SELECT ticket_state_commence(?, ?)', - [$project, $type] + 'SELECT ticket_state_commence(?, ?, ?)', + [$project, $type, $ticket] ); return $handle->fetch()['ticket_state_commence']; diff --git a/src/Application/Model/Ticket.php b/src/Application/Model/Ticket.php index 3cbefe4..744bef3 100644 --- a/src/Application/Model/Ticket.php +++ b/src/Application/Model/Ticket.php @@ -855,12 +855,13 @@ public function queryPreviousState($state = null) { return (new Database_Query('')) ->select('ticket_state') ->from( - 'ticket_state_previous(?, ?, ?)', + 'ticket_state_previous(?, ?, ?, ?)', 'previous_state', [ $this['project_id'], $this['ticket_type'], - ($state === null)? $this['ticket_state'] : $state + ($state === null)? $this['ticket_state'] : $state, + $this['id'] ] ); } @@ -869,16 +870,17 @@ public function queryNextState($state = null) { return (new Database_Query('')) ->select('ticket_state') ->from( - 'ticket_state_next(?, ?, ?)', + 'ticket_state_next(?, ?, ?, ?)', 'next_state', [ $this['project_id'], $this['ticket_type'], - ($state === null)? $this['ticket_state'] : $state + ($state === null)? $this['ticket_state'] : $state, + $this['id'] ] ); } - + public function findNextForAction($state) { $next = null; From abc24c3d725efae49a4ed7cbc8c23b314657b28d Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Mon, 21 Aug 2017 13:39:12 +0200 Subject: [PATCH 02/16] add migration for skipping subencoding checks --- ...de_tables-2017-08-21-subencoding-skips.sql | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/Application/Migrations/__tmp_upgrade_tables-2017-08-21-subencoding-skips.sql diff --git a/src/Application/Migrations/__tmp_upgrade_tables-2017-08-21-subencoding-skips.sql b/src/Application/Migrations/__tmp_upgrade_tables-2017-08-21-subencoding-skips.sql new file mode 100644 index 0000000..3852198 --- /dev/null +++ b/src/Application/Migrations/__tmp_upgrade_tables-2017-08-21-subencoding-skips.sql @@ -0,0 +1,152 @@ +BEGIN; + +SET ROLE TO postgres; + +DROP FUNCTION ticket_state_next(bigint, enum_ticket_type, enum_ticket_state); +CREATE OR REPLACE FUNCTION ticket_state_next(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state, param_ticket_id bigint default NULL) + RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS +$$ +DECLARE +BEGIN + RETURN QUERY + SELECT + pts.ticket_state, pts.service_executable + FROM + tbl_ticket_state ts1 + JOIN + tbl_project_ticket_state pts ON pts.ticket_type = ts1.ticket_type AND pts.ticket_state = ts1.ticket_state + JOIN + tbl_ticket_state ts2 ON ts1.ticket_type = ts2.ticket_type AND ts1.sort > ts2.sort + WHERE + pts.project_id = param_project_id AND + ts2.ticket_type = param_ticket_type AND + ts2.ticket_state = param_ticket_state AND + (pts.skip_on_dependent = false OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL + ) + ORDER BY + ts1.sort ASC + LIMIT 1; + IF NOT FOUND THEN + RETURN QUERY SELECT NULL::enum_ticket_state, false; + END IF; +END +$$ +LANGUAGE plpgsql; + +DROP FUNCTION ticket_state_previous(bigint, enum_ticket_type, enum_ticket_state); +CREATE OR REPLACE FUNCTION ticket_state_previous(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state, param_ticket_id bigint default NULL) + RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS +$$ +DECLARE +BEGIN + RETURN QUERY + SELECT + pts.ticket_state, pts.service_executable + FROM + tbl_ticket_state ts1 + JOIN + tbl_project_ticket_state pts ON pts.ticket_type = ts1.ticket_type AND pts.ticket_state = ts1.ticket_state + JOIN + tbl_ticket_state ts2 ON ts1.ticket_type = ts2.ticket_type AND ts1.sort < ts2.sort + WHERE + pts.project_id = param_project_id AND + ts2.ticket_type = param_ticket_type AND + ts2.ticket_state = param_ticket_state AND + (pts.skip_on_dependent = false OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL + ) + ORDER BY + ts1.sort DESC + LIMIT 1; + IF NOT FOUND THEN + RETURN QUERY SELECT NULL::enum_ticket_state, false; + END IF; +END +$$ +LANGUAGE plpgsql; + +DROP FUNCTION ticket_state_commence(bigint, enum_ticket_type); +CREATE OR REPLACE FUNCTION ticket_state_commence(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_id bigint) + RETURNS enum_ticket_state AS +$$ +DECLARE + ret enum_ticket_state; + next_state record; +BEGIN + -- special case: meta ticket, since it has no serviceable states + IF param_ticket_type = 'meta' THEN + RETURN 'staged'::enum_ticket_state; + END IF; + + ret := (SELECT ticket_state_initial(param_project_id, param_ticket_type)); + + WHILE ret IS NOT NULL LOOP + SELECT * INTO next_state FROM ticket_state_next(param_project_id, param_ticket_type, ret, param_ticket_id); + IF NOT FOUND THEN + ret := NULL; + EXIT; + END IF; + + -- exit, if serviceable state is found + EXIT WHEN next_state.service_executable IS TRUE; + + -- otherwise set current state as possible commence state + ret := next_state.ticket_state; + END LOOP; + + RETURN ret; +END +$$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION update_ticket_next_state() + RETURNS trigger AS +$BODY$ +DECLARE + next_state record; +BEGIN + next_state := ticket_state_next(NEW.project_id, NEW.ticket_type, NEW.ticket_state, NEW.id); + + NEW.ticket_state_next := next_state.ticket_state; + NEW.service_executable := next_state.service_executable; + + RETURN NEW; +END +$BODY$ +LANGUAGE plpgsql VOLATILE; + +CREATE OR REPLACE FUNCTION update_all_tickets_progress_and_next_state(param_project_id bigint) + RETURNS VOID AS +$BODY$ +BEGIN + + UPDATE tbl_ticket t SET + (progress, ticket_state_next, service_executable) + = (tp, (n).ticket_state, (n).service_executable) + FROM ( + SELECT id, ticket_state_next(t2.project_id, t2.ticket_type, t2.ticket_state, t2.id) AS n, ticket_progress(t2.id) as tp + FROM tbl_ticket t2 + WHERE t2.project_id = param_project_id AND param_project_id IS NOT NULL + ) AS x + WHERE t.id = x.id; + +END; +$BODY$ +LANGUAGE plpgsql VOLATILE; + +ALTER TABLE tbl_project_ticket_state ADD COLUMN skip_on_dependent BOOLEAN NOT NULL DEFAULT FALSE; + +COMMIT; \ No newline at end of file From 1b95d4b3bdaaf1fa0eea5dcc75b8c57eeb1661f3 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Sun, 17 Sep 2017 21:00:10 +0200 Subject: [PATCH 03/16] add checkboxes for skip_on_dependent to state config view --- src/Application/Model/TicketState.php | 4 +++- src/Application/View/projects/settings/states.html.php | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Application/Model/TicketState.php b/src/Application/Model/TicketState.php index 8d195cb..dccc0f7 100644 --- a/src/Application/Model/TicketState.php +++ b/src/Application/Model/TicketState.php @@ -9,7 +9,9 @@ class TicketState extends Model { public $hasOne = [ 'ProjectTicketState' => [ 'foreign_key' => ['ticket_type', 'ticket_state'], - 'select' => '(ticket_state IS NOT NULL) AS project_enabled, service_executable AS project_service_executable' + 'select' => '(ticket_state IS NOT NULL) AS project_enabled,' . + 'service_executable AS project_service_executable,' . + 'skip_on_dependent AS project_skip_on_dependent' ] ]; diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 00d0352..5abfbc9 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -35,6 +35,7 @@ Type State Service + Skip for Subtickets @@ -62,6 +63,9 @@ checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], [], false); } ?> + checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], [], false); + } ?> register('States[' . $index . '][_destroy]'); ?> From ca2bc37c5babbe1775c308e56d129cb2c90bbfcf Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Thu, 21 Sep 2017 16:12:30 +0200 Subject: [PATCH 04/16] isSkippable in state model --- src/Application/Model/TicketState.php | 5 +++++ src/Application/View/projects/settings/states.html.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Application/Model/TicketState.php b/src/Application/Model/TicketState.php index dccc0f7..55265f6 100644 --- a/src/Application/Model/TicketState.php +++ b/src/Application/Model/TicketState.php @@ -33,6 +33,11 @@ public static function getStateByAction($action) { return self::$_actions[$action]; } + + public function isSkippable() { + return ($this['ticket_state'] === 'postencoded' || + $this['ticket_state'] === 'checking'); + } public function defaultScope(Model_Resource $resource) { $resource->orderBy('ticket_type, sort'); diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 5abfbc9..3df3f43 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -63,7 +63,7 @@ checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], [], false); } ?> - checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], [], false); } ?> From 94cd450cc391c04aa00bdb5fdab837a691a35824 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Thu, 21 Sep 2017 16:20:25 +0200 Subject: [PATCH 05/16] fix isSkippable --- src/Application/Model/TicketState.php | 6 +++--- src/Application/View/projects/settings/states.html.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Application/Model/TicketState.php b/src/Application/Model/TicketState.php index 55265f6..86cc92b 100644 --- a/src/Application/Model/TicketState.php +++ b/src/Application/Model/TicketState.php @@ -34,9 +34,9 @@ public static function getStateByAction($action) { return self::$_actions[$action]; } - public function isSkippable() { - return ($this['ticket_state'] === 'postencoded' || - $this['ticket_state'] === 'checking'); + public static function isSkippable($state) { + return ($state === 'postencoded' || + $state === 'checking'); } public function defaultScope(Model_Resource $resource) { diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 3df3f43..c1742b8 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -63,7 +63,7 @@ checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], [], false); } ?> - checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], [], false); } ?> From 7bf7ed1e2b68dc1822d121dfae1b5a8d13527073 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Thu, 21 Sep 2017 16:24:43 +0200 Subject: [PATCH 06/16] change wording: subticket -> dependent profile --- src/Application/View/projects/settings/states.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index c1742b8..cd0452f 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -35,7 +35,7 @@ Type State Service - Skip for Subtickets + Skip in dependent profiles From 4e5990e5838b9e5ad4402747223c827d59f80894 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Thu, 21 Sep 2017 16:33:08 +0200 Subject: [PATCH 07/16] move explanation to title --- src/Application/View/projects/settings/states.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index cd0452f..0eb3ed1 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -35,7 +35,7 @@ Type State Service - Skip in dependent profiles + Skip From 5b5347bff9c025b186d61e8a7be7bbaba29f321c Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Thu, 21 Sep 2017 16:46:47 +0200 Subject: [PATCH 08/16] more title text --- .../View/projects/settings/states.html.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 0eb3ed1..c1dab25 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -1,7 +1,9 @@ title('States | '); ?> render('projects/settings/_header'); ?> - $project['read_only']]); ?> @@ -34,8 +36,8 @@ Type State - Service - Skip + Service + Skip @@ -61,10 +63,10 @@ $f->hidden('States[' . $index . '][ticket_type]', $state['ticket_type']); ?> checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], [], false); + echo $f->checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], ['title' => $title_service], false); } ?> checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], [], false); + echo $f->checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], ['title' => $title_skip], false); } ?> register('States[' . $index . '][_destroy]'); ?> From 5ec3e8a43781b098ef2dbdec362b48a0634ce19a Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 12:35:14 +0200 Subject: [PATCH 09/16] change state settings view to one column layout --- .../View/projects/settings/states.html.php | 95 ++++++++++--------- 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index c1dab25..166847e 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -19,58 +19,61 @@ $encodingStates, (!empty($project))? $project['dependent_ticket_trigger_state'] : null) ?> +
$state): ?> 1): - $typeRows = 0; ?> - - -
- -
- - - - - - - - - - - - - - - - - - +
TypeStateServiceSkip
checkbox( - 'States[' . $index . '][ticket_state]', - $state['ticket_state'], - $state['project_enabled'], - ['value' => $state['ticket_state']] + + if ($type !== null): + // close previous table ?> +
+ + + + + + + + + + + + + + + + + + - - - - register('States[' . $index . '][_destroy]'); ?> - + false + ) . + $f->hidden('States[' . $index . '][ticket_type]', $state['ticket_type']); + ?> + + + + + register('States[' . $index . '][_destroy]'); + endforeach; ?>
TypeStateServiceSkip
+ checkbox( + 'States[' . $index . '][ticket_state]', + $state['ticket_state'], + $state['project_enabled'], + ['value' => $state['ticket_state']] + (($state['project_enabled'])? ['data-association-destroy' => 'States[' . $index . '][_destroy]'] : []), - false - ) . - $f->hidden('States[' . $index . '][ticket_type]', $state['ticket_type']); - ?>checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], ['title' => $title_service], false); - } ?>checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], ['title' => $title_skip], false); - } ?>
+ checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], ['title' => $title_service], false); + } ?> + + checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], ['title' => $title_skip], false); + } ?> +
From d2ee8bfa5e6c5a5ae9ecbd4fe12c73a5e3522d82 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 12:37:07 +0200 Subject: [PATCH 10/16] make checkbox columns bigger in state settings view --- src/Application/View/projects/settings/states.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 166847e..2b4e2a6 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -34,8 +34,8 @@ Type State - Service - Skip + Service + Master only From a3d3ebad5d54a50a06b263e0a40e4b3e9fba4911 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 12:38:48 +0200 Subject: [PATCH 11/16] center checkboxes in their columns in state settings view --- src/Application/View/projects/settings/states.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 2b4e2a6..c170166 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -61,12 +61,12 @@ $f->hidden('States[' . $index . '][ticket_type]', $state['ticket_type']); ?> - + checkbox('States[' . $index . '][service_executable]', null, $state['project_service_executable'], ['title' => $title_service], false); } ?> - + checkbox('States[' . $index . '][skip_on_dependent]', null, $state['project_skip_on_dependent'], ['title' => $title_skip], false); } ?> From 46c79173ab88e8b8b47526ab154e985a9dc1de85 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 12:40:31 +0200 Subject: [PATCH 12/16] center some column titles in state settings view --- src/Application/View/projects/settings/states.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index c170166..2b90912 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -34,8 +34,8 @@ Type State - Service - Master only + Service + Master only From f137a075fea7fc7f30724b3ff03c1b09d0e13742 Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 12:47:10 +0200 Subject: [PATCH 13/16] only show needed headings in state settings view --- .../View/projects/settings/states.html.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 2b90912..76c303f 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -27,6 +27,7 @@ // close previous table ?> +
@@ -34,8 +35,16 @@ - - + + From 31f5430cec77a328a43e70388267445aac38abae Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 14:50:24 +0200 Subject: [PATCH 14/16] hide tooltips for hidden column headers in state config view --- .../View/projects/settings/states.html.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index 76c303f..f81fbf8 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -27,22 +27,28 @@ // close previous table ?>
Type StateServiceMaster only + + Service + + + + Master only + +
+
+
- - @@ -85,5 +91,6 @@ endforeach; ?>
Type State + - Service + title="">Service + + > + - Master only + title="">Master only + + >
-
+ + From c0302436dad1c80a844712c579f8e5288e99e83b Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 13 Oct 2017 14:59:13 +0200 Subject: [PATCH 15/16] Enhance layout --- .../View/projects/settings/states.html.php | 18 ++++++++++++------ src/Public/css/main.css | 9 +++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Application/View/projects/settings/states.html.php b/src/Application/View/projects/settings/states.html.php index f81fbf8..41496e8 100644 --- a/src/Application/View/projects/settings/states.html.php +++ b/src/Application/View/projects/settings/states.html.php @@ -19,19 +19,25 @@ $encodingStates, (!empty($project))? $project['dependent_ticket_trigger_state'] : null) ?> -
- $state): ?> - + $state): + if ($type != $state['ticket_type']): $type = $state['ticket_type']; if ($type !== null): + if (!$firstType): // close previous table ?>
-
- -
+
diff --git a/src/Public/css/main.css b/src/Public/css/main.css index 26dcf55..7205a02 100644 --- a/src/Public/css/main.css +++ b/src/Public/css/main.css @@ -2542,6 +2542,15 @@ ul.project-settings-header li.current a.hooks:before { margin-left: 0.5em; } +.stages-container .column-50:nth-child(even) { + float:right; +} +.stages-container .column-50:nth-child(odd) { + + padding-right: 15px; + padding-left: 0; +} + .progress-width[data-progress="0"] { width: 0%; } .progress-width[data-progress="1"] { width: 1%; } .progress-width[data-progress="2"] { width: 2%; } From b5eacb96ee3405c7c14e6c3659bb08897890708b Mon Sep 17 00:00:00 2001 From: Markus Otto Date: Fri, 11 May 2018 15:28:46 +0200 Subject: [PATCH 16/16] WIP ticket_state_next params --- .../Migrations/15_function_ticket_state.sql | 89 +++++++++++++------ 1 file changed, 62 insertions(+), 27 deletions(-) diff --git a/src/Application/Migrations/15_function_ticket_state.sql b/src/Application/Migrations/15_function_ticket_state.sql index 0e93d8d..55ad941 100644 --- a/src/Application/Migrations/15_function_ticket_state.sql +++ b/src/Application/Migrations/15_function_ticket_state.sql @@ -2,7 +2,7 @@ BEGIN; SET ROLE TO postgres; -CREATE OR REPLACE FUNCTION ticket_state_next(param_project_id bigint, param_ticket_type enum_ticket_type, param_ticket_state enum_ticket_state, param_ticket_id bigint default NULL) +CREATE OR REPLACE FUNCTION ticket_state_next(param_ticket_id bigint) RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS $$ DECLARE @@ -11,26 +11,61 @@ BEGIN SELECT pts.ticket_state, pts.service_executable FROM - tbl_ticket_state ts1 + tbl_ticket t JOIN - tbl_project_ticket_state pts ON pts.ticket_type = ts1.ticket_type AND pts.ticket_state = ts1.ticket_state + tbl_ticket_state ts_this ON ts_this.ticket_type = t.ticket_type AND ts_this.ticket_state = t.ticket_state JOIN - tbl_ticket_state ts2 ON ts1.ticket_type = ts2.ticket_type AND ts1.sort > ts2.sort + tbl_project_ticket_state pts ON pts.project_id = t.project_id AND pts.ticket_type = t.ticket_type + JOIN + tbl_ticket_state ts_other ON ts_other.ticket_type = pts.ticket_type AND ts_other.ticket_state = pts.ticket_state WHERE - pts.project_id = param_project_id AND - ts2.ticket_type = param_ticket_type AND - ts2.ticket_state = param_ticket_state AND - (pts.skip_on_dependent = false OR - ( /* is master encoding ticket */ - SELECT ep.depends_on - FROM tbl_ticket t - JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id - JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id - WHERE t.id = param_ticket_id - ) IS NULL - ) - ORDER BY - ts1.sort ASC + t.id = param_ticket_id AND + ts_other.sort > ts_this.sort AND + (pts.skip_on_dependent = FALSE OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL ) + ORDER BY ts_other.sort ASC + LIMIT 1; + IF NOT FOUND THEN + RETURN QUERY SELECT NULL::enum_ticket_state, false; + END IF; +END +$$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION ticket_state_previous(param_ticket_id bigint) + RETURNS TABLE(ticket_state enum_ticket_state, service_executable boolean) AS + $$ +DECLARE +BEGIN + RETURN QUERY + SELECT + pts.ticket_state, pts.service_executable + FROM + tbl_ticket t + JOIN + tbl_ticket_state ts_this ON ts_this.ticket_type = t.ticket_type AND ts_this.ticket_state = t.ticket_state + JOIN + tbl_project_ticket_state pts ON pts.project_id = t.project_id AND pts.ticket_type = t.ticket_type + JOIN + tbl_ticket_state ts_other ON ts_other.ticket_type = pts.ticket_type AND ts_other.ticket_state = pts.ticket_state + WHERE + t.id = param_ticket_id AND + ts_other.sort < ts_this.sort AND + (pts.skip_on_dependent = FALSE OR + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL ) + ORDER BY ts_other.sort DESC LIMIT 1; IF NOT FOUND THEN RETURN QUERY SELECT NULL::enum_ticket_state, false; @@ -58,13 +93,13 @@ BEGIN ts2.ticket_type = param_ticket_type AND ts2.ticket_state = param_ticket_state AND (pts.skip_on_dependent = false OR - ( /* is master encoding ticket */ - SELECT ep.depends_on - FROM tbl_ticket t - JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id - JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id - WHERE t.id = param_ticket_id - ) IS NULL + ( /* is master encoding ticket */ + SELECT ep.depends_on + FROM tbl_ticket t + JOIN tbl_encoding_profile_version epv ON epv.id = t.encoding_profile_version_id + JOIN tbl_encoding_profile ep ON ep.id = epv.encoding_profile_id + WHERE t.id = param_ticket_id + ) IS NULL ) ORDER BY ts1.sort DESC @@ -129,7 +164,7 @@ BEGIN ret := (SELECT ticket_state_initial(param_project_id, param_ticket_type)); WHILE ret IS NOT NULL LOOP - SELECT * INTO next_state FROM ticket_state_next(param_project_id, param_ticket_type, ret, param_ticket_id); + SELECT * INTO next_state FROM ticket_state_next(param_ticket_id); IF NOT FOUND THEN ret := NULL; EXIT; @@ -147,4 +182,4 @@ END $$ LANGUAGE plpgsql; -COMMIT; \ No newline at end of file +COMMIT;