CreateOrganizationPanel.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEditor.UIElements;
  4. using UnityEngine.UIElements;
  5. using PlasticGui;
  6. using Unity.PlasticSCM.Editor.UI.UIElements;
  7. using PlasticGui.WebApi;
  8. using PlasticGui.Configuration.CloudEdition.Welcome;
  9. using UnityEngine;
  10. namespace Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome
  11. {
  12. internal class CreateOrganizationPanel :
  13. VisualElement,
  14. IsValidOrganization.INotify,
  15. GetDatacenters.INotify,
  16. CreateOrganization.INotify
  17. {
  18. internal CreateOrganizationPanel(
  19. CloudEditionWelcomeWindow parentWindow,
  20. VisualElement parentPanel,
  21. IPlasticWebRestApi restApi)
  22. {
  23. mParentWindow = parentWindow;
  24. mParentPanel = parentPanel;
  25. mRestApi = restApi;
  26. InitializeLayoutAndStyles();
  27. BuildComponents();
  28. var progressControls = new ProgressControlsForDialogs(new VisualElement[] { mCreateButton, mBackButton });
  29. mProgressControls = progressControls;
  30. mGettingDatacentersProgressContainer.Add(progressControls);
  31. GetDatacenters.Run(
  32. mRestApi, mProgressControls, this);
  33. }
  34. internal void Dispose()
  35. {
  36. mLoadingSpinner.Dispose();
  37. mCreateButton.clicked -= CreateButton_Clicked;
  38. mOrganizationNameTextField.UnregisterValueChangedCallback(
  39. OnOrganizationNameTextFieldChanged);
  40. }
  41. void OnOrganizationNameTextFieldChanged(ChangeEvent<string> evt)
  42. {
  43. mOrganizationNameNotification.text = "";
  44. }
  45. void DataCenterClicked(DropdownMenuAction action)
  46. {
  47. mSelectedDatacenter = action.name;
  48. mDatacenter.text = action.name;
  49. }
  50. void DisplayAlert(Label label, string alert, Color color, bool display)
  51. {
  52. label.text = alert;
  53. label.style.color = color;
  54. if (alert.Length > 130)
  55. label.style.marginBottom = 30;
  56. else
  57. label.style.marginBottom = 5;
  58. if (display)
  59. label.RemoveFromClassList("hidden");
  60. else
  61. label.AddToClassList("hidden");
  62. }
  63. void GetDatacenters.INotify.Success(
  64. List<string> datacenters, int defaultDatacenter)
  65. {
  66. mSelectedDatacenter = datacenters.FirstOrDefault();
  67. mDatacenter = new ToolbarMenu { text = mSelectedDatacenter };
  68. foreach (string datacenter in datacenters)
  69. mDatacenter.menu.AppendAction(datacenter, DataCenterClicked, DataCenterActive);
  70. VisualElement datacenterContainer = this.Q<VisualElement>("datacenter");
  71. datacenterContainer.Add(mDatacenter);
  72. }
  73. void GetDatacenters.INotify.Error(string message)
  74. {
  75. DisplayAlert(mDataCenterRetryAlert, message, Color.red, true);
  76. mDataCenterRetryButton.RemoveFromClassList("hidden");
  77. }
  78. void IsValidOrganization.INotify.OrganizationAvailable(string organizationName)
  79. {
  80. if (organizationName != mOrganizationNameTextField.text)
  81. return;
  82. DisplayAlert(
  83. mOrganizationNameNotification,
  84. PlasticLocalization.GetString(PlasticLocalization.Name.Available),
  85. Color.green,
  86. true);
  87. }
  88. void IsValidOrganization.INotify.OrganizationUnavailable(string organizationName)
  89. {
  90. if (organizationName != mOrganizationNameTextField.text)
  91. return;
  92. DisplayAlert(
  93. mOrganizationNameNotification,
  94. PlasticLocalization.GetString(PlasticLocalization.Name.Unavailable),
  95. Color.red,
  96. true);
  97. }
  98. void IsValidOrganization.INotify.ValidationFailed(string validationResult)
  99. {
  100. DisplayAlert(
  101. mOrganizationNameNotification,
  102. validationResult,
  103. Color.red,
  104. true);
  105. }
  106. void IsValidOrganization.INotify.Error(string organizationName, string message)
  107. {
  108. if (organizationName != mOrganizationNameTextField.text)
  109. return;
  110. DisplayAlert(
  111. mOrganizationNameNotification,
  112. message,
  113. Color.red,
  114. true);
  115. }
  116. void CreateOrganization.INotify.Success(string organization)
  117. {
  118. mParentWindow.ReplaceRootPanel(new CreatedOrganizationPanel(
  119. mOrganizationNameTextField.text,
  120. mParentWindow));
  121. }
  122. void CreateOrganization.INotify.ValidationFailed(
  123. CreateOrganization.ValidationResult validationResult)
  124. {
  125. if (validationResult.OrganizationError != null)
  126. DisplayAlert(
  127. mOrganizationNameNotification,
  128. validationResult.OrganizationError,
  129. Color.red,
  130. true);
  131. if (validationResult.DatacenterError != null)
  132. DisplayAlert(
  133. mOrganizationNameNotification,
  134. validationResult.DatacenterError,
  135. Color.red,
  136. true);
  137. }
  138. void CreateOrganization.INotify.OrganizationUnavailable()
  139. {
  140. DisplayAlert(
  141. mOrganizationNameNotification,
  142. PlasticLocalization.GetString(PlasticLocalization.Name.Unavailable),
  143. Color.red,
  144. true);
  145. }
  146. void CreateOrganization.INotify.Error(string message)
  147. {
  148. mProgressControls.ShowError(message);
  149. }
  150. void OrganizationNameTextBox_DelayedTextChanged()
  151. {
  152. IsValidOrganization.Run(
  153. mRestApi, mOrganizationNameTextField.text, this);
  154. }
  155. void GetDatacentersRetryButton_Click()
  156. {
  157. mDataCenterRetryContainer.AddToClassList("hidden");
  158. GetDatacenters.Run(mRestApi, mProgressControls, this);
  159. }
  160. void EncryptionLinkLabel_LinkClicked()
  161. {
  162. Application.OpenURL(CreateOrganization.ENCRYPTION_LEARN_MORE_URL);
  163. }
  164. void BackButton_Clicked()
  165. {
  166. mParentWindow.ReplaceRootPanel(mParentPanel);
  167. }
  168. void CreateButton_Clicked()
  169. {
  170. CreateOrganization.Run(
  171. mRestApi,
  172. new CreateOrganization.Data(
  173. mOrganizationNameTextField.text,
  174. mDatacenter.text,
  175. mEncryptData.value),
  176. mProgressControls,
  177. this);
  178. }
  179. DropdownMenuAction.Status DataCenterActive(DropdownMenuAction action)
  180. {
  181. if (action.name == mSelectedDatacenter)
  182. return DropdownMenuAction.Status.Checked;
  183. return DropdownMenuAction.Status.Normal;
  184. }
  185. void BuildComponents()
  186. {
  187. mOrganizationNameTextField = this.Q<TextField>("orgName");
  188. mOrganizationNameTextField.RegisterValueChangedCallback(
  189. x => OrganizationNameTextBox_DelayedTextChanged());
  190. mOrganizationNameNotification = this.Q<Label>("orgNameNotification");
  191. mDataCenterRetryContainer = this.Q<VisualElement>("dataCenterRetryContainer");
  192. mDataCenterRetryAlert = this.Q<Label>("dataCenterRetryAlert");
  193. mDataCenterRetryButton = this.Q<Button>("dataCenterRetryButton");
  194. mDataCenterRetryButton.clicked += GetDatacentersRetryButton_Click;
  195. mBackButton = this.Q<Button>("back");
  196. mBackButton.clicked += BackButton_Clicked;
  197. mCreateButton = this.Q<Button>("create");
  198. mCreateButton.clicked += CreateButton_Clicked;
  199. mEncryptData = this.Q<Toggle>("encryptData");
  200. mEncryptLearnMoreButton = this.Q<Button>("encryptLearnMore");
  201. mEncryptLearnMoreButton.clicked += EncryptionLinkLabel_LinkClicked;
  202. mGettingDatacentersProgressContainer = this.Q<VisualElement>("gettingDatacenters");
  203. mOrganizationNameTextField.RegisterValueChangedCallback(
  204. OnOrganizationNameTextFieldChanged);
  205. mOrganizationNameTextField.FocusOnceLoaded();
  206. this.SetControlText<Label>("createLabel",
  207. PlasticLocalization.Name.CreateOrganizationTitle);
  208. this.SetControlLabel<TextField>("orgName",
  209. PlasticLocalization.Name.OrganizationName);
  210. this.SetControlText<Label>("datacenterLabel",
  211. PlasticLocalization.Name.Datacenter);
  212. this.SetControlText<Toggle>("encryptData",
  213. PlasticLocalization.Name.EncryptionCheckButton);
  214. this.SetControlText<Label>("encryptExplanation",
  215. PlasticLocalization.Name.EncryptionCheckButtonExplanation, "");
  216. this.SetControlText<Button>("encryptLearnMore",
  217. PlasticLocalization.Name.LearnMore);
  218. this.SetControlText<Button>("back",
  219. PlasticLocalization.Name.BackButton);
  220. this.SetControlText<Button>("create",
  221. PlasticLocalization.Name.CreateButton);
  222. }
  223. void InitializeLayoutAndStyles()
  224. {
  225. this.LoadLayout(typeof(CreateOrganizationPanel).Name);
  226. this.LoadStyle("SignInSignUp");
  227. this.LoadStyle(typeof(CreateOrganizationPanel).Name);
  228. }
  229. CloudEditionWelcomeWindow mParentWindow;
  230. VisualElement mParentPanel;
  231. TextField mOrganizationNameTextField;
  232. Label mOrganizationNameNotification;
  233. VisualElement mDataCenterRetryContainer;
  234. Label mDataCenterRetryAlert;
  235. Button mDataCenterRetryButton;
  236. ToolbarMenu mDatacenter;
  237. Button mBackButton;
  238. Button mCreateButton;
  239. Button mEncryptLearnMoreButton;
  240. VisualElement mGettingDatacentersProgressContainer;
  241. LoadingSpinner mLoadingSpinner;
  242. string mSelectedDatacenter;
  243. Toggle mEncryptData;
  244. IProgressControls mProgressControls;
  245. readonly IPlasticWebRestApi mRestApi;
  246. }
  247. }