TimeBody.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _TimeUnitColumn = _interopRequireDefault(require("./TimeUnitColumn"));
  10. var _miscUtil = require("../../utils/miscUtil");
  11. var _timeUtil = require("../../utils/timeUtil");
  12. var _vnode = require("../../../_util/vnode");
  13. function generateUnits(start, end, step, disabledUnits) {
  14. const units = [];
  15. for (let i = start; i <= end; i += step) {
  16. units.push({
  17. label: (0, _miscUtil.leftPad)(i, 2),
  18. value: i,
  19. disabled: (disabledUnits || []).includes(i)
  20. });
  21. }
  22. return units;
  23. }
  24. const TimeBody = (0, _vue.defineComponent)({
  25. compatConfig: {
  26. MODE: 3
  27. },
  28. name: 'TimeBody',
  29. inheritAttrs: false,
  30. props: ['generateConfig', 'prefixCls', 'operationRef', 'activeColumnIndex', 'value', 'showHour', 'showMinute', 'showSecond', 'use12Hours', 'hourStep', 'minuteStep', 'secondStep', 'disabledHours', 'disabledMinutes', 'disabledSeconds', 'disabledTime', 'hideDisabledOptions', 'onSelect'],
  31. setup(props) {
  32. const originHour = (0, _vue.computed)(() => props.value ? props.generateConfig.getHour(props.value) : -1);
  33. const isPM = (0, _vue.computed)(() => {
  34. if (props.use12Hours) {
  35. return originHour.value >= 12; // -1 means should display AM
  36. } else {
  37. return false;
  38. }
  39. });
  40. const hour = (0, _vue.computed)(() => {
  41. // Should additional logic to handle 12 hours
  42. if (props.use12Hours) {
  43. return originHour.value % 12;
  44. } else {
  45. return originHour.value;
  46. }
  47. });
  48. const minute = (0, _vue.computed)(() => props.value ? props.generateConfig.getMinute(props.value) : -1);
  49. const second = (0, _vue.computed)(() => props.value ? props.generateConfig.getSecond(props.value) : -1);
  50. const now = (0, _vue.ref)(props.generateConfig.getNow());
  51. const mergedDisabledHours = (0, _vue.ref)();
  52. const mergedDisabledMinutes = (0, _vue.ref)();
  53. const mergedDisabledSeconds = (0, _vue.ref)();
  54. (0, _vue.onBeforeUpdate)(() => {
  55. now.value = props.generateConfig.getNow();
  56. });
  57. (0, _vue.watchEffect)(() => {
  58. if (props.disabledTime) {
  59. const disabledConfig = props.disabledTime(now);
  60. [mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [disabledConfig.disabledHours, disabledConfig.disabledMinutes, disabledConfig.disabledSeconds];
  61. } else {
  62. [mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [props.disabledHours, props.disabledMinutes, props.disabledSeconds];
  63. }
  64. });
  65. const setTime = (isNewPM, newHour, newMinute, newSecond) => {
  66. let newDate = props.value || props.generateConfig.getNow();
  67. const mergedHour = Math.max(0, newHour);
  68. const mergedMinute = Math.max(0, newMinute);
  69. const mergedSecond = Math.max(0, newSecond);
  70. newDate = (0, _timeUtil.setTime)(props.generateConfig, newDate, !props.use12Hours || !isNewPM ? mergedHour : mergedHour + 12, mergedMinute, mergedSecond);
  71. return newDate;
  72. };
  73. // ========================= Unit =========================
  74. const rawHours = (0, _vue.computed)(() => {
  75. var _a;
  76. return generateUnits(0, 23, (_a = props.hourStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledHours.value && mergedDisabledHours.value());
  77. });
  78. // const memorizedRawHours = useMemo(() => rawHours, rawHours, shouldUnitsUpdate);
  79. const AMPMDisabled = (0, _vue.computed)(() => {
  80. if (!props.use12Hours) {
  81. return [false, false];
  82. }
  83. const AMPMDisabled = [true, true];
  84. rawHours.value.forEach(_ref => {
  85. let {
  86. disabled,
  87. value: hourValue
  88. } = _ref;
  89. if (disabled) return;
  90. if (hourValue >= 12) {
  91. AMPMDisabled[1] = false;
  92. } else {
  93. AMPMDisabled[0] = false;
  94. }
  95. });
  96. return AMPMDisabled;
  97. });
  98. const hours = (0, _vue.computed)(() => {
  99. if (!props.use12Hours) return rawHours.value;
  100. return rawHours.value.filter(isPM.value ? hourMeta => hourMeta.value >= 12 : hourMeta => hourMeta.value < 12).map(hourMeta => {
  101. const hourValue = hourMeta.value % 12;
  102. const hourLabel = hourValue === 0 ? '12' : (0, _miscUtil.leftPad)(hourValue, 2);
  103. return (0, _extends2.default)((0, _extends2.default)({}, hourMeta), {
  104. label: hourLabel,
  105. value: hourValue
  106. });
  107. });
  108. });
  109. const minutes = (0, _vue.computed)(() => {
  110. var _a;
  111. return generateUnits(0, 59, (_a = props.minuteStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledMinutes.value && mergedDisabledMinutes.value(originHour.value));
  112. });
  113. const seconds = (0, _vue.computed)(() => {
  114. var _a;
  115. return generateUnits(0, 59, (_a = props.secondStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledSeconds.value && mergedDisabledSeconds.value(originHour.value, minute.value));
  116. });
  117. return () => {
  118. const {
  119. prefixCls,
  120. operationRef,
  121. activeColumnIndex,
  122. showHour,
  123. showMinute,
  124. showSecond,
  125. use12Hours,
  126. hideDisabledOptions,
  127. onSelect
  128. } = props;
  129. const columns = [];
  130. const contentPrefixCls = `${prefixCls}-content`;
  131. const columnPrefixCls = `${prefixCls}-time-panel`;
  132. // ====================== Operations ======================
  133. operationRef.value = {
  134. onUpDown: diff => {
  135. const column = columns[activeColumnIndex];
  136. if (column) {
  137. const valueIndex = column.units.findIndex(unit => unit.value === column.value);
  138. const unitLen = column.units.length;
  139. for (let i = 1; i < unitLen; i += 1) {
  140. const nextUnit = column.units[(valueIndex + diff * i + unitLen) % unitLen];
  141. if (nextUnit.disabled !== true) {
  142. column.onSelect(nextUnit.value);
  143. break;
  144. }
  145. }
  146. }
  147. }
  148. };
  149. // ======================== Render ========================
  150. function addColumnNode(condition, node, columnValue, units, onColumnSelect) {
  151. if (condition !== false) {
  152. columns.push({
  153. node: (0, _vnode.cloneElement)(node, {
  154. prefixCls: columnPrefixCls,
  155. value: columnValue,
  156. active: activeColumnIndex === columns.length,
  157. onSelect: onColumnSelect,
  158. units,
  159. hideDisabledOptions
  160. }),
  161. onSelect: onColumnSelect,
  162. value: columnValue,
  163. units
  164. });
  165. }
  166. }
  167. // Hour
  168. addColumnNode(showHour, (0, _vue.createVNode)(_TimeUnitColumn.default, {
  169. "key": "hour"
  170. }, null), hour.value, hours.value, num => {
  171. onSelect(setTime(isPM.value, num, minute.value, second.value), 'mouse');
  172. });
  173. // Minute
  174. addColumnNode(showMinute, (0, _vue.createVNode)(_TimeUnitColumn.default, {
  175. "key": "minute"
  176. }, null), minute.value, minutes.value, num => {
  177. onSelect(setTime(isPM.value, hour.value, num, second.value), 'mouse');
  178. });
  179. // Second
  180. addColumnNode(showSecond, (0, _vue.createVNode)(_TimeUnitColumn.default, {
  181. "key": "second"
  182. }, null), second.value, seconds.value, num => {
  183. onSelect(setTime(isPM.value, hour.value, minute.value, num), 'mouse');
  184. });
  185. // 12 Hours
  186. let PMIndex = -1;
  187. if (typeof isPM.value === 'boolean') {
  188. PMIndex = isPM.value ? 1 : 0;
  189. }
  190. addColumnNode(use12Hours === true, (0, _vue.createVNode)(_TimeUnitColumn.default, {
  191. "key": "12hours"
  192. }, null), PMIndex, [{
  193. label: 'AM',
  194. value: 0,
  195. disabled: AMPMDisabled.value[0]
  196. }, {
  197. label: 'PM',
  198. value: 1,
  199. disabled: AMPMDisabled.value[1]
  200. }], num => {
  201. onSelect(setTime(!!num, hour.value, minute.value, second.value), 'mouse');
  202. });
  203. return (0, _vue.createVNode)("div", {
  204. "class": contentPrefixCls
  205. }, [columns.map(_ref2 => {
  206. let {
  207. node
  208. } = _ref2;
  209. return node;
  210. })]);
  211. };
  212. }
  213. });
  214. var _default = exports.default = TimeBody;