ValuesForm.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import React, { Component } from 'react';
  2. import styled from 'styled-components';
  3. import _ from 'lodash';
  4. import { Section, FormElement } from '../../shared/types';
  5. import { Context } from '../../shared/Context';
  6. import api from '../../shared/api';
  7. import CheckboxRow from './CheckboxRow';
  8. import InputRow from './InputRow';
  9. import Base64InputRow from './Base64InputRow';
  10. import SelectRow from './SelectRow';
  11. import Helper from './Helper';
  12. import Heading from './Heading';
  13. import ExpandableResource from '../ExpandableResource';
  14. import VeleroForm from '../forms/VeleroForm';
  15. let dummySections = [
  16. {
  17. "name":"section_one",
  18. "show_if":"",
  19. "contents":[
  20. {
  21. "type":"heading",
  22. "label":"Polyphia",
  23. },
  24. {
  25. "type":"subtitle",
  26. "label":"Tim Hendrix",
  27. },
  28. {
  29. "type":"velero-create-backup",
  30. "label":"Tim Hendrix",
  31. },
  32. ]
  33. }
  34. ];
  35. type PropsType = {
  36. sections?: Section[],
  37. metaState?: any,
  38. setMetaState?: any,
  39. };
  40. type StateType = any;
  41. export default class ValuesForm extends Component<PropsType, StateType> {
  42. getInputValue = (item: FormElement) => {
  43. let key = item.name || item.variable;
  44. let value = this.props.metaState[key];
  45. if (item.settings && item.settings.unit && value) {
  46. value = value.split(item.settings.unit)[0]
  47. }
  48. return value;
  49. }
  50. renderSection = (section: Section) => {
  51. return section.contents.map((item: FormElement, i: number) => {
  52. // If no name is assigned use values.yaml variable as identifier
  53. let key = item.name || item.variable;
  54. switch (item.type) {
  55. case 'heading':
  56. return <Heading key={i}>{item.label}</Heading>;
  57. case 'subtitle':
  58. return <Helper key={i}>{item.label}</Helper>;
  59. case 'resource-list':
  60. if (Array.isArray(item.value)) {
  61. return (
  62. <ResourceList>
  63. {
  64. item.value.map((resource: any, i: number) => {
  65. return (
  66. <ExpandableResource
  67. key={i}
  68. resource={resource}
  69. isLast={i === item.value.length - 1}
  70. roundAllCorners={true}
  71. />
  72. );
  73. })
  74. }
  75. </ResourceList>
  76. );
  77. }
  78. case 'checkbox':
  79. return (
  80. <CheckboxRow
  81. key={i}
  82. checked={this.props.metaState[key]}
  83. toggle={() => this.props.setMetaState({ [key]: !this.props.metaState[key] })}
  84. label={item.label}
  85. />
  86. );
  87. case 'string-input':
  88. return (
  89. <InputRow
  90. key={i}
  91. isRequired={item.required}
  92. type='text'
  93. value={this.getInputValue(item)}
  94. setValue={(x: string) => {
  95. if (item.settings && item.settings.unit && x !== '') {
  96. x = x + item.settings.unit;
  97. }
  98. this.props.setMetaState({ [key]: x });
  99. }}
  100. label={item.label}
  101. unit={item.settings ? item.settings.unit : null}
  102. />
  103. );
  104. case 'number-input':
  105. return (
  106. <InputRow
  107. key={i}
  108. isRequired={item.required}
  109. type='number'
  110. value={this.getInputValue(item)}
  111. setValue={(x: number) => {
  112. let val: string | number = x;
  113. if (Number.isNaN(x)) {
  114. val = ''
  115. }
  116. // Convert to string if unit is set
  117. if (item.settings && item.settings.unit) {
  118. val = x.toString();
  119. val = val + item.settings.unit;
  120. }
  121. this.props.setMetaState({ [key]: val });
  122. }}
  123. label={item.label}
  124. unit={item.settings ? item.settings.unit : null}
  125. />
  126. );
  127. case 'select':
  128. return (
  129. <SelectRow
  130. key={i}
  131. value={this.props.metaState[key]}
  132. setActiveValue={(val) => this.props.setMetaState({ [key]: val })}
  133. options={item.settings.options}
  134. dropdownLabel=''
  135. label={item.label}
  136. />
  137. );
  138. case 'velero-create-backup':
  139. return (
  140. <VeleroForm
  141. />
  142. );
  143. case 'base-64':
  144. return (
  145. <Base64InputRow
  146. key={i}
  147. isRequired={item.required}
  148. type='b64'
  149. value={this.getInputValue(item)}
  150. setValue={(x: string) => {
  151. if (item.settings && item.settings.unit && x !== '') {
  152. x = x + item.settings.unit;
  153. }
  154. this.props.setMetaState({ [key]: btoa(x) });
  155. }}
  156. label={item.label}
  157. unit={item.settings ? item.settings.unit : null}
  158. />
  159. );
  160. case 'base-64-password':
  161. return (
  162. <Base64InputRow
  163. key={i}
  164. isRequired={item.required}
  165. type='b64-pass'
  166. value={this.getInputValue(item)}
  167. setValue={(x: string) => {
  168. if (item.settings && item.settings.unit && x !== '') {
  169. x = x + item.settings.unit;
  170. }
  171. this.props.setMetaState({ [key]: btoa(x) });
  172. }}
  173. label={item.label}
  174. unit={item.settings ? item.settings.unit : null}
  175. />
  176. );
  177. default:
  178. }
  179. });
  180. }
  181. renderFormContents = () => {
  182. if (this.props.metaState) {
  183. return this.props.sections.map((section: Section, i: number) => {
  184. // Hide collapsible section if deciding field is false
  185. if (section.show_if) {
  186. if (!this.props.metaState[section.show_if]) {
  187. return null;
  188. }
  189. }
  190. return (
  191. <div key={i}>
  192. {this.renderSection(section)}
  193. </div>
  194. );
  195. });
  196. }
  197. }
  198. render() {
  199. return (
  200. <StyledValuesForm>
  201. <DarkMatter />
  202. {this.renderFormContents()}
  203. </StyledValuesForm>
  204. );
  205. }
  206. }
  207. ValuesForm.contextType = Context;
  208. const ResourceList = styled.div`
  209. margin-bottom: 15px;
  210. margin-top: 20px;
  211. border-radius: 5px;
  212. overflow: hidden;
  213. `;
  214. const DarkMatter = styled.div`
  215. margin-top: 0px;
  216. `;
  217. const StyledValuesForm = styled.div`
  218. width: 100%;
  219. height: 100%;
  220. background: #ffffff11;
  221. color: #ffffff;
  222. padding: 0px 35px 25px;
  223. position: relative;
  224. border-radius: 5px;
  225. font-size: 13px;
  226. overflow: auto;
  227. `;