From 005faacf20b0a61b45f108b0f88ba44eb823602a Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 30 Nov 2021 14:26:23 -0800 Subject: [PATCH] mixin/case-xml - Import --- .../example/tests/mixin/CaseTypeTest.php | 46 ++++++++++++ .../case-xml@1/example/xml/case/DuckDance.xml | 73 +++++++++++++++++++ mixin/case-xml@1/mixin.php | 41 +++++++++++ 3 files changed, 160 insertions(+) create mode 100644 mixin/case-xml@1/example/tests/mixin/CaseTypeTest.php create mode 100644 mixin/case-xml@1/example/xml/case/DuckDance.xml create mode 100644 mixin/case-xml@1/mixin.php diff --git a/mixin/case-xml@1/example/tests/mixin/CaseTypeTest.php b/mixin/case-xml@1/example/tests/mixin/CaseTypeTest.php new file mode 100644 index 0000000000..326a083c9b --- /dev/null +++ b/mixin/case-xml@1/example/tests/mixin/CaseTypeTest.php @@ -0,0 +1,46 @@ +assertFileExists(static::getPath('/xml/case/DuckDance.xml'), 'The shimmy extension must have a Case XML file.'); + } + + public function testInstalled($cv) { + $items = $cv->api4('CaseType', 'get', ['where' => [['name', '=', 'DuckDance']]]); + $this->assertEquals('The mysterious case of the dancing duck', $items[0]['description']); + $this->assertEquals('DuckDance', $items[0]['name']); + $this->assertEquals('Duck Dance Case', $items[0]['title']); + $this->assertEquals(TRUE, $items[0]['is_active']); + $this->assertEquals(1, count($items)); + } + + public function testDisabled($cv) { + $items = $cv->api4('CaseType', 'get', ['where' => [['name', '=', 'DuckDance']]]); + $this->assertEquals('The mysterious case of the dancing duck', $items[0]['description']); + $this->assertEquals('DuckDance', $items[0]['name']); + $this->assertEquals('Duck Dance Case', $items[0]['title']); + $this->assertEquals(FALSE, $items[0]['is_active']); + $this->assertEquals(1, count($items)); + } + + public function testUninstalled($cv) { + $items = $cv->api4('CaseType', 'get', ['where' => [['name', '=', 'DuckDance']]]); + $this->assertEquals(0, count($items)); + } + + protected static function getPath($suffix = ''): string { + return dirname(__DIR__, 2) . $suffix; + } + +} diff --git a/mixin/case-xml@1/example/xml/case/DuckDance.xml b/mixin/case-xml@1/example/xml/case/DuckDance.xml new file mode 100644 index 0000000000..7bbf178371 --- /dev/null +++ b/mixin/case-xml@1/example/xml/case/DuckDance.xml @@ -0,0 +1,73 @@ + + Duck Dance Case + The mysterious case of the dancing duck + + + + + + Open Case + 1 + + + Follow up + + + Change Case Type + + + Change Case Status + + + Change Case Start Date + + + Link Cases + + + + + Email + + + Meeting + + + Phone Call + + + + + + + standard_timeline + + true + + + Open Case + Completed + + + Phone Call + 1 + newest + + + Follow up + 7 + newest + + + + + + + + Case Coordinator + 1 + 1 + + + + diff --git a/mixin/case-xml@1/mixin.php b/mixin/case-xml@1/mixin.php new file mode 100644 index 0000000000..649c51e3c6 --- /dev/null +++ b/mixin/case-xml@1/mixin.php @@ -0,0 +1,41 @@ +addListener('hook_civicrm_caseTypes', function ($e) use ($mixInfo) { + // When deactivating on a polyfill/pre-mixin system, listeners may not cleanup automatically. + + if (!$mixInfo->isActive() || !is_dir($mixInfo->getPath('xml/case'))) { + return; + } + + foreach ((array) glob($mixInfo->getPath('xml/case/*.xml')) as $file) { + $name = preg_replace('/\.xml$/', '', basename($file)); + if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) { + $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name)); + throw new CRM_Core_Exception($errorMessage); + } + $e->caseTypes[$name] = [ + 'module' => $mixInfo->longName, + 'name' => $name, + 'file' => $file, + ]; + } + }); + +}; -- 2.25.1