@pingux/astro 2.32.0-alpha.12 → 2.32.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/cjs/components/ImageUploadField/ImageUploadField.test.js +47 -14
  2. package/lib/cjs/components/TreeView/TreeView.js +99 -11
  3. package/lib/cjs/components/TreeView/TreeView.stories.js +23 -10
  4. package/lib/cjs/components/TreeView/TreeView.styles.js +22 -2
  5. package/lib/cjs/components/TreeView/TreeView.test.js +91 -11
  6. package/lib/cjs/components/TreeView/TreeViewItem.js +112 -14
  7. package/lib/cjs/components/TreeView/TreeViewKeyboardDelegate.js +200 -0
  8. package/lib/cjs/components/TreeView/TreeViewKeyboardDelegate.test.js +511 -0
  9. package/lib/cjs/components/TreeView/TreeViewRow.js +20 -5
  10. package/lib/cjs/components/TreeView/TreeViewSection.js +164 -16
  11. package/lib/cjs/components/TreeView/TreeViewWrapper.js +40 -0
  12. package/lib/cjs/hooks/useImageUploadState/index.d.ts +1 -0
  13. package/lib/cjs/hooks/useImageUploadState/useImageUploadState.d.ts +28 -0
  14. package/lib/cjs/hooks/useImageUploadState/useImageUploadState.js +9 -6
  15. package/lib/cjs/hooks/useModalState/index.d.ts +1 -0
  16. package/lib/cjs/hooks/useModalState/useModalState.d.ts +21 -0
  17. package/lib/cjs/hooks/useModalState/useModalState.js +0 -9
  18. package/lib/cjs/hooks/useModalState/useModalState.test.d.ts +1 -0
  19. package/lib/cjs/utils/testUtils/setupTests.d.ts +4 -0
  20. package/lib/cjs/utils/testUtils/testAxe.d.ts +2 -0
  21. package/lib/cjs/utils/testUtils/testTheme.d.ts +21 -0
  22. package/lib/cjs/utils/testUtils/testWrapper.d.ts +5 -0
  23. package/lib/cjs/utils/testUtils/testWrapper.js +3 -2
  24. package/lib/components/ImageUploadField/ImageUploadField.test.js +47 -14
  25. package/lib/components/TreeView/TreeView.js +100 -12
  26. package/lib/components/TreeView/TreeView.stories.js +23 -10
  27. package/lib/components/TreeView/TreeView.styles.js +22 -2
  28. package/lib/components/TreeView/TreeView.test.js +92 -12
  29. package/lib/components/TreeView/TreeViewItem.js +111 -14
  30. package/lib/components/TreeView/TreeViewKeyboardDelegate.js +176 -0
  31. package/lib/components/TreeView/TreeViewKeyboardDelegate.test.js +496 -0
  32. package/lib/components/TreeView/TreeViewRow.js +20 -5
  33. package/lib/components/TreeView/TreeViewSection.js +161 -16
  34. package/lib/components/TreeView/TreeViewWrapper.js +31 -0
  35. package/lib/hooks/useImageUploadState/useImageUploadState.js +9 -6
  36. package/lib/hooks/useModalState/useModalState.js +0 -10
  37. package/lib/utils/testUtils/testWrapper.js +3 -2
  38. package/package.json +1 -1
@@ -21,7 +21,7 @@ var _testAxe = _interopRequireDefault(require("../../utils/testUtils/testAxe"));
21
21
  var _testWrapper = require("../../utils/testUtils/testWrapper");
22
22
  var _ImageUploadField = _interopRequireDefault(require("./ImageUploadField"));
23
23
  var _react3 = require("@emotion/react");
24
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = _Object$defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof _Symbol ? _Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return _Object$defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = _Object$create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = _Object$getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(IteratorPrototype); function defineIteratorMethods(prototype) { var _context8; _forEachInstanceProperty(_context8 = ["next", "throw", "return"]).call(_context8, function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], _forEachInstanceProperty(tryLocsList).call(tryLocsList, pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = _Object$create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = _Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return _reverseInstanceProperty(keys).call(keys), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { var _context9; if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, _forEachInstanceProperty(_context9 = this.tryEntries).call(_context9, resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+_sliceInstanceProperty(name).call(name, 1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
24
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = _Object$defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof _Symbol ? _Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return _Object$defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = _Object$create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = _Object$getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(IteratorPrototype); function defineIteratorMethods(prototype) { var _context9; _forEachInstanceProperty(_context9 = ["next", "throw", "return"]).call(_context9, function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], _forEachInstanceProperty(tryLocsList).call(tryLocsList, pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = _Object$create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = _Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return _reverseInstanceProperty(keys).call(keys), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { var _context10; if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, _forEachInstanceProperty(_context10 = this.tryEntries).call(_context10, resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+_sliceInstanceProperty(name).call(name, 1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
25
25
  var imageUploadNoImagePreview = 'image-upload-no-image-preview';
26
26
  jest.mock('../Image', function () {
27
27
  return function (props) {
@@ -339,10 +339,43 @@ test('loader size can be changed via the prop', function () {
339
339
  'font-size': "".concat(testLoaderSize, "px")
340
340
  });
341
341
  });
342
- test('should show the menu if label clicked when preview image exists with custom uploads', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
343
- var customUploadProp, customRemoveProp, imagePreview;
342
+ test('should show the menu if label clicked when preview image exists', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
343
+ var imageUploadButton, imagePreview, imageUploadLabel;
344
344
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
345
345
  while (1) switch (_context6.prev = _context6.next) {
346
+ case 0:
347
+ getComponent();
348
+ imageUploadButton = _testWrapper.screen.getByTestId(testButtonId);
349
+ _userEvent["default"].click(imageUploadButton);
350
+ _react2.fireEvent.change(_testWrapper.screen.getByTestId('image-upload-input'), {
351
+ target: {
352
+ files: [file]
353
+ }
354
+ });
355
+ _context6.next = 6;
356
+ return _testWrapper.screen.findByTestId(imageUploadImagePreview);
357
+ case 6:
358
+ imagePreview = _context6.sent;
359
+ expect(imagePreview).toBeInTheDocument();
360
+ expect(imagePreview).toHaveAttribute('src');
361
+
362
+ // Click on the image preview button
363
+ imageUploadLabel = _testWrapper.screen.getByText(testLabel);
364
+ _react2.fireEvent.click(imageUploadLabel);
365
+ expect(_testWrapper.screen.getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'true');
366
+ expect(_testWrapper.screen.getByRole('menu')).toBeInTheDocument();
367
+ expect(_testWrapper.screen.getByText('Upload New Image')).toBeInTheDocument();
368
+ expect(_testWrapper.screen.getByText('Remove Image')).toBeInTheDocument();
369
+ case 15:
370
+ case "end":
371
+ return _context6.stop();
372
+ }
373
+ }, _callee6);
374
+ })));
375
+ test('should show the menu if label clicked when preview image exists with custom uploads', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
376
+ var customUploadProp, customRemoveProp, imagePreview;
377
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
378
+ while (1) switch (_context7.prev = _context7.next) {
346
379
  case 0:
347
380
  customUploadProp = 'Custom Upload';
348
381
  customRemoveProp = 'Custom Remove';
@@ -355,10 +388,10 @@ test('should show the menu if label clicked when preview image exists with custo
355
388
  files: [file]
356
389
  }
357
390
  });
358
- _context6.next = 6;
391
+ _context7.next = 6;
359
392
  return _testWrapper.screen.findByTestId(imageUploadImagePreview);
360
393
  case 6:
361
- imagePreview = _context6.sent;
394
+ imagePreview = _context7.sent;
362
395
  expect(imagePreview).toBeInTheDocument();
363
396
  expect(imagePreview).toHaveAttribute('src');
364
397
 
@@ -368,9 +401,9 @@ test('should show the menu if label clicked when preview image exists with custo
368
401
  expect(_testWrapper.screen.getByText(customRemoveProp)).toBeInTheDocument();
369
402
  case 12:
370
403
  case "end":
371
- return _context6.stop();
404
+ return _context7.stop();
372
405
  }
373
- }, _callee6);
406
+ }, _callee7);
374
407
  })));
375
408
  test('should render node element if passed as default image', function () {
376
409
  getComponent({
@@ -382,10 +415,10 @@ test('should render node element if passed as default image', function () {
382
415
  expect(img).toBeInstanceOf(HTMLImageElement);
383
416
  expect(img).toBeInTheDocument();
384
417
  });
385
- test('should implement popover menu props', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
418
+ test('should implement popover menu props', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
386
419
  var imagePreview;
387
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
388
- while (1) switch (_context7.prev = _context7.next) {
420
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
421
+ while (1) switch (_context8.prev = _context8.next) {
389
422
  case 0:
390
423
  getComponent({
391
424
  popoverMenuProps: {
@@ -397,10 +430,10 @@ test('should implement popover menu props', /*#__PURE__*/(0, _asyncToGenerator2[
397
430
  files: [file]
398
431
  }
399
432
  });
400
- _context7.next = 4;
433
+ _context8.next = 4;
401
434
  return _testWrapper.screen.findByTestId(imageUploadImagePreview);
402
435
  case 4:
403
- imagePreview = _context7.sent;
436
+ imagePreview = _context8.sent;
404
437
  expect(imagePreview).toBeInTheDocument();
405
438
  expect(imagePreview).toHaveAttribute('src');
406
439
 
@@ -411,7 +444,7 @@ test('should implement popover menu props', /*#__PURE__*/(0, _asyncToGenerator2[
411
444
  expect(_testWrapper.screen.getByRole('presentation')).toHaveAttribute('data-popover-placement', 'right');
412
445
  case 11:
413
446
  case "end":
414
- return _context7.stop();
447
+ return _context8.stop();
415
448
  }
416
- }, _callee7);
449
+ }, _callee8);
417
450
  })));
@@ -20,6 +20,7 @@ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable
20
20
  var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
21
21
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
22
22
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
23
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
23
24
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
24
25
  var _react = _interopRequireWildcard(require("react"));
25
26
  var _reactStately = require("react-stately");
@@ -30,8 +31,9 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
30
31
  var _TreeViewContext = require("../../context/TreeViewContext");
31
32
  var _index = require("../../index");
32
33
  var _isIterable = require("../../utils/devUtils/props/isIterable");
34
+ var _TreeViewWrapper = _interopRequireDefault(require("./TreeViewWrapper"));
33
35
  var _react2 = require("@emotion/react");
34
- var _excluded = ["tree", "disabledKeys", "onExpandedChange"]; // split out and exported for ease of use across components
36
+ var _excluded = ["tree", "disabledKeys", "onExpandedChange", "onKeyDown", "pageLength"]; // split out and exported for ease of use across components
35
37
  // and to facilitate easier testing (eliminates redundant conditional renders)
36
38
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
37
39
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -57,11 +59,23 @@ function useTreeViewLayout(state) {
57
59
  return layout;
58
60
  }
59
61
  var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
60
- var _context;
62
+ var _tree$items$, _context;
61
63
  var tree = props.tree,
62
64
  disabledKeys = props.disabledKeys,
63
65
  onExpandedChange = props.onExpandedChange,
66
+ onKeyDown = props.onKeyDown,
67
+ _props$pageLength = props.pageLength,
68
+ pageLength = _props$pageLength === void 0 ? 5 : _props$pageLength,
64
69
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
70
+
71
+ // we are tracking the last focused item.
72
+ // this enables us to have focus jump back to the item, after focus
73
+ // leaves the tree, and then returns.
74
+ var _useState = (0, _react.useState)(tree === null || tree === void 0 || (_tree$items$ = tree.items[0]) === null || _tree$items$ === void 0 ? void 0 : _tree$items$.key),
75
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
76
+ lastFocusedItem = _useState2[0],
77
+ setLastFocusedItem = _useState2[1];
78
+ var level = 0;
65
79
  var treeViewRef = (0, _react.useRef)();
66
80
  var selectedKeys = tree.selectedKeys;
67
81
 
@@ -76,7 +90,66 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
76
90
  selectionMode: 'single',
77
91
  disallowEmptySelection: true
78
92
  }, others));
79
- var level = 0;
93
+ var flattenNestedData = function flattenNestedData(_data) {
94
+ var returnArray = [];
95
+ var checkItemNesting = function checkItemNesting(item) {
96
+ var _item$value, _item$items;
97
+ if (((_item$value = item.value) === null || _item$value === void 0 || (_item$value = _item$value.items) === null || _item$value === void 0 ? void 0 : _item$value.length) > 0) {
98
+ return {
99
+ isTopLevel: true,
100
+ hasChildren: true
101
+ };
102
+ }
103
+ if (((_item$items = item.items) === null || _item$items === void 0 ? void 0 : _item$items.length) > 0) {
104
+ return {
105
+ isTopLevel: false,
106
+ hasChildren: true
107
+ };
108
+ }
109
+ return {
110
+ isTopLevel: false,
111
+ hasChildren: false
112
+ };
113
+ };
114
+ var checkSection = function checkSection(isRendered, hasItems) {
115
+ return isRendered && hasItems;
116
+ };
117
+ var loop = function loop(data) {
118
+ for (var i = 0; i < data.length; i += 1) {
119
+ var obj = {
120
+ key: data[i].key
121
+ };
122
+ returnArray.push(obj);
123
+ var _checkItemNesting = checkItemNesting(data[i]),
124
+ hasChildren = _checkItemNesting.hasChildren,
125
+ isTopLevel = _checkItemNesting.isTopLevel;
126
+ if (checkSection(state.expandedKeys.has(data[i].key), hasChildren) === true) {
127
+ if (isTopLevel) {
128
+ var _data$i$value;
129
+ loop((_data$i$value = data[i].value) === null || _data$i$value === void 0 ? void 0 : _data$i$value.items);
130
+ } else {
131
+ loop(data[i].items);
132
+ }
133
+ }
134
+ }
135
+ };
136
+ loop(_data);
137
+ return returnArray;
138
+ };
139
+
140
+ // list of value pairs of keys and refs
141
+ // does not need to be in order, because they are values pairs
142
+ var _useState3 = (0, _react.useState)([]),
143
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
144
+ refArray = _useState4[0],
145
+ setRefs = _useState4[1];
146
+
147
+ // creates a flattened list of keys for up/down keyboard use
148
+ // this DOES need to be in the same order as the HTML appears in the DOM.
149
+ // we are essentially turning all rendered items into a flat list, for up/down
150
+ var flatKeyArray = (0, _react.useMemo)(function () {
151
+ return flattenNestedData(props.items);
152
+ }, [state.expandedKeys]);
80
153
  var ariaLabel = props['aria-label'];
81
154
  var listBoxOptions = {
82
155
  disabledKeys: disabledKeys,
@@ -90,7 +163,13 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
90
163
  return (0, _react2.jsx)(_TreeViewContext.TreeViewContext.Provider, {
91
164
  value: {
92
165
  state: state,
93
- tree: tree
166
+ tree: tree,
167
+ refArray: refArray,
168
+ setRefs: setRefs,
169
+ flatKeyArray: flatKeyArray,
170
+ pageLength: pageLength,
171
+ setLastFocusedItem: setLastFocusedItem,
172
+ lastFocusedItem: lastFocusedItem
94
173
  }
95
174
  }, (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
96
175
  as: "ul"
@@ -99,14 +178,17 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
99
178
  "aria-label": ariaLabel,
100
179
  role: "treegrid",
101
180
  sx: {
102
- overflow: 'hidden'
181
+ overflow: 'hidden',
182
+ p: '5px',
183
+ border: 'none !important'
103
184
  }
104
- }, others), (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item, index) {
185
+ }, others), (0, _react2.jsx)(_TreeViewWrapper["default"], null, (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item, index) {
105
186
  return SectionOrItemRender(item.props.items.length > 0, (0, _react2.jsx)(_index.TreeViewSection, {
106
187
  item: item,
107
188
  items: item.props.items,
108
189
  title: item.props.title,
109
190
  key: item.props.title,
191
+ onKeyDown: onKeyDown,
110
192
  level: level + 1,
111
193
  setSize: state.collection.size,
112
194
  position: index
@@ -114,17 +196,19 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
114
196
  item: item,
115
197
  title: item.value.value.title,
116
198
  key: item.value.value.title,
199
+ onKeyDown: onKeyDown,
117
200
  level: level + 1,
118
- position: index,
119
- setSize: state.collection.size
201
+ setSize: state.collection.size,
202
+ position: index
120
203
  }));
121
- })));
204
+ }))));
122
205
  });
123
206
  TreeView.propTypes = {
124
207
  /** data object prop that is required to make the tree function
125
208
  this is returned from the useTreeData hook in React-Aria */
126
209
  tree: _propTypes["default"].shape({
127
- selectedKeys: _isIterable.isIterableProp
210
+ selectedKeys: _isIterable.isIterableProp,
211
+ items: _isIterable.isIterableProp
128
212
  }).isRequired,
129
213
  /** The currently disabled keys in the collection. */
130
214
  disabledKeys: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object])),
@@ -133,7 +217,11 @@ TreeView.propTypes = {
133
217
  /** The list of TreeView items. */
134
218
  items: _isIterable.isIterableProp,
135
219
  /** String that describes the treeview when using a screen reader. */
136
- 'aria-label': _propTypes["default"].string
220
+ 'aria-label': _propTypes["default"].string,
221
+ /** Handler that is called when a key is pressed. */
222
+ onKeyDown: _propTypes["default"].func,
223
+ /** Number of items to move the focus when page up or page down is pressed */
224
+ pageLength: _propTypes["default"].number
137
225
  };
138
226
  var _default = TreeView;
139
227
  exports["default"] = _default;
@@ -29,36 +29,50 @@ var _default = {
29
29
  exports["default"] = _default;
30
30
  var data = [{
31
31
  title: 'Policies',
32
+ key: 'Policies',
32
33
  items: [{
33
34
  title: 'Registration',
35
+ key: 'Registration',
34
36
  items: [{
35
- title: 'Registration A'
37
+ title: 'Registration A',
38
+ key: 'Registration A'
36
39
  }, {
37
40
  title: 'Registration B',
41
+ key: 'Registration B',
38
42
  items: [{
39
- title: 'Registration B1'
43
+ title: 'Registration B1',
44
+ key: 'Registration B1'
40
45
  }, {
41
- title: 'Registration B2'
46
+ title: 'Registration B2',
47
+ key: 'Registration B2'
42
48
  }]
43
49
  }, {
44
- title: 'Registration C'
50
+ title: 'Registration C',
51
+ key: 'Registration C'
45
52
  }, {
46
- title: 'Registration D'
53
+ title: 'Registration D',
54
+ key: 'Registration D'
47
55
  }]
48
56
  }, {
49
57
  title: 'Authentication',
58
+ key: 'Authentication',
50
59
  items: [{
51
- title: 'Authentication A'
60
+ title: 'Authentication A',
61
+ key: 'Authentication A'
52
62
  }, {
53
- title: 'Authentication B'
63
+ title: 'Authentication B',
64
+ key: 'Authentication B'
54
65
  }]
55
66
  }]
56
67
  }, {
57
68
  title: 'Other',
69
+ key: 'Other',
58
70
  items: [{
59
- title: 'Other A'
71
+ title: 'Other A',
72
+ key: 'Other A'
60
73
  }]
61
74
  }, {
75
+ key: 'Single Item',
62
76
  title: 'Single Item'
63
77
  }];
64
78
  var Default = function Default(args) {
@@ -74,8 +88,7 @@ var Default = function Default(args) {
74
88
  return (0, _react2.jsx)(_index.TreeView, (0, _extends2["default"])({}, args, {
75
89
  items: tree.items,
76
90
  tree: tree,
77
- "aria-label": "Example Tree",
78
- disabledKeys: ['Single Item']
91
+ "aria-label": "Example Tree"
79
92
  }), function (section) {
80
93
  var _section$value;
81
94
  return (0, _react2.jsx)(_index.Item, {
@@ -10,7 +10,7 @@ var treeRow = {
10
10
  cursor: 'pointer',
11
11
  height: '31px',
12
12
  outline: 'none',
13
- '&.is-selected, &.is-hovered, &.is-focused': {
13
+ '&.is-selected, &.is-hovered': {
14
14
  backgroundColor: 'active',
15
15
  '& span': {
16
16
  color: 'white'
@@ -24,9 +24,29 @@ var treeRow = {
24
24
  },
25
25
  '&.is-expanded': {
26
26
  marginBottom: 'xs'
27
+ },
28
+ '& :focus': {
29
+ border: 'none'
27
30
  }
28
31
  };
32
+ var wrapper = {
33
+ '&.is-focused': {
34
+ boxSizing: 'unset',
35
+ outline: '1px solid',
36
+ outlineColor: 'focus',
37
+ outlineOffset: '2px'
38
+ },
39
+ width: '100%',
40
+ ':not(:last-child)': {
41
+ mb: 'sm'
42
+ },
43
+ ':focus': {
44
+ border: 'none'
45
+ },
46
+ outline: 'none'
47
+ };
29
48
  var _default = {
30
- treeRow: treeRow
49
+ treeRow: treeRow,
50
+ wrapper: wrapper
31
51
  };
32
52
  exports["default"] = _default;
@@ -4,9 +4,13 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
4
4
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
5
5
  var _react = _interopRequireDefault(require("react"));
6
6
  var _reactStately = require("react-stately");
7
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
7
9
  var _index = require("../../index");
8
10
  var _testWrapper = require("../../utils/testUtils/testWrapper");
9
11
  var _TreeView = require("./TreeView");
12
+ var _TreeViewKeyboardDelegate = require("./TreeViewKeyboardDelegate.test");
13
+ var _TreeViewSection = require("./TreeViewSection");
10
14
  var _ = _interopRequireDefault(require("."));
11
15
  var _react2 = require("@emotion/react");
12
16
  var testId = 'test-TreeView';
@@ -43,9 +47,12 @@ var data = [{
43
47
  }, {
44
48
  title: 'Single Item'
45
49
  }];
50
+ var singleData = [{
51
+ title: 'Single Item'
52
+ }];
46
53
  var TreeViewComponent = function TreeViewComponent(props) {
47
54
  var tree = (0, _reactStately.useTreeData)({
48
- initialItems: data,
55
+ initialItems: props.data,
49
56
  getKey: function getKey(item) {
50
57
  return item.title;
51
58
  },
@@ -65,6 +72,9 @@ var TreeViewComponent = function TreeViewComponent(props) {
65
72
  });
66
73
  });
67
74
  };
75
+ TreeViewComponent.propTypes = {
76
+ data: _propTypes["default"].arrayOf(_propTypes["default"].shape({}))
77
+ };
68
78
  var offsetWidth;
69
79
  var offsetHeight;
70
80
  var scrollHeight;
@@ -98,16 +108,20 @@ test('TreeView component does load', function () {
98
108
  expect(element).toBeInTheDocument();
99
109
  });
100
110
  test('Can select an Item using the mouse', function () {
101
- (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, null));
111
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
112
+ data: data
113
+ }));
102
114
  var element = _testWrapper.screen.queryByRole('treegrid');
103
115
  expect(element).toBeInTheDocument();
104
116
  var peopleElement = _testWrapper.screen.queryByText('Single Item');
105
117
  expect(peopleElement).not.toHaveClass('is-selected');
106
- _testWrapper.fireEvent.click(peopleElement);
118
+ _userEvent["default"].click(peopleElement);
107
119
  expect(peopleElement).toHaveClass('is-selected');
108
120
  });
109
121
  test('Renders both Sections and Items', function () {
110
- (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, null));
122
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
123
+ data: data
124
+ }));
111
125
  var peopleElement = _testWrapper.screen.getByText('Single Item');
112
126
  expect(peopleElement).toBeInTheDocument();
113
127
  var plantElement = _testWrapper.screen.getByText('Other');
@@ -116,7 +130,9 @@ test('Renders both Sections and Items', function () {
116
130
  expect(allListItems).toHaveLength(3);
117
131
  });
118
132
  test('Can expand an Item using the mouse', function () {
119
- (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, null));
133
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
134
+ data: data
135
+ }));
120
136
 
121
137
  // The children of collapsed sections will not
122
138
  // be rendered by default.
@@ -125,47 +141,91 @@ test('Can expand an Item using the mouse', function () {
125
141
  // Clicking the dropdown icon, renders the children
126
142
  // of the collapsed section.
127
143
  var buttons = _testWrapper.screen.queryAllByRole('button');
128
- _testWrapper.fireEvent.click(buttons[0]);
144
+ _userEvent["default"].click(buttons[0]);
129
145
  expect(_testWrapper.screen.queryByText(data[0].items[0].title)).toBeInTheDocument();
130
146
  });
131
147
  test('onExpandedChange change prop calls when used', function () {
132
148
  var onPress = jest.fn();
133
149
  (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
150
+ data: data,
134
151
  onExpandedChange: onPress
135
152
  }));
136
153
  expect(onPress).not.toHaveBeenCalled();
137
154
  var buttons = _testWrapper.screen.queryAllByRole('button');
138
- _testWrapper.fireEvent.click(buttons[0]);
155
+ _userEvent["default"].click(buttons[0]);
139
156
  expect(onPress).toHaveBeenCalled();
140
157
  });
141
158
  test('disabledKeys prop disables items in the tree -- rendering them unclickable', function () {
142
159
  (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
160
+ data: data,
143
161
  disabledKeys: ['Single Item']
144
162
  }));
145
163
  var listItems = _testWrapper.screen.queryAllByRole('treeitem');
146
164
  var thisItem = listItems[2];
147
165
  expect(thisItem).not.toHaveClass('is-selected');
148
166
  expect(thisItem).toHaveAttribute('aria-disabled', 'true');
149
- _testWrapper.fireEvent.mouseDown(thisItem);
150
- _testWrapper.fireEvent.mouseUp(thisItem);
167
+ _userEvent["default"].click(thisItem);
151
168
  expect(thisItem).not.toHaveClass('is-selected');
152
169
  expect(thisItem).toHaveAttribute('aria-selected', 'false');
153
170
  });
154
171
  test('displays correct aria attributes', function () {
155
- (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, null));
172
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
173
+ data: data
174
+ }));
156
175
  var listItems = _testWrapper.screen.getAllByRole('treeitem');
157
176
  var lastTreeItem = listItems[2];
158
177
  expect(lastTreeItem).toHaveAttribute('aria-level', '1');
159
178
  expect(lastTreeItem).toHaveAttribute('aria-posinset', '3');
160
179
  expect(lastTreeItem).toHaveAttribute('aria-setsize', '3');
161
180
  var buttons = _testWrapper.screen.queryAllByRole('button');
162
- _testWrapper.fireEvent.click(buttons[1]);
181
+ _userEvent["default"].click(buttons[1]);
163
182
  var expandedItems = _testWrapper.screen.getAllByRole('treeitem');
164
183
  var nestedItem = expandedItems[2];
165
184
  expect(nestedItem).toHaveAttribute('aria-level', '2');
166
185
  expect(nestedItem).toHaveAttribute('aria-posinset', '1');
167
186
  expect(nestedItem).toHaveAttribute('aria-setsize', '1');
168
187
  });
188
+ test('onKeyDown calls passed in prop call back function', function () {
189
+ var callback = jest.fn();
190
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
191
+ data: data,
192
+ onKeyDown: callback
193
+ }));
194
+ var listItems = _testWrapper.screen.queryAllByRole('treeitem');
195
+ var thisItem = listItems[0];
196
+ _userEvent["default"].type(thisItem, '{arrowleft}');
197
+ expect(callback).toHaveBeenCalled();
198
+ });
199
+ test('onKeyDown calls passed in prop call back function', function () {
200
+ var callback = jest.fn();
201
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
202
+ data: data,
203
+ onKeyDown: callback
204
+ }));
205
+ var listItems = _testWrapper.screen.queryAllByRole('treeitem');
206
+ var thisItem = listItems[2];
207
+ _userEvent["default"].type(thisItem, '{arrowleft}');
208
+ expect(callback).toHaveBeenCalled();
209
+ });
210
+ test('onKeyDown does not call passed in prop call back function', function () {
211
+ var callback = jest.fn();
212
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
213
+ data: data
214
+ }));
215
+ var listItems = _testWrapper.screen.queryAllByRole('treeitem');
216
+ var thisItem = listItems[2];
217
+ _userEvent["default"].type(thisItem, '{arrowleft}');
218
+ expect(callback).not.toHaveBeenCalled();
219
+ });
220
+ test('items still render if there is only one provided', function () {
221
+ var callback = jest.fn();
222
+ (0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
223
+ data: singleData,
224
+ onKeyDown: callback
225
+ }));
226
+ var listItem = _testWrapper.screen.queryByText('Single Item');
227
+ expect(listItem).toBeInTheDocument();
228
+ });
169
229
  var firstJSX = (0, _react2.jsx)("p", null, "first");
170
230
  var secondJSX = (0, _react2.jsx)("p", null, "second");
171
231
  test('Section or Item Render renders first item if condition is true', function () {
@@ -179,4 +239,24 @@ test('Section or Item Render renders second item if condition is false', functio
179
239
  var thisItem = _testWrapper.screen.getByText('second');
180
240
  expect(thisItem).toBeInTheDocument();
181
241
  expect(_testWrapper.screen.queryByText('first')).not.toBeInTheDocument();
242
+ });
243
+ test('Handler function removes ref from array', function () {
244
+ var newArray = (0, _TreeViewSection.removeRefFromArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'test');
245
+ expect(newArray).toHaveLength(2);
246
+ });
247
+ test('Handler function does not remove ref from array', function () {
248
+ var newArray = (0, _TreeViewSection.removeRefFromArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'anothertest');
249
+ expect(newArray).toHaveLength(3);
250
+ });
251
+ test('Handler function does add ref to array', function () {
252
+ var newArray = (0, _TreeViewSection.addRefToArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'yetanothertest', {
253
+ current: 'currentlystilltesting'
254
+ });
255
+ expect(newArray).toHaveLength(4);
256
+ });
257
+ test('Handler function does not add ref to array', function () {
258
+ var newArray = (0, _TreeViewSection.addRefToArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'test', {
259
+ current: 'currentlystilltesting'
260
+ });
261
+ expect(newArray).toHaveLength(3);
182
262
  });