control.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import {
  21. IControl,
  22. IControlRelatedView,
  23. IControlOption
  24. } from 'app/components/Control/types'
  25. import {
  26. ControlFieldTypes,
  27. ControlTypes,
  28. ControlOptionTypes,
  29. ControlDefaultValueTypes,
  30. ControlVisibilityTypes
  31. } from 'app/components/Control/constants'
  32. import { ViewVariableValueTypes } from 'app/containers/View/constants'
  33. import { DEFAULT_CACHE_EXPIRED, SqlTypes } from 'app/globalConstants'
  34. import { IRelativeDate } from 'app/components/RelativeDatePicker/types'
  35. import {
  36. RelativeDateType,
  37. RelativeDateValueType
  38. } from 'app/components/RelativeDatePicker/constants'
  39. function beta5(control: ILegacyGlobalControl): ILegacyGlobalControl
  40. function beta5(control: ILegacyLocalControl): ILegacyLocalControl
  41. function beta5(control: IControl): IControl
  42. function beta5(control) {
  43. /* IGlobalControl & ILocalControl:
  44. * 1. + cache
  45. * 2. + expired
  46. */
  47. const { type, cache, expired } = control
  48. if (
  49. type === ControlTypes.Select &&
  50. (cache === void 0 || expired === void 0)
  51. ) {
  52. return {
  53. ...control,
  54. cache: false,
  55. expired: DEFAULT_CACHE_EXPIRED
  56. }
  57. }
  58. return control
  59. }
  60. function beta9(
  61. control: ILegacyGlobalControl | ILegacyLocalControl | IControl,
  62. opts
  63. ) {
  64. /*
  65. * IGlobalControl
  66. * & --> IControl
  67. * ILocalControl
  68. *
  69. * IControl:
  70. * 1. - interactionType(move it into each `relatedViews` and rename to `fieldType`)
  71. * 2. + optionType, optional
  72. * 3. + valueViewId, optional
  73. * 4. + valueField, optional
  74. * 5. + textField, optional
  75. * 6. + parentField, optional
  76. * 7. customOptions: change type to IControlOption[]
  77. * 8. - options, options -> customOptions
  78. * 9. + optionWithVariable, optional
  79. * 10. + defaultValueType
  80. * 11. + radioType, optional
  81. * 12. + min, optional
  82. * 13. + max, optional
  83. * 14. + step, optional
  84. * 15. + label, optional
  85. * 16. - dynamicDefaultValue, values transform as
  86. * a. 'custom' -> just set defaultValueType to ControlDefaultValueType.Fixed
  87. * b. others -> transform to defaultValue, and set defaultValueType to ControlDefaultValueType.Dynamic
  88. * 17. + visibility
  89. * 18. + conditions, optional
  90. * 19. relatedViews: change type to IControlRelatedView
  91. * IControlRelatedView:
  92. * 1. + fieldType
  93. * 2. + fields
  94. * 3. name -> fields(element)
  95. * 4. - type
  96. * 5. - optionsFromColumn(move each relatedViews[first-view-id].optionsFromColumn -> autoGetOptionsFromRelatedViews)
  97. * 6. - column(move each relatedViews[first-view-id].column -> valueField)
  98. * 7. structure change
  99. * old
  100. * [viewId]: { name: 'foo', type: 'VARCHAR' }
  101. * recent
  102. * [viewId]: {
  103. * fieldType: 'column',
  104. * fields: ['foo']
  105. * }
  106. *
  107. * old
  108. * [viewId]: [
  109. * { name: 'foo', type: 'date' },
  110. * { name: 'bar', type: 'date' }
  111. * ]
  112. * recent
  113. * [viewId]: {
  114. * fieldType: 'variable',
  115. * fields: ['foo', 'bar']
  116. * }
  117. */
  118. if ((control as ILegacyGlobalControl | ILegacyLocalControl).interactionType) {
  119. if ((control as ILegacyLocalControl).fields) {
  120. const {
  121. interactionType,
  122. customOptions,
  123. options,
  124. dynamicDefaultValue,
  125. defaultValue,
  126. fields,
  127. ...rest
  128. } = control as ILegacyLocalControl
  129. const { relatedView, valueInfo } = beta9FieldsTransform(
  130. fields,
  131. rest.type,
  132. interactionType,
  133. customOptions,
  134. options,
  135. opts.viewId
  136. )
  137. return {
  138. ...rest,
  139. relatedViews: {
  140. [opts.viewId]: relatedView
  141. },
  142. ...(valueInfo && valueInfo),
  143. ...beta9DefaultValueTransform(
  144. rest.type,
  145. dynamicDefaultValue,
  146. defaultValue
  147. ),
  148. visibility: ControlVisibilityTypes.Visible
  149. }
  150. } else {
  151. const {
  152. interactionType,
  153. relatedViews,
  154. customOptions,
  155. options,
  156. dynamicDefaultValue,
  157. defaultValue,
  158. ...rest
  159. } = control as ILegacyGlobalControl
  160. const migratedRelatedViews = {}
  161. let valueFieldInfo
  162. Object.entries(relatedViews).forEach(([key, value], index) => {
  163. const { relatedView, valueInfo } = beta9FieldsTransform(
  164. value,
  165. rest.type,
  166. interactionType,
  167. customOptions,
  168. options,
  169. key
  170. )
  171. migratedRelatedViews[key] = relatedView
  172. if (!index) {
  173. valueFieldInfo = valueInfo
  174. }
  175. })
  176. return {
  177. relatedViews: migratedRelatedViews,
  178. ...rest,
  179. ...(valueFieldInfo && valueFieldInfo),
  180. ...beta9DefaultValueTransform(
  181. rest.type,
  182. dynamicDefaultValue,
  183. defaultValue
  184. ),
  185. visibility: ControlVisibilityTypes.Visible
  186. }
  187. }
  188. } else {
  189. return control as IControl
  190. }
  191. }
  192. function beta9FieldsTransform(
  193. fields: ILegacyControlRelatedField | ILegacyControlRelatedField[],
  194. controlType: ControlTypes,
  195. interactionType: ControlFieldTypes,
  196. customOptions: boolean,
  197. options: IControlOption[],
  198. valueViewId: string
  199. ): {
  200. relatedView: IControlRelatedView
  201. valueInfo?: Pick<
  202. IControl,
  203. | 'optionType'
  204. | 'customOptions'
  205. | 'valueViewId'
  206. | 'valueField'
  207. | 'optionWithVariable'
  208. >
  209. } {
  210. if (Array.isArray(fields)) {
  211. return {
  212. relatedView: {
  213. fieldType: interactionType,
  214. fields: fields.map(({ name }) => name)
  215. }
  216. }
  217. } else {
  218. const { name, type, optionsFromColumn, column } = fields
  219. let valueInfo: Pick<
  220. IControl,
  221. | 'optionType'
  222. | 'customOptions'
  223. | 'valueViewId'
  224. | 'valueField'
  225. | 'optionWithVariable'
  226. > = {}
  227. if (controlType === ControlTypes.Select) {
  228. if (interactionType === ControlFieldTypes.Variable && optionsFromColumn) {
  229. valueInfo = {
  230. optionType: ControlOptionTypes.Manual,
  231. valueViewId: Number(valueViewId),
  232. valueField: column
  233. }
  234. } else {
  235. valueInfo = {
  236. optionType: customOptions
  237. ? ControlOptionTypes.Custom
  238. : ControlOptionTypes.Auto,
  239. customOptions: customOptions ? options : void 0,
  240. ...(customOptions && { optionWithVariable: false })
  241. }
  242. }
  243. }
  244. return {
  245. relatedView: {
  246. fieldType: interactionType,
  247. fields: [name]
  248. },
  249. valueInfo
  250. }
  251. }
  252. }
  253. function beta9DefaultValueTransform(
  254. type: ControlTypes,
  255. dynamicDefaultValue: any,
  256. defaultValue: any
  257. ): {
  258. defaultValueType: ControlDefaultValueTypes
  259. defaultValue: any
  260. } {
  261. if (type === ControlTypes.Date) {
  262. if (
  263. !dynamicDefaultValue ||
  264. dynamicDefaultValue === LegacyDatePickerDefaultValues.Custom
  265. ) {
  266. return {
  267. defaultValueType: ControlDefaultValueTypes.Fixed,
  268. defaultValue
  269. }
  270. } else {
  271. let transformed: IRelativeDate
  272. switch (dynamicDefaultValue) {
  273. case LegacyDatePickerDefaultValues.Today:
  274. transformed = {
  275. valueType: RelativeDateValueType.Current,
  276. value: 0,
  277. type: RelativeDateType.Day
  278. }
  279. break
  280. case LegacyDatePickerDefaultValues.Yesterday:
  281. transformed = {
  282. valueType: RelativeDateValueType.Prev,
  283. value: 1,
  284. type: RelativeDateType.Day
  285. }
  286. break
  287. case LegacyDatePickerDefaultValues.Week:
  288. transformed = {
  289. valueType: RelativeDateValueType.Current,
  290. value: 0,
  291. type: RelativeDateType.Week
  292. }
  293. break
  294. case LegacyDatePickerDefaultValues.Day7:
  295. transformed = {
  296. valueType: RelativeDateValueType.Prev,
  297. value: 7,
  298. type: RelativeDateType.Day
  299. }
  300. break
  301. case LegacyDatePickerDefaultValues.LastWeek:
  302. transformed = {
  303. valueType: RelativeDateValueType.Prev,
  304. value: 1,
  305. type: RelativeDateType.Week
  306. }
  307. break
  308. case LegacyDatePickerDefaultValues.Month:
  309. transformed = {
  310. valueType: RelativeDateValueType.Current,
  311. value: 0,
  312. type: RelativeDateType.Month
  313. }
  314. break
  315. case LegacyDatePickerDefaultValues.Day30:
  316. transformed = {
  317. valueType: RelativeDateValueType.Prev,
  318. value: 30,
  319. type: RelativeDateType.Day
  320. }
  321. break
  322. case LegacyDatePickerDefaultValues.LastMonth:
  323. transformed = {
  324. valueType: RelativeDateValueType.Prev,
  325. value: 1,
  326. type: RelativeDateType.Month
  327. }
  328. break
  329. case LegacyDatePickerDefaultValues.Quarter:
  330. transformed = {
  331. valueType: RelativeDateValueType.Current,
  332. value: 0,
  333. type: RelativeDateType.Quarter
  334. }
  335. break
  336. case LegacyDatePickerDefaultValues.Day90:
  337. transformed = {
  338. valueType: RelativeDateValueType.Prev,
  339. value: 90,
  340. type: RelativeDateType.Day
  341. }
  342. break
  343. case LegacyDatePickerDefaultValues.LastQuarter:
  344. transformed = {
  345. valueType: RelativeDateValueType.Prev,
  346. value: 1,
  347. type: RelativeDateType.Quarter
  348. }
  349. break
  350. case LegacyDatePickerDefaultValues.Year:
  351. transformed = {
  352. valueType: RelativeDateValueType.Current,
  353. value: 0,
  354. type: RelativeDateType.Year
  355. }
  356. break
  357. case LegacyDatePickerDefaultValues.Day365:
  358. transformed = {
  359. valueType: RelativeDateValueType.Prev,
  360. value: 365,
  361. type: RelativeDateType.Day
  362. }
  363. break
  364. case LegacyDatePickerDefaultValues.LastYear:
  365. transformed = {
  366. valueType: RelativeDateValueType.Prev,
  367. value: 1,
  368. type: RelativeDateType.Year
  369. }
  370. break
  371. }
  372. return {
  373. defaultValueType: ControlDefaultValueTypes.Dynamic,
  374. defaultValue: transformed
  375. }
  376. }
  377. } else {
  378. return {
  379. defaultValueType: ControlDefaultValueTypes.Fixed,
  380. defaultValue: void 0
  381. }
  382. }
  383. }
  384. /*
  385. * legacy types
  386. */
  387. interface ILegacyControlBase
  388. extends Omit<IControl, 'relatedViews' | 'customOptions'> {
  389. interactionType: ControlFieldTypes
  390. customOptions?: boolean
  391. options?: IControlOption[]
  392. dynamicDefaultValue?: any
  393. }
  394. interface ILegacyGlobalControl extends ILegacyControlBase {
  395. relatedViews: {
  396. [viewId: string]: ILegacyControlRelatedField | ILegacyControlRelatedField[]
  397. }
  398. }
  399. interface ILegacyLocalControl extends ILegacyControlBase {
  400. fields: ILegacyControlRelatedField | ILegacyControlRelatedField[]
  401. }
  402. interface ILegacyControlRelatedField extends IControlRelatedView {
  403. name: string
  404. type: SqlTypes | ViewVariableValueTypes
  405. optionsFromColumn?: boolean
  406. column?: string
  407. }
  408. enum LegacyDatePickerDefaultValues {
  409. Today = 'today',
  410. Yesterday = 'yesterday',
  411. Week = 'week',
  412. Day7 = 'day7',
  413. LastWeek = 'lastWeek',
  414. Month = 'month',
  415. Day30 = 'day30',
  416. LastMonth = 'lastMonth',
  417. Quarter = 'quarter',
  418. Day90 = 'day90',
  419. LastQuarter = 'lastQuarter',
  420. Year = 'year',
  421. Day365 = 'day365',
  422. LastYear = 'lastYear',
  423. Custom = 'custom'
  424. }
  425. export default {
  426. beta5,
  427. beta9
  428. }