FolderManagement.xaml.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. using aipdev.Annotations;
  2. using AIPlatform.Protocol.Entities;
  3. using AIPlatform.Protocol.Utilities;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.ComponentModel;
  8. using System.Linq;
  9. using System.Runtime.CompilerServices;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. namespace aipdev
  14. {
  15. public class FolderItem : INotifyPropertyChanged
  16. {
  17. public event PropertyChangedEventHandler PropertyChanged;
  18. /// <summary>
  19. /// Gets the item id.
  20. /// </summary>
  21. public long Id { get; set; }
  22. /// <summary>
  23. /// Gets the item name.
  24. /// </summary>
  25. public string Name { get; set; }
  26. /// <summary>
  27. /// Gets the item description.
  28. /// </summary>
  29. public string Description { get; set; }
  30. /// <summary>
  31. /// Gets if the item is updated.
  32. /// </summary>
  33. public bool IsUpdated { get; set; }
  34. /// <summary>
  35. /// Gets if the item has menu.
  36. /// </summary>
  37. public bool HasMenu { get; set; }
  38. /// <summary>
  39. /// Gets or sets the organization id.
  40. /// </summary>
  41. public long OrganizationId { get; set; }
  42. /// <summary>
  43. /// Gets the image category id.
  44. /// </summary>
  45. public long ImageCategoryId { get; set; }
  46. /// <summary>
  47. /// Gets the children items.
  48. /// </summary>
  49. public ObservableCollection<FolderItem> Children { get; set; }
  50. public FolderItem()
  51. {
  52. Children = new ObservableCollection<FolderItem>();
  53. }
  54. [NotifyPropertyChangedInvocator]
  55. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  56. {
  57. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  58. }
  59. }
  60. public class ImageFolderExtend : FolderItem
  61. {
  62. /// <summary>
  63. /// Gets or sets the image category level
  64. /// </summary>
  65. public CategoryLevel Level { get; set; }
  66. /// <summary>
  67. /// Gets or sets the image available count.
  68. /// </summary>
  69. public int ImageCount { get; set; }
  70. /// <summary>
  71. /// Gets or sets the image category is enabled
  72. /// </summary>
  73. public bool IsEnabled { get; set; }
  74. }
  75. public class DeveloperFolderExtend : DeveloperFolder
  76. {
  77. /// <summary>
  78. /// Gets or sets the value the developer image foler is shared to developers or not.
  79. /// </summary>
  80. public bool IsShared { get; set; }
  81. }
  82. public enum FolderType
  83. {
  84. All,
  85. Server,
  86. Developer,
  87. }
  88. /// <summary>
  89. /// Interaction logic for FolderManagement.xaml
  90. /// </summary>
  91. public partial class FolderManagement : UserControl, IContentPage
  92. {
  93. private readonly ObservableCollection<ImageFolderExtend> _serverFolders = new ObservableCollection<ImageFolderExtend>();
  94. private readonly ObservableCollection<DeveloperFolderExtend> _developerFolders = new ObservableCollection<DeveloperFolderExtend>();
  95. public string PageName { get; set; }
  96. public bool IsHomePage { get; set; }
  97. public bool IsModalPage { get; set; }
  98. public List<ImageCategory> _imageCategories { get; set; }
  99. public List<ImageCategory> _imageBatches { get; set; }
  100. public FolderManagement()
  101. {
  102. InitializeComponent();
  103. PageName = "FolderManagement";
  104. IsHomePage = false;
  105. IsModalPage = false;
  106. ServerFolders.ItemsSource = _serverFolders;
  107. DevFolders.ItemsSource = _developerFolders;
  108. }
  109. public async void OnShow(object arg)
  110. {
  111. await LoadFoldersAsync(FolderType.All).ConfigureAwait(false);
  112. }
  113. public void OnHide()
  114. {
  115. ClearFolders();
  116. }
  117. public void Close()
  118. {
  119. ClearFolders();
  120. }
  121. private void ClearFolders()
  122. {
  123. _serverFolders.Clear();
  124. _developerFolders.Clear();
  125. }
  126. private async Task LoadFoldersAsync(FolderType type)
  127. {
  128. try
  129. {
  130. Dispatcher.Invoke(() =>
  131. {
  132. ContentManager.ShowLoading();
  133. });
  134. switch (type)
  135. {
  136. case FolderType.All:
  137. await LoadServerFoldersAsync().ConfigureAwait(false);
  138. await LoadDeveloperFoldersAsync().ConfigureAwait(false);
  139. break;
  140. case FolderType.Server:
  141. await LoadServerFoldersAsync().ConfigureAwait(false);
  142. break;
  143. case FolderType.Developer:
  144. await LoadDeveloperFoldersAsync().ConfigureAwait(false);
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. catch (Exception ex)
  151. {
  152. Dispatcher.Invoke(() =>
  153. {
  154. MessageBox.Show(Application.Current.MainWindow, $"加载文件夹列表失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  155. });
  156. }
  157. finally
  158. {
  159. Dispatcher.Invoke(() =>
  160. {
  161. ContentManager.HideLoading();
  162. });
  163. }
  164. }
  165. private async Task LoadServerFoldersAsync()
  166. {
  167. _imageCategories = new List<ImageCategory>();
  168. #region Organizations
  169. Dispatcher.Invoke(() =>
  170. {
  171. _serverFolders.Clear();
  172. });
  173. var organizations = await DeveloperManager.Shared.GetOrganizationsAsync().ConfigureAwait(false);
  174. if (organizations != null)
  175. {
  176. foreach (var org in organizations)
  177. {
  178. var orgExtend = new ImageFolderExtend
  179. {
  180. Id = org.Id,
  181. Name = org.Name,
  182. Description = org.Name,
  183. Level = CategoryLevel.Organization,
  184. HasMenu = false,
  185. };
  186. #region ImageCategories
  187. var categories = await DeveloperManager.Shared.GetImageCategoriesAsync(org.Id).ConfigureAwait(false);
  188. if (categories != null)
  189. {
  190. foreach (var categ in categories)
  191. {
  192. if (categ.Developers.Any(x => x.Id == DeveloperManager.Shared.Session.AccountId))
  193. {
  194. var quantity = categ.ImageQuantityItem;
  195. var desc = $"{categ.Name} - 已标注:{quantity.Labeled},已跳过:{quantity.Skipped},未标注:{quantity.UnLabeled},未分配:{quantity.UnAssigned}";
  196. var categExtend = new ImageFolderExtend
  197. {
  198. Id = categ.Id,
  199. Name = categ.Name,
  200. Description = desc,
  201. Level = categ.Level,
  202. ImageCount = quantity.Seen,
  203. HasMenu = true,
  204. OrganizationId = org.Id,
  205. ImageCategoryId = categ.Id,
  206. IsEnabled = quantity.Seen > 0,
  207. };
  208. await AddItemChildAsync(categExtend, categ, categ.Id).ConfigureAwait(false);
  209. orgExtend.Children.Add(categExtend);
  210. _imageCategories.Add(categ);
  211. }
  212. }
  213. }
  214. #endregion
  215. Dispatcher.Invoke(() =>
  216. {
  217. _serverFolders.Add(orgExtend);
  218. });
  219. }
  220. }
  221. #endregion
  222. }
  223. private async Task AddItemChildAsync(ImageFolderExtend folderExtend, ImageCategory category, long imageCategoryId)
  224. {
  225. var categories = await DeveloperManager.Shared.GetImageCategoriesAsync(category.Id).ConfigureAwait(false);
  226. if (categories != null)
  227. {
  228. foreach (var item in categories)
  229. {
  230. var quantity = item.ImageQuantityItem;
  231. var desc = $"{item.Name} - 已标注:{quantity.Labeled},已跳过:{quantity.Skipped},未标注:{quantity.UnLabeled}";
  232. if (item.Level == CategoryLevel.Batch)
  233. {
  234. desc += $",未分配:{quantity.UnAssigned}";
  235. }
  236. var caseExtend = new ImageFolderExtend
  237. {
  238. Id = item.Id,
  239. Name = item.Name,
  240. Description = desc,
  241. Level = item.Level,
  242. ImageCount = quantity.Seen,
  243. HasMenu = true,
  244. OrganizationId = item.OrganizationId,
  245. ImageCategoryId = imageCategoryId,
  246. IsEnabled = quantity.Seen > 0,
  247. };
  248. await AddItemChildAsync(caseExtend, item, imageCategoryId).ConfigureAwait(false);
  249. folderExtend.Children.Add(caseExtend);
  250. }
  251. }
  252. }
  253. private async Task LoadDeveloperFoldersAsync()
  254. {
  255. Dispatcher.Invoke(() =>
  256. {
  257. _developerFolders.Clear();
  258. });
  259. var developerFolders = await DeveloperManager.Shared.GetDeveloperFoldersAsync(0, 1000, true).ConfigureAwait(false);
  260. foreach (var developerFolder in developerFolders)
  261. {
  262. var item = new DeveloperFolderExtend
  263. {
  264. Id = developerFolder.Id,
  265. Name = developerFolder.Name,
  266. Description = developerFolder.Description,
  267. DeveloperId = developerFolder.DeveloperId,
  268. ImageCategoryId = developerFolder.ImageCategoryId,
  269. ImageCount = developerFolder.ImageCount,
  270. ApprovalState = developerFolder.ApprovalState,
  271. Sharers = developerFolder.Sharers,
  272. Approver = developerFolder.Approver,
  273. IsShared = developerFolder.ApprovalState == ApprovalState.Approved,
  274. CreateTime = developerFolder.CreateTime,
  275. UpdateTime = developerFolder.UpdateTime,
  276. };
  277. Dispatcher.Invoke(() =>
  278. {
  279. _developerFolders.Add(item);
  280. });
  281. }
  282. }
  283. private void OnFolderClick(object sender, RoutedEventArgs e)
  284. {
  285. if (e.OriginalSource is CheckBox)
  286. {
  287. return;
  288. }
  289. var button = (Button)sender;
  290. var folder = (ImageFolder)button.DataContext;
  291. ContentManager.Show("FolderImageBrowser", folder);
  292. }
  293. private async void OnRefreshServerFoldersClick(object sender, RoutedEventArgs e)
  294. {
  295. await LoadFoldersAsync(FolderType.Server).ConfigureAwait(false);
  296. }
  297. private void OnOpenFolderClick(object sender, RoutedEventArgs e)
  298. {
  299. var menuItem = (MenuItem)sender;
  300. var folder = (ImageFolderExtend)menuItem.DataContext;
  301. ContentManager.Show("FolderImageBrowser", folder);
  302. }
  303. private async void OnCopyFolderClick(object sender, RoutedEventArgs e)
  304. {
  305. var menuItem = (MenuItem)sender;
  306. var folder = (ImageFolderExtend)menuItem.DataContext;
  307. try
  308. {
  309. Dispatcher.Invoke(() =>
  310. {
  311. ContentManager.ShowLoading();
  312. });
  313. var developerFolder = await DeveloperManager.Shared.CreateDeveloperFolderAsync(folder.Name + $"_{DateTime.Now:yyyyMMddHHmmss}", string.Empty, folder.OrganizationId, folder.ImageCategoryId);
  314. var operationId = IdCreator.CreateId();
  315. _ = Task.Run(async () =>
  316. {
  317. await DeveloperManager.Shared.CopyFolderAsync(folder.Id, developerFolder.Id, operationId);
  318. });
  319. var progress = 0;
  320. while (progress < 100)
  321. {
  322. try
  323. {
  324. progress = await DeveloperManager.Shared.GetOperationProgressAsync(operationId);
  325. }
  326. catch (Exception)
  327. {
  328. //
  329. }
  330. await Task.Delay(200);
  331. }
  332. developerFolder = await DeveloperManager.Shared.GetDeveloperFolderAsync(developerFolder.Id);
  333. await UpdateDeveloperFoldersAsync(developerFolder);
  334. }
  335. catch (Exception ex)
  336. {
  337. Dispatcher.Invoke(() =>
  338. {
  339. MessageBox.Show(Application.Current.MainWindow, $"复制文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  340. });
  341. await LoadDeveloperFoldersAsync();
  342. }
  343. finally
  344. {
  345. Dispatcher.Invoke(() =>
  346. {
  347. ContentManager.HideLoading();
  348. });
  349. }
  350. }
  351. private Task UpdateDeveloperFoldersAsync(DeveloperFolder folder)
  352. {
  353. var devFolder = _developerFolders.FirstOrDefault(x => x.Id == folder.Id);
  354. if (devFolder == null)
  355. {
  356. devFolder = new DeveloperFolderExtend
  357. {
  358. Id = folder.Id,
  359. Name = folder.Name,
  360. Description = folder.Description,
  361. DeveloperId = folder.DeveloperId,
  362. ImageCategoryId = folder.ImageCategoryId,
  363. ImageCount = folder.ImageCount,
  364. ApprovalState = folder.ApprovalState,
  365. Sharers = folder.Sharers,
  366. Approver = folder.Approver,
  367. IsShared = folder.ApprovalState == ApprovalState.Approved,
  368. CreateTime = folder.CreateTime,
  369. UpdateTime = folder.UpdateTime,
  370. };
  371. Dispatcher.Invoke(() =>
  372. {
  373. _developerFolders.Insert(0, devFolder);
  374. });
  375. }
  376. else
  377. {
  378. var index = _developerFolders.IndexOf(devFolder);
  379. Dispatcher.Invoke(() =>
  380. {
  381. _developerFolders.Remove(devFolder);
  382. });
  383. devFolder.ImageCount = folder.ImageCount;
  384. Dispatcher.Invoke(() =>
  385. {
  386. _developerFolders.Insert(index, devFolder);
  387. });
  388. }
  389. return Task.CompletedTask;
  390. }
  391. private async void OnCopyFolderFilesClick(object sender, RoutedEventArgs e)
  392. {
  393. var menuItem = (MenuItem)sender;
  394. var folder = (ImageFolderExtend)menuItem.DataContext;
  395. var copyImageWindow = new CopyImageWindow(folder.ImageCategoryId) { Owner = Application.Current.MainWindow };
  396. copyImageWindow.ShowDialog();
  397. if (copyImageWindow.SelectedFolder != null)
  398. {
  399. var devFolder = copyImageWindow.SelectedFolder;
  400. try
  401. {
  402. Dispatcher.Invoke(() =>
  403. {
  404. ContentManager.ShowLoading();
  405. });
  406. var operationId = IdCreator.CreateId();
  407. _ = Task.Run(async () =>
  408. {
  409. await DeveloperManager.Shared.CopyFolderFilesAsync(folder.Id, devFolder.Id, operationId);
  410. });
  411. var progress = 0;
  412. while (progress < 100)
  413. {
  414. try
  415. {
  416. progress = await DeveloperManager.Shared.GetOperationProgressAsync(operationId);
  417. }
  418. catch (Exception)
  419. {
  420. //
  421. }
  422. await Task.Delay(200);
  423. }
  424. var developerFolder = await DeveloperManager.Shared.GetDeveloperFolderAsync(devFolder.Id);
  425. await UpdateDeveloperFoldersAsync(developerFolder);
  426. }
  427. catch (Exception ex)
  428. {
  429. Dispatcher.Invoke(() =>
  430. {
  431. MessageBox.Show(Application.Current.MainWindow, $"复制文件夹图片失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  432. });
  433. await LoadDeveloperFoldersAsync();
  434. }
  435. finally
  436. {
  437. Dispatcher.Invoke(() =>
  438. {
  439. ContentManager.HideLoading();
  440. });
  441. }
  442. }
  443. }
  444. private async void OnSyncFolderFilesClick(object sender, RoutedEventArgs e)
  445. {
  446. var menuItem = (MenuItem)sender;
  447. var folder = (ImageFolderExtend)menuItem.DataContext;
  448. var copyImageWindow = new CopyImageWindow(folder.ImageCategoryId) { Owner = Application.Current.MainWindow };
  449. copyImageWindow.ShowDialog();
  450. if (copyImageWindow.SelectedFolder != null)
  451. {
  452. var devFolder = copyImageWindow.SelectedFolder;
  453. try
  454. {
  455. Dispatcher.Invoke(() =>
  456. {
  457. ContentManager.ShowLoading();
  458. });
  459. var operationId = IdCreator.CreateId();
  460. _ = Task.Run(async () =>
  461. {
  462. await DeveloperManager.Shared.SyncFolderAsync(folder.Id, devFolder.Id, operationId);
  463. });
  464. var progress = 0;
  465. while (progress < 100)
  466. {
  467. try
  468. {
  469. progress = await DeveloperManager.Shared.GetOperationProgressAsync(operationId);
  470. }
  471. catch (Exception)
  472. {
  473. //
  474. }
  475. await Task.Delay(200);
  476. }
  477. var developerFolder = await DeveloperManager.Shared.GetDeveloperFolderAsync(devFolder.Id);
  478. await UpdateDeveloperFoldersAsync(developerFolder);
  479. }
  480. catch (Exception ex)
  481. {
  482. Dispatcher.Invoke(() =>
  483. {
  484. MessageBox.Show(Application.Current.MainWindow, $"同步文件夹图片失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  485. });
  486. await LoadDeveloperFoldersAsync();
  487. }
  488. finally
  489. {
  490. Dispatcher.Invoke(() =>
  491. {
  492. ContentManager.HideLoading();
  493. });
  494. }
  495. }
  496. }
  497. private void OnOpenDeveloperFolderClick(object sender, RoutedEventArgs e)
  498. {
  499. var menuItem = (MenuItem)sender;
  500. var folder = (ImageFolder)menuItem.DataContext;
  501. ContentManager.Show("FolderImageBrowser", folder);
  502. }
  503. private async void OnRefreshDeveloperFoldersClick(object sender, RoutedEventArgs e)
  504. {
  505. await LoadFoldersAsync(FolderType.Developer).ConfigureAwait(false);
  506. }
  507. private async void OnCreateDeveloperFolderClick(object sender, RoutedEventArgs e)
  508. {
  509. var createFolderWindow = new CreateFolderWindow(_imageCategories) { Owner = Application.Current.MainWindow };
  510. createFolderWindow.ShowDialog();
  511. if (!string.IsNullOrEmpty(createFolderWindow.NewFolderName))
  512. {
  513. var folderName = createFolderWindow.NewFolderName;
  514. var folderDesc = createFolderWindow.NewFolderDescription;
  515. var folderImageCategoryId = createFolderWindow.NewFolderImageCategoryId;
  516. var folderOrganizationId = createFolderWindow.NewFolderOrganizationId;
  517. ContentManager.ShowLoading();
  518. try
  519. {
  520. var createdFolder = await DeveloperManager.Shared.CreateDeveloperFolderAsync(folderName, folderDesc, folderOrganizationId, folderImageCategoryId);
  521. await UpdateDeveloperFoldersAsync(createdFolder);
  522. }
  523. catch (Exception ex)
  524. {
  525. MessageBox.Show(Application.Current.MainWindow, $"创建文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  526. await LoadDeveloperFoldersAsync();
  527. }
  528. finally
  529. {
  530. ContentManager.HideLoading();
  531. }
  532. }
  533. }
  534. private async void OnCreateTestFolderClick(object sender, RoutedEventArgs e)
  535. {
  536. var menuItem = (MenuItem)sender;
  537. var folder = (DeveloperFolder)menuItem.DataContext;
  538. var createTestFolderWindow = new CreateTestFolderWindow(folder) { Owner = Application.Current.MainWindow };
  539. createTestFolderWindow.ShowDialog();
  540. if (!string.IsNullOrEmpty(createTestFolderWindow.NewFolderName))
  541. {
  542. try
  543. {
  544. Dispatcher.Invoke(() =>
  545. {
  546. ContentManager.ShowLoading();
  547. });
  548. var testFolderName = createTestFolderWindow.NewFolderName;
  549. var testFolderDesc = createTestFolderWindow.NewFolderDescription;
  550. var assignTestImageCount = int.Parse(createTestFolderWindow.AssignTestImageCount.Text?.Trim() ?? "0");
  551. //创建测试文件夹
  552. var developerTestFolder = await DeveloperManager.Shared.CreateDeveloperFolderAsync(testFolderName, testFolderDesc, folder.OrganizationId, folder.ImageCategoryId);
  553. //开发人员文件夹,选定随机数量的图像,分配到新的测试文件夹
  554. var operationId = IdCreator.CreateId();
  555. _ = Task.Run(async () =>
  556. {
  557. await DeveloperManager.Shared.AssignDeveloperFolderAsync(folder.Id, developerTestFolder.Id, assignTestImageCount, operationId);
  558. });
  559. var progress = 0;
  560. while (progress < 100)
  561. {
  562. try
  563. {
  564. progress = await DeveloperManager.Shared.GetOperationProgressAsync(operationId);
  565. }
  566. catch (Exception)
  567. {
  568. //
  569. }
  570. await Task.Delay(200);
  571. }
  572. }
  573. catch (Exception ex)
  574. {
  575. Logger.WriteLineError($"创建测试文件夹失败:{ex}");
  576. Dispatcher.Invoke(() =>
  577. {
  578. MessageBox.Show(Application.Current.MainWindow, $"创建测试文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  579. });
  580. }
  581. finally
  582. {
  583. await LoadDeveloperFoldersAsync();
  584. Dispatcher.Invoke(() =>
  585. {
  586. ContentManager.HideLoading();
  587. });
  588. }
  589. }
  590. }
  591. private async void OnDeleteDeveloperFolderClick(object sender, RoutedEventArgs e)
  592. {
  593. var menuItem = (MenuItem)sender;
  594. var folder = (DeveloperFolderExtend)menuItem.DataContext;
  595. var result = MessageBox.Show(Application.Current.MainWindow, "是否删除整个文件夹?", "删除文件夹", MessageBoxButton.YesNo, MessageBoxImage.Question);
  596. if (result == MessageBoxResult.Yes)
  597. {
  598. try
  599. {
  600. Dispatcher.Invoke(() =>
  601. {
  602. ContentManager.ShowLoading();
  603. });
  604. var operationId = IdCreator.CreateId();
  605. _ = Task.Run(async () =>
  606. {
  607. await DeveloperManager.Shared.DeleteDeveloperFolderAsync(folder.Id, operationId);
  608. });
  609. var progress = 0;
  610. while (progress < 100)
  611. {
  612. try
  613. {
  614. progress = await DeveloperManager.Shared.GetOperationProgressAsync(operationId);
  615. }
  616. catch (Exception)
  617. {
  618. //
  619. }
  620. await Task.Delay(200);
  621. }
  622. Dispatcher.Invoke(() =>
  623. {
  624. _developerFolders.Remove(folder);
  625. });
  626. }
  627. catch (Exception ex)
  628. {
  629. Dispatcher.Invoke(() =>
  630. {
  631. MessageBox.Show(Application.Current.MainWindow, $"删除文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  632. });
  633. }
  634. finally
  635. {
  636. Dispatcher.Invoke(() =>
  637. {
  638. ContentManager.HideLoading();
  639. });
  640. }
  641. }
  642. }
  643. private async void OnEditDeveloperFolderClick(object sender, RoutedEventArgs e)
  644. {
  645. var menuItem = (MenuItem)sender;
  646. var folder = (DeveloperFolderExtend)menuItem.DataContext;
  647. var editFolderWindow = new EditFolderWindow(folder) { Owner = Application.Current.MainWindow };
  648. editFolderWindow.ShowDialog();
  649. if (editFolderWindow.FolderUpdated)
  650. {
  651. var folderName = editFolderWindow.NewFolderName;
  652. var folderDesc = editFolderWindow.NewFolderDescription;
  653. ContentManager.ShowLoading();
  654. try
  655. {
  656. await DeveloperManager.Shared.UpdateDeveloperFolderAsync(folder.Id, folderName, folderDesc);
  657. if (folder.Name != folderName)
  658. {
  659. await DeveloperManager.Shared.UpdateTrainTaskFolderNameAsync(folder.Id, folderName);
  660. }
  661. var index = _developerFolders.IndexOf(folder);
  662. _developerFolders.Remove(folder);
  663. folder.Name = folderName;
  664. folder.Description = folderDesc;
  665. _developerFolders.Insert(index, folder);
  666. }
  667. catch (Exception ex)
  668. {
  669. MessageBox.Show(Application.Current.MainWindow, $"更新文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  670. }
  671. finally
  672. {
  673. ContentManager.HideLoading();
  674. }
  675. }
  676. }
  677. private void OnNodeDoubleClickHandler(object sender, System.Windows.Input.MouseButtonEventArgs e)
  678. {
  679. }
  680. private void OnNodeMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
  681. {
  682. var treeViewItem = (TreeViewItem)sender;
  683. treeViewItem.IsSelected = true;
  684. treeViewItem.Focus();
  685. e.Handled = true;
  686. }
  687. private async void OnSharedDeveloperFolderClick(object sender, RoutedEventArgs e)
  688. {
  689. var menuItem = (MenuItem)sender;
  690. var folder = (DeveloperFolderExtend)menuItem.DataContext;
  691. var folderImageCategory = await DeveloperManager.Shared.GetImageCategoryAsync(folder.ImageCategoryId);
  692. if (folderImageCategory == null || folderImageCategory.Sharers.Count == 0)
  693. {
  694. MessageBox.Show(Application.Current.MainWindow, $"文件夹 {folder?.Name} 没有可选择的共享开发人员,等待管理员维护", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
  695. return;
  696. }
  697. var sharedFolderWindow = new SharedFolderWindow(folder.Name, folder.Sharers, folderImageCategory.Sharers) { Owner = Application.Current.MainWindow };
  698. sharedFolderWindow.ShowDialog();
  699. if (sharedFolderWindow.FolderUpdated)
  700. {
  701. var currSharers = sharedFolderWindow.Sharers;
  702. ContentManager.ShowLoading();
  703. try
  704. {
  705. var index = _developerFolders.IndexOf(folder);
  706. var state = ApprovalState.PendingApproval;
  707. if (currSharers.Count == 0 && folder.Sharers.Count > 0)
  708. {
  709. state = ApprovalState.Cancel;
  710. folder.IsShared = false;
  711. }
  712. await DeveloperManager.Shared.UpdateSharedDeveloperFolderAsync(folder.Id, state, currSharers);
  713. _developerFolders.Remove(folder);
  714. folder.Sharers = currSharers;
  715. _developerFolders.Insert(index, folder);
  716. }
  717. catch (Exception ex)
  718. {
  719. MessageBox.Show(Application.Current.MainWindow, $"更新文件夹失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  720. }
  721. finally
  722. {
  723. ContentManager.HideLoading();
  724. }
  725. }
  726. }
  727. }
  728. }