AzureSetting.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. import type { JSX } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import type { UseFormRegister } from 'react-hook-form';
  4. import type { FileUploadFormValues } from './FileUploadSetting.types';
  5. import MaskedInput from './MaskedInput';
  6. export type AzureSettingMoleculeProps = {
  7. register: UseFormRegister<FileUploadFormValues>;
  8. azureReferenceFileWithRelayMode: boolean;
  9. azureUseOnlyEnvVars: boolean;
  10. envAzureTenantId?: string;
  11. envAzureClientId?: string;
  12. envAzureClientSecret?: string;
  13. envAzureStorageAccountName?: string;
  14. envAzureStorageContainerName?: string;
  15. onChangeAzureReferenceFileWithRelayMode: (val: boolean) => void;
  16. };
  17. export const AzureSettingMolecule = (
  18. props: AzureSettingMoleculeProps,
  19. ): JSX.Element => {
  20. const { t } = useTranslation();
  21. const {
  22. azureReferenceFileWithRelayMode,
  23. azureUseOnlyEnvVars,
  24. envAzureTenantId,
  25. envAzureClientId,
  26. envAzureClientSecret,
  27. envAzureStorageAccountName,
  28. envAzureStorageContainerName,
  29. } = props;
  30. return (
  31. <>
  32. <div className="row form-group my-3">
  33. <span className="text-left text-md-right col-md-3 col-form-label">
  34. {t('admin:app_setting.file_delivery_method')}
  35. </span>
  36. <div className="col-md-6">
  37. <div className="dropdown">
  38. <button
  39. className="btn btn-outline-secondary dropdown-toggle"
  40. type="button"
  41. id="ddAzureReferenceFileWithRelayMode"
  42. data-toggle="dropdown"
  43. aria-haspopup="true"
  44. aria-expanded="true"
  45. >
  46. {azureReferenceFileWithRelayMode &&
  47. t('admin:app_setting.file_delivery_method_relay')}
  48. {!azureReferenceFileWithRelayMode &&
  49. t('admin:app_setting.file_delivery_method_redirect')}
  50. </button>
  51. <div className="dropdown-menu">
  52. <button
  53. className="dropdown-item"
  54. type="button"
  55. onClick={() => {
  56. props.onChangeAzureReferenceFileWithRelayMode(true);
  57. }}
  58. >
  59. {t('admin:app_setting.file_delivery_method_relay')}
  60. </button>
  61. <button
  62. className="dropdown-item"
  63. type="button"
  64. onClick={() => {
  65. props.onChangeAzureReferenceFileWithRelayMode(false);
  66. }}
  67. >
  68. {t('admin:app_setting.file_delivery_method_redirect')}
  69. </button>
  70. </div>
  71. <p className="form-text text-muted small">
  72. {t('admin:app_setting.file_delivery_method_redirect_info')}
  73. <br />
  74. {t('admin:app_setting.file_delivery_method_relay_info')}
  75. </p>
  76. </div>
  77. </div>
  78. </div>
  79. {azureUseOnlyEnvVars && (
  80. <p
  81. className="alert alert-info"
  82. // eslint-disable-next-line react/no-danger
  83. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes <br> and <code> from i18n strings
  84. dangerouslySetInnerHTML={{
  85. __html: t('admin:app_setting.azure_note_for_the_only_env_option', {
  86. env: 'AZURE_USES_ONLY_ENV_VARS_FOR_SOME_OPTIONS',
  87. }),
  88. }}
  89. />
  90. )}
  91. <table
  92. className={`table settings-table ${azureUseOnlyEnvVars && 'use-only-env-vars'}`}
  93. >
  94. <colgroup>
  95. <col className="item-name" />
  96. <col className="from-db" />
  97. <col className="from-env-vars" />
  98. </colgroup>
  99. <thead>
  100. <tr>
  101. <th></th>
  102. <th>Database</th>
  103. <th>Environment variables</th>
  104. </tr>
  105. </thead>
  106. <tbody>
  107. <tr>
  108. <th>{t('admin:app_setting.azure_tenant_id')}</th>
  109. <td>
  110. <MaskedInput
  111. register={props.register}
  112. fieldName="azureTenantId"
  113. readOnly={azureUseOnlyEnvVars}
  114. />
  115. </td>
  116. <td>
  117. <MaskedInput
  118. name="envAzureTenantId"
  119. value={envAzureTenantId || ''}
  120. readOnly
  121. tabIndex={-1}
  122. />
  123. <p className="form-text text-muted">
  124. {/* eslint-disable-next-line react/no-danger */}
  125. <small
  126. // eslint-disable-next-line react/no-danger
  127. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes markup from i18n strings
  128. dangerouslySetInnerHTML={{
  129. __html: t('admin:app_setting.use_env_var_if_empty', {
  130. variable: 'AZURE_TENANT_ID',
  131. }),
  132. }}
  133. />
  134. </p>
  135. </td>
  136. </tr>
  137. <tr>
  138. <th>{t('admin:app_setting.azure_client_id')}</th>
  139. <td>
  140. <MaskedInput
  141. register={props.register}
  142. fieldName="azureClientId"
  143. readOnly={azureUseOnlyEnvVars}
  144. />
  145. </td>
  146. <td>
  147. <MaskedInput
  148. name="envAzureClientId"
  149. value={envAzureClientId || ''}
  150. readOnly
  151. tabIndex={-1}
  152. />
  153. <p className="form-text text-muted">
  154. {/* eslint-disable-next-line react/no-danger */}
  155. <small
  156. // eslint-disable-next-line react/no-danger
  157. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes markup from i18n strings
  158. dangerouslySetInnerHTML={{
  159. __html: t('admin:app_setting.use_env_var_if_empty', {
  160. variable: 'AZURE_CLIENT_ID',
  161. }),
  162. }}
  163. />
  164. </p>
  165. </td>
  166. </tr>
  167. <tr>
  168. <th>{t('admin:app_setting.azure_client_secret')}</th>
  169. <td>
  170. <MaskedInput
  171. register={props.register}
  172. fieldName="azureClientSecret"
  173. readOnly={azureUseOnlyEnvVars}
  174. />
  175. </td>
  176. <td>
  177. <MaskedInput
  178. name="envAzureClientSecret"
  179. value={envAzureClientSecret || ''}
  180. readOnly
  181. tabIndex={-1}
  182. />
  183. <p className="form-text text-muted">
  184. {/* eslint-disable-next-line react/no-danger */}
  185. <small
  186. // eslint-disable-next-line react/no-danger
  187. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes markup from i18n strings
  188. dangerouslySetInnerHTML={{
  189. __html: t('admin:app_setting.use_env_var_if_empty', {
  190. variable: 'AZURE_CLIENT_SECRET',
  191. }),
  192. }}
  193. />
  194. </p>
  195. </td>
  196. </tr>
  197. <tr>
  198. <th>{t('admin:app_setting.azure_storage_account_name')}</th>
  199. <td>
  200. <input
  201. className="form-control"
  202. type="text"
  203. readOnly={azureUseOnlyEnvVars}
  204. {...props.register('azureStorageAccountName')}
  205. />
  206. </td>
  207. <td>
  208. <input
  209. className="form-control"
  210. type="text"
  211. value={envAzureStorageAccountName || ''}
  212. readOnly
  213. tabIndex={-1}
  214. />
  215. <p className="form-text text-muted">
  216. {/* eslint-disable-next-line react/no-danger */}
  217. <small
  218. // eslint-disable-next-line react/no-danger
  219. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes markup from i18n strings
  220. dangerouslySetInnerHTML={{
  221. __html: t('admin:app_setting.use_env_var_if_empty', {
  222. variable: 'AZURE_STORAGE_ACCOUNT_NAME',
  223. }),
  224. }}
  225. />
  226. </p>
  227. </td>
  228. </tr>
  229. <tr>
  230. <th>{t('admin:app_setting.azure_storage_container_name')}</th>
  231. <td>
  232. <input
  233. className="form-control"
  234. type="text"
  235. readOnly={azureUseOnlyEnvVars}
  236. {...props.register('azureStorageContainerName')}
  237. />
  238. </td>
  239. <td>
  240. <input
  241. className="form-control"
  242. type="text"
  243. value={envAzureStorageContainerName || ''}
  244. readOnly
  245. tabIndex={-1}
  246. />
  247. <p className="form-text text-muted">
  248. {/* eslint-disable-next-line react/no-danger */}
  249. <small
  250. // eslint-disable-next-line react/no-danger
  251. // biome-ignore lint/security/noDangerouslySetInnerHtml: includes markup from i18n strings
  252. dangerouslySetInnerHTML={{
  253. __html: t('admin:app_setting.use_env_var_if_empty', {
  254. variable: 'AZURE_STORAGE_CONTAINER_NAME',
  255. }),
  256. }}
  257. />
  258. </p>
  259. </td>
  260. </tr>
  261. </tbody>
  262. </table>
  263. </>
  264. );
  265. };