sdy-gantt 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1107 @@
1
+ module.exports =
2
+ /******/ (function(modules) { // webpackBootstrap
3
+ /******/ // The module cache
4
+ /******/ var installedModules = {};
5
+ /******/
6
+ /******/ // The require function
7
+ /******/ function __webpack_require__(moduleId) {
8
+ /******/
9
+ /******/ // Check if module is in cache
10
+ /******/ if(installedModules[moduleId]) {
11
+ /******/ return installedModules[moduleId].exports;
12
+ /******/ }
13
+ /******/ // Create a new module (and put it into the cache)
14
+ /******/ var module = installedModules[moduleId] = {
15
+ /******/ i: moduleId,
16
+ /******/ l: false,
17
+ /******/ exports: {}
18
+ /******/ };
19
+ /******/
20
+ /******/ // Execute the module function
21
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
22
+ /******/
23
+ /******/ // Flag the module as loaded
24
+ /******/ module.l = true;
25
+ /******/
26
+ /******/ // Return the exports of the module
27
+ /******/ return module.exports;
28
+ /******/ }
29
+ /******/
30
+ /******/
31
+ /******/ // expose the modules object (__webpack_modules__)
32
+ /******/ __webpack_require__.m = modules;
33
+ /******/
34
+ /******/ // expose the module cache
35
+ /******/ __webpack_require__.c = installedModules;
36
+ /******/
37
+ /******/ // define getter function for harmony exports
38
+ /******/ __webpack_require__.d = function(exports, name, getter) {
39
+ /******/ if(!__webpack_require__.o(exports, name)) {
40
+ /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
41
+ /******/ }
42
+ /******/ };
43
+ /******/
44
+ /******/ // define __esModule on exports
45
+ /******/ __webpack_require__.r = function(exports) {
46
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
47
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
48
+ /******/ }
49
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
50
+ /******/ };
51
+ /******/
52
+ /******/ // create a fake namespace object
53
+ /******/ // mode & 1: value is a module id, require it
54
+ /******/ // mode & 2: merge all properties of value into the ns
55
+ /******/ // mode & 4: return value when already ns object
56
+ /******/ // mode & 8|1: behave like require
57
+ /******/ __webpack_require__.t = function(value, mode) {
58
+ /******/ if(mode & 1) value = __webpack_require__(value);
59
+ /******/ if(mode & 8) return value;
60
+ /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
61
+ /******/ var ns = Object.create(null);
62
+ /******/ __webpack_require__.r(ns);
63
+ /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
64
+ /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
65
+ /******/ return ns;
66
+ /******/ };
67
+ /******/
68
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
69
+ /******/ __webpack_require__.n = function(module) {
70
+ /******/ var getter = module && module.__esModule ?
71
+ /******/ function getDefault() { return module['default']; } :
72
+ /******/ function getModuleExports() { return module; };
73
+ /******/ __webpack_require__.d(getter, 'a', getter);
74
+ /******/ return getter;
75
+ /******/ };
76
+ /******/
77
+ /******/ // Object.prototype.hasOwnProperty.call
78
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
79
+ /******/
80
+ /******/ // __webpack_public_path__
81
+ /******/ __webpack_require__.p = "";
82
+ /******/
83
+ /******/
84
+ /******/ // Load entry module and return exports
85
+ /******/ return __webpack_require__(__webpack_require__.s = "fb15");
86
+ /******/ })
87
+ /************************************************************************/
88
+ /******/ ({
89
+
90
+ /***/ "24fb":
91
+ /***/ (function(module, exports, __webpack_require__) {
92
+
93
+ "use strict";
94
+
95
+
96
+ /*
97
+ MIT License http://www.opensource.org/licenses/mit-license.php
98
+ Author Tobias Koppers @sokra
99
+ */
100
+ // css base code, injected by the css-loader
101
+ // eslint-disable-next-line func-names
102
+ module.exports = function (useSourceMap) {
103
+ var list = []; // return the list of modules as css string
104
+
105
+ list.toString = function toString() {
106
+ return this.map(function (item) {
107
+ var content = cssWithMappingToString(item, useSourceMap);
108
+
109
+ if (item[2]) {
110
+ return "@media ".concat(item[2], " {").concat(content, "}");
111
+ }
112
+
113
+ return content;
114
+ }).join('');
115
+ }; // import a list of modules into the list
116
+ // eslint-disable-next-line func-names
117
+
118
+
119
+ list.i = function (modules, mediaQuery, dedupe) {
120
+ if (typeof modules === 'string') {
121
+ // eslint-disable-next-line no-param-reassign
122
+ modules = [[null, modules, '']];
123
+ }
124
+
125
+ var alreadyImportedModules = {};
126
+
127
+ if (dedupe) {
128
+ for (var i = 0; i < this.length; i++) {
129
+ // eslint-disable-next-line prefer-destructuring
130
+ var id = this[i][0];
131
+
132
+ if (id != null) {
133
+ alreadyImportedModules[id] = true;
134
+ }
135
+ }
136
+ }
137
+
138
+ for (var _i = 0; _i < modules.length; _i++) {
139
+ var item = [].concat(modules[_i]);
140
+
141
+ if (dedupe && alreadyImportedModules[item[0]]) {
142
+ // eslint-disable-next-line no-continue
143
+ continue;
144
+ }
145
+
146
+ if (mediaQuery) {
147
+ if (!item[2]) {
148
+ item[2] = mediaQuery;
149
+ } else {
150
+ item[2] = "".concat(mediaQuery, " and ").concat(item[2]);
151
+ }
152
+ }
153
+
154
+ list.push(item);
155
+ }
156
+ };
157
+
158
+ return list;
159
+ };
160
+
161
+ function cssWithMappingToString(item, useSourceMap) {
162
+ var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring
163
+
164
+ var cssMapping = item[3];
165
+
166
+ if (!cssMapping) {
167
+ return content;
168
+ }
169
+
170
+ if (useSourceMap && typeof btoa === 'function') {
171
+ var sourceMapping = toComment(cssMapping);
172
+ var sourceURLs = cssMapping.sources.map(function (source) {
173
+ return "/*# sourceURL=".concat(cssMapping.sourceRoot || '').concat(source, " */");
174
+ });
175
+ return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
176
+ }
177
+
178
+ return [content].join('\n');
179
+ } // Adapted from convert-source-map (MIT)
180
+
181
+
182
+ function toComment(sourceMap) {
183
+ // eslint-disable-next-line no-undef
184
+ var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
185
+ var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
186
+ return "/*# ".concat(data, " */");
187
+ }
188
+
189
+ /***/ }),
190
+
191
+ /***/ "2c63":
192
+ /***/ (function(module, exports, __webpack_require__) {
193
+
194
+ // style-loader: Adds some css to the DOM by adding a <style> tag
195
+
196
+ // load the styles
197
+ var content = __webpack_require__("7636");
198
+ if(content.__esModule) content = content.default;
199
+ if(typeof content === 'string') content = [[module.i, content, '']];
200
+ if(content.locals) module.exports = content.locals;
201
+ // add the styles to the DOM
202
+ var add = __webpack_require__("499e").default
203
+ var update = add("3e5a16fe", content, true, {"sourceMap":false,"shadowMode":false});
204
+
205
+ /***/ }),
206
+
207
+ /***/ "499e":
208
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
209
+
210
+ "use strict";
211
+ // ESM COMPAT FLAG
212
+ __webpack_require__.r(__webpack_exports__);
213
+
214
+ // EXPORTS
215
+ __webpack_require__.d(__webpack_exports__, "default", function() { return /* binding */ addStylesClient; });
216
+
217
+ // CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/listToStyles.js
218
+ /**
219
+ * Translates the list format produced by css-loader into something
220
+ * easier to manipulate.
221
+ */
222
+ function listToStyles (parentId, list) {
223
+ var styles = []
224
+ var newStyles = {}
225
+ for (var i = 0; i < list.length; i++) {
226
+ var item = list[i]
227
+ var id = item[0]
228
+ var css = item[1]
229
+ var media = item[2]
230
+ var sourceMap = item[3]
231
+ var part = {
232
+ id: parentId + ':' + i,
233
+ css: css,
234
+ media: media,
235
+ sourceMap: sourceMap
236
+ }
237
+ if (!newStyles[id]) {
238
+ styles.push(newStyles[id] = { id: id, parts: [part] })
239
+ } else {
240
+ newStyles[id].parts.push(part)
241
+ }
242
+ }
243
+ return styles
244
+ }
245
+
246
+ // CONCATENATED MODULE: ./node_modules/vue-style-loader/lib/addStylesClient.js
247
+ /*
248
+ MIT License http://www.opensource.org/licenses/mit-license.php
249
+ Author Tobias Koppers @sokra
250
+ Modified by Evan You @yyx990803
251
+ */
252
+
253
+
254
+
255
+ var hasDocument = typeof document !== 'undefined'
256
+
257
+ if (typeof DEBUG !== 'undefined' && DEBUG) {
258
+ if (!hasDocument) {
259
+ throw new Error(
260
+ 'vue-style-loader cannot be used in a non-browser environment. ' +
261
+ "Use { target: 'node' } in your Webpack config to indicate a server-rendering environment."
262
+ ) }
263
+ }
264
+
265
+ /*
266
+ type StyleObject = {
267
+ id: number;
268
+ parts: Array<StyleObjectPart>
269
+ }
270
+
271
+ type StyleObjectPart = {
272
+ css: string;
273
+ media: string;
274
+ sourceMap: ?string
275
+ }
276
+ */
277
+
278
+ var stylesInDom = {/*
279
+ [id: number]: {
280
+ id: number,
281
+ refs: number,
282
+ parts: Array<(obj?: StyleObjectPart) => void>
283
+ }
284
+ */}
285
+
286
+ var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
287
+ var singletonElement = null
288
+ var singletonCounter = 0
289
+ var isProduction = false
290
+ var noop = function () {}
291
+ var options = null
292
+ var ssrIdKey = 'data-vue-ssr-id'
293
+
294
+ // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
295
+ // tags it will allow on a page
296
+ var isOldIE = typeof navigator !== 'undefined' && /msie [6-9]\b/.test(navigator.userAgent.toLowerCase())
297
+
298
+ function addStylesClient (parentId, list, _isProduction, _options) {
299
+ isProduction = _isProduction
300
+
301
+ options = _options || {}
302
+
303
+ var styles = listToStyles(parentId, list)
304
+ addStylesToDom(styles)
305
+
306
+ return function update (newList) {
307
+ var mayRemove = []
308
+ for (var i = 0; i < styles.length; i++) {
309
+ var item = styles[i]
310
+ var domStyle = stylesInDom[item.id]
311
+ domStyle.refs--
312
+ mayRemove.push(domStyle)
313
+ }
314
+ if (newList) {
315
+ styles = listToStyles(parentId, newList)
316
+ addStylesToDom(styles)
317
+ } else {
318
+ styles = []
319
+ }
320
+ for (var i = 0; i < mayRemove.length; i++) {
321
+ var domStyle = mayRemove[i]
322
+ if (domStyle.refs === 0) {
323
+ for (var j = 0; j < domStyle.parts.length; j++) {
324
+ domStyle.parts[j]()
325
+ }
326
+ delete stylesInDom[domStyle.id]
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+ function addStylesToDom (styles /* Array<StyleObject> */) {
333
+ for (var i = 0; i < styles.length; i++) {
334
+ var item = styles[i]
335
+ var domStyle = stylesInDom[item.id]
336
+ if (domStyle) {
337
+ domStyle.refs++
338
+ for (var j = 0; j < domStyle.parts.length; j++) {
339
+ domStyle.parts[j](item.parts[j])
340
+ }
341
+ for (; j < item.parts.length; j++) {
342
+ domStyle.parts.push(addStyle(item.parts[j]))
343
+ }
344
+ if (domStyle.parts.length > item.parts.length) {
345
+ domStyle.parts.length = item.parts.length
346
+ }
347
+ } else {
348
+ var parts = []
349
+ for (var j = 0; j < item.parts.length; j++) {
350
+ parts.push(addStyle(item.parts[j]))
351
+ }
352
+ stylesInDom[item.id] = { id: item.id, refs: 1, parts: parts }
353
+ }
354
+ }
355
+ }
356
+
357
+ function createStyleElement () {
358
+ var styleElement = document.createElement('style')
359
+ styleElement.type = 'text/css'
360
+ head.appendChild(styleElement)
361
+ return styleElement
362
+ }
363
+
364
+ function addStyle (obj /* StyleObjectPart */) {
365
+ var update, remove
366
+ var styleElement = document.querySelector('style[' + ssrIdKey + '~="' + obj.id + '"]')
367
+
368
+ if (styleElement) {
369
+ if (isProduction) {
370
+ // has SSR styles and in production mode.
371
+ // simply do nothing.
372
+ return noop
373
+ } else {
374
+ // has SSR styles but in dev mode.
375
+ // for some reason Chrome can't handle source map in server-rendered
376
+ // style tags - source maps in <style> only works if the style tag is
377
+ // created and inserted dynamically. So we remove the server rendered
378
+ // styles and inject new ones.
379
+ styleElement.parentNode.removeChild(styleElement)
380
+ }
381
+ }
382
+
383
+ if (isOldIE) {
384
+ // use singleton mode for IE9.
385
+ var styleIndex = singletonCounter++
386
+ styleElement = singletonElement || (singletonElement = createStyleElement())
387
+ update = applyToSingletonTag.bind(null, styleElement, styleIndex, false)
388
+ remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true)
389
+ } else {
390
+ // use multi-style-tag mode in all other cases
391
+ styleElement = createStyleElement()
392
+ update = applyToTag.bind(null, styleElement)
393
+ remove = function () {
394
+ styleElement.parentNode.removeChild(styleElement)
395
+ }
396
+ }
397
+
398
+ update(obj)
399
+
400
+ return function updateStyle (newObj /* StyleObjectPart */) {
401
+ if (newObj) {
402
+ if (newObj.css === obj.css &&
403
+ newObj.media === obj.media &&
404
+ newObj.sourceMap === obj.sourceMap) {
405
+ return
406
+ }
407
+ update(obj = newObj)
408
+ } else {
409
+ remove()
410
+ }
411
+ }
412
+ }
413
+
414
+ var replaceText = (function () {
415
+ var textStore = []
416
+
417
+ return function (index, replacement) {
418
+ textStore[index] = replacement
419
+ return textStore.filter(Boolean).join('\n')
420
+ }
421
+ })()
422
+
423
+ function applyToSingletonTag (styleElement, index, remove, obj) {
424
+ var css = remove ? '' : obj.css
425
+
426
+ if (styleElement.styleSheet) {
427
+ styleElement.styleSheet.cssText = replaceText(index, css)
428
+ } else {
429
+ var cssNode = document.createTextNode(css)
430
+ var childNodes = styleElement.childNodes
431
+ if (childNodes[index]) styleElement.removeChild(childNodes[index])
432
+ if (childNodes.length) {
433
+ styleElement.insertBefore(cssNode, childNodes[index])
434
+ } else {
435
+ styleElement.appendChild(cssNode)
436
+ }
437
+ }
438
+ }
439
+
440
+ function applyToTag (styleElement, obj) {
441
+ var css = obj.css
442
+ var media = obj.media
443
+ var sourceMap = obj.sourceMap
444
+
445
+ if (media) {
446
+ styleElement.setAttribute('media', media)
447
+ }
448
+ if (options.ssrId) {
449
+ styleElement.setAttribute(ssrIdKey, obj.id)
450
+ }
451
+
452
+ if (sourceMap) {
453
+ // https://developer.chrome.com/devtools/docs/javascript-debugging
454
+ // this makes source maps inside style tags work properly in Chrome
455
+ css += '\n/*# sourceURL=' + sourceMap.sources[0] + ' */'
456
+ // http://stackoverflow.com/a/26603875
457
+ css += '\n/*# sourceMappingURL=data:application/json;base64,' + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + ' */'
458
+ }
459
+
460
+ if (styleElement.styleSheet) {
461
+ styleElement.styleSheet.cssText = css
462
+ } else {
463
+ while (styleElement.firstChild) {
464
+ styleElement.removeChild(styleElement.firstChild)
465
+ }
466
+ styleElement.appendChild(document.createTextNode(css))
467
+ }
468
+ }
469
+
470
+
471
+ /***/ }),
472
+
473
+ /***/ "5a0c":
474
+ /***/ (function(module, exports, __webpack_require__) {
475
+
476
+ !function(t,e){ true?module.exports=e():undefined}(this,(function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",c="month",f="quarter",h="year",d="date",l="Invalid Date",$=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return"["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",D={};D[g]=M;var p="$isDayjsObject",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if("string"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split("-");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate("s"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v="set"+(this.$u?"UTC":"");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+"Hours",0);case u:return $(v+"Minutes",1);case s:return $(v+"Seconds",2);case i:return $(v+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f="set"+(this.$u?"UTC":""),l=(n={},n[a]=f+"Date",n[d]=f+"Date",n[c]=f+"Month",n[h]=f+"FullYear",n[u]=f+"Hours",n[s]=f+"Minutes",n[i]=f+"Seconds",n[r]=f+"Milliseconds",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||"YYYY-MM-DDTHH:mm:ssZ",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,"0")},$=f||function(t,e,n){var r=t<12?"AM":"PM";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return b.s(e.$y,4,"0");case"M":return a+1;case"MM":return b.s(a+1,2,"0");case"MMM":return h(n.monthsShort,a,c,3);case"MMMM":return h(c,a);case"D":return e.$D;case"DD":return b.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return h(n.weekdaysMin,e.$W,o,2);case"ddd":return h(n.weekdaysShort,e.$W,o,3);case"dddd":return o[e.$W];case"H":return String(s);case"HH":return b.s(s,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return $(s,u,!0);case"A":return $(s,u,!1);case"m":return String(u);case"mm":return b.s(u,2,"0");case"s":return String(e.$s);case"ss":return b.s(e.$s,2,"0");case"SSS":return b.s(e.$ms,3,"0");case"Z":return i}return null}(t)||i.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[["$ms",r],["$s",i],["$m",s],["$H",u],["$W",a],["$M",c],["$y",h],["$D",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));
477
+
478
+ /***/ }),
479
+
480
+ /***/ "7636":
481
+ /***/ (function(module, exports, __webpack_require__) {
482
+
483
+ // Imports
484
+ var ___CSS_LOADER_API_IMPORT___ = __webpack_require__("24fb");
485
+ exports = ___CSS_LOADER_API_IMPORT___(false);
486
+ // Module
487
+ exports.push([module.i, ".schedule-card[data-v-72a2d2e2]{padding:14px 20px;border:1px solid #dcdee2;border-color:#e8eaec;display:block;background:#fff;border-radius:4px;font-size:14px;position:relative;transition:all .2s ease-in-out}.schedule-card .table-outer-container[data-v-72a2d2e2]{border:1px solid #ddd;border-radius:4px;overflow:hidden;background:#fff;position:relative}.schedule-card .table-outer-container .fixed-left-bar[data-v-72a2d2e2]{position:absolute;top:2px;bottom:15px;left:0;width:190px;background:#fff;z-index:100;-webkit-user-select:none;user-select:none;-moz-user-select:none}.schedule-card .blank-tip[data-v-72a2d2e2]{display:flex;align-items:center;justify-content:center;min-height:455px;border-right:1px solid #dcdee2;text-align:center;color:#999;font-size:12px}.schedule-card .table-scroll-container[data-v-72a2d2e2]{display:flex;flex-direction:column;overflow-x:auto;overflow-y:visible}.schedule-card .table-scroll-container[data-v-72a2d2e2]::-webkit-scrollbar{width:6px;height:6px}.schedule-card .table-scroll-container[data-v-72a2d2e2]::-webkit-scrollbar-thumb{background:#cccdce}.schedule-card .table-scroll-container[data-v-72a2d2e2]::-webkit-scrollbar-track{background:#fff}.schedule-card .table-header-row[data-v-72a2d2e2]{display:flex;background-color:#eef3ff;border-bottom:2px solid #ebebeb;position:sticky;top:0;z-index:10;-webkit-user-select:none;user-select:none;-moz-user-select:none}.schedule-card .header-cell[data-v-72a2d2e2]{width:190px;flex-shrink:0;padding:12px 8px;border-right:1px solid #ebebeb;font-weight:700;text-align:center;white-space:nowrap}.schedule-card .fixed-person-header[data-v-72a2d2e2]{width:190px;background-color:#d3e0ff;z-index:11;position:sticky;left:0}.schedule-card .scroll-date-header[data-v-72a2d2e2]{width:190px;line-height:43px;flex-shrink:0;background-color:#d3e0ff;border-right:1px solid #ebebeb}.schedule-card .scroll-date-header[data-v-72a2d2e2]::-moz-selection{background:#d3e0ff;color:#515a6e}.schedule-card .scroll-date-header[data-v-72a2d2e2]::selection{background:#d3e0ff;color:#515a6e}.schedule-card .scroll-date-header[data-v-72a2d2e2]:last-child{border-right:none}.schedule-card .table-body-rows[data-v-72a2d2e2]{display:flex;flex-direction:column}.schedule-card .table-person-row[data-v-72a2d2e2]{display:flex;overflow:visible}.schedule-card .body-cell[data-v-72a2d2e2]{width:190px;flex-shrink:0;padding:10px 8px;border-right:1px solid #ebebeb;border-bottom:1px solid #ebebeb;white-space:nowrap;vertical-align:top;position:relative}.schedule-card .fixed-person-cell[data-v-72a2d2e2]{width:190px;flex-shrink:0;background-color:#eef3ff;font-weight:500;line-height:1.3;z-index:5;position:sticky;left:0}.schedule-card .fixed-person-cell[data-v-72a2d2e2]:hover{background-color:#d3e0ff}.schedule-card .scroll-date-cell[data-v-72a2d2e2]{width:190px;flex-shrink:0;padding:2px 0;position:relative;vertical-align:top}.schedule-card .task-item[data-v-72a2d2e2]{height:auto;line-height:18px;font-size:12px}.schedule-card .stacked-task[data-v-72a2d2e2]{padding:2px 6px;border-radius:5px;color:#fff;width:100%;box-sizing:border-box;text-align:left;position:absolute;left:0;white-space:pre-line;word-break:break-all;cursor:pointer}.schedule-card .stacked-task[data-v-72a2d2e2]:hover{opacity:.9}.schedule-card .no-task[data-v-72a2d2e2]{color:#999;font-style:italic;font-size:12px;text-align:center;padding:15px 5px;color:#ccc;font-size:10px}.schedule-card .cross-day-track[data-v-72a2d2e2]{position:relative;z-index:20;height:0;pointer-events:none}.schedule-card .cross-day-bar[data-v-72a2d2e2]{position:absolute;height:auto;line-height:18px;font-size:12px;padding:2px 6px;border-radius:5px;color:#fff;word-break:break-all;white-space:pre-line;pointer-events:auto;cursor:pointer}.schedule-card .cross-day-bar[data-v-72a2d2e2]:hover{opacity:.9}.schedule-card .page-col[data-v-72a2d2e2]{margin:10px 0;text-align:center}.schedule-card .scroll-box-list[data-v-72a2d2e2]{overflow-x:visible;overflow-y:auto;max-height:674px}@media (max-width:768px){.scroll-date-cell[data-v-72a2d2e2],.scroll-date-header[data-v-72a2d2e2]{width:190px}.fixed-person-cell[data-v-72a2d2e2],.fixed-person-header[data-v-72a2d2e2]{width:190px;font-size:12px}}", ""]);
488
+ // Exports
489
+ module.exports = exports;
490
+
491
+
492
+ /***/ }),
493
+
494
+ /***/ "b375":
495
+ /***/ (function(module, exports, __webpack_require__) {
496
+
497
+ !function(e,i){ true?module.exports=i():undefined}(this,(function(){"use strict";return function(e,i){i.prototype.isSameOrBefore=function(e,i){return this.isSame(e,i)||this.isBefore(e,i)}}}));
498
+
499
+ /***/ }),
500
+
501
+ /***/ "b9f5":
502
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
503
+
504
+ "use strict";
505
+ /* harmony import */ var _node_modules_vue_style_loader_index_js_ref_11_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_11_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_3_node_modules_less_loader_dist_cjs_js_ref_11_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_sdy_gantt_chart_vue_vue_type_style_index_0_id_72a2d2e2_prod_lang_less_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("2c63");
506
+ /* harmony import */ var _node_modules_vue_style_loader_index_js_ref_11_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_11_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_3_node_modules_less_loader_dist_cjs_js_ref_11_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_sdy_gantt_chart_vue_vue_type_style_index_0_id_72a2d2e2_prod_lang_less_scoped_true__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_11_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_11_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_2_node_modules_postcss_loader_src_index_js_ref_11_oneOf_1_3_node_modules_less_loader_dist_cjs_js_ref_11_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_sdy_gantt_chart_vue_vue_type_style_index_0_id_72a2d2e2_prod_lang_less_scoped_true__WEBPACK_IMPORTED_MODULE_0__);
507
+ /* unused harmony reexport * */
508
+
509
+
510
+ /***/ }),
511
+
512
+ /***/ "fb15":
513
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
514
+
515
+ "use strict";
516
+ // ESM COMPAT FLAG
517
+ __webpack_require__.r(__webpack_exports__);
518
+
519
+ // CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js
520
+ // This file is imported into lib/wc client bundles.
521
+
522
+ if (typeof window !== 'undefined') {
523
+ var currentScript = window.document.currentScript
524
+ if (false) { var getCurrentScript; }
525
+
526
+ var src = currentScript && currentScript.src.match(/(.+\/)[^/]+\.js(\?.*)?$/)
527
+ if (src) {
528
+ __webpack_require__.p = src[1] // eslint-disable-line
529
+ }
530
+ }
531
+
532
+ // Indicate to webpack that this file can be concatenated
533
+ /* harmony default export */ var setPublicPath = (null);
534
+
535
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"55ff81cd-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--5!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/sdy-gantt-chart.vue?vue&type=template&id=72a2d2e2&scoped=true
536
+ var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('div',{staticClass:"schedule-card"},[_c('div',{staticClass:"table-outer-container"},[_c('div',{staticClass:"fixed-left-bar",style:(_vm.personList.length == 0 ? 'min-height:500px' : '')},[_c('div',{staticClass:"header-cell fixed-person-header"},[_vm._v("人员\\日期")]),_vm._l((_vm.personList),function(person){return _c('div',{key:'row-person-' + person.id,staticClass:"table-person-row",style:(`height:${person.allHeight || 40}px`)},[_c('div',{staticClass:"flex_center body-cell fixed-person-cell"},[_vm._v(" "+_vm._s(person.name)+" ")])])}),(_vm.personList.length == 0)?_c('div',{staticClass:"blank-tip"},[_vm._v("暂无人员")]):_vm._e()],2),_c('div',{directives:[{name:"drag-scroll",rawName:"v-drag-scroll"}],staticClass:"table-scroll-container",style:(_vm.personList.length == 0 ? 'min-height:500px' : '')},[_c('div',{staticClass:"table-header-row"},[_c('div',{staticClass:"header-cell fixed-person-header"},[_vm._v("人员\\日期")]),_vm._l((_vm.dateList),function(date){return _c('div',{key:'date-' + date.key,staticClass:"flex_center scroll-date-header"},[_vm._v(" "+_vm._s(date.display)+" ")])})],2),_c('div',{staticClass:"cross-day-track"},_vm._l((_vm.allCrossDayTasks),function(task){return _c('div',{key:'track-' + task.id,staticClass:"cross-day-bar",style:({
537
+ left: task.trackLeft + 'px',
538
+ width: task.trackWidth + 'px',
539
+ top: task.trackTop + 'px',
540
+ backgroundColor: task.color,
541
+ }),attrs:{"title":task.tooltip},on:{"click":function($event){return _vm.handleDetail(task)}}},[_c('span',[_vm._v(_vm._s(task.shortLabel))])])}),0),_c('div',{staticClass:"table-body-rows"},_vm._l((_vm.personList),function(person){return _c('div',{key:'row-person-' + person.id,staticClass:"table-person-row",style:(`height:${person.allHeight || 40}px`)},[_c('div',{staticClass:"flex_center body-cell fixed-person-cell"},[_vm._v(" "+_vm._s(person.name)+" ")]),_vm._l((_vm.dateList),function(date){return _c('div',{key:'cell-' + person.id + '-' + date.key,staticClass:"body-cell scroll-date-cell"},_vm._l((_vm.getSameDayTasks(person.id, date.key)),function(task,taskIndex){return _c('div',{key:'stacked-' + task.id + '-' + taskIndex,staticClass:"task-item stacked-task",style:({
542
+ backgroundColor: task.color,
543
+ top: task.cellTop + 'px',
544
+ }),attrs:{"title":task.tooltip},on:{"click":function($event){return _vm.handleDetail(task)}}},[_c('span',[_vm._v(_vm._s(task.shortLabel))])])}),0)})],2)}),0)])])])])
545
+ }
546
+ var staticRenderFns = []
547
+
548
+
549
+ // CONCATENATED MODULE: ./src/components/sdy-gantt-chart.vue?vue&type=template&id=72a2d2e2&scoped=true
550
+
551
+ // EXTERNAL MODULE: ./node_modules/dayjs/dayjs.min.js
552
+ var dayjs_min = __webpack_require__("5a0c");
553
+ var dayjs_min_default = /*#__PURE__*/__webpack_require__.n(dayjs_min);
554
+
555
+ // CONCATENATED MODULE: ./src/libs/tools.js
556
+
557
+
558
+ // 格式化时间尽量用插值表达式,避免import引入的麻烦
559
+
560
+ /**
561
+ * @功能描述: 格式化时间
562
+ * @参数: date:时间戳number pattern:格式
563
+ * @返回值:
564
+ */
565
+ const dateFormat = (date, pattern = 'YYYY-MM-DD HH:mm:ss') => {
566
+ if (!date || String(date) === '0') return ''
567
+
568
+ let len = String(date).length
569
+ if (len < 12) {
570
+ // 秒级时间戳转为毫秒级时间戳
571
+ date = date * 1000
572
+ }
573
+
574
+ return dayjs_min_default()(date).format(pattern)
575
+ }
576
+
577
+ const sumArray = (arr) => {
578
+ return arr.reduce((total, val) => total + val, 0)
579
+ }
580
+
581
+ function ts2day(ts) {
582
+ return dayjs_min_default.a.unix(ts).format('YYYY-MM-DD')
583
+ }
584
+ // 计算一个用户的任务先后排序 占位
585
+ const assignRow = (list) => {
586
+ // 1. 按开始时间升序,保证先画靠前的任务
587
+ list.sort(function (a, b) {
588
+ return a.start - b.start
589
+ })
590
+
591
+ // 2. 日期字符串 -> 当前已占行号集合
592
+ var occupied = {}
593
+
594
+ // 3. 遍历每个任务
595
+ for (var i = 0; i < list.length; i++) {
596
+ var t = list[i]
597
+ var startDay = ts2day(t.start)
598
+ var endDay = ts2day(t.end)
599
+
600
+ // 3.1 收集这段日期范围内所有已占行号
601
+ var used = new Set()
602
+ var cur = dayjs_min_default()(startDay)
603
+ var end = dayjs_min_default()(endDay)
604
+ while (cur.isSameOrBefore(end, 'day')) {
605
+ var dayKey = cur.format('YYYY-MM-DD')
606
+ if (occupied[dayKey]) {
607
+ occupied[dayKey].forEach(function (n) {
608
+ used.add(n)
609
+ })
610
+ }
611
+ cur = cur.add(1, 'day')
612
+ }
613
+
614
+ // 3.2 找到最小可用行号
615
+ var row = 0
616
+ while (used.has(row)) row++
617
+
618
+ // 3.3 写回任务对象
619
+ t.row = row
620
+ // 3.4 真正占用:把行号写回每一天
621
+ cur = dayjs_min_default()(startDay)
622
+ while (cur.isSameOrBefore(end, 'day')) {
623
+ var dayKey = cur.format('YYYY-MM-DD')
624
+ if (!occupied[dayKey]) occupied[dayKey] = []
625
+ occupied[dayKey].push(row)
626
+ cur = cur.add(1, 'day')
627
+ }
628
+ }
629
+
630
+ return list
631
+ }
632
+
633
+ function formatDateKey(date) {
634
+ return date.toISOString().split('T')[0]
635
+ }
636
+ function formatDateDisplay(date) {
637
+ const year = date.getFullYear()
638
+ const month = (date.getMonth() + 1).toString().padStart(2, '0')
639
+ const day = date.getDate().toString().padStart(2, '0')
640
+ const weekdays = ['日', '一', '二', '三', '四', '五', '六']
641
+ const weekday = weekdays[date.getDay()]
642
+ return `${year}/${month}/${day}(周${weekday})`
643
+ }
644
+ // 生成日期范围 "2024-01-01", 14
645
+ const generateDateRange = (startDate, days) => {
646
+ const dates = []
647
+ const start = new Date(startDate)
648
+
649
+ for (let i = 0; i < days; i++) {
650
+ const date = new Date(start)
651
+ date.setDate(start.getDate() + i)
652
+ const dateKey = formatDateKey(date)
653
+ dates.push({
654
+ key: dateKey,
655
+ date: date,
656
+ display: formatDateDisplay(date),
657
+ })
658
+ }
659
+ return dates
660
+ }
661
+
662
+ // EXTERNAL MODULE: ./node_modules/dayjs/plugin/isSameOrBefore.js
663
+ var isSameOrBefore = __webpack_require__("b375");
664
+ var isSameOrBefore_default = /*#__PURE__*/__webpack_require__.n(isSameOrBefore);
665
+
666
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/sdy-gantt-chart.vue?vue&type=script&lang=js
667
+
668
+
669
+
670
+
671
+ dayjs_min_default.a.extend(isSameOrBefore_default.a)
672
+
673
+ const FontSetting = '12px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif'
674
+
675
+ /* harmony default export */ var sdy_gantt_chartvue_type_script_lang_js = ({
676
+ name: 'TopicSchedule',
677
+ props: {
678
+ // 日期范围 [startDate, endDate] 格式如 '2026-01-12'
679
+ dateRange: {
680
+ type: Array,
681
+ required: true,
682
+ },
683
+ // 日程数据
684
+ scheduleData: {
685
+ type: Array,
686
+ required: true,
687
+ },
688
+ },
689
+ data() {
690
+ return {
691
+ tableLoading: false,
692
+ personList: [],
693
+ dateList: [],
694
+ allTasks: [],
695
+ userRowObj: {}, // {userId: [{id,row,height}, ...]}
696
+ colorPalette: [
697
+ '#4285f4',
698
+ '#34a853',
699
+ '#ea4335',
700
+ '#fbbc05',
701
+ '#9c27b0',
702
+ '#ff5722',
703
+ '#009688',
704
+ '#795548',
705
+ '#607d8b',
706
+ '#e91e63',
707
+ ],
708
+ }
709
+ },
710
+ watch: {
711
+ dateRange: {
712
+ handler() {
713
+ this.initSchedule()
714
+ },
715
+ deep: true,
716
+ },
717
+ scheduleData: {
718
+ handler() {
719
+ this.initSchedule()
720
+ },
721
+ deep: true,
722
+ },
723
+ },
724
+ computed: {
725
+ allCrossDayTasks() {
726
+ const gap = 3
727
+ let list = []
728
+
729
+ this.personList.forEach((p, pIdx) => {
730
+ let tasks = this.allTasks.filter(
731
+ ({ personId, isCrossDay }) => personId == p.id && isCrossDay
732
+ )
733
+ tasks.forEach((t) => {
734
+ let maxObj = {}
735
+ let arr = this.userRowObj[p.id] || []
736
+ arr.forEach((ele) => {
737
+ if (ele.row < t.row) {
738
+ if (!maxObj[ele.row] || ele.height > maxObj[ele.row]) {
739
+ maxObj[ele.row] = ele.height
740
+ }
741
+ }
742
+ })
743
+ const top =
744
+ this.personList.slice(0, pIdx).reduce((sum, u) => sum + u.allHeight, 0) +
745
+ Object.values(maxObj).reduce((total, val) => total + val + gap, 0) +
746
+ 2
747
+
748
+ list.push({ ...t, trackTop: top })
749
+ })
750
+ })
751
+
752
+ return list
753
+ },
754
+ },
755
+ mounted() {
756
+ this.initSchedule()
757
+ },
758
+ methods: {
759
+ initSchedule() {
760
+ if (!this.dateRange || !this.scheduleData) return
761
+
762
+ let schedule = JSON.parse(JSON.stringify(this.scheduleData))
763
+ const [start, end] = this.dateRange
764
+ const dayCount = dayjs_min_default()(end).diff(dayjs_min_default()(start), 'day') + 1
765
+
766
+ this.dateList = generateDateRange(start, dayCount)
767
+ this.personList = schedule.map((user) => ({
768
+ id: user.id,
769
+ name: user.nickname,
770
+ }))
771
+
772
+ this.calcScheduleDate(schedule, dayCount)
773
+ },
774
+
775
+ // 计算文本占高 (最小损耗 无 DOM、无回流)
776
+ getTextBlockHeight(text, width = 190) {
777
+ const padV = 4
778
+ const osCanvas = new OffscreenCanvas(width, 1)
779
+ const ctx = osCanvas.getContext('2d')
780
+ ctx.font = FontSetting
781
+
782
+ const lines = []
783
+ let line = ''
784
+
785
+ for (let i = 0; i < text.length; i++) {
786
+ const ch = text[i]
787
+
788
+ // 遇到显式换行符直接断行
789
+ if (ch === '\n') {
790
+ lines.push(line)
791
+ line = ''
792
+ continue
793
+ }
794
+
795
+ // 宽度超限也断行
796
+ const test = line + ch
797
+ if (ctx.measureText(test).width <= width) {
798
+ line = test
799
+ } else {
800
+ lines.push(line)
801
+ line = ch
802
+ }
803
+ }
804
+ if (line) lines.push(line) // 收尾
805
+
806
+ const lineHeight = 12 * 1.5
807
+ return lines.length * lineHeight + padV
808
+ },
809
+
810
+ calcScheduleDate(list, dayCount) {
811
+ const CellWidth = 190,
812
+ padH = 14 // 横向padding+border
813
+
814
+ let allArr = []
815
+ this.userRowObj = {}
816
+ list.forEach((user) => {
817
+ // id: "2", nickname: "王璐-测试1", tasks:[{id: '102', title: '我的选题1111111', start: 1761148800, end: 1761321600}]
818
+ let tasks = assignRow(user.tasks)
819
+ // if (tasks && tasks.length > 0) {
820
+ // console.log("排序tasks", tasks);
821
+ // }
822
+
823
+ if (!this.userRowObj[user.id]) {
824
+ this.userRowObj[user.id] = []
825
+ }
826
+
827
+ let oneDay = 86400
828
+ tasks.forEach((it) => {
829
+ let startStr = dateFormat(it.start, 'YYYY-MM-DD')
830
+ let endStr = dateFormat(it.end, 'YYYY-MM-DD')
831
+ // 目前是整0点的日期 为了计算天数 都+2
832
+ let isCrossDay = it.end - it.start + 2 > oneDay
833
+ let showLabel = it.content ? it.content : '暂无内容'
834
+
835
+ let dayStart = this.dateList.findIndex((d) => d.key === startStr)
836
+ let dayEnd = this.dateList.findIndex((d) => d.key === endStr)
837
+ // 如果选题开始时间早于日程表的起始时间 开始的pos改为日程表的开始
838
+ if (dayStart < 0) {
839
+ dayStart = 0
840
+ }
841
+ // 如果选题结束时间晚于日程表的结束时间 结束的pos改为日程表的结束
842
+ if (dayEnd < 0) {
843
+ dayEnd = dayCount - 1
844
+ }
845
+ // 有可能出现本来跨天任务 但落在当前日程的就一天
846
+ let crossOneDay = isCrossDay && dayEnd - dayStart === 0
847
+
848
+ let blockWidth = 0,
849
+ crossLeft = 0
850
+ if (isCrossDay && dayEnd - dayStart > 0) {
851
+ crossLeft = dayStart * CellWidth + CellWidth // 人员列宽
852
+ blockWidth = (dayEnd - dayStart + 1) * CellWidth // 日期跨度宽度
853
+ } else {
854
+ blockWidth = CellWidth
855
+ }
856
+
857
+ let textWidth = isCrossDay && !crossOneDay ? blockWidth - padH - 4 : blockWidth - padH
858
+ let realHeight = this.getTextBlockHeight(showLabel, textWidth)
859
+
860
+ this.userRowObj[user.id].push({
861
+ id: it.id,
862
+ row: it.row,
863
+ height: realHeight,
864
+ })
865
+ let obj = {
866
+ // 后续编辑需要 id, row, isDistribute, isCoop, status, createUserId, content
867
+ ...it,
868
+ personId: user.id,
869
+ personName: user.nickname,
870
+ startDate: startStr,
871
+ endDate: endStr,
872
+ isCrossDay,
873
+ crossOneDay,
874
+ shortLabel: showLabel,
875
+ color: '#2d8cf0',
876
+ tooltip: `标题: ${it.title}\n时间: ${startStr} ~ ${endStr}`,
877
+ // 日程占高度
878
+ realHeight,
879
+ // 跨天日程字段
880
+ trackLeft: crossLeft,
881
+ trackWidth: blockWidth,
882
+ }
883
+ allArr.push(obj)
884
+ })
885
+ })
886
+
887
+ this.allTasks = allArr
888
+ this.setPersonStyle()
889
+ },
890
+
891
+ // 获取同一天内的多个任务(用于垂直堆叠)
892
+ getSameDayTasks(personId, dateKey) {
893
+ const gap = 3
894
+ let list = []
895
+ let rowArr = this.userRowObj[personId] || []
896
+ // 不跨天日程 宽度186px 计算高度
897
+ // task.crossOneDay 起始时间落在日程表只有一天的时候 跨天任务也渲染成单日任务
898
+ let tasks = this.allTasks.filter(
899
+ (task) =>
900
+ task.personId === personId && // 只显示单日任务
901
+ ((!task.isCrossDay && task.startDate === dateKey && task.endDate === dateKey) ||
902
+ (task.crossOneDay && task.startDate === dateKey) ||
903
+ (task.crossOneDay && task.endDate === dateKey))
904
+ )
905
+
906
+ tasks.forEach((t) => {
907
+ // 前面人员的行高累加
908
+ let maxObj = {} // {0:23, 1:45, 2:130}
909
+ rowArr.forEach((ele) => {
910
+ if (ele.row < t.row) {
911
+ // 当前用户 前面的日程高度总和
912
+ if (!maxObj[ele.row] || ele.height > maxObj[ele.row]) {
913
+ maxObj[ele.row] = ele.height
914
+ }
915
+ }
916
+ })
917
+ const top = Object.values(maxObj).reduce((total, val) => total + val + gap, 0) + 2
918
+
919
+ list.push({ ...t, cellTop: top })
920
+ })
921
+
922
+ return list
923
+ },
924
+ // 根据userRowObj的row,height 计算top值 人员单元格总高度
925
+ // {userId: [{id,row,height}, ...]}
926
+ setPersonStyle() {
927
+ const gap = 3
928
+
929
+ // 人员的行高
930
+ this.personList = this.personList.map((user) => {
931
+ // 当前用户 每行的最大高度
932
+ let maxObj = {} // {0:23, 1:45, 2:130}
933
+ let arr = this.userRowObj[user.id] || []
934
+ arr.forEach((ele) => {
935
+ if (!maxObj[ele.row] || ele.height > maxObj[ele.row]) {
936
+ maxObj[ele.row] = ele.height
937
+ }
938
+ })
939
+ let count = Object.keys(maxObj).length || 1
940
+ let allHeight = sumArray(Object.values(maxObj)) + (count + 1) * gap
941
+ if (allHeight < 40) {
942
+ allHeight = 40
943
+ }
944
+
945
+ return { ...user, allHeight, count }
946
+ })
947
+ },
948
+
949
+ handleDetail(obj) {
950
+ this.$emit('on-check', obj)
951
+ },
952
+ handleEdit(obj) {
953
+ this.$emit('on-edit', obj)
954
+ },
955
+ },
956
+ });
957
+
958
+ // CONCATENATED MODULE: ./src/components/sdy-gantt-chart.vue?vue&type=script&lang=js
959
+ /* harmony default export */ var components_sdy_gantt_chartvue_type_script_lang_js = (sdy_gantt_chartvue_type_script_lang_js);
960
+ // EXTERNAL MODULE: ./src/components/sdy-gantt-chart.vue?vue&type=style&index=0&id=72a2d2e2&prod&lang=less&scoped=true
961
+ var sdy_gantt_chartvue_type_style_index_0_id_72a2d2e2_prod_lang_less_scoped_true = __webpack_require__("b9f5");
962
+
963
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js
964
+ /* globals __VUE_SSR_CONTEXT__ */
965
+
966
+ // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
967
+ // This module is a runtime utility for cleaner component module output and will
968
+ // be included in the final webpack user bundle.
969
+
970
+ function normalizeComponent(
971
+ scriptExports,
972
+ render,
973
+ staticRenderFns,
974
+ functionalTemplate,
975
+ injectStyles,
976
+ scopeId,
977
+ moduleIdentifier /* server only */,
978
+ shadowMode /* vue-cli only */
979
+ ) {
980
+ // Vue.extend constructor export interop
981
+ var options =
982
+ typeof scriptExports === 'function' ? scriptExports.options : scriptExports
983
+
984
+ // render functions
985
+ if (render) {
986
+ options.render = render
987
+ options.staticRenderFns = staticRenderFns
988
+ options._compiled = true
989
+ }
990
+
991
+ // functional template
992
+ if (functionalTemplate) {
993
+ options.functional = true
994
+ }
995
+
996
+ // scopedId
997
+ if (scopeId) {
998
+ options._scopeId = 'data-v-' + scopeId
999
+ }
1000
+
1001
+ var hook
1002
+ if (moduleIdentifier) {
1003
+ // server build
1004
+ hook = function (context) {
1005
+ // 2.3 injection
1006
+ context =
1007
+ context || // cached call
1008
+ (this.$vnode && this.$vnode.ssrContext) || // stateful
1009
+ (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
1010
+ // 2.2 with runInNewContext: true
1011
+ if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
1012
+ context = __VUE_SSR_CONTEXT__
1013
+ }
1014
+ // inject component styles
1015
+ if (injectStyles) {
1016
+ injectStyles.call(this, context)
1017
+ }
1018
+ // register component module identifier for async chunk inferrence
1019
+ if (context && context._registeredComponents) {
1020
+ context._registeredComponents.add(moduleIdentifier)
1021
+ }
1022
+ }
1023
+ // used by ssr in case component is cached and beforeCreate
1024
+ // never gets called
1025
+ options._ssrRegister = hook
1026
+ } else if (injectStyles) {
1027
+ hook = shadowMode
1028
+ ? function () {
1029
+ injectStyles.call(
1030
+ this,
1031
+ (options.functional ? this.parent : this).$root.$options.shadowRoot
1032
+ )
1033
+ }
1034
+ : injectStyles
1035
+ }
1036
+
1037
+ if (hook) {
1038
+ if (options.functional) {
1039
+ // for template-only hot-reload because in that case the render fn doesn't
1040
+ // go through the normalizer
1041
+ options._injectStyles = hook
1042
+ // register for functional component in vue file
1043
+ var originalRender = options.render
1044
+ options.render = function renderWithStyleInjection(h, context) {
1045
+ hook.call(context)
1046
+ return originalRender(h, context)
1047
+ }
1048
+ } else {
1049
+ // inject component registration as beforeCreate hook
1050
+ var existing = options.beforeCreate
1051
+ options.beforeCreate = existing ? [].concat(existing, hook) : [hook]
1052
+ }
1053
+ }
1054
+
1055
+ return {
1056
+ exports: scriptExports,
1057
+ options: options
1058
+ }
1059
+ }
1060
+
1061
+ // CONCATENATED MODULE: ./src/components/sdy-gantt-chart.vue
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+ /* normalize component */
1069
+
1070
+ var component = normalizeComponent(
1071
+ components_sdy_gantt_chartvue_type_script_lang_js,
1072
+ render,
1073
+ staticRenderFns,
1074
+ false,
1075
+ null,
1076
+ "72a2d2e2",
1077
+ null
1078
+
1079
+ )
1080
+
1081
+ /* harmony default export */ var sdy_gantt_chart = (component.exports);
1082
+ // CONCATENATED MODULE: ./src/components/index.js
1083
+
1084
+
1085
+ const install = function (Vue) {
1086
+ Vue.component(sdy_gantt_chart.name, sdy_gantt_chart)
1087
+ }
1088
+
1089
+ /* harmony default export */ var components = ({
1090
+ install,
1091
+ SdyGantt: sdy_gantt_chart,
1092
+ });
1093
+
1094
+ if (typeof window !== 'undefined' && window.Vue) {
1095
+ window.Vue.use(install)
1096
+ }
1097
+
1098
+ // CONCATENATED MODULE: ./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js
1099
+
1100
+
1101
+ /* harmony default export */ var entry_lib = __webpack_exports__["default"] = (components);
1102
+
1103
+
1104
+
1105
+ /***/ })
1106
+
1107
+ /******/ })["default"];