private LinkingNode[] GetLinkingNodes(Tagonomy tagonomy)
        {
            var nodes = tagonomy.Nodes
                        .Where(x => x.ElementsArray.Any(e => e is ReferenceNodeElement))
                        .Select(x => new LinkingNode
            {
                Node       = x,
                References = x.GetElements <ReferenceNodeElement>()
            }).ToArray();

            return(nodes);
        }
        private async Task PopulateData()
        {
            if (HyperStore == null || string.IsNullOrWhiteSpace(TagonomyId))
            {
                return;
            }

            var documentId  = HyperDocumentId.Create <Tagonomy>(TagonomyId);
            var argTagonomy = new RetrieveHyperDocumentArgs(documentId);
            var doc         = await HyperStore.ExecuteAsync(argTagonomy);

            if (argTagonomy.ExecutionResult.IsNotSuccess)
            {
                return;
            }

            _rootTagonomy = doc?.GetPayload <Tagonomy>();

            _unprocessedSourceTagonomies.Clear();
            _processedSourceTagonomies.Clear();


            var args = new FindHyperDocumentsArgs(typeof(Tagonomy), true);

            _allTagonomies = ((await this.HyperStore.ExecuteAsyncThrows(args)) ?? new Node.Common.HyperDocument[0])
                             .Select(x => x.GetPayload <Tagonomy>())
                             .ToArray();

            _unprocessedSourceTagonomies.Add(_rootTagonomy.Id, _rootTagonomy);

            while (_unprocessedSourceTagonomies.Any())
            {
                foreach (var unprocTagonomie in _unprocessedSourceTagonomies.Select(x => x.Value).ToArray())
                {
                    var linkingNodesInner = GetLinkingNodes(unprocTagonomie);
                    ProcessLinkingNodes(linkingNodesInner, unprocTagonomie, true);
                }
            }

            GoBackwards();
        }
Пример #3
0
 public async Task EditAsync(Tagonomy item)
 {
     await OnEdit.InvokeAsync(item);
 }
Пример #4
0
 public async Task ManageAsync(Tagonomy item)
 {
     await OnManage.InvokeAsync(item);
 }
Пример #5
0
 public void ShowPropertyGrid(Tagonomy item)
 {
     SelectedItem   = item;
     IsShowProperty = true;
 }
        /// <summary>
        /// Processes all linking nodes of a single source Tagonomy.
        /// </summary>
        private void ProcessLinkingNodes(LinkingNode[] linkingNodes, Tagonomy sourceTagonomy, bool forwardLinking)
        {
            if (sourceTagonomy == null && linkingNodes.Any())
            {
                var id = linkingNodes.First().Node.TagonomyId;
                sourceTagonomy = _allTagonomies.FirstOrDefault(x => x.Id == id);
            }

            if (sourceTagonomy == null)
            {
                return;                 // TODO: Log error
            }
            if (forwardLinking)
            {
                _unprocessedSourceTagonomies.Remove(sourceTagonomy.Id);
            }
            _processedSourceTagonomies.Add(sourceTagonomy.Id, sourceTagonomy);

            foreach (var linkingNode in linkingNodes)
            {
                foreach (var reference in linkingNode.References)
                {
                    var targetTagonomy = _allTagonomies.FirstOrDefault(x => x.Id == reference.TagonomyDocumentId.Id);

                    if (targetTagonomy == null)
                    {
                        continue;                         // TODO: Log error
                    }
                    var link = Links.FirstOrDefault(x => x.SourceTagonomy == sourceTagonomy && x.TargetTagonomy == targetTagonomy);

                    if (link == null)
                    {
                        link = new TagonomiesLink
                        {
                            SourceTagonomy = sourceTagonomy,
                            TargetTagonomy = targetTagonomy,
                            IsForwardLink  = forwardLinking
                        };
                        Links.Add(link);

                        if (forwardLinking)
                        {
                            if (!_unprocessedSourceTagonomies.ContainsKey(targetTagonomy.Id) && !_processedSourceTagonomies.ContainsKey(targetTagonomy.Id))
                            {
                                _unprocessedSourceTagonomies.Add(targetTagonomy.Id, targetTagonomy);
                            }
                        }
                    }

                    if (!link.ReferencedNodes.Any(r => r.ReferenceId == reference.Id))
                    {
                        var referenceNode = new TagonomiesLink.ReferenceSlim
                        {
                            ReferenceId = reference.Id,
                            IsMandatory = reference.IsMandatory,
                            SourceNode  = linkingNode.Node
                        };
                        link.ReferencedNodes.Add(referenceNode);
                    }
                }
            }
        }