diff --git a/Controller/RecurrenceController.php b/Controller/RecurrenceController.php index b3828ec..0b71770 100644 --- a/Controller/RecurrenceController.php +++ b/Controller/RecurrenceController.php @@ -19,9 +19,10 @@ class RecurrenceController extends BaseController { $task = $this->getTask(); $columns = $this->targetColumns($task); + $meta = $this->taskMetadataModel->getAll($task['id']); if (empty($values)) { - $values = $this->getStoredValues($task, $columns); + $values = $this->getStoredValues($meta, $task, $columns); } $this->response->html($this->template->render('recoReco:recurrence/edit', array( @@ -33,6 +34,8 @@ class RecurrenceController extends BaseController 'has_due_date' => ! empty($task['date_due']), 'is_native' => $task['recurrence_status'] != TaskModel::RECURRING_STATUS_NONE, 'has_target' => ! empty($columns), + 'is_clone' => isset($meta['recoreco_clone']) && $meta['recoreco_clone'] == 1, + 'source_id' => isset($meta['recoreco_source']) ? (int) $meta['recoreco_source'] : 0, ))); } @@ -42,9 +45,14 @@ class RecurrenceController extends BaseController $input = $this->request->getValues(); $columns = $this->targetColumns($task); - // Only a plain card (a due date, not native-recurring, and a valid target) may be enabled. + // A clone can never be made recurring (that would recurse). Guard even though the modal + // hides the form for clones. + $is_clone = (int) $this->taskMetadataModel->get($task['id'], 'recoreco_clone', 0) === 1; + + // Only a plain card (a due date, not native-recurring, not a clone, a valid target) may enable. $can_recur = ! empty($task['date_due']) && $task['recurrence_status'] == TaskModel::RECURRING_STATUS_NONE + && ! $is_clone && ! empty($columns); $enabled = ($can_recur && isset($input['recoreco_enabled']) && $input['recoreco_enabled'] == 1) ? 1 : 0; @@ -104,10 +112,8 @@ class RecurrenceController extends BaseController return empty($keys) ? 0 : (int) $keys[0]; } - private function getStoredValues(array $task, array $columns) + private function getStoredValues(array $meta, array $task, array $columns) { - $meta = $this->taskMetadataModel->getAll($task['id']); - return array( 'recoreco_enabled' => isset($meta['recoreco_enabled']) ? (int) $meta['recoreco_enabled'] : 0, 'recoreco_target_column' => $this->resolveTarget(isset($meta['recoreco_target_column']) ? $meta['recoreco_target_column'] : 0, $columns), diff --git a/Helper/RecoRecoHelper.php b/Helper/RecoRecoHelper.php new file mode 100644 index 0000000..2c55b7f --- /dev/null +++ b/Helper/RecoRecoHelper.php @@ -0,0 +1,38 @@ +taskMetadataModel->getAll($task['id']); + + if (isset($meta['recoreco_enabled']) && $meta['recoreco_enabled'] == 1) { + return 'template'; + } + + if (isset($meta['recoreco_clone']) && $meta['recoreco_clone'] == 1) { + return 'clone'; + } + + return ''; + } +} diff --git a/Plugin.php b/Plugin.php index 04dff8f..79dc5e1 100644 --- a/Plugin.php +++ b/Plugin.php @@ -17,6 +17,9 @@ class Plugin extends Base 'template' => 'plugins/RecoReco/Asset/js/recoreco-modal.js', )); + // Board card icon: black on a recurring template, white (inverse) on a generated copy. + $this->template->hook->attach('template:board:task:icons', 'recoReco:board/task_icon'); + // The scheduling engine runs from the CLI (cron). Registered CLI-only so web requests do // not build the console app. if (php_sapi_name() === 'cli') { @@ -24,6 +27,13 @@ class Plugin extends Base } } + public function getHelpers() + { + return array( + 'Plugin\RecoReco\Helper' => array('RecoRecoHelper'), + ); + } + public function getPluginName() { return 'RecoReco'; @@ -41,7 +51,7 @@ class Plugin extends Base public function getPluginVersion() { - return '1.1.2'; + return '1.2.0'; } public function getPluginHomepage() diff --git a/Template/board/task_icon.php b/Template/board/task_icon.php new file mode 100644 index 0000000..cb1cf51 --- /dev/null +++ b/Template/board/task_icon.php @@ -0,0 +1,10 @@ +RecoRecoHelper->iconType($task) ?> + + + + + + + + + diff --git a/Template/recurrence/edit.php b/Template/recurrence/edit.php index 92f33fe..239bd4c 100644 --- a/Template/recurrence/edit.php +++ b/Template/recurrence/edit.php @@ -9,47 +9,60 @@ - + - -
= t('Please set a due date first. RecoReco uses the card due date as the recurrence anchor.') ?>
-- = t('This card uses Kanboard built-in recurrence.') ?> - = $this->url->link(t('Edit built-in recurrence'), 'TaskRecurrenceController', 'edit', array('task_id' => $task['id']), false, 'js-modal-medium') ?> + = t('This card is a copy generated by RecoReco, so it cannot itself be made recurring.') ?> + + = $this->url->link(t('Open the recurring template'), 'TaskViewController', 'show', array('task_id' => $source_id)) ?> +
- -= t('Add a target column first.') ?>
+ + + + + + += t('Please set a due date first. RecoReco uses the card due date as the recurrence anchor.') ?>
+ ++ = t('This card uses Kanboard built-in recurrence.') ?> + = $this->url->link(t('Edit built-in recurrence'), 'TaskRecurrenceController', 'edit', array('task_id' => $task['id']), false, 'js-modal-medium') ?> +
+ += t('Add a target column first.') ?>
+ + + + - - diff --git a/VERSION b/VERSION index 19b0cbe..289ba64 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -RecoReco v1.1.2 +RecoReco v1.2