generateCalendar.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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 _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _useMergedState = _interopRequireDefault(require("../_util/hooks/useMergedState"));
  11. var _vcPicker = require("../vc-picker");
  12. var _LocaleReceiver = require("../locale-provider/LocaleReceiver");
  13. var _en_US = _interopRequireDefault(require("./locale/en_US"));
  14. var _Header = _interopRequireDefault(require("./Header"));
  15. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  16. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  17. var _style = _interopRequireDefault(require("./style"));
  18. // CSSINJS
  19. function generateCalendar(generateConfig) {
  20. function isSameYear(date1, date2) {
  21. return date1 && date2 && generateConfig.getYear(date1) === generateConfig.getYear(date2);
  22. }
  23. function isSameMonth(date1, date2) {
  24. return isSameYear(date1, date2) && generateConfig.getMonth(date1) === generateConfig.getMonth(date2);
  25. }
  26. function isSameDate(date1, date2) {
  27. return isSameMonth(date1, date2) && generateConfig.getDate(date1) === generateConfig.getDate(date2);
  28. }
  29. const Calendar = (0, _vue.defineComponent)({
  30. name: 'ACalendar',
  31. inheritAttrs: false,
  32. props: {
  33. prefixCls: String,
  34. locale: {
  35. type: Object,
  36. default: undefined
  37. },
  38. validRange: {
  39. type: Array,
  40. default: undefined
  41. },
  42. disabledDate: {
  43. type: Function,
  44. default: undefined
  45. },
  46. dateFullCellRender: {
  47. type: Function,
  48. default: undefined
  49. },
  50. dateCellRender: {
  51. type: Function,
  52. default: undefined
  53. },
  54. monthFullCellRender: {
  55. type: Function,
  56. default: undefined
  57. },
  58. monthCellRender: {
  59. type: Function,
  60. default: undefined
  61. },
  62. headerRender: {
  63. type: Function,
  64. default: undefined
  65. },
  66. value: {
  67. type: [Object, String],
  68. default: undefined
  69. },
  70. defaultValue: {
  71. type: [Object, String],
  72. default: undefined
  73. },
  74. mode: {
  75. type: String,
  76. default: undefined
  77. },
  78. fullscreen: {
  79. type: Boolean,
  80. default: undefined
  81. },
  82. onChange: {
  83. type: Function,
  84. default: undefined
  85. },
  86. 'onUpdate:value': {
  87. type: Function,
  88. default: undefined
  89. },
  90. onPanelChange: {
  91. type: Function,
  92. default: undefined
  93. },
  94. onSelect: {
  95. type: Function,
  96. default: undefined
  97. },
  98. valueFormat: {
  99. type: String,
  100. default: undefined
  101. }
  102. },
  103. slots: Object,
  104. setup(p, _ref) {
  105. let {
  106. emit,
  107. slots,
  108. attrs
  109. } = _ref;
  110. const props = p;
  111. const {
  112. prefixCls,
  113. direction
  114. } = (0, _useConfigInject.default)('picker', props);
  115. // style
  116. const [wrapSSR, hashId] = (0, _style.default)(prefixCls);
  117. const calendarPrefixCls = (0, _vue.computed)(() => `${prefixCls.value}-calendar`);
  118. const maybeToString = date => {
  119. return props.valueFormat ? generateConfig.toString(date, props.valueFormat) : date;
  120. };
  121. const value = (0, _vue.computed)(() => {
  122. if (props.value) {
  123. return props.valueFormat ? generateConfig.toDate(props.value, props.valueFormat) : props.value;
  124. }
  125. return props.value === '' ? undefined : props.value;
  126. });
  127. const defaultValue = (0, _vue.computed)(() => {
  128. if (props.defaultValue) {
  129. return props.valueFormat ? generateConfig.toDate(props.defaultValue, props.valueFormat) : props.defaultValue;
  130. }
  131. return props.defaultValue === '' ? undefined : props.defaultValue;
  132. });
  133. // Value
  134. const [mergedValue, setMergedValue] = (0, _useMergedState.default)(() => value.value || generateConfig.getNow(), {
  135. defaultValue: defaultValue.value,
  136. value
  137. });
  138. // Mode
  139. const [mergedMode, setMergedMode] = (0, _useMergedState.default)('month', {
  140. value: (0, _vue.toRef)(props, 'mode')
  141. });
  142. const panelMode = (0, _vue.computed)(() => mergedMode.value === 'year' ? 'month' : 'date');
  143. const mergedDisabledDate = (0, _vue.computed)(() => {
  144. return date => {
  145. var _a;
  146. const notInRange = props.validRange ? generateConfig.isAfter(props.validRange[0], date) || generateConfig.isAfter(date, props.validRange[1]) : false;
  147. return notInRange || !!((_a = props.disabledDate) === null || _a === void 0 ? void 0 : _a.call(props, date));
  148. };
  149. });
  150. // ====================== Events ======================
  151. const triggerPanelChange = (date, newMode) => {
  152. emit('panelChange', maybeToString(date), newMode);
  153. };
  154. const triggerChange = date => {
  155. setMergedValue(date);
  156. if (!isSameDate(date, mergedValue.value)) {
  157. // Trigger when month panel switch month
  158. if (panelMode.value === 'date' && !isSameMonth(date, mergedValue.value) || panelMode.value === 'month' && !isSameYear(date, mergedValue.value)) {
  159. triggerPanelChange(date, mergedMode.value);
  160. }
  161. const val = maybeToString(date);
  162. emit('update:value', val);
  163. emit('change', val);
  164. }
  165. };
  166. const triggerModeChange = newMode => {
  167. setMergedMode(newMode);
  168. triggerPanelChange(mergedValue.value, newMode);
  169. };
  170. const onInternalSelect = (date, source) => {
  171. triggerChange(date);
  172. emit('select', maybeToString(date), {
  173. source
  174. });
  175. };
  176. // ====================== Locale ======================
  177. const defaultLocale = (0, _vue.computed)(() => {
  178. const {
  179. locale
  180. } = props;
  181. const result = (0, _extends2.default)((0, _extends2.default)({}, _en_US.default), locale);
  182. result.lang = (0, _extends2.default)((0, _extends2.default)({}, result.lang), (locale || {}).lang);
  183. return result;
  184. });
  185. const [mergedLocale] = (0, _LocaleReceiver.useLocaleReceiver)('Calendar', defaultLocale);
  186. return () => {
  187. const today = generateConfig.getNow();
  188. const {
  189. dateFullCellRender = slots === null || slots === void 0 ? void 0 : slots.dateFullCellRender,
  190. dateCellRender = slots === null || slots === void 0 ? void 0 : slots.dateCellRender,
  191. monthFullCellRender = slots === null || slots === void 0 ? void 0 : slots.monthFullCellRender,
  192. monthCellRender = slots === null || slots === void 0 ? void 0 : slots.monthCellRender,
  193. headerRender = slots === null || slots === void 0 ? void 0 : slots.headerRender,
  194. fullscreen = true,
  195. validRange
  196. } = props;
  197. // ====================== Render ======================
  198. const dateRender = _ref2 => {
  199. let {
  200. current: date
  201. } = _ref2;
  202. if (dateFullCellRender) {
  203. return dateFullCellRender({
  204. current: date
  205. });
  206. }
  207. return (0, _vue.createVNode)("div", {
  208. "class": (0, _classNames.default)(`${prefixCls.value}-cell-inner`, `${calendarPrefixCls.value}-date`, {
  209. [`${calendarPrefixCls.value}-date-today`]: isSameDate(today, date)
  210. })
  211. }, [(0, _vue.createVNode)("div", {
  212. "class": `${calendarPrefixCls.value}-date-value`
  213. }, [String(generateConfig.getDate(date)).padStart(2, '0')]), (0, _vue.createVNode)("div", {
  214. "class": `${calendarPrefixCls.value}-date-content`
  215. }, [dateCellRender && dateCellRender({
  216. current: date
  217. })])]);
  218. };
  219. const monthRender = (_ref3, locale) => {
  220. let {
  221. current: date
  222. } = _ref3;
  223. if (monthFullCellRender) {
  224. return monthFullCellRender({
  225. current: date
  226. });
  227. }
  228. const months = locale.shortMonths || generateConfig.locale.getShortMonths(locale.locale);
  229. return (0, _vue.createVNode)("div", {
  230. "class": (0, _classNames.default)(`${prefixCls.value}-cell-inner`, `${calendarPrefixCls.value}-date`, {
  231. [`${calendarPrefixCls.value}-date-today`]: isSameMonth(today, date)
  232. })
  233. }, [(0, _vue.createVNode)("div", {
  234. "class": `${calendarPrefixCls.value}-date-value`
  235. }, [months[generateConfig.getMonth(date)]]), (0, _vue.createVNode)("div", {
  236. "class": `${calendarPrefixCls.value}-date-content`
  237. }, [monthCellRender && monthCellRender({
  238. current: date
  239. })])]);
  240. };
  241. return wrapSSR((0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
  242. "class": (0, _classNames.default)(calendarPrefixCls.value, {
  243. [`${calendarPrefixCls.value}-full`]: fullscreen,
  244. [`${calendarPrefixCls.value}-mini`]: !fullscreen,
  245. [`${calendarPrefixCls.value}-rtl`]: direction.value === 'rtl'
  246. }, attrs.class, hashId.value)
  247. }), [headerRender ? headerRender({
  248. value: mergedValue.value,
  249. type: mergedMode.value,
  250. onChange: nextDate => {
  251. onInternalSelect(nextDate, 'customize');
  252. },
  253. onTypeChange: triggerModeChange
  254. }) : (0, _vue.createVNode)(_Header.default, {
  255. "prefixCls": calendarPrefixCls.value,
  256. "value": mergedValue.value,
  257. "generateConfig": generateConfig,
  258. "mode": mergedMode.value,
  259. "fullscreen": fullscreen,
  260. "locale": mergedLocale.value.lang,
  261. "validRange": validRange,
  262. "onChange": onInternalSelect,
  263. "onModeChange": triggerModeChange
  264. }, null), (0, _vue.createVNode)(_vcPicker.PickerPanel, {
  265. "value": mergedValue.value,
  266. "prefixCls": prefixCls.value,
  267. "locale": mergedLocale.value.lang,
  268. "generateConfig": generateConfig,
  269. "dateRender": dateRender,
  270. "monthCellRender": obj => monthRender(obj, mergedLocale.value.lang),
  271. "onSelect": nextDate => {
  272. onInternalSelect(nextDate, panelMode.value);
  273. },
  274. "mode": panelMode.value,
  275. "picker": panelMode.value,
  276. "disabledDate": mergedDisabledDate.value,
  277. "hideHeader": true
  278. }, null)]));
  279. };
  280. }
  281. });
  282. Calendar.install = function (app) {
  283. app.component(Calendar.name, Calendar);
  284. return app;
  285. };
  286. return Calendar;
  287. }
  288. var _default = exports.default = generateCalendar;