/** * Get sections. * * @return unknown */ public function getSections() { if (!is_null($this->_sections)) { return $this->_sections; } $this->_sections = []; foreach ($this->_children as $rel) { if (!$rel->active) { continue; } // if ($rel->isHasOne()) { continue; } $child = $rel->child; $instanceSettings = ['relationship' => $rel, 'queryRole' => 'children']; $items = Yii::$app->collectors['widgets']->getLocation('parent_objects', $child); foreach ($items as $item) { $widgetObject = $item->object; $item->settings = $instanceSettings; $section = $item->getSection($widgetObject, $instanceSettings); if (empty($section)) { continue; } if (!isset($this->_sections[$item->section->systemId])) { $this->_sections[$section->systemId] = $section; } $this->_sections[$section->systemId]->register($this, $item); } } foreach ($this->_parents as $rel) { if (!$rel->active) { continue; } if ($rel->isHasOne()) { continue; } $parent = $rel->parent; $instanceSettings = ['relationship' => $rel, 'queryRole' => 'parents']; $items = Yii::$app->collectors['widgets']->getLocation('child_objects', $parent); foreach ($items as $item) { $item->settings = $instanceSettings; $section = $item->getSection($this->object); if (empty($section)) { continue; } if (!isset($this->_sections[$item->section->systemId])) { $this->_sections[$section->systemId] = $section; } $this->_sections[$section->systemId]->register($this, $item); } } $items = Yii::$app->collectors['widgets']->getLocation('self', $this->object); foreach ($items as $item) { $item->settings = $instanceSettings; $section = $item->getSection($this->object); if (empty($section)) { continue; } if (!isset($this->_sections[$item->section->systemId])) { $this->_sections[$section->systemId] = $section; } $this->_sections[$section->systemId]->register($this, $item); } ArrayHelper::multisort($this->_sections, ['priority', 'sectionTitle'], [SORT_ASC, SORT_ASC]); return $this->_sections; }
<?php /** * @var yii\base\View */ use canis\helpers\ArrayHelper; use canis\helpers\Html; use canis\daemon\widgets\ExtendedStatus as DaemonStatus; \canis\web\assetBundles\CanisLogViewerAsset::register($this); ArrayHelper::multisort($tasks, 'title'); $this->title = 'Administration'; // $this->params['breadcrumbs'][] = ['label' => 'Administration', 'url' => ['/admin/index']]; $this->params['breadcrumbs'][] = ['label' => $this->title]; echo Html::beginTag('div', ['class' => 'panel panel-default']); echo Html::beginTag('div', ['class' => 'panel-heading']); echo Html::beginTag('h3', ['class' => 'panel-title']); echo Html::beginTag('div', ['class' => 'btn-group btn-group-sm pull-right']); echo Html::endTag('div'); echo 'Administration Tasks'; echo Html::endTag('h3'); echo Html::endTag('div'); echo Html::beginTag('div', ['class' => 'panel-body']); echo Html::beginTag('div', ['class' => 'list-group']); foreach ($tasks as $taskId => $task) { $dataHandler = ''; if (!isset($task['url'])) { $dataHandler = 'background'; $task['url'] = ['/admin/index', 'task' => $taskId]; } echo Html::a(Html::tag('h4', $task['title'], ['class' => 'list-group-item-heading']) . Html::tag('div', $task['description'], ['class' => 'list-group-item-text']), $task['url'], ['class' => 'list-group-item', 'data-handler' => $dataHandler]); }
<?php use canis\helpers\ArrayHelper; use canis\helpers\Html; use canis\web\grid\Cell; use canis\web\grid\Grid; use yii\helpers\Url; $js = []; $this->title = 'Dashboard'; $refreshable = ['url' => Url::to(['/app/stream']), 'stream' => true, 'data' => ['baseInstructions' => []]]; $this->bodyHtmlOptions['data-refreshable'] = json_encode($refreshable); echo Html::beginTag('div', ['class' => 'ic-dashboard row']); Yii::beginProfile("Build Grid"); $widgets = Yii::$app->collectors['widgets']->getLocation('front'); ArrayHelper::multisort($widgets, ['priority', 'name'], [SORT_ASC, SORT_ASC]); $topGrid = new Grid(); $watchingWidget = Yii::$app->collectors['widgets']->getOne('WatchingContent'); $watchingCell = Yii::$app->collectors['widgets']->build(null, $watchingWidget, [], ['columns' => 6]); $topGrid->currentRow->addCell($watchingCell); $itemsCell = $topGrid->currentRow->addCell(new Cell(['columns' => 6])); $widgetGrid = new Grid(); Html::addCssClass($widgetGrid->htmlOptions, 'ic-front-side'); $js[] = '$("#' . $widgetGrid->id . '").canisAffix();'; $widgetGrid->baseRow = ['trueWidth' => 6]; $cells = []; Yii::beginProfile("Collect Widgets"); foreach ($widgets as $item => $widget) { $cells[] = Yii::$app->collectors['widgets']->build(null, $widget, [], []); } Yii::endProfile("Collect Widgets"); $widgetGrid->cells = $cells;
/** * @param unknown $model (optional) * @param unknown $univeralFieldSettings (optional) * * @return unknown */ public function getFields($owner = null) { if (!isset($this->_fields)) { $disabledFields = $this->objectType->disabledFields; $modelName = self::className(); $this->_fields = []; $fieldSettings = $this->fieldSettings(); $aliases = []; foreach (self::getTableSchema()->columns as $name => $column) { if (in_array($name, $disabledFields)) { continue; } $settings = []; if (isset($fieldSettings[$name])) { $settings = array_merge_recursive($settings, $fieldSettings[$name]); } if (isset($settings['alias'])) { $aliases[$name] = $settings['alias']; unset($settings['alias']); } if (is_array($column)) { $column = $this->createColumnSchema($name, $column); } $this->_fields[$name] = $this->createField($column, $owner, $settings); } $objectTypeItem = $this->objectTypeItem; if ($objectTypeItem) { $relationRelationship = null; $relationClass = Yii::$app->classes['Relation']; $taxonomies = $objectTypeItem->taxonomies; foreach ($objectTypeItem->parents as $relationship) { $fieldName = 'parent:' . $relationship->parent->systemId; if (in_array($fieldName, $disabledFields)) { continue; } $fieldSchema = $this->createColumnSchema($fieldName, ['type' => 'relation', 'phpType' => 'object', 'dbType' => 'relation', 'allowNull' => true]); $settings = []; if (isset($fieldSettings[$fieldName])) { $settings = array_merge_recursive($settings, $fieldSettings[$fieldName]); } if (isset($settings['alias'])) { $aliases[$fieldName] = $settings['alias']; unset($settings['alias']); } $settings['modelRole'] = 'child'; $settings['relationship'] = $relationship; $this->_fields[$fieldName] = $this->createRelationField($fieldSchema, $owner, $settings); } foreach ($objectTypeItem->children as $relationship) { $fieldName = 'child:' . $relationship->child->systemId; if (in_array($fieldName, $disabledFields)) { continue; } $fieldSchema = $this->createColumnSchema($fieldName, ['type' => 'relation', 'phpType' => 'object', 'dbType' => 'relation', 'allowNull' => true]); $settings = []; if (isset($fieldSettings[$fieldName])) { $settings = array_merge_recursive($settings, $fieldSettings[$fieldName]); } if (isset($settings['alias'])) { $aliases[$fieldName] = $settings['alias']; unset($settings['alias']); } $settings['modelRole'] = 'parent'; $settings['relationship'] = $relationship; $this->_fields[$fieldName] = $this->createRelationField($fieldSchema, $owner, $settings); } foreach ($taxonomies as $taxonomy) { if (!in_array(self::className(), $taxonomy->models)) { continue; } $fieldName = 'taxonomy:' . $taxonomy->systemId; if (in_array($fieldName, $disabledFields)) { continue; } $fieldSchema = $this->createColumnSchema($fieldName, ['type' => 'taxonomy', 'phpType' => 'object', 'dbType' => 'taxonomy', 'allowNull' => true]); $settings = []; if (isset($fieldSettings[$fieldName])) { $settings = array_merge_recursive($settings, $fieldSettings[$fieldName]); } if (isset($settings['alias'])) { $aliases[$fieldName] = $settings['alias']; unset($settings['alias']); } $settings['model'] = $this; $this->_fields[$fieldName] = $this->createTaxonomyField($fieldSchema, $taxonomy, $owner); } } foreach ($this->additionalFields() as $name => $column) { if (in_array($name, $disabledFields)) { continue; } $settings = []; if (isset($fieldSettings[$name])) { $settings = array_merge_recursive($settings, $fieldSettings[$name]); } if (isset($settings['alias'])) { $aliases[$name] = $settings['alias']; unset($settings['alias']); } if (is_string($column) && isset($this->_fields[$column])) { $this->_fields[$name] = $this->duplicateField($name, $this->_fields[$column], $owner, $settings); } elseif (is_array($column)) { $column = $this->createColumnSchema($name, $column); $this->_fields[$name] = $this->createField($column, $owner, $settings); } else { $this->_fields[$name] = $this->createField($column, $owner, $settings); } } foreach ($aliases as $from => $to) { if (isset($this->_fields[$to])) { $this->_fields[$from] = $this->_fields[$to]; } } $currentKeys = array_keys($this->_fields); foreach ($this->_fields as $name => $field) { if (!isset($field->priority)) { $field->priority = (int) array_search($name, $currentKeys); $field->priority = $field->priority * 100; } } $this->_fields['relationTaxonomies'] = $this->createRelationTaxonomyField($owner, []); ArrayHelper::multisort($this->_fields, 'priority', SORT_ASC); } if (!empty($owner)) { foreach ($this->_fields as $field) { if (!$field->formField) { continue; } $field->formField->owner = $owner; } } return $this->_fields; }
/** * [[@doctodo method_description:searchLocal]]. * * @param cascade\components\dataInterface\DataItem $item [[@doctodo param_description:item]] * @param array $searchParams [[@doctodo param_description:searchParams]] [optional] * * @return [[@doctodo return_type:searchLocal]] [[@doctodo return_description:searchLocal]] */ public function searchLocal(DataItem $item, $searchParams = []) { if (empty($searchParams['searchFields'])) { $searchParams['searchFields'] = $this->localFields; } if (empty($searchParams['searchFields'])) { return; } if (!isset($searchParams['limit'])) { $searchParams['limit'] = 5; } $searchParams['skipForeign'] = true; $query = []; foreach ($this->foreignFields as $field) { if (!empty($item->foreignObject->{$field})) { $value = $item->foreignObject->{$field}; if (isset($this->foreignFilter)) { $value = call_user_func($this->foreignFilter, $value); } $query[] = $value; } } if (empty($query)) { return; } $localClass = $this->dataSource->localModel; $searchResults = $localClass::searchTerm(implode(' ', $query), $searchParams); $resultsLeft = $totalResults = count($searchResults); foreach ($searchResults as $k => $r) { // if ($r->descriptor === $query[0]) { continue; } $score = $resultsLeft / $totalResults * 100 * 0.2 + StringHelper::compareStrings($r->descriptor, implode(' ', $query)) * 0.8; $r->score = $score; if ($score < $this->threshold) { unset($searchResults[$k]); } else { $reverseKey = $this->dataSource->getReverseKeyTranslation($r->id); if (!empty($reverseKey)) { unset($searchResults[$k]); } } $resultsLeft--; } ArrayHelper::multisort($searchResults, 'scoreSort', SORT_DESC); $searchResults = array_values($searchResults); if (empty($searchResults)) { return; } elseif ($safeResult = $this->getSafeResult($searchResults)) { $this->dataSource->task->addInfo('Auto-matched "' . implode(' ', $query) . '" to "' . $safeResult->descriptor . '" (Score: ' . round($safeResult->score, 2) . ')', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'localObject' => ['id' => $safeResult->id, 'descriptor' => $safeResult->descriptor]]); return $safeResult->object; } else { $options = []; $resultsNice = []; $optionNumber = 1; $defaultOption = 'new'; if ($searchResults[0]->score > $this->defaultOptionThreshold) { $defaultOption = '1'; } foreach ($searchResults as $result) { $resultsNice['' . $optionNumber] = $result; $options['' . $optionNumber] = $result->descriptor . ' (' . round($result->score) . '%)'; $optionNumber++; } $options['new'] = 'Create New Object'; $options['selectObject'] = 'Select Object'; $select = false; $interactionOptions = ['inputType' => 'select', 'options' => $options]; $interactionOptions['details'] = $item->foreignObject->attributes; $interactionOptions['default'] = $defaultOption; $callback = ['callback' => function ($response) use(&$select, $options) { if (empty($response)) { return false; } if (substr($response, 0, 2) !== '*-' && !isset($options[$response])) { return false; } $select = $response; return true; }]; if (!$this->dataSource->action->createInteraction('Match Object (' . implode(' ', $query) . ')', $interactionOptions, $callback)) { return false; } if ($select === 'new') { $this->dataSource->task->addInfo('For "' . implode(' ', $query) . '" user chose to to create new object', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes]); return; } elseif (substr($select, 0, 2) === '*-') { $matchedObjectId = substr($select, 2); $matchedObject = Registry::getObject($matchedObjectId, false); if (!$matchedObject) { $this->dataSource->task->addWarning('For "' . implode(' ', $query) . '" user tried to match it to a different object, but object wasn\'t found! Created new object.', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'matchedObject' => $matchedObjectId]); return; } $this->dataSource->task->addInfo('For "' . implode(' ', $query) . '" matched to an existing object "' . $matchedObject->descriptor . '"', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'matchedObject' => $matchedObject->attributes]); return $matchedObject; } else { $this->dataSource->task->addInfo('User matched "' . implode(' ', $query) . '" to "' . $resultsNice[$select]->descriptor . '"', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'localObject' => $resultsNice[$select]->id]); return $resultsNice[$select]->object; } } }
/** * [[@doctodo method_description:actionSearch]]. * * @return [[@doctodo return_type:actionSearch]] [[@doctodo return_description:actionSearch]] */ public function actionSearch() { $package = []; $defaultParams = ['typeFilters' => []]; $searchParams = array_merge($defaultParams, $_GET); if (empty($searchParams['term'])) { Yii::$app->response->data = $package; return; } if (isset($searchParams['modules']) && !is_array($searchParams['modules'])) { $searchParams['modules'] = implode(',', $searchParams['modules']); } $modules = isset($searchParams['modules']) ? (array) $searchParams['modules'] : array_keys(Yii::$app->collectors['types']->getAll()); $params = ['ignore' => [], 'ignoreChildren' => [], 'ignoreParents' => []]; if (!empty($searchParams['ignore'])) { $params['ignore'] = (array) $searchParams['ignore']; } if (!empty($searchParams['ignoreChildren'])) { $params['ignoreChildren'] = (array) $searchParams['ignoreChildren']; } if (!empty($searchParams['ignoreParents'])) { $params['ignoreParents'] = (array) $searchParams['ignoreParents']; } $params['action'] = 'read'; $params['modules'] = $modules; $term = $searchParams['term']; $params['limit'] = 8; $scores = []; foreach ($modules as $module) { $moduleItem = Yii::$app->collectors['types']->getOne($module); if (!$moduleItem || !($moduleObject = $moduleItem->object)) { continue; } if (!(isset($searchParams['modules']) && in_array($moduleItem->systemId, $searchParams['modules'])) && empty($moduleItem->object->searchWeight)) { continue; } if (in_array('authority', $searchParams['typeFilters']) && $moduleItem->object->getBehavior('Authority') === null) { continue; } if (in_array('dashboard', $searchParams['typeFilters']) && !$moduleItem->object->hasDashboard) { continue; } $moduleResults = $moduleObject->search($term, $params); foreach ($moduleResults as $r) { $package[] = $r; } } ArrayHelper::multisort($package, 'scoreSort', SORT_DESC); foreach (array_slice($package, 0, 30) as $key => $result) { $package[$key] = $result->toArray(); } Yii::$app->response->data = $package; }
/** * Get widgets. * * @return [[@doctodo return_type:getWidgets]] [[@doctodo return_description:getWidgets]] */ public function getWidgets() { $widgets = $this->collectorItem->getAll(); ArrayHelper::multisort($widgets, ['object.priority', 'object.name'], [SORT_ASC, SORT_ASC]); return $widgets; }
/** * @inheritdoc */ public function getItems() { $instructions = $this->instructions; $items = []; if (!isset($instructions['typeFilters'])) { $instructions['typeFilters'] = []; } elseif (!is_array($instructions['typeFilters'])) { $instructions['typeFilters'] = [$instructions['typeFilters']]; } if (!isset($instructions['modules'])) { $instructions['modules'] = false; } if (isset($instructions['relationshipRole'])) { if (!isset($instructions['relationship'])) { throw new InvalidConfigException("Relationship type tasks require a relationship ID"); } $relationship = Relationship::getById($instructions['relationship']); if (empty($relationship)) { throw new InvalidConfigException("Relationship type tasks require a relationship"); } if ($instructions['relationshipRole'] === 'parent') { $relationships = $relationship->parent->collectorItem->parents; $baseType = $relationship->parent; } else { $relationships = $relationship->child->collectorItem->parents; $baseType = $relationship->child; } $types = ArrayHelper::map($relationships, 'parent.systemId', 'parent'); $types[$baseType->systemId] = $baseType; } else { $typesRaw = Yii::$app->collectors['types']->getAll(); $types = ArrayHelper::map($typesRaw, 'object.systemId', 'object'); } unset($types['']); foreach ($types as $typeKey => $type) { if (isset($instructions['limitTypes'])) { if (!in_array($typeKey, $instructions['limitTypes'])) { continue; } } if (in_array('hasDashboard', $instructions['typeFilters']) && !$type->hasDashboard) { continue; } if (in_array('authority', $instructions['typeFilters']) && $type->getBehavior('Authority') === null) { continue; } $item = ['type' => 'type', 'id' => $type->systemId, 'descriptor' => $type->title->upperPlural, 'hasChildren' => !empty($type->collectorItem->children) || $instructions['modules'] !== false && in_array($type->systemId, $instructions['modules'])]; if ($item['hasChildren'] && (!$this->filterQuery || preg_match('/' . preg_quote($this->filterQuery) . '/i', $item['descriptor']) === 1)) { $items[] = $item; } } if (!$this->filterQuery) { ArrayHelper::multisort($items, 'descriptor', SORT_ASC); } else { $filterQuery = $this->filterQuery; usort($items, function ($a, $b) use($filterQuery) { $a = levenshtein($a['descriptor'], $filterQuery); $b = levenshtein($b['descriptor'], $filterQuery); return $a < $b ? -1 : 1; }); } return $items; }