Rev 1042 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
597 | daniel-mar | 1 | /** |
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
||
3 | * Licensed under the LGPL or a commercial license. |
||
4 | * For LGPL see License.txt in the project root for license information. |
||
5 | * For commercial licenses see https://www.tiny.cloud/ |
||
6 | * |
||
1422 | daniel-mar | 7 | * Version: 5.10.8 (2023-10-19) |
597 | daniel-mar | 8 | */ |
9 | (function () { |
||
10 | 'use strict'; |
||
11 | |||
12 | var typeOf = function (x) { |
||
13 | var t = typeof x; |
||
14 | if (x === null) { |
||
15 | return 'null'; |
||
16 | } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { |
||
17 | return 'array'; |
||
18 | } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { |
||
19 | return 'string'; |
||
20 | } else { |
||
21 | return t; |
||
22 | } |
||
23 | }; |
||
637 | daniel-mar | 24 | var isType$1 = function (type) { |
597 | daniel-mar | 25 | return function (value) { |
26 | return typeOf(value) === type; |
||
27 | }; |
||
28 | }; |
||
29 | var isSimpleType = function (type) { |
||
30 | return function (value) { |
||
31 | return typeof value === type; |
||
32 | }; |
||
33 | }; |
||
637 | daniel-mar | 34 | var eq$2 = function (t) { |
597 | daniel-mar | 35 | return function (a) { |
36 | return t === a; |
||
37 | }; |
||
38 | }; |
||
637 | daniel-mar | 39 | var isString = isType$1('string'); |
40 | var isObject = isType$1('object'); |
||
41 | var isArray = isType$1('array'); |
||
42 | var isNull = eq$2(null); |
||
597 | daniel-mar | 43 | var isBoolean = isSimpleType('boolean'); |
637 | daniel-mar | 44 | var isUndefined = eq$2(undefined); |
597 | daniel-mar | 45 | var isNullable = function (a) { |
46 | return a === null || a === undefined; |
||
47 | }; |
||
48 | var isNonNullable = function (a) { |
||
49 | return !isNullable(a); |
||
50 | }; |
||
51 | var isFunction = isSimpleType('function'); |
||
52 | var isNumber = isSimpleType('number'); |
||
53 | |||
54 | var noop = function () { |
||
55 | }; |
||
56 | var compose = function (fa, fb) { |
||
57 | return function () { |
||
58 | var args = []; |
||
59 | for (var _i = 0; _i < arguments.length; _i++) { |
||
60 | args[_i] = arguments[_i]; |
||
61 | } |
||
62 | return fa(fb.apply(null, args)); |
||
63 | }; |
||
64 | }; |
||
65 | var compose1 = function (fbc, fab) { |
||
66 | return function (a) { |
||
67 | return fbc(fab(a)); |
||
68 | }; |
||
69 | }; |
||
70 | var constant = function (value) { |
||
71 | return function () { |
||
72 | return value; |
||
73 | }; |
||
74 | }; |
||
75 | var identity = function (x) { |
||
76 | return x; |
||
77 | }; |
||
637 | daniel-mar | 78 | var tripleEquals = function (a, b) { |
79 | return a === b; |
||
80 | }; |
||
597 | daniel-mar | 81 | function curry(fn) { |
82 | var initialArgs = []; |
||
83 | for (var _i = 1; _i < arguments.length; _i++) { |
||
84 | initialArgs[_i - 1] = arguments[_i]; |
||
85 | } |
||
86 | return function () { |
||
87 | var restArgs = []; |
||
88 | for (var _i = 0; _i < arguments.length; _i++) { |
||
89 | restArgs[_i] = arguments[_i]; |
||
90 | } |
||
91 | var all = initialArgs.concat(restArgs); |
||
92 | return fn.apply(null, all); |
||
93 | }; |
||
94 | } |
||
95 | var not = function (f) { |
||
96 | return function (t) { |
||
97 | return !f(t); |
||
98 | }; |
||
99 | }; |
||
100 | var die = function (msg) { |
||
101 | return function () { |
||
102 | throw new Error(msg); |
||
103 | }; |
||
104 | }; |
||
105 | var never = constant(false); |
||
106 | var always = constant(true); |
||
107 | |||
637 | daniel-mar | 108 | var none$2 = function () { |
597 | daniel-mar | 109 | return NONE; |
110 | }; |
||
111 | var NONE = function () { |
||
112 | var call = function (thunk) { |
||
113 | return thunk(); |
||
114 | }; |
||
637 | daniel-mar | 115 | var id = identity; |
597 | daniel-mar | 116 | var me = { |
117 | fold: function (n, _s) { |
||
118 | return n(); |
||
119 | }, |
||
120 | isSome: never, |
||
121 | isNone: always, |
||
122 | getOr: id, |
||
123 | getOrThunk: call, |
||
124 | getOrDie: function (msg) { |
||
125 | throw new Error(msg || 'error: getOrDie called on none.'); |
||
126 | }, |
||
127 | getOrNull: constant(null), |
||
128 | getOrUndefined: constant(undefined), |
||
129 | or: id, |
||
130 | orThunk: call, |
||
637 | daniel-mar | 131 | map: none$2, |
597 | daniel-mar | 132 | each: noop, |
637 | daniel-mar | 133 | bind: none$2, |
597 | daniel-mar | 134 | exists: never, |
135 | forall: always, |
||
637 | daniel-mar | 136 | filter: function () { |
137 | return none$2(); |
||
138 | }, |
||
597 | daniel-mar | 139 | toArray: function () { |
140 | return []; |
||
141 | }, |
||
142 | toString: constant('none()') |
||
143 | }; |
||
144 | return me; |
||
145 | }(); |
||
146 | var some = function (a) { |
||
147 | var constant_a = constant(a); |
||
148 | var self = function () { |
||
149 | return me; |
||
150 | }; |
||
151 | var bind = function (f) { |
||
152 | return f(a); |
||
153 | }; |
||
154 | var me = { |
||
155 | fold: function (n, s) { |
||
156 | return s(a); |
||
157 | }, |
||
158 | isSome: always, |
||
159 | isNone: never, |
||
160 | getOr: constant_a, |
||
161 | getOrThunk: constant_a, |
||
162 | getOrDie: constant_a, |
||
163 | getOrNull: constant_a, |
||
164 | getOrUndefined: constant_a, |
||
165 | or: self, |
||
166 | orThunk: self, |
||
167 | map: function (f) { |
||
168 | return some(f(a)); |
||
169 | }, |
||
170 | each: function (f) { |
||
171 | f(a); |
||
172 | }, |
||
173 | bind: bind, |
||
174 | exists: bind, |
||
175 | forall: bind, |
||
176 | filter: function (f) { |
||
177 | return f(a) ? me : NONE; |
||
178 | }, |
||
179 | toArray: function () { |
||
180 | return [a]; |
||
181 | }, |
||
182 | toString: function () { |
||
183 | return 'some(' + a + ')'; |
||
184 | } |
||
185 | }; |
||
186 | return me; |
||
187 | }; |
||
637 | daniel-mar | 188 | var from$1 = function (value) { |
597 | daniel-mar | 189 | return value === null || value === undefined ? NONE : some(value); |
190 | }; |
||
191 | var Optional = { |
||
192 | some: some, |
||
637 | daniel-mar | 193 | none: none$2, |
194 | from: from$1 |
||
597 | daniel-mar | 195 | }; |
196 | |||
197 | var nativeSlice = Array.prototype.slice; |
||
198 | var nativeIndexOf = Array.prototype.indexOf; |
||
199 | var nativePush = Array.prototype.push; |
||
200 | var rawIndexOf = function (ts, t) { |
||
201 | return nativeIndexOf.call(ts, t); |
||
202 | }; |
||
637 | daniel-mar | 203 | var contains$2 = function (xs, x) { |
597 | daniel-mar | 204 | return rawIndexOf(xs, x) > -1; |
205 | }; |
||
206 | var exists = function (xs, pred) { |
||
207 | for (var i = 0, len = xs.length; i < len; i++) { |
||
208 | var x = xs[i]; |
||
209 | if (pred(x, i)) { |
||
210 | return true; |
||
211 | } |
||
212 | } |
||
213 | return false; |
||
214 | }; |
||
637 | daniel-mar | 215 | var range$1 = function (num, f) { |
597 | daniel-mar | 216 | var r = []; |
217 | for (var i = 0; i < num; i++) { |
||
218 | r.push(f(i)); |
||
219 | } |
||
220 | return r; |
||
221 | }; |
||
637 | daniel-mar | 222 | var map$1 = function (xs, f) { |
597 | daniel-mar | 223 | var len = xs.length; |
224 | var r = new Array(len); |
||
225 | for (var i = 0; i < len; i++) { |
||
226 | var x = xs[i]; |
||
227 | r[i] = f(x, i); |
||
228 | } |
||
229 | return r; |
||
230 | }; |
||
637 | daniel-mar | 231 | var each$2 = function (xs, f) { |
597 | daniel-mar | 232 | for (var i = 0, len = xs.length; i < len; i++) { |
233 | var x = xs[i]; |
||
234 | f(x, i); |
||
235 | } |
||
236 | }; |
||
237 | var eachr = function (xs, f) { |
||
238 | for (var i = xs.length - 1; i >= 0; i--) { |
||
239 | var x = xs[i]; |
||
240 | f(x, i); |
||
241 | } |
||
242 | }; |
||
243 | var partition = function (xs, pred) { |
||
244 | var pass = []; |
||
245 | var fail = []; |
||
246 | for (var i = 0, len = xs.length; i < len; i++) { |
||
247 | var x = xs[i]; |
||
248 | var arr = pred(x, i) ? pass : fail; |
||
249 | arr.push(x); |
||
250 | } |
||
251 | return { |
||
252 | pass: pass, |
||
253 | fail: fail |
||
254 | }; |
||
255 | }; |
||
637 | daniel-mar | 256 | var filter$2 = function (xs, pred) { |
597 | daniel-mar | 257 | var r = []; |
258 | for (var i = 0, len = xs.length; i < len; i++) { |
||
259 | var x = xs[i]; |
||
260 | if (pred(x, i)) { |
||
261 | r.push(x); |
||
262 | } |
||
263 | } |
||
264 | return r; |
||
265 | }; |
||
266 | var foldr = function (xs, f, acc) { |
||
637 | daniel-mar | 267 | eachr(xs, function (x, i) { |
268 | acc = f(acc, x, i); |
||
597 | daniel-mar | 269 | }); |
270 | return acc; |
||
271 | }; |
||
272 | var foldl = function (xs, f, acc) { |
||
637 | daniel-mar | 273 | each$2(xs, function (x, i) { |
274 | acc = f(acc, x, i); |
||
597 | daniel-mar | 275 | }); |
276 | return acc; |
||
277 | }; |
||
278 | var findUntil = function (xs, pred, until) { |
||
279 | for (var i = 0, len = xs.length; i < len; i++) { |
||
280 | var x = xs[i]; |
||
281 | if (pred(x, i)) { |
||
282 | return Optional.some(x); |
||
283 | } else if (until(x, i)) { |
||
284 | break; |
||
285 | } |
||
286 | } |
||
287 | return Optional.none(); |
||
288 | }; |
||
637 | daniel-mar | 289 | var find$1 = function (xs, pred) { |
597 | daniel-mar | 290 | return findUntil(xs, pred, never); |
291 | }; |
||
292 | var findIndex = function (xs, pred) { |
||
293 | for (var i = 0, len = xs.length; i < len; i++) { |
||
294 | var x = xs[i]; |
||
295 | if (pred(x, i)) { |
||
296 | return Optional.some(i); |
||
297 | } |
||
298 | } |
||
299 | return Optional.none(); |
||
300 | }; |
||
637 | daniel-mar | 301 | var flatten$1 = function (xs) { |
597 | daniel-mar | 302 | var r = []; |
303 | for (var i = 0, len = xs.length; i < len; ++i) { |
||
304 | if (!isArray(xs[i])) { |
||
305 | throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); |
||
306 | } |
||
307 | nativePush.apply(r, xs[i]); |
||
308 | } |
||
309 | return r; |
||
310 | }; |
||
637 | daniel-mar | 311 | var bind$2 = function (xs, f) { |
312 | return flatten$1(map$1(xs, f)); |
||
597 | daniel-mar | 313 | }; |
314 | var forall = function (xs, pred) { |
||
315 | for (var i = 0, len = xs.length; i < len; ++i) { |
||
316 | var x = xs[i]; |
||
317 | if (pred(x, i) !== true) { |
||
318 | return false; |
||
319 | } |
||
320 | } |
||
321 | return true; |
||
322 | }; |
||
323 | var reverse = function (xs) { |
||
324 | var r = nativeSlice.call(xs, 0); |
||
325 | r.reverse(); |
||
326 | return r; |
||
327 | }; |
||
328 | var mapToObject = function (xs, f) { |
||
329 | var r = {}; |
||
330 | for (var i = 0, len = xs.length; i < len; i++) { |
||
331 | var x = xs[i]; |
||
332 | r[String(x)] = f(x, i); |
||
333 | } |
||
334 | return r; |
||
335 | }; |
||
336 | var pure = function (x) { |
||
337 | return [x]; |
||
338 | }; |
||
637 | daniel-mar | 339 | var sort$1 = function (xs, comparator) { |
597 | daniel-mar | 340 | var copy = nativeSlice.call(xs, 0); |
341 | copy.sort(comparator); |
||
342 | return copy; |
||
343 | }; |
||
637 | daniel-mar | 344 | var get$d = function (xs, i) { |
597 | daniel-mar | 345 | return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); |
346 | }; |
||
347 | var head = function (xs) { |
||
637 | daniel-mar | 348 | return get$d(xs, 0); |
597 | daniel-mar | 349 | }; |
637 | daniel-mar | 350 | var last$2 = function (xs) { |
351 | return get$d(xs, xs.length - 1); |
||
597 | daniel-mar | 352 | }; |
353 | var findMap = function (arr, f) { |
||
354 | for (var i = 0; i < arr.length; i++) { |
||
355 | var r = f(arr[i], i); |
||
356 | if (r.isSome()) { |
||
357 | return r; |
||
358 | } |
||
359 | } |
||
360 | return Optional.none(); |
||
361 | }; |
||
362 | |||
363 | var __assign = function () { |
||
364 | __assign = Object.assign || function __assign(t) { |
||
365 | for (var s, i = 1, n = arguments.length; i < n; i++) { |
||
366 | s = arguments[i]; |
||
367 | for (var p in s) |
||
368 | if (Object.prototype.hasOwnProperty.call(s, p)) |
||
369 | t[p] = s[p]; |
||
370 | } |
||
371 | return t; |
||
372 | }; |
||
373 | return __assign.apply(this, arguments); |
||
374 | }; |
||
637 | daniel-mar | 375 | function __spreadArray(to, from, pack) { |
376 | if (pack || arguments.length === 2) |
||
377 | for (var i = 0, l = from.length, ar; i < l; i++) { |
||
378 | if (ar || !(i in from)) { |
||
379 | if (!ar) |
||
380 | ar = Array.prototype.slice.call(from, 0, i); |
||
381 | ar[i] = from[i]; |
||
382 | } |
||
383 | } |
||
384 | return to.concat(ar || Array.prototype.slice.call(from)); |
||
597 | daniel-mar | 385 | } |
386 | |||
387 | var cached = function (f) { |
||
388 | var called = false; |
||
389 | var r; |
||
390 | return function () { |
||
391 | var args = []; |
||
392 | for (var _i = 0; _i < arguments.length; _i++) { |
||
393 | args[_i] = arguments[_i]; |
||
394 | } |
||
395 | if (!called) { |
||
396 | called = true; |
||
397 | r = f.apply(null, args); |
||
398 | } |
||
399 | return r; |
||
400 | }; |
||
401 | }; |
||
402 | |||
403 | var DeviceType = function (os, browser, userAgent, mediaMatch) { |
||
404 | var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; |
||
405 | var isiPhone = os.isiOS() && !isiPad; |
||
406 | var isMobile = os.isiOS() || os.isAndroid(); |
||
407 | var isTouch = isMobile || mediaMatch('(pointer:coarse)'); |
||
408 | var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); |
||
409 | var isPhone = isiPhone || isMobile && !isTablet; |
||
410 | var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; |
||
411 | var isDesktop = !isPhone && !isTablet && !iOSwebview; |
||
412 | return { |
||
413 | isiPad: constant(isiPad), |
||
414 | isiPhone: constant(isiPhone), |
||
415 | isTablet: constant(isTablet), |
||
416 | isPhone: constant(isPhone), |
||
417 | isTouch: constant(isTouch), |
||
418 | isAndroid: os.isAndroid, |
||
419 | isiOS: os.isiOS, |
||
420 | isWebView: constant(iOSwebview), |
||
421 | isDesktop: constant(isDesktop) |
||
422 | }; |
||
423 | }; |
||
424 | |||
425 | var firstMatch = function (regexes, s) { |
||
426 | for (var i = 0; i < regexes.length; i++) { |
||
427 | var x = regexes[i]; |
||
428 | if (x.test(s)) { |
||
429 | return x; |
||
430 | } |
||
431 | } |
||
432 | return undefined; |
||
433 | }; |
||
637 | daniel-mar | 434 | var find = function (regexes, agent) { |
597 | daniel-mar | 435 | var r = firstMatch(regexes, agent); |
436 | if (!r) { |
||
437 | return { |
||
438 | major: 0, |
||
439 | minor: 0 |
||
440 | }; |
||
441 | } |
||
442 | var group = function (i) { |
||
443 | return Number(agent.replace(r, '$' + i)); |
||
444 | }; |
||
637 | daniel-mar | 445 | return nu$2(group(1), group(2)); |
597 | daniel-mar | 446 | }; |
637 | daniel-mar | 447 | var detect$6 = function (versionRegexes, agent) { |
597 | daniel-mar | 448 | var cleanedAgent = String(agent).toLowerCase(); |
449 | if (versionRegexes.length === 0) { |
||
637 | daniel-mar | 450 | return unknown$2(); |
597 | daniel-mar | 451 | } |
637 | daniel-mar | 452 | return find(versionRegexes, cleanedAgent); |
597 | daniel-mar | 453 | }; |
637 | daniel-mar | 454 | var unknown$2 = function () { |
455 | return nu$2(0, 0); |
||
597 | daniel-mar | 456 | }; |
637 | daniel-mar | 457 | var nu$2 = function (major, minor) { |
597 | daniel-mar | 458 | return { |
459 | major: major, |
||
460 | minor: minor |
||
461 | }; |
||
462 | }; |
||
463 | var Version = { |
||
637 | daniel-mar | 464 | nu: nu$2, |
465 | detect: detect$6, |
||
466 | unknown: unknown$2 |
||
597 | daniel-mar | 467 | }; |
468 | |||
637 | daniel-mar | 469 | var detectBrowser$1 = function (browsers, userAgentData) { |
470 | return findMap(userAgentData.brands, function (uaBrand) { |
||
471 | var lcBrand = uaBrand.brand.toLowerCase(); |
||
472 | return find$1(browsers, function (browser) { |
||
473 | var _a; |
||
474 | return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); |
||
475 | }).map(function (info) { |
||
476 | return { |
||
477 | current: info.name, |
||
478 | version: Version.nu(parseInt(uaBrand.version, 10), 0) |
||
479 | }; |
||
480 | }); |
||
481 | }); |
||
482 | }; |
||
483 | |||
484 | var detect$5 = function (candidates, userAgent) { |
||
597 | daniel-mar | 485 | var agent = String(userAgent).toLowerCase(); |
637 | daniel-mar | 486 | return find$1(candidates, function (candidate) { |
597 | daniel-mar | 487 | return candidate.search(agent); |
488 | }); |
||
489 | }; |
||
490 | var detectBrowser = function (browsers, userAgent) { |
||
637 | daniel-mar | 491 | return detect$5(browsers, userAgent).map(function (browser) { |
597 | daniel-mar | 492 | var version = Version.detect(browser.versionRegexes, userAgent); |
493 | return { |
||
494 | current: browser.name, |
||
495 | version: version |
||
496 | }; |
||
497 | }); |
||
498 | }; |
||
499 | var detectOs = function (oses, userAgent) { |
||
637 | daniel-mar | 500 | return detect$5(oses, userAgent).map(function (os) { |
597 | daniel-mar | 501 | var version = Version.detect(os.versionRegexes, userAgent); |
502 | return { |
||
503 | current: os.name, |
||
504 | version: version |
||
505 | }; |
||
506 | }); |
||
507 | }; |
||
637 | daniel-mar | 508 | |
509 | var removeFromStart = function (str, numChars) { |
||
510 | return str.substring(numChars); |
||
597 | daniel-mar | 511 | }; |
512 | |||
513 | var checkRange = function (str, substr, start) { |
||
514 | return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; |
||
515 | }; |
||
637 | daniel-mar | 516 | var removeLeading = function (str, prefix) { |
517 | return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str; |
||
518 | }; |
||
597 | daniel-mar | 519 | var contains$1 = function (str, substr) { |
520 | return str.indexOf(substr) !== -1; |
||
521 | }; |
||
522 | var startsWith = function (str, prefix) { |
||
523 | return checkRange(str, prefix, 0); |
||
524 | }; |
||
525 | var endsWith = function (str, suffix) { |
||
526 | return checkRange(str, suffix, str.length - suffix.length); |
||
527 | }; |
||
528 | var blank = function (r) { |
||
529 | return function (s) { |
||
530 | return s.replace(r, ''); |
||
531 | }; |
||
532 | }; |
||
533 | var trim = blank(/^\s+|\s+$/g); |
||
534 | var isNotEmpty = function (s) { |
||
535 | return s.length > 0; |
||
536 | }; |
||
637 | daniel-mar | 537 | var isEmpty$1 = function (s) { |
538 | return !isNotEmpty(s); |
||
539 | }; |
||
679 | daniel-mar | 540 | var toFloat = function (value) { |
541 | var num = parseFloat(value); |
||
542 | return isNaN(num) ? Optional.none() : Optional.some(num); |
||
543 | }; |
||
597 | daniel-mar | 544 | |
545 | var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; |
||
546 | var checkContains = function (target) { |
||
547 | return function (uastring) { |
||
548 | return contains$1(uastring, target); |
||
549 | }; |
||
550 | }; |
||
551 | var browsers = [ |
||
552 | { |
||
553 | name: 'Edge', |
||
554 | versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], |
||
555 | search: function (uastring) { |
||
556 | return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); |
||
557 | } |
||
558 | }, |
||
559 | { |
||
560 | name: 'Chrome', |
||
637 | daniel-mar | 561 | brand: 'Chromium', |
597 | daniel-mar | 562 | versionRegexes: [ |
563 | /.*?chrome\/([0-9]+)\.([0-9]+).*/, |
||
564 | normalVersionRegex |
||
565 | ], |
||
566 | search: function (uastring) { |
||
567 | return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); |
||
568 | } |
||
569 | }, |
||
570 | { |
||
571 | name: 'IE', |
||
572 | versionRegexes: [ |
||
573 | /.*?msie\ ?([0-9]+)\.([0-9]+).*/, |
||
574 | /.*?rv:([0-9]+)\.([0-9]+).*/ |
||
575 | ], |
||
576 | search: function (uastring) { |
||
577 | return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); |
||
578 | } |
||
579 | }, |
||
580 | { |
||
581 | name: 'Opera', |
||
582 | versionRegexes: [ |
||
583 | normalVersionRegex, |
||
584 | /.*?opera\/([0-9]+)\.([0-9]+).*/ |
||
585 | ], |
||
586 | search: checkContains('opera') |
||
587 | }, |
||
588 | { |
||
589 | name: 'Firefox', |
||
590 | versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], |
||
591 | search: checkContains('firefox') |
||
592 | }, |
||
593 | { |
||
594 | name: 'Safari', |
||
595 | versionRegexes: [ |
||
596 | normalVersionRegex, |
||
597 | /.*?cpu os ([0-9]+)_([0-9]+).*/ |
||
598 | ], |
||
599 | search: function (uastring) { |
||
600 | return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); |
||
601 | } |
||
602 | } |
||
603 | ]; |
||
604 | var oses = [ |
||
605 | { |
||
606 | name: 'Windows', |
||
607 | search: checkContains('win'), |
||
608 | versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] |
||
609 | }, |
||
610 | { |
||
611 | name: 'iOS', |
||
612 | search: function (uastring) { |
||
613 | return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); |
||
614 | }, |
||
615 | versionRegexes: [ |
||
616 | /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, |
||
617 | /.*cpu os ([0-9]+)_([0-9]+).*/, |
||
618 | /.*cpu iphone os ([0-9]+)_([0-9]+).*/ |
||
619 | ] |
||
620 | }, |
||
621 | { |
||
622 | name: 'Android', |
||
623 | search: checkContains('android'), |
||
624 | versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] |
||
625 | }, |
||
626 | { |
||
627 | name: 'OSX', |
||
628 | search: checkContains('mac os x'), |
||
629 | versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] |
||
630 | }, |
||
631 | { |
||
632 | name: 'Linux', |
||
633 | search: checkContains('linux'), |
||
634 | versionRegexes: [] |
||
635 | }, |
||
636 | { |
||
637 | name: 'Solaris', |
||
638 | search: checkContains('sunos'), |
||
639 | versionRegexes: [] |
||
640 | }, |
||
641 | { |
||
642 | name: 'FreeBSD', |
||
643 | search: checkContains('freebsd'), |
||
644 | versionRegexes: [] |
||
645 | }, |
||
646 | { |
||
647 | name: 'ChromeOS', |
||
648 | search: checkContains('cros'), |
||
649 | versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] |
||
650 | } |
||
651 | ]; |
||
652 | var PlatformInfo = { |
||
653 | browsers: constant(browsers), |
||
654 | oses: constant(oses) |
||
655 | }; |
||
656 | |||
657 | var edge = 'Edge'; |
||
658 | var chrome = 'Chrome'; |
||
659 | var ie = 'IE'; |
||
660 | var opera = 'Opera'; |
||
661 | var firefox = 'Firefox'; |
||
662 | var safari = 'Safari'; |
||
663 | var unknown$1 = function () { |
||
664 | return nu$1({ |
||
665 | current: undefined, |
||
666 | version: Version.unknown() |
||
667 | }); |
||
668 | }; |
||
669 | var nu$1 = function (info) { |
||
670 | var current = info.current; |
||
671 | var version = info.version; |
||
672 | var isBrowser = function (name) { |
||
673 | return function () { |
||
674 | return current === name; |
||
675 | }; |
||
676 | }; |
||
677 | return { |
||
678 | current: current, |
||
679 | version: version, |
||
680 | isEdge: isBrowser(edge), |
||
681 | isChrome: isBrowser(chrome), |
||
682 | isIE: isBrowser(ie), |
||
683 | isOpera: isBrowser(opera), |
||
684 | isFirefox: isBrowser(firefox), |
||
685 | isSafari: isBrowser(safari) |
||
686 | }; |
||
687 | }; |
||
688 | var Browser = { |
||
689 | unknown: unknown$1, |
||
690 | nu: nu$1, |
||
691 | edge: constant(edge), |
||
692 | chrome: constant(chrome), |
||
693 | ie: constant(ie), |
||
694 | opera: constant(opera), |
||
695 | firefox: constant(firefox), |
||
696 | safari: constant(safari) |
||
697 | }; |
||
698 | |||
699 | var windows = 'Windows'; |
||
700 | var ios = 'iOS'; |
||
701 | var android = 'Android'; |
||
702 | var linux = 'Linux'; |
||
703 | var osx = 'OSX'; |
||
704 | var solaris = 'Solaris'; |
||
705 | var freebsd = 'FreeBSD'; |
||
706 | var chromeos = 'ChromeOS'; |
||
637 | daniel-mar | 707 | var unknown = function () { |
708 | return nu({ |
||
597 | daniel-mar | 709 | current: undefined, |
710 | version: Version.unknown() |
||
711 | }); |
||
712 | }; |
||
637 | daniel-mar | 713 | var nu = function (info) { |
597 | daniel-mar | 714 | var current = info.current; |
715 | var version = info.version; |
||
716 | var isOS = function (name) { |
||
717 | return function () { |
||
718 | return current === name; |
||
719 | }; |
||
720 | }; |
||
721 | return { |
||
722 | current: current, |
||
723 | version: version, |
||
724 | isWindows: isOS(windows), |
||
725 | isiOS: isOS(ios), |
||
726 | isAndroid: isOS(android), |
||
727 | isOSX: isOS(osx), |
||
728 | isLinux: isOS(linux), |
||
729 | isSolaris: isOS(solaris), |
||
730 | isFreeBSD: isOS(freebsd), |
||
731 | isChromeOS: isOS(chromeos) |
||
732 | }; |
||
733 | }; |
||
734 | var OperatingSystem = { |
||
637 | daniel-mar | 735 | unknown: unknown, |
736 | nu: nu, |
||
597 | daniel-mar | 737 | windows: constant(windows), |
738 | ios: constant(ios), |
||
739 | android: constant(android), |
||
740 | linux: constant(linux), |
||
741 | osx: constant(osx), |
||
742 | solaris: constant(solaris), |
||
743 | freebsd: constant(freebsd), |
||
744 | chromeos: constant(chromeos) |
||
745 | }; |
||
746 | |||
637 | daniel-mar | 747 | var detect$4 = function (userAgent, userAgentDataOpt, mediaMatch) { |
597 | daniel-mar | 748 | var browsers = PlatformInfo.browsers(); |
749 | var oses = PlatformInfo.oses(); |
||
637 | daniel-mar | 750 | var browser = userAgentDataOpt.bind(function (userAgentData) { |
751 | return detectBrowser$1(browsers, userAgentData); |
||
752 | }).orThunk(function () { |
||
753 | return detectBrowser(browsers, userAgent); |
||
754 | }).fold(Browser.unknown, Browser.nu); |
||
755 | var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); |
||
597 | daniel-mar | 756 | var deviceType = DeviceType(os, browser, userAgent, mediaMatch); |
757 | return { |
||
758 | browser: browser, |
||
759 | os: os, |
||
760 | deviceType: deviceType |
||
761 | }; |
||
762 | }; |
||
637 | daniel-mar | 763 | var PlatformDetection = { detect: detect$4 }; |
597 | daniel-mar | 764 | |
765 | var mediaMatch = function (query) { |
||
766 | return window.matchMedia(query).matches; |
||
767 | }; |
||
768 | var platform = cached(function () { |
||
637 | daniel-mar | 769 | return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); |
597 | daniel-mar | 770 | }); |
771 | var detect$3 = function () { |
||
772 | return platform(); |
||
773 | }; |
||
774 | |||
775 | var compareDocumentPosition = function (a, b, match) { |
||
776 | return (a.compareDocumentPosition(b) & match) !== 0; |
||
777 | }; |
||
778 | var documentPositionContainedBy = function (a, b) { |
||
779 | return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); |
||
780 | }; |
||
781 | |||
782 | var COMMENT = 8; |
||
783 | var DOCUMENT = 9; |
||
784 | var DOCUMENT_FRAGMENT = 11; |
||
785 | var ELEMENT = 1; |
||
786 | var TEXT = 3; |
||
787 | |||
637 | daniel-mar | 788 | var fromHtml$1 = function (html, scope) { |
597 | daniel-mar | 789 | var doc = scope || document; |
790 | var div = doc.createElement('div'); |
||
791 | div.innerHTML = html; |
||
792 | if (!div.hasChildNodes() || div.childNodes.length > 1) { |
||
793 | console.error('HTML does not have a single root node', html); |
||
794 | throw new Error('HTML must have a single root node'); |
||
795 | } |
||
637 | daniel-mar | 796 | return fromDom$1(div.childNodes[0]); |
597 | daniel-mar | 797 | }; |
798 | var fromTag = function (tag, scope) { |
||
799 | var doc = scope || document; |
||
800 | var node = doc.createElement(tag); |
||
637 | daniel-mar | 801 | return fromDom$1(node); |
597 | daniel-mar | 802 | }; |
803 | var fromText = function (text, scope) { |
||
804 | var doc = scope || document; |
||
805 | var node = doc.createTextNode(text); |
||
637 | daniel-mar | 806 | return fromDom$1(node); |
597 | daniel-mar | 807 | }; |
637 | daniel-mar | 808 | var fromDom$1 = function (node) { |
597 | daniel-mar | 809 | if (node === null || node === undefined) { |
810 | throw new Error('Node cannot be null or undefined'); |
||
811 | } |
||
812 | return { dom: node }; |
||
813 | }; |
||
637 | daniel-mar | 814 | var fromPoint$1 = function (docElm, x, y) { |
815 | return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1); |
||
597 | daniel-mar | 816 | }; |
817 | var SugarElement = { |
||
637 | daniel-mar | 818 | fromHtml: fromHtml$1, |
597 | daniel-mar | 819 | fromTag: fromTag, |
820 | fromText: fromText, |
||
637 | daniel-mar | 821 | fromDom: fromDom$1, |
822 | fromPoint: fromPoint$1 |
||
597 | daniel-mar | 823 | }; |
824 | |||
637 | daniel-mar | 825 | var is$2 = function (element, selector) { |
597 | daniel-mar | 826 | var dom = element.dom; |
827 | if (dom.nodeType !== ELEMENT) { |
||
828 | return false; |
||
829 | } else { |
||
830 | var elem = dom; |
||
831 | if (elem.matches !== undefined) { |
||
832 | return elem.matches(selector); |
||
833 | } else if (elem.msMatchesSelector !== undefined) { |
||
834 | return elem.msMatchesSelector(selector); |
||
835 | } else if (elem.webkitMatchesSelector !== undefined) { |
||
836 | return elem.webkitMatchesSelector(selector); |
||
837 | } else if (elem.mozMatchesSelector !== undefined) { |
||
838 | return elem.mozMatchesSelector(selector); |
||
839 | } else { |
||
840 | throw new Error('Browser lacks native selectors'); |
||
841 | } |
||
842 | } |
||
843 | }; |
||
844 | var bypassSelector = function (dom) { |
||
845 | return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; |
||
846 | }; |
||
637 | daniel-mar | 847 | var all$1 = function (selector, scope) { |
597 | daniel-mar | 848 | var base = scope === undefined ? document : scope.dom; |
637 | daniel-mar | 849 | return bypassSelector(base) ? [] : map$1(base.querySelectorAll(selector), SugarElement.fromDom); |
597 | daniel-mar | 850 | }; |
851 | var one = function (selector, scope) { |
||
852 | var base = scope === undefined ? document : scope.dom; |
||
853 | return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); |
||
854 | }; |
||
855 | |||
856 | var eq$1 = function (e1, e2) { |
||
857 | return e1.dom === e2.dom; |
||
858 | }; |
||
859 | var regularContains = function (e1, e2) { |
||
860 | var d1 = e1.dom; |
||
861 | var d2 = e2.dom; |
||
862 | return d1 === d2 ? false : d1.contains(d2); |
||
863 | }; |
||
864 | var ieContains = function (e1, e2) { |
||
865 | return documentPositionContainedBy(e1.dom, e2.dom); |
||
866 | }; |
||
637 | daniel-mar | 867 | var contains = function (e1, e2) { |
597 | daniel-mar | 868 | return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); |
869 | }; |
||
637 | daniel-mar | 870 | var is$1 = is$2; |
597 | daniel-mar | 871 | |
872 | var keys = Object.keys; |
||
873 | var hasOwnProperty = Object.hasOwnProperty; |
||
874 | var each$1 = function (obj, f) { |
||
875 | var props = keys(obj); |
||
876 | for (var k = 0, len = props.length; k < len; k++) { |
||
877 | var i = props[k]; |
||
878 | var x = obj[i]; |
||
879 | f(x, i); |
||
880 | } |
||
881 | }; |
||
637 | daniel-mar | 882 | var map = function (obj, f) { |
597 | daniel-mar | 883 | return tupleMap(obj, function (x, i) { |
884 | return { |
||
885 | k: i, |
||
886 | v: f(x, i) |
||
887 | }; |
||
888 | }); |
||
889 | }; |
||
890 | var tupleMap = function (obj, f) { |
||
891 | var r = {}; |
||
892 | each$1(obj, function (x, i) { |
||
893 | var tuple = f(x, i); |
||
894 | r[tuple.k] = tuple.v; |
||
895 | }); |
||
896 | return r; |
||
897 | }; |
||
898 | var objAcc = function (r) { |
||
899 | return function (x, i) { |
||
900 | r[i] = x; |
||
901 | }; |
||
902 | }; |
||
903 | var internalFilter = function (obj, pred, onTrue, onFalse) { |
||
904 | var r = {}; |
||
905 | each$1(obj, function (x, i) { |
||
906 | (pred(x, i) ? onTrue : onFalse)(x, i); |
||
907 | }); |
||
908 | return r; |
||
909 | }; |
||
910 | var filter$1 = function (obj, pred) { |
||
911 | var t = {}; |
||
912 | internalFilter(obj, pred, objAcc(t), noop); |
||
913 | return t; |
||
914 | }; |
||
915 | var mapToArray = function (obj, f) { |
||
916 | var r = []; |
||
917 | each$1(obj, function (value, name) { |
||
918 | r.push(f(value, name)); |
||
919 | }); |
||
920 | return r; |
||
921 | }; |
||
922 | var values = function (obj) { |
||
637 | daniel-mar | 923 | return mapToArray(obj, identity); |
597 | daniel-mar | 924 | }; |
925 | var size = function (obj) { |
||
926 | return keys(obj).length; |
||
927 | }; |
||
637 | daniel-mar | 928 | var get$c = function (obj, key) { |
929 | return has$1(obj, key) ? Optional.from(obj[key]) : Optional.none(); |
||
597 | daniel-mar | 930 | }; |
637 | daniel-mar | 931 | var has$1 = function (obj, key) { |
597 | daniel-mar | 932 | return hasOwnProperty.call(obj, key); |
933 | }; |
||
934 | var hasNonNullableKey = function (obj, key) { |
||
637 | daniel-mar | 935 | return has$1(obj, key) && obj[key] !== undefined && obj[key] !== null; |
597 | daniel-mar | 936 | }; |
937 | var isEmpty = function (r) { |
||
938 | for (var x in r) { |
||
939 | if (hasOwnProperty.call(r, x)) { |
||
940 | return false; |
||
941 | } |
||
942 | } |
||
943 | return true; |
||
944 | }; |
||
945 | |||
946 | var validSectionList = [ |
||
947 | 'tfoot', |
||
948 | 'thead', |
||
949 | 'tbody', |
||
950 | 'colgroup' |
||
951 | ]; |
||
952 | var isValidSection = function (parentName) { |
||
637 | daniel-mar | 953 | return contains$2(validSectionList, parentName); |
597 | daniel-mar | 954 | }; |
955 | var grid = function (rows, columns) { |
||
956 | return { |
||
957 | rows: rows, |
||
958 | columns: columns |
||
959 | }; |
||
960 | }; |
||
961 | var address = function (row, column) { |
||
962 | return { |
||
963 | row: row, |
||
964 | column: column |
||
965 | }; |
||
966 | }; |
||
967 | var detail = function (element, rowspan, colspan) { |
||
968 | return { |
||
969 | element: element, |
||
970 | rowspan: rowspan, |
||
971 | colspan: colspan |
||
972 | }; |
||
973 | }; |
||
974 | var detailnew = function (element, rowspan, colspan, isNew) { |
||
975 | return { |
||
976 | element: element, |
||
977 | rowspan: rowspan, |
||
978 | colspan: colspan, |
||
979 | isNew: isNew |
||
980 | }; |
||
981 | }; |
||
982 | var extended = function (element, rowspan, colspan, row, column, isLocked) { |
||
983 | return { |
||
984 | element: element, |
||
985 | rowspan: rowspan, |
||
986 | colspan: colspan, |
||
987 | row: row, |
||
988 | column: column, |
||
989 | isLocked: isLocked |
||
990 | }; |
||
991 | }; |
||
637 | daniel-mar | 992 | var rowdetail = function (element, cells, section) { |
597 | daniel-mar | 993 | return { |
994 | element: element, |
||
995 | cells: cells, |
||
996 | section: section |
||
997 | }; |
||
998 | }; |
||
637 | daniel-mar | 999 | var rowdetailnew = function (element, cells, section, isNew) { |
1000 | return { |
||
1001 | element: element, |
||
1002 | cells: cells, |
||
1003 | section: section, |
||
1004 | isNew: isNew |
||
1005 | }; |
||
1006 | }; |
||
597 | daniel-mar | 1007 | var elementnew = function (element, isNew, isLocked) { |
1008 | return { |
||
1009 | element: element, |
||
1010 | isNew: isNew, |
||
1011 | isLocked: isLocked |
||
1012 | }; |
||
1013 | }; |
||
637 | daniel-mar | 1014 | var rowcells = function (element, cells, section, isNew) { |
597 | daniel-mar | 1015 | return { |
1016 | element: element, |
||
1017 | cells: cells, |
||
1018 | section: section, |
||
1019 | isNew: isNew |
||
1020 | }; |
||
1021 | }; |
||
1022 | var bounds = function (startRow, startCol, finishRow, finishCol) { |
||
1023 | return { |
||
1024 | startRow: startRow, |
||
1025 | startCol: startCol, |
||
1026 | finishRow: finishRow, |
||
1027 | finishCol: finishCol |
||
1028 | }; |
||
1029 | }; |
||
1030 | var columnext = function (element, colspan, column) { |
||
1031 | return { |
||
1032 | element: element, |
||
1033 | colspan: colspan, |
||
1034 | column: column |
||
1035 | }; |
||
1036 | }; |
||
637 | daniel-mar | 1037 | var colgroup = function (element, columns) { |
1038 | return { |
||
1039 | element: element, |
||
1040 | columns: columns |
||
1041 | }; |
||
1042 | }; |
||
597 | daniel-mar | 1043 | |
637 | daniel-mar | 1044 | typeof window !== 'undefined' ? window : Function('return this;')(); |
597 | daniel-mar | 1045 | |
1046 | var name = function (element) { |
||
1047 | var r = element.dom.nodeName; |
||
1048 | return r.toLowerCase(); |
||
1049 | }; |
||
637 | daniel-mar | 1050 | var type$1 = function (element) { |
597 | daniel-mar | 1051 | return element.dom.nodeType; |
1052 | }; |
||
637 | daniel-mar | 1053 | var isType = function (t) { |
597 | daniel-mar | 1054 | return function (element) { |
637 | daniel-mar | 1055 | return type$1(element) === t; |
597 | daniel-mar | 1056 | }; |
1057 | }; |
||
1058 | var isComment = function (element) { |
||
637 | daniel-mar | 1059 | return type$1(element) === COMMENT || name(element) === '#comment'; |
597 | daniel-mar | 1060 | }; |
637 | daniel-mar | 1061 | var isElement = isType(ELEMENT); |
1062 | var isText = isType(TEXT); |
||
1063 | var isDocument = isType(DOCUMENT); |
||
1064 | var isDocumentFragment = isType(DOCUMENT_FRAGMENT); |
||
597 | daniel-mar | 1065 | var isTag = function (tag) { |
1066 | return function (e) { |
||
1067 | return isElement(e) && name(e) === tag; |
||
1068 | }; |
||
1069 | }; |
||
1070 | |||
1071 | var owner = function (element) { |
||
1072 | return SugarElement.fromDom(element.dom.ownerDocument); |
||
1073 | }; |
||
1074 | var documentOrOwner = function (dos) { |
||
1075 | return isDocument(dos) ? dos : owner(dos); |
||
1076 | }; |
||
1077 | var defaultView = function (element) { |
||
1078 | return SugarElement.fromDom(documentOrOwner(element).dom.defaultView); |
||
1079 | }; |
||
1080 | var parent = function (element) { |
||
1081 | return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); |
||
1082 | }; |
||
679 | daniel-mar | 1083 | var parentElement = function (element) { |
1084 | return Optional.from(element.dom.parentElement).map(SugarElement.fromDom); |
||
1085 | }; |
||
597 | daniel-mar | 1086 | var parents = function (element, isRoot) { |
1087 | var stop = isFunction(isRoot) ? isRoot : never; |
||
1088 | var dom = element.dom; |
||
1089 | var ret = []; |
||
1090 | while (dom.parentNode !== null && dom.parentNode !== undefined) { |
||
1091 | var rawParent = dom.parentNode; |
||
1092 | var p = SugarElement.fromDom(rawParent); |
||
1093 | ret.push(p); |
||
1094 | if (stop(p) === true) { |
||
1095 | break; |
||
1096 | } else { |
||
1097 | dom = rawParent; |
||
1098 | } |
||
1099 | } |
||
1100 | return ret; |
||
1101 | }; |
||
1102 | var prevSibling = function (element) { |
||
1103 | return Optional.from(element.dom.previousSibling).map(SugarElement.fromDom); |
||
1104 | }; |
||
1105 | var nextSibling = function (element) { |
||
1106 | return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); |
||
1107 | }; |
||
637 | daniel-mar | 1108 | var children$3 = function (element) { |
1109 | return map$1(element.dom.childNodes, SugarElement.fromDom); |
||
597 | daniel-mar | 1110 | }; |
637 | daniel-mar | 1111 | var child$3 = function (element, index) { |
597 | daniel-mar | 1112 | var cs = element.dom.childNodes; |
1113 | return Optional.from(cs[index]).map(SugarElement.fromDom); |
||
1114 | }; |
||
1115 | var firstChild = function (element) { |
||
637 | daniel-mar | 1116 | return child$3(element, 0); |
597 | daniel-mar | 1117 | }; |
1118 | |||
1119 | var isShadowRoot = function (dos) { |
||
1120 | return isDocumentFragment(dos) && isNonNullable(dos.dom.host); |
||
1121 | }; |
||
1122 | var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); |
||
637 | daniel-mar | 1123 | var isSupported$1 = constant(supported); |
597 | daniel-mar | 1124 | var getRootNode = supported ? function (e) { |
1125 | return SugarElement.fromDom(e.dom.getRootNode()); |
||
1126 | } : documentOrOwner; |
||
1127 | var getShadowRoot = function (e) { |
||
1128 | var r = getRootNode(e); |
||
1129 | return isShadowRoot(r) ? Optional.some(r) : Optional.none(); |
||
1130 | }; |
||
1131 | var getShadowHost = function (e) { |
||
1132 | return SugarElement.fromDom(e.dom.host); |
||
1133 | }; |
||
1134 | var getOriginalEventTarget = function (event) { |
||
637 | daniel-mar | 1135 | if (isSupported$1() && isNonNullable(event.target)) { |
597 | daniel-mar | 1136 | var el = SugarElement.fromDom(event.target); |
1137 | if (isElement(el) && isOpenShadowHost(el)) { |
||
1138 | if (event.composed && event.composedPath) { |
||
1139 | var composedPath = event.composedPath(); |
||
1140 | if (composedPath) { |
||
1141 | return head(composedPath); |
||
1142 | } |
||
1143 | } |
||
1144 | } |
||
1145 | } |
||
1146 | return Optional.from(event.target); |
||
1147 | }; |
||
1148 | var isOpenShadowHost = function (element) { |
||
1149 | return isNonNullable(element.dom.shadowRoot); |
||
1150 | }; |
||
1151 | |||
1152 | var inBody = function (element) { |
||
1153 | var dom = isText(element) ? element.dom.parentNode : element.dom; |
||
1154 | if (dom === undefined || dom === null || dom.ownerDocument === null) { |
||
1155 | return false; |
||
1156 | } |
||
1157 | var doc = dom.ownerDocument; |
||
1158 | return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { |
||
1159 | return doc.body.contains(dom); |
||
1160 | }, compose1(inBody, getShadowHost)); |
||
1161 | }; |
||
637 | daniel-mar | 1162 | var body$1 = function () { |
1163 | return getBody$1(SugarElement.fromDom(document)); |
||
597 | daniel-mar | 1164 | }; |
637 | daniel-mar | 1165 | var getBody$1 = function (doc) { |
597 | daniel-mar | 1166 | var b = doc.dom.body; |
1167 | if (b === null || b === undefined) { |
||
1168 | throw new Error('Body is not available yet'); |
||
1169 | } |
||
1170 | return SugarElement.fromDom(b); |
||
1171 | }; |
||
1172 | |||
637 | daniel-mar | 1173 | var ancestors$4 = function (scope, predicate, isRoot) { |
1174 | return filter$2(parents(scope, isRoot), predicate); |
||
597 | daniel-mar | 1175 | }; |
637 | daniel-mar | 1176 | var children$2 = function (scope, predicate) { |
1177 | return filter$2(children$3(scope), predicate); |
||
597 | daniel-mar | 1178 | }; |
637 | daniel-mar | 1179 | var descendants$1 = function (scope, predicate) { |
597 | daniel-mar | 1180 | var result = []; |
637 | daniel-mar | 1181 | each$2(children$3(scope), function (x) { |
597 | daniel-mar | 1182 | if (predicate(x)) { |
1183 | result = result.concat([x]); |
||
1184 | } |
||
637 | daniel-mar | 1185 | result = result.concat(descendants$1(x, predicate)); |
597 | daniel-mar | 1186 | }); |
1187 | return result; |
||
1188 | }; |
||
1189 | |||
637 | daniel-mar | 1190 | var ancestors$3 = function (scope, selector, isRoot) { |
1191 | return ancestors$4(scope, function (e) { |
||
1192 | return is$2(e, selector); |
||
597 | daniel-mar | 1193 | }, isRoot); |
1194 | }; |
||
637 | daniel-mar | 1195 | var children$1 = function (scope, selector) { |
1196 | return children$2(scope, function (e) { |
||
1197 | return is$2(e, selector); |
||
597 | daniel-mar | 1198 | }); |
1199 | }; |
||
637 | daniel-mar | 1200 | var descendants = function (scope, selector) { |
1201 | return all$1(selector, scope); |
||
597 | daniel-mar | 1202 | }; |
1203 | |||
1204 | function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { |
||
1205 | if (is(scope, a)) { |
||
1206 | return Optional.some(scope); |
||
1207 | } else if (isFunction(isRoot) && isRoot(scope)) { |
||
1208 | return Optional.none(); |
||
1209 | } else { |
||
1210 | return ancestor(scope, a, isRoot); |
||
1211 | } |
||
1212 | } |
||
1213 | |||
637 | daniel-mar | 1214 | var ancestor$2 = function (scope, predicate, isRoot) { |
597 | daniel-mar | 1215 | var element = scope.dom; |
1216 | var stop = isFunction(isRoot) ? isRoot : never; |
||
1217 | while (element.parentNode) { |
||
1218 | element = element.parentNode; |
||
1219 | var el = SugarElement.fromDom(element); |
||
1220 | if (predicate(el)) { |
||
1221 | return Optional.some(el); |
||
1222 | } else if (stop(el)) { |
||
1223 | break; |
||
1224 | } |
||
1225 | } |
||
1226 | return Optional.none(); |
||
1227 | }; |
||
637 | daniel-mar | 1228 | var closest$2 = function (scope, predicate, isRoot) { |
597 | daniel-mar | 1229 | var is = function (s, test) { |
1230 | return test(s); |
||
1231 | }; |
||
637 | daniel-mar | 1232 | return ClosestOrAncestor(is, ancestor$2, scope, predicate, isRoot); |
597 | daniel-mar | 1233 | }; |
637 | daniel-mar | 1234 | var child$2 = function (scope, predicate) { |
597 | daniel-mar | 1235 | var pred = function (node) { |
1236 | return predicate(SugarElement.fromDom(node)); |
||
1237 | }; |
||
637 | daniel-mar | 1238 | var result = find$1(scope.dom.childNodes, pred); |
597 | daniel-mar | 1239 | return result.map(SugarElement.fromDom); |
1240 | }; |
||
637 | daniel-mar | 1241 | var descendant$1 = function (scope, predicate) { |
597 | daniel-mar | 1242 | var descend = function (node) { |
1243 | for (var i = 0; i < node.childNodes.length; i++) { |
||
1244 | var child_1 = SugarElement.fromDom(node.childNodes[i]); |
||
1245 | if (predicate(child_1)) { |
||
1246 | return Optional.some(child_1); |
||
1247 | } |
||
1248 | var res = descend(node.childNodes[i]); |
||
1249 | if (res.isSome()) { |
||
1250 | return res; |
||
1251 | } |
||
1252 | } |
||
1253 | return Optional.none(); |
||
1254 | }; |
||
1255 | return descend(scope.dom); |
||
1256 | }; |
||
1257 | |||
1258 | var ancestor$1 = function (scope, selector, isRoot) { |
||
637 | daniel-mar | 1259 | return ancestor$2(scope, function (e) { |
1260 | return is$2(e, selector); |
||
597 | daniel-mar | 1261 | }, isRoot); |
1262 | }; |
||
637 | daniel-mar | 1263 | var child$1 = function (scope, selector) { |
1264 | return child$2(scope, function (e) { |
||
1265 | return is$2(e, selector); |
||
597 | daniel-mar | 1266 | }); |
1267 | }; |
||
637 | daniel-mar | 1268 | var descendant = function (scope, selector) { |
597 | daniel-mar | 1269 | return one(selector, scope); |
1270 | }; |
||
1271 | var closest$1 = function (scope, selector, isRoot) { |
||
637 | daniel-mar | 1272 | var is = function (element, selector) { |
1273 | return is$2(element, selector); |
||
597 | daniel-mar | 1274 | }; |
637 | daniel-mar | 1275 | return ClosestOrAncestor(is, ancestor$1, scope, selector, isRoot); |
597 | daniel-mar | 1276 | }; |
1277 | |||
1278 | var rawSet = function (dom, key, value) { |
||
1279 | if (isString(value) || isBoolean(value) || isNumber(value)) { |
||
1280 | dom.setAttribute(key, value + ''); |
||
1281 | } else { |
||
1282 | console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); |
||
1283 | throw new Error('Attribute value was not simple'); |
||
1284 | } |
||
1285 | }; |
||
637 | daniel-mar | 1286 | var set$2 = function (element, key, value) { |
597 | daniel-mar | 1287 | rawSet(element.dom, key, value); |
1288 | }; |
||
637 | daniel-mar | 1289 | var setAll$1 = function (element, attrs) { |
597 | daniel-mar | 1290 | var dom = element.dom; |
1291 | each$1(attrs, function (v, k) { |
||
1292 | rawSet(dom, k, v); |
||
1293 | }); |
||
1294 | }; |
||
679 | daniel-mar | 1295 | var setOptions = function (element, attrs) { |
1296 | each$1(attrs, function (v, k) { |
||
1297 | v.fold(function () { |
||
1298 | remove$7(element, k); |
||
1299 | }, function (value) { |
||
1300 | rawSet(element.dom, k, value); |
||
1301 | }); |
||
1302 | }); |
||
1303 | }; |
||
637 | daniel-mar | 1304 | var get$b = function (element, key) { |
597 | daniel-mar | 1305 | var v = element.dom.getAttribute(key); |
1306 | return v === null ? undefined : v; |
||
1307 | }; |
||
1308 | var getOpt = function (element, key) { |
||
637 | daniel-mar | 1309 | return Optional.from(get$b(element, key)); |
597 | daniel-mar | 1310 | }; |
637 | daniel-mar | 1311 | var remove$7 = function (element, key) { |
597 | daniel-mar | 1312 | element.dom.removeAttribute(key); |
1313 | }; |
||
637 | daniel-mar | 1314 | var clone$2 = function (element) { |
597 | daniel-mar | 1315 | return foldl(element.dom.attributes, function (acc, attr) { |
1316 | acc[attr.name] = attr.value; |
||
1317 | return acc; |
||
1318 | }, {}); |
||
1319 | }; |
||
1320 | |||
637 | daniel-mar | 1321 | var is = function (lhs, rhs, comparator) { |
1322 | if (comparator === void 0) { |
||
1323 | comparator = tripleEquals; |
||
1324 | } |
||
1325 | return lhs.exists(function (left) { |
||
1326 | return comparator(left, rhs); |
||
1327 | }); |
||
1328 | }; |
||
1329 | var cat = function (arr) { |
||
1330 | var r = []; |
||
1331 | var push = function (x) { |
||
1332 | r.push(x); |
||
1333 | }; |
||
1334 | for (var i = 0; i < arr.length; i++) { |
||
1335 | arr[i].each(push); |
||
1336 | } |
||
1337 | return r; |
||
1338 | }; |
||
1339 | var lift2 = function (oa, ob, f) { |
||
1340 | return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); |
||
1341 | }; |
||
1342 | var bindFrom = function (a, f) { |
||
1343 | return a !== undefined && a !== null ? f(a) : Optional.none(); |
||
1344 | }; |
||
1345 | var flatten = function (oot) { |
||
1346 | return oot.bind(identity); |
||
1347 | }; |
||
1348 | var someIf = function (b, a) { |
||
1349 | return b ? Optional.some(a) : Optional.none(); |
||
1350 | }; |
||
1351 | |||
1352 | var isSupported = function (dom) { |
||
597 | daniel-mar | 1353 | return dom.style !== undefined && isFunction(dom.style.getPropertyValue); |
1354 | }; |
||
1355 | |||
1356 | var internalSet = function (dom, property, value) { |
||
1357 | if (!isString(value)) { |
||
1358 | console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); |
||
1359 | throw new Error('CSS value must be a string: ' + value); |
||
1360 | } |
||
637 | daniel-mar | 1361 | if (isSupported(dom)) { |
597 | daniel-mar | 1362 | dom.style.setProperty(property, value); |
1363 | } |
||
1364 | }; |
||
1365 | var internalRemove = function (dom, property) { |
||
637 | daniel-mar | 1366 | if (isSupported(dom)) { |
597 | daniel-mar | 1367 | dom.style.removeProperty(property); |
1368 | } |
||
1369 | }; |
||
1370 | var set$1 = function (element, property, value) { |
||
1371 | var dom = element.dom; |
||
1372 | internalSet(dom, property, value); |
||
1373 | }; |
||
637 | daniel-mar | 1374 | var setAll = function (element, css) { |
597 | daniel-mar | 1375 | var dom = element.dom; |
1376 | each$1(css, function (v, k) { |
||
1377 | internalSet(dom, k, v); |
||
1378 | }); |
||
1379 | }; |
||
637 | daniel-mar | 1380 | var get$a = function (element, property) { |
597 | daniel-mar | 1381 | var dom = element.dom; |
1382 | var styles = window.getComputedStyle(dom); |
||
1383 | var r = styles.getPropertyValue(property); |
||
1384 | return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; |
||
1385 | }; |
||
1386 | var getUnsafeProperty = function (dom, property) { |
||
637 | daniel-mar | 1387 | return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; |
597 | daniel-mar | 1388 | }; |
637 | daniel-mar | 1389 | var getRaw$2 = function (element, property) { |
597 | daniel-mar | 1390 | var dom = element.dom; |
1391 | var raw = getUnsafeProperty(dom, property); |
||
1392 | return Optional.from(raw).filter(function (r) { |
||
1393 | return r.length > 0; |
||
1394 | }); |
||
1395 | }; |
||
637 | daniel-mar | 1396 | var remove$6 = function (element, property) { |
597 | daniel-mar | 1397 | var dom = element.dom; |
1398 | internalRemove(dom, property); |
||
637 | daniel-mar | 1399 | if (is(getOpt(element, 'style').map(trim), '')) { |
1400 | remove$7(element, 'style'); |
||
597 | daniel-mar | 1401 | } |
1402 | }; |
||
637 | daniel-mar | 1403 | var copy$2 = function (source, target) { |
597 | daniel-mar | 1404 | var sourceDom = source.dom; |
1405 | var targetDom = target.dom; |
||
637 | daniel-mar | 1406 | if (isSupported(sourceDom) && isSupported(targetDom)) { |
597 | daniel-mar | 1407 | targetDom.style.cssText = sourceDom.style.cssText; |
1408 | } |
||
1409 | }; |
||
1410 | |||
1411 | var getAttrValue = function (cell, name, fallback) { |
||
1412 | if (fallback === void 0) { |
||
1413 | fallback = 0; |
||
1414 | } |
||
1415 | return getOpt(cell, name).map(function (value) { |
||
1416 | return parseInt(value, 10); |
||
1417 | }).getOr(fallback); |
||
1418 | }; |
||
1419 | var getSpan = function (cell, type) { |
||
1420 | return getAttrValue(cell, type, 1); |
||
1421 | }; |
||
679 | daniel-mar | 1422 | var hasColspan = function (cellOrCol) { |
1423 | if (isTag('col')(cellOrCol)) { |
||
1424 | return getAttrValue(cellOrCol, 'span', 1) > 1; |
||
1425 | } else { |
||
1426 | return getSpan(cellOrCol, 'colspan') > 1; |
||
1427 | } |
||
597 | daniel-mar | 1428 | }; |
1429 | var hasRowspan = function (cell) { |
||
1430 | return getSpan(cell, 'rowspan') > 1; |
||
1431 | }; |
||
1432 | var getCssValue = function (element, property) { |
||
637 | daniel-mar | 1433 | return parseInt(get$a(element, property), 10); |
597 | daniel-mar | 1434 | }; |
1435 | var minWidth = constant(10); |
||
1436 | var minHeight = constant(10); |
||
1437 | |||
1438 | var firstLayer = function (scope, selector) { |
||
1439 | return filterFirstLayer(scope, selector, always); |
||
1440 | }; |
||
1441 | var filterFirstLayer = function (scope, selector, predicate) { |
||
637 | daniel-mar | 1442 | return bind$2(children$3(scope), function (x) { |
1443 | if (is$2(x, selector)) { |
||
597 | daniel-mar | 1444 | return predicate(x) ? [x] : []; |
1445 | } else { |
||
1446 | return filterFirstLayer(x, selector, predicate); |
||
1447 | } |
||
1448 | }); |
||
1449 | }; |
||
1450 | |||
1451 | var lookup = function (tags, element, isRoot) { |
||
1452 | if (isRoot === void 0) { |
||
1453 | isRoot = never; |
||
1454 | } |
||
1455 | if (isRoot(element)) { |
||
1456 | return Optional.none(); |
||
1457 | } |
||
637 | daniel-mar | 1458 | if (contains$2(tags, name(element))) { |
597 | daniel-mar | 1459 | return Optional.some(element); |
1460 | } |
||
1461 | var isRootOrUpperTable = function (elm) { |
||
637 | daniel-mar | 1462 | return is$2(elm, 'table') || isRoot(elm); |
597 | daniel-mar | 1463 | }; |
1464 | return ancestor$1(element, tags.join(','), isRootOrUpperTable); |
||
1465 | }; |
||
1466 | var cell = function (element, isRoot) { |
||
1467 | return lookup([ |
||
1468 | 'td', |
||
1469 | 'th' |
||
1470 | ], element, isRoot); |
||
1471 | }; |
||
637 | daniel-mar | 1472 | var cells$1 = function (ancestor) { |
597 | daniel-mar | 1473 | return firstLayer(ancestor, 'th,td'); |
1474 | }; |
||
637 | daniel-mar | 1475 | var columns$1 = function (ancestor) { |
1476 | if (is$2(ancestor, 'colgroup')) { |
||
1477 | return children$1(ancestor, 'col'); |
||
597 | daniel-mar | 1478 | } else { |
637 | daniel-mar | 1479 | return bind$2(columnGroups(ancestor), function (columnGroup) { |
1480 | return children$1(columnGroup, 'col'); |
||
597 | daniel-mar | 1481 | }); |
1482 | } |
||
1483 | }; |
||
1484 | var table = function (element, isRoot) { |
||
1485 | return closest$1(element, 'table', isRoot); |
||
1486 | }; |
||
637 | daniel-mar | 1487 | var rows$1 = function (ancestor) { |
597 | daniel-mar | 1488 | return firstLayer(ancestor, 'tr'); |
1489 | }; |
||
1490 | var columnGroups = function (ancestor) { |
||
1491 | return table(ancestor).fold(constant([]), function (table) { |
||
637 | daniel-mar | 1492 | return children$1(table, 'colgroup'); |
597 | daniel-mar | 1493 | }); |
1494 | }; |
||
1495 | |||
1496 | var fromRowsOrColGroups = function (elems, getSection) { |
||
637 | daniel-mar | 1497 | return map$1(elems, function (row) { |
597 | daniel-mar | 1498 | if (name(row) === 'colgroup') { |
637 | daniel-mar | 1499 | var cells = map$1(columns$1(row), function (column) { |
597 | daniel-mar | 1500 | var colspan = getAttrValue(column, 'span', 1); |
1501 | return detail(column, 1, colspan); |
||
1502 | }); |
||
637 | daniel-mar | 1503 | return rowdetail(row, cells, 'colgroup'); |
597 | daniel-mar | 1504 | } else { |
637 | daniel-mar | 1505 | var cells = map$1(cells$1(row), function (cell) { |
597 | daniel-mar | 1506 | var rowspan = getAttrValue(cell, 'rowspan', 1); |
1507 | var colspan = getAttrValue(cell, 'colspan', 1); |
||
1508 | return detail(cell, rowspan, colspan); |
||
1509 | }); |
||
637 | daniel-mar | 1510 | return rowdetail(row, cells, getSection(row)); |
597 | daniel-mar | 1511 | } |
1512 | }); |
||
1513 | }; |
||
1514 | var getParentSection = function (group) { |
||
1515 | return parent(group).map(function (parent) { |
||
1516 | var parentName = name(parent); |
||
1517 | return isValidSection(parentName) ? parentName : 'tbody'; |
||
1518 | }).getOr('tbody'); |
||
1519 | }; |
||
637 | daniel-mar | 1520 | var fromTable$1 = function (table) { |
1521 | var rows = rows$1(table); |
||
597 | daniel-mar | 1522 | var columnGroups$1 = columnGroups(table); |
679 | daniel-mar | 1523 | var elems = __spreadArray(__spreadArray([], columnGroups$1, true), rows, true); |
597 | daniel-mar | 1524 | return fromRowsOrColGroups(elems, getParentSection); |
1525 | }; |
||
1526 | var fromPastedRows = function (elems, section) { |
||
1527 | return fromRowsOrColGroups(elems, function () { |
||
1528 | return section; |
||
1529 | }); |
||
1530 | }; |
||
1531 | |||
1532 | var addCells = function (gridRow, index, cells) { |
||
1533 | var existingCells = gridRow.cells; |
||
1534 | var before = existingCells.slice(0, index); |
||
1535 | var after = existingCells.slice(index); |
||
1536 | var newCells = before.concat(cells).concat(after); |
||
1537 | return setCells(gridRow, newCells); |
||
1538 | }; |
||
1539 | var addCell = function (gridRow, index, cell) { |
||
1540 | return addCells(gridRow, index, [cell]); |
||
1541 | }; |
||
1542 | var mutateCell = function (gridRow, index, cell) { |
||
1543 | var cells = gridRow.cells; |
||
1544 | cells[index] = cell; |
||
1545 | }; |
||
1546 | var setCells = function (gridRow, cells) { |
||
637 | daniel-mar | 1547 | return rowcells(gridRow.element, cells, gridRow.section, gridRow.isNew); |
597 | daniel-mar | 1548 | }; |
1549 | var mapCells = function (gridRow, f) { |
||
1550 | var cells = gridRow.cells; |
||
637 | daniel-mar | 1551 | var r = map$1(cells, f); |
1552 | return rowcells(gridRow.element, r, gridRow.section, gridRow.isNew); |
||
597 | daniel-mar | 1553 | }; |
1554 | var getCell = function (gridRow, index) { |
||
1555 | return gridRow.cells[index]; |
||
1556 | }; |
||
1557 | var getCellElement = function (gridRow, index) { |
||
1558 | return getCell(gridRow, index).element; |
||
1559 | }; |
||
1560 | var cellLength = function (gridRow) { |
||
1561 | return gridRow.cells.length; |
||
1562 | }; |
||
1563 | var extractGridDetails = function (grid) { |
||
1564 | var result = partition(grid, function (row) { |
||
1565 | return row.section === 'colgroup'; |
||
1566 | }); |
||
1567 | return { |
||
1568 | rows: result.fail, |
||
1569 | cols: result.pass |
||
1570 | }; |
||
1571 | }; |
||
637 | daniel-mar | 1572 | var clone$1 = function (gridRow, cloneRow, cloneCell) { |
1573 | var newCells = map$1(gridRow.cells, cloneCell); |
||
1574 | return rowcells(cloneRow(gridRow.element), newCells, gridRow.section, true); |
||
1575 | }; |
||
597 | daniel-mar | 1576 | |
1577 | var LOCKED_COL_ATTR = 'data-snooker-locked-cols'; |
||
1578 | var getLockedColumnsFromTable = function (table) { |
||
1579 | return getOpt(table, LOCKED_COL_ATTR).bind(function (lockedColStr) { |
||
1580 | return Optional.from(lockedColStr.match(/\d+/g)); |
||
1581 | }).map(function (lockedCols) { |
||
1582 | return mapToObject(lockedCols, always); |
||
1583 | }); |
||
1584 | }; |
||
1585 | var getLockedColumnsFromGrid = function (grid) { |
||
1586 | var locked = foldl(extractGridDetails(grid).rows, function (acc, row) { |
||
637 | daniel-mar | 1587 | each$2(row.cells, function (cell, idx) { |
597 | daniel-mar | 1588 | if (cell.isLocked) { |
1589 | acc[idx] = true; |
||
1590 | } |
||
1591 | }); |
||
1592 | return acc; |
||
1593 | }, {}); |
||
1594 | var lockedArr = mapToArray(locked, function (_val, key) { |
||
1595 | return parseInt(key, 10); |
||
1596 | }); |
||
637 | daniel-mar | 1597 | return sort$1(lockedArr); |
597 | daniel-mar | 1598 | }; |
1599 | |||
1600 | var key = function (row, column) { |
||
1601 | return row + ',' + column; |
||
1602 | }; |
||
1603 | var getAt = function (warehouse, row, column) { |
||
637 | daniel-mar | 1604 | return Optional.from(warehouse.access[key(row, column)]); |
597 | daniel-mar | 1605 | }; |
1606 | var findItem = function (warehouse, item, comparator) { |
||
1607 | var filtered = filterItems(warehouse, function (detail) { |
||
1608 | return comparator(item, detail.element); |
||
1609 | }); |
||
1610 | return filtered.length > 0 ? Optional.some(filtered[0]) : Optional.none(); |
||
1611 | }; |
||
1612 | var filterItems = function (warehouse, predicate) { |
||
637 | daniel-mar | 1613 | var all = bind$2(warehouse.all, function (r) { |
597 | daniel-mar | 1614 | return r.cells; |
1615 | }); |
||
637 | daniel-mar | 1616 | return filter$2(all, predicate); |
597 | daniel-mar | 1617 | }; |
1618 | var generateColumns = function (rowData) { |
||
1619 | var columnsGroup = {}; |
||
1620 | var index = 0; |
||
637 | daniel-mar | 1621 | each$2(rowData.cells, function (column) { |
597 | daniel-mar | 1622 | var colspan = column.colspan; |
637 | daniel-mar | 1623 | range$1(colspan, function (columnIndex) { |
597 | daniel-mar | 1624 | var colIndex = index + columnIndex; |
1625 | columnsGroup[colIndex] = columnext(column.element, colspan, colIndex); |
||
1626 | }); |
||
1627 | index += colspan; |
||
1628 | }); |
||
1629 | return columnsGroup; |
||
1630 | }; |
||
637 | daniel-mar | 1631 | var generate$1 = function (list) { |
597 | daniel-mar | 1632 | var access = {}; |
1633 | var cells = []; |
||
1634 | var tableOpt = head(list).map(function (rowData) { |
||
1635 | return rowData.element; |
||
1636 | }).bind(table); |
||
1637 | var lockedColumns = tableOpt.bind(getLockedColumnsFromTable).getOr({}); |
||
1638 | var maxRows = 0; |
||
1639 | var maxColumns = 0; |
||
1640 | var rowCount = 0; |
||
679 | daniel-mar | 1641 | var _a = partition(list, function (rowData) { |
1642 | return rowData.section === 'colgroup'; |
||
1643 | }), colgroupRows = _a.pass, rows = _a.fail; |
||
1644 | each$2(rows, function (rowData) { |
||
1645 | var currentRow = []; |
||
1646 | each$2(rowData.cells, function (rowCell) { |
||
1647 | var start = 0; |
||
1648 | while (access[key(rowCount, start)] !== undefined) { |
||
1649 | start++; |
||
1650 | } |
||
1651 | var isLocked = hasNonNullableKey(lockedColumns, start.toString()); |
||
1652 | var current = extended(rowCell.element, rowCell.rowspan, rowCell.colspan, rowCount, start, isLocked); |
||
1653 | for (var occupiedColumnPosition = 0; occupiedColumnPosition < rowCell.colspan; occupiedColumnPosition++) { |
||
1654 | for (var occupiedRowPosition = 0; occupiedRowPosition < rowCell.rowspan; occupiedRowPosition++) { |
||
1655 | var rowPosition = rowCount + occupiedRowPosition; |
||
1656 | var columnPosition = start + occupiedColumnPosition; |
||
1657 | var newpos = key(rowPosition, columnPosition); |
||
1658 | access[newpos] = current; |
||
1659 | maxColumns = Math.max(maxColumns, columnPosition + 1); |
||
597 | daniel-mar | 1660 | } |
679 | daniel-mar | 1661 | } |
1662 | currentRow.push(current); |
||
1663 | }); |
||
1664 | maxRows++; |
||
1665 | cells.push(rowdetail(rowData.element, currentRow, rowData.section)); |
||
1666 | rowCount++; |
||
597 | daniel-mar | 1667 | }); |
679 | daniel-mar | 1668 | var _b = last$2(colgroupRows).map(function (rowData) { |
1669 | var columns = generateColumns(rowData); |
||
1670 | var colgroup$1 = colgroup(rowData.element, values(columns)); |
||
1671 | return { |
||
1672 | colgroups: [colgroup$1], |
||
1673 | columns: columns |
||
1674 | }; |
||
1675 | }).getOrThunk(function () { |
||
1676 | return { |
||
1677 | colgroups: [], |
||
1678 | columns: {} |
||
1679 | }; |
||
1680 | }), columns = _b.columns, colgroups = _b.colgroups; |
||
597 | daniel-mar | 1681 | var grid$1 = grid(maxRows, maxColumns); |
1682 | return { |
||
1683 | grid: grid$1, |
||
1684 | access: access, |
||
1685 | all: cells, |
||
637 | daniel-mar | 1686 | columns: columns, |
1687 | colgroups: colgroups |
||
597 | daniel-mar | 1688 | }; |
1689 | }; |
||
637 | daniel-mar | 1690 | var fromTable = function (table) { |
1691 | var list = fromTable$1(table); |
||
1692 | return generate$1(list); |
||
597 | daniel-mar | 1693 | }; |
1694 | var justCells = function (warehouse) { |
||
637 | daniel-mar | 1695 | return bind$2(warehouse.all, function (w) { |
597 | daniel-mar | 1696 | return w.cells; |
1697 | }); |
||
1698 | }; |
||
1699 | var justColumns = function (warehouse) { |
||
1700 | return values(warehouse.columns); |
||
1701 | }; |
||
1702 | var hasColumns = function (warehouse) { |
||
1703 | return keys(warehouse.columns).length > 0; |
||
1704 | }; |
||
1705 | var getColumnAt = function (warehouse, columnIndex) { |
||
1706 | return Optional.from(warehouse.columns[columnIndex]); |
||
1707 | }; |
||
1708 | var Warehouse = { |
||
637 | daniel-mar | 1709 | fromTable: fromTable, |
1710 | generate: generate$1, |
||
597 | daniel-mar | 1711 | getAt: getAt, |
1712 | findItem: findItem, |
||
1713 | filterItems: filterItems, |
||
1714 | justCells: justCells, |
||
1715 | justColumns: justColumns, |
||
1716 | hasColumns: hasColumns, |
||
1717 | getColumnAt: getColumnAt |
||
1718 | }; |
||
1719 | |||
1720 | var inSelection = function (bounds, detail) { |
||
1721 | var leftEdge = detail.column; |
||
1722 | var rightEdge = detail.column + detail.colspan - 1; |
||
1723 | var topEdge = detail.row; |
||
1724 | var bottomEdge = detail.row + detail.rowspan - 1; |
||
1725 | return leftEdge <= bounds.finishCol && rightEdge >= bounds.startCol && (topEdge <= bounds.finishRow && bottomEdge >= bounds.startRow); |
||
1726 | }; |
||
1727 | var isWithin = function (bounds, detail) { |
||
1728 | return detail.column >= bounds.startCol && detail.column + detail.colspan - 1 <= bounds.finishCol && detail.row >= bounds.startRow && detail.row + detail.rowspan - 1 <= bounds.finishRow; |
||
1729 | }; |
||
1730 | var isRectangular = function (warehouse, bounds) { |
||
1731 | var isRect = true; |
||
1732 | var detailIsWithin = curry(isWithin, bounds); |
||
1733 | for (var i = bounds.startRow; i <= bounds.finishRow; i++) { |
||
1734 | for (var j = bounds.startCol; j <= bounds.finishCol; j++) { |
||
1735 | isRect = isRect && Warehouse.getAt(warehouse, i, j).exists(detailIsWithin); |
||
1736 | } |
||
1737 | } |
||
1738 | return isRect ? Optional.some(bounds) : Optional.none(); |
||
1739 | }; |
||
1740 | |||
1741 | var getBounds = function (detailA, detailB) { |
||
1742 | return bounds(Math.min(detailA.row, detailB.row), Math.min(detailA.column, detailB.column), Math.max(detailA.row + detailA.rowspan - 1, detailB.row + detailB.rowspan - 1), Math.max(detailA.column + detailA.colspan - 1, detailB.column + detailB.colspan - 1)); |
||
1743 | }; |
||
1744 | var getAnyBox = function (warehouse, startCell, finishCell) { |
||
1745 | var startCoords = Warehouse.findItem(warehouse, startCell, eq$1); |
||
1746 | var finishCoords = Warehouse.findItem(warehouse, finishCell, eq$1); |
||
1747 | return startCoords.bind(function (sc) { |
||
1748 | return finishCoords.map(function (fc) { |
||
1749 | return getBounds(sc, fc); |
||
1750 | }); |
||
1751 | }); |
||
1752 | }; |
||
637 | daniel-mar | 1753 | var getBox$1 = function (warehouse, startCell, finishCell) { |
597 | daniel-mar | 1754 | return getAnyBox(warehouse, startCell, finishCell).bind(function (bounds) { |
1755 | return isRectangular(warehouse, bounds); |
||
1756 | }); |
||
1757 | }; |
||
1758 | |||
637 | daniel-mar | 1759 | var moveBy$1 = function (warehouse, cell, row, column) { |
597 | daniel-mar | 1760 | return Warehouse.findItem(warehouse, cell, eq$1).bind(function (detail) { |
1761 | var startRow = row > 0 ? detail.row + detail.rowspan - 1 : detail.row; |
||
1762 | var startCol = column > 0 ? detail.column + detail.colspan - 1 : detail.column; |
||
1763 | var dest = Warehouse.getAt(warehouse, startRow + row, startCol + column); |
||
1764 | return dest.map(function (d) { |
||
1765 | return d.element; |
||
1766 | }); |
||
1767 | }); |
||
1768 | }; |
||
637 | daniel-mar | 1769 | var intercepts$1 = function (warehouse, start, finish) { |
597 | daniel-mar | 1770 | return getAnyBox(warehouse, start, finish).map(function (bounds) { |
1771 | var inside = Warehouse.filterItems(warehouse, curry(inSelection, bounds)); |
||
637 | daniel-mar | 1772 | return map$1(inside, function (detail) { |
597 | daniel-mar | 1773 | return detail.element; |
1774 | }); |
||
1775 | }); |
||
1776 | }; |
||
1777 | var parentCell = function (warehouse, innerCell) { |
||
1778 | var isContainedBy = function (c1, c2) { |
||
637 | daniel-mar | 1779 | return contains(c2, c1); |
597 | daniel-mar | 1780 | }; |
1781 | return Warehouse.findItem(warehouse, innerCell, isContainedBy).map(function (detail) { |
||
1782 | return detail.element; |
||
1783 | }); |
||
1784 | }; |
||
1785 | |||
637 | daniel-mar | 1786 | var moveBy = function (cell, deltaRow, deltaColumn) { |
597 | daniel-mar | 1787 | return table(cell).bind(function (table) { |
1788 | var warehouse = getWarehouse(table); |
||
637 | daniel-mar | 1789 | return moveBy$1(warehouse, cell, deltaRow, deltaColumn); |
597 | daniel-mar | 1790 | }); |
1791 | }; |
||
637 | daniel-mar | 1792 | var intercepts = function (table, first, last) { |
597 | daniel-mar | 1793 | var warehouse = getWarehouse(table); |
637 | daniel-mar | 1794 | return intercepts$1(warehouse, first, last); |
597 | daniel-mar | 1795 | }; |
1796 | var nestedIntercepts = function (table, first, firstTable, last, lastTable) { |
||
1797 | var warehouse = getWarehouse(table); |
||
1798 | var optStartCell = eq$1(table, firstTable) ? Optional.some(first) : parentCell(warehouse, first); |
||
1799 | var optLastCell = eq$1(table, lastTable) ? Optional.some(last) : parentCell(warehouse, last); |
||
1800 | return optStartCell.bind(function (startCell) { |
||
1801 | return optLastCell.bind(function (lastCell) { |
||
637 | daniel-mar | 1802 | return intercepts$1(warehouse, startCell, lastCell); |
597 | daniel-mar | 1803 | }); |
1804 | }); |
||
1805 | }; |
||
637 | daniel-mar | 1806 | var getBox = function (table, first, last) { |
597 | daniel-mar | 1807 | var warehouse = getWarehouse(table); |
637 | daniel-mar | 1808 | return getBox$1(warehouse, first, last); |
597 | daniel-mar | 1809 | }; |
1810 | var getWarehouse = Warehouse.fromTable; |
||
1811 | |||
637 | daniel-mar | 1812 | var before$4 = function (marker, element) { |
597 | daniel-mar | 1813 | var parent$1 = parent(marker); |
1814 | parent$1.each(function (v) { |
||
1815 | v.dom.insertBefore(element.dom, marker.dom); |
||
1816 | }); |
||
1817 | }; |
||
637 | daniel-mar | 1818 | var after$5 = function (marker, element) { |
597 | daniel-mar | 1819 | var sibling = nextSibling(marker); |
1820 | sibling.fold(function () { |
||
1821 | var parent$1 = parent(marker); |
||
1822 | parent$1.each(function (v) { |
||
637 | daniel-mar | 1823 | append$1(v, element); |
597 | daniel-mar | 1824 | }); |
1825 | }, function (v) { |
||
637 | daniel-mar | 1826 | before$4(v, element); |
597 | daniel-mar | 1827 | }); |
1828 | }; |
||
1829 | var prepend = function (parent, element) { |
||
1830 | var firstChild$1 = firstChild(parent); |
||
1831 | firstChild$1.fold(function () { |
||
637 | daniel-mar | 1832 | append$1(parent, element); |
597 | daniel-mar | 1833 | }, function (v) { |
1834 | parent.dom.insertBefore(element.dom, v.dom); |
||
1835 | }); |
||
1836 | }; |
||
637 | daniel-mar | 1837 | var append$1 = function (parent, element) { |
597 | daniel-mar | 1838 | parent.dom.appendChild(element.dom); |
1839 | }; |
||
637 | daniel-mar | 1840 | var appendAt = function (parent, element, index) { |
1841 | child$3(parent, index).fold(function () { |
||
1842 | append$1(parent, element); |
||
1843 | }, function (v) { |
||
1844 | before$4(v, element); |
||
1845 | }); |
||
1846 | }; |
||
597 | daniel-mar | 1847 | var wrap = function (element, wrapper) { |
637 | daniel-mar | 1848 | before$4(element, wrapper); |
1849 | append$1(wrapper, element); |
||
597 | daniel-mar | 1850 | }; |
1851 | |||
637 | daniel-mar | 1852 | var before$3 = function (marker, elements) { |
1853 | each$2(elements, function (x) { |
||
1854 | before$4(marker, x); |
||
597 | daniel-mar | 1855 | }); |
1856 | }; |
||
637 | daniel-mar | 1857 | var after$4 = function (marker, elements) { |
1858 | each$2(elements, function (x, i) { |
||
597 | daniel-mar | 1859 | var e = i === 0 ? marker : elements[i - 1]; |
637 | daniel-mar | 1860 | after$5(e, x); |
597 | daniel-mar | 1861 | }); |
1862 | }; |
||
637 | daniel-mar | 1863 | var append = function (parent, elements) { |
1864 | each$2(elements, function (x) { |
||
1865 | append$1(parent, x); |
||
597 | daniel-mar | 1866 | }); |
1867 | }; |
||
1868 | |||
1869 | var empty = function (element) { |
||
1870 | element.dom.textContent = ''; |
||
637 | daniel-mar | 1871 | each$2(children$3(element), function (rogue) { |
1872 | remove$5(rogue); |
||
597 | daniel-mar | 1873 | }); |
1874 | }; |
||
637 | daniel-mar | 1875 | var remove$5 = function (element) { |
597 | daniel-mar | 1876 | var dom = element.dom; |
1877 | if (dom.parentNode !== null) { |
||
1878 | dom.parentNode.removeChild(dom); |
||
1879 | } |
||
1880 | }; |
||
1881 | var unwrap = function (wrapper) { |
||
637 | daniel-mar | 1882 | var children = children$3(wrapper); |
1883 | if (children.length > 0) { |
||
1884 | before$3(wrapper, children); |
||
597 | daniel-mar | 1885 | } |
637 | daniel-mar | 1886 | remove$5(wrapper); |
597 | daniel-mar | 1887 | }; |
1888 | |||
1889 | var NodeValue = function (is, name) { |
||
1890 | var get = function (element) { |
||
1891 | if (!is(element)) { |
||
1892 | throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); |
||
1893 | } |
||
1894 | return getOption(element).getOr(''); |
||
1895 | }; |
||
1896 | var getOption = function (element) { |
||
1897 | return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); |
||
1898 | }; |
||
1899 | var set = function (element, value) { |
||
1900 | if (!is(element)) { |
||
1901 | throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); |
||
1902 | } |
||
1903 | element.dom.nodeValue = value; |
||
1904 | }; |
||
1905 | return { |
||
1906 | get: get, |
||
1907 | getOption: getOption, |
||
1908 | set: set |
||
1909 | }; |
||
1910 | }; |
||
1911 | |||
637 | daniel-mar | 1912 | var api$2 = NodeValue(isText, 'text'); |
1913 | var get$9 = function (element) { |
||
1914 | return api$2.get(element); |
||
597 | daniel-mar | 1915 | }; |
1916 | var getOption = function (element) { |
||
637 | daniel-mar | 1917 | return api$2.getOption(element); |
597 | daniel-mar | 1918 | }; |
637 | daniel-mar | 1919 | var set = function (element, value) { |
1920 | return api$2.set(element, value); |
||
597 | daniel-mar | 1921 | }; |
1922 | |||
1923 | var TagBoundaries = [ |
||
1924 | 'body', |
||
1925 | 'p', |
||
1926 | 'div', |
||
1927 | 'article', |
||
1928 | 'aside', |
||
1929 | 'figcaption', |
||
1930 | 'figure', |
||
1931 | 'footer', |
||
1932 | 'header', |
||
1933 | 'nav', |
||
1934 | 'section', |
||
1935 | 'ol', |
||
1936 | 'ul', |
||
1937 | 'li', |
||
1938 | 'table', |
||
1939 | 'thead', |
||
1940 | 'tbody', |
||
1941 | 'tfoot', |
||
1942 | 'caption', |
||
1943 | 'tr', |
||
1944 | 'td', |
||
1945 | 'th', |
||
1946 | 'h1', |
||
1947 | 'h2', |
||
1948 | 'h3', |
||
1949 | 'h4', |
||
1950 | 'h5', |
||
1951 | 'h6', |
||
1952 | 'blockquote', |
||
1953 | 'pre', |
||
1954 | 'address' |
||
1955 | ]; |
||
1956 | |||
1957 | function DomUniverse () { |
||
637 | daniel-mar | 1958 | var clone = function (element) { |
597 | daniel-mar | 1959 | return SugarElement.fromDom(element.dom.cloneNode(false)); |
1960 | }; |
||
1961 | var document = function (element) { |
||
1962 | return documentOrOwner(element).dom; |
||
1963 | }; |
||
1964 | var isBoundary = function (element) { |
||
1965 | if (!isElement(element)) { |
||
1966 | return false; |
||
1967 | } |
||
1968 | if (name(element) === 'body') { |
||
1969 | return true; |
||
1970 | } |
||
637 | daniel-mar | 1971 | return contains$2(TagBoundaries, name(element)); |
597 | daniel-mar | 1972 | }; |
1973 | var isEmptyTag = function (element) { |
||
1974 | if (!isElement(element)) { |
||
1975 | return false; |
||
1976 | } |
||
637 | daniel-mar | 1977 | return contains$2([ |
597 | daniel-mar | 1978 | 'br', |
1979 | 'img', |
||
1980 | 'hr', |
||
1981 | 'input' |
||
1982 | ], name(element)); |
||
1983 | }; |
||
1984 | var isNonEditable = function (element) { |
||
637 | daniel-mar | 1985 | return isElement(element) && get$b(element, 'contenteditable') === 'false'; |
597 | daniel-mar | 1986 | }; |
1987 | var comparePosition = function (element, other) { |
||
1988 | return element.dom.compareDocumentPosition(other.dom); |
||
1989 | }; |
||
1990 | var copyAttributesTo = function (source, destination) { |
||
637 | daniel-mar | 1991 | var as = clone$2(source); |
1992 | setAll$1(destination, as); |
||
597 | daniel-mar | 1993 | }; |
1994 | var isSpecial = function (element) { |
||
1995 | var tag = name(element); |
||
637 | daniel-mar | 1996 | return contains$2([ |
597 | daniel-mar | 1997 | 'script', |
1998 | 'noscript', |
||
1999 | 'iframe', |
||
2000 | 'noframes', |
||
2001 | 'noembed', |
||
2002 | 'title', |
||
2003 | 'style', |
||
2004 | 'textarea', |
||
2005 | 'xmp' |
||
2006 | ], tag); |
||
2007 | }; |
||
637 | daniel-mar | 2008 | var getLanguage = function (element) { |
2009 | return isElement(element) ? getOpt(element, 'lang') : Optional.none(); |
||
2010 | }; |
||
597 | daniel-mar | 2011 | return { |
2012 | up: constant({ |
||
2013 | selector: ancestor$1, |
||
2014 | closest: closest$1, |
||
637 | daniel-mar | 2015 | predicate: ancestor$2, |
597 | daniel-mar | 2016 | all: parents |
2017 | }), |
||
2018 | down: constant({ |
||
637 | daniel-mar | 2019 | selector: descendants, |
2020 | predicate: descendants$1 |
||
597 | daniel-mar | 2021 | }), |
2022 | styles: constant({ |
||
637 | daniel-mar | 2023 | get: get$a, |
2024 | getRaw: getRaw$2, |
||
597 | daniel-mar | 2025 | set: set$1, |
637 | daniel-mar | 2026 | remove: remove$6 |
597 | daniel-mar | 2027 | }), |
2028 | attrs: constant({ |
||
637 | daniel-mar | 2029 | get: get$b, |
2030 | set: set$2, |
||
2031 | remove: remove$7, |
||
597 | daniel-mar | 2032 | copyTo: copyAttributesTo |
2033 | }), |
||
2034 | insert: constant({ |
||
637 | daniel-mar | 2035 | before: before$4, |
2036 | after: after$5, |
||
2037 | afterAll: after$4, |
||
2038 | append: append$1, |
||
2039 | appendAll: append, |
||
597 | daniel-mar | 2040 | prepend: prepend, |
2041 | wrap: wrap |
||
2042 | }), |
||
2043 | remove: constant({ |
||
2044 | unwrap: unwrap, |
||
637 | daniel-mar | 2045 | remove: remove$5 |
597 | daniel-mar | 2046 | }), |
2047 | create: constant({ |
||
2048 | nu: SugarElement.fromTag, |
||
637 | daniel-mar | 2049 | clone: clone, |
597 | daniel-mar | 2050 | text: SugarElement.fromText |
2051 | }), |
||
2052 | query: constant({ |
||
2053 | comparePosition: comparePosition, |
||
2054 | prevSibling: prevSibling, |
||
2055 | nextSibling: nextSibling |
||
2056 | }), |
||
2057 | property: constant({ |
||
637 | daniel-mar | 2058 | children: children$3, |
597 | daniel-mar | 2059 | name: name, |
2060 | parent: parent, |
||
2061 | document: document, |
||
2062 | isText: isText, |
||
2063 | isComment: isComment, |
||
2064 | isElement: isElement, |
||
2065 | isSpecial: isSpecial, |
||
637 | daniel-mar | 2066 | getLanguage: getLanguage, |
2067 | getText: get$9, |
||
2068 | setText: set, |
||
597 | daniel-mar | 2069 | isBoundary: isBoundary, |
2070 | isEmptyTag: isEmptyTag, |
||
2071 | isNonEditable: isNonEditable |
||
2072 | }), |
||
2073 | eq: eq$1, |
||
2074 | is: is$1 |
||
2075 | }; |
||
2076 | } |
||
2077 | |||
637 | daniel-mar | 2078 | var all = function (universe, look, elements, f) { |
597 | daniel-mar | 2079 | var head = elements[0]; |
2080 | var tail = elements.slice(1); |
||
2081 | return f(universe, look, head, tail); |
||
2082 | }; |
||
2083 | var oneAll = function (universe, look, elements) { |
||
637 | daniel-mar | 2084 | return elements.length > 0 ? all(universe, look, elements, unsafeOne) : Optional.none(); |
597 | daniel-mar | 2085 | }; |
2086 | var unsafeOne = function (universe, look, head, tail) { |
||
2087 | var start = look(universe, head); |
||
2088 | return foldr(tail, function (b, a) { |
||
2089 | var current = look(universe, a); |
||
2090 | return commonElement(universe, b, current); |
||
2091 | }, start); |
||
2092 | }; |
||
2093 | var commonElement = function (universe, start, end) { |
||
2094 | return start.bind(function (s) { |
||
2095 | return end.filter(curry(universe.eq, s)); |
||
2096 | }); |
||
2097 | }; |
||
2098 | |||
637 | daniel-mar | 2099 | var eq = function (universe, item) { |
597 | daniel-mar | 2100 | return curry(universe.eq, item); |
2101 | }; |
||
2102 | var ancestors$2 = function (universe, start, end, isRoot) { |
||
2103 | if (isRoot === void 0) { |
||
2104 | isRoot = never; |
||
2105 | } |
||
2106 | var ps1 = [start].concat(universe.up().all(start)); |
||
2107 | var ps2 = [end].concat(universe.up().all(end)); |
||
2108 | var prune = function (path) { |
||
2109 | var index = findIndex(path, isRoot); |
||
2110 | return index.fold(function () { |
||
2111 | return path; |
||
2112 | }, function (ind) { |
||
2113 | return path.slice(0, ind + 1); |
||
2114 | }); |
||
2115 | }; |
||
2116 | var pruned1 = prune(ps1); |
||
2117 | var pruned2 = prune(ps2); |
||
637 | daniel-mar | 2118 | var shared = find$1(pruned1, function (x) { |
2119 | return exists(pruned2, eq(universe, x)); |
||
597 | daniel-mar | 2120 | }); |
2121 | return { |
||
2122 | firstpath: pruned1, |
||
2123 | secondpath: pruned2, |
||
2124 | shared: shared |
||
2125 | }; |
||
2126 | }; |
||
2127 | |||
637 | daniel-mar | 2128 | var sharedOne$1 = oneAll; |
2129 | var ancestors$1 = ancestors$2; |
||
597 | daniel-mar | 2130 | |
637 | daniel-mar | 2131 | var universe$3 = DomUniverse(); |
2132 | var sharedOne = function (look, elements) { |
||
2133 | return sharedOne$1(universe$3, function (_universe, element) { |
||
597 | daniel-mar | 2134 | return look(element); |
2135 | }, elements); |
||
2136 | }; |
||
637 | daniel-mar | 2137 | var ancestors = function (start, finish, isRoot) { |
2138 | return ancestors$1(universe$3, start, finish, isRoot); |
||
597 | daniel-mar | 2139 | }; |
2140 | |||
2141 | var lookupTable = function (container) { |
||
2142 | return ancestor$1(container, 'table'); |
||
2143 | }; |
||
2144 | var identify = function (start, finish, isRoot) { |
||
2145 | var getIsRoot = function (rootTable) { |
||
2146 | return function (element) { |
||
2147 | return isRoot !== undefined && isRoot(element) || eq$1(element, rootTable); |
||
2148 | }; |
||
2149 | }; |
||
2150 | if (eq$1(start, finish)) { |
||
2151 | return Optional.some({ |
||
2152 | boxes: Optional.some([start]), |
||
2153 | start: start, |
||
2154 | finish: finish |
||
2155 | }); |
||
2156 | } else { |
||
2157 | return lookupTable(start).bind(function (startTable) { |
||
2158 | return lookupTable(finish).bind(function (finishTable) { |
||
2159 | if (eq$1(startTable, finishTable)) { |
||
2160 | return Optional.some({ |
||
637 | daniel-mar | 2161 | boxes: intercepts(startTable, start, finish), |
597 | daniel-mar | 2162 | start: start, |
2163 | finish: finish |
||
2164 | }); |
||
637 | daniel-mar | 2165 | } else if (contains(startTable, finishTable)) { |
2166 | var ancestorCells = ancestors$3(finish, 'td,th', getIsRoot(startTable)); |
||
597 | daniel-mar | 2167 | var finishCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : finish; |
2168 | return Optional.some({ |
||
2169 | boxes: nestedIntercepts(startTable, start, startTable, finish, finishTable), |
||
2170 | start: start, |
||
2171 | finish: finishCell |
||
2172 | }); |
||
637 | daniel-mar | 2173 | } else if (contains(finishTable, startTable)) { |
2174 | var ancestorCells = ancestors$3(start, 'td,th', getIsRoot(finishTable)); |
||
597 | daniel-mar | 2175 | var startCell = ancestorCells.length > 0 ? ancestorCells[ancestorCells.length - 1] : start; |
2176 | return Optional.some({ |
||
2177 | boxes: nestedIntercepts(finishTable, start, startTable, finish, finishTable), |
||
2178 | start: start, |
||
2179 | finish: startCell |
||
2180 | }); |
||
2181 | } else { |
||
637 | daniel-mar | 2182 | return ancestors(start, finish).shared.bind(function (lca) { |
597 | daniel-mar | 2183 | return closest$1(lca, 'table', isRoot).bind(function (lcaTable) { |
637 | daniel-mar | 2184 | var finishAncestorCells = ancestors$3(finish, 'td,th', getIsRoot(lcaTable)); |
597 | daniel-mar | 2185 | var finishCell = finishAncestorCells.length > 0 ? finishAncestorCells[finishAncestorCells.length - 1] : finish; |
637 | daniel-mar | 2186 | var startAncestorCells = ancestors$3(start, 'td,th', getIsRoot(lcaTable)); |
597 | daniel-mar | 2187 | var startCell = startAncestorCells.length > 0 ? startAncestorCells[startAncestorCells.length - 1] : start; |
2188 | return Optional.some({ |
||
2189 | boxes: nestedIntercepts(lcaTable, start, startTable, finish, finishTable), |
||
2190 | start: startCell, |
||
2191 | finish: finishCell |
||
2192 | }); |
||
2193 | }); |
||
2194 | }); |
||
2195 | } |
||
2196 | }); |
||
2197 | }); |
||
2198 | } |
||
2199 | }; |
||
637 | daniel-mar | 2200 | var retrieve$1 = function (container, selector) { |
2201 | var sels = descendants(container, selector); |
||
597 | daniel-mar | 2202 | return sels.length > 0 ? Optional.some(sels) : Optional.none(); |
2203 | }; |
||
2204 | var getLast = function (boxes, lastSelectedSelector) { |
||
637 | daniel-mar | 2205 | return find$1(boxes, function (box) { |
2206 | return is$2(box, lastSelectedSelector); |
||
597 | daniel-mar | 2207 | }); |
2208 | }; |
||
2209 | var getEdges = function (container, firstSelectedSelector, lastSelectedSelector) { |
||
637 | daniel-mar | 2210 | return descendant(container, firstSelectedSelector).bind(function (first) { |
2211 | return descendant(container, lastSelectedSelector).bind(function (last) { |
||
2212 | return sharedOne(lookupTable, [ |
||
597 | daniel-mar | 2213 | first, |
2214 | last |
||
2215 | ]).map(function (table) { |
||
2216 | return { |
||
2217 | first: first, |
||
2218 | last: last, |
||
2219 | table: table |
||
2220 | }; |
||
2221 | }); |
||
2222 | }); |
||
2223 | }); |
||
2224 | }; |
||
2225 | var expandTo = function (finish, firstSelectedSelector) { |
||
2226 | return ancestor$1(finish, 'table').bind(function (table) { |
||
637 | daniel-mar | 2227 | return descendant(table, firstSelectedSelector).bind(function (start) { |
597 | daniel-mar | 2228 | return identify(start, finish).bind(function (identified) { |
2229 | return identified.boxes.map(function (boxes) { |
||
2230 | return { |
||
2231 | boxes: boxes, |
||
2232 | start: identified.start, |
||
2233 | finish: identified.finish |
||
2234 | }; |
||
2235 | }); |
||
2236 | }); |
||
2237 | }); |
||
2238 | }); |
||
2239 | }; |
||
2240 | var shiftSelection = function (boxes, deltaRow, deltaColumn, firstSelectedSelector, lastSelectedSelector) { |
||
2241 | return getLast(boxes, lastSelectedSelector).bind(function (last) { |
||
637 | daniel-mar | 2242 | return moveBy(last, deltaRow, deltaColumn).bind(function (finish) { |
597 | daniel-mar | 2243 | return expandTo(finish, firstSelectedSelector); |
2244 | }); |
||
2245 | }); |
||
2246 | }; |
||
2247 | |||
637 | daniel-mar | 2248 | var retrieve = function (container, selector) { |
2249 | return retrieve$1(container, selector); |
||
597 | daniel-mar | 2250 | }; |
2251 | var retrieveBox = function (container, firstSelectedSelector, lastSelectedSelector) { |
||
2252 | return getEdges(container, firstSelectedSelector, lastSelectedSelector).bind(function (edges) { |
||
2253 | var isRoot = function (ancestor) { |
||
2254 | return eq$1(container, ancestor); |
||
2255 | }; |
||
2256 | var sectionSelector = 'thead,tfoot,tbody,table'; |
||
2257 | var firstAncestor = ancestor$1(edges.first, sectionSelector, isRoot); |
||
2258 | var lastAncestor = ancestor$1(edges.last, sectionSelector, isRoot); |
||
2259 | return firstAncestor.bind(function (fA) { |
||
2260 | return lastAncestor.bind(function (lA) { |
||
637 | daniel-mar | 2261 | return eq$1(fA, lA) ? getBox(edges.table, edges.first, edges.last) : Optional.none(); |
597 | daniel-mar | 2262 | }); |
2263 | }); |
||
2264 | }); |
||
2265 | }; |
||
2266 | |||
637 | daniel-mar | 2267 | var generate = function (cases) { |
597 | daniel-mar | 2268 | if (!isArray(cases)) { |
2269 | throw new Error('cases must be an array'); |
||
2270 | } |
||
2271 | if (cases.length === 0) { |
||
2272 | throw new Error('there must be at least one case'); |
||
2273 | } |
||
2274 | var constructors = []; |
||
2275 | var adt = {}; |
||
637 | daniel-mar | 2276 | each$2(cases, function (acase, count) { |
597 | daniel-mar | 2277 | var keys$1 = keys(acase); |
2278 | if (keys$1.length !== 1) { |
||
2279 | throw new Error('one and only one name per case'); |
||
2280 | } |
||
2281 | var key = keys$1[0]; |
||
2282 | var value = acase[key]; |
||
2283 | if (adt[key] !== undefined) { |
||
2284 | throw new Error('duplicate key detected:' + key); |
||
2285 | } else if (key === 'cata') { |
||
2286 | throw new Error('cannot have a case named cata (sorry)'); |
||
2287 | } else if (!isArray(value)) { |
||
2288 | throw new Error('case arguments must be an array'); |
||
2289 | } |
||
2290 | constructors.push(key); |
||
2291 | adt[key] = function () { |
||
2292 | var args = []; |
||
2293 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2294 | args[_i] = arguments[_i]; |
||
2295 | } |
||
2296 | var argLength = args.length; |
||
2297 | if (argLength !== value.length) { |
||
2298 | throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); |
||
2299 | } |
||
2300 | var match = function (branches) { |
||
2301 | var branchKeys = keys(branches); |
||
2302 | if (constructors.length !== branchKeys.length) { |
||
2303 | throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); |
||
2304 | } |
||
2305 | var allReqd = forall(constructors, function (reqKey) { |
||
637 | daniel-mar | 2306 | return contains$2(branchKeys, reqKey); |
597 | daniel-mar | 2307 | }); |
2308 | if (!allReqd) { |
||
2309 | throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); |
||
2310 | } |
||
2311 | return branches[key].apply(null, args); |
||
2312 | }; |
||
2313 | return { |
||
2314 | fold: function () { |
||
2315 | var foldArgs = []; |
||
2316 | for (var _i = 0; _i < arguments.length; _i++) { |
||
2317 | foldArgs[_i] = arguments[_i]; |
||
2318 | } |
||
2319 | if (foldArgs.length !== cases.length) { |
||
2320 | throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); |
||
2321 | } |
||
2322 | var target = foldArgs[count]; |
||
2323 | return target.apply(null, args); |
||
2324 | }, |
||
2325 | match: match, |
||
2326 | log: function (label) { |
||
2327 | console.log(label, { |
||
2328 | constructors: constructors, |
||
2329 | constructor: key, |
||
2330 | params: args |
||
2331 | }); |
||
2332 | } |
||
2333 | }; |
||
2334 | }; |
||
2335 | }); |
||
2336 | return adt; |
||
2337 | }; |
||
637 | daniel-mar | 2338 | var Adt = { generate: generate }; |
597 | daniel-mar | 2339 | |
637 | daniel-mar | 2340 | var type = Adt.generate([ |
597 | daniel-mar | 2341 | { none: [] }, |
2342 | { multiple: ['elements'] }, |
||
2343 | { single: ['element'] } |
||
2344 | ]); |
||
637 | daniel-mar | 2345 | var cata$2 = function (subject, onNone, onMultiple, onSingle) { |
597 | daniel-mar | 2346 | return subject.fold(onNone, onMultiple, onSingle); |
2347 | }; |
||
637 | daniel-mar | 2348 | var none$1 = type.none; |
2349 | var multiple = type.multiple; |
||
2350 | var single = type.single; |
||
597 | daniel-mar | 2351 | |
2352 | var Selections = function (lazyRoot, getStart, selectedSelector) { |
||
2353 | var get = function () { |
||
637 | daniel-mar | 2354 | return retrieve(lazyRoot(), selectedSelector).fold(function () { |
2355 | return getStart().fold(none$1, single); |
||
597 | daniel-mar | 2356 | }, function (cells) { |
2357 | return multiple(cells); |
||
2358 | }); |
||
2359 | }; |
||
2360 | return { get: get }; |
||
2361 | }; |
||
2362 | |||
637 | daniel-mar | 2363 | var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager'); |
597 | daniel-mar | 2364 | |
637 | daniel-mar | 2365 | var clone = function (original, isDeep) { |
597 | daniel-mar | 2366 | return SugarElement.fromDom(original.dom.cloneNode(isDeep)); |
2367 | }; |
||
2368 | var shallow = function (original) { |
||
637 | daniel-mar | 2369 | return clone(original, false); |
597 | daniel-mar | 2370 | }; |
2371 | var deep = function (original) { |
||
637 | daniel-mar | 2372 | return clone(original, true); |
597 | daniel-mar | 2373 | }; |
2374 | var shallowAs = function (original, tag) { |
||
2375 | var nu = SugarElement.fromTag(tag); |
||
637 | daniel-mar | 2376 | var attributes = clone$2(original); |
2377 | setAll$1(nu, attributes); |
||
597 | daniel-mar | 2378 | return nu; |
2379 | }; |
||
2380 | var copy$1 = function (original, tag) { |
||
2381 | var nu = shallowAs(original, tag); |
||
637 | daniel-mar | 2382 | var cloneChildren = children$3(deep(original)); |
2383 | append(nu, cloneChildren); |
||
597 | daniel-mar | 2384 | return nu; |
2385 | }; |
||
637 | daniel-mar | 2386 | var mutate$1 = function (original, tag) { |
2387 | var nu = shallowAs(original, tag); |
||
2388 | before$4(original, nu); |
||
2389 | var children = children$3(original); |
||
2390 | append(nu, children); |
||
2391 | remove$5(original); |
||
2392 | return nu; |
||
597 | daniel-mar | 2393 | }; |
2394 | |||
2395 | var Dimension = function (name, getOffset) { |
||
2396 | var set = function (element, h) { |
||
2397 | if (!isNumber(h) && !h.match(/^[0-9]+$/)) { |
||
2398 | throw new Error(name + '.set accepts only positive integer values. Value was ' + h); |
||
2399 | } |
||
2400 | var dom = element.dom; |
||
637 | daniel-mar | 2401 | if (isSupported(dom)) { |
597 | daniel-mar | 2402 | dom.style[name] = h + 'px'; |
2403 | } |
||
2404 | }; |
||
2405 | var get = function (element) { |
||
2406 | var r = getOffset(element); |
||
2407 | if (r <= 0 || r === null) { |
||
637 | daniel-mar | 2408 | var css = get$a(element, name); |
597 | daniel-mar | 2409 | return parseFloat(css) || 0; |
2410 | } |
||
2411 | return r; |
||
2412 | }; |
||
2413 | var getOuter = get; |
||
2414 | var aggregate = function (element, properties) { |
||
2415 | return foldl(properties, function (acc, property) { |
||
637 | daniel-mar | 2416 | var val = get$a(element, property); |
597 | daniel-mar | 2417 | var value = val === undefined ? 0 : parseInt(val, 10); |
2418 | return isNaN(value) ? acc : acc + value; |
||
2419 | }, 0); |
||
2420 | }; |
||
2421 | var max = function (element, value, properties) { |
||
2422 | var cumulativeInclusions = aggregate(element, properties); |
||
2423 | var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; |
||
2424 | return absoluteMax; |
||
2425 | }; |
||
2426 | return { |
||
2427 | set: set, |
||
2428 | get: get, |
||
2429 | getOuter: getOuter, |
||
2430 | aggregate: aggregate, |
||
2431 | max: max |
||
2432 | }; |
||
2433 | }; |
||
2434 | |||
679 | daniel-mar | 2435 | var needManualCalc = function () { |
2436 | var browser = detect$3().browser; |
||
2437 | return browser.isIE() || browser.isEdge(); |
||
2438 | }; |
||
2439 | var toNumber = function (px, fallback) { |
||
2440 | return toFloat(px).getOr(fallback); |
||
2441 | }; |
||
2442 | var getProp = function (element, name, fallback) { |
||
2443 | return toNumber(get$a(element, name), fallback); |
||
2444 | }; |
||
2445 | var getBoxSizing = function (element) { |
||
2446 | return get$a(element, 'box-sizing'); |
||
2447 | }; |
||
2448 | var calcContentBoxSize = function (element, size, upper, lower) { |
||
2449 | var paddingUpper = getProp(element, 'padding-' + upper, 0); |
||
2450 | var paddingLower = getProp(element, 'padding-' + lower, 0); |
||
2451 | var borderUpper = getProp(element, 'border-' + upper + '-width', 0); |
||
2452 | var borderLower = getProp(element, 'border-' + lower + '-width', 0); |
||
2453 | return size - paddingUpper - paddingLower - borderUpper - borderLower; |
||
2454 | }; |
||
2455 | var getCalculatedHeight = function (element, boxSizing) { |
||
2456 | var dom = element.dom; |
||
2457 | var height = dom.getBoundingClientRect().height || dom.offsetHeight; |
||
2458 | return boxSizing === 'border-box' ? height : calcContentBoxSize(element, height, 'top', 'bottom'); |
||
2459 | }; |
||
2460 | var getCalculatedWidth = function (element, boxSizing) { |
||
2461 | var dom = element.dom; |
||
2462 | var width = dom.getBoundingClientRect().width || dom.offsetWidth; |
||
2463 | return boxSizing === 'border-box' ? width : calcContentBoxSize(element, width, 'left', 'right'); |
||
2464 | }; |
||
2465 | var getHeight$1 = function (element) { |
||
2466 | return needManualCalc() ? getCalculatedHeight(element, getBoxSizing(element)) : getProp(element, 'height', element.dom.offsetHeight); |
||
2467 | }; |
||
2468 | var getWidth = function (element) { |
||
2469 | return needManualCalc() ? getCalculatedWidth(element, getBoxSizing(element)) : getProp(element, 'width', element.dom.offsetWidth); |
||
2470 | }; |
||
2471 | var getInnerWidth = function (element) { |
||
2472 | return getCalculatedWidth(element, 'content-box'); |
||
2473 | }; |
||
2474 | |||
597 | daniel-mar | 2475 | var api$1 = Dimension('width', function (element) { |
2476 | return element.dom.offsetWidth; |
||
2477 | }); |
||
637 | daniel-mar | 2478 | var get$8 = function (element) { |
597 | daniel-mar | 2479 | return api$1.get(element); |
2480 | }; |
||
637 | daniel-mar | 2481 | var getOuter$2 = function (element) { |
597 | daniel-mar | 2482 | return api$1.getOuter(element); |
2483 | }; |
||
679 | daniel-mar | 2484 | var getInner = getInnerWidth; |
2485 | var getRuntime$1 = getWidth; |
||
597 | daniel-mar | 2486 | |
637 | daniel-mar | 2487 | var columns = function (warehouse, isValidCell) { |
597 | daniel-mar | 2488 | if (isValidCell === void 0) { |
2489 | isValidCell = always; |
||
2490 | } |
||
2491 | var grid = warehouse.grid; |
||
637 | daniel-mar | 2492 | var cols = range$1(grid.columns, identity); |
2493 | var rowsArr = range$1(grid.rows, identity); |
||
2494 | return map$1(cols, function (col) { |
||
597 | daniel-mar | 2495 | var getBlock = function () { |
637 | daniel-mar | 2496 | return bind$2(rowsArr, function (r) { |
597 | daniel-mar | 2497 | return Warehouse.getAt(warehouse, r, col).filter(function (detail) { |
2498 | return detail.column === col; |
||
2499 | }).toArray(); |
||
2500 | }); |
||
2501 | }; |
||
2502 | var isValid = function (detail) { |
||
2503 | return detail.colspan === 1 && isValidCell(detail.element); |
||
2504 | }; |
||
2505 | var getFallback = function () { |
||
2506 | return Warehouse.getAt(warehouse, 0, col); |
||
2507 | }; |
||
2508 | return decide(getBlock, isValid, getFallback); |
||
2509 | }); |
||
2510 | }; |
||
2511 | var decide = function (getBlock, isValid, getFallback) { |
||
2512 | var inBlock = getBlock(); |
||
637 | daniel-mar | 2513 | var validInBlock = find$1(inBlock, isValid); |
597 | daniel-mar | 2514 | var detailOption = validInBlock.orThunk(function () { |
2515 | return Optional.from(inBlock[0]).orThunk(getFallback); |
||
2516 | }); |
||
2517 | return detailOption.map(function (detail) { |
||
2518 | return detail.element; |
||
2519 | }); |
||
2520 | }; |
||
637 | daniel-mar | 2521 | var rows = function (warehouse) { |
597 | daniel-mar | 2522 | var grid = warehouse.grid; |
637 | daniel-mar | 2523 | var rowsArr = range$1(grid.rows, identity); |
2524 | var cols = range$1(grid.columns, identity); |
||
2525 | return map$1(rowsArr, function (row) { |
||
597 | daniel-mar | 2526 | var getBlock = function () { |
637 | daniel-mar | 2527 | return bind$2(cols, function (c) { |
597 | daniel-mar | 2528 | return Warehouse.getAt(warehouse, row, c).filter(function (detail) { |
2529 | return detail.row === row; |
||
2530 | }).fold(constant([]), function (detail) { |
||
2531 | return [detail]; |
||
2532 | }); |
||
2533 | }); |
||
2534 | }; |
||
2535 | var isSingle = function (detail) { |
||
2536 | return detail.rowspan === 1; |
||
2537 | }; |
||
2538 | var getFallback = function () { |
||
2539 | return Warehouse.getAt(warehouse, row, 0); |
||
2540 | }; |
||
2541 | return decide(getBlock, isSingle, getFallback); |
||
2542 | }); |
||
2543 | }; |
||
2544 | |||
2545 | var deduce = function (xs, index) { |
||
2546 | if (index < 0 || index >= xs.length - 1) { |
||
2547 | return Optional.none(); |
||
2548 | } |
||
2549 | var current = xs[index].fold(function () { |
||
2550 | var rest = reverse(xs.slice(0, index)); |
||
2551 | return findMap(rest, function (a, i) { |
||
2552 | return a.map(function (aa) { |
||
2553 | return { |
||
2554 | value: aa, |
||
2555 | delta: i + 1 |
||
2556 | }; |
||
2557 | }); |
||
2558 | }); |
||
2559 | }, function (c) { |
||
2560 | return Optional.some({ |
||
2561 | value: c, |
||
2562 | delta: 0 |
||
2563 | }); |
||
2564 | }); |
||
2565 | var next = xs[index + 1].fold(function () { |
||
2566 | var rest = xs.slice(index + 1); |
||
2567 | return findMap(rest, function (a, i) { |
||
2568 | return a.map(function (aa) { |
||
2569 | return { |
||
2570 | value: aa, |
||
2571 | delta: i + 1 |
||
2572 | }; |
||
2573 | }); |
||
2574 | }); |
||
2575 | }, function (n) { |
||
2576 | return Optional.some({ |
||
2577 | value: n, |
||
2578 | delta: 1 |
||
2579 | }); |
||
2580 | }); |
||
2581 | return current.bind(function (c) { |
||
2582 | return next.map(function (n) { |
||
2583 | var extras = n.delta + c.delta; |
||
2584 | return Math.abs(n.value - c.value) / extras; |
||
2585 | }); |
||
2586 | }); |
||
2587 | }; |
||
2588 | |||
2589 | var onDirection = function (isLtr, isRtl) { |
||
2590 | return function (element) { |
||
2591 | return getDirection(element) === 'rtl' ? isRtl : isLtr; |
||
2592 | }; |
||
2593 | }; |
||
2594 | var getDirection = function (element) { |
||
637 | daniel-mar | 2595 | return get$a(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; |
597 | daniel-mar | 2596 | }; |
2597 | |||
637 | daniel-mar | 2598 | var api = Dimension('height', function (element) { |
597 | daniel-mar | 2599 | var dom = element.dom; |
2600 | return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; |
||
2601 | }); |
||
637 | daniel-mar | 2602 | var get$7 = function (element) { |
2603 | return api.get(element); |
||
597 | daniel-mar | 2604 | }; |
2605 | var getOuter$1 = function (element) { |
||
637 | daniel-mar | 2606 | return api.getOuter(element); |
597 | daniel-mar | 2607 | }; |
679 | daniel-mar | 2608 | var getRuntime = getHeight$1; |
597 | daniel-mar | 2609 | |
2610 | var r = function (left, top) { |
||
2611 | var translate = function (x, y) { |
||
2612 | return r(left + x, top + y); |
||
2613 | }; |
||
2614 | return { |
||
2615 | left: left, |
||
2616 | top: top, |
||
2617 | translate: translate |
||
2618 | }; |
||
2619 | }; |
||
2620 | var SugarPosition = r; |
||
2621 | |||
2622 | var boxPosition = function (dom) { |
||
2623 | var box = dom.getBoundingClientRect(); |
||
2624 | return SugarPosition(box.left, box.top); |
||
2625 | }; |
||
2626 | var firstDefinedOrZero = function (a, b) { |
||
2627 | if (a !== undefined) { |
||
2628 | return a; |
||
2629 | } else { |
||
2630 | return b !== undefined ? b : 0; |
||
2631 | } |
||
2632 | }; |
||
2633 | var absolute = function (element) { |
||
2634 | var doc = element.dom.ownerDocument; |
||
2635 | var body = doc.body; |
||
2636 | var win = doc.defaultView; |
||
2637 | var html = doc.documentElement; |
||
2638 | if (body === element.dom) { |
||
2639 | return SugarPosition(body.offsetLeft, body.offsetTop); |
||
2640 | } |
||
2641 | var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop); |
||
2642 | var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft); |
||
2643 | var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); |
||
2644 | var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); |
||
2645 | return viewport(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); |
||
2646 | }; |
||
2647 | var viewport = function (element) { |
||
2648 | var dom = element.dom; |
||
2649 | var doc = dom.ownerDocument; |
||
2650 | var body = doc.body; |
||
2651 | if (body === dom) { |
||
2652 | return SugarPosition(body.offsetLeft, body.offsetTop); |
||
2653 | } |
||
2654 | if (!inBody(element)) { |
||
2655 | return SugarPosition(0, 0); |
||
2656 | } |
||
2657 | return boxPosition(dom); |
||
2658 | }; |
||
2659 | |||
2660 | var rowInfo = function (row, y) { |
||
2661 | return { |
||
2662 | row: row, |
||
2663 | y: y |
||
2664 | }; |
||
2665 | }; |
||
2666 | var colInfo = function (col, x) { |
||
2667 | return { |
||
2668 | col: col, |
||
2669 | x: x |
||
2670 | }; |
||
2671 | }; |
||
2672 | var rtlEdge = function (cell) { |
||
2673 | var pos = absolute(cell); |
||
637 | daniel-mar | 2674 | return pos.left + getOuter$2(cell); |
597 | daniel-mar | 2675 | }; |
2676 | var ltrEdge = function (cell) { |
||
2677 | return absolute(cell).left; |
||
2678 | }; |
||
2679 | var getLeftEdge = function (index, cell) { |
||
2680 | return colInfo(index, ltrEdge(cell)); |
||
2681 | }; |
||
2682 | var getRightEdge = function (index, cell) { |
||
2683 | return colInfo(index, rtlEdge(cell)); |
||
2684 | }; |
||
637 | daniel-mar | 2685 | var getTop$1 = function (cell) { |
597 | daniel-mar | 2686 | return absolute(cell).top; |
2687 | }; |
||
2688 | var getTopEdge = function (index, cell) { |
||
637 | daniel-mar | 2689 | return rowInfo(index, getTop$1(cell)); |
597 | daniel-mar | 2690 | }; |
2691 | var getBottomEdge = function (index, cell) { |
||
637 | daniel-mar | 2692 | return rowInfo(index, getTop$1(cell) + getOuter$1(cell)); |
597 | daniel-mar | 2693 | }; |
2694 | var findPositions = function (getInnerEdge, getOuterEdge, array) { |
||
2695 | if (array.length === 0) { |
||
2696 | return []; |
||
2697 | } |
||
637 | daniel-mar | 2698 | var lines = map$1(array.slice(1), function (cellOption, index) { |
597 | daniel-mar | 2699 | return cellOption.map(function (cell) { |
2700 | return getInnerEdge(index, cell); |
||
2701 | }); |
||
2702 | }); |
||
2703 | var lastLine = array[array.length - 1].map(function (cell) { |
||
2704 | return getOuterEdge(array.length - 1, cell); |
||
2705 | }); |
||
2706 | return lines.concat([lastLine]); |
||
2707 | }; |
||
2708 | var negate = function (step) { |
||
2709 | return -step; |
||
2710 | }; |
||
2711 | var height = { |
||
2712 | delta: identity, |
||
2713 | positions: function (optElements) { |
||
2714 | return findPositions(getTopEdge, getBottomEdge, optElements); |
||
2715 | }, |
||
637 | daniel-mar | 2716 | edge: getTop$1 |
597 | daniel-mar | 2717 | }; |
637 | daniel-mar | 2718 | var ltr$1 = { |
597 | daniel-mar | 2719 | delta: identity, |
2720 | edge: ltrEdge, |
||
2721 | positions: function (optElements) { |
||
2722 | return findPositions(getLeftEdge, getRightEdge, optElements); |
||
2723 | } |
||
2724 | }; |
||
637 | daniel-mar | 2725 | var rtl$1 = { |
597 | daniel-mar | 2726 | delta: negate, |
2727 | edge: rtlEdge, |
||
2728 | positions: function (optElements) { |
||
2729 | return findPositions(getRightEdge, getLeftEdge, optElements); |
||
2730 | } |
||
2731 | }; |
||
637 | daniel-mar | 2732 | var detect$2 = onDirection(ltr$1, rtl$1); |
597 | daniel-mar | 2733 | var width = { |
2734 | delta: function (amount, table) { |
||
637 | daniel-mar | 2735 | return detect$2(table).delta(amount, table); |
597 | daniel-mar | 2736 | }, |
2737 | positions: function (cols, table) { |
||
637 | daniel-mar | 2738 | return detect$2(table).positions(cols, table); |
597 | daniel-mar | 2739 | }, |
2740 | edge: function (cell) { |
||
637 | daniel-mar | 2741 | return detect$2(cell).edge(cell); |
597 | daniel-mar | 2742 | } |
2743 | }; |
||
2744 | |||
2745 | var units = { |
||
2746 | unsupportedLength: [ |
||
2747 | 'em', |
||
2748 | 'ex', |
||
2749 | 'cap', |
||
2750 | 'ch', |
||
2751 | 'ic', |
||
2752 | 'rem', |
||
2753 | 'lh', |
||
2754 | 'rlh', |
||
2755 | 'vw', |
||
2756 | 'vh', |
||
2757 | 'vi', |
||
2758 | 'vb', |
||
2759 | 'vmin', |
||
2760 | 'vmax', |
||
2761 | 'cm', |
||
2762 | 'mm', |
||
2763 | 'Q', |
||
2764 | 'in', |
||
2765 | 'pc', |
||
2766 | 'pt', |
||
2767 | 'px' |
||
2768 | ], |
||
2769 | fixed: [ |
||
2770 | 'px', |
||
2771 | 'pt' |
||
2772 | ], |
||
2773 | relative: ['%'], |
||
2774 | empty: [''] |
||
2775 | }; |
||
2776 | var pattern = function () { |
||
2777 | var decimalDigits = '[0-9]+'; |
||
2778 | var signedInteger = '[+-]?' + decimalDigits; |
||
2779 | var exponentPart = '[eE]' + signedInteger; |
||
2780 | var dot = '\\.'; |
||
2781 | var opt = function (input) { |
||
2782 | return '(?:' + input + ')?'; |
||
2783 | }; |
||
2784 | var unsignedDecimalLiteral = [ |
||
2785 | 'Infinity', |
||
2786 | decimalDigits + dot + opt(decimalDigits) + opt(exponentPart), |
||
2787 | dot + decimalDigits + opt(exponentPart), |
||
2788 | decimalDigits + opt(exponentPart) |
||
2789 | ].join('|'); |
||
2790 | var float = '[+-]?(?:' + unsignedDecimalLiteral + ')'; |
||
2791 | return new RegExp('^(' + float + ')(.*)$'); |
||
2792 | }(); |
||
2793 | var isUnit = function (unit, accepted) { |
||
2794 | return exists(accepted, function (acc) { |
||
2795 | return exists(units[acc], function (check) { |
||
2796 | return unit === check; |
||
2797 | }); |
||
2798 | }); |
||
2799 | }; |
||
2800 | var parse = function (input, accepted) { |
||
2801 | var match = Optional.from(pattern.exec(input)); |
||
2802 | return match.bind(function (array) { |
||
2803 | var value = Number(array[1]); |
||
2804 | var unitRaw = array[2]; |
||
2805 | if (isUnit(unitRaw, accepted)) { |
||
2806 | return Optional.some({ |
||
2807 | value: value, |
||
2808 | unit: unitRaw |
||
2809 | }); |
||
2810 | } else { |
||
2811 | return Optional.none(); |
||
2812 | } |
||
2813 | }); |
||
2814 | }; |
||
2815 | |||
2816 | var rPercentageBasedSizeRegex = /(\d+(\.\d+)?)%/; |
||
2817 | var rPixelBasedSizeRegex = /(\d+(\.\d+)?)px|em/; |
||
679 | daniel-mar | 2818 | var isCol$2 = isTag('col'); |
2819 | var getPercentSize = function (elm, outerGetter, innerGetter) { |
||
2820 | var relativeParent = parentElement(elm).getOrThunk(function () { |
||
2821 | return getBody$1(owner(elm)); |
||
2822 | }); |
||
2823 | return outerGetter(elm) / innerGetter(relativeParent) * 100; |
||
597 | daniel-mar | 2824 | }; |
2825 | var setPixelWidth = function (cell, amount) { |
||
2826 | set$1(cell, 'width', amount + 'px'); |
||
2827 | }; |
||
2828 | var setPercentageWidth = function (cell, amount) { |
||
2829 | set$1(cell, 'width', amount + '%'); |
||
2830 | }; |
||
2831 | var setHeight = function (cell, amount) { |
||
2832 | set$1(cell, 'height', amount + 'px'); |
||
2833 | }; |
||
2834 | var getHeightValue = function (cell) { |
||
679 | daniel-mar | 2835 | return getRuntime(cell) + 'px'; |
597 | daniel-mar | 2836 | }; |
2837 | var convert = function (cell, number, getter, setter) { |
||
2838 | var newSize = table(cell).map(function (table) { |
||
2839 | var total = getter(table); |
||
2840 | return Math.floor(number / 100 * total); |
||
2841 | }).getOr(number); |
||
2842 | setter(cell, newSize); |
||
2843 | return newSize; |
||
2844 | }; |
||
2845 | var normalizePixelSize = function (value, cell, getter, setter) { |
||
679 | daniel-mar | 2846 | var number = parseFloat(value); |
597 | daniel-mar | 2847 | return endsWith(value, '%') && name(cell) !== 'table' ? convert(cell, number, getter, setter) : number; |
2848 | }; |
||
2849 | var getTotalHeight = function (cell) { |
||
2850 | var value = getHeightValue(cell); |
||
2851 | if (!value) { |
||
637 | daniel-mar | 2852 | return get$7(cell); |
597 | daniel-mar | 2853 | } |
637 | daniel-mar | 2854 | return normalizePixelSize(value, cell, get$7, setHeight); |
597 | daniel-mar | 2855 | }; |
637 | daniel-mar | 2856 | var get$6 = function (cell, type, f) { |
597 | daniel-mar | 2857 | var v = f(cell); |
2858 | var span = getSpan(cell, type); |
||
2859 | return v / span; |
||
2860 | }; |
||
679 | daniel-mar | 2861 | var getRaw$1 = function (element, prop) { |
2862 | return getRaw$2(element, prop).orThunk(function () { |
||
2863 | return getOpt(element, prop).map(function (val) { |
||
2864 | return val + 'px'; |
||
2865 | }); |
||
597 | daniel-mar | 2866 | }); |
2867 | }; |
||
679 | daniel-mar | 2868 | var getRawWidth$1 = function (element) { |
2869 | return getRaw$1(element, 'width'); |
||
597 | daniel-mar | 2870 | }; |
679 | daniel-mar | 2871 | var getRawHeight = function (element) { |
2872 | return getRaw$1(element, 'height'); |
||
597 | daniel-mar | 2873 | }; |
679 | daniel-mar | 2874 | var getPercentageWidth = function (cell) { |
2875 | return getPercentSize(cell, get$8, getInner); |
||
597 | daniel-mar | 2876 | }; |
679 | daniel-mar | 2877 | var getPixelWidth$1 = function (cell) { |
2878 | return isCol$2(cell) ? get$8(cell) : getRuntime$1(cell); |
||
597 | daniel-mar | 2879 | }; |
637 | daniel-mar | 2880 | var getHeight = function (cell) { |
2881 | return get$6(cell, 'rowspan', getTotalHeight); |
||
597 | daniel-mar | 2882 | }; |
2883 | var getGenericWidth = function (cell) { |
||
637 | daniel-mar | 2884 | var width = getRawWidth$1(cell); |
597 | daniel-mar | 2885 | return width.bind(function (w) { |
2886 | return parse(w, [ |
||
2887 | 'fixed', |
||
2888 | 'relative', |
||
2889 | 'empty' |
||
2890 | ]); |
||
2891 | }); |
||
2892 | }; |
||
2893 | var setGenericWidth = function (cell, amount, unit) { |
||
2894 | set$1(cell, 'width', amount + unit); |
||
2895 | }; |
||
2896 | var getPixelTableWidth = function (table) { |
||
637 | daniel-mar | 2897 | return get$8(table) + 'px'; |
597 | daniel-mar | 2898 | }; |
679 | daniel-mar | 2899 | var getPercentTableWidth = function (table) { |
2900 | return getPercentSize(table, get$8, getInner) + '%'; |
||
597 | daniel-mar | 2901 | }; |
637 | daniel-mar | 2902 | var isPercentSizing$1 = function (table) { |
2903 | return getRawWidth$1(table).exists(function (size) { |
||
597 | daniel-mar | 2904 | return rPercentageBasedSizeRegex.test(size); |
2905 | }); |
||
2906 | }; |
||
637 | daniel-mar | 2907 | var isPixelSizing$1 = function (table) { |
2908 | return getRawWidth$1(table).exists(function (size) { |
||
597 | daniel-mar | 2909 | return rPixelBasedSizeRegex.test(size); |
2910 | }); |
||
2911 | }; |
||
637 | daniel-mar | 2912 | var isNoneSizing$1 = function (table) { |
2913 | return getRawWidth$1(table).isNone(); |
||
597 | daniel-mar | 2914 | }; |
2915 | var percentageBasedSizeRegex = constant(rPercentageBasedSizeRegex); |
||
2916 | |||
637 | daniel-mar | 2917 | var isCol$1 = isTag('col'); |
679 | daniel-mar | 2918 | var getRawW = function (cell) { |
2919 | return getRawWidth$1(cell).getOrThunk(function () { |
||
2920 | return getPixelWidth$1(cell) + 'px'; |
||
597 | daniel-mar | 2921 | }); |
2922 | }; |
||
2923 | var getRawH = function (cell) { |
||
679 | daniel-mar | 2924 | return getRawHeight(cell).getOrThunk(function () { |
2925 | return getHeight(cell) + 'px'; |
||
2926 | }); |
||
597 | daniel-mar | 2927 | }; |
2928 | var justCols = function (warehouse) { |
||
637 | daniel-mar | 2929 | return map$1(Warehouse.justColumns(warehouse), function (column) { |
597 | daniel-mar | 2930 | return Optional.from(column.element); |
2931 | }); |
||
2932 | }; |
||
2933 | var isValidColumn = function (cell) { |
||
679 | daniel-mar | 2934 | var browser = detect$3().browser; |
2935 | var supportsColWidths = browser.isChrome() || browser.isFirefox(); |
||
2936 | return isCol$1(cell) ? supportsColWidths : true; |
||
597 | daniel-mar | 2937 | }; |
2938 | var getDimension = function (cellOpt, index, backups, filter, getter, fallback) { |
||
2939 | return cellOpt.filter(filter).fold(function () { |
||
2940 | return fallback(deduce(backups, index)); |
||
2941 | }, function (cell) { |
||
2942 | return getter(cell); |
||
2943 | }); |
||
2944 | }; |
||
679 | daniel-mar | 2945 | var getWidthFrom = function (warehouse, table, getWidth, fallback) { |
2946 | var columnCells = columns(warehouse); |
||
637 | daniel-mar | 2947 | var columns$1 = Warehouse.hasColumns(warehouse) ? justCols(warehouse) : columnCells; |
2948 | var backups = [Optional.some(width.edge(table))].concat(map$1(width.positions(columnCells, table), function (pos) { |
||
597 | daniel-mar | 2949 | return pos.map(function (p) { |
2950 | return p.x; |
||
2951 | }); |
||
2952 | })); |
||
2953 | var colFilter = not(hasColspan); |
||
637 | daniel-mar | 2954 | return map$1(columns$1, function (cellOption, c) { |
597 | daniel-mar | 2955 | return getDimension(cellOption, c, backups, colFilter, function (column) { |
2956 | if (isValidColumn(column)) { |
||
679 | daniel-mar | 2957 | return getWidth(column); |
597 | daniel-mar | 2958 | } else { |
2959 | var cell = bindFrom(columnCells[c], identity); |
||
2960 | return getDimension(cell, c, backups, colFilter, function (cell) { |
||
637 | daniel-mar | 2961 | return fallback(Optional.some(get$8(cell))); |
597 | daniel-mar | 2962 | }, fallback); |
2963 | } |
||
2964 | }, fallback); |
||
2965 | }); |
||
2966 | }; |
||
2967 | var getDeduced = function (deduced) { |
||
2968 | return deduced.map(function (d) { |
||
2969 | return d + 'px'; |
||
2970 | }).getOr(''); |
||
2971 | }; |
||
679 | daniel-mar | 2972 | var getRawWidths = function (warehouse, table) { |
2973 | return getWidthFrom(warehouse, table, getRawW, getDeduced); |
||
597 | daniel-mar | 2974 | }; |
2975 | var getPercentageWidths = function (warehouse, table, tableSize) { |
||
2976 | return getWidthFrom(warehouse, table, getPercentageWidth, function (deduced) { |
||
2977 | return deduced.fold(function () { |
||
2978 | return tableSize.minCellWidth(); |
||
2979 | }, function (cellWidth) { |
||
2980 | return cellWidth / tableSize.pixelWidth() * 100; |
||
2981 | }); |
||
679 | daniel-mar | 2982 | }); |
597 | daniel-mar | 2983 | }; |
2984 | var getPixelWidths = function (warehouse, table, tableSize) { |
||
637 | daniel-mar | 2985 | return getWidthFrom(warehouse, table, getPixelWidth$1, function (deduced) { |
597 | daniel-mar | 2986 | return deduced.getOrThunk(tableSize.minCellWidth); |
679 | daniel-mar | 2987 | }); |
597 | daniel-mar | 2988 | }; |
2989 | var getHeightFrom = function (warehouse, table, direction, getHeight, fallback) { |
||
637 | daniel-mar | 2990 | var rows$1 = rows(warehouse); |
2991 | var backups = [Optional.some(direction.edge(table))].concat(map$1(direction.positions(rows$1, table), function (pos) { |
||
597 | daniel-mar | 2992 | return pos.map(function (p) { |
2993 | return p.y; |
||
2994 | }); |
||
2995 | })); |
||
637 | daniel-mar | 2996 | return map$1(rows$1, function (cellOption, c) { |
597 | daniel-mar | 2997 | return getDimension(cellOption, c, backups, not(hasRowspan), getHeight, fallback); |
2998 | }); |
||
2999 | }; |
||
3000 | var getPixelHeights = function (warehouse, table, direction) { |
||
637 | daniel-mar | 3001 | return getHeightFrom(warehouse, table, direction, getHeight, function (deduced) { |
597 | daniel-mar | 3002 | return deduced.getOrThunk(minHeight); |
3003 | }); |
||
3004 | }; |
||
3005 | var getRawHeights = function (warehouse, table, direction) { |
||
3006 | return getHeightFrom(warehouse, table, direction, getRawH, getDeduced); |
||
3007 | }; |
||
3008 | |||
679 | daniel-mar | 3009 | var widthLookup = function (table, getter) { |
3010 | return function () { |
||
3011 | if (inBody(table)) { |
||
3012 | return getter(table); |
||
3013 | } else { |
||
3014 | return parseFloat(getRaw$2(table, 'width').getOr('0')); |
||
3015 | } |
||
597 | daniel-mar | 3016 | }; |
3017 | }; |
||
3018 | var noneSize = function (table) { |
||
679 | daniel-mar | 3019 | var getWidth = widthLookup(table, get$8); |
597 | daniel-mar | 3020 | var zero = constant(0); |
3021 | var getWidths = function (warehouse, tableSize) { |
||
3022 | return getPixelWidths(warehouse, table, tableSize); |
||
3023 | }; |
||
3024 | return { |
||
3025 | width: getWidth, |
||
3026 | pixelWidth: getWidth, |
||
3027 | getWidths: getWidths, |
||
3028 | getCellDelta: zero, |
||
3029 | singleColumnWidth: constant([0]), |
||
3030 | minCellWidth: zero, |
||
3031 | setElementWidth: noop, |
||
3032 | adjustTableWidth: noop, |
||
3033 | isRelative: true, |
||
3034 | label: 'none' |
||
3035 | }; |
||
3036 | }; |
||
679 | daniel-mar | 3037 | var percentageSize = function (table) { |
3038 | var getFloatWidth = widthLookup(table, function (elem) { |
||
3039 | return parseFloat(getPercentTableWidth(elem)); |
||
3040 | }); |
||
3041 | var getWidth = widthLookup(table, get$8); |
||
597 | daniel-mar | 3042 | var getCellDelta = function (delta) { |
679 | daniel-mar | 3043 | return delta / getWidth() * 100; |
597 | daniel-mar | 3044 | }; |
3045 | var singleColumnWidth = function (w, _delta) { |
||
3046 | return [100 - w]; |
||
3047 | }; |
||
3048 | var minCellWidth = function () { |
||
679 | daniel-mar | 3049 | return minWidth() / getWidth() * 100; |
597 | daniel-mar | 3050 | }; |
3051 | var adjustTableWidth = function (delta) { |
||
679 | daniel-mar | 3052 | var currentWidth = getFloatWidth(); |
597 | daniel-mar | 3053 | var change = delta / 100 * currentWidth; |
3054 | var newWidth = currentWidth + change; |
||
3055 | setPercentageWidth(table, newWidth); |
||
3056 | }; |
||
3057 | var getWidths = function (warehouse, tableSize) { |
||
3058 | return getPercentageWidths(warehouse, table, tableSize); |
||
3059 | }; |
||
3060 | return { |
||
679 | daniel-mar | 3061 | width: getFloatWidth, |
3062 | pixelWidth: getWidth, |
||
597 | daniel-mar | 3063 | getWidths: getWidths, |
3064 | getCellDelta: getCellDelta, |
||
3065 | singleColumnWidth: singleColumnWidth, |
||
3066 | minCellWidth: minCellWidth, |
||
3067 | setElementWidth: setPercentageWidth, |
||
3068 | adjustTableWidth: adjustTableWidth, |
||
3069 | isRelative: true, |
||
3070 | label: 'percent' |
||
3071 | }; |
||
3072 | }; |
||
679 | daniel-mar | 3073 | var pixelSize = function (table) { |
3074 | var getWidth = widthLookup(table, get$8); |
||
597 | daniel-mar | 3075 | var getCellDelta = identity; |
3076 | var singleColumnWidth = function (w, delta) { |
||
3077 | var newNext = Math.max(minWidth(), w + delta); |
||
3078 | return [newNext - w]; |
||
3079 | }; |
||
3080 | var adjustTableWidth = function (delta) { |
||
3081 | var newWidth = getWidth() + delta; |
||
3082 | setPixelWidth(table, newWidth); |
||
3083 | }; |
||
3084 | var getWidths = function (warehouse, tableSize) { |
||
3085 | return getPixelWidths(warehouse, table, tableSize); |
||
3086 | }; |
||
3087 | return { |
||
3088 | width: getWidth, |
||
3089 | pixelWidth: getWidth, |
||
3090 | getWidths: getWidths, |
||
3091 | getCellDelta: getCellDelta, |
||
3092 | singleColumnWidth: singleColumnWidth, |
||
3093 | minCellWidth: minWidth, |
||
3094 | setElementWidth: setPixelWidth, |
||
3095 | adjustTableWidth: adjustTableWidth, |
||
3096 | isRelative: false, |
||
3097 | label: 'pixel' |
||
3098 | }; |
||
3099 | }; |
||
3100 | var chooseSize = function (element, width) { |
||
3101 | var percentMatch = percentageBasedSizeRegex().exec(width); |
||
3102 | if (percentMatch !== null) { |
||
679 | daniel-mar | 3103 | return percentageSize(element); |
3104 | } else { |
||
3105 | return pixelSize(element); |
||
597 | daniel-mar | 3106 | } |
3107 | }; |
||
3108 | var getTableSize = function (table) { |
||
637 | daniel-mar | 3109 | var width = getRawWidth$1(table); |
597 | daniel-mar | 3110 | return width.fold(function () { |
3111 | return noneSize(table); |
||
3112 | }, function (w) { |
||
3113 | return chooseSize(table, w); |
||
3114 | }); |
||
3115 | }; |
||
3116 | var TableSize = { |
||
3117 | getTableSize: getTableSize, |
||
3118 | pixelSize: pixelSize, |
||
3119 | percentageSize: percentageSize, |
||
3120 | noneSize: noneSize |
||
3121 | }; |
||
3122 | |||
3123 | var statsStruct = function (minRow, minCol, maxRow, maxCol, allCells, selectedCells) { |
||
3124 | return { |
||
3125 | minRow: minRow, |
||
3126 | minCol: minCol, |
||
3127 | maxRow: maxRow, |
||
3128 | maxCol: maxCol, |
||
3129 | allCells: allCells, |
||
3130 | selectedCells: selectedCells |
||
3131 | }; |
||
3132 | }; |
||
3133 | var findSelectedStats = function (house, isSelected) { |
||
3134 | var totalColumns = house.grid.columns; |
||
3135 | var totalRows = house.grid.rows; |
||
3136 | var minRow = totalRows; |
||
3137 | var minCol = totalColumns; |
||
3138 | var maxRow = 0; |
||
3139 | var maxCol = 0; |
||
3140 | var allCells = []; |
||
3141 | var selectedCells = []; |
||
3142 | each$1(house.access, function (detail) { |
||
3143 | allCells.push(detail); |
||
3144 | if (isSelected(detail)) { |
||
3145 | selectedCells.push(detail); |
||
3146 | var startRow = detail.row; |
||
3147 | var endRow = startRow + detail.rowspan - 1; |
||
3148 | var startCol = detail.column; |
||
3149 | var endCol = startCol + detail.colspan - 1; |
||
3150 | if (startRow < minRow) { |
||
3151 | minRow = startRow; |
||
3152 | } else if (endRow > maxRow) { |
||
3153 | maxRow = endRow; |
||
3154 | } |
||
3155 | if (startCol < minCol) { |
||
3156 | minCol = startCol; |
||
3157 | } else if (endCol > maxCol) { |
||
3158 | maxCol = endCol; |
||
3159 | } |
||
3160 | } |
||
3161 | }); |
||
3162 | return statsStruct(minRow, minCol, maxRow, maxCol, allCells, selectedCells); |
||
3163 | }; |
||
3164 | var makeCell = function (list, seenSelected, rowIndex) { |
||
3165 | var row = list[rowIndex].element; |
||
3166 | var td = SugarElement.fromTag('td'); |
||
637 | daniel-mar | 3167 | append$1(td, SugarElement.fromTag('br')); |
3168 | var f = seenSelected ? append$1 : prepend; |
||
597 | daniel-mar | 3169 | f(row, td); |
3170 | }; |
||
3171 | var fillInGaps = function (list, house, stats, isSelected) { |
||
3172 | var totalColumns = house.grid.columns; |
||
3173 | var totalRows = house.grid.rows; |
||
3174 | for (var i = 0; i < totalRows; i++) { |
||
3175 | var seenSelected = false; |
||
3176 | for (var j = 0; j < totalColumns; j++) { |
||
3177 | if (!(i < stats.minRow || i > stats.maxRow || j < stats.minCol || j > stats.maxCol)) { |
||
3178 | var needCell = Warehouse.getAt(house, i, j).filter(isSelected).isNone(); |
||
3179 | if (needCell) { |
||
3180 | makeCell(list, seenSelected, i); |
||
3181 | } else { |
||
3182 | seenSelected = true; |
||
3183 | } |
||
3184 | } |
||
3185 | } |
||
3186 | } |
||
3187 | }; |
||
3188 | var clean = function (replica, stats, house, widthDelta) { |
||
3189 | each$1(house.columns, function (col) { |
||
3190 | if (col.column < stats.minCol || col.column > stats.maxCol) { |
||
637 | daniel-mar | 3191 | remove$5(col.element); |
597 | daniel-mar | 3192 | } |
3193 | }); |
||
637 | daniel-mar | 3194 | var emptyRows = filter$2(firstLayer(replica, 'tr'), function (row) { |
597 | daniel-mar | 3195 | return row.dom.childElementCount === 0; |
3196 | }); |
||
637 | daniel-mar | 3197 | each$2(emptyRows, remove$5); |
597 | daniel-mar | 3198 | if (stats.minCol === stats.maxCol || stats.minRow === stats.maxRow) { |
637 | daniel-mar | 3199 | each$2(firstLayer(replica, 'th,td'), function (cell) { |
3200 | remove$7(cell, 'rowspan'); |
||
3201 | remove$7(cell, 'colspan'); |
||
597 | daniel-mar | 3202 | }); |
3203 | } |
||
637 | daniel-mar | 3204 | remove$7(replica, LOCKED_COL_ATTR); |
3205 | remove$7(replica, 'data-snooker-col-series'); |
||
597 | daniel-mar | 3206 | var tableSize = TableSize.getTableSize(replica); |
3207 | tableSize.adjustTableWidth(widthDelta); |
||
3208 | }; |
||
3209 | var getTableWidthDelta = function (table, warehouse, tableSize, stats) { |
||
3210 | if (stats.minCol === 0 && warehouse.grid.columns === stats.maxCol + 1) { |
||
3211 | return 0; |
||
3212 | } |
||
3213 | var colWidths = getPixelWidths(warehouse, table, tableSize); |
||
3214 | var allColsWidth = foldl(colWidths, function (acc, width) { |
||
3215 | return acc + width; |
||
3216 | }, 0); |
||
3217 | var selectedColsWidth = foldl(colWidths.slice(stats.minCol, stats.maxCol + 1), function (acc, width) { |
||
3218 | return acc + width; |
||
3219 | }, 0); |
||
3220 | var newWidth = selectedColsWidth / allColsWidth * tableSize.pixelWidth(); |
||
3221 | var delta = newWidth - tableSize.pixelWidth(); |
||
3222 | return tableSize.getCellDelta(delta); |
||
3223 | }; |
||
637 | daniel-mar | 3224 | var extract$1 = function (table, selectedSelector) { |
597 | daniel-mar | 3225 | var isSelected = function (detail) { |
637 | daniel-mar | 3226 | return is$2(detail.element, selectedSelector); |
597 | daniel-mar | 3227 | }; |
3228 | var replica = deep(table); |
||
637 | daniel-mar | 3229 | var list = fromTable$1(replica); |
597 | daniel-mar | 3230 | var tableSize = TableSize.getTableSize(table); |
3231 | var replicaHouse = Warehouse.generate(list); |
||
3232 | var replicaStats = findSelectedStats(replicaHouse, isSelected); |
||
3233 | var selector = 'th:not(' + selectedSelector + ')' + ',td:not(' + selectedSelector + ')'; |
||
3234 | var unselectedCells = filterFirstLayer(replica, 'th,td', function (cell) { |
||
637 | daniel-mar | 3235 | return is$2(cell, selector); |
597 | daniel-mar | 3236 | }); |
637 | daniel-mar | 3237 | each$2(unselectedCells, remove$5); |
597 | daniel-mar | 3238 | fillInGaps(list, replicaHouse, replicaStats, isSelected); |
3239 | var house = Warehouse.fromTable(table); |
||
3240 | var widthDelta = getTableWidthDelta(table, house, tableSize, replicaStats); |
||
3241 | clean(replica, replicaStats, replicaHouse, widthDelta); |
||
3242 | return replica; |
||
3243 | }; |
||
3244 | |||
3245 | var nbsp = '\xA0'; |
||
3246 | |||
3247 | var getEnd = function (element) { |
||
3248 | return name(element) === 'img' ? 1 : getOption(element).fold(function () { |
||
637 | daniel-mar | 3249 | return children$3(element).length; |
597 | daniel-mar | 3250 | }, function (v) { |
3251 | return v.length; |
||
3252 | }); |
||
3253 | }; |
||
3254 | var isTextNodeWithCursorPosition = function (el) { |
||
3255 | return getOption(el).filter(function (text) { |
||
3256 | return text.trim().length !== 0 || text.indexOf(nbsp) > -1; |
||
3257 | }).isSome(); |
||
3258 | }; |
||
3259 | var elementsWithCursorPosition = [ |
||
3260 | 'img', |
||
3261 | 'br' |
||
3262 | ]; |
||
3263 | var isCursorPosition = function (elem) { |
||
3264 | var hasCursorPosition = isTextNodeWithCursorPosition(elem); |
||
637 | daniel-mar | 3265 | return hasCursorPosition || contains$2(elementsWithCursorPosition, name(elem)); |
597 | daniel-mar | 3266 | }; |
3267 | |||
3268 | var first = function (element) { |
||
637 | daniel-mar | 3269 | return descendant$1(element, isCursorPosition); |
597 | daniel-mar | 3270 | }; |
3271 | var last$1 = function (element) { |
||
3272 | return descendantRtl(element, isCursorPosition); |
||
3273 | }; |
||
3274 | var descendantRtl = function (scope, predicate) { |
||
3275 | var descend = function (element) { |
||
637 | daniel-mar | 3276 | var children = children$3(element); |
3277 | for (var i = children.length - 1; i >= 0; i--) { |
||
3278 | var child = children[i]; |
||
597 | daniel-mar | 3279 | if (predicate(child)) { |
3280 | return Optional.some(child); |
||
3281 | } |
||
3282 | var res = descend(child); |
||
3283 | if (res.isSome()) { |
||
3284 | return res; |
||
3285 | } |
||
3286 | } |
||
3287 | return Optional.none(); |
||
3288 | }; |
||
3289 | return descend(scope); |
||
3290 | }; |
||
3291 | |||
3292 | var transferableAttributes = { |
||
3293 | scope: [ |
||
3294 | 'row', |
||
3295 | 'col' |
||
3296 | ] |
||
3297 | }; |
||
637 | daniel-mar | 3298 | var createCell = function (doc) { |
3299 | return function () { |
||
3300 | var td = SugarElement.fromTag('td', doc.dom); |
||
3301 | append$1(td, SugarElement.fromTag('br', doc.dom)); |
||
3302 | return td; |
||
3303 | }; |
||
597 | daniel-mar | 3304 | }; |
637 | daniel-mar | 3305 | var createCol = function (doc) { |
3306 | return function () { |
||
3307 | return SugarElement.fromTag('col', doc.dom); |
||
3308 | }; |
||
597 | daniel-mar | 3309 | }; |
637 | daniel-mar | 3310 | var createColgroup = function (doc) { |
3311 | return function () { |
||
3312 | return SugarElement.fromTag('colgroup', doc.dom); |
||
3313 | }; |
||
597 | daniel-mar | 3314 | }; |
637 | daniel-mar | 3315 | var createRow$1 = function (doc) { |
3316 | return function () { |
||
3317 | return SugarElement.fromTag('tr', doc.dom); |
||
3318 | }; |
||
3319 | }; |
||
3320 | var replace$1 = function (cell, tag, attrs) { |
||
597 | daniel-mar | 3321 | var replica = copy$1(cell, tag); |
3322 | each$1(attrs, function (v, k) { |
||
3323 | if (v === null) { |
||
637 | daniel-mar | 3324 | remove$7(replica, k); |
597 | daniel-mar | 3325 | } else { |
637 | daniel-mar | 3326 | set$2(replica, k, v); |
597 | daniel-mar | 3327 | } |
3328 | }); |
||
3329 | return replica; |
||
3330 | }; |
||
3331 | var pasteReplace = function (cell) { |
||
3332 | return cell; |
||
3333 | }; |
||
3334 | var cloneFormats = function (oldCell, newCell, formats) { |
||
3335 | var first$1 = first(oldCell); |
||
3336 | return first$1.map(function (firstText) { |
||
3337 | var formatSelector = formats.join(','); |
||
637 | daniel-mar | 3338 | var parents = ancestors$3(firstText, formatSelector, function (element) { |
597 | daniel-mar | 3339 | return eq$1(element, oldCell); |
3340 | }); |
||
3341 | return foldr(parents, function (last, parent) { |
||
3342 | var clonedFormat = shallow(parent); |
||
637 | daniel-mar | 3343 | remove$7(clonedFormat, 'contenteditable'); |
3344 | append$1(last, clonedFormat); |
||
597 | daniel-mar | 3345 | return clonedFormat; |
3346 | }, newCell); |
||
3347 | }).getOr(newCell); |
||
3348 | }; |
||
3349 | var cloneAppropriateAttributes = function (original, clone) { |
||
3350 | each$1(transferableAttributes, function (validAttributes, attributeName) { |
||
3351 | return getOpt(original, attributeName).filter(function (attribute) { |
||
637 | daniel-mar | 3352 | return contains$2(validAttributes, attribute); |
597 | daniel-mar | 3353 | }).each(function (attribute) { |
637 | daniel-mar | 3354 | return set$2(clone, attributeName, attribute); |
597 | daniel-mar | 3355 | }); |
3356 | }); |
||
3357 | }; |
||
3358 | var cellOperations = function (mutate, doc, formatsToClone) { |
||
3359 | var cloneCss = function (prev, clone) { |
||
637 | daniel-mar | 3360 | copy$2(prev.element, clone); |
3361 | remove$6(clone, 'height'); |
||
597 | daniel-mar | 3362 | if (prev.colspan !== 1) { |
637 | daniel-mar | 3363 | remove$6(clone, 'width'); |
597 | daniel-mar | 3364 | } |
3365 | }; |
||
3366 | var newCell = function (prev) { |
||
637 | daniel-mar | 3367 | var td = SugarElement.fromTag(name(prev.element), doc.dom); |
597 | daniel-mar | 3368 | var formats = formatsToClone.getOr([ |
3369 | 'strong', |
||
3370 | 'em', |
||
3371 | 'b', |
||
3372 | 'i', |
||
3373 | 'span', |
||
3374 | 'font', |
||
3375 | 'h1', |
||
3376 | 'h2', |
||
3377 | 'h3', |
||
3378 | 'h4', |
||
3379 | 'h5', |
||
3380 | 'h6', |
||
3381 | 'p', |
||
3382 | 'div' |
||
3383 | ]); |
||
3384 | var lastNode = formats.length > 0 ? cloneFormats(prev.element, td, formats) : td; |
||
637 | daniel-mar | 3385 | append$1(lastNode, SugarElement.fromTag('br')); |
597 | daniel-mar | 3386 | cloneCss(prev, td); |
3387 | cloneAppropriateAttributes(prev.element, td); |
||
3388 | mutate(prev.element, td); |
||
3389 | return td; |
||
3390 | }; |
||
3391 | var newCol = function (prev) { |
||
3392 | var col = SugarElement.fromTag(name(prev.element), doc.dom); |
||
3393 | cloneCss(prev, col); |
||
3394 | mutate(prev.element, col); |
||
3395 | return col; |
||
3396 | }; |
||
3397 | return { |
||
3398 | col: newCol, |
||
637 | daniel-mar | 3399 | colgroup: createColgroup(doc), |
3400 | row: createRow$1(doc), |
||
597 | daniel-mar | 3401 | cell: newCell, |
637 | daniel-mar | 3402 | replace: replace$1, |
679 | daniel-mar | 3403 | colGap: createCol(doc), |
637 | daniel-mar | 3404 | gap: createCell(doc) |
597 | daniel-mar | 3405 | }; |
3406 | }; |
||
637 | daniel-mar | 3407 | var paste$1 = function (doc) { |
597 | daniel-mar | 3408 | return { |
637 | daniel-mar | 3409 | col: createCol(doc), |
3410 | colgroup: createColgroup(doc), |
||
3411 | row: createRow$1(doc), |
||
3412 | cell: createCell(doc), |
||
597 | daniel-mar | 3413 | replace: pasteReplace, |
679 | daniel-mar | 3414 | colGap: createCol(doc), |
637 | daniel-mar | 3415 | gap: createCell(doc) |
597 | daniel-mar | 3416 | }; |
3417 | }; |
||
3418 | |||
637 | daniel-mar | 3419 | var fromHtml = function (html, scope) { |
597 | daniel-mar | 3420 | var doc = scope || document; |
3421 | var div = doc.createElement('div'); |
||
3422 | div.innerHTML = html; |
||
637 | daniel-mar | 3423 | return children$3(SugarElement.fromDom(div)); |
597 | daniel-mar | 3424 | }; |
637 | daniel-mar | 3425 | var fromDom = function (nodes) { |
3426 | return map$1(nodes, SugarElement.fromDom); |
||
597 | daniel-mar | 3427 | }; |
3428 | |||
3429 | var getNodeName = function (elm) { |
||
3430 | return elm.nodeName.toLowerCase(); |
||
3431 | }; |
||
637 | daniel-mar | 3432 | var getBody = function (editor) { |
597 | daniel-mar | 3433 | return SugarElement.fromDom(editor.getBody()); |
3434 | }; |
||
637 | daniel-mar | 3435 | var getPixelWidth = function (elm) { |
597 | daniel-mar | 3436 | return elm.getBoundingClientRect().width; |
3437 | }; |
||
3438 | var getPixelHeight = function (elm) { |
||
3439 | return elm.getBoundingClientRect().height; |
||
3440 | }; |
||
3441 | var getIsRoot = function (editor) { |
||
3442 | return function (element) { |
||
637 | daniel-mar | 3443 | return eq$1(element, getBody(editor)); |
597 | daniel-mar | 3444 | }; |
3445 | }; |
||
3446 | var removePxSuffix = function (size) { |
||
3447 | return size ? size.replace(/px$/, '') : ''; |
||
3448 | }; |
||
3449 | var addPxSuffix = function (size) { |
||
3450 | return /^\d+(\.\d+)?$/.test(size) ? size + 'px' : size; |
||
3451 | }; |
||
3452 | var removeDataStyle = function (table) { |
||
637 | daniel-mar | 3453 | remove$7(table, 'data-mce-style'); |
597 | daniel-mar | 3454 | var removeStyleAttribute = function (element) { |
637 | daniel-mar | 3455 | return remove$7(element, 'data-mce-style'); |
597 | daniel-mar | 3456 | }; |
637 | daniel-mar | 3457 | each$2(cells$1(table), removeStyleAttribute); |
3458 | each$2(columns$1(table), removeStyleAttribute); |
||
679 | daniel-mar | 3459 | each$2(rows$1(table), removeStyleAttribute); |
597 | daniel-mar | 3460 | }; |
637 | daniel-mar | 3461 | var getRawWidth = function (editor, elm) { |
597 | daniel-mar | 3462 | var raw = editor.dom.getStyle(elm, 'width') || editor.dom.getAttrib(elm, 'width'); |
3463 | return Optional.from(raw).filter(isNotEmpty); |
||
3464 | }; |
||
637 | daniel-mar | 3465 | var isPercentage$1 = function (value) { |
597 | daniel-mar | 3466 | return /^(\d+(\.\d+)?)%$/.test(value); |
3467 | }; |
||
3468 | var isPixel = function (value) { |
||
3469 | return /^(\d+(\.\d+)?)px$/.test(value); |
||
3470 | }; |
||
3471 | var getSelectionStart = function (editor) { |
||
3472 | return SugarElement.fromDom(editor.selection.getStart()); |
||
3473 | }; |
||
637 | daniel-mar | 3474 | var getSelectionEnd = function (editor) { |
3475 | return SugarElement.fromDom(editor.selection.getEnd()); |
||
3476 | }; |
||
597 | daniel-mar | 3477 | |
3478 | var selection = function (selections) { |
||
637 | daniel-mar | 3479 | return cata$2(selections.get(), constant([]), identity, pure); |
597 | daniel-mar | 3480 | }; |
3481 | var unmergable = function (selections) { |
||
3482 | var hasSpan = function (elem, type) { |
||
3483 | return getOpt(elem, type).exists(function (span) { |
||
3484 | return parseInt(span, 10) > 1; |
||
3485 | }); |
||
3486 | }; |
||
3487 | var hasRowOrColSpan = function (elem) { |
||
3488 | return hasSpan(elem, 'rowspan') || hasSpan(elem, 'colspan'); |
||
3489 | }; |
||
3490 | var candidates = selection(selections); |
||
3491 | return candidates.length > 0 && forall(candidates, hasRowOrColSpan) ? Optional.some(candidates) : Optional.none(); |
||
3492 | }; |
||
3493 | var mergable = function (table, selections, ephemera) { |
||
637 | daniel-mar | 3494 | return cata$2(selections.get(), Optional.none, function (cells) { |
597 | daniel-mar | 3495 | if (cells.length <= 1) { |
3496 | return Optional.none(); |
||
3497 | } else { |
||
3498 | return retrieveBox(table, ephemera.firstSelectedSelector, ephemera.lastSelectedSelector).map(function (bounds) { |
||
3499 | return { |
||
3500 | bounds: bounds, |
||
3501 | cells: cells |
||
3502 | }; |
||
3503 | }); |
||
3504 | } |
||
3505 | }, Optional.none); |
||
3506 | }; |
||
3507 | |||
3508 | var strSelected = 'data-mce-selected'; |
||
3509 | var strSelectedSelector = 'td[' + strSelected + '],th[' + strSelected + ']'; |
||
3510 | var strAttributeSelector = '[' + strSelected + ']'; |
||
3511 | var strFirstSelected = 'data-mce-first-selected'; |
||
3512 | var strFirstSelectedSelector = 'td[' + strFirstSelected + '],th[' + strFirstSelected + ']'; |
||
3513 | var strLastSelected = 'data-mce-last-selected'; |
||
3514 | var strLastSelectedSelector = 'td[' + strLastSelected + '],th[' + strLastSelected + ']'; |
||
3515 | var attributeSelector = strAttributeSelector; |
||
3516 | var ephemera = { |
||
3517 | selected: strSelected, |
||
3518 | selectedSelector: strSelectedSelector, |
||
3519 | firstSelected: strFirstSelected, |
||
3520 | firstSelectedSelector: strFirstSelectedSelector, |
||
3521 | lastSelected: strLastSelected, |
||
3522 | lastSelectedSelector: strLastSelectedSelector |
||
3523 | }; |
||
3524 | |||
3525 | var noMenu = function (cell) { |
||
3526 | return { |
||
3527 | element: cell, |
||
3528 | mergable: Optional.none(), |
||
3529 | unmergable: Optional.none(), |
||
3530 | selection: [cell] |
||
3531 | }; |
||
3532 | }; |
||
3533 | var forMenu = function (selections, table, cell) { |
||
3534 | return { |
||
3535 | element: cell, |
||
3536 | mergable: mergable(table, selections, ephemera), |
||
3537 | unmergable: unmergable(selections), |
||
3538 | selection: selection(selections) |
||
3539 | }; |
||
3540 | }; |
||
637 | daniel-mar | 3541 | var paste = function (element, clipboard, generators) { |
597 | daniel-mar | 3542 | return { |
3543 | element: element, |
||
3544 | clipboard: clipboard, |
||
3545 | generators: generators |
||
3546 | }; |
||
3547 | }; |
||
3548 | var pasteRows = function (selections, cell, clipboard, generators) { |
||
3549 | return { |
||
3550 | selection: selection(selections), |
||
3551 | clipboard: clipboard, |
||
3552 | generators: generators |
||
3553 | }; |
||
3554 | }; |
||
3555 | |||
637 | daniel-mar | 3556 | var getSelectionCellFallback = function (element) { |
3557 | return table(element).bind(function (table) { |
||
3558 | return retrieve(table, ephemera.firstSelectedSelector); |
||
3559 | }).fold(constant(element), function (cells) { |
||
3560 | return cells[0]; |
||
3561 | }); |
||
3562 | }; |
||
3563 | var getSelectionFromSelector = function (selector) { |
||
3564 | return function (initCell, isRoot) { |
||
3565 | var cellName = name(initCell); |
||
3566 | var cell = cellName === 'col' || cellName === 'colgroup' ? getSelectionCellFallback(initCell) : initCell; |
||
3567 | return closest$1(cell, selector, isRoot); |
||
3568 | }; |
||
3569 | }; |
||
3570 | var getSelectionCellOrCaption = getSelectionFromSelector('th,td,caption'); |
||
3571 | var getSelectionCell = getSelectionFromSelector('th,td'); |
||
3572 | var getCellsFromSelection = function (selections) { |
||
3573 | return selection(selections); |
||
3574 | }; |
||
3575 | var getRowsFromSelection = function (selected, selector) { |
||
3576 | var cellOpt = getSelectionCell(selected); |
||
3577 | var rowsOpt = cellOpt.bind(function (cell) { |
||
3578 | return table(cell); |
||
3579 | }).map(function (table) { |
||
3580 | return rows$1(table); |
||
3581 | }); |
||
3582 | return lift2(cellOpt, rowsOpt, function (cell, rows) { |
||
3583 | return filter$2(rows, function (row) { |
||
3584 | return exists(fromDom(row.dom.cells), function (rowCell) { |
||
3585 | return get$b(rowCell, selector) === '1' || eq$1(rowCell, cell); |
||
3586 | }); |
||
3587 | }); |
||
3588 | }).getOr([]); |
||
3589 | }; |
||
3590 | |||
597 | daniel-mar | 3591 | var extractSelected = function (cells) { |
3592 | return table(cells[0]).map(function (table) { |
||
637 | daniel-mar | 3593 | var replica = extract$1(table, attributeSelector); |
597 | daniel-mar | 3594 | removeDataStyle(replica); |
3595 | return [replica]; |
||
3596 | }); |
||
3597 | }; |
||
3598 | var serializeElements = function (editor, elements) { |
||
637 | daniel-mar | 3599 | return map$1(elements, function (elm) { |
597 | daniel-mar | 3600 | return editor.selection.serializer.serialize(elm.dom, {}); |
3601 | }).join(''); |
||
3602 | }; |
||
3603 | var getTextContent = function (elements) { |
||
637 | daniel-mar | 3604 | return map$1(elements, function (element) { |
597 | daniel-mar | 3605 | return element.dom.innerText; |
3606 | }).join(''); |
||
3607 | }; |
||
637 | daniel-mar | 3608 | var registerEvents = function (editor, selections, actions) { |
597 | daniel-mar | 3609 | editor.on('BeforeGetContent', function (e) { |
3610 | var multiCellContext = function (cells) { |
||
3611 | e.preventDefault(); |
||
3612 | extractSelected(cells).each(function (elements) { |
||
3613 | e.content = e.format === 'text' ? getTextContent(elements) : serializeElements(editor, elements); |
||
3614 | }); |
||
3615 | }; |
||
3616 | if (e.selection === true) { |
||
637 | daniel-mar | 3617 | cata$2(selections.get(), noop, multiCellContext, noop); |
597 | daniel-mar | 3618 | } |
3619 | }); |
||
3620 | editor.on('BeforeSetContent', function (e) { |
||
3621 | if (e.selection === true && e.paste === true) { |
||
637 | daniel-mar | 3622 | var selectedCells = getCellsFromSelection(selections); |
3623 | head(selectedCells).each(function (cell) { |
||
597 | daniel-mar | 3624 | table(cell).each(function (table) { |
637 | daniel-mar | 3625 | var elements = filter$2(fromHtml(e.content), function (content) { |
597 | daniel-mar | 3626 | return name(content) !== 'meta'; |
3627 | }); |
||
637 | daniel-mar | 3628 | var isTable = isTag('table'); |
597 | daniel-mar | 3629 | if (elements.length === 1 && isTable(elements[0])) { |
3630 | e.preventDefault(); |
||
3631 | var doc = SugarElement.fromDom(editor.getDoc()); |
||
637 | daniel-mar | 3632 | var generators = paste$1(doc); |
3633 | var targets = paste(cell, elements[0], generators); |
||
3634 | actions.pasteCells(table, targets).each(function () { |
||
597 | daniel-mar | 3635 | editor.focus(); |
3636 | }); |
||
3637 | } |
||
3638 | }); |
||
3639 | }); |
||
3640 | } |
||
3641 | }); |
||
3642 | }; |
||
3643 | |||
637 | daniel-mar | 3644 | var adt$7 = Adt.generate([ |
597 | daniel-mar | 3645 | { none: [] }, |
3646 | { only: ['index'] }, |
||
3647 | { |
||
3648 | left: [ |
||
3649 | 'index', |
||
3650 | 'next' |
||
3651 | ] |
||
3652 | }, |
||
3653 | { |
||
3654 | middle: [ |
||
3655 | 'prev', |
||
3656 | 'index', |
||
3657 | 'next' |
||
3658 | ] |
||
3659 | }, |
||
3660 | { |
||
3661 | right: [ |
||
3662 | 'prev', |
||
3663 | 'index' |
||
3664 | ] |
||
3665 | } |
||
3666 | ]); |
||
637 | daniel-mar | 3667 | var ColumnContext = __assign({}, adt$7); |
597 | daniel-mar | 3668 | |
3669 | var neighbours = function (input, index) { |
||
3670 | if (input.length === 0) { |
||
3671 | return ColumnContext.none(); |
||
3672 | } |
||
3673 | if (input.length === 1) { |
||
3674 | return ColumnContext.only(0); |
||
3675 | } |
||
3676 | if (index === 0) { |
||
3677 | return ColumnContext.left(0, 1); |
||
3678 | } |
||
3679 | if (index === input.length - 1) { |
||
3680 | return ColumnContext.right(index - 1, index); |
||
3681 | } |
||
3682 | if (index > 0 && index < input.length - 1) { |
||
3683 | return ColumnContext.middle(index - 1, index, index + 1); |
||
3684 | } |
||
3685 | return ColumnContext.none(); |
||
3686 | }; |
||
3687 | var determine = function (input, column, step, tableSize, resize) { |
||
3688 | var result = input.slice(0); |
||
3689 | var context = neighbours(input, column); |
||
637 | daniel-mar | 3690 | var onNone = constant(map$1(result, constant(0))); |
597 | daniel-mar | 3691 | var onOnly = function (index) { |
3692 | return tableSize.singleColumnWidth(result[index], step); |
||
3693 | }; |
||
3694 | var onLeft = function (index, next) { |
||
3695 | return resize.calcLeftEdgeDeltas(result, index, next, step, tableSize.minCellWidth(), tableSize.isRelative); |
||
3696 | }; |
||
3697 | var onMiddle = function (prev, index, next) { |
||
3698 | return resize.calcMiddleDeltas(result, prev, index, next, step, tableSize.minCellWidth(), tableSize.isRelative); |
||
3699 | }; |
||
3700 | var onRight = function (prev, index) { |
||
3701 | return resize.calcRightEdgeDeltas(result, prev, index, step, tableSize.minCellWidth(), tableSize.isRelative); |
||
3702 | }; |
||
3703 | return context.fold(onNone, onOnly, onLeft, onMiddle, onRight); |
||
3704 | }; |
||
3705 | |||
3706 | var total = function (start, end, measures) { |
||
3707 | var r = 0; |
||
3708 | for (var i = start; i < end; i++) { |
||
3709 | r += measures[i] !== undefined ? measures[i] : 0; |
||
3710 | } |
||
3711 | return r; |
||
3712 | }; |
||
3713 | var recalculateWidthForCells = function (warehouse, widths) { |
||
3714 | var all = Warehouse.justCells(warehouse); |
||
637 | daniel-mar | 3715 | return map$1(all, function (cell) { |
597 | daniel-mar | 3716 | var width = total(cell.column, cell.column + cell.colspan, widths); |
3717 | return { |
||
3718 | element: cell.element, |
||
3719 | width: width, |
||
3720 | colspan: cell.colspan |
||
3721 | }; |
||
3722 | }); |
||
3723 | }; |
||
3724 | var recalculateWidthForColumns = function (warehouse, widths) { |
||
3725 | var groups = Warehouse.justColumns(warehouse); |
||
637 | daniel-mar | 3726 | return map$1(groups, function (column, index) { |
597 | daniel-mar | 3727 | return { |
3728 | element: column.element, |
||
3729 | width: widths[index], |
||
3730 | colspan: column.colspan |
||
3731 | }; |
||
3732 | }); |
||
3733 | }; |
||
3734 | var recalculateHeightForCells = function (warehouse, heights) { |
||
3735 | var all = Warehouse.justCells(warehouse); |
||
637 | daniel-mar | 3736 | return map$1(all, function (cell) { |
597 | daniel-mar | 3737 | var height = total(cell.row, cell.row + cell.rowspan, heights); |
3738 | return { |
||
3739 | element: cell.element, |
||
3740 | height: height, |
||
3741 | rowspan: cell.rowspan |
||
3742 | }; |
||
3743 | }); |
||
3744 | }; |
||
3745 | var matchRowHeight = function (warehouse, heights) { |
||
637 | daniel-mar | 3746 | return map$1(warehouse.all, function (row, i) { |
597 | daniel-mar | 3747 | return { |
3748 | element: row.element, |
||
3749 | height: heights[i] |
||
3750 | }; |
||
3751 | }); |
||
3752 | }; |
||
3753 | |||
3754 | var sumUp = function (newSize) { |
||
3755 | return foldr(newSize, function (b, a) { |
||
3756 | return b + a; |
||
3757 | }, 0); |
||
3758 | }; |
||
3759 | var recalculate = function (warehouse, widths) { |
||
3760 | if (Warehouse.hasColumns(warehouse)) { |
||
3761 | return recalculateWidthForColumns(warehouse, widths); |
||
3762 | } else { |
||
3763 | return recalculateWidthForCells(warehouse, widths); |
||
3764 | } |
||
3765 | }; |
||
3766 | var recalculateAndApply = function (warehouse, widths, tableSize) { |
||
3767 | var newSizes = recalculate(warehouse, widths); |
||
637 | daniel-mar | 3768 | each$2(newSizes, function (cell) { |
597 | daniel-mar | 3769 | tableSize.setElementWidth(cell.element, cell.width); |
3770 | }); |
||
3771 | }; |
||
3772 | var adjustWidth = function (table, delta, index, resizing, tableSize) { |
||
3773 | var warehouse = Warehouse.fromTable(table); |
||
3774 | var step = tableSize.getCellDelta(delta); |
||
3775 | var widths = tableSize.getWidths(warehouse, tableSize); |
||
3776 | var isLastColumn = index === warehouse.grid.columns - 1; |
||
3777 | var clampedStep = resizing.clampTableDelta(widths, index, step, tableSize.minCellWidth(), isLastColumn); |
||
3778 | var deltas = determine(widths, index, clampedStep, tableSize, resizing); |
||
637 | daniel-mar | 3779 | var newWidths = map$1(deltas, function (dx, i) { |
597 | daniel-mar | 3780 | return dx + widths[i]; |
3781 | }); |
||
3782 | recalculateAndApply(warehouse, newWidths, tableSize); |
||
3783 | resizing.resizeTable(tableSize.adjustTableWidth, clampedStep, isLastColumn); |
||
3784 | }; |
||
3785 | var adjustHeight = function (table, delta, index, direction) { |
||
3786 | var warehouse = Warehouse.fromTable(table); |
||
3787 | var heights = getPixelHeights(warehouse, table, direction); |
||
637 | daniel-mar | 3788 | var newHeights = map$1(heights, function (dy, i) { |
597 | daniel-mar | 3789 | return index === i ? Math.max(delta + dy, minHeight()) : dy; |
3790 | }); |
||
3791 | var newCellSizes = recalculateHeightForCells(warehouse, newHeights); |
||
3792 | var newRowSizes = matchRowHeight(warehouse, newHeights); |
||
637 | daniel-mar | 3793 | each$2(newRowSizes, function (row) { |
597 | daniel-mar | 3794 | setHeight(row.element, row.height); |
3795 | }); |
||
637 | daniel-mar | 3796 | each$2(newCellSizes, function (cell) { |
597 | daniel-mar | 3797 | setHeight(cell.element, cell.height); |
3798 | }); |
||
3799 | var total = sumUp(newHeights); |
||
3800 | setHeight(table, total); |
||
3801 | }; |
||
637 | daniel-mar | 3802 | var adjustAndRedistributeWidths$1 = function (_table, list, details, tableSize, resizeBehaviour) { |
597 | daniel-mar | 3803 | var warehouse = Warehouse.generate(list); |
3804 | var sizes = tableSize.getWidths(warehouse, tableSize); |
||
3805 | var tablePixelWidth = tableSize.pixelWidth(); |
||
3806 | var _a = resizeBehaviour.calcRedestributedWidths(sizes, tablePixelWidth, details.pixelDelta, tableSize.isRelative), newSizes = _a.newSizes, delta = _a.delta; |
||
3807 | recalculateAndApply(warehouse, newSizes, tableSize); |
||
3808 | tableSize.adjustTableWidth(delta); |
||
3809 | }; |
||
3810 | var adjustWidthTo = function (_table, list, _info, tableSize) { |
||
3811 | var warehouse = Warehouse.generate(list); |
||
3812 | var widths = tableSize.getWidths(warehouse, tableSize); |
||
3813 | recalculateAndApply(warehouse, widths, tableSize); |
||
3814 | }; |
||
3815 | |||
3816 | var zero = function (array) { |
||
637 | daniel-mar | 3817 | return map$1(array, constant(0)); |
597 | daniel-mar | 3818 | }; |
3819 | var surround = function (sizes, startIndex, endIndex, results, f) { |
||
3820 | return f(sizes.slice(0, startIndex)).concat(results).concat(f(sizes.slice(endIndex))); |
||
3821 | }; |
||
3822 | var clampDeltaHelper = function (predicate) { |
||
3823 | return function (sizes, index, delta, minCellSize) { |
||
3824 | if (!predicate(delta)) { |
||
3825 | return delta; |
||
3826 | } else { |
||
3827 | var newSize = Math.max(minCellSize, sizes[index] - Math.abs(delta)); |
||
3828 | var diff = Math.abs(newSize - sizes[index]); |
||
3829 | return delta >= 0 ? diff : -diff; |
||
3830 | } |
||
3831 | }; |
||
3832 | }; |
||
3833 | var clampNegativeDelta = clampDeltaHelper(function (delta) { |
||
3834 | return delta < 0; |
||
3835 | }); |
||
3836 | var clampDelta = clampDeltaHelper(always); |
||
3837 | var resizeTable = function () { |
||
3838 | var calcFixedDeltas = function (sizes, index, next, delta, minCellSize) { |
||
3839 | var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize); |
||
3840 | return surround(sizes, index, next + 1, [ |
||
3841 | clampedDelta, |
||
3842 | |||
3843 | ], zero); |
||
3844 | }; |
||
3845 | var calcRelativeDeltas = function (sizes, index, delta, minCellSize) { |
||
3846 | var ratio = (100 + delta) / 100; |
||
3847 | var newThis = Math.max(minCellSize, (sizes[index] + delta) / ratio); |
||
637 | daniel-mar | 3848 | return map$1(sizes, function (size, idx) { |
597 | daniel-mar | 3849 | var newSize = idx === index ? newThis : size / ratio; |
3850 | return newSize - size; |
||
3851 | }); |
||
3852 | }; |
||
3853 | var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize, isRelative) { |
||
3854 | if (isRelative) { |
||
3855 | return calcRelativeDeltas(sizes, index, delta, minCellSize); |
||
3856 | } else { |
||
3857 | return calcFixedDeltas(sizes, index, next, delta, minCellSize); |
||
3858 | } |
||
3859 | }; |
||
3860 | var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize, isRelative) { |
||
3861 | return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize, isRelative); |
||
3862 | }; |
||
3863 | var resizeTable = function (resizer, delta) { |
||
3864 | return resizer(delta); |
||
3865 | }; |
||
3866 | var calcRightEdgeDeltas = function (sizes, _prev, index, delta, minCellSize, isRelative) { |
||
3867 | if (isRelative) { |
||
3868 | return calcRelativeDeltas(sizes, index, delta, minCellSize); |
||
3869 | } else { |
||
3870 | var clampedDelta = clampNegativeDelta(sizes, index, delta, minCellSize); |
||
3871 | return zero(sizes.slice(0, index)).concat([clampedDelta]); |
||
3872 | } |
||
3873 | }; |
||
3874 | var calcRedestributedWidths = function (sizes, totalWidth, pixelDelta, isRelative) { |
||
3875 | if (isRelative) { |
||
3876 | var tableWidth = totalWidth + pixelDelta; |
||
3877 | var ratio_1 = tableWidth / totalWidth; |
||
637 | daniel-mar | 3878 | var newSizes = map$1(sizes, function (size) { |
597 | daniel-mar | 3879 | return size / ratio_1; |
3880 | }); |
||
3881 | return { |
||
3882 | delta: ratio_1 * 100 - 100, |
||
3883 | newSizes: newSizes |
||
3884 | }; |
||
3885 | } else { |
||
3886 | return { |
||
3887 | delta: pixelDelta, |
||
3888 | newSizes: sizes |
||
3889 | }; |
||
3890 | } |
||
3891 | }; |
||
3892 | return { |
||
3893 | resizeTable: resizeTable, |
||
3894 | clampTableDelta: clampNegativeDelta, |
||
3895 | calcLeftEdgeDeltas: calcLeftEdgeDeltas, |
||
3896 | calcMiddleDeltas: calcMiddleDeltas, |
||
3897 | calcRightEdgeDeltas: calcRightEdgeDeltas, |
||
3898 | calcRedestributedWidths: calcRedestributedWidths |
||
3899 | }; |
||
3900 | }; |
||
3901 | var preserveTable = function () { |
||
3902 | var calcLeftEdgeDeltas = function (sizes, index, next, delta, minCellSize) { |
||
3903 | var idx = delta >= 0 ? next : index; |
||
3904 | var clampedDelta = clampDelta(sizes, idx, delta, minCellSize); |
||
3905 | return surround(sizes, index, next + 1, [ |
||
3906 | clampedDelta, |
||
3907 | -clampedDelta |
||
3908 | ], zero); |
||
3909 | }; |
||
3910 | var calcMiddleDeltas = function (sizes, _prev, index, next, delta, minCellSize) { |
||
3911 | return calcLeftEdgeDeltas(sizes, index, next, delta, minCellSize); |
||
3912 | }; |
||
3913 | var resizeTable = function (resizer, delta, isLastColumn) { |
||
3914 | if (isLastColumn) { |
||
3915 | resizer(delta); |
||
3916 | } |
||
3917 | }; |
||
3918 | var calcRightEdgeDeltas = function (sizes, _prev, _index, delta, _minCellSize, isRelative) { |
||
3919 | if (isRelative) { |
||
3920 | return zero(sizes); |
||
3921 | } else { |
||
3922 | var diff = delta / sizes.length; |
||
637 | daniel-mar | 3923 | return map$1(sizes, constant(diff)); |
597 | daniel-mar | 3924 | } |
3925 | }; |
||
3926 | var clampTableDelta = function (sizes, index, delta, minCellSize, isLastColumn) { |
||
3927 | if (isLastColumn) { |
||
3928 | if (delta >= 0) { |
||
3929 | return delta; |
||
3930 | } else { |
||
3931 | var maxDelta = foldl(sizes, function (a, b) { |
||
3932 | return a + b - minCellSize; |
||
3933 | }, 0); |
||
3934 | return Math.max(-maxDelta, delta); |
||
3935 | } |
||
3936 | } else { |
||
3937 | return clampNegativeDelta(sizes, index, delta, minCellSize); |
||
3938 | } |
||
3939 | }; |
||
3940 | var calcRedestributedWidths = function (sizes, _totalWidth, _pixelDelta, _isRelative) { |
||
3941 | return { |
||
3942 | delta: 0, |
||
3943 | newSizes: sizes |
||
3944 | }; |
||
3945 | }; |
||
3946 | return { |
||
3947 | resizeTable: resizeTable, |
||
3948 | clampTableDelta: clampTableDelta, |
||
3949 | calcLeftEdgeDeltas: calcLeftEdgeDeltas, |
||
3950 | calcMiddleDeltas: calcMiddleDeltas, |
||
3951 | calcRightEdgeDeltas: calcRightEdgeDeltas, |
||
3952 | calcRedestributedWidths: calcRedestributedWidths |
||
3953 | }; |
||
3954 | }; |
||
3955 | |||
3956 | var only = function (element, isResizable) { |
||
3957 | var parent = Optional.from(element.dom.documentElement).map(SugarElement.fromDom).getOr(element); |
||
3958 | return { |
||
3959 | parent: constant(parent), |
||
3960 | view: constant(element), |
||
3961 | origin: constant(SugarPosition(0, 0)), |
||
3962 | isResizable: isResizable |
||
3963 | }; |
||
3964 | }; |
||
3965 | var detached = function (editable, chrome, isResizable) { |
||
3966 | var origin = function () { |
||
3967 | return absolute(chrome); |
||
3968 | }; |
||
3969 | return { |
||
3970 | parent: constant(chrome), |
||
3971 | view: constant(editable), |
||
3972 | origin: origin, |
||
3973 | isResizable: isResizable |
||
3974 | }; |
||
3975 | }; |
||
637 | daniel-mar | 3976 | var body = function (editable, chrome, isResizable) { |
597 | daniel-mar | 3977 | return { |
3978 | parent: constant(chrome), |
||
3979 | view: constant(editable), |
||
3980 | origin: constant(SugarPosition(0, 0)), |
||
3981 | isResizable: isResizable |
||
3982 | }; |
||
3983 | }; |
||
3984 | var ResizeWire = { |
||
3985 | only: only, |
||
3986 | detached: detached, |
||
637 | daniel-mar | 3987 | body: body |
597 | daniel-mar | 3988 | }; |
3989 | |||
637 | daniel-mar | 3990 | var adt$6 = Adt.generate([ |
597 | daniel-mar | 3991 | { invalid: ['raw'] }, |
3992 | { pixels: ['value'] }, |
||
3993 | { percent: ['value'] } |
||
3994 | ]); |
||
3995 | var validateFor = function (suffix, type, value) { |
||
3996 | var rawAmount = value.substring(0, value.length - suffix.length); |
||
3997 | var amount = parseFloat(rawAmount); |
||
637 | daniel-mar | 3998 | return rawAmount === amount.toString() ? type(amount) : adt$6.invalid(value); |
597 | daniel-mar | 3999 | }; |
637 | daniel-mar | 4000 | var from = function (value) { |
597 | daniel-mar | 4001 | if (endsWith(value, '%')) { |
637 | daniel-mar | 4002 | return validateFor('%', adt$6.percent, value); |
597 | daniel-mar | 4003 | } |
4004 | if (endsWith(value, 'px')) { |
||
637 | daniel-mar | 4005 | return validateFor('px', adt$6.pixels, value); |
597 | daniel-mar | 4006 | } |
637 | daniel-mar | 4007 | return adt$6.invalid(value); |
597 | daniel-mar | 4008 | }; |
637 | daniel-mar | 4009 | var Size = __assign(__assign({}, adt$6), { from: from }); |
597 | daniel-mar | 4010 | |
4011 | var redistributeToPercent = function (widths, totalWidth) { |
||
637 | daniel-mar | 4012 | return map$1(widths, function (w) { |
597 | daniel-mar | 4013 | var colType = Size.from(w); |
4014 | return colType.fold(function () { |
||
4015 | return w; |
||
4016 | }, function (px) { |
||
4017 | var ratio = px / totalWidth * 100; |
||
4018 | return ratio + '%'; |
||
4019 | }, function (pc) { |
||
4020 | return pc + '%'; |
||
4021 | }); |
||
4022 | }); |
||
4023 | }; |
||
4024 | var redistributeToPx = function (widths, totalWidth, newTotalWidth) { |
||
4025 | var scale = newTotalWidth / totalWidth; |
||
637 | daniel-mar | 4026 | return map$1(widths, function (w) { |
597 | daniel-mar | 4027 | var colType = Size.from(w); |
4028 | return colType.fold(function () { |
||
4029 | return w; |
||
4030 | }, function (px) { |
||
4031 | return px * scale + 'px'; |
||
4032 | }, function (pc) { |
||
4033 | return pc / 100 * newTotalWidth + 'px'; |
||
4034 | }); |
||
4035 | }); |
||
4036 | }; |
||
4037 | var redistributeEmpty = function (newWidthType, columns) { |
||
4038 | var f = newWidthType.fold(function () { |
||
4039 | return constant(''); |
||
4040 | }, function (pixels) { |
||
4041 | var num = pixels / columns; |
||
4042 | return constant(num + 'px'); |
||
4043 | }, function () { |
||
4044 | var num = 100 / columns; |
||
4045 | return constant(num + '%'); |
||
4046 | }); |
||
637 | daniel-mar | 4047 | return range$1(columns, f); |
597 | daniel-mar | 4048 | }; |
4049 | var redistributeValues = function (newWidthType, widths, totalWidth) { |
||
4050 | return newWidthType.fold(function () { |
||
4051 | return widths; |
||
4052 | }, function (px) { |
||
4053 | return redistributeToPx(widths, totalWidth, px); |
||
4054 | }, function (_pc) { |
||
4055 | return redistributeToPercent(widths, totalWidth); |
||
4056 | }); |
||
4057 | }; |
||
637 | daniel-mar | 4058 | var redistribute$1 = function (widths, totalWidth, newWidth) { |
597 | daniel-mar | 4059 | var newType = Size.from(newWidth); |
4060 | var floats = forall(widths, function (s) { |
||
4061 | return s === '0px'; |
||
4062 | }) ? redistributeEmpty(newType, widths.length) : redistributeValues(newType, widths, totalWidth); |
||
4063 | return normalize(floats); |
||
4064 | }; |
||
4065 | var sum = function (values, fallback) { |
||
4066 | if (values.length === 0) { |
||
4067 | return fallback; |
||
4068 | } |
||
4069 | return foldr(values, function (rest, v) { |
||
4070 | return Size.from(v).fold(constant(0), identity, identity) + rest; |
||
4071 | }, 0); |
||
4072 | }; |
||
4073 | var roundDown = function (num, unit) { |
||
4074 | var floored = Math.floor(num); |
||
4075 | return { |
||
4076 | value: floored + unit, |
||
4077 | remainder: num - floored |
||
4078 | }; |
||
4079 | }; |
||
637 | daniel-mar | 4080 | var add$3 = function (value, amount) { |
597 | daniel-mar | 4081 | return Size.from(value).fold(constant(value), function (px) { |
4082 | return px + amount + 'px'; |
||
4083 | }, function (pc) { |
||
4084 | return pc + amount + '%'; |
||
4085 | }); |
||
4086 | }; |
||
4087 | var normalize = function (values) { |
||
4088 | if (values.length === 0) { |
||
4089 | return values; |
||
4090 | } |
||
4091 | var scan = foldr(values, function (rest, value) { |
||
4092 | var info = Size.from(value).fold(function () { |
||
4093 | return { |
||
4094 | value: value, |
||
4095 | remainder: 0 |
||
4096 | }; |
||
4097 | }, function (num) { |
||
4098 | return roundDown(num, 'px'); |
||
4099 | }, function (num) { |
||
4100 | return { |
||
4101 | value: num + '%', |
||
4102 | remainder: 0 |
||
4103 | }; |
||
4104 | }); |
||
4105 | return { |
||
4106 | output: [info.value].concat(rest.output), |
||
4107 | remainder: rest.remainder + info.remainder |
||
4108 | }; |
||
4109 | }, { |
||
4110 | output: [], |
||
4111 | remainder: 0 |
||
4112 | }); |
||
4113 | var r = scan.output; |
||
637 | daniel-mar | 4114 | return r.slice(0, r.length - 1).concat([add$3(r[r.length - 1], Math.round(scan.remainder))]); |
597 | daniel-mar | 4115 | }; |
4116 | var validate = Size.from; |
||
4117 | |||
4118 | var redistributeToW = function (newWidths, cells, unit) { |
||
637 | daniel-mar | 4119 | each$2(cells, function (cell) { |
597 | daniel-mar | 4120 | var widths = newWidths.slice(cell.column, cell.colspan + cell.column); |
4121 | var w = sum(widths, minWidth()); |
||
4122 | set$1(cell.element, 'width', w + unit); |
||
4123 | }); |
||
4124 | }; |
||
4125 | var redistributeToColumns = function (newWidths, columns, unit) { |
||
637 | daniel-mar | 4126 | each$2(columns, function (column, index) { |
597 | daniel-mar | 4127 | var width = sum([newWidths[index]], minWidth()); |
4128 | set$1(column.element, 'width', width + unit); |
||
4129 | }); |
||
4130 | }; |
||
4131 | var redistributeToH = function (newHeights, rows, cells, unit) { |
||
637 | daniel-mar | 4132 | each$2(cells, function (cell) { |
597 | daniel-mar | 4133 | var heights = newHeights.slice(cell.row, cell.rowspan + cell.row); |
4134 | var h = sum(heights, minHeight()); |
||
4135 | set$1(cell.element, 'height', h + unit); |
||
4136 | }); |
||
637 | daniel-mar | 4137 | each$2(rows, function (row, i) { |
597 | daniel-mar | 4138 | set$1(row.element, 'height', newHeights[i]); |
4139 | }); |
||
4140 | }; |
||
4141 | var getUnit = function (newSize) { |
||
4142 | return validate(newSize).fold(constant('px'), constant('px'), constant('%')); |
||
4143 | }; |
||
679 | daniel-mar | 4144 | var redistribute = function (table, optWidth, optHeight) { |
597 | daniel-mar | 4145 | var warehouse = Warehouse.fromTable(table); |
4146 | var rows = warehouse.all; |
||
4147 | var cells = Warehouse.justCells(warehouse); |
||
4148 | var columns = Warehouse.justColumns(warehouse); |
||
4149 | optWidth.each(function (newWidth) { |
||
4150 | var widthUnit = getUnit(newWidth); |
||
637 | daniel-mar | 4151 | var totalWidth = get$8(table); |
679 | daniel-mar | 4152 | var oldWidths = getRawWidths(warehouse, table); |
637 | daniel-mar | 4153 | var nuWidths = redistribute$1(oldWidths, totalWidth, newWidth); |
597 | daniel-mar | 4154 | if (Warehouse.hasColumns(warehouse)) { |
4155 | redistributeToColumns(nuWidths, columns, widthUnit); |
||
4156 | } else { |
||
4157 | redistributeToW(nuWidths, cells, widthUnit); |
||
4158 | } |
||
4159 | set$1(table, 'width', newWidth); |
||
4160 | }); |
||
4161 | optHeight.each(function (newHeight) { |
||
4162 | var hUnit = getUnit(newHeight); |
||
637 | daniel-mar | 4163 | var totalHeight = get$7(table); |
597 | daniel-mar | 4164 | var oldHeights = getRawHeights(warehouse, table, height); |
637 | daniel-mar | 4165 | var nuHeights = redistribute$1(oldHeights, totalHeight, newHeight); |
597 | daniel-mar | 4166 | redistributeToH(nuHeights, rows, cells, hUnit); |
4167 | set$1(table, 'height', newHeight); |
||
4168 | }); |
||
4169 | }; |
||
637 | daniel-mar | 4170 | var isPercentSizing = isPercentSizing$1; |
4171 | var isPixelSizing = isPixelSizing$1; |
||
4172 | var isNoneSizing = isNoneSizing$1; |
||
597 | daniel-mar | 4173 | |
4174 | var getGridSize = function (table) { |
||
4175 | var warehouse = Warehouse.fromTable(table); |
||
4176 | return warehouse.grid; |
||
4177 | }; |
||
4178 | |||
4179 | var Event = function (fields) { |
||
4180 | var handlers = []; |
||
4181 | var bind = function (handler) { |
||
4182 | if (handler === undefined) { |
||
4183 | throw new Error('Event bind error: undefined handler'); |
||
4184 | } |
||
4185 | handlers.push(handler); |
||
4186 | }; |
||
4187 | var unbind = function (handler) { |
||
637 | daniel-mar | 4188 | handlers = filter$2(handlers, function (h) { |
597 | daniel-mar | 4189 | return h !== handler; |
4190 | }); |
||
4191 | }; |
||
4192 | var trigger = function () { |
||
4193 | var args = []; |
||
4194 | for (var _i = 0; _i < arguments.length; _i++) { |
||
4195 | args[_i] = arguments[_i]; |
||
4196 | } |
||
4197 | var event = {}; |
||
637 | daniel-mar | 4198 | each$2(fields, function (name, i) { |
597 | daniel-mar | 4199 | event[name] = args[i]; |
4200 | }); |
||
637 | daniel-mar | 4201 | each$2(handlers, function (handler) { |
597 | daniel-mar | 4202 | handler(event); |
4203 | }); |
||
4204 | }; |
||
4205 | return { |
||
4206 | bind: bind, |
||
4207 | unbind: unbind, |
||
4208 | trigger: trigger |
||
4209 | }; |
||
4210 | }; |
||
4211 | |||
637 | daniel-mar | 4212 | var create$4 = function (typeDefs) { |
4213 | var registry = map(typeDefs, function (event) { |
||
597 | daniel-mar | 4214 | return { |
4215 | bind: event.bind, |
||
4216 | unbind: event.unbind |
||
4217 | }; |
||
4218 | }); |
||
637 | daniel-mar | 4219 | var trigger = map(typeDefs, function (event) { |
597 | daniel-mar | 4220 | return event.trigger; |
4221 | }); |
||
4222 | return { |
||
4223 | registry: registry, |
||
4224 | trigger: trigger |
||
4225 | }; |
||
4226 | }; |
||
4227 | |||
637 | daniel-mar | 4228 | var last = function (fn, rate) { |
597 | daniel-mar | 4229 | var timer = null; |
4230 | var cancel = function () { |
||
637 | daniel-mar | 4231 | if (!isNull(timer)) { |
597 | daniel-mar | 4232 | clearTimeout(timer); |
4233 | timer = null; |
||
4234 | } |
||
4235 | }; |
||
4236 | var throttle = function () { |
||
4237 | var args = []; |
||
4238 | for (var _i = 0; _i < arguments.length; _i++) { |
||
4239 | args[_i] = arguments[_i]; |
||
4240 | } |
||
637 | daniel-mar | 4241 | cancel(); |
597 | daniel-mar | 4242 | timer = setTimeout(function () { |
637 | daniel-mar | 4243 | timer = null; |
597 | daniel-mar | 4244 | fn.apply(null, args); |
4245 | }, rate); |
||
4246 | }; |
||
4247 | return { |
||
4248 | cancel: cancel, |
||
4249 | throttle: throttle |
||
4250 | }; |
||
4251 | }; |
||
4252 | |||
637 | daniel-mar | 4253 | var sort = function (arr) { |
597 | daniel-mar | 4254 | return arr.slice(0).sort(); |
4255 | }; |
||
4256 | var reqMessage = function (required, keys) { |
||
637 | daniel-mar | 4257 | throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.'); |
597 | daniel-mar | 4258 | }; |
4259 | var unsuppMessage = function (unsupported) { |
||
637 | daniel-mar | 4260 | throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', ')); |
597 | daniel-mar | 4261 | }; |
4262 | var validateStrArr = function (label, array) { |
||
4263 | if (!isArray(array)) { |
||
4264 | throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.'); |
||
4265 | } |
||
637 | daniel-mar | 4266 | each$2(array, function (a) { |
597 | daniel-mar | 4267 | if (!isString(a)) { |
4268 | throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.'); |
||
4269 | } |
||
4270 | }); |
||
4271 | }; |
||
4272 | var invalidTypeMessage = function (incorrect, type) { |
||
637 | daniel-mar | 4273 | throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.'); |
597 | daniel-mar | 4274 | }; |
4275 | var checkDupes = function (everything) { |
||
637 | daniel-mar | 4276 | var sorted = sort(everything); |
4277 | var dupe = find$1(sorted, function (s, i) { |
||
597 | daniel-mar | 4278 | return i < sorted.length - 1 && s === sorted[i + 1]; |
4279 | }); |
||
4280 | dupe.each(function (d) { |
||
4281 | throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].'); |
||
4282 | }); |
||
4283 | }; |
||
4284 | |||
4285 | var base = function (handleUnsupported, required) { |
||
4286 | return baseWith(handleUnsupported, required, { |
||
4287 | validate: isFunction, |
||
4288 | label: 'function' |
||
4289 | }); |
||
4290 | }; |
||
4291 | var baseWith = function (handleUnsupported, required, pred) { |
||
4292 | if (required.length === 0) { |
||
4293 | throw new Error('You must specify at least one required field.'); |
||
4294 | } |
||
4295 | validateStrArr('required', required); |
||
4296 | checkDupes(required); |
||
4297 | return function (obj) { |
||
4298 | var keys$1 = keys(obj); |
||
4299 | var allReqd = forall(required, function (req) { |
||
637 | daniel-mar | 4300 | return contains$2(keys$1, req); |
597 | daniel-mar | 4301 | }); |
4302 | if (!allReqd) { |
||
4303 | reqMessage(required, keys$1); |
||
4304 | } |
||
4305 | handleUnsupported(required, keys$1); |
||
637 | daniel-mar | 4306 | var invalidKeys = filter$2(required, function (key) { |
597 | daniel-mar | 4307 | return !pred.validate(obj[key], key); |
4308 | }); |
||
4309 | if (invalidKeys.length > 0) { |
||
4310 | invalidTypeMessage(invalidKeys, pred.label); |
||
4311 | } |
||
4312 | return obj; |
||
4313 | }; |
||
4314 | }; |
||
4315 | var handleExact = function (required, keys) { |
||
637 | daniel-mar | 4316 | var unsupported = filter$2(keys, function (key) { |
4317 | return !contains$2(required, key); |
||
597 | daniel-mar | 4318 | }); |
4319 | if (unsupported.length > 0) { |
||
4320 | unsuppMessage(unsupported); |
||
4321 | } |
||
4322 | }; |
||
4323 | var exactly = function (required) { |
||
4324 | return base(handleExact, required); |
||
4325 | }; |
||
4326 | |||
4327 | var DragMode = exactly([ |
||
4328 | 'compare', |
||
4329 | 'extract', |
||
4330 | 'mutate', |
||
4331 | 'sink' |
||
4332 | ]); |
||
4333 | var DragSink = exactly([ |
||
4334 | 'element', |
||
4335 | 'start', |
||
4336 | 'stop', |
||
4337 | 'destroy' |
||
4338 | ]); |
||
4339 | var DragApi = exactly([ |
||
4340 | 'forceDrop', |
||
4341 | 'drop', |
||
4342 | 'move', |
||
4343 | 'delayDrop' |
||
4344 | ]); |
||
4345 | |||
4346 | var InDrag = function () { |
||
4347 | var previous = Optional.none(); |
||
4348 | var reset = function () { |
||
4349 | previous = Optional.none(); |
||
4350 | }; |
||
4351 | var update = function (mode, nu) { |
||
4352 | var result = previous.map(function (old) { |
||
4353 | return mode.compare(old, nu); |
||
4354 | }); |
||
4355 | previous = Optional.some(nu); |
||
4356 | return result; |
||
4357 | }; |
||
4358 | var onEvent = function (event, mode) { |
||
4359 | var dataOption = mode.extract(event); |
||
4360 | dataOption.each(function (data) { |
||
4361 | var offset = update(mode, data); |
||
4362 | offset.each(function (d) { |
||
4363 | events.trigger.move(d); |
||
4364 | }); |
||
4365 | }); |
||
4366 | }; |
||
637 | daniel-mar | 4367 | var events = create$4({ move: Event(['info']) }); |
597 | daniel-mar | 4368 | return { |
4369 | onEvent: onEvent, |
||
4370 | reset: reset, |
||
4371 | events: events.registry |
||
4372 | }; |
||
4373 | }; |
||
4374 | |||
4375 | var NoDrag = function () { |
||
637 | daniel-mar | 4376 | var events = create$4({ move: Event(['info']) }); |
597 | daniel-mar | 4377 | return { |
4378 | onEvent: noop, |
||
4379 | reset: noop, |
||
4380 | events: events.registry |
||
4381 | }; |
||
4382 | }; |
||
4383 | |||
4384 | var Movement = function () { |
||
4385 | var noDragState = NoDrag(); |
||
4386 | var inDragState = InDrag(); |
||
4387 | var dragState = noDragState; |
||
4388 | var on = function () { |
||
4389 | dragState.reset(); |
||
4390 | dragState = inDragState; |
||
4391 | }; |
||
4392 | var off = function () { |
||
4393 | dragState.reset(); |
||
4394 | dragState = noDragState; |
||
4395 | }; |
||
4396 | var onEvent = function (event, mode) { |
||
4397 | dragState.onEvent(event, mode); |
||
4398 | }; |
||
4399 | var isOn = function () { |
||
4400 | return dragState === inDragState; |
||
4401 | }; |
||
4402 | return { |
||
4403 | on: on, |
||
4404 | off: off, |
||
4405 | isOn: isOn, |
||
4406 | onEvent: onEvent, |
||
4407 | events: inDragState.events |
||
4408 | }; |
||
4409 | }; |
||
4410 | |||
4411 | var setup = function (mutation, mode, settings) { |
||
4412 | var active = false; |
||
637 | daniel-mar | 4413 | var events = create$4({ |
597 | daniel-mar | 4414 | start: Event([]), |
4415 | stop: Event([]) |
||
4416 | }); |
||
4417 | var movement = Movement(); |
||
4418 | var drop = function () { |
||
4419 | sink.stop(); |
||
4420 | if (movement.isOn()) { |
||
4421 | movement.off(); |
||
4422 | events.trigger.stop(); |
||
4423 | } |
||
4424 | }; |
||
637 | daniel-mar | 4425 | var throttledDrop = last(drop, 200); |
597 | daniel-mar | 4426 | var go = function (parent) { |
4427 | sink.start(parent); |
||
4428 | movement.on(); |
||
4429 | events.trigger.start(); |
||
4430 | }; |
||
4431 | var mousemove = function (event) { |
||
4432 | throttledDrop.cancel(); |
||
4433 | movement.onEvent(event, mode); |
||
4434 | }; |
||
4435 | movement.events.move.bind(function (event) { |
||
4436 | mode.mutate(mutation, event.info); |
||
4437 | }); |
||
4438 | var on = function () { |
||
4439 | active = true; |
||
4440 | }; |
||
4441 | var off = function () { |
||
4442 | active = false; |
||
4443 | }; |
||
4444 | var runIfActive = function (f) { |
||
4445 | return function () { |
||
4446 | var args = []; |
||
4447 | for (var _i = 0; _i < arguments.length; _i++) { |
||
4448 | args[_i] = arguments[_i]; |
||
4449 | } |
||
4450 | if (active) { |
||
4451 | f.apply(null, args); |
||
4452 | } |
||
4453 | }; |
||
4454 | }; |
||
4455 | var sink = mode.sink(DragApi({ |
||
4456 | forceDrop: drop, |
||
4457 | drop: runIfActive(drop), |
||
4458 | move: runIfActive(mousemove), |
||
4459 | delayDrop: runIfActive(throttledDrop.throttle) |
||
4460 | }), settings); |
||
4461 | var destroy = function () { |
||
4462 | sink.destroy(); |
||
4463 | }; |
||
4464 | return { |
||
4465 | element: sink.element, |
||
4466 | go: go, |
||
4467 | on: on, |
||
4468 | off: off, |
||
4469 | destroy: destroy, |
||
4470 | events: events.registry |
||
4471 | }; |
||
4472 | }; |
||
4473 | |||
4474 | var mkEvent = function (target, x, y, stop, prevent, kill, raw) { |
||
4475 | return { |
||
4476 | target: target, |
||
4477 | x: x, |
||
4478 | y: y, |
||
4479 | stop: stop, |
||
4480 | prevent: prevent, |
||
4481 | kill: kill, |
||
4482 | raw: raw |
||
4483 | }; |
||
4484 | }; |
||
637 | daniel-mar | 4485 | var fromRawEvent$1 = function (rawEvent) { |
597 | daniel-mar | 4486 | var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); |
4487 | var stop = function () { |
||
4488 | return rawEvent.stopPropagation(); |
||
4489 | }; |
||
4490 | var prevent = function () { |
||
4491 | return rawEvent.preventDefault(); |
||
4492 | }; |
||
4493 | var kill = compose(prevent, stop); |
||
4494 | return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); |
||
4495 | }; |
||
637 | daniel-mar | 4496 | var handle$2 = function (filter, handler) { |
597 | daniel-mar | 4497 | return function (rawEvent) { |
4498 | if (filter(rawEvent)) { |
||
637 | daniel-mar | 4499 | handler(fromRawEvent$1(rawEvent)); |
597 | daniel-mar | 4500 | } |
4501 | }; |
||
4502 | }; |
||
4503 | var binder = function (element, event, filter, handler, useCapture) { |
||
637 | daniel-mar | 4504 | var wrapped = handle$2(filter, handler); |
597 | daniel-mar | 4505 | element.dom.addEventListener(event, wrapped, useCapture); |
4506 | return { unbind: curry(unbind, element, event, wrapped, useCapture) }; |
||
4507 | }; |
||
4508 | var bind$1 = function (element, event, filter, handler) { |
||
4509 | return binder(element, event, filter, handler, false); |
||
4510 | }; |
||
4511 | var unbind = function (element, event, handler, useCapture) { |
||
4512 | element.dom.removeEventListener(event, handler, useCapture); |
||
4513 | }; |
||
4514 | |||
637 | daniel-mar | 4515 | var filter = always; |
4516 | var bind = function (element, event, handler) { |
||
4517 | return bind$1(element, event, filter, handler); |
||
597 | daniel-mar | 4518 | }; |
637 | daniel-mar | 4519 | var fromRawEvent = fromRawEvent$1; |
597 | daniel-mar | 4520 | |
4521 | var read = function (element, attr) { |
||
637 | daniel-mar | 4522 | var value = get$b(element, attr); |
597 | daniel-mar | 4523 | return value === undefined || value === '' ? [] : value.split(' '); |
4524 | }; |
||
637 | daniel-mar | 4525 | var add$2 = function (element, attr, id) { |
597 | daniel-mar | 4526 | var old = read(element, attr); |
4527 | var nu = old.concat([id]); |
||
637 | daniel-mar | 4528 | set$2(element, attr, nu.join(' ')); |
597 | daniel-mar | 4529 | return true; |
4530 | }; |
||
637 | daniel-mar | 4531 | var remove$4 = function (element, attr, id) { |
4532 | var nu = filter$2(read(element, attr), function (v) { |
||
597 | daniel-mar | 4533 | return v !== id; |
4534 | }); |
||
4535 | if (nu.length > 0) { |
||
637 | daniel-mar | 4536 | set$2(element, attr, nu.join(' ')); |
597 | daniel-mar | 4537 | } else { |
637 | daniel-mar | 4538 | remove$7(element, attr); |
597 | daniel-mar | 4539 | } |
4540 | return false; |
||
4541 | }; |
||
4542 | |||
4543 | var supports = function (element) { |
||
4544 | return element.dom.classList !== undefined; |
||
4545 | }; |
||
637 | daniel-mar | 4546 | var get$5 = function (element) { |
597 | daniel-mar | 4547 | return read(element, 'class'); |
4548 | }; |
||
637 | daniel-mar | 4549 | var add$1 = function (element, clazz) { |
4550 | return add$2(element, 'class', clazz); |
||
597 | daniel-mar | 4551 | }; |
637 | daniel-mar | 4552 | var remove$3 = function (element, clazz) { |
4553 | return remove$4(element, 'class', clazz); |
||
597 | daniel-mar | 4554 | }; |
4555 | |||
637 | daniel-mar | 4556 | var add = function (element, clazz) { |
597 | daniel-mar | 4557 | if (supports(element)) { |
4558 | element.dom.classList.add(clazz); |
||
4559 | } else { |
||
637 | daniel-mar | 4560 | add$1(element, clazz); |
597 | daniel-mar | 4561 | } |
4562 | }; |
||
4563 | var cleanClass = function (element) { |
||
637 | daniel-mar | 4564 | var classList = supports(element) ? element.dom.classList : get$5(element); |
597 | daniel-mar | 4565 | if (classList.length === 0) { |
637 | daniel-mar | 4566 | remove$7(element, 'class'); |
597 | daniel-mar | 4567 | } |
4568 | }; |
||
637 | daniel-mar | 4569 | var remove$2 = function (element, clazz) { |
597 | daniel-mar | 4570 | if (supports(element)) { |
4571 | var classList = element.dom.classList; |
||
4572 | classList.remove(clazz); |
||
4573 | } else { |
||
637 | daniel-mar | 4574 | remove$3(element, clazz); |
597 | daniel-mar | 4575 | } |
4576 | cleanClass(element); |
||
4577 | }; |
||
637 | daniel-mar | 4578 | var has = function (element, clazz) { |
597 | daniel-mar | 4579 | return supports(element) && element.dom.classList.contains(clazz); |
4580 | }; |
||
4581 | |||
4582 | var css = function (namespace) { |
||
4583 | var dashNamespace = namespace.replace(/\./g, '-'); |
||
4584 | var resolve = function (str) { |
||
4585 | return dashNamespace + '-' + str; |
||
4586 | }; |
||
4587 | return { resolve: resolve }; |
||
4588 | }; |
||
4589 | |||
637 | daniel-mar | 4590 | var styles$1 = css('ephox-dragster'); |
4591 | var resolve$1 = styles$1.resolve; |
||
597 | daniel-mar | 4592 | |
4593 | var Blocker = function (options) { |
||
637 | daniel-mar | 4594 | var settings = __assign({ layerClass: resolve$1('blocker') }, options); |
597 | daniel-mar | 4595 | var div = SugarElement.fromTag('div'); |
637 | daniel-mar | 4596 | set$2(div, 'role', 'presentation'); |
4597 | setAll(div, { |
||
597 | daniel-mar | 4598 | position: 'fixed', |
4599 | left: '0px', |
||
4600 | top: '0px', |
||
4601 | width: '100%', |
||
4602 | height: '100%' |
||
4603 | }); |
||
637 | daniel-mar | 4604 | add(div, resolve$1('blocker')); |
4605 | add(div, settings.layerClass); |
||
4606 | var element = constant(div); |
||
597 | daniel-mar | 4607 | var destroy = function () { |
637 | daniel-mar | 4608 | remove$5(div); |
597 | daniel-mar | 4609 | }; |
4610 | return { |
||
4611 | element: element, |
||
4612 | destroy: destroy |
||
4613 | }; |
||
4614 | }; |
||
4615 | |||
4616 | var compare = function (old, nu) { |
||
4617 | return SugarPosition(nu.left - old.left, nu.top - old.top); |
||
4618 | }; |
||
637 | daniel-mar | 4619 | var extract = function (event) { |
597 | daniel-mar | 4620 | return Optional.some(SugarPosition(event.x, event.y)); |
4621 | }; |
||
4622 | var mutate = function (mutation, info) { |
||
4623 | mutation.mutate(info.left, info.top); |
||
4624 | }; |
||
4625 | var sink = function (dragApi, settings) { |
||
4626 | var blocker = Blocker(settings); |
||
637 | daniel-mar | 4627 | var mdown = bind(blocker.element(), 'mousedown', dragApi.forceDrop); |
4628 | var mup = bind(blocker.element(), 'mouseup', dragApi.drop); |
||
4629 | var mmove = bind(blocker.element(), 'mousemove', dragApi.move); |
||
4630 | var mout = bind(blocker.element(), 'mouseout', dragApi.delayDrop); |
||
597 | daniel-mar | 4631 | var destroy = function () { |
4632 | blocker.destroy(); |
||
4633 | mup.unbind(); |
||
4634 | mmove.unbind(); |
||
4635 | mout.unbind(); |
||
4636 | mdown.unbind(); |
||
4637 | }; |
||
4638 | var start = function (parent) { |
||
637 | daniel-mar | 4639 | append$1(parent, blocker.element()); |
597 | daniel-mar | 4640 | }; |
4641 | var stop = function () { |
||
637 | daniel-mar | 4642 | remove$5(blocker.element()); |
597 | daniel-mar | 4643 | }; |
4644 | return DragSink({ |
||
4645 | element: blocker.element, |
||
4646 | start: start, |
||
4647 | stop: stop, |
||
4648 | destroy: destroy |
||
4649 | }); |
||
4650 | }; |
||
4651 | var MouseDrag = DragMode({ |
||
4652 | compare: compare, |
||
637 | daniel-mar | 4653 | extract: extract, |
597 | daniel-mar | 4654 | sink: sink, |
4655 | mutate: mutate |
||
4656 | }); |
||
4657 | |||
637 | daniel-mar | 4658 | var transform$1 = function (mutation, settings) { |
597 | daniel-mar | 4659 | if (settings === void 0) { |
4660 | settings = {}; |
||
4661 | } |
||
4662 | var mode = settings.mode !== undefined ? settings.mode : MouseDrag; |
||
4663 | return setup(mutation, mode, settings); |
||
4664 | }; |
||
4665 | |||
637 | daniel-mar | 4666 | var closest = function (target) { |
4667 | return closest$1(target, '[contenteditable]'); |
||
597 | daniel-mar | 4668 | }; |
637 | daniel-mar | 4669 | var isEditable$1 = function (element, assumeEditable) { |
4670 | if (assumeEditable === void 0) { |
||
4671 | assumeEditable = false; |
||
4672 | } |
||
4673 | if (!detect$3().browser.isIE() && inBody(element)) { |
||
4674 | return element.dom.isContentEditable; |
||
4675 | } else { |
||
4676 | return closest(element).fold(constant(assumeEditable), function (editable) { |
||
4677 | return getRaw(editable) === 'true'; |
||
4678 | }); |
||
4679 | } |
||
597 | daniel-mar | 4680 | }; |
637 | daniel-mar | 4681 | var getRaw = function (element) { |
4682 | return element.dom.contentEditable; |
||
4683 | }; |
||
597 | daniel-mar | 4684 | |
637 | daniel-mar | 4685 | var styles = css('ephox-snooker'); |
4686 | var resolve = styles.resolve; |
||
597 | daniel-mar | 4687 | |
4688 | var Mutation = function () { |
||
637 | daniel-mar | 4689 | var events = create$4({ |
597 | daniel-mar | 4690 | drag: Event([ |
4691 | 'xDelta', |
||
4692 | 'yDelta' |
||
4693 | ]) |
||
4694 | }); |
||
4695 | var mutate = function (x, y) { |
||
4696 | events.trigger.drag(x, y); |
||
4697 | }; |
||
4698 | return { |
||
4699 | mutate: mutate, |
||
4700 | events: events.registry |
||
4701 | }; |
||
4702 | }; |
||
4703 | |||
4704 | var BarMutation = function () { |
||
637 | daniel-mar | 4705 | var events = create$4({ |
597 | daniel-mar | 4706 | drag: Event([ |
4707 | 'xDelta', |
||
4708 | 'yDelta', |
||
4709 | 'target' |
||
4710 | ]) |
||
4711 | }); |
||
4712 | var target = Optional.none(); |
||
4713 | var delegate = Mutation(); |
||
4714 | delegate.events.drag.bind(function (event) { |
||
4715 | target.each(function (t) { |
||
4716 | events.trigger.drag(event.xDelta, event.yDelta, t); |
||
4717 | }); |
||
4718 | }); |
||
4719 | var assign = function (t) { |
||
4720 | target = Optional.some(t); |
||
4721 | }; |
||
4722 | var get = function () { |
||
4723 | return target; |
||
4724 | }; |
||
4725 | return { |
||
4726 | assign: assign, |
||
4727 | get: get, |
||
4728 | mutate: delegate.mutate, |
||
4729 | events: events.registry |
||
4730 | }; |
||
4731 | }; |
||
4732 | |||
4733 | var col = function (column, x, y, w, h) { |
||
4734 | var bar = SugarElement.fromTag('div'); |
||
637 | daniel-mar | 4735 | setAll(bar, { |
597 | daniel-mar | 4736 | position: 'absolute', |
4737 | left: x - w / 2 + 'px', |
||
4738 | top: y + 'px', |
||
4739 | height: h + 'px', |
||
4740 | width: w + 'px' |
||
4741 | }); |
||
637 | daniel-mar | 4742 | setAll$1(bar, { |
597 | daniel-mar | 4743 | 'data-column': column, |
4744 | 'role': 'presentation' |
||
4745 | }); |
||
4746 | return bar; |
||
4747 | }; |
||
4748 | var row = function (r, x, y, w, h) { |
||
4749 | var bar = SugarElement.fromTag('div'); |
||
637 | daniel-mar | 4750 | setAll(bar, { |
597 | daniel-mar | 4751 | position: 'absolute', |
4752 | left: x + 'px', |
||
4753 | top: y - h / 2 + 'px', |
||
4754 | height: h + 'px', |
||
4755 | width: w + 'px' |
||
4756 | }); |
||
637 | daniel-mar | 4757 | setAll$1(bar, { |
597 | daniel-mar | 4758 | 'data-row': r, |
4759 | 'role': 'presentation' |
||
4760 | }); |
||
4761 | return bar; |
||
4762 | }; |
||
4763 | |||
637 | daniel-mar | 4764 | var resizeBar = resolve('resizer-bar'); |
4765 | var resizeRowBar = resolve('resizer-rows'); |
||
4766 | var resizeColBar = resolve('resizer-cols'); |
||
597 | daniel-mar | 4767 | var BAR_THICKNESS = 7; |
4768 | var resizableRows = function (warehouse, isResizable) { |
||
637 | daniel-mar | 4769 | return bind$2(warehouse.all, function (row, i) { |
597 | daniel-mar | 4770 | return isResizable(row.element) ? [i] : []; |
4771 | }); |
||
4772 | }; |
||
4773 | var resizableColumns = function (warehouse, isResizable) { |
||
4774 | var resizableCols = []; |
||
637 | daniel-mar | 4775 | range$1(warehouse.grid.columns, function (index) { |
597 | daniel-mar | 4776 | var colElmOpt = Warehouse.getColumnAt(warehouse, index).map(function (col) { |
4777 | return col.element; |
||
4778 | }); |
||
4779 | if (colElmOpt.forall(isResizable)) { |
||
4780 | resizableCols.push(index); |
||
4781 | } |
||
4782 | }); |
||
637 | daniel-mar | 4783 | return filter$2(resizableCols, function (colIndex) { |
597 | daniel-mar | 4784 | var columnCells = Warehouse.filterItems(warehouse, function (cell) { |
4785 | return cell.column === colIndex; |
||
4786 | }); |
||
4787 | return forall(columnCells, function (cell) { |
||
4788 | return isResizable(cell.element); |
||
4789 | }); |
||
4790 | }); |
||
4791 | }; |
||
4792 | var destroy = function (wire) { |
||
637 | daniel-mar | 4793 | var previous = descendants(wire.parent(), '.' + resizeBar); |
4794 | each$2(previous, remove$5); |
||
597 | daniel-mar | 4795 | }; |
4796 | var drawBar = function (wire, positions, create) { |
||
4797 | var origin = wire.origin(); |
||
637 | daniel-mar | 4798 | each$2(positions, function (cpOption) { |
597 | daniel-mar | 4799 | cpOption.each(function (cp) { |
4800 | var bar = create(origin, cp); |
||
637 | daniel-mar | 4801 | add(bar, resizeBar); |
4802 | append$1(wire.parent(), bar); |
||
597 | daniel-mar | 4803 | }); |
4804 | }); |
||
4805 | }; |
||
4806 | var refreshCol = function (wire, colPositions, position, tableHeight) { |
||
4807 | drawBar(wire, colPositions, function (origin, cp) { |
||
4808 | var colBar = col(cp.col, cp.x - origin.left, position.top - origin.top, BAR_THICKNESS, tableHeight); |
||
637 | daniel-mar | 4809 | add(colBar, resizeColBar); |
597 | daniel-mar | 4810 | return colBar; |
4811 | }); |
||
4812 | }; |
||
4813 | var refreshRow = function (wire, rowPositions, position, tableWidth) { |
||
4814 | drawBar(wire, rowPositions, function (origin, cp) { |
||
4815 | var rowBar = row(cp.row, position.left - origin.left, cp.y - origin.top, tableWidth, BAR_THICKNESS); |
||
637 | daniel-mar | 4816 | add(rowBar, resizeRowBar); |
597 | daniel-mar | 4817 | return rowBar; |
4818 | }); |
||
4819 | }; |
||
4820 | var refreshGrid = function (warhouse, wire, table, rows, cols) { |
||
4821 | var position = absolute(table); |
||
4822 | var isResizable = wire.isResizable; |
||
4823 | var rowPositions = rows.length > 0 ? height.positions(rows, table) : []; |
||
4824 | var resizableRowBars = rowPositions.length > 0 ? resizableRows(warhouse, isResizable) : []; |
||
637 | daniel-mar | 4825 | var resizableRowPositions = filter$2(rowPositions, function (_pos, i) { |
597 | daniel-mar | 4826 | return exists(resizableRowBars, function (barIndex) { |
4827 | return i === barIndex; |
||
4828 | }); |
||
4829 | }); |
||
637 | daniel-mar | 4830 | refreshRow(wire, resizableRowPositions, position, getOuter$2(table)); |
597 | daniel-mar | 4831 | var colPositions = cols.length > 0 ? width.positions(cols, table) : []; |
4832 | var resizableColBars = colPositions.length > 0 ? resizableColumns(warhouse, isResizable) : []; |
||
637 | daniel-mar | 4833 | var resizableColPositions = filter$2(colPositions, function (_pos, i) { |
597 | daniel-mar | 4834 | return exists(resizableColBars, function (barIndex) { |
4835 | return i === barIndex; |
||
4836 | }); |
||
4837 | }); |
||
4838 | refreshCol(wire, resizableColPositions, position, getOuter$1(table)); |
||
4839 | }; |
||
4840 | var refresh = function (wire, table) { |
||
4841 | destroy(wire); |
||
4842 | if (wire.isResizable(table)) { |
||
4843 | var warehouse = Warehouse.fromTable(table); |
||
637 | daniel-mar | 4844 | var rows$1 = rows(warehouse); |
4845 | var cols = columns(warehouse); |
||
4846 | refreshGrid(warehouse, wire, table, rows$1, cols); |
||
597 | daniel-mar | 4847 | } |
4848 | }; |
||
637 | daniel-mar | 4849 | var each = function (wire, f) { |
4850 | var bars = descendants(wire.parent(), '.' + resizeBar); |
||
4851 | each$2(bars, f); |
||
597 | daniel-mar | 4852 | }; |
4853 | var hide = function (wire) { |
||
637 | daniel-mar | 4854 | each(wire, function (bar) { |
597 | daniel-mar | 4855 | set$1(bar, 'display', 'none'); |
4856 | }); |
||
4857 | }; |
||
4858 | var show = function (wire) { |
||
637 | daniel-mar | 4859 | each(wire, function (bar) { |
597 | daniel-mar | 4860 | set$1(bar, 'display', 'block'); |
4861 | }); |
||
4862 | }; |
||
4863 | var isRowBar = function (element) { |
||
637 | daniel-mar | 4864 | return has(element, resizeRowBar); |
597 | daniel-mar | 4865 | }; |
4866 | var isColBar = function (element) { |
||
637 | daniel-mar | 4867 | return has(element, resizeColBar); |
597 | daniel-mar | 4868 | }; |
4869 | |||
637 | daniel-mar | 4870 | var resizeBarDragging = resolve('resizer-bar-dragging'); |
597 | daniel-mar | 4871 | var BarManager = function (wire) { |
4872 | var mutation = BarMutation(); |
||
637 | daniel-mar | 4873 | var resizing = transform$1(mutation, {}); |
597 | daniel-mar | 4874 | var hoverTable = Optional.none(); |
4875 | var getResizer = function (element, type) { |
||
637 | daniel-mar | 4876 | return Optional.from(get$b(element, type)); |
597 | daniel-mar | 4877 | }; |
4878 | mutation.events.drag.bind(function (event) { |
||
4879 | getResizer(event.target, 'data-row').each(function (_dataRow) { |
||
4880 | var currentRow = getCssValue(event.target, 'top'); |
||
4881 | set$1(event.target, 'top', currentRow + event.yDelta + 'px'); |
||
4882 | }); |
||
4883 | getResizer(event.target, 'data-column').each(function (_dataCol) { |
||
4884 | var currentCol = getCssValue(event.target, 'left'); |
||
4885 | set$1(event.target, 'left', currentCol + event.xDelta + 'px'); |
||
4886 | }); |
||
4887 | }); |
||
4888 | var getDelta = function (target, dir) { |
||
4889 | var newX = getCssValue(target, dir); |
||
4890 | var oldX = getAttrValue(target, 'data-initial-' + dir, 0); |
||
4891 | return newX - oldX; |
||
4892 | }; |
||
4893 | resizing.events.stop.bind(function () { |
||
4894 | mutation.get().each(function (target) { |
||
4895 | hoverTable.each(function (table) { |
||
4896 | getResizer(target, 'data-row').each(function (row) { |
||
4897 | var delta = getDelta(target, 'top'); |
||
637 | daniel-mar | 4898 | remove$7(target, 'data-initial-top'); |
597 | daniel-mar | 4899 | events.trigger.adjustHeight(table, delta, parseInt(row, 10)); |
4900 | }); |
||
4901 | getResizer(target, 'data-column').each(function (column) { |
||
4902 | var delta = getDelta(target, 'left'); |
||
637 | daniel-mar | 4903 | remove$7(target, 'data-initial-left'); |
597 | daniel-mar | 4904 | events.trigger.adjustWidth(table, delta, parseInt(column, 10)); |
4905 | }); |
||
4906 | refresh(wire, table); |
||
4907 | }); |
||
4908 | }); |
||
4909 | }); |
||
4910 | var handler = function (target, dir) { |
||
4911 | events.trigger.startAdjust(); |
||
4912 | mutation.assign(target); |
||
637 | daniel-mar | 4913 | set$2(target, 'data-initial-' + dir, getCssValue(target, dir)); |
4914 | add(target, resizeBarDragging); |
||
597 | daniel-mar | 4915 | set$1(target, 'opacity', '0.2'); |
4916 | resizing.go(wire.parent()); |
||
4917 | }; |
||
637 | daniel-mar | 4918 | var mousedown = bind(wire.parent(), 'mousedown', function (event) { |
597 | daniel-mar | 4919 | if (isRowBar(event.target)) { |
4920 | handler(event.target, 'top'); |
||
4921 | } |
||
4922 | if (isColBar(event.target)) { |
||
4923 | handler(event.target, 'left'); |
||
4924 | } |
||
4925 | }); |
||
4926 | var isRoot = function (e) { |
||
4927 | return eq$1(e, wire.view()); |
||
4928 | }; |
||
4929 | var findClosestEditableTable = function (target) { |
||
637 | daniel-mar | 4930 | return closest$1(target, 'table', isRoot).filter(isEditable$1); |
597 | daniel-mar | 4931 | }; |
637 | daniel-mar | 4932 | var mouseover = bind(wire.view(), 'mouseover', function (event) { |
597 | daniel-mar | 4933 | findClosestEditableTable(event.target).fold(function () { |
4934 | if (inBody(event.target)) { |
||
4935 | destroy(wire); |
||
4936 | } |
||
4937 | }, function (table) { |
||
4938 | hoverTable = Optional.some(table); |
||
4939 | refresh(wire, table); |
||
4940 | }); |
||
4941 | }); |
||
4942 | var destroy$1 = function () { |
||
4943 | mousedown.unbind(); |
||
4944 | mouseover.unbind(); |
||
4945 | resizing.destroy(); |
||
4946 | destroy(wire); |
||
4947 | }; |
||
4948 | var refresh$1 = function (tbl) { |
||
4949 | refresh(wire, tbl); |
||
4950 | }; |
||
637 | daniel-mar | 4951 | var events = create$4({ |
597 | daniel-mar | 4952 | adjustHeight: Event([ |
4953 | 'table', |
||
4954 | 'delta', |
||
4955 | 'row' |
||
4956 | ]), |
||
4957 | adjustWidth: Event([ |
||
4958 | 'table', |
||
4959 | 'delta', |
||
4960 | 'column' |
||
4961 | ]), |
||
4962 | startAdjust: Event([]) |
||
4963 | }); |
||
4964 | return { |
||
4965 | destroy: destroy$1, |
||
4966 | refresh: refresh$1, |
||
4967 | on: resizing.on, |
||
4968 | off: resizing.off, |
||
4969 | hideBars: curry(hide, wire), |
||
4970 | showBars: curry(show, wire), |
||
4971 | events: events.registry |
||
4972 | }; |
||
4973 | }; |
||
4974 | |||
637 | daniel-mar | 4975 | var create$3 = function (wire, resizing, lazySizing) { |
597 | daniel-mar | 4976 | var hdirection = height; |
4977 | var vdirection = width; |
||
4978 | var manager = BarManager(wire); |
||
637 | daniel-mar | 4979 | var events = create$4({ |
597 | daniel-mar | 4980 | beforeResize: Event([ |
4981 | 'table', |
||
4982 | 'type' |
||
4983 | ]), |
||
4984 | afterResize: Event([ |
||
4985 | 'table', |
||
4986 | 'type' |
||
4987 | ]), |
||
4988 | startDrag: Event([]) |
||
4989 | }); |
||
4990 | manager.events.adjustHeight.bind(function (event) { |
||
4991 | var table = event.table; |
||
4992 | events.trigger.beforeResize(table, 'row'); |
||
4993 | var delta = hdirection.delta(event.delta, table); |
||
4994 | adjustHeight(table, delta, event.row, hdirection); |
||
4995 | events.trigger.afterResize(table, 'row'); |
||
4996 | }); |
||
4997 | manager.events.startAdjust.bind(function (_event) { |
||
4998 | events.trigger.startDrag(); |
||
4999 | }); |
||
5000 | manager.events.adjustWidth.bind(function (event) { |
||
5001 | var table = event.table; |
||
5002 | events.trigger.beforeResize(table, 'col'); |
||
5003 | var delta = vdirection.delta(event.delta, table); |
||
5004 | var tableSize = lazySizing(table); |
||
5005 | adjustWidth(table, delta, event.column, resizing, tableSize); |
||
5006 | events.trigger.afterResize(table, 'col'); |
||
5007 | }); |
||
5008 | return { |
||
5009 | on: manager.on, |
||
5010 | off: manager.off, |
||
5011 | hideBars: manager.hideBars, |
||
5012 | showBars: manager.showBars, |
||
5013 | destroy: manager.destroy, |
||
5014 | events: events.registry |
||
5015 | }; |
||
5016 | }; |
||
637 | daniel-mar | 5017 | var TableResize = { create: create$3 }; |
597 | daniel-mar | 5018 | |
5019 | var fireNewRow = function (editor, row) { |
||
5020 | return editor.fire('newrow', { node: row }); |
||
5021 | }; |
||
5022 | var fireNewCell = function (editor, cell) { |
||
5023 | return editor.fire('newcell', { node: cell }); |
||
5024 | }; |
||
5025 | var fireObjectResizeStart = function (editor, target, width, height, origin) { |
||
5026 | editor.fire('ObjectResizeStart', { |
||
5027 | target: target, |
||
5028 | width: width, |
||
5029 | height: height, |
||
5030 | origin: origin |
||
5031 | }); |
||
5032 | }; |
||
5033 | var fireObjectResized = function (editor, target, width, height, origin) { |
||
5034 | editor.fire('ObjectResized', { |
||
5035 | target: target, |
||
5036 | width: width, |
||
5037 | height: height, |
||
5038 | origin: origin |
||
5039 | }); |
||
5040 | }; |
||
5041 | var fireTableSelectionChange = function (editor, cells, start, finish, otherCells) { |
||
5042 | editor.fire('TableSelectionChange', { |
||
5043 | cells: cells, |
||
5044 | start: start, |
||
5045 | finish: finish, |
||
5046 | otherCells: otherCells |
||
5047 | }); |
||
5048 | }; |
||
5049 | var fireTableSelectionClear = function (editor) { |
||
5050 | editor.fire('TableSelectionClear'); |
||
5051 | }; |
||
5052 | var fireTableModified = function (editor, table, data) { |
||
5053 | editor.fire('TableModified', __assign(__assign({}, data), { table: table })); |
||
5054 | }; |
||
5055 | var styleModified = { |
||
5056 | structure: false, |
||
5057 | style: true |
||
5058 | }; |
||
5059 | var structureModified = { |
||
5060 | structure: true, |
||
5061 | style: false |
||
5062 | }; |
||
637 | daniel-mar | 5063 | var styleAndStructureModified = { |
5064 | structure: true, |
||
5065 | style: true |
||
5066 | }; |
||
597 | daniel-mar | 5067 | |
5068 | var defaultTableToolbar = 'tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol'; |
||
5069 | var defaultStyles = { |
||
5070 | 'border-collapse': 'collapse', |
||
5071 | 'width': '100%' |
||
5072 | }; |
||
637 | daniel-mar | 5073 | var defaultCellBorderWidths = range$1(5, function (i) { |
5074 | var size = i + 1 + 'px'; |
||
5075 | return { |
||
5076 | title: size, |
||
5077 | value: size |
||
5078 | }; |
||
5079 | }); |
||
5080 | var defaultCellBorderStyles = map$1([ |
||
5081 | 'Solid', |
||
5082 | 'Dotted', |
||
5083 | 'Dashed', |
||
5084 | 'Double', |
||
5085 | 'Groove', |
||
5086 | 'Ridge', |
||
5087 | 'Inset', |
||
5088 | 'Outset', |
||
5089 | 'None', |
||
5090 | 'Hidden' |
||
5091 | ], function (type) { |
||
5092 | return { |
||
5093 | title: type, |
||
5094 | value: type.toLowerCase() |
||
5095 | }; |
||
5096 | }); |
||
597 | daniel-mar | 5097 | var determineDefaultStyles = function (editor) { |
679 | daniel-mar | 5098 | var _a; |
597 | daniel-mar | 5099 | if (isPixelsForced(editor)) { |
679 | daniel-mar | 5100 | var dom = editor.dom; |
5101 | var parentBlock = (_a = dom.getParent(editor.selection.getStart(), dom.isBlock)) !== null && _a !== void 0 ? _a : editor.getBody(); |
||
5102 | var contentWidth = getInner(SugarElement.fromDom(parentBlock)); |
||
5103 | return __assign(__assign({}, defaultStyles), { width: contentWidth + 'px' }); |
||
597 | daniel-mar | 5104 | } else if (isResponsiveForced(editor)) { |
5105 | return filter$1(defaultStyles, function (_value, key) { |
||
5106 | return key !== 'width'; |
||
5107 | }); |
||
5108 | } else { |
||
5109 | return defaultStyles; |
||
5110 | } |
||
5111 | }; |
||
5112 | var defaultAttributes = { border: '1' }; |
||
5113 | var defaultColumnResizingBehaviour = 'preservetable'; |
||
5114 | var getTableSizingMode = function (editor) { |
||
5115 | return editor.getParam('table_sizing_mode', 'auto'); |
||
5116 | }; |
||
5117 | var getTableResponseWidth = function (editor) { |
||
5118 | return editor.getParam('table_responsive_width'); |
||
5119 | }; |
||
637 | daniel-mar | 5120 | var getTableBorderWidths = function (editor) { |
5121 | return editor.getParam('table_border_widths', defaultCellBorderWidths, 'array'); |
||
5122 | }; |
||
5123 | var getTableBorderStyles = function (editor) { |
||
5124 | return editor.getParam('table_border_styles', defaultCellBorderStyles, 'array'); |
||
5125 | }; |
||
597 | daniel-mar | 5126 | var getDefaultAttributes = function (editor) { |
5127 | return editor.getParam('table_default_attributes', defaultAttributes, 'object'); |
||
5128 | }; |
||
5129 | var getDefaultStyles = function (editor) { |
||
5130 | return editor.getParam('table_default_styles', determineDefaultStyles(editor), 'object'); |
||
5131 | }; |
||
5132 | var hasTableResizeBars = function (editor) { |
||
5133 | return editor.getParam('table_resize_bars', true, 'boolean'); |
||
5134 | }; |
||
5135 | var hasTabNavigation = function (editor) { |
||
5136 | return editor.getParam('table_tab_navigation', true, 'boolean'); |
||
5137 | }; |
||
5138 | var hasAdvancedCellTab = function (editor) { |
||
5139 | return editor.getParam('table_cell_advtab', true, 'boolean'); |
||
5140 | }; |
||
5141 | var hasAdvancedRowTab = function (editor) { |
||
5142 | return editor.getParam('table_row_advtab', true, 'boolean'); |
||
5143 | }; |
||
5144 | var hasAdvancedTableTab = function (editor) { |
||
5145 | return editor.getParam('table_advtab', true, 'boolean'); |
||
5146 | }; |
||
5147 | var hasAppearanceOptions = function (editor) { |
||
5148 | return editor.getParam('table_appearance_options', true, 'boolean'); |
||
5149 | }; |
||
5150 | var hasTableGrid = function (editor) { |
||
5151 | return editor.getParam('table_grid', true, 'boolean'); |
||
5152 | }; |
||
5153 | var shouldStyleWithCss = function (editor) { |
||
5154 | return editor.getParam('table_style_by_css', false, 'boolean'); |
||
5155 | }; |
||
5156 | var getCellClassList = function (editor) { |
||
5157 | return editor.getParam('table_cell_class_list', [], 'array'); |
||
5158 | }; |
||
5159 | var getRowClassList = function (editor) { |
||
5160 | return editor.getParam('table_row_class_list', [], 'array'); |
||
5161 | }; |
||
5162 | var getTableClassList = function (editor) { |
||
5163 | return editor.getParam('table_class_list', [], 'array'); |
||
5164 | }; |
||
5165 | var isPercentagesForced = function (editor) { |
||
5166 | return getTableSizingMode(editor) === 'relative' || getTableResponseWidth(editor) === true; |
||
5167 | }; |
||
5168 | var isPixelsForced = function (editor) { |
||
5169 | return getTableSizingMode(editor) === 'fixed' || getTableResponseWidth(editor) === false; |
||
5170 | }; |
||
5171 | var isResponsiveForced = function (editor) { |
||
5172 | return getTableSizingMode(editor) === 'responsive'; |
||
5173 | }; |
||
5174 | var getToolbar = function (editor) { |
||
5175 | return editor.getParam('table_toolbar', defaultTableToolbar); |
||
5176 | }; |
||
5177 | var useColumnGroup = function (editor) { |
||
5178 | return editor.getParam('table_use_colgroups', false, 'boolean'); |
||
5179 | }; |
||
5180 | var getTableHeaderType = function (editor) { |
||
5181 | var defaultValue = 'section'; |
||
5182 | var value = editor.getParam('table_header_type', defaultValue, 'string'); |
||
5183 | var validValues = [ |
||
5184 | 'section', |
||
5185 | 'cells', |
||
5186 | 'sectionCells', |
||
5187 | 'auto' |
||
5188 | ]; |
||
637 | daniel-mar | 5189 | if (!contains$2(validValues, value)) { |
597 | daniel-mar | 5190 | return defaultValue; |
5191 | } else { |
||
5192 | return value; |
||
5193 | } |
||
5194 | }; |
||
5195 | var getColumnResizingBehaviour = function (editor) { |
||
5196 | var validModes = [ |
||
5197 | 'preservetable', |
||
5198 | 'resizetable' |
||
5199 | ]; |
||
5200 | var givenMode = editor.getParam('table_column_resizing', defaultColumnResizingBehaviour, 'string'); |
||
637 | daniel-mar | 5201 | return find$1(validModes, function (mode) { |
597 | daniel-mar | 5202 | return mode === givenMode; |
5203 | }).getOr(defaultColumnResizingBehaviour); |
||
5204 | }; |
||
5205 | var isPreserveTableColumnResizing = function (editor) { |
||
5206 | return getColumnResizingBehaviour(editor) === 'preservetable'; |
||
5207 | }; |
||
5208 | var isResizeTableColumnResizing = function (editor) { |
||
5209 | return getColumnResizingBehaviour(editor) === 'resizetable'; |
||
5210 | }; |
||
5211 | var getCloneElements = function (editor) { |
||
5212 | var cloneElements = editor.getParam('table_clone_elements'); |
||
5213 | if (isString(cloneElements)) { |
||
5214 | return Optional.some(cloneElements.split(/[ ,]/)); |
||
5215 | } else if (Array.isArray(cloneElements)) { |
||
5216 | return Optional.some(cloneElements); |
||
5217 | } else { |
||
5218 | return Optional.none(); |
||
5219 | } |
||
5220 | }; |
||
5221 | var hasObjectResizing = function (editor) { |
||
5222 | var objectResizing = editor.getParam('object_resizing', true); |
||
5223 | return isString(objectResizing) ? objectResizing === 'table' : objectResizing; |
||
5224 | }; |
||
637 | daniel-mar | 5225 | var getTableBackgroundColorMap = function (editor) { |
5226 | return editor.getParam('table_background_color_map', [], 'array'); |
||
5227 | }; |
||
5228 | var getTableBorderColorMap = function (editor) { |
||
5229 | return editor.getParam('table_border_color_map', [], 'array'); |
||
5230 | }; |
||
597 | daniel-mar | 5231 | |
637 | daniel-mar | 5232 | var get$4 = function (editor, table) { |
597 | daniel-mar | 5233 | if (isPercentagesForced(editor)) { |
679 | daniel-mar | 5234 | return TableSize.percentageSize(table); |
597 | daniel-mar | 5235 | } else if (isPixelsForced(editor)) { |
679 | daniel-mar | 5236 | return TableSize.pixelSize(table); |
597 | daniel-mar | 5237 | } else { |
5238 | return TableSize.getTableSize(table); |
||
5239 | } |
||
5240 | }; |
||
5241 | |||
5242 | var cleanupLegacyAttributes = function (element) { |
||
637 | daniel-mar | 5243 | remove$7(element, 'width'); |
597 | daniel-mar | 5244 | }; |
679 | daniel-mar | 5245 | var convertToPercentSize = function (table) { |
5246 | var newWidth = getPercentTableWidth(table); |
||
5247 | redistribute(table, Optional.some(newWidth), Optional.none()); |
||
597 | daniel-mar | 5248 | cleanupLegacyAttributes(table); |
5249 | }; |
||
679 | daniel-mar | 5250 | var convertToPixelSize = function (table) { |
597 | daniel-mar | 5251 | var newWidth = getPixelTableWidth(table); |
679 | daniel-mar | 5252 | redistribute(table, Optional.some(newWidth), Optional.none()); |
597 | daniel-mar | 5253 | cleanupLegacyAttributes(table); |
5254 | }; |
||
5255 | var convertToNoneSize = function (table) { |
||
637 | daniel-mar | 5256 | remove$6(table, 'width'); |
5257 | var columns = columns$1(table); |
||
5258 | var rowElements = columns.length > 0 ? columns : cells$1(table); |
||
5259 | each$2(rowElements, function (cell) { |
||
5260 | remove$6(cell, 'width'); |
||
597 | daniel-mar | 5261 | cleanupLegacyAttributes(cell); |
5262 | }); |
||
5263 | cleanupLegacyAttributes(table); |
||
5264 | }; |
||
5265 | |||
679 | daniel-mar | 5266 | var enforcePercentage = convertToPercentSize; |
5267 | var enforcePixels = convertToPixelSize; |
||
597 | daniel-mar | 5268 | var enforceNone = convertToNoneSize; |
5269 | var syncPixels = function (table) { |
||
5270 | var warehouse = Warehouse.fromTable(table); |
||
5271 | if (!Warehouse.hasColumns(warehouse)) { |
||
637 | daniel-mar | 5272 | each$2(cells$1(table), function (cell) { |
5273 | var computedWidth = get$a(cell, 'width'); |
||
597 | daniel-mar | 5274 | set$1(cell, 'width', computedWidth); |
637 | daniel-mar | 5275 | remove$7(cell, 'width'); |
597 | daniel-mar | 5276 | }); |
5277 | } |
||
5278 | }; |
||
5279 | |||
5280 | var createContainer = function () { |
||
5281 | var container = SugarElement.fromTag('div'); |
||
637 | daniel-mar | 5282 | setAll(container, { |
597 | daniel-mar | 5283 | position: 'static', |
5284 | height: '0', |
||
5285 | width: '0', |
||
5286 | padding: '0', |
||
5287 | margin: '0', |
||
5288 | border: '0' |
||
5289 | }); |
||
637 | daniel-mar | 5290 | append$1(body$1(), container); |
597 | daniel-mar | 5291 | return container; |
5292 | }; |
||
637 | daniel-mar | 5293 | var get$3 = function (editor, isResizable) { |
5294 | return editor.inline ? ResizeWire.body(getBody(editor), createContainer(), isResizable) : ResizeWire.only(SugarElement.fromDom(editor.getDoc()), isResizable); |
||
597 | daniel-mar | 5295 | }; |
637 | daniel-mar | 5296 | var remove$1 = function (editor, wire) { |
597 | daniel-mar | 5297 | if (editor.inline) { |
637 | daniel-mar | 5298 | remove$5(wire.parent()); |
597 | daniel-mar | 5299 | } |
5300 | }; |
||
5301 | |||
5302 | var barResizerPrefix = 'bar-'; |
||
5303 | var isResizable = function (elm) { |
||
637 | daniel-mar | 5304 | return get$b(elm, 'data-mce-resize') !== 'false'; |
597 | daniel-mar | 5305 | }; |
5306 | var getResizeHandler = function (editor) { |
||
5307 | var selectionRng = Optional.none(); |
||
5308 | var resize = Optional.none(); |
||
5309 | var wire = Optional.none(); |
||
5310 | var startW; |
||
5311 | var startRawW; |
||
5312 | var isTable = function (elm) { |
||
5313 | return elm.nodeName === 'TABLE'; |
||
5314 | }; |
||
5315 | var lazyResize = function () { |
||
5316 | return resize; |
||
5317 | }; |
||
5318 | var lazyWire = function () { |
||
5319 | return wire.getOr(ResizeWire.only(SugarElement.fromDom(editor.getBody()), isResizable)); |
||
5320 | }; |
||
5321 | var lazySizing = function (table) { |
||
637 | daniel-mar | 5322 | return get$4(editor, table); |
597 | daniel-mar | 5323 | }; |
5324 | var lazyResizingBehaviour = function () { |
||
5325 | return isPreserveTableColumnResizing(editor) ? preserveTable() : resizeTable(); |
||
5326 | }; |
||
5327 | var getNumColumns = function (table) { |
||
5328 | return getGridSize(table).columns; |
||
5329 | }; |
||
5330 | var afterCornerResize = function (table, origin, width) { |
||
5331 | var isRightEdgeResize = endsWith(origin, 'e'); |
||
5332 | if (startRawW === '') { |
||
679 | daniel-mar | 5333 | enforcePercentage(table); |
597 | daniel-mar | 5334 | } |
5335 | if (width !== startW && startRawW !== '') { |
||
5336 | set$1(table, 'width', startRawW); |
||
5337 | var resizing = lazyResizingBehaviour(); |
||
5338 | var tableSize = lazySizing(table); |
||
5339 | var col = isPreserveTableColumnResizing(editor) || isRightEdgeResize ? getNumColumns(table) - 1 : 0; |
||
5340 | adjustWidth(table, width - startW, col, resizing, tableSize); |
||
637 | daniel-mar | 5341 | } else if (isPercentage$1(startRawW)) { |
597 | daniel-mar | 5342 | var percentW = parseFloat(startRawW.replace('%', '')); |
5343 | var targetPercentW = width * percentW / startW; |
||
5344 | set$1(table, 'width', targetPercentW + '%'); |
||
5345 | } |
||
5346 | if (isPixel(startRawW)) { |
||
5347 | syncPixels(table); |
||
5348 | } |
||
5349 | }; |
||
5350 | var destroy = function () { |
||
5351 | resize.each(function (sz) { |
||
5352 | sz.destroy(); |
||
5353 | }); |
||
5354 | wire.each(function (w) { |
||
637 | daniel-mar | 5355 | remove$1(editor, w); |
597 | daniel-mar | 5356 | }); |
5357 | }; |
||
5358 | editor.on('init', function () { |
||
637 | daniel-mar | 5359 | var rawWire = get$3(editor, isResizable); |
597 | daniel-mar | 5360 | wire = Optional.some(rawWire); |
5361 | if (hasObjectResizing(editor) && hasTableResizeBars(editor)) { |
||
5362 | var resizing = lazyResizingBehaviour(); |
||
5363 | var sz = TableResize.create(rawWire, resizing, lazySizing); |
||
5364 | sz.on(); |
||
5365 | sz.events.startDrag.bind(function (_event) { |
||
5366 | selectionRng = Optional.some(editor.selection.getRng()); |
||
5367 | }); |
||
5368 | sz.events.beforeResize.bind(function (event) { |
||
5369 | var rawTable = event.table.dom; |
||
637 | daniel-mar | 5370 | fireObjectResizeStart(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); |
597 | daniel-mar | 5371 | }); |
5372 | sz.events.afterResize.bind(function (event) { |
||
5373 | var table = event.table; |
||
5374 | var rawTable = table.dom; |
||
5375 | removeDataStyle(table); |
||
5376 | selectionRng.each(function (rng) { |
||
5377 | editor.selection.setRng(rng); |
||
5378 | editor.focus(); |
||
5379 | }); |
||
637 | daniel-mar | 5380 | fireObjectResized(editor, rawTable, getPixelWidth(rawTable), getPixelHeight(rawTable), barResizerPrefix + event.type); |
597 | daniel-mar | 5381 | editor.undoManager.add(); |
5382 | }); |
||
5383 | resize = Optional.some(sz); |
||
5384 | } |
||
5385 | }); |
||
5386 | editor.on('ObjectResizeStart', function (e) { |
||
5387 | var targetElm = e.target; |
||
5388 | if (isTable(targetElm)) { |
||
5389 | var table = SugarElement.fromDom(targetElm); |
||
637 | daniel-mar | 5390 | each$2(editor.dom.select('.mce-clonedresizable'), function (clone) { |
597 | daniel-mar | 5391 | editor.dom.addClass(clone, 'mce-' + getColumnResizingBehaviour(editor) + '-columns'); |
5392 | }); |
||
637 | daniel-mar | 5393 | if (!isPixelSizing(table) && isPixelsForced(editor)) { |
679 | daniel-mar | 5394 | enforcePixels(table); |
637 | daniel-mar | 5395 | } else if (!isPercentSizing(table) && isPercentagesForced(editor)) { |
679 | daniel-mar | 5396 | enforcePercentage(table); |
597 | daniel-mar | 5397 | } |
637 | daniel-mar | 5398 | if (isNoneSizing(table) && startsWith(e.origin, barResizerPrefix)) { |
679 | daniel-mar | 5399 | enforcePercentage(table); |
597 | daniel-mar | 5400 | } |
5401 | startW = e.width; |
||
637 | daniel-mar | 5402 | startRawW = isResponsiveForced(editor) ? '' : getRawWidth(editor, targetElm).getOr(''); |
597 | daniel-mar | 5403 | } |
5404 | }); |
||
5405 | editor.on('ObjectResized', function (e) { |
||
5406 | var targetElm = e.target; |
||
5407 | if (isTable(targetElm)) { |
||
5408 | var table = SugarElement.fromDom(targetElm); |
||
5409 | var origin_1 = e.origin; |
||
5410 | if (startsWith(origin_1, 'corner-')) { |
||
5411 | afterCornerResize(table, origin_1, e.width); |
||
5412 | } |
||
5413 | removeDataStyle(table); |
||
5414 | fireTableModified(editor, table.dom, styleModified); |
||
5415 | } |
||
5416 | }); |
||
5417 | editor.on('SwitchMode', function () { |
||
5418 | lazyResize().each(function (resize) { |
||
5419 | if (editor.mode.isReadOnly()) { |
||
5420 | resize.hideBars(); |
||
5421 | } else { |
||
5422 | resize.showBars(); |
||
5423 | } |
||
5424 | }); |
||
5425 | }); |
||
5426 | return { |
||
5427 | lazyResize: lazyResize, |
||
5428 | lazyWire: lazyWire, |
||
5429 | destroy: destroy |
||
5430 | }; |
||
5431 | }; |
||
5432 | |||
5433 | var point = function (element, offset) { |
||
5434 | return { |
||
5435 | element: element, |
||
5436 | offset: offset |
||
5437 | }; |
||
5438 | }; |
||
5439 | |||
637 | daniel-mar | 5440 | var scan$1 = function (universe, element, direction) { |
597 | daniel-mar | 5441 | if (universe.property().isText(element) && universe.property().getText(element).trim().length === 0 || universe.property().isComment(element)) { |
5442 | return direction(element).bind(function (elem) { |
||
637 | daniel-mar | 5443 | return scan$1(universe, elem, direction).orThunk(function () { |
597 | daniel-mar | 5444 | return Optional.some(elem); |
5445 | }); |
||
5446 | }); |
||
5447 | } else { |
||
5448 | return Optional.none(); |
||
5449 | } |
||
5450 | }; |
||
5451 | var toEnd = function (universe, element) { |
||
5452 | if (universe.property().isText(element)) { |
||
5453 | return universe.property().getText(element).length; |
||
5454 | } |
||
5455 | var children = universe.property().children(element); |
||
5456 | return children.length; |
||
5457 | }; |
||
637 | daniel-mar | 5458 | var freefallRtl$2 = function (universe, element) { |
5459 | var candidate = scan$1(universe, element, universe.query().prevSibling).getOr(element); |
||
597 | daniel-mar | 5460 | if (universe.property().isText(candidate)) { |
5461 | return point(candidate, toEnd(universe, candidate)); |
||
5462 | } |
||
5463 | var children = universe.property().children(candidate); |
||
637 | daniel-mar | 5464 | return children.length > 0 ? freefallRtl$2(universe, children[children.length - 1]) : point(candidate, toEnd(universe, candidate)); |
597 | daniel-mar | 5465 | }; |
5466 | |||
637 | daniel-mar | 5467 | var freefallRtl$1 = freefallRtl$2; |
597 | daniel-mar | 5468 | |
637 | daniel-mar | 5469 | var universe$2 = DomUniverse(); |
5470 | var freefallRtl = function (element) { |
||
5471 | return freefallRtl$1(universe$2, element); |
||
597 | daniel-mar | 5472 | }; |
5473 | |||
5474 | var halve = function (main, other) { |
||
5475 | var colspan = getSpan(main, 'colspan'); |
||
5476 | if (colspan === 1) { |
||
5477 | var width = getGenericWidth(main); |
||
5478 | width.each(function (w) { |
||
5479 | var newWidth = w.value / 2; |
||
5480 | setGenericWidth(main, newWidth, w.unit); |
||
5481 | setGenericWidth(other, newWidth, w.unit); |
||
5482 | }); |
||
5483 | } |
||
5484 | }; |
||
5485 | |||
679 | daniel-mar | 5486 | var isHeaderCell = isTag('th'); |
5487 | var isHeaderCells = function (cells) { |
||
5488 | return forall(cells, function (cell) { |
||
5489 | return isHeaderCell(cell.element); |
||
5490 | }); |
||
5491 | }; |
||
637 | daniel-mar | 5492 | var getRowHeaderType = function (isHeaderRow, isHeaderCells) { |
5493 | if (isHeaderRow && isHeaderCells) { |
||
5494 | return 'sectionCells'; |
||
5495 | } else if (isHeaderRow) { |
||
5496 | return 'section'; |
||
5497 | } else { |
||
5498 | return 'cells'; |
||
5499 | } |
||
5500 | }; |
||
5501 | var getRowType$1 = function (row) { |
||
5502 | var isHeaderRow = row.section === 'thead'; |
||
5503 | var isHeaderCells = is(findCommonCellType(row.cells), 'th'); |
||
5504 | if (isHeaderRow || isHeaderCells) { |
||
5505 | return { |
||
5506 | type: 'header', |
||
5507 | subType: getRowHeaderType(isHeaderRow, isHeaderCells) |
||
5508 | }; |
||
5509 | } else if (row.section === 'tfoot') { |
||
5510 | return { type: 'footer' }; |
||
5511 | } else { |
||
5512 | return { type: 'body' }; |
||
5513 | } |
||
5514 | }; |
||
5515 | var findCommonCellType = function (cells) { |
||
5516 | var headerCells = filter$2(cells, function (cell) { |
||
679 | daniel-mar | 5517 | return isHeaderCell(cell.element); |
637 | daniel-mar | 5518 | }); |
5519 | if (headerCells.length === 0) { |
||
5520 | return Optional.some('td'); |
||
5521 | } else if (headerCells.length === cells.length) { |
||
5522 | return Optional.some('th'); |
||
5523 | } else { |
||
5524 | return Optional.none(); |
||
5525 | } |
||
5526 | }; |
||
5527 | var findCommonRowType = function (rows) { |
||
5528 | var rowTypes = map$1(rows, function (row) { |
||
5529 | return getRowType$1(row).type; |
||
5530 | }); |
||
5531 | var hasHeader = contains$2(rowTypes, 'header'); |
||
5532 | var hasFooter = contains$2(rowTypes, 'footer'); |
||
5533 | if (!hasHeader && !hasFooter) { |
||
5534 | return Optional.some('body'); |
||
5535 | } else { |
||
5536 | var hasBody = contains$2(rowTypes, 'body'); |
||
5537 | if (hasHeader && !hasBody && !hasFooter) { |
||
5538 | return Optional.some('header'); |
||
5539 | } else if (!hasHeader && !hasBody && hasFooter) { |
||
5540 | return Optional.some('footer'); |
||
5541 | } else { |
||
5542 | return Optional.none(); |
||
5543 | } |
||
5544 | } |
||
5545 | }; |
||
5546 | var findTableRowHeaderType = function (warehouse) { |
||
5547 | return findMap(warehouse.all, function (row) { |
||
5548 | var rowType = getRowType$1(row); |
||
5549 | return rowType.type === 'header' ? Optional.from(rowType.subType) : Optional.none(); |
||
5550 | }); |
||
5551 | }; |
||
5552 | |||
5553 | var transformCell = function (cell, comparator, substitution) { |
||
5554 | return elementnew(substitution(cell.element, comparator), true, cell.isLocked); |
||
5555 | }; |
||
5556 | var transformRow = function (row, section) { |
||
5557 | return row.section !== section ? rowcells(row.element, row.cells, section, row.isNew) : row; |
||
5558 | }; |
||
5559 | var section = function () { |
||
5560 | return { |
||
5561 | transformRow: transformRow, |
||
5562 | transformCell: function (cell, comparator, substitution) { |
||
5563 | var newCell = substitution(cell.element, comparator); |
||
5564 | var fixedCell = name(newCell) !== 'td' ? mutate$1(newCell, 'td') : newCell; |
||
5565 | return elementnew(fixedCell, cell.isNew, cell.isLocked); |
||
5566 | } |
||
5567 | }; |
||
5568 | }; |
||
5569 | var sectionCells = function () { |
||
5570 | return { |
||
5571 | transformRow: transformRow, |
||
5572 | transformCell: transformCell |
||
5573 | }; |
||
5574 | }; |
||
5575 | var cells = function () { |
||
5576 | return { |
||
5577 | transformRow: function (row, section) { |
||
5578 | var newSection = section === 'thead' ? 'tbody' : section; |
||
5579 | return transformRow(row, newSection); |
||
5580 | }, |
||
5581 | transformCell: transformCell |
||
5582 | }; |
||
5583 | }; |
||
5584 | var fallback = function () { |
||
5585 | return { |
||
5586 | transformRow: identity, |
||
5587 | transformCell: transformCell |
||
5588 | }; |
||
5589 | }; |
||
5590 | var getTableSectionType = function (table, fallback) { |
||
5591 | var warehouse = Warehouse.fromTable(table); |
||
5592 | var type = findTableRowHeaderType(warehouse).getOr(fallback); |
||
5593 | switch (type) { |
||
5594 | case 'section': |
||
5595 | return section(); |
||
5596 | case 'sectionCells': |
||
5597 | return sectionCells(); |
||
5598 | case 'cells': |
||
5599 | return cells(); |
||
5600 | } |
||
5601 | }; |
||
5602 | var TableSection = { |
||
5603 | getTableSectionType: getTableSectionType, |
||
5604 | section: section, |
||
5605 | sectionCells: sectionCells, |
||
5606 | cells: cells, |
||
5607 | fallback: fallback |
||
5608 | }; |
||
5609 | |||
597 | daniel-mar | 5610 | var setIfNot = function (element, property, value, ignore) { |
5611 | if (value === ignore) { |
||
637 | daniel-mar | 5612 | remove$7(element, property); |
597 | daniel-mar | 5613 | } else { |
637 | daniel-mar | 5614 | set$2(element, property, value); |
597 | daniel-mar | 5615 | } |
5616 | }; |
||
637 | daniel-mar | 5617 | var insert$1 = function (table, selector, element) { |
5618 | last$2(children$1(table, selector)).fold(function () { |
||
597 | daniel-mar | 5619 | return prepend(table, element); |
5620 | }, function (child) { |
||
637 | daniel-mar | 5621 | return after$5(child, element); |
597 | daniel-mar | 5622 | }); |
5623 | }; |
||
5624 | var generateSection = function (table, sectionName) { |
||
637 | daniel-mar | 5625 | var section = child$1(table, sectionName).getOrThunk(function () { |
597 | daniel-mar | 5626 | var newSection = SugarElement.fromTag(sectionName, owner(table).dom); |
5627 | if (sectionName === 'thead') { |
||
637 | daniel-mar | 5628 | insert$1(table, 'caption,colgroup', newSection); |
597 | daniel-mar | 5629 | } else if (sectionName === 'colgroup') { |
637 | daniel-mar | 5630 | insert$1(table, 'caption', newSection); |
597 | daniel-mar | 5631 | } else { |
637 | daniel-mar | 5632 | append$1(table, newSection); |
597 | daniel-mar | 5633 | } |
5634 | return newSection; |
||
5635 | }); |
||
5636 | empty(section); |
||
5637 | return section; |
||
5638 | }; |
||
637 | daniel-mar | 5639 | var render$1 = function (table, grid) { |
597 | daniel-mar | 5640 | var newRows = []; |
5641 | var newCells = []; |
||
5642 | var syncRows = function (gridSection) { |
||
637 | daniel-mar | 5643 | return map$1(gridSection, function (row) { |
597 | daniel-mar | 5644 | if (row.isNew) { |
5645 | newRows.push(row.element); |
||
5646 | } |
||
5647 | var tr = row.element; |
||
5648 | empty(tr); |
||
637 | daniel-mar | 5649 | each$2(row.cells, function (cell) { |
597 | daniel-mar | 5650 | if (cell.isNew) { |
5651 | newCells.push(cell.element); |
||
5652 | } |
||
5653 | setIfNot(cell.element, 'colspan', cell.colspan, 1); |
||
5654 | setIfNot(cell.element, 'rowspan', cell.rowspan, 1); |
||
637 | daniel-mar | 5655 | append$1(tr, cell.element); |
597 | daniel-mar | 5656 | }); |
5657 | return tr; |
||
5658 | }); |
||
5659 | }; |
||
5660 | var syncColGroup = function (gridSection) { |
||
637 | daniel-mar | 5661 | return bind$2(gridSection, function (colGroup) { |
5662 | return map$1(colGroup.cells, function (col) { |
||
597 | daniel-mar | 5663 | setIfNot(col.element, 'span', col.colspan, 1); |
5664 | return col.element; |
||
5665 | }); |
||
5666 | }); |
||
5667 | }; |
||
5668 | var renderSection = function (gridSection, sectionName) { |
||
5669 | var section = generateSection(table, sectionName); |
||
5670 | var sync = sectionName === 'colgroup' ? syncColGroup : syncRows; |
||
5671 | var sectionElems = sync(gridSection); |
||
637 | daniel-mar | 5672 | append(section, sectionElems); |
597 | daniel-mar | 5673 | }; |
5674 | var removeSection = function (sectionName) { |
||
637 | daniel-mar | 5675 | child$1(table, sectionName).each(remove$5); |
597 | daniel-mar | 5676 | }; |
5677 | var renderOrRemoveSection = function (gridSection, sectionName) { |
||
5678 | if (gridSection.length > 0) { |
||
5679 | renderSection(gridSection, sectionName); |
||
5680 | } else { |
||
5681 | removeSection(sectionName); |
||
5682 | } |
||
5683 | }; |
||
5684 | var headSection = []; |
||
5685 | var bodySection = []; |
||
5686 | var footSection = []; |
||
5687 | var columnGroupsSection = []; |
||
637 | daniel-mar | 5688 | each$2(grid, function (row) { |
597 | daniel-mar | 5689 | switch (row.section) { |
5690 | case 'thead': |
||
5691 | headSection.push(row); |
||
5692 | break; |
||
5693 | case 'tbody': |
||
5694 | bodySection.push(row); |
||
5695 | break; |
||
5696 | case 'tfoot': |
||
5697 | footSection.push(row); |
||
5698 | break; |
||
5699 | case 'colgroup': |
||
5700 | columnGroupsSection.push(row); |
||
5701 | break; |
||
5702 | } |
||
5703 | }); |
||
5704 | renderOrRemoveSection(columnGroupsSection, 'colgroup'); |
||
5705 | renderOrRemoveSection(headSection, 'thead'); |
||
5706 | renderOrRemoveSection(bodySection, 'tbody'); |
||
5707 | renderOrRemoveSection(footSection, 'tfoot'); |
||
5708 | return { |
||
5709 | newRows: newRows, |
||
5710 | newCells: newCells |
||
5711 | }; |
||
5712 | }; |
||
637 | daniel-mar | 5713 | var copy = function (grid) { |
5714 | return map$1(grid, function (row) { |
||
597 | daniel-mar | 5715 | var tr = shallow(row.element); |
637 | daniel-mar | 5716 | each$2(row.cells, function (cell) { |
597 | daniel-mar | 5717 | var clonedCell = deep(cell.element); |
5718 | setIfNot(clonedCell, 'colspan', cell.colspan, 1); |
||
5719 | setIfNot(clonedCell, 'rowspan', cell.rowspan, 1); |
||
637 | daniel-mar | 5720 | append$1(tr, clonedCell); |
597 | daniel-mar | 5721 | }); |
5722 | return tr; |
||
5723 | }); |
||
5724 | }; |
||
5725 | |||
5726 | var getColumn = function (grid, index) { |
||
637 | daniel-mar | 5727 | return map$1(grid, function (row) { |
597 | daniel-mar | 5728 | return getCell(row, index); |
5729 | }); |
||
5730 | }; |
||
5731 | var getRow = function (grid, index) { |
||
5732 | return grid[index]; |
||
5733 | }; |
||
5734 | var findDiff = function (xs, comp) { |
||
5735 | if (xs.length === 0) { |
||
5736 | return 0; |
||
5737 | } |
||
5738 | var first = xs[0]; |
||
5739 | var index = findIndex(xs, function (x) { |
||
5740 | return !comp(first.element, x.element); |
||
5741 | }); |
||
637 | daniel-mar | 5742 | return index.getOr(xs.length); |
597 | daniel-mar | 5743 | }; |
5744 | var subgrid = function (grid, row, column, comparator) { |
||
679 | daniel-mar | 5745 | var gridRow = getRow(grid, row); |
5746 | var isColRow = gridRow.section === 'colgroup'; |
||
5747 | var colspan = findDiff(gridRow.cells.slice(column), comparator); |
||
5748 | var rowspan = isColRow ? 1 : findDiff(getColumn(grid.slice(row), column), comparator); |
||
597 | daniel-mar | 5749 | return { |
679 | daniel-mar | 5750 | colspan: colspan, |
5751 | rowspan: rowspan |
||
597 | daniel-mar | 5752 | }; |
5753 | }; |
||
5754 | |||
5755 | var toDetails = function (grid, comparator) { |
||
637 | daniel-mar | 5756 | var seen = map$1(grid, function (row) { |
5757 | return map$1(row.cells, never); |
||
597 | daniel-mar | 5758 | }); |
5759 | var updateSeen = function (rowIndex, columnIndex, rowspan, colspan) { |
||
5760 | for (var row = rowIndex; row < rowIndex + rowspan; row++) { |
||
5761 | for (var column = columnIndex; column < columnIndex + colspan; column++) { |
||
5762 | seen[row][column] = true; |
||
5763 | } |
||
5764 | } |
||
5765 | }; |
||
637 | daniel-mar | 5766 | return map$1(grid, function (row, rowIndex) { |
5767 | var details = bind$2(row.cells, function (cell, columnIndex) { |
||
597 | daniel-mar | 5768 | if (seen[rowIndex][columnIndex] === false) { |
5769 | var result = subgrid(grid, rowIndex, columnIndex, comparator); |
||
5770 | updateSeen(rowIndex, columnIndex, result.rowspan, result.colspan); |
||
5771 | return [detailnew(cell.element, result.rowspan, result.colspan, cell.isNew)]; |
||
5772 | } else { |
||
5773 | return []; |
||
5774 | } |
||
5775 | }); |
||
637 | daniel-mar | 5776 | return rowdetailnew(row.element, details, row.section, row.isNew); |
597 | daniel-mar | 5777 | }); |
5778 | }; |
||
5779 | var toGrid = function (warehouse, generators, isNew) { |
||
5780 | var grid = []; |
||
637 | daniel-mar | 5781 | each$2(warehouse.colgroups, function (colgroup) { |
679 | daniel-mar | 5782 | var colgroupCols = []; |
5783 | for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) { |
||
5784 | var element = Warehouse.getColumnAt(warehouse, columnIndex).map(function (column) { |
||
5785 | return elementnew(column.element, isNew, false); |
||
5786 | }).getOrThunk(function () { |
||
5787 | return elementnew(generators.colGap(), true, false); |
||
5788 | }); |
||
5789 | colgroupCols.push(element); |
||
5790 | } |
||
5791 | grid.push(rowcells(colgroup.element, colgroupCols, 'colgroup', isNew)); |
||
637 | daniel-mar | 5792 | }); |
597 | daniel-mar | 5793 | for (var rowIndex = 0; rowIndex < warehouse.grid.rows; rowIndex++) { |
5794 | var rowCells = []; |
||
5795 | for (var columnIndex = 0; columnIndex < warehouse.grid.columns; columnIndex++) { |
||
5796 | var element = Warehouse.getAt(warehouse, rowIndex, columnIndex).map(function (item) { |
||
5797 | return elementnew(item.element, isNew, item.isLocked); |
||
5798 | }).getOrThunk(function () { |
||
5799 | return elementnew(generators.gap(), true, false); |
||
5800 | }); |
||
5801 | rowCells.push(element); |
||
5802 | } |
||
637 | daniel-mar | 5803 | var rowDetail = warehouse.all[rowIndex]; |
5804 | var row = rowcells(rowDetail.element, rowCells, rowDetail.section, isNew); |
||
597 | daniel-mar | 5805 | grid.push(row); |
5806 | } |
||
5807 | return grid; |
||
5808 | }; |
||
5809 | |||
5810 | var fromWarehouse = function (warehouse, generators) { |
||
5811 | return toGrid(warehouse, generators, false); |
||
5812 | }; |
||
637 | daniel-mar | 5813 | var toDetailList = function (grid) { |
5814 | return toDetails(grid, eq$1); |
||
597 | daniel-mar | 5815 | }; |
5816 | var findInWarehouse = function (warehouse, element) { |
||
5817 | return findMap(warehouse.all, function (r) { |
||
637 | daniel-mar | 5818 | return find$1(r.cells, function (e) { |
597 | daniel-mar | 5819 | return eq$1(element, e.element); |
5820 | }); |
||
5821 | }); |
||
5822 | }; |
||
5823 | var extractCells = function (warehouse, target, predicate) { |
||
637 | daniel-mar | 5824 | var details = map$1(target.selection, function (cell$1) { |
597 | daniel-mar | 5825 | return cell(cell$1).bind(function (lc) { |
5826 | return findInWarehouse(warehouse, lc); |
||
5827 | }).filter(predicate); |
||
5828 | }); |
||
5829 | var cells = cat(details); |
||
5830 | return someIf(cells.length > 0, cells); |
||
5831 | }; |
||
5832 | var run = function (operation, extract, adjustment, postAction, genWrappers) { |
||
637 | daniel-mar | 5833 | return function (wire, table, target, generators, behaviours) { |
597 | daniel-mar | 5834 | var warehouse = Warehouse.fromTable(table); |
637 | daniel-mar | 5835 | var tableSection = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.section).getOrThunk(TableSection.fallback); |
597 | daniel-mar | 5836 | var output = extract(warehouse, target).map(function (info) { |
5837 | var model = fromWarehouse(warehouse, generators); |
||
637 | daniel-mar | 5838 | var result = operation(model, info, eq$1, genWrappers(generators), tableSection); |
597 | daniel-mar | 5839 | var lockedColumns = getLockedColumnsFromGrid(result.grid); |
637 | daniel-mar | 5840 | var grid = toDetailList(result.grid); |
597 | daniel-mar | 5841 | return { |
5842 | info: info, |
||
5843 | grid: grid, |
||
5844 | cursor: result.cursor, |
||
5845 | lockedColumns: lockedColumns |
||
5846 | }; |
||
5847 | }); |
||
5848 | return output.bind(function (out) { |
||
637 | daniel-mar | 5849 | var newElements = render$1(table, out.grid); |
5850 | var tableSizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.sizing).getOrThunk(function () { |
||
597 | daniel-mar | 5851 | return TableSize.getTableSize(table); |
5852 | }); |
||
637 | daniel-mar | 5853 | var resizing = Optional.from(behaviours === null || behaviours === void 0 ? void 0 : behaviours.resize).getOrThunk(preserveTable); |
5854 | adjustment(table, out.grid, out.info, { |
||
5855 | sizing: tableSizing, |
||
5856 | resize: resizing, |
||
5857 | section: tableSection |
||
5858 | }); |
||
597 | daniel-mar | 5859 | postAction(table); |
5860 | refresh(wire, table); |
||
637 | daniel-mar | 5861 | remove$7(table, LOCKED_COL_ATTR); |
597 | daniel-mar | 5862 | if (out.lockedColumns.length > 0) { |
637 | daniel-mar | 5863 | set$2(table, LOCKED_COL_ATTR, out.lockedColumns.join(',')); |
597 | daniel-mar | 5864 | } |
5865 | return Optional.some({ |
||
5866 | cursor: out.cursor, |
||
5867 | newRows: newElements.newRows, |
||
5868 | newCells: newElements.newCells |
||
5869 | }); |
||
5870 | }); |
||
5871 | }; |
||
5872 | }; |
||
5873 | var onPaste = function (warehouse, target) { |
||
5874 | return cell(target.element).bind(function (cell) { |
||
5875 | return findInWarehouse(warehouse, cell).map(function (details) { |
||
5876 | var value = __assign(__assign({}, details), { |
||
5877 | generators: target.generators, |
||
5878 | clipboard: target.clipboard |
||
5879 | }); |
||
5880 | return value; |
||
5881 | }); |
||
5882 | }); |
||
5883 | }; |
||
5884 | var onPasteByEditor = function (warehouse, target) { |
||
5885 | return extractCells(warehouse, target, always).map(function (cells) { |
||
5886 | return { |
||
5887 | cells: cells, |
||
5888 | generators: target.generators, |
||
5889 | clipboard: target.clipboard |
||
5890 | }; |
||
5891 | }); |
||
5892 | }; |
||
5893 | var onMergable = function (_warehouse, target) { |
||
5894 | return target.mergable; |
||
5895 | }; |
||
5896 | var onUnmergable = function (_warehouse, target) { |
||
5897 | return target.unmergable; |
||
5898 | }; |
||
5899 | var onCells = function (warehouse, target) { |
||
5900 | return extractCells(warehouse, target, always); |
||
5901 | }; |
||
5902 | var onUnlockedCells = function (warehouse, target) { |
||
5903 | return extractCells(warehouse, target, function (detail) { |
||
5904 | return !detail.isLocked; |
||
5905 | }); |
||
5906 | }; |
||
5907 | var isUnlockedTableCell = function (warehouse, cell) { |
||
5908 | return findInWarehouse(warehouse, cell).exists(function (detail) { |
||
5909 | return !detail.isLocked; |
||
5910 | }); |
||
5911 | }; |
||
5912 | var allUnlocked = function (warehouse, cells) { |
||
5913 | return forall(cells, function (cell) { |
||
5914 | return isUnlockedTableCell(warehouse, cell); |
||
5915 | }); |
||
5916 | }; |
||
5917 | var onUnlockedMergable = function (warehouse, target) { |
||
5918 | return onMergable(warehouse, target).filter(function (mergeable) { |
||
5919 | return allUnlocked(warehouse, mergeable.cells); |
||
5920 | }); |
||
5921 | }; |
||
5922 | var onUnlockedUnmergable = function (warehouse, target) { |
||
5923 | return onUnmergable(warehouse, target).filter(function (cells) { |
||
5924 | return allUnlocked(warehouse, cells); |
||
5925 | }); |
||
5926 | }; |
||
5927 | |||
637 | daniel-mar | 5928 | var merge$2 = function (grid, bounds, comparator, substitution) { |
597 | daniel-mar | 5929 | var rows = extractGridDetails(grid).rows; |
5930 | if (rows.length === 0) { |
||
5931 | return grid; |
||
5932 | } |
||
5933 | for (var i = bounds.startRow; i <= bounds.finishRow; i++) { |
||
5934 | for (var j = bounds.startCol; j <= bounds.finishCol; j++) { |
||
5935 | var row = rows[i]; |
||
5936 | var isLocked = getCell(row, j).isLocked; |
||
5937 | mutateCell(row, j, elementnew(substitution(), false, isLocked)); |
||
5938 | } |
||
5939 | } |
||
5940 | return grid; |
||
5941 | }; |
||
5942 | var unmerge = function (grid, target, comparator, substitution) { |
||
5943 | var rows = extractGridDetails(grid).rows; |
||
5944 | var first = true; |
||
5945 | for (var i = 0; i < rows.length; i++) { |
||
5946 | for (var j = 0; j < cellLength(rows[0]); j++) { |
||
5947 | var row = rows[i]; |
||
5948 | var currentCell = getCell(row, j); |
||
5949 | var currentCellElm = currentCell.element; |
||
5950 | var isToReplace = comparator(currentCellElm, target); |
||
5951 | if (isToReplace === true && first === false) { |
||
5952 | mutateCell(row, j, elementnew(substitution(), true, currentCell.isLocked)); |
||
5953 | } else if (isToReplace === true) { |
||
5954 | first = false; |
||
5955 | } |
||
5956 | } |
||
5957 | } |
||
5958 | return grid; |
||
5959 | }; |
||
5960 | var uniqueCells = function (row, comparator) { |
||
5961 | return foldl(row, function (rest, cell) { |
||
5962 | return exists(rest, function (currentCell) { |
||
5963 | return comparator(currentCell.element, cell.element); |
||
5964 | }) ? rest : rest.concat([cell]); |
||
5965 | }, []); |
||
5966 | }; |
||
5967 | var splitCols = function (grid, index, comparator, substitution) { |
||
5968 | if (index > 0 && index < grid[0].cells.length) { |
||
637 | daniel-mar | 5969 | each$2(grid, function (row) { |
597 | daniel-mar | 5970 | var prevCell = row.cells[index - 1]; |
5971 | var current = row.cells[index]; |
||
5972 | var isToReplace = comparator(current.element, prevCell.element); |
||
5973 | if (isToReplace) { |
||
5974 | mutateCell(row, index, elementnew(substitution(), true, current.isLocked)); |
||
5975 | } |
||
5976 | }); |
||
5977 | } |
||
5978 | return grid; |
||
5979 | }; |
||
5980 | var splitRows = function (grid, index, comparator, substitution) { |
||
5981 | var rows = extractGridDetails(grid).rows; |
||
5982 | if (index > 0 && index < rows.length) { |
||
5983 | var rowPrevCells = rows[index - 1].cells; |
||
5984 | var cells = uniqueCells(rowPrevCells, comparator); |
||
637 | daniel-mar | 5985 | each$2(cells, function (cell) { |
597 | daniel-mar | 5986 | var replacement = Optional.none(); |
5987 | for (var i = index; i < rows.length; i++) { |
||
5988 | var _loop_1 = function (j) { |
||
5989 | var row = rows[i]; |
||
5990 | var current = getCell(row, j); |
||
5991 | var isToReplace = comparator(current.element, cell.element); |
||
5992 | if (isToReplace) { |
||
5993 | if (replacement.isNone()) { |
||
5994 | replacement = Optional.some(substitution()); |
||
5995 | } |
||
5996 | replacement.each(function (sub) { |
||
5997 | mutateCell(row, j, elementnew(sub, true, current.isLocked)); |
||
5998 | }); |
||
5999 | } |
||
6000 | }; |
||
6001 | for (var j = 0; j < cellLength(rows[0]); j++) { |
||
6002 | _loop_1(j); |
||
6003 | } |
||
6004 | } |
||
6005 | }); |
||
6006 | } |
||
6007 | return grid; |
||
6008 | }; |
||
6009 | |||
637 | daniel-mar | 6010 | var value$1 = function (o) { |
597 | daniel-mar | 6011 | var or = function (_opt) { |
637 | daniel-mar | 6012 | return value$1(o); |
597 | daniel-mar | 6013 | }; |
6014 | var orThunk = function (_f) { |
||
637 | daniel-mar | 6015 | return value$1(o); |
597 | daniel-mar | 6016 | }; |
6017 | var map = function (f) { |
||
637 | daniel-mar | 6018 | return value$1(f(o)); |
597 | daniel-mar | 6019 | }; |
6020 | var mapError = function (_f) { |
||
637 | daniel-mar | 6021 | return value$1(o); |
597 | daniel-mar | 6022 | }; |
6023 | var each = function (f) { |
||
6024 | f(o); |
||
6025 | }; |
||
6026 | var bind = function (f) { |
||
6027 | return f(o); |
||
6028 | }; |
||
6029 | var fold = function (_, onValue) { |
||
6030 | return onValue(o); |
||
6031 | }; |
||
6032 | var exists = function (f) { |
||
6033 | return f(o); |
||
6034 | }; |
||
6035 | var forall = function (f) { |
||
6036 | return f(o); |
||
6037 | }; |
||
6038 | var toOptional = function () { |
||
6039 | return Optional.some(o); |
||
6040 | }; |
||
6041 | return { |
||
6042 | isValue: always, |
||
6043 | isError: never, |
||
6044 | getOr: constant(o), |
||
6045 | getOrThunk: constant(o), |
||
6046 | getOrDie: constant(o), |
||
6047 | or: or, |
||
6048 | orThunk: orThunk, |
||
6049 | fold: fold, |
||
6050 | map: map, |
||
6051 | mapError: mapError, |
||
6052 | each: each, |
||
6053 | bind: bind, |
||
6054 | exists: exists, |
||
6055 | forall: forall, |
||
6056 | toOptional: toOptional |
||
6057 | }; |
||
6058 | }; |
||
6059 | var error = function (message) { |
||
6060 | var getOrThunk = function (f) { |
||
6061 | return f(); |
||
6062 | }; |
||
6063 | var getOrDie = function () { |
||
6064 | return die(String(message))(); |
||
6065 | }; |
||
637 | daniel-mar | 6066 | var or = identity; |
597 | daniel-mar | 6067 | var orThunk = function (f) { |
6068 | return f(); |
||
6069 | }; |
||
6070 | var map = function (_f) { |
||
6071 | return error(message); |
||
6072 | }; |
||
6073 | var mapError = function (f) { |
||
6074 | return error(f(message)); |
||
6075 | }; |
||
6076 | var bind = function (_f) { |
||
6077 | return error(message); |
||
6078 | }; |
||
6079 | var fold = function (onError, _) { |
||
6080 | return onError(message); |
||
6081 | }; |
||
6082 | return { |
||
6083 | isValue: never, |
||
6084 | isError: always, |
||
6085 | getOr: identity, |
||
6086 | getOrThunk: getOrThunk, |
||
6087 | getOrDie: getOrDie, |
||
6088 | or: or, |
||
6089 | orThunk: orThunk, |
||
6090 | fold: fold, |
||
6091 | map: map, |
||
6092 | mapError: mapError, |
||
6093 | each: noop, |
||
6094 | bind: bind, |
||
6095 | exists: never, |
||
6096 | forall: always, |
||
6097 | toOptional: Optional.none |
||
6098 | }; |
||
6099 | }; |
||
6100 | var fromOption = function (opt, err) { |
||
6101 | return opt.fold(function () { |
||
6102 | return error(err); |
||
637 | daniel-mar | 6103 | }, value$1); |
597 | daniel-mar | 6104 | }; |
6105 | var Result = { |
||
637 | daniel-mar | 6106 | value: value$1, |
597 | daniel-mar | 6107 | error: error, |
6108 | fromOption: fromOption |
||
6109 | }; |
||
6110 | |||
6111 | var measure = function (startAddress, gridA, gridB) { |
||
6112 | if (startAddress.row >= gridA.length || startAddress.column > cellLength(gridA[0])) { |
||
6113 | return Result.error('invalid start address out of table bounds, row: ' + startAddress.row + ', column: ' + startAddress.column); |
||
6114 | } |
||
6115 | var rowRemainder = gridA.slice(startAddress.row); |
||
6116 | var colRemainder = rowRemainder[0].cells.slice(startAddress.column); |
||
6117 | var colRequired = cellLength(gridB[0]); |
||
6118 | var rowRequired = gridB.length; |
||
6119 | return Result.value({ |
||
6120 | rowDelta: rowRemainder.length - rowRequired, |
||
6121 | colDelta: colRemainder.length - colRequired |
||
6122 | }); |
||
6123 | }; |
||
6124 | var measureWidth = function (gridA, gridB) { |
||
6125 | var colLengthA = cellLength(gridA[0]); |
||
6126 | var colLengthB = cellLength(gridB[0]); |
||
6127 | return { |
||
6128 | rowDelta: 0, |
||
6129 | colDelta: colLengthA - colLengthB |
||
6130 | }; |
||
6131 | }; |
||
6132 | var measureHeight = function (gridA, gridB) { |
||
6133 | var rowLengthA = gridA.length; |
||
6134 | var rowLengthB = gridB.length; |
||
6135 | return { |
||
6136 | rowDelta: rowLengthA - rowLengthB, |
||
6137 | colDelta: 0 |
||
6138 | }; |
||
6139 | }; |
||
6140 | var generateElements = function (amount, row, generators, isLocked) { |
||
6141 | var generator = row.section === 'colgroup' ? generators.col : generators.cell; |
||
637 | daniel-mar | 6142 | return range$1(amount, function (idx) { |
597 | daniel-mar | 6143 | return elementnew(generator(), true, isLocked(idx)); |
6144 | }); |
||
6145 | }; |
||
6146 | var rowFill = function (grid, amount, generators, lockedColumns) { |
||
637 | daniel-mar | 6147 | var exampleRow = grid[grid.length - 1]; |
6148 | return grid.concat(range$1(amount, function () { |
||
6149 | var generator = exampleRow.section === 'colgroup' ? generators.colgroup : generators.row; |
||
6150 | var row = clone$1(exampleRow, generator, identity); |
||
597 | daniel-mar | 6151 | var elements = generateElements(row.cells.length, row, generators, function (idx) { |
637 | daniel-mar | 6152 | return has$1(lockedColumns, idx.toString()); |
597 | daniel-mar | 6153 | }); |
6154 | return setCells(row, elements); |
||
6155 | })); |
||
6156 | }; |
||
6157 | var colFill = function (grid, amount, generators, startIndex) { |
||
637 | daniel-mar | 6158 | return map$1(grid, function (row) { |
597 | daniel-mar | 6159 | var newChildren = generateElements(amount, row, generators, never); |
6160 | return addCells(row, startIndex, newChildren); |
||
6161 | }); |
||
6162 | }; |
||
6163 | var lockedColFill = function (grid, generators, lockedColumns) { |
||
637 | daniel-mar | 6164 | return map$1(grid, function (row) { |
597 | daniel-mar | 6165 | return foldl(lockedColumns, function (acc, colNum) { |
6166 | var newChild = generateElements(1, row, generators, always)[0]; |
||
6167 | return addCell(acc, colNum, newChild); |
||
6168 | }, row); |
||
6169 | }); |
||
6170 | }; |
||
6171 | var tailor = function (gridA, delta, generators) { |
||
6172 | var fillCols = delta.colDelta < 0 ? colFill : identity; |
||
6173 | var fillRows = delta.rowDelta < 0 ? rowFill : identity; |
||
6174 | var lockedColumns = getLockedColumnsFromGrid(gridA); |
||
6175 | var gridWidth = cellLength(gridA[0]); |
||
6176 | var isLastColLocked = exists(lockedColumns, function (locked) { |
||
6177 | return locked === gridWidth - 1; |
||
6178 | }); |
||
6179 | var modifiedCols = fillCols(gridA, Math.abs(delta.colDelta), generators, isLastColLocked ? gridWidth - 1 : gridWidth); |
||
6180 | var newLockedColumns = getLockedColumnsFromGrid(modifiedCols); |
||
6181 | return fillRows(modifiedCols, Math.abs(delta.rowDelta), generators, mapToObject(newLockedColumns, always)); |
||
6182 | }; |
||
6183 | |||
6184 | var isSpanning = function (grid, row, col, comparator) { |
||
6185 | var candidate = getCell(grid[row], col); |
||
6186 | var matching = curry(comparator, candidate.element); |
||
6187 | var currentRow = grid[row]; |
||
6188 | return grid.length > 1 && cellLength(currentRow) > 1 && (col > 0 && matching(getCellElement(currentRow, col - 1)) || col < currentRow.cells.length - 1 && matching(getCellElement(currentRow, col + 1)) || row > 0 && matching(getCellElement(grid[row - 1], col)) || row < grid.length - 1 && matching(getCellElement(grid[row + 1], col))); |
||
6189 | }; |
||
6190 | var mergeTables = function (startAddress, gridA, gridB, generator, comparator, lockedColumns) { |
||
6191 | var startRow = startAddress.row; |
||
6192 | var startCol = startAddress.column; |
||
6193 | var mergeHeight = gridB.length; |
||
6194 | var mergeWidth = cellLength(gridB[0]); |
||
6195 | var endRow = startRow + mergeHeight; |
||
6196 | var endCol = startCol + mergeWidth + lockedColumns.length; |
||
6197 | var lockedColumnObj = mapToObject(lockedColumns, always); |
||
6198 | for (var r = startRow; r < endRow; r++) { |
||
6199 | var skippedCol = 0; |
||
6200 | for (var c = startCol; c < endCol; c++) { |
||
6201 | if (lockedColumnObj[c]) { |
||
6202 | skippedCol++; |
||
6203 | continue; |
||
6204 | } |
||
6205 | if (isSpanning(gridA, r, c, comparator)) { |
||
6206 | unmerge(gridA, getCellElement(gridA[r], c), comparator, generator.cell); |
||
6207 | } |
||
6208 | var gridBColIndex = c - startCol - skippedCol; |
||
6209 | var newCell = getCell(gridB[r - startRow], gridBColIndex); |
||
6210 | var newCellElm = newCell.element; |
||
6211 | var replacement = generator.replace(newCellElm); |
||
6212 | mutateCell(gridA[r], c, elementnew(replacement, true, newCell.isLocked)); |
||
6213 | } |
||
6214 | } |
||
6215 | return gridA; |
||
6216 | }; |
||
6217 | var getValidStartAddress = function (currentStartAddress, grid, lockedColumns) { |
||
6218 | var gridColLength = cellLength(grid[0]); |
||
637 | daniel-mar | 6219 | var adjustedRowAddress = extractGridDetails(grid).cols.length + currentStartAddress.row; |
6220 | var possibleColAddresses = range$1(gridColLength - currentStartAddress.column, function (num) { |
||
597 | daniel-mar | 6221 | return num + currentStartAddress.column; |
6222 | }); |
||
637 | daniel-mar | 6223 | var validColAddress = find$1(possibleColAddresses, function (num) { |
597 | daniel-mar | 6224 | return forall(lockedColumns, function (col) { |
6225 | return col !== num; |
||
6226 | }); |
||
6227 | }).getOr(gridColLength - 1); |
||
637 | daniel-mar | 6228 | return { |
6229 | row: adjustedRowAddress, |
||
6230 | column: validColAddress |
||
6231 | }; |
||
597 | daniel-mar | 6232 | }; |
6233 | var getLockedColumnsWithinBounds = function (startAddress, grid, lockedColumns) { |
||
637 | daniel-mar | 6234 | return filter$2(lockedColumns, function (colNum) { |
597 | daniel-mar | 6235 | return colNum >= startAddress.column && colNum <= cellLength(grid[0]) + startAddress.column; |
6236 | }); |
||
6237 | }; |
||
6238 | var merge$1 = function (startAddress, gridA, gridB, generator, comparator) { |
||
6239 | var lockedColumns = getLockedColumnsFromGrid(gridA); |
||
6240 | var validStartAddress = getValidStartAddress(startAddress, gridA, lockedColumns); |
||
637 | daniel-mar | 6241 | var gridBRows = extractGridDetails(gridB).rows; |
6242 | var lockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, lockedColumns); |
||
6243 | var result = measure(validStartAddress, gridA, gridBRows); |
||
597 | daniel-mar | 6244 | return result.map(function (diff) { |
6245 | var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - lockedColumnsWithinBounds.length }); |
||
6246 | var fittedGrid = tailor(gridA, delta, generator); |
||
6247 | var newLockedColumns = getLockedColumnsFromGrid(fittedGrid); |
||
637 | daniel-mar | 6248 | var newLockedColumnsWithinBounds = getLockedColumnsWithinBounds(validStartAddress, gridBRows, newLockedColumns); |
6249 | return mergeTables(validStartAddress, fittedGrid, gridBRows, generator, comparator, newLockedColumnsWithinBounds); |
||
597 | daniel-mar | 6250 | }); |
6251 | }; |
||
6252 | var insertCols = function (index, gridA, gridB, generator, comparator) { |
||
6253 | splitCols(gridA, index, comparator, generator.cell); |
||
6254 | var delta = measureHeight(gridB, gridA); |
||
6255 | var fittedNewGrid = tailor(gridB, delta, generator); |
||
6256 | var secondDelta = measureHeight(gridA, fittedNewGrid); |
||
6257 | var fittedOldGrid = tailor(gridA, secondDelta, generator); |
||
637 | daniel-mar | 6258 | return map$1(fittedOldGrid, function (gridRow, i) { |
597 | daniel-mar | 6259 | return addCells(gridRow, index, fittedNewGrid[i].cells); |
6260 | }); |
||
6261 | }; |
||
6262 | var insertRows = function (index, gridA, gridB, generator, comparator) { |
||
6263 | splitRows(gridA, index, comparator, generator.cell); |
||
6264 | var locked = getLockedColumnsFromGrid(gridA); |
||
6265 | var diff = measureWidth(gridA, gridB); |
||
6266 | var delta = __assign(__assign({}, diff), { colDelta: diff.colDelta - locked.length }); |
||
6267 | var fittedOldGrid = tailor(gridA, delta, generator); |
||
6268 | var _a = extractGridDetails(fittedOldGrid), oldCols = _a.cols, oldRows = _a.rows; |
||
6269 | var newLocked = getLockedColumnsFromGrid(fittedOldGrid); |
||
6270 | var secondDiff = measureWidth(gridB, gridA); |
||
6271 | var secondDelta = __assign(__assign({}, secondDiff), { colDelta: secondDiff.colDelta + newLocked.length }); |
||
6272 | var fittedGridB = lockedColFill(gridB, generator, newLocked); |
||
6273 | var fittedNewGrid = tailor(fittedGridB, secondDelta, generator); |
||
6274 | return oldCols.concat(oldRows.slice(0, index)).concat(fittedNewGrid).concat(oldRows.slice(index, oldRows.length)); |
||
6275 | }; |
||
6276 | |||
637 | daniel-mar | 6277 | var cloneRow = function (row, cloneCell, comparator, substitution) { |
6278 | return clone$1(row, function (elem) { |
||
6279 | return substitution(elem, comparator); |
||
6280 | }, cloneCell); |
||
6281 | }; |
||
597 | daniel-mar | 6282 | var insertRowAt = function (grid, index, example, comparator, substitution) { |
6283 | var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols; |
||
6284 | var before = rows.slice(0, index); |
||
6285 | var after = rows.slice(index); |
||
637 | daniel-mar | 6286 | var newRow = cloneRow(rows[example], function (ex, c) { |
597 | daniel-mar | 6287 | var withinSpan = index > 0 && index < rows.length && comparator(getCellElement(rows[index - 1], c), getCellElement(rows[index], c)); |
6288 | var ret = withinSpan ? getCell(rows[index], c) : elementnew(substitution(ex.element, comparator), true, ex.isLocked); |
||
6289 | return ret; |
||
637 | daniel-mar | 6290 | }, comparator, substitution); |
6291 | return cols.concat(before).concat([newRow]).concat(after); |
||
597 | daniel-mar | 6292 | }; |
6293 | var getElementFor = function (row, column, section, withinSpan, example, comparator, substitution) { |
||
6294 | if (section === 'colgroup' || !withinSpan) { |
||
6295 | var cell = getCell(row, example); |
||
6296 | return elementnew(substitution(cell.element, comparator), true, false); |
||
6297 | } else { |
||
6298 | return getCell(row, column); |
||
6299 | } |
||
6300 | }; |
||
6301 | var insertColumnAt = function (grid, index, example, comparator, substitution) { |
||
637 | daniel-mar | 6302 | return map$1(grid, function (row) { |
597 | daniel-mar | 6303 | var withinSpan = index > 0 && index < cellLength(row) && comparator(getCellElement(row, index - 1), getCellElement(row, index)); |
6304 | var sub = getElementFor(row, index, row.section, withinSpan, example, comparator, substitution); |
||
6305 | return addCell(row, index, sub); |
||
6306 | }); |
||
6307 | }; |
||
6308 | var deleteColumnsAt = function (grid, columns) { |
||
637 | daniel-mar | 6309 | return bind$2(grid, function (row) { |
597 | daniel-mar | 6310 | var existingCells = row.cells; |
6311 | var cells = foldr(columns, function (acc, column) { |
||
6312 | return column >= 0 && column < acc.length ? acc.slice(0, column).concat(acc.slice(column + 1)) : acc; |
||
6313 | }, existingCells); |
||
637 | daniel-mar | 6314 | return cells.length > 0 ? [rowcells(row.element, cells, row.section, row.isNew)] : []; |
597 | daniel-mar | 6315 | }); |
6316 | }; |
||
6317 | var deleteRowsAt = function (grid, start, finish) { |
||
6318 | var _a = extractGridDetails(grid), rows = _a.rows, cols = _a.cols; |
||
6319 | return cols.concat(rows.slice(0, start)).concat(rows.slice(finish + 1)); |
||
6320 | }; |
||
6321 | |||
679 | daniel-mar | 6322 | var notInStartRow = function (grid, rowIndex, colIndex, comparator) { |
6323 | return getCellElement(grid[rowIndex], colIndex) !== undefined && (rowIndex > 0 && comparator(getCellElement(grid[rowIndex - 1], colIndex), getCellElement(grid[rowIndex], colIndex))); |
||
6324 | }; |
||
6325 | var notInStartColumn = function (row, index, comparator) { |
||
6326 | return index > 0 && comparator(getCellElement(row, index - 1), getCellElement(row, index)); |
||
6327 | }; |
||
6328 | var isDuplicatedCell = function (grid, rowIndex, colIndex, comparator) { |
||
6329 | return notInStartRow(grid, rowIndex, colIndex, comparator) || notInStartColumn(grid[rowIndex], colIndex, comparator); |
||
6330 | }; |
||
6331 | var rowReplacerPredicate = function (targetRow, columnHeaders) { |
||
6332 | var entireTableIsHeader = forall(columnHeaders, identity) && isHeaderCells(targetRow.cells); |
||
6333 | return entireTableIsHeader ? always : function (cell, _rowIndex, colIndex) { |
||
6334 | var type = name(cell.element); |
||
6335 | return !(type === 'th' && columnHeaders[colIndex]); |
||
6336 | }; |
||
6337 | }; |
||
6338 | var columnReplacePredicate = function (targetColumn, rowHeaders) { |
||
6339 | var entireTableIsHeader = forall(rowHeaders, identity) && isHeaderCells(targetColumn); |
||
6340 | return entireTableIsHeader ? always : function (cell, rowIndex, _colIndex) { |
||
6341 | var type = name(cell.element); |
||
6342 | return !(type === 'th' && rowHeaders[rowIndex]); |
||
6343 | }; |
||
6344 | }; |
||
6345 | var determineScope = function (applyScope, element, newScope, isInHeader) { |
||
6346 | var hasSpan = function (scope) { |
||
6347 | return scope === 'row' ? hasRowspan(element) : hasColspan(element); |
||
6348 | }; |
||
6349 | var getScope = function (scope) { |
||
6350 | return hasSpan(scope) ? scope + 'group' : scope; |
||
6351 | }; |
||
6352 | if (applyScope) { |
||
6353 | return isHeaderCell(element) ? getScope(newScope) : null; |
||
6354 | } else if (isInHeader && isHeaderCell(element)) { |
||
6355 | var oppositeScope = newScope === 'row' ? 'col' : 'row'; |
||
6356 | return getScope(oppositeScope); |
||
6357 | } else { |
||
6358 | return null; |
||
6359 | } |
||
6360 | }; |
||
6361 | var rowScopeGenerator = function (applyScope, columnHeaders) { |
||
6362 | return function (cell, rowIndex, columnIndex) { |
||
6363 | return Optional.some(determineScope(applyScope, cell.element, 'col', columnHeaders[columnIndex])); |
||
6364 | }; |
||
6365 | }; |
||
6366 | var columnScopeGenerator = function (applyScope, rowHeaders) { |
||
6367 | return function (cell, rowIndex) { |
||
6368 | return Optional.some(determineScope(applyScope, cell.element, 'row', rowHeaders[rowIndex])); |
||
6369 | }; |
||
6370 | }; |
||
637 | daniel-mar | 6371 | var replace = function (cell, comparator, substitute) { |
6372 | return elementnew(substitute(cell.element, comparator), true, cell.isLocked); |
||
6373 | }; |
||
679 | daniel-mar | 6374 | var replaceIn = function (grid, targets, comparator, substitute, replacer, genScope, shouldReplace) { |
597 | daniel-mar | 6375 | var isTarget = function (cell) { |
6376 | return exists(targets, function (target) { |
||
6377 | return comparator(cell.element, target.element); |
||
6378 | }); |
||
6379 | }; |
||
679 | daniel-mar | 6380 | return map$1(grid, function (row, rowIndex) { |
6381 | return mapCells(row, function (cell, colIndex) { |
||
6382 | if (isTarget(cell)) { |
||
6383 | var newCell_1 = shouldReplace(cell, rowIndex, colIndex) ? replacer(cell, comparator, substitute) : cell; |
||
6384 | genScope(newCell_1, rowIndex, colIndex).each(function (scope) { |
||
6385 | setOptions(newCell_1.element, { scope: Optional.from(scope) }); |
||
6386 | }); |
||
6387 | return newCell_1; |
||
6388 | } else { |
||
6389 | return cell; |
||
6390 | } |
||
597 | daniel-mar | 6391 | }); |
6392 | }); |
||
6393 | }; |
||
679 | daniel-mar | 6394 | var getColumnCells = function (rows, columnIndex, comparator) { |
6395 | return bind$2(rows, function (row, i) { |
||
6396 | return isDuplicatedCell(rows, i, columnIndex, comparator) ? [] : [getCell(row, columnIndex)]; |
||
6397 | }); |
||
597 | daniel-mar | 6398 | }; |
679 | daniel-mar | 6399 | var getRowCells = function (rows, rowIndex, comparator) { |
6400 | var targetRow = rows[rowIndex]; |
||
6401 | return bind$2(targetRow.cells, function (item, i) { |
||
6402 | return isDuplicatedCell(rows, rowIndex, i, comparator) ? [] : [item]; |
||
6403 | }); |
||
597 | daniel-mar | 6404 | }; |
679 | daniel-mar | 6405 | var replaceColumns = function (grid, indexes, applyScope, comparator, substitution) { |
597 | daniel-mar | 6406 | var rows = extractGridDetails(grid).rows; |
679 | daniel-mar | 6407 | var targets = bind$2(indexes, function (index) { |
6408 | return getColumnCells(rows, index, comparator); |
||
597 | daniel-mar | 6409 | }); |
679 | daniel-mar | 6410 | var rowHeaders = map$1(grid, function (row) { |
6411 | return isHeaderCells(row.cells); |
||
6412 | }); |
||
6413 | var shouldReplaceCell = columnReplacePredicate(targets, rowHeaders); |
||
6414 | var scopeGenerator = columnScopeGenerator(applyScope, rowHeaders); |
||
6415 | return replaceIn(grid, targets, comparator, substitution, replace, scopeGenerator, shouldReplaceCell); |
||
597 | daniel-mar | 6416 | }; |
679 | daniel-mar | 6417 | var replaceRows = function (grid, indexes, section, applyScope, comparator, substitution, tableSection) { |
637 | daniel-mar | 6418 | var _a = extractGridDetails(grid), cols = _a.cols, rows = _a.rows; |
679 | daniel-mar | 6419 | var targetRow = rows[indexes[0]]; |
6420 | var targets = bind$2(indexes, function (index) { |
||
6421 | return getRowCells(rows, index, comparator); |
||
597 | daniel-mar | 6422 | }); |
679 | daniel-mar | 6423 | var columnHeaders = map$1(targetRow.cells, function (_cell, index) { |
6424 | return isHeaderCells(getColumnCells(rows, index, comparator)); |
||
6425 | }); |
||
6426 | var newRows = __spreadArray([], rows, true); |
||
6427 | each$2(indexes, function (index) { |
||
6428 | newRows[index] = tableSection.transformRow(rows[index], section); |
||
6429 | }); |
||
6430 | var newGrid = cols.concat(newRows); |
||
6431 | var shouldReplaceCell = rowReplacerPredicate(targetRow, columnHeaders); |
||
6432 | var scopeGenerator = rowScopeGenerator(applyScope, columnHeaders); |
||
6433 | return replaceIn(newGrid, targets, comparator, substitution, tableSection.transformCell, scopeGenerator, shouldReplaceCell); |
||
597 | daniel-mar | 6434 | }; |
679 | daniel-mar | 6435 | var replaceCells = function (grid, details, comparator, substitution) { |
637 | daniel-mar | 6436 | var rows = extractGridDetails(grid).rows; |
679 | daniel-mar | 6437 | var targetCells = map$1(details, function (detail) { |
6438 | return getCell(rows[detail.row], detail.column); |
||
6439 | }); |
||
6440 | return replaceIn(grid, targetCells, comparator, substitution, replace, Optional.none, always); |
||
637 | daniel-mar | 6441 | }; |
597 | daniel-mar | 6442 | |
6443 | var uniqueColumns = function (details) { |
||
6444 | var uniqueCheck = function (rest, detail) { |
||
6445 | var columnExists = exists(rest, function (currentDetail) { |
||
6446 | return currentDetail.column === detail.column; |
||
6447 | }); |
||
6448 | return columnExists ? rest : rest.concat([detail]); |
||
6449 | }; |
||
6450 | return foldl(details, uniqueCheck, []).sort(function (detailA, detailB) { |
||
6451 | return detailA.column - detailB.column; |
||
6452 | }); |
||
6453 | }; |
||
6454 | |||
637 | daniel-mar | 6455 | var isCol = isTag('col'); |
6456 | var isColgroup = isTag('colgroup'); |
||
6457 | var isRow$1 = function (element) { |
||
6458 | return name(element) === 'tr' || isColgroup(element); |
||
6459 | }; |
||
597 | daniel-mar | 6460 | var elementToData = function (element) { |
6461 | var colspan = getAttrValue(element, 'colspan', 1); |
||
6462 | var rowspan = getAttrValue(element, 'rowspan', 1); |
||
6463 | return { |
||
6464 | element: element, |
||
6465 | colspan: colspan, |
||
6466 | rowspan: rowspan |
||
6467 | }; |
||
6468 | }; |
||
6469 | var modification = function (generators, toData) { |
||
6470 | if (toData === void 0) { |
||
6471 | toData = elementToData; |
||
6472 | } |
||
637 | daniel-mar | 6473 | var nuCell = function (data) { |
6474 | return isCol(data.element) ? generators.col(data) : generators.cell(data); |
||
597 | daniel-mar | 6475 | }; |
637 | daniel-mar | 6476 | var nuRow = function (data) { |
6477 | return isColgroup(data.element) ? generators.colgroup(data) : generators.row(data); |
||
597 | daniel-mar | 6478 | }; |
6479 | var add = function (element) { |
||
637 | daniel-mar | 6480 | if (isRow$1(element)) { |
6481 | return nuRow({ element: element }); |
||
6482 | } else { |
||
6483 | var replacement = nuCell(toData(element)); |
||
6484 | recent = Optional.some({ |
||
6485 | item: element, |
||
6486 | replacement: replacement |
||
6487 | }); |
||
6488 | return replacement; |
||
597 | daniel-mar | 6489 | } |
6490 | }; |
||
6491 | var recent = Optional.none(); |
||
6492 | var getOrInit = function (element, comparator) { |
||
6493 | return recent.fold(function () { |
||
6494 | return add(element); |
||
6495 | }, function (p) { |
||
6496 | return comparator(element, p.item) ? p.replacement : add(element); |
||
6497 | }); |
||
6498 | }; |
||
637 | daniel-mar | 6499 | return { getOrInit: getOrInit }; |
597 | daniel-mar | 6500 | }; |
679 | daniel-mar | 6501 | var transform = function (tag) { |
597 | daniel-mar | 6502 | return function (generators) { |
6503 | var list = []; |
||
637 | daniel-mar | 6504 | var find = function (element, comparator) { |
6505 | return find$1(list, function (x) { |
||
597 | daniel-mar | 6506 | return comparator(x.item, element); |
6507 | }); |
||
6508 | }; |
||
6509 | var makeNew = function (element) { |
||
679 | daniel-mar | 6510 | var attrs = tag === 'td' ? { scope: null } : {}; |
597 | daniel-mar | 6511 | var cell = generators.replace(element, tag, attrs); |
6512 | list.push({ |
||
6513 | item: element, |
||
6514 | sub: cell |
||
6515 | }); |
||
6516 | return cell; |
||
6517 | }; |
||
6518 | var replaceOrInit = function (element, comparator) { |
||
637 | daniel-mar | 6519 | if (isRow$1(element) || isCol(element)) { |
597 | daniel-mar | 6520 | return element; |
6521 | } else { |
||
637 | daniel-mar | 6522 | return find(element, comparator).fold(function () { |
597 | daniel-mar | 6523 | return makeNew(element); |
6524 | }, function (p) { |
||
6525 | return comparator(element, p.item) ? p.sub : makeNew(element); |
||
6526 | }); |
||
6527 | } |
||
6528 | }; |
||
637 | daniel-mar | 6529 | return { replaceOrInit: replaceOrInit }; |
597 | daniel-mar | 6530 | }; |
6531 | }; |
||
6532 | var getScopeAttribute = function (cell) { |
||
6533 | return getOpt(cell, 'scope').map(function (attribute) { |
||
6534 | return attribute.substr(0, 3); |
||
6535 | }); |
||
6536 | }; |
||
6537 | var merging = function (generators) { |
||
6538 | var unmerge = function (cell) { |
||
6539 | var scope = getScopeAttribute(cell); |
||
6540 | scope.each(function (attribute) { |
||
637 | daniel-mar | 6541 | return set$2(cell, 'scope', attribute); |
597 | daniel-mar | 6542 | }); |
6543 | return function () { |
||
6544 | var raw = generators.cell({ |
||
6545 | element: cell, |
||
6546 | colspan: 1, |
||
6547 | rowspan: 1 |
||
6548 | }); |
||
637 | daniel-mar | 6549 | remove$6(raw, 'width'); |
6550 | remove$6(cell, 'width'); |
||
597 | daniel-mar | 6551 | scope.each(function (attribute) { |
637 | daniel-mar | 6552 | return set$2(raw, 'scope', attribute); |
597 | daniel-mar | 6553 | }); |
6554 | return raw; |
||
6555 | }; |
||
6556 | }; |
||
6557 | var merge = function (cells) { |
||
6558 | var getScopeProperty = function () { |
||
637 | daniel-mar | 6559 | var stringAttributes = cat(map$1(cells, getScopeAttribute)); |
597 | daniel-mar | 6560 | if (stringAttributes.length === 0) { |
6561 | return Optional.none(); |
||
6562 | } else { |
||
6563 | var baseScope_1 = stringAttributes[0]; |
||
6564 | var scopes_1 = [ |
||
6565 | 'row', |
||
6566 | 'col' |
||
6567 | ]; |
||
6568 | var isMixed = exists(stringAttributes, function (attribute) { |
||
637 | daniel-mar | 6569 | return attribute !== baseScope_1 && contains$2(scopes_1, attribute); |
597 | daniel-mar | 6570 | }); |
6571 | return isMixed ? Optional.none() : Optional.from(baseScope_1); |
||
6572 | } |
||
6573 | }; |
||
637 | daniel-mar | 6574 | remove$6(cells[0], 'width'); |
597 | daniel-mar | 6575 | getScopeProperty().fold(function () { |
637 | daniel-mar | 6576 | return remove$7(cells[0], 'scope'); |
597 | daniel-mar | 6577 | }, function (attribute) { |
637 | daniel-mar | 6578 | return set$2(cells[0], 'scope', attribute + 'group'); |
597 | daniel-mar | 6579 | }); |
6580 | return constant(cells[0]); |
||
6581 | }; |
||
6582 | return { |
||
6583 | unmerge: unmerge, |
||
637 | daniel-mar | 6584 | merge: merge |
597 | daniel-mar | 6585 | }; |
6586 | }; |
||
6587 | var Generators = { |
||
6588 | modification: modification, |
||
637 | daniel-mar | 6589 | transform: transform, |
597 | daniel-mar | 6590 | merging: merging |
6591 | }; |
||
6592 | |||
6593 | var blockList = [ |
||
6594 | 'body', |
||
6595 | 'p', |
||
6596 | 'div', |
||
6597 | 'article', |
||
6598 | 'aside', |
||
6599 | 'figcaption', |
||
6600 | 'figure', |
||
6601 | 'footer', |
||
6602 | 'header', |
||
6603 | 'nav', |
||
6604 | 'section', |
||
6605 | 'ol', |
||
6606 | 'ul', |
||
6607 | 'table', |
||
6608 | 'thead', |
||
6609 | 'tfoot', |
||
6610 | 'tbody', |
||
6611 | 'caption', |
||
6612 | 'tr', |
||
6613 | 'td', |
||
6614 | 'th', |
||
6615 | 'h1', |
||
6616 | 'h2', |
||
6617 | 'h3', |
||
6618 | 'h4', |
||
6619 | 'h5', |
||
6620 | 'h6', |
||
6621 | 'blockquote', |
||
6622 | 'pre', |
||
6623 | 'address' |
||
6624 | ]; |
||
637 | daniel-mar | 6625 | var isList$1 = function (universe, item) { |
597 | daniel-mar | 6626 | var tagName = universe.property().name(item); |
637 | daniel-mar | 6627 | return contains$2([ |
597 | daniel-mar | 6628 | 'ol', |
6629 | 'ul' |
||
6630 | ], tagName); |
||
6631 | }; |
||
637 | daniel-mar | 6632 | var isBlock$1 = function (universe, item) { |
597 | daniel-mar | 6633 | var tagName = universe.property().name(item); |
637 | daniel-mar | 6634 | return contains$2(blockList, tagName); |
597 | daniel-mar | 6635 | }; |
637 | daniel-mar | 6636 | var isEmptyTag$1 = function (universe, item) { |
6637 | return contains$2([ |
||
597 | daniel-mar | 6638 | 'br', |
6639 | 'img', |
||
6640 | 'hr', |
||
6641 | 'input' |
||
6642 | ], universe.property().name(item)); |
||
6643 | }; |
||
6644 | |||
637 | daniel-mar | 6645 | var universe$1 = DomUniverse(); |
6646 | var isBlock = function (element) { |
||
6647 | return isBlock$1(universe$1, element); |
||
597 | daniel-mar | 6648 | }; |
637 | daniel-mar | 6649 | var isList = function (element) { |
6650 | return isList$1(universe$1, element); |
||
597 | daniel-mar | 6651 | }; |
637 | daniel-mar | 6652 | var isEmptyTag = function (element) { |
6653 | return isEmptyTag$1(universe$1, element); |
||
597 | daniel-mar | 6654 | }; |
6655 | |||
637 | daniel-mar | 6656 | var merge = function (cells) { |
597 | daniel-mar | 6657 | var isBr = function (el) { |
6658 | return name(el) === 'br'; |
||
6659 | }; |
||
6660 | var advancedBr = function (children) { |
||
6661 | return forall(children, function (c) { |
||
637 | daniel-mar | 6662 | return isBr(c) || isText(c) && get$9(c).trim().length === 0; |
597 | daniel-mar | 6663 | }); |
6664 | }; |
||
6665 | var isListItem = function (el) { |
||
637 | daniel-mar | 6666 | return name(el) === 'li' || ancestor$2(el, isList).isSome(); |
597 | daniel-mar | 6667 | }; |
6668 | var siblingIsBlock = function (el) { |
||
6669 | return nextSibling(el).map(function (rightSibling) { |
||
637 | daniel-mar | 6670 | if (isBlock(rightSibling)) { |
597 | daniel-mar | 6671 | return true; |
6672 | } |
||
637 | daniel-mar | 6673 | if (isEmptyTag(rightSibling)) { |
597 | daniel-mar | 6674 | return name(rightSibling) === 'img' ? false : true; |
6675 | } |
||
6676 | return false; |
||
6677 | }).getOr(false); |
||
6678 | }; |
||
6679 | var markCell = function (cell) { |
||
6680 | return last$1(cell).bind(function (rightEdge) { |
||
6681 | var rightSiblingIsBlock = siblingIsBlock(rightEdge); |
||
6682 | return parent(rightEdge).map(function (parent) { |
||
637 | daniel-mar | 6683 | return rightSiblingIsBlock === true || isListItem(parent) || isBr(rightEdge) || isBlock(parent) && !eq$1(cell, parent) ? [] : [SugarElement.fromTag('br')]; |
597 | daniel-mar | 6684 | }); |
6685 | }).getOr([]); |
||
6686 | }; |
||
6687 | var markContent = function () { |
||
637 | daniel-mar | 6688 | var content = bind$2(cells, function (cell) { |
6689 | var children = children$3(cell); |
||
6690 | return advancedBr(children) ? [] : children.concat(markCell(cell)); |
||
597 | daniel-mar | 6691 | }); |
6692 | return content.length === 0 ? [SugarElement.fromTag('br')] : content; |
||
6693 | }; |
||
6694 | var contents = markContent(); |
||
6695 | empty(cells[0]); |
||
637 | daniel-mar | 6696 | append(cells[0], contents); |
597 | daniel-mar | 6697 | }; |
6698 | |||
637 | daniel-mar | 6699 | var isEditable = function (elem) { |
6700 | return isEditable$1(elem, true); |
||
6701 | }; |
||
597 | daniel-mar | 6702 | var prune = function (table) { |
637 | daniel-mar | 6703 | var cells = cells$1(table); |
6704 | if (cells.length === 0) { |
||
6705 | remove$5(table); |
||
597 | daniel-mar | 6706 | } |
6707 | }; |
||
6708 | var outcome = function (grid, cursor) { |
||
6709 | return { |
||
6710 | grid: grid, |
||
6711 | cursor: cursor |
||
6712 | }; |
||
6713 | }; |
||
637 | daniel-mar | 6714 | var findEditableCursorPosition = function (rows) { |
6715 | return findMap(rows, function (row) { |
||
6716 | return findMap(row.cells, function (cell) { |
||
6717 | var elem = cell.element; |
||
6718 | return someIf(isEditable(elem), elem); |
||
6719 | }); |
||
6720 | }); |
||
6721 | }; |
||
597 | daniel-mar | 6722 | var elementFromGrid = function (grid, row, column) { |
637 | daniel-mar | 6723 | var _a, _b; |
597 | daniel-mar | 6724 | var rows = extractGridDetails(grid).rows; |
637 | daniel-mar | 6725 | return Optional.from((_b = (_a = rows[row]) === null || _a === void 0 ? void 0 : _a.cells[column]) === null || _b === void 0 ? void 0 : _b.element).filter(isEditable).orThunk(function () { |
6726 | return findEditableCursorPosition(rows); |
||
597 | daniel-mar | 6727 | }); |
6728 | }; |
||
6729 | var bundle = function (grid, row, column) { |
||
637 | daniel-mar | 6730 | var cursorElement = elementFromGrid(grid, row, column); |
6731 | return outcome(grid, cursorElement); |
||
597 | daniel-mar | 6732 | }; |
6733 | var uniqueRows = function (details) { |
||
6734 | var rowCompilation = function (rest, detail) { |
||
6735 | var rowExists = exists(rest, function (currentDetail) { |
||
6736 | return currentDetail.row === detail.row; |
||
6737 | }); |
||
6738 | return rowExists ? rest : rest.concat([detail]); |
||
6739 | }; |
||
6740 | return foldl(details, rowCompilation, []).sort(function (detailA, detailB) { |
||
6741 | return detailA.row - detailB.row; |
||
6742 | }); |
||
6743 | }; |
||
6744 | var opInsertRowsBefore = function (grid, details, comparator, genWrappers) { |
||
6745 | var targetIndex = details[0].row; |
||
6746 | var rows = uniqueRows(details); |
||
6747 | var newGrid = foldr(rows, function (acc, row) { |
||
6748 | var newG = insertRowAt(acc.grid, targetIndex, row.row + acc.delta, comparator, genWrappers.getOrInit); |
||
6749 | return { |
||
6750 | grid: newG, |
||
6751 | delta: acc.delta + 1 |
||
6752 | }; |
||
6753 | }, { |
||
6754 | grid: grid, |
||
6755 | delta: 0 |
||
6756 | }).grid; |
||
6757 | return bundle(newGrid, targetIndex, details[0].column); |
||
6758 | }; |
||
6759 | var opInsertRowsAfter = function (grid, details, comparator, genWrappers) { |
||
6760 | var rows = uniqueRows(details); |
||
6761 | var target = rows[rows.length - 1]; |
||
6762 | var targetIndex = target.row + target.rowspan; |
||
6763 | var newGrid = foldr(rows, function (newG, row) { |
||
6764 | return insertRowAt(newG, targetIndex, row.row, comparator, genWrappers.getOrInit); |
||
6765 | }, grid); |
||
6766 | return bundle(newGrid, targetIndex, details[0].column); |
||
6767 | }; |
||
6768 | var opInsertColumnsBefore = function (grid, extractDetail, comparator, genWrappers) { |
||
6769 | var details = extractDetail.details; |
||
6770 | var columns = uniqueColumns(details); |
||
6771 | var targetIndex = columns[0].column; |
||
6772 | var newGrid = foldr(columns, function (acc, col) { |
||
6773 | var newG = insertColumnAt(acc.grid, targetIndex, col.column + acc.delta, comparator, genWrappers.getOrInit); |
||
6774 | return { |
||
6775 | grid: newG, |
||
6776 | delta: acc.delta + 1 |
||
6777 | }; |
||
6778 | }, { |
||
6779 | grid: grid, |
||
6780 | delta: 0 |
||
6781 | }).grid; |
||
6782 | return bundle(newGrid, details[0].row, targetIndex); |
||
6783 | }; |
||
6784 | var opInsertColumnsAfter = function (grid, extractDetail, comparator, genWrappers) { |
||
6785 | var details = extractDetail.details; |
||
6786 | var target = details[details.length - 1]; |
||
6787 | var targetIndex = target.column + target.colspan; |
||
6788 | var columns = uniqueColumns(details); |
||
6789 | var newGrid = foldr(columns, function (newG, col) { |
||
6790 | return insertColumnAt(newG, targetIndex, col.column, comparator, genWrappers.getOrInit); |
||
6791 | }, grid); |
||
6792 | return bundle(newGrid, details[0].row, targetIndex); |
||
6793 | }; |
||
6794 | var opMakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) { |
||
637 | daniel-mar | 6795 | var columns = uniqueColumns(details); |
679 | daniel-mar | 6796 | var columnIndexes = map$1(columns, function (detail) { |
6797 | return detail.column; |
||
6798 | }); |
||
6799 | var newGrid = replaceColumns(initialGrid, columnIndexes, true, comparator, genWrappers.replaceOrInit); |
||
597 | daniel-mar | 6800 | return bundle(newGrid, details[0].row, details[0].column); |
6801 | }; |
||
637 | daniel-mar | 6802 | var opMakeCellsHeader = function (initialGrid, details, comparator, genWrappers) { |
679 | daniel-mar | 6803 | var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit); |
597 | daniel-mar | 6804 | return bundle(newGrid, details[0].row, details[0].column); |
6805 | }; |
||
6806 | var opUnmakeColumnsHeader = function (initialGrid, details, comparator, genWrappers) { |
||
637 | daniel-mar | 6807 | var columns = uniqueColumns(details); |
679 | daniel-mar | 6808 | var columnIndexes = map$1(columns, function (detail) { |
6809 | return detail.column; |
||
6810 | }); |
||
6811 | var newGrid = replaceColumns(initialGrid, columnIndexes, false, comparator, genWrappers.replaceOrInit); |
||
597 | daniel-mar | 6812 | return bundle(newGrid, details[0].row, details[0].column); |
6813 | }; |
||
637 | daniel-mar | 6814 | var opUnmakeCellsHeader = function (initialGrid, details, comparator, genWrappers) { |
679 | daniel-mar | 6815 | var newGrid = replaceCells(initialGrid, details, comparator, genWrappers.replaceOrInit); |
637 | daniel-mar | 6816 | return bundle(newGrid, details[0].row, details[0].column); |
6817 | }; |
||
679 | daniel-mar | 6818 | var makeRowsSection = function (section, applyScope) { |
637 | daniel-mar | 6819 | return function (initialGrid, details, comparator, genWrappers, tableSection) { |
6820 | var rows = uniqueRows(details); |
||
679 | daniel-mar | 6821 | var rowIndexes = map$1(rows, function (detail) { |
6822 | return detail.row; |
||
6823 | }); |
||
6824 | var newGrid = replaceRows(initialGrid, rowIndexes, section, applyScope, comparator, genWrappers.replaceOrInit, tableSection); |
||
637 | daniel-mar | 6825 | return bundle(newGrid, details[0].row, details[0].column); |
6826 | }; |
||
6827 | }; |
||
679 | daniel-mar | 6828 | var opMakeRowsHeader = makeRowsSection('thead', true); |
6829 | var opMakeRowsBody = makeRowsSection('tbody', false); |
||
6830 | var opMakeRowsFooter = makeRowsSection('tfoot', false); |
||
597 | daniel-mar | 6831 | var opEraseColumns = function (grid, extractDetail, _comparator, _genWrappers) { |
6832 | var columns = uniqueColumns(extractDetail.details); |
||
637 | daniel-mar | 6833 | var newGrid = deleteColumnsAt(grid, map$1(columns, function (column) { |
597 | daniel-mar | 6834 | return column.column; |
6835 | })); |
||
637 | daniel-mar | 6836 | var maxColIndex = newGrid.length > 0 ? newGrid[0].cells.length - 1 : 0; |
6837 | return bundle(newGrid, columns[0].row, Math.min(columns[0].column, maxColIndex)); |
||
597 | daniel-mar | 6838 | }; |
6839 | var opEraseRows = function (grid, details, _comparator, _genWrappers) { |
||
6840 | var rows = uniqueRows(details); |
||
6841 | var newGrid = deleteRowsAt(grid, rows[0].row, rows[rows.length - 1].row); |
||
637 | daniel-mar | 6842 | var maxRowIndex = newGrid.length > 0 ? newGrid.length - 1 : 0; |
6843 | return bundle(newGrid, Math.min(details[0].row, maxRowIndex), details[0].column); |
||
597 | daniel-mar | 6844 | }; |
6845 | var opMergeCells = function (grid, mergable, comparator, genWrappers) { |
||
6846 | var cells = mergable.cells; |
||
637 | daniel-mar | 6847 | merge(cells); |
6848 | var newGrid = merge$2(grid, mergable.bounds, comparator, genWrappers.merge(cells)); |
||
597 | daniel-mar | 6849 | return outcome(newGrid, Optional.from(cells[0])); |
6850 | }; |
||
6851 | var opUnmergeCells = function (grid, unmergable, comparator, genWrappers) { |
||
6852 | var unmerge$1 = function (b, cell) { |
||
6853 | return unmerge(b, cell, comparator, genWrappers.unmerge(cell)); |
||
6854 | }; |
||
6855 | var newGrid = foldr(unmergable, unmerge$1, grid); |
||
6856 | return outcome(newGrid, Optional.from(unmergable[0])); |
||
6857 | }; |
||
6858 | var opPasteCells = function (grid, pasteDetails, comparator, _genWrappers) { |
||
6859 | var gridify = function (table, generators) { |
||
6860 | var wh = Warehouse.fromTable(table); |
||
6861 | return toGrid(wh, generators, true); |
||
6862 | }; |
||
6863 | var gridB = gridify(pasteDetails.clipboard, pasteDetails.generators); |
||
6864 | var startAddress = address(pasteDetails.row, pasteDetails.column); |
||
6865 | var mergedGrid = merge$1(startAddress, grid, gridB, pasteDetails.generators, comparator); |
||
6866 | return mergedGrid.fold(function () { |
||
6867 | return outcome(grid, Optional.some(pasteDetails.element)); |
||
6868 | }, function (newGrid) { |
||
637 | daniel-mar | 6869 | return bundle(newGrid, pasteDetails.row, pasteDetails.column); |
597 | daniel-mar | 6870 | }); |
6871 | }; |
||
6872 | var gridifyRows = function (rows, generators, context) { |
||
6873 | var pasteDetails = fromPastedRows(rows, context.section); |
||
6874 | var wh = Warehouse.generate(pasteDetails); |
||
6875 | return toGrid(wh, generators, true); |
||
6876 | }; |
||
6877 | var opPasteColsBefore = function (grid, pasteDetails, comparator, _genWrappers) { |
||
6878 | var rows = extractGridDetails(grid).rows; |
||
6879 | var index = pasteDetails.cells[0].column; |
||
6880 | var context = rows[pasteDetails.cells[0].row]; |
||
6881 | var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); |
||
6882 | var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator); |
||
637 | daniel-mar | 6883 | return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); |
597 | daniel-mar | 6884 | }; |
6885 | var opPasteColsAfter = function (grid, pasteDetails, comparator, _genWrappers) { |
||
6886 | var rows = extractGridDetails(grid).rows; |
||
6887 | var index = pasteDetails.cells[pasteDetails.cells.length - 1].column + pasteDetails.cells[pasteDetails.cells.length - 1].colspan; |
||
6888 | var context = rows[pasteDetails.cells[0].row]; |
||
6889 | var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); |
||
6890 | var mergedGrid = insertCols(index, grid, gridB, pasteDetails.generators, comparator); |
||
637 | daniel-mar | 6891 | return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); |
597 | daniel-mar | 6892 | }; |
6893 | var opPasteRowsBefore = function (grid, pasteDetails, comparator, _genWrappers) { |
||
6894 | var rows = extractGridDetails(grid).rows; |
||
6895 | var index = pasteDetails.cells[0].row; |
||
6896 | var context = rows[index]; |
||
6897 | var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); |
||
6898 | var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator); |
||
637 | daniel-mar | 6899 | return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); |
597 | daniel-mar | 6900 | }; |
6901 | var opPasteRowsAfter = function (grid, pasteDetails, comparator, _genWrappers) { |
||
6902 | var rows = extractGridDetails(grid).rows; |
||
6903 | var index = pasteDetails.cells[pasteDetails.cells.length - 1].row + pasteDetails.cells[pasteDetails.cells.length - 1].rowspan; |
||
6904 | var context = rows[pasteDetails.cells[0].row]; |
||
6905 | var gridB = gridifyRows(pasteDetails.clipboard, pasteDetails.generators, context); |
||
6906 | var mergedGrid = insertRows(index, grid, gridB, pasteDetails.generators, comparator); |
||
637 | daniel-mar | 6907 | return bundle(mergedGrid, pasteDetails.cells[0].row, pasteDetails.cells[0].column); |
597 | daniel-mar | 6908 | }; |
637 | daniel-mar | 6909 | var opGetColumnsType = function (table, target) { |
597 | daniel-mar | 6910 | var house = Warehouse.fromTable(table); |
6911 | var details = onCells(house, target); |
||
6912 | return details.bind(function (selectedCells) { |
||
6913 | var lastSelectedCell = selectedCells[selectedCells.length - 1]; |
||
6914 | var minColRange = selectedCells[0].column; |
||
6915 | var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan; |
||
637 | daniel-mar | 6916 | var selectedColumnCells = flatten$1(map$1(house.all, function (row) { |
6917 | return filter$2(row.cells, function (cell) { |
||
597 | daniel-mar | 6918 | return cell.column >= minColRange && cell.column < maxColRange; |
6919 | }); |
||
6920 | })); |
||
637 | daniel-mar | 6921 | return findCommonCellType(selectedColumnCells); |
597 | daniel-mar | 6922 | }).getOr(''); |
6923 | }; |
||
637 | daniel-mar | 6924 | var opGetCellsType = function (table, target) { |
6925 | var house = Warehouse.fromTable(table); |
||
6926 | var details = onCells(house, target); |
||
6927 | return details.bind(findCommonCellType).getOr(''); |
||
597 | daniel-mar | 6928 | }; |
637 | daniel-mar | 6929 | var opGetRowsType = function (table, target) { |
6930 | var house = Warehouse.fromTable(table); |
||
6931 | var details = onCells(house, target); |
||
6932 | return details.bind(function (selectedCells) { |
||
6933 | var lastSelectedCell = selectedCells[selectedCells.length - 1]; |
||
6934 | var minRowRange = selectedCells[0].row; |
||
6935 | var maxRowRange = lastSelectedCell.row + lastSelectedCell.rowspan; |
||
6936 | var selectedRows = house.all.slice(minRowRange, maxRowRange); |
||
6937 | return findCommonRowType(selectedRows); |
||
6938 | }).getOr(''); |
||
6939 | }; |
||
6940 | var resize = function (table, list, details, behaviours) { |
||
6941 | return adjustWidthTo(table, list, details, behaviours.sizing); |
||
6942 | }; |
||
6943 | var adjustAndRedistributeWidths = function (table, list, details, behaviours) { |
||
6944 | return adjustAndRedistributeWidths$1(table, list, details, behaviours.sizing, behaviours.resize); |
||
6945 | }; |
||
597 | daniel-mar | 6946 | var firstColumnIsLocked = function (_warehouse, details) { |
6947 | return exists(details, function (detail) { |
||
6948 | return detail.column === 0 && detail.isLocked; |
||
6949 | }); |
||
6950 | }; |
||
6951 | var lastColumnIsLocked = function (warehouse, details) { |
||
6952 | return exists(details, function (detail) { |
||
6953 | return detail.column + detail.colspan >= warehouse.grid.columns && detail.isLocked; |
||
6954 | }); |
||
6955 | }; |
||
6956 | var getColumnsWidth = function (warehouse, details) { |
||
637 | daniel-mar | 6957 | var columns$1 = columns(warehouse); |
597 | daniel-mar | 6958 | var uniqueCols = uniqueColumns(details); |
6959 | return foldl(uniqueCols, function (acc, detail) { |
||
637 | daniel-mar | 6960 | var column = columns$1[detail.column]; |
6961 | var colWidth = column.map(getOuter$2).getOr(0); |
||
597 | daniel-mar | 6962 | return acc + colWidth; |
6963 | }, 0); |
||
6964 | }; |
||
6965 | var insertColumnsExtractor = function (before) { |
||
6966 | return function (warehouse, target) { |
||
6967 | return onCells(warehouse, target).filter(function (details) { |
||
6968 | var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked; |
||
6969 | return !checkLocked(warehouse, details); |
||
6970 | }).map(function (details) { |
||
6971 | return { |
||
6972 | details: details, |
||
6973 | pixelDelta: getColumnsWidth(warehouse, details) |
||
6974 | }; |
||
6975 | }); |
||
6976 | }; |
||
6977 | }; |
||
6978 | var eraseColumnsExtractor = function (warehouse, target) { |
||
6979 | return onUnlockedCells(warehouse, target).map(function (details) { |
||
6980 | return { |
||
6981 | details: details, |
||
6982 | pixelDelta: -getColumnsWidth(warehouse, details) |
||
6983 | }; |
||
6984 | }); |
||
6985 | }; |
||
6986 | var pasteColumnsExtractor = function (before) { |
||
6987 | return function (warehouse, target) { |
||
6988 | return onPasteByEditor(warehouse, target).filter(function (details) { |
||
6989 | var checkLocked = before ? firstColumnIsLocked : lastColumnIsLocked; |
||
6990 | return !checkLocked(warehouse, details.cells); |
||
6991 | }); |
||
6992 | }; |
||
6993 | }; |
||
679 | daniel-mar | 6994 | var headerCellGenerator = Generators.transform('th'); |
6995 | var bodyCellGenerator = Generators.transform('td'); |
||
597 | daniel-mar | 6996 | var insertRowsBefore = run(opInsertRowsBefore, onCells, noop, noop, Generators.modification); |
6997 | var insertRowsAfter = run(opInsertRowsAfter, onCells, noop, noop, Generators.modification); |
||
637 | daniel-mar | 6998 | var insertColumnsBefore = run(opInsertColumnsBefore, insertColumnsExtractor(true), adjustAndRedistributeWidths, noop, Generators.modification); |
6999 | var insertColumnsAfter = run(opInsertColumnsAfter, insertColumnsExtractor(false), adjustAndRedistributeWidths, noop, Generators.modification); |
||
7000 | var eraseColumns = run(opEraseColumns, eraseColumnsExtractor, adjustAndRedistributeWidths, prune, Generators.modification); |
||
597 | daniel-mar | 7001 | var eraseRows = run(opEraseRows, onCells, noop, prune, Generators.modification); |
679 | daniel-mar | 7002 | var makeColumnsHeader = run(opMakeColumnsHeader, onUnlockedCells, noop, noop, headerCellGenerator); |
7003 | var unmakeColumnsHeader = run(opUnmakeColumnsHeader, onUnlockedCells, noop, noop, bodyCellGenerator); |
||
7004 | var makeRowsHeader = run(opMakeRowsHeader, onUnlockedCells, noop, noop, headerCellGenerator); |
||
7005 | var makeRowsBody = run(opMakeRowsBody, onUnlockedCells, noop, noop, bodyCellGenerator); |
||
7006 | var makeRowsFooter = run(opMakeRowsFooter, onUnlockedCells, noop, noop, bodyCellGenerator); |
||
7007 | var makeCellsHeader = run(opMakeCellsHeader, onUnlockedCells, noop, noop, headerCellGenerator); |
||
7008 | var unmakeCellsHeader = run(opUnmakeCellsHeader, onUnlockedCells, noop, noop, bodyCellGenerator); |
||
597 | daniel-mar | 7009 | var mergeCells = run(opMergeCells, onUnlockedMergable, resize, noop, Generators.merging); |
7010 | var unmergeCells = run(opUnmergeCells, onUnlockedUnmergable, resize, noop, Generators.merging); |
||
7011 | var pasteCells = run(opPasteCells, onPaste, resize, noop, Generators.modification); |
||
7012 | var pasteColsBefore = run(opPasteColsBefore, pasteColumnsExtractor(true), noop, noop, Generators.modification); |
||
7013 | var pasteColsAfter = run(opPasteColsAfter, pasteColumnsExtractor(false), noop, noop, Generators.modification); |
||
7014 | var pasteRowsBefore = run(opPasteRowsBefore, onPasteByEditor, noop, noop, Generators.modification); |
||
7015 | var pasteRowsAfter = run(opPasteRowsAfter, onPasteByEditor, noop, noop, Generators.modification); |
||
637 | daniel-mar | 7016 | var getColumnsType = opGetColumnsType; |
7017 | var getCellsType = opGetCellsType; |
||
7018 | var getRowsType = opGetRowsType; |
||
597 | daniel-mar | 7019 | |
637 | daniel-mar | 7020 | var TableActions = function (editor, cellSelection, lazyWire) { |
597 | daniel-mar | 7021 | var isTableBody = function (editor) { |
637 | daniel-mar | 7022 | return name(getBody(editor)) === 'table'; |
597 | daniel-mar | 7023 | }; |
7024 | var lastRowGuard = function (table) { |
||
7025 | return isTableBody(editor) === false || getGridSize(table).rows > 1; |
||
7026 | }; |
||
7027 | var lastColumnGuard = function (table) { |
||
7028 | return isTableBody(editor) === false || getGridSize(table).columns > 1; |
||
7029 | }; |
||
7030 | var cloneFormats = getCloneElements(editor); |
||
7031 | var colMutationOp = isResizeTableColumnResizing(editor) ? noop : halve; |
||
637 | daniel-mar | 7032 | var getTableSectionType = function (table) { |
7033 | switch (getTableHeaderType(editor)) { |
||
7034 | case 'section': |
||
7035 | return TableSection.section(); |
||
7036 | case 'sectionCells': |
||
7037 | return TableSection.sectionCells(); |
||
7038 | case 'cells': |
||
7039 | return TableSection.cells(); |
||
7040 | default: |
||
7041 | return TableSection.getTableSectionType(table, 'section'); |
||
7042 | } |
||
7043 | }; |
||
7044 | var setSelectionFromAction = function (table, result) { |
||
7045 | return result.cursor.fold(function () { |
||
7046 | var cells = cells$1(table); |
||
7047 | return head(cells).filter(inBody).map(function (firstCell) { |
||
7048 | cellSelection.clear(table); |
||
7049 | var rng = editor.dom.createRng(); |
||
7050 | rng.selectNode(firstCell.dom); |
||
7051 | editor.selection.setRng(rng); |
||
7052 | set$2(firstCell, 'data-mce-selected', '1'); |
||
7053 | return rng; |
||
7054 | }); |
||
7055 | }, function (cell) { |
||
7056 | var des = freefallRtl(cell); |
||
7057 | var rng = editor.dom.createRng(); |
||
7058 | rng.setStart(des.element.dom, des.offset); |
||
7059 | rng.setEnd(des.element.dom, des.offset); |
||
7060 | editor.selection.setRng(rng); |
||
7061 | cellSelection.clear(table); |
||
7062 | return Optional.some(rng); |
||
7063 | }); |
||
7064 | }; |
||
597 | daniel-mar | 7065 | var execute = function (operation, guard, mutate, lazyWire, effect) { |
637 | daniel-mar | 7066 | return function (table, target, noEvents) { |
7067 | if (noEvents === void 0) { |
||
7068 | noEvents = false; |
||
7069 | } |
||
597 | daniel-mar | 7070 | removeDataStyle(table); |
7071 | var wire = lazyWire(); |
||
7072 | var doc = SugarElement.fromDom(editor.getDoc()); |
||
7073 | var generators = cellOperations(mutate, doc, cloneFormats); |
||
637 | daniel-mar | 7074 | var behaviours = { |
7075 | sizing: get$4(editor, table), |
||
7076 | resize: isResizeTableColumnResizing(editor) ? resizeTable() : preserveTable(), |
||
7077 | section: getTableSectionType(table) |
||
7078 | }; |
||
7079 | return guard(table) ? operation(wire, table, target, generators, behaviours).bind(function (result) { |
||
7080 | each$2(result.newRows, function (row) { |
||
597 | daniel-mar | 7081 | fireNewRow(editor, row.dom); |
7082 | }); |
||
637 | daniel-mar | 7083 | each$2(result.newCells, function (cell) { |
597 | daniel-mar | 7084 | fireNewCell(editor, cell.dom); |
7085 | }); |
||
637 | daniel-mar | 7086 | var range = setSelectionFromAction(table, result); |
7087 | if (inBody(table)) { |
||
7088 | removeDataStyle(table); |
||
7089 | if (!noEvents) { |
||
7090 | fireTableModified(editor, table.dom, effect); |
||
7091 | } |
||
7092 | } |
||
7093 | return range.map(function (rng) { |
||
597 | daniel-mar | 7094 | return { |
7095 | rng: rng, |
||
7096 | effect: effect |
||
7097 | }; |
||
7098 | }); |
||
7099 | }) : Optional.none(); |
||
7100 | }; |
||
7101 | }; |
||
7102 | var deleteRow = execute(eraseRows, lastRowGuard, noop, lazyWire, structureModified); |
||
7103 | var deleteColumn = execute(eraseColumns, lastColumnGuard, noop, lazyWire, structureModified); |
||
7104 | var insertRowsBefore$1 = execute(insertRowsBefore, always, noop, lazyWire, structureModified); |
||
7105 | var insertRowsAfter$1 = execute(insertRowsAfter, always, noop, lazyWire, structureModified); |
||
7106 | var insertColumnsBefore$1 = execute(insertColumnsBefore, always, colMutationOp, lazyWire, structureModified); |
||
7107 | var insertColumnsAfter$1 = execute(insertColumnsAfter, always, colMutationOp, lazyWire, structureModified); |
||
7108 | var mergeCells$1 = execute(mergeCells, always, noop, lazyWire, structureModified); |
||
7109 | var unmergeCells$1 = execute(unmergeCells, always, noop, lazyWire, structureModified); |
||
7110 | var pasteColsBefore$1 = execute(pasteColsBefore, always, noop, lazyWire, structureModified); |
||
7111 | var pasteColsAfter$1 = execute(pasteColsAfter, always, noop, lazyWire, structureModified); |
||
7112 | var pasteRowsBefore$1 = execute(pasteRowsBefore, always, noop, lazyWire, structureModified); |
||
7113 | var pasteRowsAfter$1 = execute(pasteRowsAfter, always, noop, lazyWire, structureModified); |
||
637 | daniel-mar | 7114 | var pasteCells$1 = execute(pasteCells, always, noop, lazyWire, styleAndStructureModified); |
7115 | var makeCellsHeader$1 = execute(makeCellsHeader, always, noop, lazyWire, structureModified); |
||
7116 | var unmakeCellsHeader$1 = execute(unmakeCellsHeader, always, noop, lazyWire, structureModified); |
||
597 | daniel-mar | 7117 | var makeColumnsHeader$1 = execute(makeColumnsHeader, always, noop, lazyWire, structureModified); |
7118 | var unmakeColumnsHeader$1 = execute(unmakeColumnsHeader, always, noop, lazyWire, structureModified); |
||
637 | daniel-mar | 7119 | var makeRowsHeader$1 = execute(makeRowsHeader, always, noop, lazyWire, structureModified); |
7120 | var makeRowsBody$1 = execute(makeRowsBody, always, noop, lazyWire, structureModified); |
||
7121 | var makeRowsFooter$1 = execute(makeRowsFooter, always, noop, lazyWire, structureModified); |
||
7122 | var getTableCellType = getCellsType; |
||
7123 | var getTableColType = getColumnsType; |
||
7124 | var getTableRowType = getRowsType; |
||
597 | daniel-mar | 7125 | return { |
7126 | deleteRow: deleteRow, |
||
7127 | deleteColumn: deleteColumn, |
||
7128 | insertRowsBefore: insertRowsBefore$1, |
||
7129 | insertRowsAfter: insertRowsAfter$1, |
||
7130 | insertColumnsBefore: insertColumnsBefore$1, |
||
7131 | insertColumnsAfter: insertColumnsAfter$1, |
||
7132 | mergeCells: mergeCells$1, |
||
7133 | unmergeCells: unmergeCells$1, |
||
7134 | pasteColsBefore: pasteColsBefore$1, |
||
7135 | pasteColsAfter: pasteColsAfter$1, |
||
7136 | pasteRowsBefore: pasteRowsBefore$1, |
||
7137 | pasteRowsAfter: pasteRowsAfter$1, |
||
7138 | pasteCells: pasteCells$1, |
||
637 | daniel-mar | 7139 | makeCellsHeader: makeCellsHeader$1, |
7140 | unmakeCellsHeader: unmakeCellsHeader$1, |
||
597 | daniel-mar | 7141 | makeColumnsHeader: makeColumnsHeader$1, |
7142 | unmakeColumnsHeader: unmakeColumnsHeader$1, |
||
637 | daniel-mar | 7143 | makeRowsHeader: makeRowsHeader$1, |
7144 | makeRowsBody: makeRowsBody$1, |
||
7145 | makeRowsFooter: makeRowsFooter$1, |
||
597 | daniel-mar | 7146 | getTableRowType: getTableRowType, |
7147 | getTableCellType: getTableCellType, |
||
7148 | getTableColType: getTableColType |
||
7149 | }; |
||
7150 | }; |
||
7151 | |||
7152 | var DefaultRenderOptions = { |
||
7153 | styles: { |
||
7154 | 'border-collapse': 'collapse', |
||
7155 | 'width': '100%' |
||
7156 | }, |
||
7157 | attributes: { border: '1' }, |
||
7158 | colGroups: false |
||
7159 | }; |
||
7160 | var tableHeaderCell = function () { |
||
7161 | return SugarElement.fromTag('th'); |
||
7162 | }; |
||
7163 | var tableCell = function () { |
||
7164 | return SugarElement.fromTag('td'); |
||
7165 | }; |
||
7166 | var tableColumn = function () { |
||
7167 | return SugarElement.fromTag('col'); |
||
7168 | }; |
||
7169 | var createRow = function (columns, rowHeaders, columnHeaders, rowIndex) { |
||
7170 | var tr = SugarElement.fromTag('tr'); |
||
7171 | for (var j = 0; j < columns; j++) { |
||
7172 | var td = rowIndex < rowHeaders || j < columnHeaders ? tableHeaderCell() : tableCell(); |
||
7173 | if (j < columnHeaders) { |
||
637 | daniel-mar | 7174 | set$2(td, 'scope', 'row'); |
597 | daniel-mar | 7175 | } |
7176 | if (rowIndex < rowHeaders) { |
||
637 | daniel-mar | 7177 | set$2(td, 'scope', 'col'); |
597 | daniel-mar | 7178 | } |
637 | daniel-mar | 7179 | append$1(td, SugarElement.fromTag('br')); |
7180 | append$1(tr, td); |
||
597 | daniel-mar | 7181 | } |
7182 | return tr; |
||
7183 | }; |
||
7184 | var createGroupRow = function (columns) { |
||
7185 | var columnGroup = SugarElement.fromTag('colgroup'); |
||
637 | daniel-mar | 7186 | range$1(columns, function () { |
7187 | return append$1(columnGroup, tableColumn()); |
||
597 | daniel-mar | 7188 | }); |
7189 | return columnGroup; |
||
7190 | }; |
||
7191 | var createRows = function (rows, columns, rowHeaders, columnHeaders) { |
||
637 | daniel-mar | 7192 | return range$1(rows, function (r) { |
597 | daniel-mar | 7193 | return createRow(columns, rowHeaders, columnHeaders, r); |
7194 | }); |
||
7195 | }; |
||
637 | daniel-mar | 7196 | var render = function (rows, columns, rowHeaders, columnHeaders, headerType, renderOpts) { |
597 | daniel-mar | 7197 | if (renderOpts === void 0) { |
7198 | renderOpts = DefaultRenderOptions; |
||
7199 | } |
||
7200 | var table = SugarElement.fromTag('table'); |
||
7201 | var rowHeadersGoInThead = headerType !== 'cells'; |
||
637 | daniel-mar | 7202 | setAll(table, renderOpts.styles); |
7203 | setAll$1(table, renderOpts.attributes); |
||
597 | daniel-mar | 7204 | if (renderOpts.colGroups) { |
637 | daniel-mar | 7205 | append$1(table, createGroupRow(columns)); |
597 | daniel-mar | 7206 | } |
7207 | var actualRowHeaders = Math.min(rows, rowHeaders); |
||
7208 | if (rowHeadersGoInThead && rowHeaders > 0) { |
||
7209 | var thead = SugarElement.fromTag('thead'); |
||
637 | daniel-mar | 7210 | append$1(table, thead); |
597 | daniel-mar | 7211 | var theadRowHeaders = headerType === 'sectionCells' ? actualRowHeaders : 0; |
7212 | var theadRows = createRows(rowHeaders, columns, theadRowHeaders, columnHeaders); |
||
637 | daniel-mar | 7213 | append(thead, theadRows); |
597 | daniel-mar | 7214 | } |
7215 | var tbody = SugarElement.fromTag('tbody'); |
||
637 | daniel-mar | 7216 | append$1(table, tbody); |
597 | daniel-mar | 7217 | var numRows = rowHeadersGoInThead ? rows - actualRowHeaders : rows; |
7218 | var numRowHeaders = rowHeadersGoInThead ? 0 : rowHeaders; |
||
7219 | var tbodyRows = createRows(numRows, columns, numRowHeaders, columnHeaders); |
||
637 | daniel-mar | 7220 | append(tbody, tbodyRows); |
597 | daniel-mar | 7221 | return table; |
7222 | }; |
||
7223 | |||
637 | daniel-mar | 7224 | var get$2 = function (element) { |
597 | daniel-mar | 7225 | return element.dom.innerHTML; |
7226 | }; |
||
637 | daniel-mar | 7227 | var getOuter = function (element) { |
597 | daniel-mar | 7228 | var container = SugarElement.fromTag('div'); |
7229 | var clone = SugarElement.fromDom(element.dom.cloneNode(true)); |
||
637 | daniel-mar | 7230 | append$1(container, clone); |
7231 | return get$2(container); |
||
597 | daniel-mar | 7232 | }; |
7233 | |||
7234 | var placeCaretInCell = function (editor, cell) { |
||
7235 | editor.selection.select(cell.dom, true); |
||
7236 | editor.selection.collapse(true); |
||
7237 | }; |
||
7238 | var selectFirstCellInTable = function (editor, tableElm) { |
||
637 | daniel-mar | 7239 | descendant(tableElm, 'td,th').each(curry(placeCaretInCell, editor)); |
597 | daniel-mar | 7240 | }; |
7241 | var fireEvents = function (editor, table) { |
||
637 | daniel-mar | 7242 | each$2(descendants(table, 'tr'), function (row) { |
597 | daniel-mar | 7243 | fireNewRow(editor, row.dom); |
637 | daniel-mar | 7244 | each$2(descendants(row, 'th,td'), function (cell) { |
597 | daniel-mar | 7245 | fireNewCell(editor, cell.dom); |
7246 | }); |
||
7247 | }); |
||
7248 | }; |
||
637 | daniel-mar | 7249 | var isPercentage = function (width) { |
597 | daniel-mar | 7250 | return isString(width) && width.indexOf('%') !== -1; |
7251 | }; |
||
637 | daniel-mar | 7252 | var insert = function (editor, columns, rows, colHeaders, rowHeaders) { |
597 | daniel-mar | 7253 | var defaultStyles = getDefaultStyles(editor); |
7254 | var options = { |
||
7255 | styles: defaultStyles, |
||
7256 | attributes: getDefaultAttributes(editor), |
||
7257 | colGroups: useColumnGroup(editor) |
||
7258 | }; |
||
7259 | editor.undoManager.ignore(function () { |
||
637 | daniel-mar | 7260 | var table = render(rows, columns, rowHeaders, colHeaders, getTableHeaderType(editor), options); |
7261 | set$2(table, 'data-mce-id', '__mce'); |
||
7262 | var html = getOuter(table); |
||
597 | daniel-mar | 7263 | editor.insertContent(html); |
7264 | editor.addVisual(); |
||
7265 | }); |
||
637 | daniel-mar | 7266 | return descendant(getBody(editor), 'table[data-mce-id="__mce"]').map(function (table) { |
597 | daniel-mar | 7267 | if (isPixelsForced(editor)) { |
679 | daniel-mar | 7268 | enforcePixels(table); |
597 | daniel-mar | 7269 | } else if (isResponsiveForced(editor)) { |
7270 | enforceNone(table); |
||
637 | daniel-mar | 7271 | } else if (isPercentagesForced(editor) || isPercentage(defaultStyles.width)) { |
679 | daniel-mar | 7272 | enforcePercentage(table); |
597 | daniel-mar | 7273 | } |
7274 | removeDataStyle(table); |
||
637 | daniel-mar | 7275 | remove$7(table, 'data-mce-id'); |
597 | daniel-mar | 7276 | fireEvents(editor, table); |
7277 | selectFirstCellInTable(editor, table); |
||
7278 | return table.dom; |
||
7279 | }).getOr(null); |
||
7280 | }; |
||
7281 | var insertTableWithDataValidation = function (editor, rows, columns, options, errorMsg) { |
||
7282 | if (options === void 0) { |
||
7283 | options = {}; |
||
7284 | } |
||
7285 | var checkInput = function (val) { |
||
7286 | return isNumber(val) && val > 0; |
||
7287 | }; |
||
7288 | if (checkInput(rows) && checkInput(columns)) { |
||
7289 | var headerRows = options.headerRows || 0; |
||
7290 | var headerColumns = options.headerColumns || 0; |
||
637 | daniel-mar | 7291 | return insert(editor, columns, rows, headerColumns, headerRows); |
597 | daniel-mar | 7292 | } else { |
7293 | console.error(errorMsg); |
||
7294 | return null; |
||
7295 | } |
||
7296 | }; |
||
7297 | |||
7298 | var getClipboardElements = function (getClipboard) { |
||
7299 | return function () { |
||
7300 | return getClipboard().fold(function () { |
||
7301 | return []; |
||
7302 | }, function (elems) { |
||
637 | daniel-mar | 7303 | return map$1(elems, function (e) { |
597 | daniel-mar | 7304 | return e.dom; |
7305 | }); |
||
7306 | }); |
||
7307 | }; |
||
7308 | }; |
||
7309 | var setClipboardElements = function (setClipboard) { |
||
7310 | return function (elems) { |
||
637 | daniel-mar | 7311 | var elmsOpt = elems.length > 0 ? Optional.some(fromDom(elems)) : Optional.none(); |
597 | daniel-mar | 7312 | setClipboard(elmsOpt); |
7313 | }; |
||
7314 | }; |
||
7315 | var insertTable = function (editor) { |
||
7316 | return function (columns, rows, options) { |
||
7317 | if (options === void 0) { |
||
7318 | options = {}; |
||
7319 | } |
||
7320 | var table = insertTableWithDataValidation(editor, rows, columns, options, 'Invalid values for insertTable - rows and columns values are required to insert a table.'); |
||
7321 | editor.undoManager.add(); |
||
7322 | return table; |
||
7323 | }; |
||
7324 | }; |
||
7325 | var getApi = function (editor, clipboard, resizeHandler, selectionTargets) { |
||
7326 | return { |
||
7327 | insertTable: insertTable(editor), |
||
7328 | setClipboardRows: setClipboardElements(clipboard.setRows), |
||
7329 | getClipboardRows: getClipboardElements(clipboard.getRows), |
||
7330 | setClipboardCols: setClipboardElements(clipboard.setColumns), |
||
7331 | getClipboardCols: getClipboardElements(clipboard.getColumns), |
||
7332 | resizeHandler: resizeHandler, |
||
7333 | selectionTargets: selectionTargets |
||
7334 | }; |
||
7335 | }; |
||
7336 | |||
7337 | var constrainSpan = function (element, property, value) { |
||
7338 | var currentColspan = getAttrValue(element, property, 1); |
||
7339 | if (value === 1 || currentColspan <= 1) { |
||
637 | daniel-mar | 7340 | remove$7(element, property); |
597 | daniel-mar | 7341 | } else { |
637 | daniel-mar | 7342 | set$2(element, property, Math.min(value, currentColspan)); |
597 | daniel-mar | 7343 | } |
7344 | }; |
||
7345 | var generateColGroup = function (house, minColRange, maxColRange) { |
||
7346 | if (Warehouse.hasColumns(house)) { |
||
637 | daniel-mar | 7347 | var colsToCopy = filter$2(Warehouse.justColumns(house), function (col) { |
597 | daniel-mar | 7348 | return col.column >= minColRange && col.column < maxColRange; |
7349 | }); |
||
637 | daniel-mar | 7350 | var copiedCols = map$1(colsToCopy, function (c) { |
597 | daniel-mar | 7351 | var clonedCol = deep(c.element); |
7352 | constrainSpan(clonedCol, 'span', maxColRange - minColRange); |
||
7353 | return clonedCol; |
||
7354 | }); |
||
7355 | var fakeColgroup = SugarElement.fromTag('colgroup'); |
||
637 | daniel-mar | 7356 | append(fakeColgroup, copiedCols); |
597 | daniel-mar | 7357 | return [fakeColgroup]; |
7358 | } else { |
||
7359 | return []; |
||
7360 | } |
||
7361 | }; |
||
7362 | var generateRows = function (house, minColRange, maxColRange) { |
||
637 | daniel-mar | 7363 | return map$1(house.all, function (row) { |
7364 | var cellsToCopy = filter$2(row.cells, function (cell) { |
||
597 | daniel-mar | 7365 | return cell.column >= minColRange && cell.column < maxColRange; |
7366 | }); |
||
637 | daniel-mar | 7367 | var copiedCells = map$1(cellsToCopy, function (cell) { |
597 | daniel-mar | 7368 | var clonedCell = deep(cell.element); |
7369 | constrainSpan(clonedCell, 'colspan', maxColRange - minColRange); |
||
7370 | return clonedCell; |
||
7371 | }); |
||
7372 | var fakeTR = SugarElement.fromTag('tr'); |
||
637 | daniel-mar | 7373 | append(fakeTR, copiedCells); |
597 | daniel-mar | 7374 | return fakeTR; |
7375 | }); |
||
7376 | }; |
||
7377 | var copyCols = function (table, target) { |
||
7378 | var house = Warehouse.fromTable(table); |
||
7379 | var details = onUnlockedCells(house, target); |
||
7380 | return details.map(function (selectedCells) { |
||
7381 | var lastSelectedCell = selectedCells[selectedCells.length - 1]; |
||
7382 | var minColRange = selectedCells[0].column; |
||
7383 | var maxColRange = lastSelectedCell.column + lastSelectedCell.colspan; |
||
7384 | var fakeColGroups = generateColGroup(house, minColRange, maxColRange); |
||
7385 | var fakeRows = generateRows(house, minColRange, maxColRange); |
||
679 | daniel-mar | 7386 | return __spreadArray(__spreadArray([], fakeColGroups, true), fakeRows, true); |
597 | daniel-mar | 7387 | }); |
7388 | }; |
||
7389 | |||
7390 | var copyRows = function (table, target, generators) { |
||
7391 | var warehouse = Warehouse.fromTable(table); |
||
7392 | var details = onCells(warehouse, target); |
||
7393 | return details.bind(function (selectedCells) { |
||
7394 | var grid = toGrid(warehouse, generators, false); |
||
7395 | var rows = extractGridDetails(grid).rows; |
||
7396 | var slicedGrid = rows.slice(selectedCells[0].row, selectedCells[selectedCells.length - 1].row + selectedCells[selectedCells.length - 1].rowspan); |
||
637 | daniel-mar | 7397 | var filteredGrid = bind$2(slicedGrid, function (row) { |
7398 | var newCells = filter$2(row.cells, function (cell) { |
||
597 | daniel-mar | 7399 | return !cell.isLocked; |
7400 | }); |
||
7401 | return newCells.length > 0 ? [__assign(__assign({}, row), { cells: newCells })] : []; |
||
7402 | }); |
||
637 | daniel-mar | 7403 | var slicedDetails = toDetailList(filteredGrid); |
597 | daniel-mar | 7404 | return someIf(slicedDetails.length > 0, slicedDetails); |
7405 | }).map(function (slicedDetails) { |
||
637 | daniel-mar | 7406 | return copy(slicedDetails); |
597 | daniel-mar | 7407 | }); |
7408 | }; |
||
7409 | |||
637 | daniel-mar | 7410 | var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); |
597 | daniel-mar | 7411 | |
7412 | var getTDTHOverallStyle = function (dom, elm, name) { |
||
7413 | var cells = dom.select('td,th', elm); |
||
7414 | var firstChildStyle; |
||
7415 | var checkChildren = function (firstChildStyle, elms) { |
||
7416 | for (var i = 0; i < elms.length; i++) { |
||
7417 | var currentStyle = dom.getStyle(elms[i], name); |
||
7418 | if (typeof firstChildStyle === 'undefined') { |
||
7419 | firstChildStyle = currentStyle; |
||
7420 | } |
||
7421 | if (firstChildStyle !== currentStyle) { |
||
7422 | return ''; |
||
7423 | } |
||
7424 | } |
||
7425 | return firstChildStyle; |
||
7426 | }; |
||
7427 | return checkChildren(firstChildStyle, cells); |
||
7428 | }; |
||
7429 | var applyAlign = function (editor, elm, name) { |
||
7430 | if (name) { |
||
7431 | editor.formatter.apply('align' + name, {}, elm); |
||
7432 | } |
||
7433 | }; |
||
7434 | var applyVAlign = function (editor, elm, name) { |
||
7435 | if (name) { |
||
7436 | editor.formatter.apply('valign' + name, {}, elm); |
||
7437 | } |
||
7438 | }; |
||
7439 | var unApplyAlign = function (editor, elm) { |
||
637 | daniel-mar | 7440 | global$2.each('left center right'.split(' '), function (name) { |
597 | daniel-mar | 7441 | editor.formatter.remove('align' + name, {}, elm); |
7442 | }); |
||
7443 | }; |
||
7444 | var unApplyVAlign = function (editor, elm) { |
||
637 | daniel-mar | 7445 | global$2.each('top middle bottom'.split(' '), function (name) { |
597 | daniel-mar | 7446 | editor.formatter.remove('valign' + name, {}, elm); |
7447 | }); |
||
7448 | }; |
||
7449 | |||
637 | daniel-mar | 7450 | var verticalAlignValues = [ |
7451 | { |
||
7452 | text: 'None', |
||
7453 | value: '' |
||
7454 | }, |
||
7455 | { |
||
7456 | text: 'Top', |
||
7457 | value: 'top' |
||
7458 | }, |
||
7459 | { |
||
7460 | text: 'Middle', |
||
7461 | value: 'middle' |
||
7462 | }, |
||
7463 | { |
||
7464 | text: 'Bottom', |
||
7465 | value: 'bottom' |
||
7466 | } |
||
7467 | ]; |
||
7468 | |||
7469 | var hexColour = function (value) { |
||
7470 | return { value: value }; |
||
597 | daniel-mar | 7471 | }; |
637 | daniel-mar | 7472 | var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; |
7473 | var longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; |
||
7474 | var isHexString = function (hex) { |
||
7475 | return shorthandRegex.test(hex) || longformRegex.test(hex); |
||
597 | daniel-mar | 7476 | }; |
637 | daniel-mar | 7477 | var normalizeHex = function (hex) { |
7478 | return removeLeading(hex, '#').toUpperCase(); |
||
597 | daniel-mar | 7479 | }; |
637 | daniel-mar | 7480 | var fromString$1 = function (hex) { |
7481 | return isHexString(hex) ? Optional.some({ value: normalizeHex(hex) }) : Optional.none(); |
||
7482 | }; |
||
7483 | var toHex = function (component) { |
||
7484 | var hex = component.toString(16); |
||
7485 | return (hex.length === 1 ? '0' + hex : hex).toUpperCase(); |
||
7486 | }; |
||
7487 | var fromRgba = function (rgbaColour) { |
||
7488 | var value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue); |
||
7489 | return hexColour(value); |
||
7490 | }; |
||
7491 | |||
7492 | var rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)/; |
||
7493 | var rgbaRegex = /^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/; |
||
7494 | var rgbaColour = function (red, green, blue, alpha) { |
||
597 | daniel-mar | 7495 | return { |
637 | daniel-mar | 7496 | red: red, |
7497 | green: green, |
||
7498 | blue: blue, |
||
7499 | alpha: alpha |
||
597 | daniel-mar | 7500 | }; |
7501 | }; |
||
637 | daniel-mar | 7502 | var fromStringValues = function (red, green, blue, alpha) { |
7503 | var r = parseInt(red, 10); |
||
7504 | var g = parseInt(green, 10); |
||
7505 | var b = parseInt(blue, 10); |
||
7506 | var a = parseFloat(alpha); |
||
7507 | return rgbaColour(r, g, b, a); |
||
7508 | }; |
||
7509 | var fromString = function (rgbaString) { |
||
7510 | if (rgbaString === 'transparent') { |
||
7511 | return Optional.some(rgbaColour(0, 0, 0, 0)); |
||
7512 | } |
||
7513 | var rgbMatch = rgbRegex.exec(rgbaString); |
||
7514 | if (rgbMatch !== null) { |
||
7515 | return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1')); |
||
7516 | } |
||
7517 | var rgbaMatch = rgbaRegex.exec(rgbaString); |
||
7518 | if (rgbaMatch !== null) { |
||
7519 | return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4])); |
||
7520 | } |
||
7521 | return Optional.none(); |
||
7522 | }; |
||
7523 | |||
7524 | var anyToHex = function (color) { |
||
7525 | return fromString$1(color).orThunk(function () { |
||
7526 | return fromString(color).map(fromRgba); |
||
7527 | }).getOrThunk(function () { |
||
7528 | var canvas = document.createElement('canvas'); |
||
7529 | canvas.height = 1; |
||
7530 | canvas.width = 1; |
||
7531 | var canvasContext = canvas.getContext('2d'); |
||
7532 | canvasContext.clearRect(0, 0, canvas.width, canvas.height); |
||
7533 | canvasContext.fillStyle = '#FFFFFF'; |
||
7534 | canvasContext.fillStyle = color; |
||
7535 | canvasContext.fillRect(0, 0, 1, 1); |
||
7536 | var rgba = canvasContext.getImageData(0, 0, 1, 1).data; |
||
7537 | var r = rgba[0]; |
||
7538 | var g = rgba[1]; |
||
7539 | var b = rgba[2]; |
||
7540 | var a = rgba[3]; |
||
7541 | return fromRgba(rgbaColour(r, g, b, a)); |
||
597 | daniel-mar | 7542 | }); |
7543 | }; |
||
637 | daniel-mar | 7544 | |
679 | daniel-mar | 7545 | var Cell = function (initial) { |
7546 | var value = initial; |
||
7547 | var get = function () { |
||
7548 | return value; |
||
7549 | }; |
||
7550 | var set = function (v) { |
||
7551 | value = v; |
||
7552 | }; |
||
7553 | return { |
||
7554 | get: get, |
||
7555 | set: set |
||
7556 | }; |
||
7557 | }; |
||
7558 | |||
637 | daniel-mar | 7559 | var singleton = function (doRevoke) { |
7560 | var subject = Cell(Optional.none()); |
||
7561 | var revoke = function () { |
||
7562 | return subject.get().each(doRevoke); |
||
597 | daniel-mar | 7563 | }; |
637 | daniel-mar | 7564 | var clear = function () { |
7565 | revoke(); |
||
7566 | subject.set(Optional.none()); |
||
7567 | }; |
||
7568 | var isSet = function () { |
||
7569 | return subject.get().isSome(); |
||
7570 | }; |
||
7571 | var get = function () { |
||
7572 | return subject.get(); |
||
7573 | }; |
||
7574 | var set = function (s) { |
||
7575 | revoke(); |
||
7576 | subject.set(Optional.some(s)); |
||
7577 | }; |
||
597 | daniel-mar | 7578 | return { |
637 | daniel-mar | 7579 | clear: clear, |
7580 | isSet: isSet, |
||
7581 | get: get, |
||
7582 | set: set |
||
597 | daniel-mar | 7583 | }; |
7584 | }; |
||
637 | daniel-mar | 7585 | var unbindable = function () { |
7586 | return singleton(function (s) { |
||
7587 | return s.unbind(); |
||
7588 | }); |
||
597 | daniel-mar | 7589 | }; |
637 | daniel-mar | 7590 | var value = function () { |
7591 | var subject = singleton(noop); |
||
7592 | var on = function (f) { |
||
7593 | return subject.get().each(f); |
||
7594 | }; |
||
7595 | return __assign(__assign({}, subject), { on: on }); |
||
7596 | }; |
||
7597 | |||
7598 | var onSetupToggle = function (editor, selections, formatName, formatValue) { |
||
7599 | return function (api) { |
||
7600 | var boundCallback = unbindable(); |
||
7601 | var isNone = isEmpty$1(formatValue); |
||
7602 | var init = function () { |
||
7603 | var selectedCells = getCellsFromSelection(selections); |
||
7604 | var checkNode = function (cell) { |
||
7605 | return editor.formatter.match(formatName, { value: formatValue }, cell.dom, isNone); |
||
7606 | }; |
||
7607 | if (isNone) { |
||
7608 | api.setActive(!exists(selectedCells, checkNode)); |
||
7609 | boundCallback.set(editor.formatter.formatChanged(formatName, function (match) { |
||
7610 | return api.setActive(!match); |
||
7611 | }, true)); |
||
7612 | } else { |
||
7613 | api.setActive(forall(selectedCells, checkNode)); |
||
7614 | boundCallback.set(editor.formatter.formatChanged(formatName, api.setActive, false, { value: formatValue })); |
||
7615 | } |
||
597 | daniel-mar | 7616 | }; |
637 | daniel-mar | 7617 | editor.initialized ? init() : editor.on('init', init); |
7618 | return boundCallback.clear; |
||
597 | daniel-mar | 7619 | }; |
637 | daniel-mar | 7620 | }; |
7621 | var isListGroup = function (item) { |
||
7622 | return hasNonNullableKey(item, 'menu'); |
||
7623 | }; |
||
7624 | var buildListItems = function (items) { |
||
7625 | return map$1(items, function (item) { |
||
7626 | var text = item.text || item.title; |
||
7627 | if (isListGroup(item)) { |
||
7628 | return { |
||
7629 | text: text, |
||
7630 | items: buildListItems(item.menu) |
||
7631 | }; |
||
7632 | } else { |
||
7633 | return { |
||
7634 | text: text, |
||
7635 | value: item.value |
||
7636 | }; |
||
597 | daniel-mar | 7637 | } |
637 | daniel-mar | 7638 | }); |
7639 | }; |
||
7640 | var buildMenuItems = function (editor, selections, items, format, onAction) { |
||
7641 | return map$1(items, function (item) { |
||
7642 | var text = item.text || item.title; |
||
7643 | if (isListGroup(item)) { |
||
7644 | return { |
||
7645 | type: 'nestedmenuitem', |
||
7646 | text: text, |
||
7647 | getSubmenuItems: function () { |
||
7648 | return buildMenuItems(editor, selections, item.menu, format, onAction); |
||
7649 | } |
||
7650 | }; |
||
7651 | } else { |
||
7652 | return { |
||
7653 | text: text, |
||
7654 | type: 'togglemenuitem', |
||
7655 | onAction: function () { |
||
7656 | return onAction(item.value); |
||
7657 | }, |
||
7658 | onSetup: onSetupToggle(editor, selections, format, item.value) |
||
7659 | }; |
||
7660 | } |
||
7661 | }); |
||
7662 | }; |
||
7663 | var applyTableCellStyle = function (editor, style) { |
||
7664 | return function (value) { |
||
7665 | var _a; |
||
7666 | editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a)); |
||
597 | daniel-mar | 7667 | }; |
7668 | }; |
||
637 | daniel-mar | 7669 | var filterNoneItem = function (list) { |
7670 | return bind$2(list, function (item) { |
||
7671 | if (isListGroup(item)) { |
||
7672 | return [__assign(__assign({}, item), { menu: filterNoneItem(item.menu) })]; |
||
7673 | } else { |
||
7674 | return isNotEmpty(item.value) ? [item] : []; |
||
597 | daniel-mar | 7675 | } |
637 | daniel-mar | 7676 | }); |
7677 | }; |
||
7678 | var generateMenuItemsCallback = function (editor, selections, items, format, onAction) { |
||
7679 | return function (callback) { |
||
7680 | return callback(buildMenuItems(editor, selections, items, format, onAction)); |
||
597 | daniel-mar | 7681 | }; |
7682 | }; |
||
637 | daniel-mar | 7683 | var buildColorMenu = function (editor, colorList, style) { |
7684 | var colorMap = map$1(colorList, function (entry) { |
||
7685 | return { |
||
7686 | text: entry.title, |
||
7687 | value: '#' + anyToHex(entry.value).value, |
||
7688 | type: 'choiceitem' |
||
7689 | }; |
||
7690 | }); |
||
7691 | return [{ |
||
7692 | type: 'fancymenuitem', |
||
7693 | fancytype: 'colorswatch', |
||
7694 | initData: { |
||
7695 | colors: colorMap.length > 0 ? colorMap : undefined, |
||
7696 | allowCustomColors: false |
||
7697 | }, |
||
7698 | onAction: function (data) { |
||
7699 | var _a; |
||
7700 | var value = data.value === 'remove' ? '' : data.value; |
||
7701 | editor.execCommand('mceTableApplyCellStyle', false, (_a = {}, _a[style] = value, _a)); |
||
7702 | } |
||
7703 | }]; |
||
597 | daniel-mar | 7704 | }; |
637 | daniel-mar | 7705 | var changeRowHeader = function (editor) { |
7706 | return function () { |
||
7707 | var currentType = editor.queryCommandValue('mceTableRowType'); |
||
7708 | var newType = currentType === 'header' ? 'body' : 'header'; |
||
7709 | editor.execCommand('mceTableRowType', false, { type: newType }); |
||
597 | daniel-mar | 7710 | }; |
7711 | }; |
||
637 | daniel-mar | 7712 | var changeColumnHeader = function (editor) { |
7713 | return function () { |
||
7714 | var currentType = editor.queryCommandValue('mceTableColType'); |
||
7715 | var newType = currentType === 'th' ? 'td' : 'th'; |
||
7716 | editor.execCommand('mceTableColType', false, { type: newType }); |
||
7717 | }; |
||
7718 | }; |
||
597 | daniel-mar | 7719 | |
637 | daniel-mar | 7720 | var getClassList$1 = function (editor) { |
597 | daniel-mar | 7721 | var classes = buildListItems(getCellClassList(editor)); |
7722 | if (classes.length > 0) { |
||
7723 | return Optional.some({ |
||
7724 | name: 'class', |
||
7725 | type: 'listbox', |
||
7726 | label: 'Class', |
||
7727 | items: classes |
||
7728 | }); |
||
7729 | } |
||
7730 | return Optional.none(); |
||
7731 | }; |
||
637 | daniel-mar | 7732 | var children = [ |
597 | daniel-mar | 7733 | { |
7734 | name: 'width', |
||
7735 | type: 'input', |
||
7736 | label: 'Width' |
||
7737 | }, |
||
7738 | { |
||
7739 | name: 'height', |
||
7740 | type: 'input', |
||
7741 | label: 'Height' |
||
7742 | }, |
||
7743 | { |
||
7744 | name: 'celltype', |
||
7745 | type: 'listbox', |
||
7746 | label: 'Cell type', |
||
7747 | items: [ |
||
7748 | { |
||
7749 | text: 'Cell', |
||
7750 | value: 'td' |
||
7751 | }, |
||
7752 | { |
||
7753 | text: 'Header cell', |
||
7754 | value: 'th' |
||
7755 | } |
||
7756 | ] |
||
7757 | }, |
||
7758 | { |
||
7759 | name: 'scope', |
||
7760 | type: 'listbox', |
||
7761 | label: 'Scope', |
||
7762 | items: [ |
||
7763 | { |
||
7764 | text: 'None', |
||
7765 | value: '' |
||
7766 | }, |
||
7767 | { |
||
7768 | text: 'Row', |
||
7769 | value: 'row' |
||
7770 | }, |
||
7771 | { |
||
7772 | text: 'Column', |
||
7773 | value: 'col' |
||
7774 | }, |
||
7775 | { |
||
7776 | text: 'Row group', |
||
7777 | value: 'rowgroup' |
||
7778 | }, |
||
7779 | { |
||
7780 | text: 'Column group', |
||
7781 | value: 'colgroup' |
||
7782 | } |
||
7783 | ] |
||
7784 | }, |
||
7785 | { |
||
7786 | name: 'halign', |
||
7787 | type: 'listbox', |
||
7788 | label: 'Horizontal align', |
||
7789 | items: [ |
||
7790 | { |
||
7791 | text: 'None', |
||
7792 | value: '' |
||
7793 | }, |
||
7794 | { |
||
7795 | text: 'Left', |
||
7796 | value: 'left' |
||
7797 | }, |
||
7798 | { |
||
7799 | text: 'Center', |
||
7800 | value: 'center' |
||
7801 | }, |
||
7802 | { |
||
7803 | text: 'Right', |
||
7804 | value: 'right' |
||
7805 | } |
||
7806 | ] |
||
7807 | }, |
||
7808 | { |
||
7809 | name: 'valign', |
||
7810 | type: 'listbox', |
||
7811 | label: 'Vertical align', |
||
637 | daniel-mar | 7812 | items: verticalAlignValues |
597 | daniel-mar | 7813 | } |
7814 | ]; |
||
637 | daniel-mar | 7815 | var getItems$2 = function (editor) { |
7816 | return children.concat(getClassList$1(editor).toArray()); |
||
597 | daniel-mar | 7817 | }; |
7818 | |||
637 | daniel-mar | 7819 | var getAdvancedTab = function (editor, dialogName) { |
7820 | var emptyBorderStyle = [{ |
||
7821 | text: 'Select...', |
||
7822 | value: '' |
||
7823 | }]; |
||
7824 | var advTabItems = [ |
||
7825 | { |
||
7826 | name: 'borderstyle', |
||
7827 | type: 'listbox', |
||
7828 | label: 'Border style', |
||
7829 | items: emptyBorderStyle.concat(buildListItems(getTableBorderStyles(editor))) |
||
7830 | }, |
||
7831 | { |
||
7832 | name: 'bordercolor', |
||
7833 | type: 'colorinput', |
||
7834 | label: 'Border color' |
||
7835 | }, |
||
7836 | { |
||
7837 | name: 'backgroundcolor', |
||
7838 | type: 'colorinput', |
||
7839 | label: 'Background color' |
||
7840 | } |
||
7841 | ]; |
||
7842 | var borderWidth = { |
||
7843 | name: 'borderwidth', |
||
7844 | type: 'input', |
||
7845 | label: 'Border width' |
||
7846 | }; |
||
7847 | var items = dialogName === 'cell' ? [borderWidth].concat(advTabItems) : advTabItems; |
||
7848 | return { |
||
7849 | title: 'Advanced', |
||
7850 | name: 'advanced', |
||
7851 | items: items |
||
7852 | }; |
||
7853 | }; |
||
7854 | |||
597 | daniel-mar | 7855 | var modifiers = function (testTruthy) { |
7856 | return function (editor, node) { |
||
7857 | var dom = editor.dom; |
||
7858 | var setAttrib = function (attr, value) { |
||
7859 | if (!testTruthy || value) { |
||
7860 | dom.setAttrib(node, attr, value); |
||
7861 | } |
||
7862 | }; |
||
7863 | var setStyle = function (prop, value) { |
||
7864 | if (!testTruthy || value) { |
||
7865 | dom.setStyle(node, prop, value); |
||
7866 | } |
||
7867 | }; |
||
7868 | var setFormat = function (formatName, value) { |
||
7869 | if (!testTruthy || value) { |
||
7870 | if (value === '') { |
||
7871 | editor.formatter.remove(formatName, { value: null }, node, true); |
||
7872 | } else { |
||
7873 | editor.formatter.apply(formatName, { value: value }, node); |
||
7874 | } |
||
7875 | } |
||
7876 | }; |
||
7877 | return { |
||
7878 | setAttrib: setAttrib, |
||
7879 | setStyle: setStyle, |
||
7880 | setFormat: setFormat |
||
7881 | }; |
||
7882 | }; |
||
7883 | }; |
||
7884 | var DomModifier = { |
||
7885 | normal: modifiers(false), |
||
7886 | ifTruthy: modifiers(true) |
||
7887 | }; |
||
7888 | |||
637 | daniel-mar | 7889 | var rgbToHex = function (dom) { |
7890 | return function (value) { |
||
7891 | return startsWith(value, 'rgb') ? dom.toHex(value) : value; |
||
7892 | }; |
||
7893 | }; |
||
7894 | var extractAdvancedStyles = function (dom, elm) { |
||
7895 | var element = SugarElement.fromDom(elm); |
||
7896 | return { |
||
7897 | borderwidth: getRaw$2(element, 'border-width').getOr(''), |
||
7898 | borderstyle: getRaw$2(element, 'border-style').getOr(''), |
||
7899 | bordercolor: getRaw$2(element, 'border-color').map(rgbToHex(dom)).getOr(''), |
||
7900 | backgroundcolor: getRaw$2(element, 'background-color').map(rgbToHex(dom)).getOr('') |
||
7901 | }; |
||
7902 | }; |
||
7903 | var getSharedValues = function (data) { |
||
7904 | var baseData = data[0]; |
||
7905 | var comparisonData = data.slice(1); |
||
7906 | each$2(comparisonData, function (items) { |
||
7907 | each$2(keys(baseData), function (key) { |
||
7908 | each$1(items, function (itemValue, itemKey) { |
||
7909 | var comparisonValue = baseData[key]; |
||
7910 | if (comparisonValue !== '' && key === itemKey) { |
||
7911 | if (comparisonValue !== itemValue) { |
||
7912 | baseData[key] = ''; |
||
7913 | } |
||
7914 | } |
||
597 | daniel-mar | 7915 | }); |
7916 | }); |
||
637 | daniel-mar | 7917 | }); |
7918 | return baseData; |
||
7919 | }; |
||
7920 | var getAlignment = function (formats, formatName, editor, elm) { |
||
7921 | return find$1(formats, function (name) { |
||
7922 | return !isUndefined(editor.formatter.matchNode(elm, formatName + name)); |
||
7923 | }).getOr(''); |
||
7924 | }; |
||
7925 | var getHAlignment = curry(getAlignment, [ |
||
7926 | 'left', |
||
7927 | 'center', |
||
7928 | 'right' |
||
7929 | ], 'align'); |
||
7930 | var getVAlignment = curry(getAlignment, [ |
||
7931 | 'top', |
||
7932 | 'middle', |
||
7933 | 'bottom' |
||
7934 | ], 'valign'); |
||
7935 | var extractDataFromSettings = function (editor, hasAdvTableTab) { |
||
7936 | var style = getDefaultStyles(editor); |
||
7937 | var attrs = getDefaultAttributes(editor); |
||
7938 | var extractAdvancedStyleData = function (dom) { |
||
7939 | return { |
||
7940 | borderstyle: get$c(style, 'border-style').getOr(''), |
||
7941 | bordercolor: rgbToHex(dom)(get$c(style, 'border-color').getOr('')), |
||
7942 | backgroundcolor: rgbToHex(dom)(get$c(style, 'background-color').getOr('')) |
||
7943 | }; |
||
7944 | }; |
||
7945 | var defaultData = { |
||
7946 | height: '', |
||
7947 | width: '100%', |
||
7948 | cellspacing: '', |
||
7949 | cellpadding: '', |
||
7950 | caption: false, |
||
7951 | class: '', |
||
7952 | align: '', |
||
7953 | border: '' |
||
7954 | }; |
||
7955 | var getBorder = function () { |
||
7956 | var borderWidth = style['border-width']; |
||
7957 | if (shouldStyleWithCss(editor) && borderWidth) { |
||
7958 | return { border: borderWidth }; |
||
7959 | } |
||
7960 | return get$c(attrs, 'border').fold(function () { |
||
7961 | return {}; |
||
7962 | }, function (border) { |
||
7963 | return { border: border }; |
||
597 | daniel-mar | 7964 | }); |
637 | daniel-mar | 7965 | }; |
7966 | var advStyle = hasAdvTableTab ? extractAdvancedStyleData(editor.dom) : {}; |
||
7967 | var getCellPaddingCellSpacing = function () { |
||
7968 | var spacing = get$c(style, 'border-spacing').or(get$c(attrs, 'cellspacing')).fold(function () { |
||
7969 | return {}; |
||
7970 | }, function (cellspacing) { |
||
7971 | return { cellspacing: cellspacing }; |
||
7972 | }); |
||
7973 | var padding = get$c(style, 'border-padding').or(get$c(attrs, 'cellpadding')).fold(function () { |
||
7974 | return {}; |
||
7975 | }, function (cellpadding) { |
||
7976 | return { cellpadding: cellpadding }; |
||
7977 | }); |
||
7978 | return __assign(__assign({}, spacing), padding); |
||
7979 | }; |
||
7980 | var data = __assign(__assign(__assign(__assign(__assign(__assign({}, defaultData), style), attrs), advStyle), getBorder()), getCellPaddingCellSpacing()); |
||
7981 | return data; |
||
7982 | }; |
||
7983 | var getRowType = function (elm) { |
||
7984 | return table(SugarElement.fromDom(elm)).map(function (table) { |
||
7985 | var target = { selection: fromDom(elm.cells) }; |
||
7986 | return getRowsType(table, target); |
||
7987 | }).getOr(''); |
||
7988 | }; |
||
7989 | var extractDataFromTableElement = function (editor, elm, hasAdvTableTab) { |
||
7990 | var getBorder = function (dom, elm) { |
||
7991 | var optBorderWidth = getRaw$2(SugarElement.fromDom(elm), 'border-width'); |
||
7992 | if (shouldStyleWithCss(editor) && optBorderWidth.isSome()) { |
||
7993 | return optBorderWidth.getOr(''); |
||
7994 | } |
||
7995 | return dom.getAttrib(elm, 'border') || getTDTHOverallStyle(editor.dom, elm, 'border-width') || getTDTHOverallStyle(editor.dom, elm, 'border'); |
||
7996 | }; |
||
7997 | var dom = editor.dom; |
||
7998 | var cellspacing = shouldStyleWithCss(editor) ? dom.getStyle(elm, 'border-spacing') || dom.getAttrib(elm, 'cellspacing') : dom.getAttrib(elm, 'cellspacing') || dom.getStyle(elm, 'border-spacing'); |
||
7999 | var cellpadding = shouldStyleWithCss(editor) ? getTDTHOverallStyle(dom, elm, 'padding') || dom.getAttrib(elm, 'cellpadding') : dom.getAttrib(elm, 'cellpadding') || getTDTHOverallStyle(dom, elm, 'padding'); |
||
8000 | return __assign({ |
||
8001 | width: dom.getStyle(elm, 'width') || dom.getAttrib(elm, 'width'), |
||
8002 | height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), |
||
8003 | cellspacing: cellspacing, |
||
8004 | cellpadding: cellpadding, |
||
8005 | border: getBorder(dom, elm), |
||
8006 | caption: !!dom.select('caption', elm)[0], |
||
8007 | class: dom.getAttrib(elm, 'class', ''), |
||
8008 | align: getHAlignment(editor, elm) |
||
8009 | }, hasAdvTableTab ? extractAdvancedStyles(dom, elm) : {}); |
||
8010 | }; |
||
8011 | var extractDataFromRowElement = function (editor, elm, hasAdvancedRowTab) { |
||
8012 | var dom = editor.dom; |
||
8013 | return __assign({ |
||
8014 | height: dom.getStyle(elm, 'height') || dom.getAttrib(elm, 'height'), |
||
8015 | class: dom.getAttrib(elm, 'class', ''), |
||
8016 | type: getRowType(elm), |
||
8017 | align: getHAlignment(editor, elm) |
||
8018 | }, hasAdvancedRowTab ? extractAdvancedStyles(dom, elm) : {}); |
||
8019 | }; |
||
8020 | var extractDataFromCellElement = function (editor, cell, hasAdvancedCellTab, column) { |
||
8021 | var dom = editor.dom; |
||
8022 | var colElm = column.getOr(cell); |
||
8023 | var getStyle = function (element, style) { |
||
8024 | return dom.getStyle(element, style) || dom.getAttrib(element, style); |
||
8025 | }; |
||
8026 | return __assign({ |
||
8027 | width: getStyle(colElm, 'width'), |
||
8028 | height: getStyle(cell, 'height'), |
||
8029 | scope: dom.getAttrib(cell, 'scope'), |
||
8030 | celltype: getNodeName(cell), |
||
8031 | class: dom.getAttrib(cell, 'class', ''), |
||
8032 | halign: getHAlignment(editor, cell), |
||
8033 | valign: getVAlignment(editor, cell) |
||
8034 | }, hasAdvancedCellTab ? extractAdvancedStyles(dom, cell) : {}); |
||
8035 | }; |
||
8036 | |||
8037 | var getSelectedCells = function (table, cells) { |
||
8038 | var warehouse = Warehouse.fromTable(table); |
||
8039 | var allCells = Warehouse.justCells(warehouse); |
||
8040 | var filtered = filter$2(allCells, function (cellA) { |
||
8041 | return exists(cells, function (cellB) { |
||
8042 | return eq$1(cellA.element, cellB); |
||
8043 | }); |
||
597 | daniel-mar | 8044 | }); |
637 | daniel-mar | 8045 | return map$1(filtered, function (cell) { |
8046 | return { |
||
8047 | element: cell.element.dom, |
||
8048 | column: Warehouse.getColumnAt(warehouse, cell.column).map(function (col) { |
||
8049 | return col.element.dom; |
||
8050 | }) |
||
8051 | }; |
||
8052 | }); |
||
597 | daniel-mar | 8053 | }; |
637 | daniel-mar | 8054 | var updateSimpleProps$1 = function (modifier, colModifier, data) { |
597 | daniel-mar | 8055 | modifier.setAttrib('scope', data.scope); |
8056 | modifier.setAttrib('class', data.class); |
||
8057 | modifier.setStyle('height', addPxSuffix(data.height)); |
||
8058 | colModifier.setStyle('width', addPxSuffix(data.width)); |
||
8059 | }; |
||
637 | daniel-mar | 8060 | var updateAdvancedProps$1 = function (modifier, data) { |
597 | daniel-mar | 8061 | modifier.setFormat('tablecellbackgroundcolor', data.backgroundcolor); |
8062 | modifier.setFormat('tablecellbordercolor', data.bordercolor); |
||
8063 | modifier.setFormat('tablecellborderstyle', data.borderstyle); |
||
8064 | modifier.setFormat('tablecellborderwidth', addPxSuffix(data.borderwidth)); |
||
8065 | }; |
||
637 | daniel-mar | 8066 | var applyStyleData$1 = function (editor, cells, data) { |
8067 | var isSingleCell = cells.length === 1; |
||
8068 | each$2(cells, function (item) { |
||
8069 | var cellElm = item.element; |
||
8070 | var modifier = isSingleCell ? DomModifier.normal(editor, cellElm) : DomModifier.ifTruthy(editor, cellElm); |
||
8071 | var colModifier = item.column.map(function (col) { |
||
8072 | return isSingleCell ? DomModifier.normal(editor, col) : DomModifier.ifTruthy(editor, col); |
||
8073 | }).getOr(modifier); |
||
8074 | updateSimpleProps$1(modifier, colModifier, data); |
||
8075 | if (hasAdvancedCellTab(editor)) { |
||
8076 | updateAdvancedProps$1(modifier, data); |
||
8077 | } |
||
8078 | if (isSingleCell) { |
||
8079 | unApplyAlign(editor, cellElm); |
||
8080 | unApplyVAlign(editor, cellElm); |
||
8081 | } |
||
8082 | if (data.halign) { |
||
8083 | applyAlign(editor, cellElm, data.halign); |
||
8084 | } |
||
8085 | if (data.valign) { |
||
8086 | applyVAlign(editor, cellElm, data.valign); |
||
8087 | } |
||
8088 | }); |
||
8089 | }; |
||
8090 | var applyStructureData$1 = function (editor, data) { |
||
8091 | editor.execCommand('mceTableCellType', false, { |
||
8092 | type: data.celltype, |
||
8093 | no_events: true |
||
8094 | }); |
||
8095 | }; |
||
597 | daniel-mar | 8096 | var applyCellData = function (editor, cells, oldData, data) { |
8097 | var modifiedData = filter$1(data, function (value, key) { |
||
8098 | return oldData[key] !== value; |
||
8099 | }); |
||
8100 | if (size(modifiedData) > 0 && cells.length >= 1) { |
||
637 | daniel-mar | 8101 | table(cells[0]).each(function (table) { |
8102 | var selectedCells = getSelectedCells(table, cells); |
||
8103 | var styleModified = size(filter$1(modifiedData, function (_value, key) { |
||
8104 | return key !== 'scope' && key !== 'celltype'; |
||
8105 | })) > 0; |
||
8106 | var structureModified = has$1(modifiedData, 'celltype'); |
||
8107 | if (styleModified || has$1(modifiedData, 'scope')) { |
||
8108 | applyStyleData$1(editor, selectedCells, data); |
||
8109 | } |
||
8110 | if (structureModified) { |
||
8111 | applyStructureData$1(editor, data); |
||
8112 | } |
||
8113 | fireTableModified(editor, table.dom, { |
||
8114 | structure: structureModified, |
||
8115 | style: styleModified |
||
597 | daniel-mar | 8116 | }); |
8117 | }); |
||
8118 | } |
||
8119 | }; |
||
8120 | var onSubmitCellForm = function (editor, cells, oldData, api) { |
||
8121 | var data = api.getData(); |
||
8122 | api.close(); |
||
8123 | editor.undoManager.transact(function () { |
||
8124 | applyCellData(editor, cells, oldData, data); |
||
8125 | editor.focus(); |
||
8126 | }); |
||
8127 | }; |
||
8128 | var getData = function (editor, cells) { |
||
637 | daniel-mar | 8129 | var cellsData = table(cells[0]).map(function (table) { |
8130 | return map$1(getSelectedCells(table, cells), function (item) { |
||
597 | daniel-mar | 8131 | return extractDataFromCellElement(editor, item.element, hasAdvancedCellTab(editor), item.column); |
8132 | }); |
||
8133 | }); |
||
8134 | return getSharedValues(cellsData.getOrDie()); |
||
8135 | }; |
||
637 | daniel-mar | 8136 | var open$2 = function (editor, selections) { |
8137 | var cells = getCellsFromSelection(selections); |
||
597 | daniel-mar | 8138 | if (cells.length === 0) { |
8139 | return; |
||
8140 | } |
||
8141 | var data = getData(editor, cells); |
||
8142 | var dialogTabPanel = { |
||
8143 | type: 'tabpanel', |
||
8144 | tabs: [ |
||
8145 | { |
||
8146 | title: 'General', |
||
8147 | name: 'general', |
||
637 | daniel-mar | 8148 | items: getItems$2(editor) |
597 | daniel-mar | 8149 | }, |
637 | daniel-mar | 8150 | getAdvancedTab(editor, 'cell') |
597 | daniel-mar | 8151 | ] |
8152 | }; |
||
8153 | var dialogPanel = { |
||
8154 | type: 'panel', |
||
8155 | items: [{ |
||
8156 | type: 'grid', |
||
8157 | columns: 2, |
||
637 | daniel-mar | 8158 | items: getItems$2(editor) |
597 | daniel-mar | 8159 | }] |
8160 | }; |
||
8161 | editor.windowManager.open({ |
||
8162 | title: 'Cell Properties', |
||
8163 | size: 'normal', |
||
8164 | body: hasAdvancedCellTab(editor) ? dialogTabPanel : dialogPanel, |
||
8165 | buttons: [ |
||
8166 | { |
||
8167 | type: 'cancel', |
||
8168 | name: 'cancel', |
||
8169 | text: 'Cancel' |
||
8170 | }, |
||
8171 | { |
||
8172 | type: 'submit', |
||
8173 | name: 'save', |
||
8174 | text: 'Save', |
||
8175 | primary: true |
||
8176 | } |
||
8177 | ], |
||
8178 | initialData: data, |
||
8179 | onSubmit: curry(onSubmitCellForm, editor, cells, data) |
||
8180 | }); |
||
8181 | }; |
||
8182 | |||
637 | daniel-mar | 8183 | var getClassList = function (editor) { |
597 | daniel-mar | 8184 | var classes = buildListItems(getRowClassList(editor)); |
8185 | if (classes.length > 0) { |
||
8186 | return Optional.some({ |
||
8187 | name: 'class', |
||
8188 | type: 'listbox', |
||
8189 | label: 'Class', |
||
8190 | items: classes |
||
8191 | }); |
||
8192 | } |
||
8193 | return Optional.none(); |
||
8194 | }; |
||
8195 | var formChildren = [ |
||
8196 | { |
||
8197 | type: 'listbox', |
||
8198 | name: 'type', |
||
8199 | label: 'Row type', |
||
8200 | items: [ |
||
8201 | { |
||
8202 | text: 'Header', |
||
8203 | value: 'header' |
||
8204 | }, |
||
8205 | { |
||
8206 | text: 'Body', |
||
8207 | value: 'body' |
||
8208 | }, |
||
8209 | { |
||
8210 | text: 'Footer', |
||
8211 | value: 'footer' |
||
8212 | } |
||
8213 | ] |
||
8214 | }, |
||
8215 | { |
||
8216 | type: 'listbox', |
||
8217 | name: 'align', |
||
8218 | label: 'Alignment', |
||
8219 | items: [ |
||
8220 | { |
||
8221 | text: 'None', |
||
8222 | value: '' |
||
8223 | }, |
||
8224 | { |
||
8225 | text: 'Left', |
||
8226 | value: 'left' |
||
8227 | }, |
||
8228 | { |
||
8229 | text: 'Center', |
||
8230 | value: 'center' |
||
8231 | }, |
||
8232 | { |
||
8233 | text: 'Right', |
||
8234 | value: 'right' |
||
8235 | } |
||
8236 | ] |
||
8237 | }, |
||
8238 | { |
||
8239 | label: 'Height', |
||
8240 | name: 'height', |
||
8241 | type: 'input' |
||
8242 | } |
||
8243 | ]; |
||
8244 | var getItems$1 = function (editor) { |
||
637 | daniel-mar | 8245 | return formChildren.concat(getClassList(editor).toArray()); |
597 | daniel-mar | 8246 | }; |
8247 | |||
637 | daniel-mar | 8248 | var updateSimpleProps = function (modifier, data) { |
597 | daniel-mar | 8249 | modifier.setAttrib('class', data.class); |
8250 | modifier.setStyle('height', addPxSuffix(data.height)); |
||
8251 | }; |
||
637 | daniel-mar | 8252 | var updateAdvancedProps = function (modifier, data) { |
597 | daniel-mar | 8253 | modifier.setStyle('background-color', data.backgroundcolor); |
8254 | modifier.setStyle('border-color', data.bordercolor); |
||
8255 | modifier.setStyle('border-style', data.borderstyle); |
||
8256 | }; |
||
637 | daniel-mar | 8257 | var applyStyleData = function (editor, rows, data, oldData) { |
8258 | var isSingleRow = rows.length === 1; |
||
8259 | each$2(rows, function (rowElm) { |
||
8260 | var modifier = isSingleRow ? DomModifier.normal(editor, rowElm) : DomModifier.ifTruthy(editor, rowElm); |
||
8261 | updateSimpleProps(modifier, data); |
||
8262 | if (hasAdvancedRowTab(editor)) { |
||
8263 | updateAdvancedProps(modifier, data); |
||
8264 | } |
||
8265 | if (data.align !== oldData.align) { |
||
8266 | unApplyAlign(editor, rowElm); |
||
8267 | applyAlign(editor, rowElm, data.align); |
||
8268 | } |
||
8269 | }); |
||
8270 | }; |
||
8271 | var applyStructureData = function (editor, data) { |
||
8272 | editor.execCommand('mceTableRowType', false, { |
||
8273 | type: data.type, |
||
8274 | no_events: true |
||
8275 | }); |
||
8276 | }; |
||
597 | daniel-mar | 8277 | var applyRowData = function (editor, rows, oldData, data) { |
8278 | var modifiedData = filter$1(data, function (value, key) { |
||
8279 | return oldData[key] !== value; |
||
8280 | }); |
||
8281 | if (size(modifiedData) > 0) { |
||
637 | daniel-mar | 8282 | var typeModified_1 = has$1(modifiedData, 'type'); |
597 | daniel-mar | 8283 | var styleModified_1 = typeModified_1 ? size(modifiedData) > 1 : true; |
637 | daniel-mar | 8284 | if (styleModified_1) { |
8285 | applyStyleData(editor, rows, data, oldData); |
||
8286 | } |
||
8287 | if (typeModified_1) { |
||
8288 | applyStructureData(editor, data); |
||
8289 | } |
||
597 | daniel-mar | 8290 | table(SugarElement.fromDom(rows[0])).each(function (table) { |
8291 | return fireTableModified(editor, table.dom, { |
||
8292 | structure: typeModified_1, |
||
8293 | style: styleModified_1 |
||
8294 | }); |
||
8295 | }); |
||
8296 | } |
||
8297 | }; |
||
8298 | var onSubmitRowForm = function (editor, rows, oldData, api) { |
||
8299 | var data = api.getData(); |
||
8300 | api.close(); |
||
8301 | editor.undoManager.transact(function () { |
||
8302 | applyRowData(editor, rows, oldData, data); |
||
8303 | editor.focus(); |
||
8304 | }); |
||
8305 | }; |
||
8306 | var open$1 = function (editor) { |
||
8307 | var rows = getRowsFromSelection(getSelectionStart(editor), ephemera.selected); |
||
8308 | if (rows.length === 0) { |
||
8309 | return; |
||
8310 | } |
||
637 | daniel-mar | 8311 | var rowsData = map$1(rows, function (rowElm) { |
597 | daniel-mar | 8312 | return extractDataFromRowElement(editor, rowElm.dom, hasAdvancedRowTab(editor)); |
8313 | }); |
||
8314 | var data = getSharedValues(rowsData); |
||
8315 | var dialogTabPanel = { |
||
8316 | type: 'tabpanel', |
||
8317 | tabs: [ |
||
8318 | { |
||
8319 | title: 'General', |
||
8320 | name: 'general', |
||
8321 | items: getItems$1(editor) |
||
8322 | }, |
||
637 | daniel-mar | 8323 | getAdvancedTab(editor, 'row') |
597 | daniel-mar | 8324 | ] |
8325 | }; |
||
8326 | var dialogPanel = { |
||
8327 | type: 'panel', |
||
8328 | items: [{ |
||
8329 | type: 'grid', |
||
8330 | columns: 2, |
||
8331 | items: getItems$1(editor) |
||
8332 | }] |
||
8333 | }; |
||
8334 | editor.windowManager.open({ |
||
8335 | title: 'Row Properties', |
||
8336 | size: 'normal', |
||
8337 | body: hasAdvancedRowTab(editor) ? dialogTabPanel : dialogPanel, |
||
8338 | buttons: [ |
||
8339 | { |
||
8340 | type: 'cancel', |
||
8341 | name: 'cancel', |
||
8342 | text: 'Cancel' |
||
8343 | }, |
||
8344 | { |
||
8345 | type: 'submit', |
||
8346 | name: 'save', |
||
8347 | text: 'Save', |
||
8348 | primary: true |
||
8349 | } |
||
8350 | ], |
||
8351 | initialData: data, |
||
637 | daniel-mar | 8352 | onSubmit: curry(onSubmitRowForm, editor, map$1(rows, function (r) { |
597 | daniel-mar | 8353 | return r.dom; |
8354 | }), data) |
||
8355 | }); |
||
8356 | }; |
||
8357 | |||
637 | daniel-mar | 8358 | var getItems = function (editor, classes, insertNewTable) { |
597 | daniel-mar | 8359 | var rowColCountItems = !insertNewTable ? [] : [ |
8360 | { |
||
8361 | type: 'input', |
||
8362 | name: 'cols', |
||
8363 | label: 'Cols', |
||
8364 | inputMode: 'numeric' |
||
8365 | }, |
||
8366 | { |
||
8367 | type: 'input', |
||
8368 | name: 'rows', |
||
8369 | label: 'Rows', |
||
8370 | inputMode: 'numeric' |
||
8371 | } |
||
8372 | ]; |
||
8373 | var alwaysItems = [ |
||
8374 | { |
||
8375 | type: 'input', |
||
8376 | name: 'width', |
||
8377 | label: 'Width' |
||
8378 | }, |
||
8379 | { |
||
8380 | type: 'input', |
||
8381 | name: 'height', |
||
8382 | label: 'Height' |
||
8383 | } |
||
8384 | ]; |
||
8385 | var appearanceItems = hasAppearanceOptions(editor) ? [ |
||
8386 | { |
||
8387 | type: 'input', |
||
8388 | name: 'cellspacing', |
||
8389 | label: 'Cell spacing', |
||
8390 | inputMode: 'numeric' |
||
8391 | }, |
||
8392 | { |
||
8393 | type: 'input', |
||
8394 | name: 'cellpadding', |
||
8395 | label: 'Cell padding', |
||
8396 | inputMode: 'numeric' |
||
8397 | }, |
||
8398 | { |
||
8399 | type: 'input', |
||
8400 | name: 'border', |
||
8401 | label: 'Border width' |
||
8402 | }, |
||
8403 | { |
||
8404 | type: 'label', |
||
8405 | label: 'Caption', |
||
8406 | items: [{ |
||
8407 | type: 'checkbox', |
||
8408 | name: 'caption', |
||
8409 | label: 'Show caption' |
||
8410 | }] |
||
8411 | } |
||
8412 | ] : []; |
||
8413 | var alignmentItem = [{ |
||
8414 | type: 'listbox', |
||
8415 | name: 'align', |
||
8416 | label: 'Alignment', |
||
8417 | items: [ |
||
8418 | { |
||
8419 | text: 'None', |
||
8420 | value: '' |
||
8421 | }, |
||
8422 | { |
||
8423 | text: 'Left', |
||
8424 | value: 'left' |
||
8425 | }, |
||
8426 | { |
||
8427 | text: 'Center', |
||
8428 | value: 'center' |
||
8429 | }, |
||
8430 | { |
||
8431 | text: 'Right', |
||
8432 | value: 'right' |
||
8433 | } |
||
8434 | ] |
||
8435 | }]; |
||
8436 | var classListItem = classes.length > 0 ? [{ |
||
8437 | type: 'listbox', |
||
8438 | name: 'class', |
||
8439 | label: 'Class', |
||
8440 | items: classes |
||
8441 | }] : []; |
||
8442 | return rowColCountItems.concat(alwaysItems).concat(appearanceItems).concat(alignmentItem).concat(classListItem); |
||
8443 | }; |
||
8444 | |||
8445 | var styleTDTH = function (dom, elm, name, value) { |
||
8446 | if (elm.tagName === 'TD' || elm.tagName === 'TH') { |
||
8447 | if (isString(name)) { |
||
8448 | dom.setStyle(elm, name, value); |
||
8449 | } else { |
||
8450 | dom.setStyle(elm, name); |
||
8451 | } |
||
8452 | } else { |
||
8453 | if (elm.children) { |
||
8454 | for (var i = 0; i < elm.children.length; i++) { |
||
8455 | styleTDTH(dom, elm.children[i], name, value); |
||
8456 | } |
||
8457 | } |
||
8458 | } |
||
8459 | }; |
||
8460 | var applyDataToElement = function (editor, tableElm, data) { |
||
8461 | var dom = editor.dom; |
||
8462 | var attrs = {}; |
||
8463 | var styles = {}; |
||
8464 | attrs.class = data.class; |
||
8465 | styles.height = addPxSuffix(data.height); |
||
8466 | if (dom.getAttrib(tableElm, 'width') && !shouldStyleWithCss(editor)) { |
||
8467 | attrs.width = removePxSuffix(data.width); |
||
8468 | } else { |
||
8469 | styles.width = addPxSuffix(data.width); |
||
8470 | } |
||
8471 | if (shouldStyleWithCss(editor)) { |
||
8472 | styles['border-width'] = addPxSuffix(data.border); |
||
8473 | styles['border-spacing'] = addPxSuffix(data.cellspacing); |
||
8474 | } else { |
||
8475 | attrs.border = data.border; |
||
8476 | attrs.cellpadding = data.cellpadding; |
||
8477 | attrs.cellspacing = data.cellspacing; |
||
8478 | } |
||
8479 | if (shouldStyleWithCss(editor) && tableElm.children) { |
||
8480 | for (var i = 0; i < tableElm.children.length; i++) { |
||
8481 | styleTDTH(dom, tableElm.children[i], { |
||
8482 | 'border-width': addPxSuffix(data.border), |
||
8483 | 'padding': addPxSuffix(data.cellpadding) |
||
8484 | }); |
||
8485 | if (hasAdvancedTableTab(editor)) { |
||
8486 | styleTDTH(dom, tableElm.children[i], { 'border-color': data.bordercolor }); |
||
8487 | } |
||
8488 | } |
||
8489 | } |
||
8490 | if (hasAdvancedTableTab(editor)) { |
||
8491 | styles['background-color'] = data.backgroundcolor; |
||
8492 | styles['border-color'] = data.bordercolor; |
||
8493 | styles['border-style'] = data.borderstyle; |
||
8494 | } |
||
8495 | attrs.style = dom.serializeStyle(__assign(__assign({}, getDefaultStyles(editor)), styles)); |
||
8496 | dom.setAttribs(tableElm, __assign(__assign({}, getDefaultAttributes(editor)), attrs)); |
||
8497 | }; |
||
8498 | var onSubmitTableForm = function (editor, tableElm, oldData, api) { |
||
8499 | var dom = editor.dom; |
||
8500 | var data = api.getData(); |
||
8501 | var modifiedData = filter$1(data, function (value, key) { |
||
8502 | return oldData[key] !== value; |
||
8503 | }); |
||
8504 | api.close(); |
||
8505 | if (data.class === '') { |
||
8506 | delete data.class; |
||
8507 | } |
||
8508 | editor.undoManager.transact(function () { |
||
8509 | if (!tableElm) { |
||
8510 | var cols = parseInt(data.cols, 10) || 1; |
||
8511 | var rows = parseInt(data.rows, 10) || 1; |
||
637 | daniel-mar | 8512 | tableElm = insert(editor, cols, rows, 0, 0); |
597 | daniel-mar | 8513 | } |
8514 | if (size(modifiedData) > 0) { |
||
8515 | applyDataToElement(editor, tableElm, data); |
||
637 | daniel-mar | 8516 | var captionElm = dom.select('caption', tableElm)[0]; |
8517 | if (captionElm && !data.caption || !captionElm && data.caption) { |
||
8518 | editor.execCommand('mceTableToggleCaption'); |
||
597 | daniel-mar | 8519 | } |
8520 | if (data.align === '') { |
||
8521 | unApplyAlign(editor, tableElm); |
||
8522 | } else { |
||
8523 | applyAlign(editor, tableElm, data.align); |
||
8524 | } |
||
8525 | } |
||
8526 | editor.focus(); |
||
8527 | editor.addVisual(); |
||
8528 | if (size(modifiedData) > 0) { |
||
637 | daniel-mar | 8529 | var captionModified = has$1(modifiedData, 'caption'); |
597 | daniel-mar | 8530 | var styleModified = captionModified ? size(modifiedData) > 1 : true; |
8531 | fireTableModified(editor, tableElm, { |
||
8532 | structure: captionModified, |
||
8533 | style: styleModified |
||
8534 | }); |
||
8535 | } |
||
8536 | }); |
||
8537 | }; |
||
637 | daniel-mar | 8538 | var open = function (editor, insertNewTable) { |
597 | daniel-mar | 8539 | var dom = editor.dom; |
8540 | var tableElm; |
||
8541 | var data = extractDataFromSettings(editor, hasAdvancedTableTab(editor)); |
||
8542 | if (insertNewTable === false) { |
||
8543 | tableElm = dom.getParent(editor.selection.getStart(), 'table', editor.getBody()); |
||
8544 | if (tableElm) { |
||
8545 | data = extractDataFromTableElement(editor, tableElm, hasAdvancedTableTab(editor)); |
||
8546 | } else { |
||
8547 | if (hasAdvancedTableTab(editor)) { |
||
8548 | data.borderstyle = ''; |
||
8549 | data.bordercolor = ''; |
||
8550 | data.backgroundcolor = ''; |
||
8551 | } |
||
8552 | } |
||
8553 | } else { |
||
8554 | data.cols = '1'; |
||
8555 | data.rows = '1'; |
||
8556 | if (hasAdvancedTableTab(editor)) { |
||
8557 | data.borderstyle = ''; |
||
8558 | data.bordercolor = ''; |
||
8559 | data.backgroundcolor = ''; |
||
8560 | } |
||
8561 | } |
||
8562 | var classes = buildListItems(getTableClassList(editor)); |
||
8563 | if (classes.length > 0) { |
||
8564 | if (data.class) { |
||
8565 | data.class = data.class.replace(/\s*mce\-item\-table\s*/g, ''); |
||
8566 | } |
||
8567 | } |
||
8568 | var generalPanel = { |
||
8569 | type: 'grid', |
||
8570 | columns: 2, |
||
637 | daniel-mar | 8571 | items: getItems(editor, classes, insertNewTable) |
597 | daniel-mar | 8572 | }; |
8573 | var nonAdvancedForm = function () { |
||
8574 | return { |
||
8575 | type: 'panel', |
||
8576 | items: [generalPanel] |
||
8577 | }; |
||
8578 | }; |
||
8579 | var advancedForm = function () { |
||
8580 | return { |
||
8581 | type: 'tabpanel', |
||
8582 | tabs: [ |
||
8583 | { |
||
8584 | title: 'General', |
||
8585 | name: 'general', |
||
8586 | items: [generalPanel] |
||
8587 | }, |
||
637 | daniel-mar | 8588 | getAdvancedTab(editor, 'table') |
597 | daniel-mar | 8589 | ] |
8590 | }; |
||
8591 | }; |
||
8592 | var dialogBody = hasAdvancedTableTab(editor) ? advancedForm() : nonAdvancedForm(); |
||
8593 | editor.windowManager.open({ |
||
8594 | title: 'Table Properties', |
||
8595 | size: 'normal', |
||
8596 | body: dialogBody, |
||
8597 | onSubmit: curry(onSubmitTableForm, editor, tableElm, data), |
||
8598 | buttons: [ |
||
8599 | { |
||
8600 | type: 'cancel', |
||
8601 | name: 'cancel', |
||
8602 | text: 'Cancel' |
||
8603 | }, |
||
8604 | { |
||
8605 | type: 'submit', |
||
8606 | name: 'save', |
||
8607 | text: 'Save', |
||
8608 | primary: true |
||
8609 | } |
||
8610 | ], |
||
8611 | initialData: data |
||
8612 | }); |
||
8613 | }; |
||
8614 | |||
637 | daniel-mar | 8615 | var getSelectionStartCellOrCaption = function (editor) { |
8616 | return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor)); |
||
597 | daniel-mar | 8617 | }; |
637 | daniel-mar | 8618 | var getSelectionStartCell = function (editor) { |
8619 | return getSelectionCell(getSelectionStart(editor), getIsRoot(editor)); |
||
597 | daniel-mar | 8620 | }; |
8621 | var registerCommands = function (editor, actions, cellSelection, selections, clipboard) { |
||
8622 | var isRoot = getIsRoot(editor); |
||
8623 | var eraseTable = function () { |
||
637 | daniel-mar | 8624 | return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) { |
597 | daniel-mar | 8625 | table(cellOrCaption, isRoot).filter(not(isRoot)).each(function (table) { |
8626 | var cursor = SugarElement.fromText(''); |
||
637 | daniel-mar | 8627 | after$5(table, cursor); |
8628 | remove$5(table); |
||
597 | daniel-mar | 8629 | if (editor.dom.isEmpty(editor.getBody())) { |
8630 | editor.setContent(''); |
||
8631 | editor.selection.setCursorLocation(); |
||
8632 | } else { |
||
8633 | var rng = editor.dom.createRng(); |
||
8634 | rng.setStart(cursor.dom, 0); |
||
8635 | rng.setEnd(cursor.dom, 0); |
||
8636 | editor.selection.setRng(rng); |
||
8637 | editor.nodeChanged(); |
||
8638 | } |
||
8639 | }); |
||
8640 | }); |
||
8641 | }; |
||
8642 | var setSizingMode = function (sizing) { |
||
637 | daniel-mar | 8643 | return getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) { |
597 | daniel-mar | 8644 | var isForcedSizing = isResponsiveForced(editor) || isPixelsForced(editor) || isPercentagesForced(editor); |
8645 | if (!isForcedSizing) { |
||
8646 | table(cellOrCaption, isRoot).each(function (table) { |
||
637 | daniel-mar | 8647 | if (sizing === 'relative' && !isPercentSizing(table)) { |
679 | daniel-mar | 8648 | enforcePercentage(table); |
637 | daniel-mar | 8649 | } else if (sizing === 'fixed' && !isPixelSizing(table)) { |
679 | daniel-mar | 8650 | enforcePixels(table); |
637 | daniel-mar | 8651 | } else if (sizing === 'responsive' && !isNoneSizing(table)) { |
597 | daniel-mar | 8652 | enforceNone(table); |
8653 | } |
||
8654 | removeDataStyle(table); |
||
8655 | fireTableModified(editor, table.dom, structureModified); |
||
8656 | }); |
||
8657 | } |
||
8658 | }); |
||
8659 | }; |
||
8660 | var getTableFromCell = function (cell) { |
||
8661 | return table(cell, isRoot); |
||
8662 | }; |
||
637 | daniel-mar | 8663 | var performActionOnSelection = function (action) { |
8664 | return getSelectionStartCell(editor).bind(function (cell) { |
||
8665 | return getTableFromCell(cell).map(function (table) { |
||
8666 | return action(table, cell); |
||
8667 | }); |
||
8668 | }); |
||
597 | daniel-mar | 8669 | }; |
637 | daniel-mar | 8670 | var toggleTableClass = function (_ui, clazz) { |
8671 | performActionOnSelection(function (table) { |
||
8672 | editor.formatter.toggle('tableclass', { value: clazz }, table.dom); |
||
8673 | fireTableModified(editor, table.dom, styleModified); |
||
8674 | }); |
||
8675 | }; |
||
8676 | var toggleTableCellClass = function (_ui, clazz) { |
||
8677 | performActionOnSelection(function (table) { |
||
8678 | var selectedCells = getCellsFromSelection(selections); |
||
8679 | var allHaveClass = forall(selectedCells, function (cell) { |
||
8680 | return editor.formatter.match('tablecellclass', { value: clazz }, cell.dom); |
||
597 | daniel-mar | 8681 | }); |
637 | daniel-mar | 8682 | var formatterAction = allHaveClass ? editor.formatter.remove : editor.formatter.apply; |
8683 | each$2(selectedCells, function (cell) { |
||
8684 | return formatterAction('tablecellclass', { value: clazz }, cell.dom); |
||
8685 | }); |
||
8686 | fireTableModified(editor, table.dom, styleModified); |
||
597 | daniel-mar | 8687 | }); |
8688 | }; |
||
637 | daniel-mar | 8689 | var toggleCaption = function () { |
8690 | getSelectionStartCellOrCaption(editor).each(function (cellOrCaption) { |
||
8691 | table(cellOrCaption, isRoot).each(function (table) { |
||
8692 | child$1(table, 'caption').fold(function () { |
||
8693 | var caption = SugarElement.fromTag('caption'); |
||
8694 | append$1(caption, SugarElement.fromText('Caption')); |
||
8695 | appendAt(table, caption, 0); |
||
8696 | editor.selection.setCursorLocation(caption.dom, 0); |
||
8697 | }, function (caption) { |
||
8698 | if (isTag('caption')(cellOrCaption)) { |
||
8699 | one('td', table).each(function (td) { |
||
8700 | return editor.selection.setCursorLocation(td.dom, 0); |
||
8701 | }); |
||
8702 | } |
||
8703 | remove$5(caption); |
||
8704 | }); |
||
8705 | fireTableModified(editor, table.dom, structureModified); |
||
597 | daniel-mar | 8706 | }); |
8707 | }); |
||
8708 | }; |
||
637 | daniel-mar | 8709 | var postExecute = function (_data) { |
8710 | editor.focus(); |
||
8711 | }; |
||
8712 | var actOnSelection = function (execute, noEvents) { |
||
8713 | if (noEvents === void 0) { |
||
8714 | noEvents = false; |
||
8715 | } |
||
8716 | return performActionOnSelection(function (table, startCell) { |
||
8717 | var targets = forMenu(selections, table, startCell); |
||
8718 | execute(table, targets, noEvents).each(postExecute); |
||
8719 | }); |
||
8720 | }; |
||
8721 | var copyRowSelection = function () { |
||
8722 | return performActionOnSelection(function (table, startCell) { |
||
8723 | var targets = forMenu(selections, table, startCell); |
||
8724 | var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), Optional.none()); |
||
8725 | return copyRows(table, targets, generators); |
||
8726 | }); |
||
8727 | }; |
||
597 | daniel-mar | 8728 | var copyColSelection = function () { |
637 | daniel-mar | 8729 | return performActionOnSelection(function (table, startCell) { |
8730 | var targets = forMenu(selections, table, startCell); |
||
8731 | return copyCols(table, targets); |
||
597 | daniel-mar | 8732 | }); |
8733 | }; |
||
8734 | var pasteOnSelection = function (execute, getRows) { |
||
8735 | return getRows().each(function (rows) { |
||
637 | daniel-mar | 8736 | var clonedRows = map$1(rows, function (row) { |
597 | daniel-mar | 8737 | return deep(row); |
8738 | }); |
||
637 | daniel-mar | 8739 | performActionOnSelection(function (table, startCell) { |
8740 | var generators = paste$1(SugarElement.fromDom(editor.getDoc())); |
||
8741 | var targets = pasteRows(selections, startCell, clonedRows, generators); |
||
8742 | execute(table, targets).each(postExecute); |
||
597 | daniel-mar | 8743 | }); |
8744 | }); |
||
8745 | }; |
||
637 | daniel-mar | 8746 | var actOnType = function (getAction) { |
8747 | return function (_ui, args) { |
||
8748 | return get$c(args, 'type').each(function (type) { |
||
8749 | actOnSelection(getAction(type), args.no_events); |
||
8750 | }); |
||
8751 | }; |
||
8752 | }; |
||
597 | daniel-mar | 8753 | each$1({ |
8754 | mceTableSplitCells: function () { |
||
8755 | return actOnSelection(actions.unmergeCells); |
||
8756 | }, |
||
8757 | mceTableMergeCells: function () { |
||
8758 | return actOnSelection(actions.mergeCells); |
||
8759 | }, |
||
8760 | mceTableInsertRowBefore: function () { |
||
8761 | return actOnSelection(actions.insertRowsBefore); |
||
8762 | }, |
||
8763 | mceTableInsertRowAfter: function () { |
||
8764 | return actOnSelection(actions.insertRowsAfter); |
||
8765 | }, |
||
8766 | mceTableInsertColBefore: function () { |
||
8767 | return actOnSelection(actions.insertColumnsBefore); |
||
8768 | }, |
||
8769 | mceTableInsertColAfter: function () { |
||
8770 | return actOnSelection(actions.insertColumnsAfter); |
||
8771 | }, |
||
8772 | mceTableDeleteCol: function () { |
||
8773 | return actOnSelection(actions.deleteColumn); |
||
8774 | }, |
||
8775 | mceTableDeleteRow: function () { |
||
8776 | return actOnSelection(actions.deleteRow); |
||
8777 | }, |
||
637 | daniel-mar | 8778 | mceTableCutCol: function () { |
597 | daniel-mar | 8779 | return copyColSelection().each(function (selection) { |
8780 | clipboard.setColumns(selection); |
||
8781 | actOnSelection(actions.deleteColumn); |
||
8782 | }); |
||
8783 | }, |
||
637 | daniel-mar | 8784 | mceTableCutRow: function () { |
597 | daniel-mar | 8785 | return copyRowSelection().each(function (selection) { |
8786 | clipboard.setRows(selection); |
||
8787 | actOnSelection(actions.deleteRow); |
||
8788 | }); |
||
8789 | }, |
||
637 | daniel-mar | 8790 | mceTableCopyCol: function () { |
597 | daniel-mar | 8791 | return copyColSelection().each(function (selection) { |
8792 | return clipboard.setColumns(selection); |
||
8793 | }); |
||
8794 | }, |
||
637 | daniel-mar | 8795 | mceTableCopyRow: function () { |
597 | daniel-mar | 8796 | return copyRowSelection().each(function (selection) { |
8797 | return clipboard.setRows(selection); |
||
8798 | }); |
||
8799 | }, |
||
637 | daniel-mar | 8800 | mceTablePasteColBefore: function () { |
597 | daniel-mar | 8801 | return pasteOnSelection(actions.pasteColsBefore, clipboard.getColumns); |
8802 | }, |
||
637 | daniel-mar | 8803 | mceTablePasteColAfter: function () { |
597 | daniel-mar | 8804 | return pasteOnSelection(actions.pasteColsAfter, clipboard.getColumns); |
8805 | }, |
||
637 | daniel-mar | 8806 | mceTablePasteRowBefore: function () { |
597 | daniel-mar | 8807 | return pasteOnSelection(actions.pasteRowsBefore, clipboard.getRows); |
8808 | }, |
||
637 | daniel-mar | 8809 | mceTablePasteRowAfter: function () { |
597 | daniel-mar | 8810 | return pasteOnSelection(actions.pasteRowsAfter, clipboard.getRows); |
8811 | }, |
||
8812 | mceTableDelete: eraseTable, |
||
637 | daniel-mar | 8813 | mceTableCellToggleClass: toggleTableCellClass, |
8814 | mceTableToggleClass: toggleTableClass, |
||
8815 | mceTableToggleCaption: toggleCaption, |
||
8816 | mceTableSizingMode: function (_ui, sizing) { |
||
597 | daniel-mar | 8817 | return setSizingMode(sizing); |
8818 | }, |
||
637 | daniel-mar | 8819 | mceTableCellType: actOnType(function (type) { |
8820 | return type === 'th' ? actions.makeCellsHeader : actions.unmakeCellsHeader; |
||
8821 | }), |
||
8822 | mceTableColType: actOnType(function (type) { |
||
8823 | return type === 'th' ? actions.makeColumnsHeader : actions.unmakeColumnsHeader; |
||
8824 | }), |
||
8825 | mceTableRowType: actOnType(function (type) { |
||
8826 | switch (type) { |
||
8827 | case 'header': |
||
8828 | return actions.makeRowsHeader; |
||
8829 | case 'footer': |
||
8830 | return actions.makeRowsFooter; |
||
8831 | default: |
||
8832 | return actions.makeRowsBody; |
||
8833 | } |
||
8834 | }) |
||
597 | daniel-mar | 8835 | }, function (func, name) { |
8836 | return editor.addCommand(name, func); |
||
8837 | }); |
||
8838 | each$1({ |
||
637 | daniel-mar | 8839 | mceTableProps: curry(open, editor, false), |
597 | daniel-mar | 8840 | mceTableRowProps: curry(open$1, editor), |
637 | daniel-mar | 8841 | mceTableCellProps: curry(open$2, editor, selections) |
597 | daniel-mar | 8842 | }, function (func, name) { |
8843 | return editor.addCommand(name, function () { |
||
8844 | return func(); |
||
8845 | }); |
||
8846 | }); |
||
8847 | editor.addCommand('mceInsertTable', function (_ui, args) { |
||
8848 | if (isObject(args) && keys(args).length > 0) { |
||
8849 | insertTableWithDataValidation(editor, args.rows, args.columns, args.options, 'Invalid values for mceInsertTable - rows and columns values are required to insert a table.'); |
||
8850 | } else { |
||
637 | daniel-mar | 8851 | open(editor, true); |
597 | daniel-mar | 8852 | } |
8853 | }); |
||
8854 | editor.addCommand('mceTableApplyCellStyle', function (_ui, args) { |
||
8855 | var getFormatName = function (style) { |
||
8856 | return 'tablecell' + style.toLowerCase().replace('-', ''); |
||
8857 | }; |
||
8858 | if (!isObject(args)) { |
||
8859 | return; |
||
8860 | } |
||
637 | daniel-mar | 8861 | var cells = getCellsFromSelection(selections); |
597 | daniel-mar | 8862 | if (cells.length === 0) { |
8863 | return; |
||
8864 | } |
||
8865 | var validArgs = filter$1(args, function (value, style) { |
||
8866 | return editor.formatter.has(getFormatName(style)) && isString(value); |
||
8867 | }); |
||
8868 | if (isEmpty(validArgs)) { |
||
8869 | return; |
||
8870 | } |
||
8871 | each$1(validArgs, function (value, style) { |
||
637 | daniel-mar | 8872 | each$2(cells, function (cell) { |
597 | daniel-mar | 8873 | DomModifier.normal(editor, cell.dom).setFormat(getFormatName(style), value); |
8874 | }); |
||
8875 | }); |
||
8876 | getTableFromCell(cells[0]).each(function (table) { |
||
8877 | return fireTableModified(editor, table.dom, styleModified); |
||
8878 | }); |
||
8879 | }); |
||
8880 | }; |
||
8881 | |||
8882 | var registerQueryCommands = function (editor, actions, selections) { |
||
8883 | var isRoot = getIsRoot(editor); |
||
637 | daniel-mar | 8884 | var lookupOnSelection = function (action) { |
8885 | return getSelectionCell(getSelectionStart(editor)).bind(function (cell) { |
||
8886 | return table(cell, isRoot).map(function (table) { |
||
8887 | var targets = forMenu(selections, table, cell); |
||
8888 | return action(table, targets); |
||
8889 | }); |
||
8890 | }).getOr(''); |
||
597 | daniel-mar | 8891 | }; |
8892 | each$1({ |
||
8893 | mceTableRowType: function () { |
||
637 | daniel-mar | 8894 | return lookupOnSelection(actions.getTableRowType); |
597 | daniel-mar | 8895 | }, |
8896 | mceTableCellType: function () { |
||
637 | daniel-mar | 8897 | return lookupOnSelection(actions.getTableCellType); |
597 | daniel-mar | 8898 | }, |
8899 | mceTableColType: function () { |
||
637 | daniel-mar | 8900 | return lookupOnSelection(actions.getTableColType); |
597 | daniel-mar | 8901 | } |
8902 | }, function (func, name) { |
||
8903 | return editor.addQueryValueHandler(name, func); |
||
8904 | }); |
||
8905 | }; |
||
8906 | |||
8907 | var Clipboard = function () { |
||
637 | daniel-mar | 8908 | var rows = value(); |
8909 | var cols = value(); |
||
597 | daniel-mar | 8910 | return { |
8911 | getRows: rows.get, |
||
8912 | setRows: function (r) { |
||
637 | daniel-mar | 8913 | r.fold(rows.clear, rows.set); |
8914 | cols.clear(); |
||
597 | daniel-mar | 8915 | }, |
637 | daniel-mar | 8916 | clearRows: rows.clear, |
597 | daniel-mar | 8917 | getColumns: cols.get, |
8918 | setColumns: function (c) { |
||
637 | daniel-mar | 8919 | c.fold(cols.clear, cols.set); |
8920 | rows.clear(); |
||
597 | daniel-mar | 8921 | }, |
637 | daniel-mar | 8922 | clearColumns: cols.clear |
597 | daniel-mar | 8923 | }; |
8924 | }; |
||
8925 | |||
637 | daniel-mar | 8926 | var genericBase = { |
8927 | remove_similar: true, |
||
8928 | inherit: false |
||
8929 | }; |
||
8930 | var cellBase = __assign({ selector: 'td,th' }, genericBase); |
||
597 | daniel-mar | 8931 | var cellFormats = { |
637 | daniel-mar | 8932 | tablecellbackgroundcolor: __assign({ styles: { backgroundColor: '%value' } }, cellBase), |
8933 | tablecellverticalalign: __assign({ styles: { 'vertical-align': '%value' } }, cellBase), |
||
8934 | tablecellbordercolor: __assign({ styles: { borderColor: '%value' } }, cellBase), |
||
8935 | tablecellclass: __assign({ classes: ['%value'] }, cellBase), |
||
8936 | tableclass: __assign({ |
||
8937 | selector: 'table', |
||
8938 | classes: ['%value'] |
||
8939 | }, genericBase), |
||
8940 | tablecellborderstyle: __assign({ styles: { borderStyle: '%value' } }, cellBase), |
||
8941 | tablecellborderwidth: __assign({ styles: { borderWidth: '%value' } }, cellBase) |
||
597 | daniel-mar | 8942 | }; |
8943 | var registerFormats = function (editor) { |
||
8944 | editor.formatter.register(cellFormats); |
||
8945 | }; |
||
8946 | |||
637 | daniel-mar | 8947 | var adt$5 = Adt.generate([ |
597 | daniel-mar | 8948 | { none: ['current'] }, |
8949 | { first: ['current'] }, |
||
8950 | { |
||
8951 | middle: [ |
||
8952 | 'current', |
||
8953 | 'target' |
||
8954 | ] |
||
8955 | }, |
||
8956 | { last: ['current'] } |
||
8957 | ]); |
||
637 | daniel-mar | 8958 | var none = function (current) { |
597 | daniel-mar | 8959 | if (current === void 0) { |
8960 | current = undefined; |
||
8961 | } |
||
637 | daniel-mar | 8962 | return adt$5.none(current); |
597 | daniel-mar | 8963 | }; |
637 | daniel-mar | 8964 | var CellLocation = __assign(__assign({}, adt$5), { none: none }); |
597 | daniel-mar | 8965 | |
637 | daniel-mar | 8966 | var walk = function (all, current, index, direction, isEligible) { |
8967 | if (isEligible === void 0) { |
||
8968 | isEligible = always; |
||
8969 | } |
||
8970 | var forwards = direction === 1; |
||
8971 | if (!forwards && index <= 0) { |
||
8972 | return CellLocation.first(all[0]); |
||
8973 | } else if (forwards && index >= all.length - 1) { |
||
8974 | return CellLocation.last(all[all.length - 1]); |
||
8975 | } else { |
||
8976 | var newIndex = index + direction; |
||
8977 | var elem = all[newIndex]; |
||
8978 | return isEligible(elem) ? CellLocation.middle(current, elem) : walk(all, current, newIndex, direction, isEligible); |
||
8979 | } |
||
8980 | }; |
||
8981 | var detect$1 = function (current, isRoot) { |
||
597 | daniel-mar | 8982 | return table(current, isRoot).bind(function (table) { |
637 | daniel-mar | 8983 | var all = cells$1(table); |
597 | daniel-mar | 8984 | var index = findIndex(all, function (x) { |
8985 | return eq$1(current, x); |
||
8986 | }); |
||
8987 | return index.map(function (index) { |
||
8988 | return { |
||
8989 | index: index, |
||
8990 | all: all |
||
8991 | }; |
||
8992 | }); |
||
8993 | }); |
||
8994 | }; |
||
637 | daniel-mar | 8995 | var next = function (current, isEligible, isRoot) { |
8996 | var detection = detect$1(current, isRoot); |
||
597 | daniel-mar | 8997 | return detection.fold(function () { |
8998 | return CellLocation.none(current); |
||
8999 | }, function (info) { |
||
637 | daniel-mar | 9000 | return walk(info.all, current, info.index, 1, isEligible); |
597 | daniel-mar | 9001 | }); |
9002 | }; |
||
637 | daniel-mar | 9003 | var prev = function (current, isEligible, isRoot) { |
9004 | var detection = detect$1(current, isRoot); |
||
597 | daniel-mar | 9005 | return detection.fold(function () { |
9006 | return CellLocation.none(); |
||
9007 | }, function (info) { |
||
637 | daniel-mar | 9008 | return walk(info.all, current, info.index, -1, isEligible); |
597 | daniel-mar | 9009 | }); |
9010 | }; |
||
9011 | |||
9012 | var create$2 = function (start, soffset, finish, foffset) { |
||
9013 | return { |
||
9014 | start: start, |
||
9015 | soffset: soffset, |
||
9016 | finish: finish, |
||
9017 | foffset: foffset |
||
9018 | }; |
||
9019 | }; |
||
9020 | var SimRange = { create: create$2 }; |
||
9021 | |||
637 | daniel-mar | 9022 | var adt$4 = Adt.generate([ |
597 | daniel-mar | 9023 | { before: ['element'] }, |
9024 | { |
||
9025 | on: [ |
||
9026 | 'element', |
||
9027 | 'offset' |
||
9028 | ] |
||
9029 | }, |
||
9030 | { after: ['element'] } |
||
9031 | ]); |
||
9032 | var cata$1 = function (subject, onBefore, onOn, onAfter) { |
||
9033 | return subject.fold(onBefore, onOn, onAfter); |
||
9034 | }; |
||
637 | daniel-mar | 9035 | var getStart$1 = function (situ) { |
597 | daniel-mar | 9036 | return situ.fold(identity, identity, identity); |
9037 | }; |
||
637 | daniel-mar | 9038 | var before$2 = adt$4.before; |
9039 | var on = adt$4.on; |
||
9040 | var after$3 = adt$4.after; |
||
597 | daniel-mar | 9041 | var Situ = { |
9042 | before: before$2, |
||
9043 | on: on, |
||
637 | daniel-mar | 9044 | after: after$3, |
597 | daniel-mar | 9045 | cata: cata$1, |
637 | daniel-mar | 9046 | getStart: getStart$1 |
597 | daniel-mar | 9047 | }; |
9048 | |||
637 | daniel-mar | 9049 | var adt$3 = Adt.generate([ |
597 | daniel-mar | 9050 | { domRange: ['rng'] }, |
9051 | { |
||
9052 | relative: [ |
||
9053 | 'startSitu', |
||
9054 | 'finishSitu' |
||
9055 | ] |
||
9056 | }, |
||
9057 | { |
||
9058 | exact: [ |
||
9059 | 'start', |
||
9060 | 'soffset', |
||
9061 | 'finish', |
||
9062 | 'foffset' |
||
9063 | ] |
||
9064 | } |
||
9065 | ]); |
||
9066 | var exactFromRange = function (simRange) { |
||
637 | daniel-mar | 9067 | return adt$3.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); |
597 | daniel-mar | 9068 | }; |
637 | daniel-mar | 9069 | var getStart = function (selection) { |
597 | daniel-mar | 9070 | return selection.match({ |
9071 | domRange: function (rng) { |
||
9072 | return SugarElement.fromDom(rng.startContainer); |
||
9073 | }, |
||
9074 | relative: function (startSitu, _finishSitu) { |
||
9075 | return Situ.getStart(startSitu); |
||
9076 | }, |
||
9077 | exact: function (start, _soffset, _finish, _foffset) { |
||
9078 | return start; |
||
9079 | } |
||
9080 | }); |
||
9081 | }; |
||
637 | daniel-mar | 9082 | var domRange = adt$3.domRange; |
9083 | var relative = adt$3.relative; |
||
9084 | var exact = adt$3.exact; |
||
597 | daniel-mar | 9085 | var getWin = function (selection) { |
637 | daniel-mar | 9086 | var start = getStart(selection); |
597 | daniel-mar | 9087 | return defaultView(start); |
9088 | }; |
||
637 | daniel-mar | 9089 | var range = SimRange.create; |
597 | daniel-mar | 9090 | var SimSelection = { |
9091 | domRange: domRange, |
||
9092 | relative: relative, |
||
9093 | exact: exact, |
||
9094 | exactFromRange: exactFromRange, |
||
9095 | getWin: getWin, |
||
637 | daniel-mar | 9096 | range: range |
597 | daniel-mar | 9097 | }; |
9098 | |||
637 | daniel-mar | 9099 | var selectNode = function (win, element) { |
9100 | var rng = win.document.createRange(); |
||
9101 | rng.selectNode(element.dom); |
||
9102 | return rng; |
||
9103 | }; |
||
597 | daniel-mar | 9104 | var selectNodeContents = function (win, element) { |
9105 | var rng = win.document.createRange(); |
||
9106 | selectNodeContentsUsing(rng, element); |
||
9107 | return rng; |
||
9108 | }; |
||
9109 | var selectNodeContentsUsing = function (rng, element) { |
||
9110 | return rng.selectNodeContents(element.dom); |
||
9111 | }; |
||
9112 | var setStart = function (rng, situ) { |
||
9113 | situ.fold(function (e) { |
||
9114 | rng.setStartBefore(e.dom); |
||
9115 | }, function (e, o) { |
||
9116 | rng.setStart(e.dom, o); |
||
9117 | }, function (e) { |
||
9118 | rng.setStartAfter(e.dom); |
||
9119 | }); |
||
9120 | }; |
||
9121 | var setFinish = function (rng, situ) { |
||
9122 | situ.fold(function (e) { |
||
9123 | rng.setEndBefore(e.dom); |
||
9124 | }, function (e, o) { |
||
9125 | rng.setEnd(e.dom, o); |
||
9126 | }, function (e) { |
||
9127 | rng.setEndAfter(e.dom); |
||
9128 | }); |
||
9129 | }; |
||
9130 | var relativeToNative = function (win, startSitu, finishSitu) { |
||
9131 | var range = win.document.createRange(); |
||
9132 | setStart(range, startSitu); |
||
9133 | setFinish(range, finishSitu); |
||
9134 | return range; |
||
9135 | }; |
||
9136 | var exactToNative = function (win, start, soffset, finish, foffset) { |
||
9137 | var rng = win.document.createRange(); |
||
9138 | rng.setStart(start.dom, soffset); |
||
9139 | rng.setEnd(finish.dom, foffset); |
||
9140 | return rng; |
||
9141 | }; |
||
9142 | var toRect = function (rect) { |
||
9143 | return { |
||
9144 | left: rect.left, |
||
9145 | top: rect.top, |
||
9146 | right: rect.right, |
||
9147 | bottom: rect.bottom, |
||
9148 | width: rect.width, |
||
9149 | height: rect.height |
||
9150 | }; |
||
9151 | }; |
||
637 | daniel-mar | 9152 | var getFirstRect$1 = function (rng) { |
597 | daniel-mar | 9153 | var rects = rng.getClientRects(); |
9154 | var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); |
||
9155 | return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none(); |
||
9156 | }; |
||
9157 | |||
637 | daniel-mar | 9158 | var adt$2 = Adt.generate([ |
597 | daniel-mar | 9159 | { |
9160 | ltr: [ |
||
9161 | 'start', |
||
9162 | 'soffset', |
||
9163 | 'finish', |
||
9164 | 'foffset' |
||
9165 | ] |
||
9166 | }, |
||
9167 | { |
||
9168 | rtl: [ |
||
9169 | 'start', |
||
9170 | 'soffset', |
||
9171 | 'finish', |
||
9172 | 'foffset' |
||
9173 | ] |
||
9174 | } |
||
9175 | ]); |
||
9176 | var fromRange = function (win, type, range) { |
||
9177 | return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset); |
||
9178 | }; |
||
9179 | var getRanges = function (win, selection) { |
||
9180 | return selection.match({ |
||
9181 | domRange: function (rng) { |
||
9182 | return { |
||
9183 | ltr: constant(rng), |
||
9184 | rtl: Optional.none |
||
9185 | }; |
||
9186 | }, |
||
9187 | relative: function (startSitu, finishSitu) { |
||
9188 | return { |
||
9189 | ltr: cached(function () { |
||
9190 | return relativeToNative(win, startSitu, finishSitu); |
||
9191 | }), |
||
9192 | rtl: cached(function () { |
||
9193 | return Optional.some(relativeToNative(win, finishSitu, startSitu)); |
||
9194 | }) |
||
9195 | }; |
||
9196 | }, |
||
9197 | exact: function (start, soffset, finish, foffset) { |
||
9198 | return { |
||
9199 | ltr: cached(function () { |
||
9200 | return exactToNative(win, start, soffset, finish, foffset); |
||
9201 | }), |
||
9202 | rtl: cached(function () { |
||
9203 | return Optional.some(exactToNative(win, finish, foffset, start, soffset)); |
||
9204 | }) |
||
9205 | }; |
||
9206 | } |
||
9207 | }); |
||
9208 | }; |
||
9209 | var doDiagnose = function (win, ranges) { |
||
9210 | var rng = ranges.ltr(); |
||
9211 | if (rng.collapsed) { |
||
9212 | var reversed = ranges.rtl().filter(function (rev) { |
||
9213 | return rev.collapsed === false; |
||
9214 | }); |
||
9215 | return reversed.map(function (rev) { |
||
637 | daniel-mar | 9216 | return adt$2.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset); |
597 | daniel-mar | 9217 | }).getOrThunk(function () { |
637 | daniel-mar | 9218 | return fromRange(win, adt$2.ltr, rng); |
597 | daniel-mar | 9219 | }); |
9220 | } else { |
||
637 | daniel-mar | 9221 | return fromRange(win, adt$2.ltr, rng); |
597 | daniel-mar | 9222 | } |
9223 | }; |
||
9224 | var diagnose = function (win, selection) { |
||
9225 | var ranges = getRanges(win, selection); |
||
9226 | return doDiagnose(win, ranges); |
||
9227 | }; |
||
9228 | var asLtrRange = function (win, selection) { |
||
9229 | var diagnosis = diagnose(win, selection); |
||
9230 | return diagnosis.match({ |
||
9231 | ltr: function (start, soffset, finish, foffset) { |
||
9232 | var rng = win.document.createRange(); |
||
9233 | rng.setStart(start.dom, soffset); |
||
9234 | rng.setEnd(finish.dom, foffset); |
||
9235 | return rng; |
||
9236 | }, |
||
9237 | rtl: function (start, soffset, finish, foffset) { |
||
9238 | var rng = win.document.createRange(); |
||
9239 | rng.setStart(finish.dom, foffset); |
||
9240 | rng.setEnd(start.dom, soffset); |
||
9241 | return rng; |
||
9242 | } |
||
9243 | }); |
||
9244 | }; |
||
637 | daniel-mar | 9245 | adt$2.ltr; |
9246 | adt$2.rtl; |
||
597 | daniel-mar | 9247 | |
9248 | var searchForPoint = function (rectForOffset, x, y, maxX, length) { |
||
9249 | if (length === 0) { |
||
9250 | return 0; |
||
9251 | } else if (x === maxX) { |
||
9252 | return length - 1; |
||
9253 | } |
||
9254 | var xDelta = maxX; |
||
9255 | for (var i = 1; i < length; i++) { |
||
9256 | var rect = rectForOffset(i); |
||
9257 | var curDeltaX = Math.abs(x - rect.left); |
||
9258 | if (y <= rect.bottom) { |
||
9259 | if (y < rect.top || curDeltaX > xDelta) { |
||
9260 | return i - 1; |
||
9261 | } else { |
||
9262 | xDelta = curDeltaX; |
||
9263 | } |
||
9264 | } |
||
9265 | } |
||
9266 | return 0; |
||
9267 | }; |
||
9268 | var inRect = function (rect, x, y) { |
||
9269 | return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; |
||
9270 | }; |
||
9271 | |||
9272 | var locateOffset = function (doc, textnode, x, y, rect) { |
||
9273 | var rangeForOffset = function (o) { |
||
9274 | var r = doc.dom.createRange(); |
||
9275 | r.setStart(textnode.dom, o); |
||
9276 | r.collapse(true); |
||
9277 | return r; |
||
9278 | }; |
||
9279 | var rectForOffset = function (o) { |
||
9280 | var r = rangeForOffset(o); |
||
9281 | return r.getBoundingClientRect(); |
||
9282 | }; |
||
637 | daniel-mar | 9283 | var length = get$9(textnode).length; |
597 | daniel-mar | 9284 | var offset = searchForPoint(rectForOffset, x, y, rect.right, length); |
9285 | return rangeForOffset(offset); |
||
9286 | }; |
||
637 | daniel-mar | 9287 | var locate$1 = function (doc, node, x, y) { |
597 | daniel-mar | 9288 | var r = doc.dom.createRange(); |
9289 | r.selectNode(node.dom); |
||
9290 | var rects = r.getClientRects(); |
||
9291 | var foundRect = findMap(rects, function (rect) { |
||
9292 | return inRect(rect, x, y) ? Optional.some(rect) : Optional.none(); |
||
9293 | }); |
||
9294 | return foundRect.map(function (rect) { |
||
9295 | return locateOffset(doc, node, x, y, rect); |
||
9296 | }); |
||
9297 | }; |
||
9298 | |||
9299 | var searchInChildren = function (doc, node, x, y) { |
||
9300 | var r = doc.dom.createRange(); |
||
637 | daniel-mar | 9301 | var nodes = children$3(node); |
597 | daniel-mar | 9302 | return findMap(nodes, function (n) { |
9303 | r.selectNode(n.dom); |
||
9304 | return inRect(r.getBoundingClientRect(), x, y) ? locateNode(doc, n, x, y) : Optional.none(); |
||
9305 | }); |
||
9306 | }; |
||
9307 | var locateNode = function (doc, node, x, y) { |
||
637 | daniel-mar | 9308 | return isText(node) ? locate$1(doc, node, x, y) : searchInChildren(doc, node, x, y); |
597 | daniel-mar | 9309 | }; |
637 | daniel-mar | 9310 | var locate = function (doc, node, x, y) { |
597 | daniel-mar | 9311 | var r = doc.dom.createRange(); |
9312 | r.selectNode(node.dom); |
||
9313 | var rect = r.getBoundingClientRect(); |
||
9314 | var boundedX = Math.max(rect.left, Math.min(rect.right, x)); |
||
9315 | var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); |
||
9316 | return locateNode(doc, node, boundedX, boundedY); |
||
9317 | }; |
||
9318 | |||
9319 | var COLLAPSE_TO_LEFT = true; |
||
9320 | var COLLAPSE_TO_RIGHT = false; |
||
9321 | var getCollapseDirection = function (rect, x) { |
||
9322 | return x - rect.left < rect.right - x ? COLLAPSE_TO_LEFT : COLLAPSE_TO_RIGHT; |
||
9323 | }; |
||
9324 | var createCollapsedNode = function (doc, target, collapseDirection) { |
||
9325 | var r = doc.dom.createRange(); |
||
9326 | r.selectNode(target.dom); |
||
9327 | r.collapse(collapseDirection); |
||
9328 | return r; |
||
9329 | }; |
||
9330 | var locateInElement = function (doc, node, x) { |
||
9331 | var cursorRange = doc.dom.createRange(); |
||
9332 | cursorRange.selectNode(node.dom); |
||
9333 | var rect = cursorRange.getBoundingClientRect(); |
||
9334 | var collapseDirection = getCollapseDirection(rect, x); |
||
9335 | var f = collapseDirection === COLLAPSE_TO_LEFT ? first : last$1; |
||
9336 | return f(node).map(function (target) { |
||
9337 | return createCollapsedNode(doc, target, collapseDirection); |
||
9338 | }); |
||
9339 | }; |
||
9340 | var locateInEmpty = function (doc, node, x) { |
||
9341 | var rect = node.dom.getBoundingClientRect(); |
||
9342 | var collapseDirection = getCollapseDirection(rect, x); |
||
9343 | return Optional.some(createCollapsedNode(doc, node, collapseDirection)); |
||
9344 | }; |
||
9345 | var search = function (doc, node, x) { |
||
637 | daniel-mar | 9346 | var f = children$3(node).length === 0 ? locateInEmpty : locateInElement; |
597 | daniel-mar | 9347 | return f(doc, node, x); |
9348 | }; |
||
9349 | |||
9350 | var caretPositionFromPoint = function (doc, x, y) { |
||
637 | daniel-mar | 9351 | var _a, _b; |
9352 | return Optional.from((_b = (_a = doc.dom).caretPositionFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)).bind(function (pos) { |
||
597 | daniel-mar | 9353 | if (pos.offsetNode === null) { |
9354 | return Optional.none(); |
||
9355 | } |
||
9356 | var r = doc.dom.createRange(); |
||
9357 | r.setStart(pos.offsetNode, pos.offset); |
||
9358 | r.collapse(); |
||
9359 | return Optional.some(r); |
||
9360 | }); |
||
9361 | }; |
||
9362 | var caretRangeFromPoint = function (doc, x, y) { |
||
637 | daniel-mar | 9363 | var _a, _b; |
9364 | return Optional.from((_b = (_a = doc.dom).caretRangeFromPoint) === null || _b === void 0 ? void 0 : _b.call(_a, x, y)); |
||
597 | daniel-mar | 9365 | }; |
9366 | var searchTextNodes = function (doc, node, x, y) { |
||
9367 | var r = doc.dom.createRange(); |
||
9368 | r.selectNode(node.dom); |
||
9369 | var rect = r.getBoundingClientRect(); |
||
9370 | var boundedX = Math.max(rect.left, Math.min(rect.right, x)); |
||
9371 | var boundedY = Math.max(rect.top, Math.min(rect.bottom, y)); |
||
637 | daniel-mar | 9372 | return locate(doc, node, boundedX, boundedY); |
597 | daniel-mar | 9373 | }; |
9374 | var searchFromPoint = function (doc, x, y) { |
||
9375 | return SugarElement.fromPoint(doc, x, y).bind(function (elem) { |
||
9376 | var fallback = function () { |
||
9377 | return search(doc, elem, x); |
||
9378 | }; |
||
637 | daniel-mar | 9379 | return children$3(elem).length === 0 ? fallback() : searchTextNodes(doc, elem, x, y).orThunk(fallback); |
597 | daniel-mar | 9380 | }); |
9381 | }; |
||
9382 | var availableSearch = function () { |
||
9383 | if (document.caretPositionFromPoint) { |
||
9384 | return caretPositionFromPoint; |
||
9385 | } else if (document.caretRangeFromPoint) { |
||
9386 | return caretRangeFromPoint; |
||
9387 | } else { |
||
9388 | return searchFromPoint; |
||
9389 | } |
||
9390 | }(); |
||
637 | daniel-mar | 9391 | var fromPoint = function (win, x, y) { |
597 | daniel-mar | 9392 | var doc = SugarElement.fromDom(win.document); |
9393 | return availableSearch(doc, x, y).map(function (rng) { |
||
9394 | return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset); |
||
9395 | }); |
||
9396 | }; |
||
9397 | |||
9398 | var beforeSpecial = function (element, offset) { |
||
9399 | var name$1 = name(element); |
||
9400 | if ('input' === name$1) { |
||
9401 | return Situ.after(element); |
||
637 | daniel-mar | 9402 | } else if (!contains$2([ |
597 | daniel-mar | 9403 | 'br', |
9404 | 'img' |
||
9405 | ], name$1)) { |
||
9406 | return Situ.on(element, offset); |
||
9407 | } else { |
||
9408 | return offset === 0 ? Situ.before(element) : Situ.after(element); |
||
9409 | } |
||
9410 | }; |
||
9411 | var preprocessRelative = function (startSitu, finishSitu) { |
||
9412 | var start = startSitu.fold(Situ.before, beforeSpecial, Situ.after); |
||
9413 | var finish = finishSitu.fold(Situ.before, beforeSpecial, Situ.after); |
||
9414 | return SimSelection.relative(start, finish); |
||
9415 | }; |
||
9416 | var preprocessExact = function (start, soffset, finish, foffset) { |
||
9417 | var startSitu = beforeSpecial(start, soffset); |
||
9418 | var finishSitu = beforeSpecial(finish, foffset); |
||
9419 | return SimSelection.relative(startSitu, finishSitu); |
||
9420 | }; |
||
9421 | var preprocess = function (selection) { |
||
9422 | return selection.match({ |
||
9423 | domRange: function (rng) { |
||
9424 | var start = SugarElement.fromDom(rng.startContainer); |
||
9425 | var finish = SugarElement.fromDom(rng.endContainer); |
||
9426 | return preprocessExact(start, rng.startOffset, finish, rng.endOffset); |
||
9427 | }, |
||
9428 | relative: preprocessRelative, |
||
9429 | exact: preprocessExact |
||
9430 | }); |
||
9431 | }; |
||
9432 | |||
9433 | var makeRange = function (start, soffset, finish, foffset) { |
||
9434 | var doc = owner(start); |
||
9435 | var rng = doc.dom.createRange(); |
||
9436 | rng.setStart(start.dom, soffset); |
||
9437 | rng.setEnd(finish.dom, foffset); |
||
9438 | return rng; |
||
9439 | }; |
||
637 | daniel-mar | 9440 | var after$2 = function (start, soffset, finish, foffset) { |
597 | daniel-mar | 9441 | var r = makeRange(start, soffset, finish, foffset); |
9442 | var same = eq$1(start, finish) && soffset === foffset; |
||
9443 | return r.collapsed && !same; |
||
9444 | }; |
||
9445 | |||
9446 | var getNativeSelection = function (win) { |
||
9447 | return Optional.from(win.getSelection()); |
||
9448 | }; |
||
9449 | var doSetNativeRange = function (win, rng) { |
||
9450 | getNativeSelection(win).each(function (selection) { |
||
9451 | selection.removeAllRanges(); |
||
9452 | selection.addRange(rng); |
||
9453 | }); |
||
9454 | }; |
||
9455 | var doSetRange = function (win, start, soffset, finish, foffset) { |
||
9456 | var rng = exactToNative(win, start, soffset, finish, foffset); |
||
9457 | doSetNativeRange(win, rng); |
||
9458 | }; |
||
9459 | var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) { |
||
9460 | selection.collapse(start.dom, soffset); |
||
9461 | selection.extend(finish.dom, foffset); |
||
9462 | }; |
||
9463 | var setRangeFromRelative = function (win, relative) { |
||
9464 | return diagnose(win, relative).match({ |
||
9465 | ltr: function (start, soffset, finish, foffset) { |
||
9466 | doSetRange(win, start, soffset, finish, foffset); |
||
9467 | }, |
||
9468 | rtl: function (start, soffset, finish, foffset) { |
||
9469 | getNativeSelection(win).each(function (selection) { |
||
9470 | if (selection.setBaseAndExtent) { |
||
9471 | selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset); |
||
9472 | } else if (selection.extend) { |
||
9473 | try { |
||
9474 | setLegacyRtlRange(win, selection, start, soffset, finish, foffset); |
||
9475 | } catch (e) { |
||
9476 | doSetRange(win, finish, foffset, start, soffset); |
||
9477 | } |
||
9478 | } else { |
||
9479 | doSetRange(win, finish, foffset, start, soffset); |
||
9480 | } |
||
9481 | }); |
||
9482 | } |
||
9483 | }); |
||
9484 | }; |
||
9485 | var setExact = function (win, start, soffset, finish, foffset) { |
||
9486 | var relative = preprocessExact(start, soffset, finish, foffset); |
||
9487 | setRangeFromRelative(win, relative); |
||
9488 | }; |
||
9489 | var setRelative = function (win, startSitu, finishSitu) { |
||
9490 | var relative = preprocessRelative(startSitu, finishSitu); |
||
9491 | setRangeFromRelative(win, relative); |
||
9492 | }; |
||
9493 | var toNative = function (selection) { |
||
9494 | var win = SimSelection.getWin(selection).dom; |
||
9495 | var getDomRange = function (start, soffset, finish, foffset) { |
||
9496 | return exactToNative(win, start, soffset, finish, foffset); |
||
9497 | }; |
||
9498 | var filtered = preprocess(selection); |
||
9499 | return diagnose(win, filtered).match({ |
||
9500 | ltr: getDomRange, |
||
9501 | rtl: getDomRange |
||
9502 | }); |
||
9503 | }; |
||
9504 | var readRange = function (selection) { |
||
9505 | if (selection.rangeCount > 0) { |
||
9506 | var firstRng = selection.getRangeAt(0); |
||
9507 | var lastRng = selection.getRangeAt(selection.rangeCount - 1); |
||
9508 | return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset)); |
||
9509 | } else { |
||
9510 | return Optional.none(); |
||
9511 | } |
||
9512 | }; |
||
9513 | var doGetExact = function (selection) { |
||
9514 | if (selection.anchorNode === null || selection.focusNode === null) { |
||
9515 | return readRange(selection); |
||
9516 | } else { |
||
9517 | var anchor = SugarElement.fromDom(selection.anchorNode); |
||
9518 | var focus_1 = SugarElement.fromDom(selection.focusNode); |
||
637 | daniel-mar | 9519 | return after$2(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection); |
597 | daniel-mar | 9520 | } |
9521 | }; |
||
637 | daniel-mar | 9522 | var setToElement = function (win, element, selectNodeContents$1) { |
9523 | if (selectNodeContents$1 === void 0) { |
||
9524 | selectNodeContents$1 = true; |
||
9525 | } |
||
9526 | var rngGetter = selectNodeContents$1 ? selectNodeContents : selectNode; |
||
9527 | var rng = rngGetter(win, element); |
||
597 | daniel-mar | 9528 | doSetNativeRange(win, rng); |
9529 | }; |
||
9530 | var getExact = function (win) { |
||
9531 | return getNativeSelection(win).filter(function (sel) { |
||
9532 | return sel.rangeCount > 0; |
||
9533 | }).bind(doGetExact); |
||
9534 | }; |
||
637 | daniel-mar | 9535 | var get$1 = function (win) { |
597 | daniel-mar | 9536 | return getExact(win).map(function (range) { |
9537 | return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset); |
||
9538 | }); |
||
9539 | }; |
||
637 | daniel-mar | 9540 | var getFirstRect = function (win, selection) { |
597 | daniel-mar | 9541 | var rng = asLtrRange(win, selection); |
637 | daniel-mar | 9542 | return getFirstRect$1(rng); |
597 | daniel-mar | 9543 | }; |
9544 | var getAtPoint = function (win, x, y) { |
||
637 | daniel-mar | 9545 | return fromPoint(win, x, y); |
597 | daniel-mar | 9546 | }; |
9547 | var clear = function (win) { |
||
9548 | getNativeSelection(win).each(function (selection) { |
||
9549 | return selection.removeAllRanges(); |
||
9550 | }); |
||
9551 | }; |
||
9552 | |||
637 | daniel-mar | 9553 | var global$1 = tinymce.util.Tools.resolve('tinymce.util.VK'); |
597 | daniel-mar | 9554 | |
9555 | var forward = function (editor, isRoot, cell) { |
||
637 | daniel-mar | 9556 | return go$1(editor, isRoot, next(cell, isEditable$1)); |
597 | daniel-mar | 9557 | }; |
9558 | var backward = function (editor, isRoot, cell) { |
||
637 | daniel-mar | 9559 | return go$1(editor, isRoot, prev(cell, isEditable$1)); |
597 | daniel-mar | 9560 | }; |
9561 | var getCellFirstCursorPosition = function (editor, cell) { |
||
9562 | var selection = SimSelection.exact(cell, 0, cell, 0); |
||
9563 | return toNative(selection); |
||
9564 | }; |
||
637 | daniel-mar | 9565 | var go$1 = function (editor, isRoot, cell) { |
597 | daniel-mar | 9566 | return cell.fold(Optional.none, Optional.none, function (current, next) { |
9567 | return first(next).map(function (cell) { |
||
9568 | return getCellFirstCursorPosition(editor, cell); |
||
9569 | }); |
||
9570 | }, function (current) { |
||
637 | daniel-mar | 9571 | editor.execCommand('mceTableInsertRowAfter'); |
9572 | return forward(editor, isRoot, current); |
||
597 | daniel-mar | 9573 | }); |
9574 | }; |
||
9575 | var rootElements = [ |
||
9576 | 'table', |
||
9577 | 'li', |
||
9578 | 'dl' |
||
9579 | ]; |
||
9580 | var handle$1 = function (event, editor, cellSelection) { |
||
637 | daniel-mar | 9581 | if (event.keyCode === global$1.TAB) { |
9582 | var body_1 = getBody(editor); |
||
597 | daniel-mar | 9583 | var isRoot_1 = function (element) { |
9584 | var name$1 = name(element); |
||
637 | daniel-mar | 9585 | return eq$1(element, body_1) || contains$2(rootElements, name$1); |
597 | daniel-mar | 9586 | }; |
9587 | var rng = editor.selection.getRng(); |
||
9588 | var container = SugarElement.fromDom(event.shiftKey ? rng.startContainer : rng.endContainer); |
||
9589 | cell(container, isRoot_1).each(function (cell) { |
||
9590 | event.preventDefault(); |
||
9591 | table(cell, isRoot_1).each(cellSelection.clear); |
||
9592 | editor.selection.collapse(event.shiftKey); |
||
9593 | var navigation = event.shiftKey ? backward : forward; |
||
9594 | var rng = navigation(editor, isRoot_1, cell); |
||
9595 | rng.each(function (range) { |
||
9596 | editor.selection.setRng(range); |
||
9597 | }); |
||
9598 | }); |
||
9599 | } |
||
9600 | }; |
||
9601 | |||
637 | daniel-mar | 9602 | var create$1 = function (selection, kill) { |
597 | daniel-mar | 9603 | return { |
9604 | selection: selection, |
||
9605 | kill: kill |
||
9606 | }; |
||
9607 | }; |
||
637 | daniel-mar | 9608 | var Response = { create: create$1 }; |
597 | daniel-mar | 9609 | |
637 | daniel-mar | 9610 | var create = function (start, soffset, finish, foffset) { |
597 | daniel-mar | 9611 | return { |
9612 | start: Situ.on(start, soffset), |
||
9613 | finish: Situ.on(finish, foffset) |
||
9614 | }; |
||
9615 | }; |
||
637 | daniel-mar | 9616 | var Situs = { create: create }; |
597 | daniel-mar | 9617 | |
9618 | var convertToRange = function (win, selection) { |
||
9619 | var rng = asLtrRange(win, selection); |
||
9620 | return SimRange.create(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset); |
||
9621 | }; |
||
9622 | var makeSitus = Situs.create; |
||
9623 | |||
9624 | var sync = function (container, isRoot, start, soffset, finish, foffset, selectRange) { |
||
9625 | if (!(eq$1(start, finish) && soffset === foffset)) { |
||
9626 | return closest$1(start, 'td,th', isRoot).bind(function (s) { |
||
9627 | return closest$1(finish, 'td,th', isRoot).bind(function (f) { |
||
637 | daniel-mar | 9628 | return detect(container, isRoot, s, f, selectRange); |
597 | daniel-mar | 9629 | }); |
9630 | }); |
||
9631 | } else { |
||
9632 | return Optional.none(); |
||
9633 | } |
||
9634 | }; |
||
637 | daniel-mar | 9635 | var detect = function (container, isRoot, start, finish, selectRange) { |
597 | daniel-mar | 9636 | if (!eq$1(start, finish)) { |
9637 | return identify(start, finish, isRoot).bind(function (cellSel) { |
||
9638 | var boxes = cellSel.boxes.getOr([]); |
||
637 | daniel-mar | 9639 | if (boxes.length > 1) { |
597 | daniel-mar | 9640 | selectRange(container, boxes, cellSel.start, cellSel.finish); |
9641 | return Optional.some(Response.create(Optional.some(makeSitus(start, 0, start, getEnd(start))), true)); |
||
9642 | } else { |
||
9643 | return Optional.none(); |
||
9644 | } |
||
9645 | }); |
||
9646 | } else { |
||
9647 | return Optional.none(); |
||
9648 | } |
||
9649 | }; |
||
9650 | var update = function (rows, columns, container, selected, annotations) { |
||
9651 | var updateSelection = function (newSels) { |
||
9652 | annotations.clearBeforeUpdate(container); |
||
9653 | annotations.selectRange(container, newSels.boxes, newSels.start, newSels.finish); |
||
9654 | return newSels.boxes; |
||
9655 | }; |
||
9656 | return shiftSelection(selected, rows, columns, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(updateSelection); |
||
9657 | }; |
||
9658 | |||
9659 | var traverse = function (item, mode) { |
||
9660 | return { |
||
9661 | item: item, |
||
9662 | mode: mode |
||
9663 | }; |
||
9664 | }; |
||
9665 | var backtrack = function (universe, item, _direction, transition) { |
||
9666 | if (transition === void 0) { |
||
9667 | transition = sidestep; |
||
9668 | } |
||
9669 | return universe.property().parent(item).map(function (p) { |
||
9670 | return traverse(p, transition); |
||
9671 | }); |
||
9672 | }; |
||
9673 | var sidestep = function (universe, item, direction, transition) { |
||
9674 | if (transition === void 0) { |
||
9675 | transition = advance; |
||
9676 | } |
||
9677 | return direction.sibling(universe, item).map(function (p) { |
||
9678 | return traverse(p, transition); |
||
9679 | }); |
||
9680 | }; |
||
9681 | var advance = function (universe, item, direction, transition) { |
||
9682 | if (transition === void 0) { |
||
9683 | transition = advance; |
||
9684 | } |
||
9685 | var children = universe.property().children(item); |
||
9686 | var result = direction.first(children); |
||
9687 | return result.map(function (r) { |
||
9688 | return traverse(r, transition); |
||
9689 | }); |
||
9690 | }; |
||
9691 | var successors = [ |
||
9692 | { |
||
9693 | current: backtrack, |
||
9694 | next: sidestep, |
||
9695 | fallback: Optional.none() |
||
9696 | }, |
||
9697 | { |
||
9698 | current: sidestep, |
||
9699 | next: advance, |
||
9700 | fallback: Optional.some(backtrack) |
||
9701 | }, |
||
9702 | { |
||
9703 | current: advance, |
||
9704 | next: advance, |
||
9705 | fallback: Optional.some(sidestep) |
||
9706 | } |
||
9707 | ]; |
||
637 | daniel-mar | 9708 | var go = function (universe, item, mode, direction, rules) { |
597 | daniel-mar | 9709 | if (rules === void 0) { |
9710 | rules = successors; |
||
9711 | } |
||
637 | daniel-mar | 9712 | var ruleOpt = find$1(rules, function (succ) { |
597 | daniel-mar | 9713 | return succ.current === mode; |
9714 | }); |
||
9715 | return ruleOpt.bind(function (rule) { |
||
9716 | return rule.current(universe, item, direction, rule.next).orThunk(function () { |
||
9717 | return rule.fallback.bind(function (fb) { |
||
637 | daniel-mar | 9718 | return go(universe, item, fb, direction); |
597 | daniel-mar | 9719 | }); |
9720 | }); |
||
9721 | }); |
||
9722 | }; |
||
9723 | |||
637 | daniel-mar | 9724 | var left$1 = function () { |
597 | daniel-mar | 9725 | var sibling = function (universe, item) { |
9726 | return universe.query().prevSibling(item); |
||
9727 | }; |
||
9728 | var first = function (children) { |
||
9729 | return children.length > 0 ? Optional.some(children[children.length - 1]) : Optional.none(); |
||
9730 | }; |
||
9731 | return { |
||
9732 | sibling: sibling, |
||
9733 | first: first |
||
9734 | }; |
||
9735 | }; |
||
637 | daniel-mar | 9736 | var right$1 = function () { |
597 | daniel-mar | 9737 | var sibling = function (universe, item) { |
9738 | return universe.query().nextSibling(item); |
||
9739 | }; |
||
9740 | var first = function (children) { |
||
9741 | return children.length > 0 ? Optional.some(children[0]) : Optional.none(); |
||
9742 | }; |
||
9743 | return { |
||
9744 | sibling: sibling, |
||
9745 | first: first |
||
9746 | }; |
||
9747 | }; |
||
9748 | var Walkers = { |
||
637 | daniel-mar | 9749 | left: left$1, |
9750 | right: right$1 |
||
597 | daniel-mar | 9751 | }; |
9752 | |||
9753 | var hone = function (universe, item, predicate, mode, direction, isRoot) { |
||
637 | daniel-mar | 9754 | var next = go(universe, item, mode, direction); |
597 | daniel-mar | 9755 | return next.bind(function (n) { |
9756 | if (isRoot(n.item)) { |
||
9757 | return Optional.none(); |
||
9758 | } else { |
||
9759 | return predicate(n.item) ? Optional.some(n.item) : hone(universe, n.item, predicate, n.mode, direction, isRoot); |
||
9760 | } |
||
9761 | }); |
||
9762 | }; |
||
637 | daniel-mar | 9763 | var left = function (universe, item, predicate, isRoot) { |
597 | daniel-mar | 9764 | return hone(universe, item, predicate, sidestep, Walkers.left(), isRoot); |
9765 | }; |
||
637 | daniel-mar | 9766 | var right = function (universe, item, predicate, isRoot) { |
597 | daniel-mar | 9767 | return hone(universe, item, predicate, sidestep, Walkers.right(), isRoot); |
9768 | }; |
||
9769 | |||
9770 | var isLeaf = function (universe) { |
||
9771 | return function (element) { |
||
9772 | return universe.property().children(element).length === 0; |
||
9773 | }; |
||
9774 | }; |
||
637 | daniel-mar | 9775 | var before$1 = function (universe, item, isRoot) { |
9776 | return seekLeft$1(universe, item, isLeaf(universe), isRoot); |
||
597 | daniel-mar | 9777 | }; |
637 | daniel-mar | 9778 | var after$1 = function (universe, item, isRoot) { |
9779 | return seekRight$1(universe, item, isLeaf(universe), isRoot); |
||
597 | daniel-mar | 9780 | }; |
637 | daniel-mar | 9781 | var seekLeft$1 = left; |
9782 | var seekRight$1 = right; |
||
597 | daniel-mar | 9783 | |
637 | daniel-mar | 9784 | var universe = DomUniverse(); |
9785 | var before = function (element, isRoot) { |
||
9786 | return before$1(universe, element, isRoot); |
||
597 | daniel-mar | 9787 | }; |
637 | daniel-mar | 9788 | var after = function (element, isRoot) { |
9789 | return after$1(universe, element, isRoot); |
||
597 | daniel-mar | 9790 | }; |
637 | daniel-mar | 9791 | var seekLeft = function (element, predicate, isRoot) { |
9792 | return seekLeft$1(universe, element, predicate, isRoot); |
||
597 | daniel-mar | 9793 | }; |
637 | daniel-mar | 9794 | var seekRight = function (element, predicate, isRoot) { |
9795 | return seekRight$1(universe, element, predicate, isRoot); |
||
597 | daniel-mar | 9796 | }; |
9797 | |||
637 | daniel-mar | 9798 | var ancestor = function (scope, predicate, isRoot) { |
9799 | return ancestor$2(scope, predicate, isRoot).isSome(); |
||
597 | daniel-mar | 9800 | }; |
9801 | |||
637 | daniel-mar | 9802 | var adt$1 = Adt.generate([ |
597 | daniel-mar | 9803 | { none: ['message'] }, |
9804 | { success: [] }, |
||
9805 | { failedUp: ['cell'] }, |
||
9806 | { failedDown: ['cell'] } |
||
9807 | ]); |
||
9808 | var isOverlapping = function (bridge, before, after) { |
||
9809 | var beforeBounds = bridge.getRect(before); |
||
9810 | var afterBounds = bridge.getRect(after); |
||
9811 | return afterBounds.right > beforeBounds.left && afterBounds.left < beforeBounds.right; |
||
9812 | }; |
||
9813 | var isRow = function (elem) { |
||
9814 | return closest$1(elem, 'tr'); |
||
9815 | }; |
||
9816 | var verify = function (bridge, before, beforeOffset, after, afterOffset, failure, isRoot) { |
||
9817 | return closest$1(after, 'td,th', isRoot).bind(function (afterCell) { |
||
9818 | return closest$1(before, 'td,th', isRoot).map(function (beforeCell) { |
||
9819 | if (!eq$1(afterCell, beforeCell)) { |
||
637 | daniel-mar | 9820 | return sharedOne(isRow, [ |
597 | daniel-mar | 9821 | afterCell, |
9822 | beforeCell |
||
9823 | ]).fold(function () { |
||
637 | daniel-mar | 9824 | return isOverlapping(bridge, beforeCell, afterCell) ? adt$1.success() : failure(beforeCell); |
597 | daniel-mar | 9825 | }, function (_sharedRow) { |
9826 | return failure(beforeCell); |
||
9827 | }); |
||
9828 | } else { |
||
637 | daniel-mar | 9829 | return eq$1(after, afterCell) && getEnd(afterCell) === afterOffset ? failure(beforeCell) : adt$1.none('in same cell'); |
597 | daniel-mar | 9830 | } |
9831 | }); |
||
637 | daniel-mar | 9832 | }).getOr(adt$1.none('default')); |
597 | daniel-mar | 9833 | }; |
637 | daniel-mar | 9834 | var cata = function (subject, onNone, onSuccess, onFailedUp, onFailedDown) { |
597 | daniel-mar | 9835 | return subject.fold(onNone, onSuccess, onFailedUp, onFailedDown); |
9836 | }; |
||
637 | daniel-mar | 9837 | var BeforeAfter = __assign(__assign({}, adt$1), { |
597 | daniel-mar | 9838 | verify: verify, |
637 | daniel-mar | 9839 | cata: cata |
597 | daniel-mar | 9840 | }); |
9841 | |||
9842 | var inParent = function (parent, children, element, index) { |
||
9843 | return { |
||
9844 | parent: parent, |
||
9845 | children: children, |
||
9846 | element: element, |
||
9847 | index: index |
||
9848 | }; |
||
9849 | }; |
||
9850 | var indexInParent = function (element) { |
||
9851 | return parent(element).bind(function (parent) { |
||
637 | daniel-mar | 9852 | var children = children$3(parent); |
9853 | return indexOf(children, element).map(function (index) { |
||
9854 | return inParent(parent, children, element, index); |
||
597 | daniel-mar | 9855 | }); |
9856 | }); |
||
9857 | }; |
||
9858 | var indexOf = function (elements, element) { |
||
9859 | return findIndex(elements, curry(eq$1, element)); |
||
9860 | }; |
||
9861 | |||
9862 | var isBr = function (elem) { |
||
9863 | return name(elem) === 'br'; |
||
9864 | }; |
||
9865 | var gatherer = function (cand, gather, isRoot) { |
||
9866 | return gather(cand, isRoot).bind(function (target) { |
||
637 | daniel-mar | 9867 | return isText(target) && get$9(target).trim().length === 0 ? gatherer(target, gather, isRoot) : Optional.some(target); |
597 | daniel-mar | 9868 | }); |
9869 | }; |
||
9870 | var handleBr = function (isRoot, element, direction) { |
||
9871 | return direction.traverse(element).orThunk(function () { |
||
9872 | return gatherer(element, direction.gather, isRoot); |
||
9873 | }).map(direction.relative); |
||
9874 | }; |
||
9875 | var findBr = function (element, offset) { |
||
637 | daniel-mar | 9876 | return child$3(element, offset).filter(isBr).orThunk(function () { |
9877 | return child$3(element, offset - 1).filter(isBr); |
||
597 | daniel-mar | 9878 | }); |
9879 | }; |
||
9880 | var handleParent = function (isRoot, element, offset, direction) { |
||
9881 | return findBr(element, offset).bind(function (br) { |
||
9882 | return direction.traverse(br).fold(function () { |
||
9883 | return gatherer(br, direction.gather, isRoot).map(direction.relative); |
||
9884 | }, function (adjacent) { |
||
9885 | return indexInParent(adjacent).map(function (info) { |
||
9886 | return Situ.on(info.parent, info.index); |
||
9887 | }); |
||
9888 | }); |
||
9889 | }); |
||
9890 | }; |
||
9891 | var tryBr = function (isRoot, element, offset, direction) { |
||
9892 | var target = isBr(element) ? handleBr(isRoot, element, direction) : handleParent(isRoot, element, offset, direction); |
||
9893 | return target.map(function (tgt) { |
||
9894 | return { |
||
9895 | start: tgt, |
||
9896 | finish: tgt |
||
9897 | }; |
||
9898 | }); |
||
9899 | }; |
||
9900 | var process = function (analysis) { |
||
9901 | return BeforeAfter.cata(analysis, function (_message) { |
||
9902 | return Optional.none(); |
||
9903 | }, function () { |
||
9904 | return Optional.none(); |
||
9905 | }, function (cell) { |
||
9906 | return Optional.some(point(cell, 0)); |
||
9907 | }, function (cell) { |
||
9908 | return Optional.some(point(cell, getEnd(cell))); |
||
9909 | }); |
||
9910 | }; |
||
9911 | |||
9912 | var moveDown = function (caret, amount) { |
||
9913 | return { |
||
9914 | left: caret.left, |
||
9915 | top: caret.top + amount, |
||
9916 | right: caret.right, |
||
9917 | bottom: caret.bottom + amount |
||
9918 | }; |
||
9919 | }; |
||
9920 | var moveUp = function (caret, amount) { |
||
9921 | return { |
||
9922 | left: caret.left, |
||
9923 | top: caret.top - amount, |
||
9924 | right: caret.right, |
||
9925 | bottom: caret.bottom - amount |
||
9926 | }; |
||
9927 | }; |
||
9928 | var translate = function (caret, xDelta, yDelta) { |
||
9929 | return { |
||
9930 | left: caret.left + xDelta, |
||
9931 | top: caret.top + yDelta, |
||
9932 | right: caret.right + xDelta, |
||
9933 | bottom: caret.bottom + yDelta |
||
9934 | }; |
||
9935 | }; |
||
637 | daniel-mar | 9936 | var getTop = function (caret) { |
597 | daniel-mar | 9937 | return caret.top; |
9938 | }; |
||
9939 | var getBottom = function (caret) { |
||
9940 | return caret.bottom; |
||
9941 | }; |
||
9942 | |||
9943 | var getPartialBox = function (bridge, element, offset) { |
||
9944 | if (offset >= 0 && offset < getEnd(element)) { |
||
9945 | return bridge.getRangedRect(element, offset, element, offset + 1); |
||
9946 | } else if (offset > 0) { |
||
9947 | return bridge.getRangedRect(element, offset - 1, element, offset); |
||
9948 | } |
||
9949 | return Optional.none(); |
||
9950 | }; |
||
9951 | var toCaret = function (rect) { |
||
9952 | return { |
||
9953 | left: rect.left, |
||
9954 | top: rect.top, |
||
9955 | right: rect.right, |
||
9956 | bottom: rect.bottom |
||
9957 | }; |
||
9958 | }; |
||
9959 | var getElemBox = function (bridge, element) { |
||
9960 | return Optional.some(bridge.getRect(element)); |
||
9961 | }; |
||
9962 | var getBoxAt = function (bridge, element, offset) { |
||
9963 | if (isElement(element)) { |
||
9964 | return getElemBox(bridge, element).map(toCaret); |
||
9965 | } else if (isText(element)) { |
||
9966 | return getPartialBox(bridge, element, offset).map(toCaret); |
||
9967 | } else { |
||
9968 | return Optional.none(); |
||
9969 | } |
||
9970 | }; |
||
9971 | var getEntireBox = function (bridge, element) { |
||
9972 | if (isElement(element)) { |
||
9973 | return getElemBox(bridge, element).map(toCaret); |
||
9974 | } else if (isText(element)) { |
||
9975 | return bridge.getRangedRect(element, 0, element, getEnd(element)).map(toCaret); |
||
9976 | } else { |
||
9977 | return Optional.none(); |
||
9978 | } |
||
9979 | }; |
||
9980 | |||
9981 | var JUMP_SIZE = 5; |
||
9982 | var NUM_RETRIES = 100; |
||
637 | daniel-mar | 9983 | var adt = Adt.generate([ |
597 | daniel-mar | 9984 | { none: [] }, |
9985 | { retry: ['caret'] } |
||
9986 | ]); |
||
9987 | var isOutside = function (caret, box) { |
||
9988 | return caret.left < box.left || Math.abs(box.right - caret.left) < 1 || caret.left > box.right; |
||
9989 | }; |
||
9990 | var inOutsideBlock = function (bridge, element, caret) { |
||
637 | daniel-mar | 9991 | return closest$2(element, isBlock).fold(never, function (cell) { |
597 | daniel-mar | 9992 | return getEntireBox(bridge, cell).exists(function (box) { |
9993 | return isOutside(caret, box); |
||
9994 | }); |
||
9995 | }); |
||
9996 | }; |
||
9997 | var adjustDown = function (bridge, element, guessBox, original, caret) { |
||
9998 | var lowerCaret = moveDown(caret, JUMP_SIZE); |
||
9999 | if (Math.abs(guessBox.bottom - original.bottom) < 1) { |
||
637 | daniel-mar | 10000 | return adt.retry(lowerCaret); |
597 | daniel-mar | 10001 | } else if (guessBox.top > caret.bottom) { |
637 | daniel-mar | 10002 | return adt.retry(lowerCaret); |
597 | daniel-mar | 10003 | } else if (guessBox.top === caret.bottom) { |
637 | daniel-mar | 10004 | return adt.retry(moveDown(caret, 1)); |
597 | daniel-mar | 10005 | } else { |
637 | daniel-mar | 10006 | return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(lowerCaret, JUMP_SIZE, 0)) : adt.none(); |
597 | daniel-mar | 10007 | } |
10008 | }; |
||
10009 | var adjustUp = function (bridge, element, guessBox, original, caret) { |
||
10010 | var higherCaret = moveUp(caret, JUMP_SIZE); |
||
10011 | if (Math.abs(guessBox.top - original.top) < 1) { |
||
637 | daniel-mar | 10012 | return adt.retry(higherCaret); |
597 | daniel-mar | 10013 | } else if (guessBox.bottom < caret.top) { |
637 | daniel-mar | 10014 | return adt.retry(higherCaret); |
597 | daniel-mar | 10015 | } else if (guessBox.bottom === caret.top) { |
637 | daniel-mar | 10016 | return adt.retry(moveUp(caret, 1)); |
597 | daniel-mar | 10017 | } else { |
637 | daniel-mar | 10018 | return inOutsideBlock(bridge, element, caret) ? adt.retry(translate(higherCaret, JUMP_SIZE, 0)) : adt.none(); |
597 | daniel-mar | 10019 | } |
10020 | }; |
||
10021 | var upMovement = { |
||
637 | daniel-mar | 10022 | point: getTop, |
597 | daniel-mar | 10023 | adjuster: adjustUp, |
10024 | move: moveUp, |
||
637 | daniel-mar | 10025 | gather: before |
597 | daniel-mar | 10026 | }; |
10027 | var downMovement = { |
||
10028 | point: getBottom, |
||
10029 | adjuster: adjustDown, |
||
10030 | move: moveDown, |
||
637 | daniel-mar | 10031 | gather: after |
597 | daniel-mar | 10032 | }; |
10033 | var isAtTable = function (bridge, x, y) { |
||
10034 | return bridge.elementFromPoint(x, y).filter(function (elm) { |
||
10035 | return name(elm) === 'table'; |
||
10036 | }).isSome(); |
||
10037 | }; |
||
10038 | var adjustForTable = function (bridge, movement, original, caret, numRetries) { |
||
10039 | return adjustTil(bridge, movement, original, movement.move(caret, JUMP_SIZE), numRetries); |
||
10040 | }; |
||
10041 | var adjustTil = function (bridge, movement, original, caret, numRetries) { |
||
10042 | if (numRetries === 0) { |
||
10043 | return Optional.some(caret); |
||
10044 | } |
||
10045 | if (isAtTable(bridge, caret.left, movement.point(caret))) { |
||
10046 | return adjustForTable(bridge, movement, original, caret, numRetries - 1); |
||
10047 | } |
||
10048 | return bridge.situsFromPoint(caret.left, movement.point(caret)).bind(function (guess) { |
||
10049 | return guess.start.fold(Optional.none, function (element) { |
||
10050 | return getEntireBox(bridge, element).bind(function (guessBox) { |
||
10051 | return movement.adjuster(bridge, element, guessBox, original, caret).fold(Optional.none, function (newCaret) { |
||
10052 | return adjustTil(bridge, movement, original, newCaret, numRetries - 1); |
||
10053 | }); |
||
10054 | }).orThunk(function () { |
||
10055 | return Optional.some(caret); |
||
10056 | }); |
||
10057 | }, Optional.none); |
||
10058 | }); |
||
10059 | }; |
||
10060 | var ieTryDown = function (bridge, caret) { |
||
10061 | return bridge.situsFromPoint(caret.left, caret.bottom + JUMP_SIZE); |
||
10062 | }; |
||
10063 | var ieTryUp = function (bridge, caret) { |
||
10064 | return bridge.situsFromPoint(caret.left, caret.top - JUMP_SIZE); |
||
10065 | }; |
||
10066 | var checkScroll = function (movement, adjusted, bridge) { |
||
10067 | if (movement.point(adjusted) > bridge.getInnerHeight()) { |
||
10068 | return Optional.some(movement.point(adjusted) - bridge.getInnerHeight()); |
||
10069 | } else if (movement.point(adjusted) < 0) { |
||
10070 | return Optional.some(-movement.point(adjusted)); |
||
10071 | } else { |
||
10072 | return Optional.none(); |
||
10073 | } |
||
10074 | }; |
||
10075 | var retry = function (movement, bridge, caret) { |
||
10076 | var moved = movement.move(caret, JUMP_SIZE); |
||
10077 | var adjusted = adjustTil(bridge, movement, caret, moved, NUM_RETRIES).getOr(moved); |
||
10078 | return checkScroll(movement, adjusted, bridge).fold(function () { |
||
10079 | return bridge.situsFromPoint(adjusted.left, movement.point(adjusted)); |
||
10080 | }, function (delta) { |
||
10081 | bridge.scrollBy(0, delta); |
||
10082 | return bridge.situsFromPoint(adjusted.left, movement.point(adjusted) - delta); |
||
10083 | }); |
||
10084 | }; |
||
10085 | var Retries = { |
||
10086 | tryUp: curry(retry, upMovement), |
||
10087 | tryDown: curry(retry, downMovement), |
||
10088 | ieTryUp: ieTryUp, |
||
10089 | ieTryDown: ieTryDown, |
||
10090 | getJumpSize: constant(JUMP_SIZE) |
||
10091 | }; |
||
10092 | |||
10093 | var MAX_RETRIES = 20; |
||
10094 | var findSpot = function (bridge, isRoot, direction) { |
||
10095 | return bridge.getSelection().bind(function (sel) { |
||
10096 | return tryBr(isRoot, sel.finish, sel.foffset, direction).fold(function () { |
||
10097 | return Optional.some(point(sel.finish, sel.foffset)); |
||
10098 | }, function (brNeighbour) { |
||
10099 | var range = bridge.fromSitus(brNeighbour); |
||
10100 | var analysis = BeforeAfter.verify(bridge, sel.finish, sel.foffset, range.finish, range.foffset, direction.failure, isRoot); |
||
10101 | return process(analysis); |
||
10102 | }); |
||
10103 | }); |
||
10104 | }; |
||
637 | daniel-mar | 10105 | var scan = function (bridge, isRoot, element, offset, direction, numRetries) { |
597 | daniel-mar | 10106 | if (numRetries === 0) { |
10107 | return Optional.none(); |
||
10108 | } |
||
10109 | return tryCursor(bridge, isRoot, element, offset, direction).bind(function (situs) { |
||
10110 | var range = bridge.fromSitus(situs); |
||
10111 | var analysis = BeforeAfter.verify(bridge, element, offset, range.finish, range.foffset, direction.failure, isRoot); |
||
10112 | return BeforeAfter.cata(analysis, function () { |
||
10113 | return Optional.none(); |
||
10114 | }, function () { |
||
10115 | return Optional.some(situs); |
||
10116 | }, function (cell) { |
||
10117 | if (eq$1(element, cell) && offset === 0) { |
||
10118 | return tryAgain(bridge, element, offset, moveUp, direction); |
||
10119 | } else { |
||
637 | daniel-mar | 10120 | return scan(bridge, isRoot, cell, 0, direction, numRetries - 1); |
597 | daniel-mar | 10121 | } |
10122 | }, function (cell) { |
||
10123 | if (eq$1(element, cell) && offset === getEnd(cell)) { |
||
10124 | return tryAgain(bridge, element, offset, moveDown, direction); |
||
10125 | } else { |
||
637 | daniel-mar | 10126 | return scan(bridge, isRoot, cell, getEnd(cell), direction, numRetries - 1); |
597 | daniel-mar | 10127 | } |
10128 | }); |
||
10129 | }); |
||
10130 | }; |
||
10131 | var tryAgain = function (bridge, element, offset, move, direction) { |
||
10132 | return getBoxAt(bridge, element, offset).bind(function (box) { |
||
10133 | return tryAt(bridge, direction, move(box, Retries.getJumpSize())); |
||
10134 | }); |
||
10135 | }; |
||
10136 | var tryAt = function (bridge, direction, box) { |
||
10137 | var browser = detect$3().browser; |
||
10138 | if (browser.isChrome() || browser.isSafari() || browser.isFirefox() || browser.isEdge()) { |
||
10139 | return direction.otherRetry(bridge, box); |
||
10140 | } else if (browser.isIE()) { |
||
10141 | return direction.ieRetry(bridge, box); |
||
10142 | } else { |
||
10143 | return Optional.none(); |
||
10144 | } |
||
10145 | }; |
||
10146 | var tryCursor = function (bridge, isRoot, element, offset, direction) { |
||
10147 | return getBoxAt(bridge, element, offset).bind(function (box) { |
||
10148 | return tryAt(bridge, direction, box); |
||
10149 | }); |
||
10150 | }; |
||
637 | daniel-mar | 10151 | var handle = function (bridge, isRoot, direction) { |
597 | daniel-mar | 10152 | return findSpot(bridge, isRoot, direction).bind(function (spot) { |
637 | daniel-mar | 10153 | return scan(bridge, isRoot, spot.element, spot.offset, direction, MAX_RETRIES).map(bridge.fromSitus); |
597 | daniel-mar | 10154 | }); |
10155 | }; |
||
10156 | |||
10157 | var inSameTable = function (elem, table) { |
||
637 | daniel-mar | 10158 | return ancestor(elem, function (e) { |
597 | daniel-mar | 10159 | return parent(e).exists(function (p) { |
10160 | return eq$1(p, table); |
||
10161 | }); |
||
10162 | }); |
||
10163 | }; |
||
10164 | var simulate = function (bridge, isRoot, direction, initial, anchor) { |
||
10165 | return closest$1(initial, 'td,th', isRoot).bind(function (start) { |
||
10166 | return closest$1(start, 'table', isRoot).bind(function (table) { |
||
10167 | if (!inSameTable(anchor, table)) { |
||
10168 | return Optional.none(); |
||
10169 | } |
||
637 | daniel-mar | 10170 | return handle(bridge, isRoot, direction).bind(function (range) { |
597 | daniel-mar | 10171 | return closest$1(range.finish, 'td,th', isRoot).map(function (finish) { |
10172 | return { |
||
10173 | start: start, |
||
10174 | finish: finish, |
||
10175 | range: range |
||
10176 | }; |
||
10177 | }); |
||
10178 | }); |
||
10179 | }); |
||
10180 | }); |
||
10181 | }; |
||
10182 | var navigate = function (bridge, isRoot, direction, initial, anchor, precheck) { |
||
10183 | if (detect$3().browser.isIE()) { |
||
10184 | return Optional.none(); |
||
10185 | } else { |
||
10186 | return precheck(initial, isRoot).orThunk(function () { |
||
10187 | return simulate(bridge, isRoot, direction, initial, anchor).map(function (info) { |
||
10188 | var range = info.range; |
||
10189 | return Response.create(Optional.some(makeSitus(range.start, range.soffset, range.finish, range.foffset)), true); |
||
10190 | }); |
||
10191 | }); |
||
10192 | } |
||
10193 | }; |
||
10194 | var firstUpCheck = function (initial, isRoot) { |
||
10195 | return closest$1(initial, 'tr', isRoot).bind(function (startRow) { |
||
10196 | return closest$1(startRow, 'table', isRoot).bind(function (table) { |
||
637 | daniel-mar | 10197 | var rows = descendants(table, 'tr'); |
597 | daniel-mar | 10198 | if (eq$1(startRow, rows[0])) { |
637 | daniel-mar | 10199 | return seekLeft(table, function (element) { |
597 | daniel-mar | 10200 | return last$1(element).isSome(); |
10201 | }, isRoot).map(function (last) { |
||
10202 | var lastOffset = getEnd(last); |
||
10203 | return Response.create(Optional.some(makeSitus(last, lastOffset, last, lastOffset)), true); |
||
10204 | }); |
||
10205 | } else { |
||
10206 | return Optional.none(); |
||
10207 | } |
||
10208 | }); |
||
10209 | }); |
||
10210 | }; |
||
10211 | var lastDownCheck = function (initial, isRoot) { |
||
10212 | return closest$1(initial, 'tr', isRoot).bind(function (startRow) { |
||
10213 | return closest$1(startRow, 'table', isRoot).bind(function (table) { |
||
637 | daniel-mar | 10214 | var rows = descendants(table, 'tr'); |
597 | daniel-mar | 10215 | if (eq$1(startRow, rows[rows.length - 1])) { |
637 | daniel-mar | 10216 | return seekRight(table, function (element) { |
597 | daniel-mar | 10217 | return first(element).isSome(); |
10218 | }, isRoot).map(function (first) { |
||
10219 | return Response.create(Optional.some(makeSitus(first, 0, first, 0)), true); |
||
10220 | }); |
||
10221 | } else { |
||
10222 | return Optional.none(); |
||
10223 | } |
||
10224 | }); |
||
10225 | }); |
||
10226 | }; |
||
10227 | var select = function (bridge, container, isRoot, direction, initial, anchor, selectRange) { |
||
10228 | return simulate(bridge, isRoot, direction, initial, anchor).bind(function (info) { |
||
637 | daniel-mar | 10229 | return detect(container, isRoot, info.start, info.finish, selectRange); |
597 | daniel-mar | 10230 | }); |
10231 | }; |
||
10232 | |||
10233 | var findCell = function (target, isRoot) { |
||
10234 | return closest$1(target, 'td,th', isRoot); |
||
10235 | }; |
||
10236 | var MouseSelection = function (bridge, container, isRoot, annotations) { |
||
637 | daniel-mar | 10237 | var cursor = value(); |
597 | daniel-mar | 10238 | var clearstate = cursor.clear; |
10239 | var applySelection = function (event) { |
||
10240 | cursor.on(function (start) { |
||
10241 | annotations.clearBeforeUpdate(container); |
||
10242 | findCell(event.target, isRoot).each(function (finish) { |
||
10243 | identify(start, finish, isRoot).each(function (cellSel) { |
||
10244 | var boxes = cellSel.boxes.getOr([]); |
||
637 | daniel-mar | 10245 | if (boxes.length === 1) { |
10246 | var singleCell = boxes[0]; |
||
10247 | var isNonEditableCell = getRaw(singleCell) === 'false'; |
||
10248 | var isCellClosestContentEditable = is(closest(event.target), singleCell, eq$1); |
||
10249 | if (isNonEditableCell && isCellClosestContentEditable) { |
||
10250 | annotations.selectRange(container, boxes, singleCell, singleCell); |
||
10251 | bridge.selectContents(singleCell); |
||
10252 | } |
||
10253 | } else if (boxes.length > 1) { |
||
597 | daniel-mar | 10254 | annotations.selectRange(container, boxes, cellSel.start, cellSel.finish); |
10255 | bridge.selectContents(finish); |
||
10256 | } |
||
10257 | }); |
||
10258 | }); |
||
10259 | }); |
||
10260 | }; |
||
10261 | var mousedown = function (event) { |
||
10262 | annotations.clear(container); |
||
10263 | findCell(event.target, isRoot).each(cursor.set); |
||
10264 | }; |
||
10265 | var mouseover = function (event) { |
||
10266 | applySelection(event); |
||
10267 | }; |
||
10268 | var mouseup = function (event) { |
||
10269 | applySelection(event); |
||
10270 | clearstate(); |
||
10271 | }; |
||
10272 | return { |
||
10273 | clearstate: clearstate, |
||
10274 | mousedown: mousedown, |
||
10275 | mouseover: mouseover, |
||
10276 | mouseup: mouseup |
||
10277 | }; |
||
10278 | }; |
||
10279 | |||
10280 | var down = { |
||
10281 | traverse: nextSibling, |
||
637 | daniel-mar | 10282 | gather: after, |
597 | daniel-mar | 10283 | relative: Situ.before, |
10284 | otherRetry: Retries.tryDown, |
||
10285 | ieRetry: Retries.ieTryDown, |
||
10286 | failure: BeforeAfter.failedDown |
||
10287 | }; |
||
10288 | var up = { |
||
10289 | traverse: prevSibling, |
||
637 | daniel-mar | 10290 | gather: before, |
597 | daniel-mar | 10291 | relative: Situ.before, |
10292 | otherRetry: Retries.tryUp, |
||
10293 | ieRetry: Retries.ieTryUp, |
||
10294 | failure: BeforeAfter.failedUp |
||
10295 | }; |
||
10296 | |||
10297 | var isKey = function (key) { |
||
10298 | return function (keycode) { |
||
10299 | return keycode === key; |
||
10300 | }; |
||
10301 | }; |
||
10302 | var isUp = isKey(38); |
||
10303 | var isDown = isKey(40); |
||
10304 | var isNavigation = function (keycode) { |
||
10305 | return keycode >= 37 && keycode <= 40; |
||
10306 | }; |
||
637 | daniel-mar | 10307 | var ltr = { |
597 | daniel-mar | 10308 | isBackward: isKey(37), |
10309 | isForward: isKey(39) |
||
10310 | }; |
||
637 | daniel-mar | 10311 | var rtl = { |
597 | daniel-mar | 10312 | isBackward: isKey(39), |
10313 | isForward: isKey(37) |
||
10314 | }; |
||
10315 | |||
637 | daniel-mar | 10316 | var get = function (_DOC) { |
597 | daniel-mar | 10317 | var doc = _DOC !== undefined ? _DOC.dom : document; |
10318 | var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; |
||
10319 | var y = doc.body.scrollTop || doc.documentElement.scrollTop; |
||
10320 | return SugarPosition(x, y); |
||
10321 | }; |
||
10322 | var by = function (x, y, _DOC) { |
||
10323 | var doc = _DOC !== undefined ? _DOC.dom : document; |
||
10324 | var win = doc.defaultView; |
||
10325 | if (win) { |
||
10326 | win.scrollBy(x, y); |
||
10327 | } |
||
10328 | }; |
||
10329 | |||
10330 | var WindowBridge = function (win) { |
||
10331 | var elementFromPoint = function (x, y) { |
||
10332 | return SugarElement.fromPoint(SugarElement.fromDom(win.document), x, y); |
||
10333 | }; |
||
10334 | var getRect = function (element) { |
||
10335 | return element.dom.getBoundingClientRect(); |
||
10336 | }; |
||
10337 | var getRangedRect = function (start, soffset, finish, foffset) { |
||
10338 | var sel = SimSelection.exact(start, soffset, finish, foffset); |
||
637 | daniel-mar | 10339 | return getFirstRect(win, sel); |
597 | daniel-mar | 10340 | }; |
10341 | var getSelection = function () { |
||
637 | daniel-mar | 10342 | return get$1(win).map(function (exactAdt) { |
597 | daniel-mar | 10343 | return convertToRange(win, exactAdt); |
10344 | }); |
||
10345 | }; |
||
10346 | var fromSitus = function (situs) { |
||
10347 | var relative = SimSelection.relative(situs.start, situs.finish); |
||
10348 | return convertToRange(win, relative); |
||
10349 | }; |
||
10350 | var situsFromPoint = function (x, y) { |
||
10351 | return getAtPoint(win, x, y).map(function (exact) { |
||
10352 | return Situs.create(exact.start, exact.soffset, exact.finish, exact.foffset); |
||
10353 | }); |
||
10354 | }; |
||
10355 | var clearSelection = function () { |
||
10356 | clear(win); |
||
10357 | }; |
||
10358 | var collapseSelection = function (toStart) { |
||
10359 | if (toStart === void 0) { |
||
10360 | toStart = false; |
||
10361 | } |
||
637 | daniel-mar | 10362 | get$1(win).each(function (sel) { |
597 | daniel-mar | 10363 | return sel.fold(function (rng) { |
10364 | return rng.collapse(toStart); |
||
10365 | }, function (startSitu, finishSitu) { |
||
10366 | var situ = toStart ? startSitu : finishSitu; |
||
10367 | setRelative(win, situ, situ); |
||
10368 | }, function (start, soffset, finish, foffset) { |
||
10369 | var node = toStart ? start : finish; |
||
10370 | var offset = toStart ? soffset : foffset; |
||
10371 | setExact(win, node, offset, node, offset); |
||
10372 | }); |
||
10373 | }); |
||
10374 | }; |
||
637 | daniel-mar | 10375 | var selectNode = function (element) { |
10376 | setToElement(win, element, false); |
||
10377 | }; |
||
597 | daniel-mar | 10378 | var selectContents = function (element) { |
10379 | setToElement(win, element); |
||
10380 | }; |
||
10381 | var setSelection = function (sel) { |
||
10382 | setExact(win, sel.start, sel.soffset, sel.finish, sel.foffset); |
||
10383 | }; |
||
10384 | var setRelativeSelection = function (start, finish) { |
||
10385 | setRelative(win, start, finish); |
||
10386 | }; |
||
10387 | var getInnerHeight = function () { |
||
10388 | return win.innerHeight; |
||
10389 | }; |
||
10390 | var getScrollY = function () { |
||
637 | daniel-mar | 10391 | var pos = get(SugarElement.fromDom(win.document)); |
597 | daniel-mar | 10392 | return pos.top; |
10393 | }; |
||
10394 | var scrollBy = function (x, y) { |
||
10395 | by(x, y, SugarElement.fromDom(win.document)); |
||
10396 | }; |
||
10397 | return { |
||
10398 | elementFromPoint: elementFromPoint, |
||
10399 | getRect: getRect, |
||
10400 | getRangedRect: getRangedRect, |
||
10401 | getSelection: getSelection, |
||
10402 | fromSitus: fromSitus, |
||
10403 | situsFromPoint: situsFromPoint, |
||
10404 | clearSelection: clearSelection, |
||
10405 | collapseSelection: collapseSelection, |
||
10406 | setSelection: setSelection, |
||
10407 | setRelativeSelection: setRelativeSelection, |
||
637 | daniel-mar | 10408 | selectNode: selectNode, |
597 | daniel-mar | 10409 | selectContents: selectContents, |
10410 | getInnerHeight: getInnerHeight, |
||
10411 | getScrollY: getScrollY, |
||
10412 | scrollBy: scrollBy |
||
10413 | }; |
||
10414 | }; |
||
10415 | |||
10416 | var rc = function (rows, cols) { |
||
10417 | return { |
||
10418 | rows: rows, |
||
10419 | cols: cols |
||
10420 | }; |
||
10421 | }; |
||
10422 | var mouse = function (win, container, isRoot, annotations) { |
||
10423 | var bridge = WindowBridge(win); |
||
10424 | var handlers = MouseSelection(bridge, container, isRoot, annotations); |
||
10425 | return { |
||
10426 | clearstate: handlers.clearstate, |
||
10427 | mousedown: handlers.mousedown, |
||
10428 | mouseover: handlers.mouseover, |
||
10429 | mouseup: handlers.mouseup |
||
10430 | }; |
||
10431 | }; |
||
10432 | var keyboard = function (win, container, isRoot, annotations) { |
||
10433 | var bridge = WindowBridge(win); |
||
10434 | var clearToNavigate = function () { |
||
10435 | annotations.clear(container); |
||
10436 | return Optional.none(); |
||
10437 | }; |
||
10438 | var keydown = function (event, start, soffset, finish, foffset, direction) { |
||
10439 | var realEvent = event.raw; |
||
10440 | var keycode = realEvent.which; |
||
10441 | var shiftKey = realEvent.shiftKey === true; |
||
637 | daniel-mar | 10442 | var handler = retrieve$1(container, annotations.selectedSelector).fold(function () { |
679 | daniel-mar | 10443 | if (isNavigation(keycode) && !shiftKey) { |
10444 | annotations.clearBeforeUpdate(container); |
||
10445 | } |
||
597 | daniel-mar | 10446 | if (isDown(keycode) && shiftKey) { |
10447 | return curry(select, bridge, container, isRoot, down, finish, start, annotations.selectRange); |
||
10448 | } else if (isUp(keycode) && shiftKey) { |
||
10449 | return curry(select, bridge, container, isRoot, up, finish, start, annotations.selectRange); |
||
10450 | } else if (isDown(keycode)) { |
||
10451 | return curry(navigate, bridge, isRoot, down, finish, start, lastDownCheck); |
||
10452 | } else if (isUp(keycode)) { |
||
10453 | return curry(navigate, bridge, isRoot, up, finish, start, firstUpCheck); |
||
10454 | } else { |
||
10455 | return Optional.none; |
||
10456 | } |
||
10457 | }, function (selected) { |
||
10458 | var update$1 = function (attempts) { |
||
10459 | return function () { |
||
10460 | var navigation = findMap(attempts, function (delta) { |
||
10461 | return update(delta.rows, delta.cols, container, selected, annotations); |
||
10462 | }); |
||
10463 | return navigation.fold(function () { |
||
10464 | return getEdges(container, annotations.firstSelectedSelector, annotations.lastSelectedSelector).map(function (edges) { |
||
10465 | var relative = isDown(keycode) || direction.isForward(keycode) ? Situ.after : Situ.before; |
||
10466 | bridge.setRelativeSelection(Situ.on(edges.first, 0), relative(edges.table)); |
||
10467 | annotations.clear(container); |
||
10468 | return Response.create(Optional.none(), true); |
||
10469 | }); |
||
10470 | }, function (_) { |
||
10471 | return Optional.some(Response.create(Optional.none(), true)); |
||
10472 | }); |
||
10473 | }; |
||
10474 | }; |
||
10475 | if (isDown(keycode) && shiftKey) { |
||
10476 | return update$1([rc(+1, 0)]); |
||
10477 | } else if (isUp(keycode) && shiftKey) { |
||
10478 | return update$1([rc(-1, 0)]); |
||
10479 | } else if (direction.isBackward(keycode) && shiftKey) { |
||
10480 | return update$1([ |
||
10481 | rc(0, -1), |
||
10482 | rc(-1, 0) |
||
10483 | ]); |
||
10484 | } else if (direction.isForward(keycode) && shiftKey) { |
||
10485 | return update$1([ |
||
10486 | rc(0, +1), |
||
10487 | rc(+1, 0) |
||
10488 | ]); |
||
679 | daniel-mar | 10489 | } else if (isNavigation(keycode) && !shiftKey) { |
597 | daniel-mar | 10490 | return clearToNavigate; |
10491 | } else { |
||
10492 | return Optional.none; |
||
10493 | } |
||
10494 | }); |
||
10495 | return handler(); |
||
10496 | }; |
||
10497 | var keyup = function (event, start, soffset, finish, foffset) { |
||
637 | daniel-mar | 10498 | return retrieve$1(container, annotations.selectedSelector).fold(function () { |
597 | daniel-mar | 10499 | var realEvent = event.raw; |
10500 | var keycode = realEvent.which; |
||
10501 | var shiftKey = realEvent.shiftKey === true; |
||
679 | daniel-mar | 10502 | if (!shiftKey) { |
597 | daniel-mar | 10503 | return Optional.none(); |
10504 | } |
||
10505 | if (isNavigation(keycode)) { |
||
10506 | return sync(container, isRoot, start, soffset, finish, foffset, annotations.selectRange); |
||
10507 | } else { |
||
10508 | return Optional.none(); |
||
10509 | } |
||
10510 | }, Optional.none); |
||
10511 | }; |
||
10512 | return { |
||
10513 | keydown: keydown, |
||
10514 | keyup: keyup |
||
10515 | }; |
||
10516 | }; |
||
10517 | var external = function (win, container, isRoot, annotations) { |
||
10518 | var bridge = WindowBridge(win); |
||
10519 | return function (start, finish) { |
||
10520 | annotations.clearBeforeUpdate(container); |
||
10521 | identify(start, finish, isRoot).each(function (cellSel) { |
||
10522 | var boxes = cellSel.boxes.getOr([]); |
||
10523 | annotations.selectRange(container, boxes, cellSel.start, cellSel.finish); |
||
10524 | bridge.selectContents(finish); |
||
10525 | bridge.collapseSelection(); |
||
10526 | }); |
||
10527 | }; |
||
10528 | }; |
||
10529 | |||
637 | daniel-mar | 10530 | var remove = function (element, classes) { |
10531 | each$2(classes, function (x) { |
||
10532 | remove$2(element, x); |
||
597 | daniel-mar | 10533 | }); |
10534 | }; |
||
10535 | |||
10536 | var addClass = function (clazz) { |
||
10537 | return function (element) { |
||
637 | daniel-mar | 10538 | add(element, clazz); |
597 | daniel-mar | 10539 | }; |
10540 | }; |
||
10541 | var removeClasses = function (classes) { |
||
10542 | return function (element) { |
||
637 | daniel-mar | 10543 | remove(element, classes); |
597 | daniel-mar | 10544 | }; |
10545 | }; |
||
10546 | |||
10547 | var byClass = function (ephemera) { |
||
10548 | var addSelectionClass = addClass(ephemera.selected); |
||
10549 | var removeSelectionClasses = removeClasses([ |
||
10550 | ephemera.selected, |
||
10551 | ephemera.lastSelected, |
||
10552 | ephemera.firstSelected |
||
10553 | ]); |
||
10554 | var clear = function (container) { |
||
637 | daniel-mar | 10555 | var sels = descendants(container, ephemera.selectedSelector); |
10556 | each$2(sels, removeSelectionClasses); |
||
597 | daniel-mar | 10557 | }; |
10558 | var selectRange = function (container, cells, start, finish) { |
||
10559 | clear(container); |
||
637 | daniel-mar | 10560 | each$2(cells, addSelectionClass); |
10561 | add(start, ephemera.firstSelected); |
||
10562 | add(finish, ephemera.lastSelected); |
||
597 | daniel-mar | 10563 | }; |
10564 | return { |
||
10565 | clearBeforeUpdate: clear, |
||
10566 | clear: clear, |
||
10567 | selectRange: selectRange, |
||
10568 | selectedSelector: ephemera.selectedSelector, |
||
10569 | firstSelectedSelector: ephemera.firstSelectedSelector, |
||
10570 | lastSelectedSelector: ephemera.lastSelectedSelector |
||
10571 | }; |
||
10572 | }; |
||
10573 | var byAttr = function (ephemera, onSelection, onClear) { |
||
10574 | var removeSelectionAttributes = function (element) { |
||
637 | daniel-mar | 10575 | remove$7(element, ephemera.selected); |
10576 | remove$7(element, ephemera.firstSelected); |
||
10577 | remove$7(element, ephemera.lastSelected); |
||
597 | daniel-mar | 10578 | }; |
10579 | var addSelectionAttribute = function (element) { |
||
637 | daniel-mar | 10580 | set$2(element, ephemera.selected, '1'); |
597 | daniel-mar | 10581 | }; |
10582 | var clear = function (container) { |
||
10583 | clearBeforeUpdate(container); |
||
10584 | onClear(); |
||
10585 | }; |
||
10586 | var clearBeforeUpdate = function (container) { |
||
679 | daniel-mar | 10587 | var sels = descendants(container, ephemera.selectedSelector + ',' + ephemera.firstSelectedSelector + ',' + ephemera.lastSelectedSelector); |
637 | daniel-mar | 10588 | each$2(sels, removeSelectionAttributes); |
597 | daniel-mar | 10589 | }; |
10590 | var selectRange = function (container, cells, start, finish) { |
||
10591 | clear(container); |
||
637 | daniel-mar | 10592 | each$2(cells, addSelectionAttribute); |
10593 | set$2(start, ephemera.firstSelected, '1'); |
||
10594 | set$2(finish, ephemera.lastSelected, '1'); |
||
597 | daniel-mar | 10595 | onSelection(cells, start, finish); |
10596 | }; |
||
10597 | return { |
||
10598 | clearBeforeUpdate: clearBeforeUpdate, |
||
10599 | clear: clear, |
||
10600 | selectRange: selectRange, |
||
10601 | selectedSelector: ephemera.selectedSelector, |
||
10602 | firstSelectedSelector: ephemera.firstSelectedSelector, |
||
10603 | lastSelectedSelector: ephemera.lastSelectedSelector |
||
10604 | }; |
||
10605 | }; |
||
10606 | var SelectionAnnotation = { |
||
10607 | byClass: byClass, |
||
10608 | byAttr: byAttr |
||
10609 | }; |
||
10610 | |||
637 | daniel-mar | 10611 | var getUpOrLeftCells = function (grid, selectedCells) { |
597 | daniel-mar | 10612 | var upGrid = grid.slice(0, selectedCells[selectedCells.length - 1].row + 1); |
637 | daniel-mar | 10613 | var upDetails = toDetailList(upGrid); |
10614 | return bind$2(upDetails, function (detail) { |
||
597 | daniel-mar | 10615 | var slicedCells = detail.cells.slice(0, selectedCells[selectedCells.length - 1].column + 1); |
637 | daniel-mar | 10616 | return map$1(slicedCells, function (cell) { |
597 | daniel-mar | 10617 | return cell.element; |
10618 | }); |
||
10619 | }); |
||
10620 | }; |
||
637 | daniel-mar | 10621 | var getDownOrRightCells = function (grid, selectedCells) { |
597 | daniel-mar | 10622 | var downGrid = grid.slice(selectedCells[0].row + selectedCells[0].rowspan - 1, grid.length); |
637 | daniel-mar | 10623 | var downDetails = toDetailList(downGrid); |
10624 | return bind$2(downDetails, function (detail) { |
||
597 | daniel-mar | 10625 | var slicedCells = detail.cells.slice(selectedCells[0].column + selectedCells[0].colspan - 1, detail.cells.length); |
637 | daniel-mar | 10626 | return map$1(slicedCells, function (cell) { |
597 | daniel-mar | 10627 | return cell.element; |
10628 | }); |
||
10629 | }); |
||
10630 | }; |
||
10631 | var getOtherCells = function (table, target, generators) { |
||
10632 | var warehouse = Warehouse.fromTable(table); |
||
10633 | var details = onCells(warehouse, target); |
||
10634 | return details.map(function (selectedCells) { |
||
10635 | var grid = toGrid(warehouse, generators, false); |
||
637 | daniel-mar | 10636 | var upOrLeftCells = getUpOrLeftCells(grid, selectedCells); |
10637 | var downOrRightCells = getDownOrRightCells(grid, selectedCells); |
||
597 | daniel-mar | 10638 | return { |
10639 | upOrLeftCells: upOrLeftCells, |
||
10640 | downOrRightCells: downOrRightCells |
||
10641 | }; |
||
10642 | }); |
||
10643 | }; |
||
10644 | |||
637 | daniel-mar | 10645 | var global = tinymce.util.Tools.resolve('tinymce.Env'); |
10646 | |||
597 | daniel-mar | 10647 | var hasInternalTarget = function (e) { |
637 | daniel-mar | 10648 | return has(SugarElement.fromDom(e.target), 'ephox-snooker-resizer-bar') === false; |
597 | daniel-mar | 10649 | }; |
10650 | function CellSelection (editor, lazyResize, selectionTargets) { |
||
10651 | var onSelection = function (cells, start, finish) { |
||
10652 | selectionTargets.targets().each(function (targets) { |
||
10653 | var tableOpt = table(start); |
||
10654 | tableOpt.each(function (table) { |
||
10655 | var cloneFormats = getCloneElements(editor); |
||
10656 | var generators = cellOperations(noop, SugarElement.fromDom(editor.getDoc()), cloneFormats); |
||
10657 | var otherCells = getOtherCells(table, targets, generators); |
||
10658 | fireTableSelectionChange(editor, cells, start, finish, otherCells); |
||
10659 | }); |
||
10660 | }); |
||
10661 | }; |
||
10662 | var onClear = function () { |
||
10663 | return fireTableSelectionClear(editor); |
||
10664 | }; |
||
10665 | var annotations = SelectionAnnotation.byAttr(ephemera, onSelection, onClear); |
||
10666 | editor.on('init', function (_e) { |
||
10667 | var win = editor.getWin(); |
||
637 | daniel-mar | 10668 | var body = getBody(editor); |
597 | daniel-mar | 10669 | var isRoot = getIsRoot(editor); |
10670 | var syncSelection = function () { |
||
10671 | var sel = editor.selection; |
||
10672 | var start = SugarElement.fromDom(sel.getStart()); |
||
10673 | var end = SugarElement.fromDom(sel.getEnd()); |
||
637 | daniel-mar | 10674 | var shared = sharedOne(table, [ |
597 | daniel-mar | 10675 | start, |
10676 | end |
||
10677 | ]); |
||
10678 | shared.fold(function () { |
||
10679 | return annotations.clear(body); |
||
10680 | }, noop); |
||
10681 | }; |
||
10682 | var mouseHandlers = mouse(win, body, isRoot, annotations); |
||
10683 | var keyHandlers = keyboard(win, body, isRoot, annotations); |
||
10684 | var external$1 = external(win, body, isRoot, annotations); |
||
10685 | var hasShiftKey = function (event) { |
||
10686 | return event.raw.shiftKey === true; |
||
10687 | }; |
||
10688 | editor.on('TableSelectorChange', function (e) { |
||
10689 | return external$1(e.start, e.finish); |
||
10690 | }); |
||
10691 | var handleResponse = function (event, response) { |
||
10692 | if (!hasShiftKey(event)) { |
||
10693 | return; |
||
10694 | } |
||
10695 | if (response.kill) { |
||
10696 | event.kill(); |
||
10697 | } |
||
10698 | response.selection.each(function (ns) { |
||
10699 | var relative = SimSelection.relative(ns.start, ns.finish); |
||
10700 | var rng = asLtrRange(win, relative); |
||
10701 | editor.selection.setRng(rng); |
||
10702 | }); |
||
10703 | }; |
||
10704 | var keyup = function (event) { |
||
637 | daniel-mar | 10705 | var wrappedEvent = fromRawEvent(event); |
597 | daniel-mar | 10706 | if (wrappedEvent.raw.shiftKey && isNavigation(wrappedEvent.raw.which)) { |
10707 | var rng = editor.selection.getRng(); |
||
10708 | var start = SugarElement.fromDom(rng.startContainer); |
||
10709 | var end = SugarElement.fromDom(rng.endContainer); |
||
10710 | keyHandlers.keyup(wrappedEvent, start, rng.startOffset, end, rng.endOffset).each(function (response) { |
||
10711 | handleResponse(wrappedEvent, response); |
||
10712 | }); |
||
10713 | } |
||
10714 | }; |
||
10715 | var keydown = function (event) { |
||
637 | daniel-mar | 10716 | var wrappedEvent = fromRawEvent(event); |
597 | daniel-mar | 10717 | lazyResize().each(function (resize) { |
10718 | return resize.hideBars(); |
||
10719 | }); |
||
10720 | var rng = editor.selection.getRng(); |
||
10721 | var start = SugarElement.fromDom(rng.startContainer); |
||
10722 | var end = SugarElement.fromDom(rng.endContainer); |
||
637 | daniel-mar | 10723 | var direction = onDirection(ltr, rtl)(SugarElement.fromDom(editor.selection.getStart())); |
597 | daniel-mar | 10724 | keyHandlers.keydown(wrappedEvent, start, rng.startOffset, end, rng.endOffset, direction).each(function (response) { |
10725 | handleResponse(wrappedEvent, response); |
||
10726 | }); |
||
10727 | lazyResize().each(function (resize) { |
||
10728 | return resize.showBars(); |
||
10729 | }); |
||
10730 | }; |
||
10731 | var isLeftMouse = function (raw) { |
||
10732 | return raw.button === 0; |
||
10733 | }; |
||
10734 | var isLeftButtonPressed = function (raw) { |
||
10735 | if (raw.buttons === undefined) { |
||
10736 | return true; |
||
10737 | } |
||
637 | daniel-mar | 10738 | if (global.browser.isEdge() && raw.buttons === 0) { |
597 | daniel-mar | 10739 | return true; |
10740 | } |
||
10741 | return (raw.buttons & 1) !== 0; |
||
10742 | }; |
||
10743 | var dragStart = function (_e) { |
||
10744 | mouseHandlers.clearstate(); |
||
10745 | }; |
||
10746 | var mouseDown = function (e) { |
||
10747 | if (isLeftMouse(e) && hasInternalTarget(e)) { |
||
637 | daniel-mar | 10748 | mouseHandlers.mousedown(fromRawEvent(e)); |
597 | daniel-mar | 10749 | } |
10750 | }; |
||
10751 | var mouseOver = function (e) { |
||
10752 | if (isLeftButtonPressed(e) && hasInternalTarget(e)) { |
||
637 | daniel-mar | 10753 | mouseHandlers.mouseover(fromRawEvent(e)); |
597 | daniel-mar | 10754 | } |
10755 | }; |
||
10756 | var mouseUp = function (e) { |
||
10757 | if (isLeftMouse(e) && hasInternalTarget(e)) { |
||
637 | daniel-mar | 10758 | mouseHandlers.mouseup(fromRawEvent(e)); |
597 | daniel-mar | 10759 | } |
10760 | }; |
||
10761 | var getDoubleTap = function () { |
||
10762 | var lastTarget = Cell(SugarElement.fromDom(body)); |
||
10763 | var lastTimeStamp = Cell(0); |
||
10764 | var touchEnd = function (t) { |
||
10765 | var target = SugarElement.fromDom(t.target); |
||
10766 | if (name(target) === 'td' || name(target) === 'th') { |
||
10767 | var lT = lastTarget.get(); |
||
10768 | var lTS = lastTimeStamp.get(); |
||
10769 | if (eq$1(lT, target) && t.timeStamp - lTS < 300) { |
||
10770 | t.preventDefault(); |
||
10771 | external$1(target, target); |
||
10772 | } |
||
10773 | } |
||
10774 | lastTarget.set(target); |
||
10775 | lastTimeStamp.set(t.timeStamp); |
||
10776 | }; |
||
10777 | return { touchEnd: touchEnd }; |
||
10778 | }; |
||
10779 | var doubleTap = getDoubleTap(); |
||
10780 | editor.on('dragstart', dragStart); |
||
10781 | editor.on('mousedown', mouseDown); |
||
10782 | editor.on('mouseover', mouseOver); |
||
10783 | editor.on('mouseup', mouseUp); |
||
10784 | editor.on('touchend', doubleTap.touchEnd); |
||
10785 | editor.on('keyup', keyup); |
||
10786 | editor.on('keydown', keydown); |
||
10787 | editor.on('NodeChange', syncSelection); |
||
10788 | }); |
||
10789 | return { clear: annotations.clear }; |
||
10790 | } |
||
10791 | |||
637 | daniel-mar | 10792 | var child = function (scope, selector) { |
10793 | return child$1(scope, selector).isSome(); |
||
10794 | }; |
||
10795 | |||
597 | daniel-mar | 10796 | var getSelectionTargets = function (editor, selections) { |
10797 | var targets = Cell(Optional.none()); |
||
10798 | var changeHandlers = Cell([]); |
||
10799 | var selectionDetails = Optional.none(); |
||
10800 | var isCaption = isTag('caption'); |
||
10801 | var isDisabledForSelection = function (key) { |
||
10802 | return selectionDetails.forall(function (details) { |
||
10803 | return !details[key]; |
||
10804 | }); |
||
10805 | }; |
||
637 | daniel-mar | 10806 | var getStart = function () { |
10807 | return getSelectionCellOrCaption(getSelectionStart(editor), getIsRoot(editor)); |
||
10808 | }; |
||
10809 | var getEnd = function () { |
||
10810 | return getSelectionCellOrCaption(getSelectionEnd(editor), getIsRoot(editor)); |
||
10811 | }; |
||
597 | daniel-mar | 10812 | var findTargets = function () { |
637 | daniel-mar | 10813 | return getStart().bind(function (startCellOrCaption) { |
10814 | return flatten(lift2(table(startCellOrCaption), getEnd().bind(table), function (startTable, endTable) { |
||
10815 | if (eq$1(startTable, endTable)) { |
||
10816 | if (isCaption(startCellOrCaption)) { |
||
10817 | return Optional.some(noMenu(startCellOrCaption)); |
||
10818 | } else { |
||
10819 | return Optional.some(forMenu(selections, startTable, startCellOrCaption)); |
||
10820 | } |
||
597 | daniel-mar | 10821 | } |
637 | daniel-mar | 10822 | return Optional.none(); |
10823 | })); |
||
597 | daniel-mar | 10824 | }); |
10825 | }; |
||
10826 | var getExtractedDetails = function (targets) { |
||
10827 | var tableOpt = table(targets.element); |
||
10828 | return tableOpt.map(function (table) { |
||
10829 | var warehouse = Warehouse.fromTable(table); |
||
10830 | var selectedCells = onCells(warehouse, targets).getOr([]); |
||
10831 | var locked = foldl(selectedCells, function (acc, cell) { |
||
10832 | if (cell.isLocked) { |
||
10833 | acc.onAny = true; |
||
10834 | if (cell.column === 0) { |
||
10835 | acc.onFirst = true; |
||
10836 | } else if (cell.column + cell.colspan >= warehouse.grid.columns) { |
||
10837 | acc.onLast = true; |
||
10838 | } |
||
10839 | } |
||
10840 | return acc; |
||
10841 | }, { |
||
10842 | onAny: false, |
||
10843 | onFirst: false, |
||
10844 | onLast: false |
||
10845 | }); |
||
10846 | return { |
||
10847 | mergeable: onUnlockedMergable(warehouse, targets).isSome(), |
||
10848 | unmergeable: onUnlockedUnmergable(warehouse, targets).isSome(), |
||
10849 | locked: locked |
||
10850 | }; |
||
10851 | }); |
||
10852 | }; |
||
10853 | var resetTargets = function () { |
||
10854 | targets.set(cached(findTargets)()); |
||
10855 | selectionDetails = targets.get().bind(getExtractedDetails); |
||
637 | daniel-mar | 10856 | each$2(changeHandlers.get(), function (handler) { |
597 | daniel-mar | 10857 | return handler(); |
10858 | }); |
||
10859 | }; |
||
637 | daniel-mar | 10860 | var setupHandler = function (handler) { |
597 | daniel-mar | 10861 | handler(); |
10862 | changeHandlers.set(changeHandlers.get().concat([handler])); |
||
10863 | return function () { |
||
637 | daniel-mar | 10864 | changeHandlers.set(filter$2(changeHandlers.get(), function (h) { |
597 | daniel-mar | 10865 | return h !== handler; |
10866 | })); |
||
10867 | }; |
||
10868 | }; |
||
637 | daniel-mar | 10869 | var onSetup = function (api, isDisabled) { |
10870 | return setupHandler(function () { |
||
10871 | return targets.get().fold(function () { |
||
10872 | api.setDisabled(true); |
||
10873 | }, function (targets) { |
||
10874 | api.setDisabled(isDisabled(targets)); |
||
10875 | }); |
||
10876 | }); |
||
10877 | }; |
||
10878 | var onSetupWithToggle = function (api, isDisabled, isActive) { |
||
10879 | return setupHandler(function () { |
||
10880 | return targets.get().fold(function () { |
||
10881 | api.setDisabled(true); |
||
10882 | api.setActive(false); |
||
10883 | }, function (targets) { |
||
10884 | api.setDisabled(isDisabled(targets)); |
||
10885 | api.setActive(isActive(targets)); |
||
10886 | }); |
||
10887 | }); |
||
10888 | }; |
||
597 | daniel-mar | 10889 | var isDisabledFromLocked = function (lockedDisable) { |
10890 | return selectionDetails.exists(function (details) { |
||
10891 | return details.locked[lockedDisable]; |
||
10892 | }); |
||
10893 | }; |
||
10894 | var onSetupTable = function (api) { |
||
10895 | return onSetup(api, function (_) { |
||
10896 | return false; |
||
10897 | }); |
||
10898 | }; |
||
10899 | var onSetupCellOrRow = function (api) { |
||
10900 | return onSetup(api, function (targets) { |
||
10901 | return isCaption(targets.element); |
||
10902 | }); |
||
10903 | }; |
||
10904 | var onSetupColumn = function (lockedDisable) { |
||
10905 | return function (api) { |
||
10906 | return onSetup(api, function (targets) { |
||
10907 | return isCaption(targets.element) || isDisabledFromLocked(lockedDisable); |
||
10908 | }); |
||
10909 | }; |
||
10910 | }; |
||
10911 | var onSetupPasteable = function (getClipboardData) { |
||
10912 | return function (api) { |
||
10913 | return onSetup(api, function (targets) { |
||
10914 | return isCaption(targets.element) || getClipboardData().isNone(); |
||
10915 | }); |
||
10916 | }; |
||
10917 | }; |
||
10918 | var onSetupPasteableColumn = function (getClipboardData, lockedDisable) { |
||
10919 | return function (api) { |
||
10920 | return onSetup(api, function (targets) { |
||
10921 | return isCaption(targets.element) || getClipboardData().isNone() || isDisabledFromLocked(lockedDisable); |
||
10922 | }); |
||
10923 | }; |
||
10924 | }; |
||
10925 | var onSetupMergeable = function (api) { |
||
10926 | return onSetup(api, function (_targets) { |
||
10927 | return isDisabledForSelection('mergeable'); |
||
10928 | }); |
||
10929 | }; |
||
10930 | var onSetupUnmergeable = function (api) { |
||
10931 | return onSetup(api, function (_targets) { |
||
10932 | return isDisabledForSelection('unmergeable'); |
||
10933 | }); |
||
10934 | }; |
||
637 | daniel-mar | 10935 | var onSetupTableWithCaption = function (api) { |
10936 | return onSetupWithToggle(api, never, function (targets) { |
||
10937 | var tableOpt = table(targets.element, getIsRoot(editor)); |
||
10938 | return tableOpt.exists(function (table) { |
||
10939 | return child(table, 'caption'); |
||
10940 | }); |
||
10941 | }); |
||
10942 | }; |
||
10943 | var onSetupTableHeaders = function (command, headerType) { |
||
10944 | return function (api) { |
||
10945 | return onSetupWithToggle(api, function (targets) { |
||
10946 | return isCaption(targets.element); |
||
10947 | }, function () { |
||
10948 | return editor.queryCommandValue(command) === headerType; |
||
10949 | }); |
||
10950 | }; |
||
10951 | }; |
||
10952 | var onSetupTableRowHeaders = onSetupTableHeaders('mceTableRowType', 'header'); |
||
10953 | var onSetupTableColumnHeaders = onSetupTableHeaders('mceTableColType', 'th'); |
||
597 | daniel-mar | 10954 | editor.on('NodeChange ExecCommand TableSelectorChange', resetTargets); |
10955 | return { |
||
10956 | onSetupTable: onSetupTable, |
||
10957 | onSetupCellOrRow: onSetupCellOrRow, |
||
10958 | onSetupColumn: onSetupColumn, |
||
10959 | onSetupPasteable: onSetupPasteable, |
||
10960 | onSetupPasteableColumn: onSetupPasteableColumn, |
||
10961 | onSetupMergeable: onSetupMergeable, |
||
10962 | onSetupUnmergeable: onSetupUnmergeable, |
||
10963 | resetTargets: resetTargets, |
||
637 | daniel-mar | 10964 | onSetupTableWithCaption: onSetupTableWithCaption, |
10965 | onSetupTableRowHeaders: onSetupTableRowHeaders, |
||
10966 | onSetupTableColumnHeaders: onSetupTableColumnHeaders, |
||
10967 | targets: targets.get |
||
597 | daniel-mar | 10968 | }; |
10969 | }; |
||
10970 | |||
637 | daniel-mar | 10971 | var addButtons = function (editor, selections, selectionTargets, clipboard) { |
597 | daniel-mar | 10972 | editor.ui.registry.addMenuButton('table', { |
10973 | tooltip: 'Table', |
||
10974 | icon: 'table', |
||
10975 | fetch: function (callback) { |
||
10976 | return callback('inserttable | cell row column | advtablesort | tableprops deletetable'); |
||
10977 | } |
||
10978 | }); |
||
10979 | var cmd = function (command) { |
||
10980 | return function () { |
||
10981 | return editor.execCommand(command); |
||
10982 | }; |
||
10983 | }; |
||
10984 | editor.ui.registry.addButton('tableprops', { |
||
10985 | tooltip: 'Table properties', |
||
10986 | onAction: cmd('mceTableProps'), |
||
10987 | icon: 'table', |
||
10988 | onSetup: selectionTargets.onSetupTable |
||
10989 | }); |
||
10990 | editor.ui.registry.addButton('tabledelete', { |
||
10991 | tooltip: 'Delete table', |
||
10992 | onAction: cmd('mceTableDelete'), |
||
10993 | icon: 'table-delete-table', |
||
10994 | onSetup: selectionTargets.onSetupTable |
||
10995 | }); |
||
10996 | editor.ui.registry.addButton('tablecellprops', { |
||
10997 | tooltip: 'Cell properties', |
||
10998 | onAction: cmd('mceTableCellProps'), |
||
10999 | icon: 'table-cell-properties', |
||
11000 | onSetup: selectionTargets.onSetupCellOrRow |
||
11001 | }); |
||
11002 | editor.ui.registry.addButton('tablemergecells', { |
||
11003 | tooltip: 'Merge cells', |
||
11004 | onAction: cmd('mceTableMergeCells'), |
||
11005 | icon: 'table-merge-cells', |
||
11006 | onSetup: selectionTargets.onSetupMergeable |
||
11007 | }); |
||
11008 | editor.ui.registry.addButton('tablesplitcells', { |
||
11009 | tooltip: 'Split cell', |
||
11010 | onAction: cmd('mceTableSplitCells'), |
||
11011 | icon: 'table-split-cells', |
||
11012 | onSetup: selectionTargets.onSetupUnmergeable |
||
11013 | }); |
||
11014 | editor.ui.registry.addButton('tableinsertrowbefore', { |
||
11015 | tooltip: 'Insert row before', |
||
11016 | onAction: cmd('mceTableInsertRowBefore'), |
||
11017 | icon: 'table-insert-row-above', |
||
11018 | onSetup: selectionTargets.onSetupCellOrRow |
||
11019 | }); |
||
11020 | editor.ui.registry.addButton('tableinsertrowafter', { |
||
11021 | tooltip: 'Insert row after', |
||
11022 | onAction: cmd('mceTableInsertRowAfter'), |
||
11023 | icon: 'table-insert-row-after', |
||
11024 | onSetup: selectionTargets.onSetupCellOrRow |
||
11025 | }); |
||
11026 | editor.ui.registry.addButton('tabledeleterow', { |
||
11027 | tooltip: 'Delete row', |
||
11028 | onAction: cmd('mceTableDeleteRow'), |
||
11029 | icon: 'table-delete-row', |
||
11030 | onSetup: selectionTargets.onSetupCellOrRow |
||
11031 | }); |
||
11032 | editor.ui.registry.addButton('tablerowprops', { |
||
11033 | tooltip: 'Row properties', |
||
11034 | onAction: cmd('mceTableRowProps'), |
||
11035 | icon: 'table-row-properties', |
||
11036 | onSetup: selectionTargets.onSetupCellOrRow |
||
11037 | }); |
||
11038 | editor.ui.registry.addButton('tableinsertcolbefore', { |
||
11039 | tooltip: 'Insert column before', |
||
11040 | onAction: cmd('mceTableInsertColBefore'), |
||
11041 | icon: 'table-insert-column-before', |
||
11042 | onSetup: selectionTargets.onSetupColumn('onFirst') |
||
11043 | }); |
||
11044 | editor.ui.registry.addButton('tableinsertcolafter', { |
||
11045 | tooltip: 'Insert column after', |
||
11046 | onAction: cmd('mceTableInsertColAfter'), |
||
11047 | icon: 'table-insert-column-after', |
||
11048 | onSetup: selectionTargets.onSetupColumn('onLast') |
||
11049 | }); |
||
11050 | editor.ui.registry.addButton('tabledeletecol', { |
||
11051 | tooltip: 'Delete column', |
||
11052 | onAction: cmd('mceTableDeleteCol'), |
||
11053 | icon: 'table-delete-column', |
||
11054 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11055 | }); |
||
11056 | editor.ui.registry.addButton('tablecutrow', { |
||
11057 | tooltip: 'Cut row', |
||
11058 | icon: 'cut-row', |
||
11059 | onAction: cmd('mceTableCutRow'), |
||
11060 | onSetup: selectionTargets.onSetupCellOrRow |
||
11061 | }); |
||
11062 | editor.ui.registry.addButton('tablecopyrow', { |
||
11063 | tooltip: 'Copy row', |
||
11064 | icon: 'duplicate-row', |
||
11065 | onAction: cmd('mceTableCopyRow'), |
||
11066 | onSetup: selectionTargets.onSetupCellOrRow |
||
11067 | }); |
||
11068 | editor.ui.registry.addButton('tablepasterowbefore', { |
||
11069 | tooltip: 'Paste row before', |
||
11070 | icon: 'paste-row-before', |
||
11071 | onAction: cmd('mceTablePasteRowBefore'), |
||
11072 | onSetup: selectionTargets.onSetupPasteable(clipboard.getRows) |
||
11073 | }); |
||
11074 | editor.ui.registry.addButton('tablepasterowafter', { |
||
11075 | tooltip: 'Paste row after', |
||
11076 | icon: 'paste-row-after', |
||
11077 | onAction: cmd('mceTablePasteRowAfter'), |
||
11078 | onSetup: selectionTargets.onSetupPasteable(clipboard.getRows) |
||
11079 | }); |
||
11080 | editor.ui.registry.addButton('tablecutcol', { |
||
11081 | tooltip: 'Cut column', |
||
11082 | icon: 'cut-column', |
||
11083 | onAction: cmd('mceTableCutCol'), |
||
11084 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11085 | }); |
||
11086 | editor.ui.registry.addButton('tablecopycol', { |
||
11087 | tooltip: 'Copy column', |
||
11088 | icon: 'duplicate-column', |
||
11089 | onAction: cmd('mceTableCopyCol'), |
||
11090 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11091 | }); |
||
11092 | editor.ui.registry.addButton('tablepastecolbefore', { |
||
11093 | tooltip: 'Paste column before', |
||
11094 | icon: 'paste-column-before', |
||
11095 | onAction: cmd('mceTablePasteColBefore'), |
||
11096 | onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst') |
||
11097 | }); |
||
11098 | editor.ui.registry.addButton('tablepastecolafter', { |
||
11099 | tooltip: 'Paste column after', |
||
11100 | icon: 'paste-column-after', |
||
11101 | onAction: cmd('mceTablePasteColAfter'), |
||
11102 | onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast') |
||
11103 | }); |
||
11104 | editor.ui.registry.addButton('tableinsertdialog', { |
||
11105 | tooltip: 'Insert table', |
||
11106 | onAction: cmd('mceInsertTable'), |
||
11107 | icon: 'table' |
||
11108 | }); |
||
637 | daniel-mar | 11109 | var tableClassList = filterNoneItem(getTableClassList(editor)); |
11110 | if (tableClassList.length !== 0) { |
||
11111 | editor.ui.registry.addMenuButton('tableclass', { |
||
11112 | icon: 'table-classes', |
||
11113 | tooltip: 'Table styles', |
||
11114 | fetch: generateMenuItemsCallback(editor, selections, tableClassList, 'tableclass', function (value) { |
||
11115 | return editor.execCommand('mceTableToggleClass', false, value); |
||
11116 | }), |
||
11117 | onSetup: selectionTargets.onSetupTable |
||
11118 | }); |
||
11119 | } |
||
11120 | var tableCellClassList = filterNoneItem(getCellClassList(editor)); |
||
11121 | if (tableCellClassList.length !== 0) { |
||
11122 | editor.ui.registry.addMenuButton('tablecellclass', { |
||
11123 | icon: 'table-cell-classes', |
||
11124 | tooltip: 'Cell styles', |
||
11125 | fetch: generateMenuItemsCallback(editor, selections, tableCellClassList, 'tablecellclass', function (value) { |
||
11126 | return editor.execCommand('mceTableCellToggleClass', false, value); |
||
11127 | }), |
||
11128 | onSetup: selectionTargets.onSetupCellOrRow |
||
11129 | }); |
||
11130 | } |
||
11131 | editor.ui.registry.addMenuButton('tablecellvalign', { |
||
11132 | icon: 'vertical-align', |
||
11133 | tooltip: 'Vertical align', |
||
11134 | fetch: generateMenuItemsCallback(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align')), |
||
11135 | onSetup: selectionTargets.onSetupCellOrRow |
||
11136 | }); |
||
11137 | editor.ui.registry.addMenuButton('tablecellborderwidth', { |
||
11138 | icon: 'border-width', |
||
11139 | tooltip: 'Border width', |
||
11140 | fetch: generateMenuItemsCallback(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width')), |
||
11141 | onSetup: selectionTargets.onSetupCellOrRow |
||
11142 | }); |
||
11143 | editor.ui.registry.addMenuButton('tablecellborderstyle', { |
||
11144 | icon: 'border-style', |
||
11145 | tooltip: 'Border style', |
||
11146 | fetch: generateMenuItemsCallback(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style')), |
||
11147 | onSetup: selectionTargets.onSetupCellOrRow |
||
11148 | }); |
||
11149 | editor.ui.registry.addToggleButton('tablecaption', { |
||
11150 | tooltip: 'Table caption', |
||
11151 | onAction: cmd('mceTableToggleCaption'), |
||
11152 | icon: 'table-caption', |
||
11153 | onSetup: selectionTargets.onSetupTableWithCaption |
||
11154 | }); |
||
11155 | editor.ui.registry.addMenuButton('tablecellbackgroundcolor', { |
||
11156 | icon: 'cell-background-color', |
||
11157 | tooltip: 'Background color', |
||
11158 | fetch: function (callback) { |
||
11159 | return callback(buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color')); |
||
11160 | }, |
||
11161 | onSetup: selectionTargets.onSetupCellOrRow |
||
11162 | }); |
||
11163 | editor.ui.registry.addMenuButton('tablecellbordercolor', { |
||
11164 | icon: 'cell-border-color', |
||
11165 | tooltip: 'Border color', |
||
11166 | fetch: function (callback) { |
||
11167 | return callback(buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color')); |
||
11168 | }, |
||
11169 | onSetup: selectionTargets.onSetupCellOrRow |
||
11170 | }); |
||
11171 | editor.ui.registry.addToggleButton('tablerowheader', { |
||
11172 | tooltip: 'Row header', |
||
11173 | icon: 'table-top-header', |
||
11174 | onAction: changeRowHeader(editor), |
||
11175 | onSetup: selectionTargets.onSetupTableRowHeaders |
||
11176 | }); |
||
11177 | editor.ui.registry.addToggleButton('tablecolheader', { |
||
11178 | tooltip: 'Column header', |
||
11179 | icon: 'table-left-header', |
||
11180 | onAction: changeColumnHeader(editor), |
||
11181 | onSetup: selectionTargets.onSetupTableColumnHeaders |
||
11182 | }); |
||
597 | daniel-mar | 11183 | }; |
11184 | var addToolbars = function (editor) { |
||
11185 | var isTable = function (table) { |
||
11186 | return editor.dom.is(table, 'table') && editor.getBody().contains(table); |
||
11187 | }; |
||
11188 | var toolbar = getToolbar(editor); |
||
11189 | if (toolbar.length > 0) { |
||
11190 | editor.ui.registry.addContextToolbar('table', { |
||
11191 | predicate: isTable, |
||
11192 | items: toolbar, |
||
11193 | scope: 'node', |
||
11194 | position: 'node' |
||
11195 | }); |
||
11196 | } |
||
11197 | }; |
||
11198 | |||
637 | daniel-mar | 11199 | var addMenuItems = function (editor, selections, selectionTargets, clipboard) { |
597 | daniel-mar | 11200 | var cmd = function (command) { |
11201 | return function () { |
||
11202 | return editor.execCommand(command); |
||
11203 | }; |
||
11204 | }; |
||
11205 | var insertTableAction = function (data) { |
||
11206 | editor.execCommand('mceInsertTable', false, { |
||
11207 | rows: data.numRows, |
||
11208 | columns: data.numColumns |
||
11209 | }); |
||
11210 | }; |
||
11211 | var tableProperties = { |
||
11212 | text: 'Table properties', |
||
11213 | onSetup: selectionTargets.onSetupTable, |
||
11214 | onAction: cmd('mceTableProps') |
||
11215 | }; |
||
11216 | var deleteTable = { |
||
11217 | text: 'Delete table', |
||
11218 | icon: 'table-delete-table', |
||
11219 | onSetup: selectionTargets.onSetupTable, |
||
11220 | onAction: cmd('mceTableDelete') |
||
11221 | }; |
||
11222 | editor.ui.registry.addMenuItem('tableinsertrowbefore', { |
||
11223 | text: 'Insert row before', |
||
11224 | icon: 'table-insert-row-above', |
||
11225 | onAction: cmd('mceTableInsertRowBefore'), |
||
11226 | onSetup: selectionTargets.onSetupCellOrRow |
||
11227 | }); |
||
11228 | editor.ui.registry.addMenuItem('tableinsertrowafter', { |
||
11229 | text: 'Insert row after', |
||
11230 | icon: 'table-insert-row-after', |
||
11231 | onAction: cmd('mceTableInsertRowAfter'), |
||
11232 | onSetup: selectionTargets.onSetupCellOrRow |
||
11233 | }); |
||
11234 | editor.ui.registry.addMenuItem('tabledeleterow', { |
||
11235 | text: 'Delete row', |
||
11236 | icon: 'table-delete-row', |
||
11237 | onAction: cmd('mceTableDeleteRow'), |
||
11238 | onSetup: selectionTargets.onSetupCellOrRow |
||
11239 | }); |
||
11240 | editor.ui.registry.addMenuItem('tablerowprops', { |
||
11241 | text: 'Row properties', |
||
11242 | icon: 'table-row-properties', |
||
11243 | onAction: cmd('mceTableRowProps'), |
||
11244 | onSetup: selectionTargets.onSetupCellOrRow |
||
11245 | }); |
||
11246 | editor.ui.registry.addMenuItem('tablecutrow', { |
||
11247 | text: 'Cut row', |
||
11248 | icon: 'cut-row', |
||
11249 | onAction: cmd('mceTableCutRow'), |
||
11250 | onSetup: selectionTargets.onSetupCellOrRow |
||
11251 | }); |
||
11252 | editor.ui.registry.addMenuItem('tablecopyrow', { |
||
11253 | text: 'Copy row', |
||
11254 | icon: 'duplicate-row', |
||
11255 | onAction: cmd('mceTableCopyRow'), |
||
11256 | onSetup: selectionTargets.onSetupCellOrRow |
||
11257 | }); |
||
11258 | editor.ui.registry.addMenuItem('tablepasterowbefore', { |
||
11259 | text: 'Paste row before', |
||
11260 | icon: 'paste-row-before', |
||
11261 | onAction: cmd('mceTablePasteRowBefore'), |
||
11262 | onSetup: selectionTargets.onSetupPasteable(clipboard.getRows) |
||
11263 | }); |
||
11264 | editor.ui.registry.addMenuItem('tablepasterowafter', { |
||
11265 | text: 'Paste row after', |
||
11266 | icon: 'paste-row-after', |
||
11267 | onAction: cmd('mceTablePasteRowAfter'), |
||
11268 | onSetup: selectionTargets.onSetupPasteable(clipboard.getRows) |
||
11269 | }); |
||
11270 | var row = { |
||
11271 | type: 'nestedmenuitem', |
||
11272 | text: 'Row', |
||
637 | daniel-mar | 11273 | getSubmenuItems: constant('tableinsertrowbefore tableinsertrowafter tabledeleterow tablerowprops | tablecutrow tablecopyrow tablepasterowbefore tablepasterowafter') |
597 | daniel-mar | 11274 | }; |
11275 | editor.ui.registry.addMenuItem('tableinsertcolumnbefore', { |
||
11276 | text: 'Insert column before', |
||
11277 | icon: 'table-insert-column-before', |
||
11278 | onAction: cmd('mceTableInsertColBefore'), |
||
11279 | onSetup: selectionTargets.onSetupColumn('onFirst') |
||
11280 | }); |
||
11281 | editor.ui.registry.addMenuItem('tableinsertcolumnafter', { |
||
11282 | text: 'Insert column after', |
||
11283 | icon: 'table-insert-column-after', |
||
11284 | onAction: cmd('mceTableInsertColAfter'), |
||
11285 | onSetup: selectionTargets.onSetupColumn('onLast') |
||
11286 | }); |
||
11287 | editor.ui.registry.addMenuItem('tabledeletecolumn', { |
||
11288 | text: 'Delete column', |
||
11289 | icon: 'table-delete-column', |
||
11290 | onAction: cmd('mceTableDeleteCol'), |
||
11291 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11292 | }); |
||
11293 | editor.ui.registry.addMenuItem('tablecutcolumn', { |
||
11294 | text: 'Cut column', |
||
11295 | icon: 'cut-column', |
||
11296 | onAction: cmd('mceTableCutCol'), |
||
11297 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11298 | }); |
||
11299 | editor.ui.registry.addMenuItem('tablecopycolumn', { |
||
11300 | text: 'Copy column', |
||
11301 | icon: 'duplicate-column', |
||
11302 | onAction: cmd('mceTableCopyCol'), |
||
11303 | onSetup: selectionTargets.onSetupColumn('onAny') |
||
11304 | }); |
||
11305 | editor.ui.registry.addMenuItem('tablepastecolumnbefore', { |
||
11306 | text: 'Paste column before', |
||
11307 | icon: 'paste-column-before', |
||
11308 | onAction: cmd('mceTablePasteColBefore'), |
||
11309 | onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onFirst') |
||
11310 | }); |
||
11311 | editor.ui.registry.addMenuItem('tablepastecolumnafter', { |
||
11312 | text: 'Paste column after', |
||
11313 | icon: 'paste-column-after', |
||
11314 | onAction: cmd('mceTablePasteColAfter'), |
||
11315 | onSetup: selectionTargets.onSetupPasteableColumn(clipboard.getColumns, 'onLast') |
||
11316 | }); |
||
11317 | var column = { |
||
11318 | type: 'nestedmenuitem', |
||
11319 | text: 'Column', |
||
637 | daniel-mar | 11320 | getSubmenuItems: constant('tableinsertcolumnbefore tableinsertcolumnafter tabledeletecolumn | tablecutcolumn tablecopycolumn tablepastecolumnbefore tablepastecolumnafter') |
597 | daniel-mar | 11321 | }; |
11322 | editor.ui.registry.addMenuItem('tablecellprops', { |
||
11323 | text: 'Cell properties', |
||
11324 | icon: 'table-cell-properties', |
||
11325 | onAction: cmd('mceTableCellProps'), |
||
11326 | onSetup: selectionTargets.onSetupCellOrRow |
||
11327 | }); |
||
11328 | editor.ui.registry.addMenuItem('tablemergecells', { |
||
11329 | text: 'Merge cells', |
||
11330 | icon: 'table-merge-cells', |
||
11331 | onAction: cmd('mceTableMergeCells'), |
||
11332 | onSetup: selectionTargets.onSetupMergeable |
||
11333 | }); |
||
11334 | editor.ui.registry.addMenuItem('tablesplitcells', { |
||
11335 | text: 'Split cell', |
||
11336 | icon: 'table-split-cells', |
||
11337 | onAction: cmd('mceTableSplitCells'), |
||
11338 | onSetup: selectionTargets.onSetupUnmergeable |
||
11339 | }); |
||
11340 | var cell = { |
||
11341 | type: 'nestedmenuitem', |
||
11342 | text: 'Cell', |
||
637 | daniel-mar | 11343 | getSubmenuItems: constant('tablecellprops tablemergecells tablesplitcells') |
597 | daniel-mar | 11344 | }; |
11345 | if (hasTableGrid(editor) === false) { |
||
11346 | editor.ui.registry.addMenuItem('inserttable', { |
||
11347 | text: 'Table', |
||
11348 | icon: 'table', |
||
11349 | onAction: cmd('mceInsertTable') |
||
11350 | }); |
||
11351 | } else { |
||
11352 | editor.ui.registry.addNestedMenuItem('inserttable', { |
||
11353 | text: 'Table', |
||
11354 | icon: 'table', |
||
11355 | getSubmenuItems: function () { |
||
11356 | return [{ |
||
11357 | type: 'fancymenuitem', |
||
11358 | fancytype: 'inserttable', |
||
11359 | onAction: insertTableAction |
||
11360 | }]; |
||
11361 | } |
||
11362 | }); |
||
11363 | } |
||
11364 | editor.ui.registry.addMenuItem('inserttabledialog', { |
||
11365 | text: 'Insert table', |
||
11366 | icon: 'table', |
||
11367 | onAction: cmd('mceInsertTable') |
||
11368 | }); |
||
11369 | editor.ui.registry.addMenuItem('tableprops', tableProperties); |
||
11370 | editor.ui.registry.addMenuItem('deletetable', deleteTable); |
||
11371 | editor.ui.registry.addNestedMenuItem('row', row); |
||
11372 | editor.ui.registry.addNestedMenuItem('column', column); |
||
11373 | editor.ui.registry.addNestedMenuItem('cell', cell); |
||
11374 | editor.ui.registry.addContextMenu('table', { |
||
11375 | update: function () { |
||
11376 | selectionTargets.resetTargets(); |
||
637 | daniel-mar | 11377 | return selectionTargets.targets().fold(constant(''), function (targets) { |
597 | daniel-mar | 11378 | if (name(targets.element) === 'caption') { |
11379 | return 'tableprops deletetable'; |
||
11380 | } else { |
||
11381 | return 'cell row column | advtablesort | tableprops deletetable'; |
||
11382 | } |
||
11383 | }); |
||
11384 | } |
||
11385 | }); |
||
637 | daniel-mar | 11386 | var tableClassList = filterNoneItem(getTableClassList(editor)); |
11387 | if (tableClassList.length !== 0) { |
||
11388 | editor.ui.registry.addNestedMenuItem('tableclass', { |
||
11389 | icon: 'table-classes', |
||
11390 | text: 'Table styles', |
||
11391 | getSubmenuItems: function () { |
||
11392 | return buildMenuItems(editor, selections, tableClassList, 'tableclass', function (value) { |
||
11393 | return editor.execCommand('mceTableToggleClass', false, value); |
||
11394 | }); |
||
11395 | }, |
||
11396 | onSetup: selectionTargets.onSetupTable |
||
11397 | }); |
||
11398 | } |
||
11399 | var tableCellClassList = filterNoneItem(getCellClassList(editor)); |
||
11400 | if (tableCellClassList.length !== 0) { |
||
11401 | editor.ui.registry.addNestedMenuItem('tablecellclass', { |
||
11402 | icon: 'table-cell-classes', |
||
11403 | text: 'Cell styles', |
||
11404 | getSubmenuItems: function () { |
||
11405 | return buildMenuItems(editor, selections, tableCellClassList, 'tablecellclass', function (value) { |
||
11406 | return editor.execCommand('mceTableCellToggleClass', false, value); |
||
11407 | }); |
||
11408 | }, |
||
11409 | onSetup: selectionTargets.onSetupCellOrRow |
||
11410 | }); |
||
11411 | } |
||
11412 | editor.ui.registry.addNestedMenuItem('tablecellvalign', { |
||
11413 | icon: 'vertical-align', |
||
11414 | text: 'Vertical align', |
||
11415 | getSubmenuItems: function () { |
||
11416 | return buildMenuItems(editor, selections, verticalAlignValues, 'tablecellverticalalign', applyTableCellStyle(editor, 'vertical-align')); |
||
11417 | }, |
||
11418 | onSetup: selectionTargets.onSetupCellOrRow |
||
11419 | }); |
||
11420 | editor.ui.registry.addNestedMenuItem('tablecellborderwidth', { |
||
11421 | icon: 'border-width', |
||
11422 | text: 'Border width', |
||
11423 | getSubmenuItems: function () { |
||
11424 | return buildMenuItems(editor, selections, getTableBorderWidths(editor), 'tablecellborderwidth', applyTableCellStyle(editor, 'border-width')); |
||
11425 | }, |
||
11426 | onSetup: selectionTargets.onSetupCellOrRow |
||
11427 | }); |
||
11428 | editor.ui.registry.addNestedMenuItem('tablecellborderstyle', { |
||
11429 | icon: 'border-style', |
||
11430 | text: 'Border style', |
||
11431 | getSubmenuItems: function () { |
||
11432 | return buildMenuItems(editor, selections, getTableBorderStyles(editor), 'tablecellborderstyle', applyTableCellStyle(editor, 'border-style')); |
||
11433 | }, |
||
11434 | onSetup: selectionTargets.onSetupCellOrRow |
||
11435 | }); |
||
11436 | editor.ui.registry.addToggleMenuItem('tablecaption', { |
||
11437 | icon: 'table-caption', |
||
11438 | text: 'Table caption', |
||
11439 | onAction: cmd('mceTableToggleCaption'), |
||
11440 | onSetup: selectionTargets.onSetupTableWithCaption |
||
11441 | }); |
||
11442 | editor.ui.registry.addNestedMenuItem('tablecellbackgroundcolor', { |
||
11443 | icon: 'cell-background-color', |
||
11444 | text: 'Background color', |
||
11445 | getSubmenuItems: function () { |
||
11446 | return buildColorMenu(editor, getTableBackgroundColorMap(editor), 'background-color'); |
||
11447 | }, |
||
11448 | onSetup: selectionTargets.onSetupCellOrRow |
||
11449 | }); |
||
11450 | editor.ui.registry.addNestedMenuItem('tablecellbordercolor', { |
||
11451 | icon: 'cell-border-color', |
||
11452 | text: 'Border color', |
||
11453 | getSubmenuItems: function () { |
||
11454 | return buildColorMenu(editor, getTableBorderColorMap(editor), 'border-color'); |
||
11455 | }, |
||
11456 | onSetup: selectionTargets.onSetupCellOrRow |
||
11457 | }); |
||
11458 | editor.ui.registry.addToggleMenuItem('tablerowheader', { |
||
11459 | text: 'Row header', |
||
11460 | icon: 'table-top-header', |
||
11461 | onAction: changeRowHeader(editor), |
||
11462 | onSetup: selectionTargets.onSetupTableRowHeaders |
||
11463 | }); |
||
11464 | editor.ui.registry.addToggleMenuItem('tablecolheader', { |
||
11465 | text: 'Column header', |
||
11466 | icon: 'table-left-header', |
||
11467 | onAction: changeColumnHeader(editor), |
||
11468 | onSetup: selectionTargets.onSetupTableColumnHeaders |
||
11469 | }); |
||
597 | daniel-mar | 11470 | }; |
11471 | |||
11472 | var Plugin = function (editor) { |
||
11473 | var selections = Selections(function () { |
||
637 | daniel-mar | 11474 | return getBody(editor); |
597 | daniel-mar | 11475 | }, function () { |
637 | daniel-mar | 11476 | return getSelectionCell(getSelectionStart(editor), getIsRoot(editor)); |
597 | daniel-mar | 11477 | }, ephemera.selectedSelector); |
11478 | var selectionTargets = getSelectionTargets(editor, selections); |
||
11479 | var resizeHandler = getResizeHandler(editor); |
||
11480 | var cellSelection = CellSelection(editor, resizeHandler.lazyResize, selectionTargets); |
||
637 | daniel-mar | 11481 | var actions = TableActions(editor, cellSelection, resizeHandler.lazyWire); |
597 | daniel-mar | 11482 | var clipboard = Clipboard(); |
11483 | registerCommands(editor, actions, cellSelection, selections, clipboard); |
||
11484 | registerQueryCommands(editor, actions, selections); |
||
637 | daniel-mar | 11485 | registerEvents(editor, selections, actions); |
11486 | addMenuItems(editor, selections, selectionTargets, clipboard); |
||
11487 | addButtons(editor, selections, selectionTargets, clipboard); |
||
597 | daniel-mar | 11488 | addToolbars(editor); |
11489 | editor.on('PreInit', function () { |
||
11490 | editor.serializer.addTempAttr(ephemera.firstSelected); |
||
11491 | editor.serializer.addTempAttr(ephemera.lastSelected); |
||
11492 | registerFormats(editor); |
||
11493 | }); |
||
11494 | if (hasTabNavigation(editor)) { |
||
11495 | editor.on('keydown', function (e) { |
||
11496 | handle$1(e, editor, cellSelection); |
||
11497 | }); |
||
11498 | } |
||
11499 | editor.on('remove', function () { |
||
11500 | resizeHandler.destroy(); |
||
11501 | }); |
||
11502 | return getApi(editor, clipboard, resizeHandler, selectionTargets); |
||
11503 | }; |
||
11504 | function Plugin$1 () { |
||
637 | daniel-mar | 11505 | global$3.add('table', Plugin); |
597 | daniel-mar | 11506 | } |
11507 | |||
11508 | Plugin$1(); |
||
11509 | |||
11510 | }()); |