Beispiel #1
0
        public void FillExpressionParts(string expression)
        {
            var parts = expression.Split(',').Select(part => new CronCategoryPart(part));

            foreach (var existingpart in expressionParts.Items)
            {
                existingpart.Dispose();
            }

            expressionParts.ClearAndAddRange(parts);
        }
Beispiel #2
0
        public ExportViewModel(IShell sh, IAppModel am, IDialogCoordinator dc,
                               IAppConfig cfg, IMapper mapper)
        {
            shell          = sh;
            appModel       = am;
            dialCoord      = dc;
            this.mapper    = mapper;
            _appConfig     = cfg;
            AvailableBoxes = appModel.Boxes;

            boards          = new SourceList <BoardToExport>();
            AvailableBoards = boards.SpawnCollection();

            ExportJson         = true;
            DatePostfix        = true;
            SplitBoardsToFiles = false;

            PdfOptionsAvailable = new PdfOptionsAvailable
            {
                PageSizes        = Enum.GetValues(typeof(PageSize)).Cast <PageSize>().ToArray(),
                PageOrientations = Enum.GetValues(typeof(PageOrientation)).Cast <PageOrientation>().ToArray(),
                ScaleFittings    = Enum.GetValues(typeof(ScaleFitting)).Cast <ScaleFitting>().ToArray()
            };
            PdfOptions = new PdfOptions
            {
                PageSize        = PageSize.A4,
                PageOrientation = PageOrientation.Portrait,
                ScaleOptions    = new ScaleOptions
                {
                    Padding      = new Thickness(),
                    ScaleToFit   = true,
                    ScaleFitting = ScaleFitting.BothDirections,
                    MaxScale     = 1.0,
                    MinScale     = 0.0
                }
            };

            var canExport = boards
                            .Connect()
                            .AutoRefresh()
                            .Filter(x => x.IsChecked)
                            .Select(x => AvailableBoards.Count(y => y.IsChecked) > 0 &&
                                    !string.IsNullOrEmpty(SelectedBox.Uri) && File.Exists(SelectedBox.Uri));

            ExportCommand             = ReactiveCommand.CreateFromTask(ExportCommandExecute, canExport);
            SelectTargetFolderCommand = ReactiveCommand.Create(SelectTargetFolderCommandExecute);
            CancelCommand             = ReactiveCommand.Create(Close);

            this.ObservableForProperty(x => x.SelectedBox)
            .Where(x => x.Value != null)
            .Select(x => x.Value)
            .Subscribe(box =>
            {
                boards.ClearAndAddRange(box.Boards.Items
                                        .Select(x => new BoardToExport {
                    Board = x, IsChecked = true
                }));

                TargetFile = Path.GetFileNameWithoutExtension(box.Uri) + "_export";
            });

            this.ObservableForProperty(x => x.TargetFolder)
            .Subscribe(x => cfg.ArchiveFolder = x.Value);

            SelectedBox = AvailableBoxes.First();

            var fi = new FileInfo(SelectedBox.Uri);

            TargetFolder = cfg.ArchiveFolder ?? fi.DirectoryName;

            _appConfig.ColorThemeObservable
            .Subscribe(x => ColorTheme = x);
        }
Beispiel #3
0
        public OperEditorViewModel(ICachedService cachedService, IMapper mapper, IShell shell)
        {
            Shell = shell as CachedServiceShell;
            this.cachedService = cachedService;
            this.mapper        = mapper;
            IsValid            = true;
            validator          = new OperEditorValidator();

            var operTemplates = new SourceList <string>();

            var canSave = this.WhenAnyValue(tvm => tvm.IsDirty,
                                            isd => isd == true).Concat(Shell.CanEdit);

            SaveChangesCommand = ReactiveCommand.CreateFromTask(async() => await Save(),
                                                                canSave);

            CancelCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                if (IsDirty)
                {
                    if (!await Shell.ShowWarningAffirmativeDialogAsync
                            ("All unsaved changes will be lost. Close window?"))
                    {
                        return;
                    }
                }

                Close();
            });

            this.ObservableForProperty(s => s.Mode)
            .Subscribe(mode =>
            {
                var templates = mode.Value == OperMode.Exporter
                        ? DataExporters.Select(pair => pair.Key)
                        : DataImporters.Select(pair => pair.Key);

                operTemplates.ClearAndAddRange(templates);

                OperTemplates = operTemplates.SpawnCollection();

                ImplementationType = operTemplates.First();
            });

            this.ObservableForProperty(s => s.ImplementationType)
            .Where(type => type.Value != null)
            .Subscribe(type =>
            {
                var operType = Mode == OperMode.Exporter
                        ? DataExporters[type.Value]
                        : DataImporters[type.Value];
                if (operType == null)
                {
                    return;
                }

                Configuration = Activator.CreateInstance(operType);
                mapper.Map(cachedService, Configuration);
            });

            this.WhenAnyObservable(s => s.AllErrors.CountChanged)
            .Subscribe(_ => IsValid = !AllErrors.Items.Any());
        }
        public void Initialize(ViewRequest viewRequest)
        {
            if (Shell.Role == ServiceUserRole.Editor)
            {
                Shell.AddVMCommand("File", "Save",
                                   "SaveChangesCommand", this)
                .SetHotKey(ModifierKeys.Control, Key.S);

                Shell.AddVMCommand("Edit", "Add operation from existing templates",
                                   "OpenTemplatesListCommand", this);

                Shell.AddVMCommand("Edit", "Add new operation",
                                   "CreateOperConfigCommand", this);
            }

            tasks.ClearAndAddRange(cachedService.Tasks.Items
                                   .Select(task => mapper.Map <DesktopTaskNameId>(task)));

            Schedules = cachedService.Schedules.SpawnCollection();

            if (viewRequest is TaskEditorRequest request)
            {
                mapper.Map(request.Task, this);
                HasSchedule = ScheduleId > 0;

                if (request.TaskOpers != null)
                {
                    bindedOpers.ClearAndAddRange(request.TaskOpers.OrderBy(to => to.Number)
                                                 .Select(to => mapper.Map <DesktopOperation>(to)));
                }

                if (request.Task.DependsOn != null)
                {
                    taskDependencies.ClearAndAddRange(request.Task.DependsOn
                                                      .Select(dep =>
                    {
                        tasks
                        .Connect()
                        .Bind(out var cachedTasks)
                        .Subscribe();

                        var desktopDep   = mapper.Map <DesktopTaskDependence>(dep);
                        desktopDep.Tasks = cachedTasks;

                        return(desktopDep);
                    }));
                }

                if (request.DependsOn != null)
                {
                    taskDependencies.ClearAndAddRange(request
                                                      .DependsOn.OrderBy(dep => dep.TaskId));
                }

                if (!string.IsNullOrEmpty(request.Task.Parameters))
                {
                    taskParameters.ClearAndAddRange(JsonConvert
                                                    .DeserializeObject <Dictionary <string, object> >(request.Task.Parameters)
                                                    .Select(pair => new TaskParameter
                    {
                        Name  = pair.Key,
                        Value = pair.Value
                    }));
                }

                TaskDependencies = new ObservableCollectionExtended <DesktopTaskDependence>();

                taskDependencies.Connect()
                .Bind(TaskDependencies)
                .Subscribe(_ => this.RaisePropertyChanged(nameof(TaskDependencies)));

                taskDependencies.Connect()
                .WhenAnyPropertyChanged("TaskId", "MaxSecondsPassed")
                .Subscribe(_ => this.RaisePropertyChanged(nameof(TaskDependencies)));

                if (request.ViewId == "Creating new Task")
                {
                    HasSchedule = true;
                    ScheduleId  = Schedules.First()?.Id;
                    Name        = "New task";
                }

                if (request.ViewId.Contains("copy"))
                {
                    Name = request.ViewId;
                }
            }

            void Changed(object sender, PropertyChangedEventArgs e)
            {
                if (Shell.Role == ServiceUserRole.Viewer || IsDirty || e.PropertyName == "SelectedOperation")
                {
                    return;
                }
                IsDirty = true;
                Title  += '*';
            }

            AllErrors.Connect()
            .Subscribe(_ => IsValid = !AllErrors.Items.Any());

            this.ObservableForProperty(s => s.HasSchedule)
            .Subscribe(hassch =>
                       ScheduleId = hassch.Value ? Schedules.FirstOrDefault()?.Id : null);

            taskParameters.Connect() //todo: real-time updating of duplicates indicators
            .WhenAnyPropertyChanged("Name")
            .Subscribe(_ =>
            {
                foreach (var dim in TaskParameters)
                {
                    dim.IsDuplicate = false;
                }

                var duplicatgroups = TaskParameters
                                     .GroupBy(dim => dim.Name)
                                     .Where(g => g.Count() > 1)
                                     .ToList();

                foreach (var group in duplicatgroups)
                {
                    foreach (var dim in group)
                    {
                        dim.IsDuplicate = true;
                        dim.HasErrors   = true;
                    }
                }

                this.RaisePropertyChanged(nameof(TaskParameters));
            });

            taskParameters.Connect()
            .WhenAnyPropertyChanged("Value")
            .Subscribe(_ => this.RaisePropertyChanged(nameof(TaskParameters)));

            taskParameters.Connect()
            .WhenAnyPropertyChanged("HasErrors")
            .Subscribe(_ =>
            {
                IsValid = !AllErrors.Items.Any() &&
                          !TaskParameters.Any(param => param.HasErrors);
            });

            TaskParameters = new ObservableCollectionExtended <TaskParameter>();

            taskParameters.Connect()
            .Bind(TaskParameters)
            .Skip(1)
            .Subscribe(_ =>
            {
                UpdateParametersList();
                this.RaisePropertyChanged(nameof(TaskParameters));
            });


            ImplementationTypes = implementationTypes.SpawnCollection();

            BindedOpers = new ObservableCollectionExtended <DesktopOperation>();

            bindedOpers.Connect()
            .Bind(BindedOpers)
            .Subscribe(_ => this.RaisePropertyChanged(nameof(bindedOpers)));



            bindedOpers.Connect()
            .Subscribe(_ =>
            {
                var packages = bindedOpers.Items.Where(oper => DataImporters.ContainsKey(oper.ImplementationType))
                               .Select(oper =>
                                       (DeserializeOperationConfigByType(oper.ImplementationType, oper.Config) as
                                        IPackagedImporterConfig)
                                       ?.PackageName).Where(name => !string.IsNullOrEmpty(name)).Distinct().ToList();

                incomingPackages.ClearAndAddRange(packages);
                this.RaisePropertyChanged(nameof(bindedOpers));
            });

            PropertyChanged += Changed;
        } //init vm
        public TaskEditorViewModel(ICachedService service, IMapper mapper, IShell shell)
        {
            cachedService = service;
            this.mapper   = mapper;
            validator     = new TaskEditorValidator();
            IsValid       = true;
            Shell         = shell as CachedServiceShell;

            taskParameters   = new SourceList <TaskParameter>();
            taskDependencies = new SourceList <DesktopTaskDependence>();
            bindedOpers      = new SourceList <DesktopOperation>();
            incomingPackages = new SourceList <string>();
            tasks            = new SourceList <DesktopTaskNameId>();

            DataImporters       = cachedService.DataImporters;
            DataExporters       = cachedService.DataExporters;
            implementationTypes = new SourceList <string>();

            var canSave = this.WhenAnyValue(tvm => tvm.IsDirty, tvm => tvm.IsValid,
                                            (isd, isv) => isd && isv).Concat(Shell.CanEdit);

            SaveChangesCommand = ReactiveCommand.CreateFromTask(async() => await Save(),
                                                                canSave);

            CancelCommand = ReactiveCommand.CreateFromTask(Cancel);

            ClipBoardFillCommand = ReactiveCommand.Create <string>(Clipboard.SetText);

            OpenCurrentTaskViewCommand = ReactiveCommand //todo: make without interface blocking
                                         .CreateFromTask(async() =>
                                                         cachedService.OpenPageInBrowser(
                                                             await cachedService.GetCurrentTaskViewById(Id)));

            RemoveOperationCommand = ReactiveCommand.Create <DesktopOperation>(to =>
            {
                if (SelectedOperation?.Id == to.Id)
                {
                    ClearSelections();
                }
                bindedOpers.Remove(to);
            }, Shell.CanEdit);

            RemoveParameterCommand = ReactiveCommand
                                     .Create <TaskParameter>(par => taskParameters.Remove(par), Shell.CanEdit);

            RemoveDependenceCommand = ReactiveCommand
                                      .Create <DesktopTaskDependence>(dep => taskDependencies.Remove(dep), Shell.CanEdit);

            AddParameterCommand = ReactiveCommand.Create(() => taskParameters.Add(new TaskParameter
            {
                Name = "@RepPar"
            }), Shell.CanEdit);

            AddDependenceCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                if (tasks.Count == 0)
                {
                    await Shell.ShowMessageAsync("No any existing tasks in service");
                    return;
                }

                tasks
                .Connect()
                .Bind(out var cachedTasks)
                .Subscribe();

                var dependence = new DesktopTaskDependence {
                    Tasks = cachedTasks, TaskId = cachedTasks.First().Id
                };
                taskDependencies.Add(dependence);
            }, Shell.CanEdit);

            AddOperationCommand = ReactiveCommand.CreateFromTask(AddOperation, Shell.CanEdit);


            CreateOperConfigCommand = ReactiveCommand.CreateFromTask(CreateOperConfig, Shell.CanEdit);

            OpenTemplatesListCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                if (SelectedOperationConfig != null && Shell.Role == ServiceUserRole.Editor)
                {
                    if (!await Shell.ShowWarningAffirmativeDialogAsync
                            ("All unsaved operation configuration changes will be lost. Close window?"))
                    {
                        return;
                    }
                }

                await SelectOperFromTemplates();
            }, Shell.CanEdit);

            SelectOperationCommand = ReactiveCommand.CreateFromTask <DesktopOperation>
                                         (SelectOperation);

            this.ObservableForProperty(s => s.Mode)
            .Subscribe(mode =>
            {
                var templates = mode?.Value == OperMode.Exporter
                        ? DataExporters.Select(pair => pair.Key)
                        : DataImporters.Select(pair => pair.Key);

                implementationTypes.ClearAndAddRange(templates);
                Type = implementationTypes.Items.FirstOrDefault();
            });

            this.ObservableForProperty(s => s.Type)
            .Where(type => type.Value != null)
            .Subscribe(type =>
            {
                var operType = Mode == OperMode.Exporter
                        ? DataExporters[type.Value]
                        : DataImporters[type.Value];
                if (operType == null)
                {
                    return;
                }

                SelectedOperationConfig = Activator.CreateInstance(operType);
                mapper.Map(cachedService, SelectedOperationConfig);
            });

            this.WhenAnyValue(tvm => tvm.SelectedOperationConfig)
            .Where(selop => selop != null)
            .Subscribe(conf =>
                       IncomingPackages = incomingPackages.SpawnCollection());
        }
        public TaskManagerViewModel(ICachedService cachedService, IMapper mapper, IShell shell)
        {
            CanClose           = false;
            this.cachedService = cachedService;
            this.mapper        = mapper;
            Shell = shell as CachedServiceShell;
            var packageBuilder = new ProtoPackageBuilder();

            selectedTaskInstances = new SourceList <DesktopTaskInstance>();
            operInstances         = new SourceList <DesktopOperInstance>();

            IObservable <bool> canOpenInstancePage = this //todo:some check for is viewdataset?"
                                                     .WhenAnyValue(t => t.SelectedInstanceData,
                                                                   si => !string.IsNullOrEmpty(si?.DataSet));

            OpenPage = ReactiveCommand.Create <string>
                           (cachedService.OpenPageInBrowser, canOpenInstancePage);

            EditTaskCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                if (SelectedTask == null)
                {
                    return;
                }
                var id = SelectedTask.Id;

                cachedService.RefreshData();
                if (cachedService
                    .Tasks.Items.FirstOrDefault(task => task.Id == id) == null)
                {
                    await Shell.ShowMessageAsync("Task not longer exists");
                    return;
                }

                var name = $"Task {id} editor";
                Shell.ShowView <TaskEditorView>(new TaskEditorRequest
                {
                    ViewId = name,
                    Task   = cachedService
                             .Tasks.Items.FirstOrDefault(task => task.Id == id),
                    TaskOpers = cachedService.Operations.Items.Where(to => to.TaskId == id).ToList()
                },
                                                new UiShowOptions {
                    Title = name
                });
            });

            DeleteCommand = ReactiveCommand.CreateFromTask(async() =>
                                                           await Delete(), Shell.CanEdit);


            StopTaskCommand = ReactiveCommand.CreateFromTask <int, string>(async par =>
            {
                if (!await Shell.ShowWarningAffirmativeDialogAsync("Сancel task execution?"))
                {
                    return("False");
                }

                var t = await this.cachedService.StopTaskByInstanceId(par);
                LoadInstanceCompactsByTaskId(SelectedTask.Id);
                return(t);
            }, Shell.CanStopRun);

            RunTaskCommand = ReactiveCommand.CreateFromTask <DesktopTask>(async par =>
            {
                var workingInstances = await cachedService.GetWorkingTaskInstancesById(par.Id);
                if (workingInstances.Count > 0)
                {
                    await Shell.ShowMessageAsync(
                        $"This task already has working instances ({string.Join(", ", workingInstances)}). " +
                        "You can try to execute it later");
                }
                else
                {
                    if (!await Shell.ShowWarningAffirmativeDialogAsync($"Do you want to execute task {par.Name}?"))
                    {
                        return;
                    }

                    var res = await cachedService.StartTaskById(par.Id);
                    LoadInstanceCompactsByTaskId(SelectedTask.Id);
                    await Shell.ShowMessageAsync(res, "Task execution");
                }
            }, Shell.CanStopRun);

            this.WhenAnyValue(s => s.SelectedTask)
            .Where(x => x != null)
            .Subscribe(x => LoadInstanceCompactsByTaskId(x.Id));

            this.WhenAnyValue(s => s.SelectedTaskInstance)
            .Subscribe(x =>
            {
                if (x == null)
                {
                    operInstances.Clear();
                }
                else
                {
                    operInstances.ClearAndAddRange(
                        cachedService.GetOperInstancesByTaskInstanceId(x.Id)
                        .Select(mapper.Map <DesktopOperInstance>));
                }
            });

            this.WhenAnyValue(s => s.SelectedOperInstance)
            .Subscribe(async x =>
            {
                var data = new DesktopOperInstance();

                if (x != null)
                {
                    var fullInstance = cachedService
                                       .GetFullOperInstanceById(SelectedOperInstance.Id);

                    data = mapper.Map <DesktopOperInstance>(fullInstance);

                    if (fullInstance.DataSet != null)
                    {
                        try
                        {
                            data.DataSet = JsonConvert.SerializeObject(packageBuilder.GetPackageValues(
                                                                           OperationPackage.Parser.ParseFrom(fullInstance.DataSet)));
                        }
                        catch
                        {
                            await Shell.ShowMessageAsync("Exception occured during dataset decoding");
                        }
                    }
                }

                SelectedInstanceData = x == null
                        ? null
                        : data;
            });
        }
 private void LoadInstanceCompactsByTaskId(int taskId)
 {
     selectedTaskInstances
     .ClearAndAddRange(cachedService.GetInstancesByTaskId(taskId)
                       .Select(ti => mapper.Map <DesktopTaskInstance>(ti)).OrderByDescending(inst => inst.StartTime));
 }