@techdocs/cli 1.10.7-next.1 → 1.10.7

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 (82) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/embedded-app/.config-schema.json +64 -31
  3. package/dist/embedded-app/index.html +1 -1
  4. package/dist/embedded-app/index.html.tmpl +1 -1
  5. package/dist/embedded-app/static/123.5e36a0db.chunk.js +2 -0
  6. package/dist/embedded-app/static/123.5e36a0db.chunk.js.map +1 -0
  7. package/dist/embedded-app/static/1659.76caecab.chunk.js +2 -0
  8. package/dist/embedded-app/static/1659.76caecab.chunk.js.map +1 -0
  9. package/dist/embedded-app/static/1733.d8004241.chunk.js +2 -0
  10. package/dist/embedded-app/static/1733.d8004241.chunk.js.map +1 -0
  11. package/dist/embedded-app/static/1749.3ab65683.chunk.js +2 -0
  12. package/dist/embedded-app/static/1749.3ab65683.chunk.js.map +1 -0
  13. package/dist/embedded-app/static/1994.78304f99.chunk.js +2 -0
  14. package/dist/embedded-app/static/1994.78304f99.chunk.js.map +1 -0
  15. package/dist/embedded-app/static/2295.a94805e5.chunk.js +5 -0
  16. package/dist/embedded-app/static/2295.a94805e5.chunk.js.map +1 -0
  17. package/dist/embedded-app/static/{3554.0ce35bc3.chunk.js → 3554.d745ad43.chunk.js} +2 -2
  18. package/dist/embedded-app/static/{3554.0ce35bc3.chunk.js.map → 3554.d745ad43.chunk.js.map} +1 -1
  19. package/dist/embedded-app/static/{4384.ae7b53b0.chunk.js → 4384.dc692f4f.chunk.js} +2 -2
  20. package/dist/embedded-app/static/{4384.ae7b53b0.chunk.js.map → 4384.dc692f4f.chunk.js.map} +1 -1
  21. package/dist/embedded-app/static/4587.85b7cf82.chunk.js +2 -0
  22. package/dist/embedded-app/static/4587.85b7cf82.chunk.js.map +1 -0
  23. package/dist/embedded-app/static/4648.e939339d.chunk.js +2 -0
  24. package/dist/embedded-app/static/4648.e939339d.chunk.js.map +1 -0
  25. package/dist/embedded-app/static/6138.d8ae40ee.chunk.js +2 -0
  26. package/dist/embedded-app/static/6138.d8ae40ee.chunk.js.map +1 -0
  27. package/dist/embedded-app/static/7203.1bd24814.chunk.js +2 -0
  28. package/dist/embedded-app/static/7203.1bd24814.chunk.js.map +1 -0
  29. package/dist/embedded-app/static/{7226.9f87f67d.chunk.js → 7226.bb48ee34.chunk.js} +2 -2
  30. package/dist/embedded-app/static/{7226.9f87f67d.chunk.js.map → 7226.bb48ee34.chunk.js.map} +1 -1
  31. package/dist/embedded-app/static/{8461.d5fe0648.chunk.js → 8461.0c3f2ac0.chunk.js} +3 -3
  32. package/dist/embedded-app/static/{8461.d5fe0648.chunk.js.map → 8461.0c3f2ac0.chunk.js.map} +1 -1
  33. package/dist/embedded-app/static/{8877.3f864531.chunk.js → 8877.a7ffabd9.chunk.js} +2 -2
  34. package/dist/embedded-app/static/{8877.3f864531.chunk.js.map → 8877.a7ffabd9.chunk.js.map} +1 -1
  35. package/dist/embedded-app/static/9050.69b458a6.chunk.js +2 -0
  36. package/dist/embedded-app/static/9050.69b458a6.chunk.js.map +1 -0
  37. package/dist/embedded-app/static/9230.23c1d5e0.chunk.js +2 -0
  38. package/dist/embedded-app/static/9230.23c1d5e0.chunk.js.map +1 -0
  39. package/dist/embedded-app/static/{main.161a9ecc.css → main.0657d08d.css} +2 -2
  40. package/dist/embedded-app/static/{main.161a9ecc.css.map → main.0657d08d.css.map} +1 -1
  41. package/dist/embedded-app/static/main.c9b00fd0.js +523 -0
  42. package/dist/embedded-app/static/main.c9b00fd0.js.map +1 -0
  43. package/dist/embedded-app/static/{module-react-aria-components.67232dc3.js → module-react-aria-components.c61f9ab4.js} +2 -2
  44. package/dist/embedded-app/static/{module-react-aria-components.67232dc3.js.map → module-react-aria-components.c61f9ab4.js.map} +1 -1
  45. package/dist/embedded-app/static/module-zod.b3376822.js +38 -0
  46. package/dist/embedded-app/static/module-zod.b3376822.js.map +1 -0
  47. package/dist/embedded-app/static/{runtime.c39b96cc.js → runtime.9896d1d9.js} +2 -2
  48. package/dist/embedded-app/static/{runtime.c39b96cc.js.map → runtime.9896d1d9.js.map} +1 -1
  49. package/dist/embedded-app/static/vendor.ff5541f5.js +6 -0
  50. package/dist/embedded-app/static/vendor.ff5541f5.js.map +1 -0
  51. package/dist/package.json.cjs.js +1 -1
  52. package/package.json +7 -7
  53. package/dist/embedded-app/static/123.97a62a60.chunk.js +0 -2
  54. package/dist/embedded-app/static/123.97a62a60.chunk.js.map +0 -1
  55. package/dist/embedded-app/static/1659.7dd5287b.chunk.js +0 -2
  56. package/dist/embedded-app/static/1659.7dd5287b.chunk.js.map +0 -1
  57. package/dist/embedded-app/static/1733.14c06ac4.chunk.js +0 -2
  58. package/dist/embedded-app/static/1733.14c06ac4.chunk.js.map +0 -1
  59. package/dist/embedded-app/static/1749.745aaeeb.chunk.js +0 -2
  60. package/dist/embedded-app/static/1749.745aaeeb.chunk.js.map +0 -1
  61. package/dist/embedded-app/static/1994.1f294712.chunk.js +0 -2
  62. package/dist/embedded-app/static/1994.1f294712.chunk.js.map +0 -1
  63. package/dist/embedded-app/static/2295.765b9f2e.chunk.js +0 -5
  64. package/dist/embedded-app/static/2295.765b9f2e.chunk.js.map +0 -1
  65. package/dist/embedded-app/static/4587.bf73bd77.chunk.js +0 -2
  66. package/dist/embedded-app/static/4587.bf73bd77.chunk.js.map +0 -1
  67. package/dist/embedded-app/static/4648.bd152b54.chunk.js +0 -2
  68. package/dist/embedded-app/static/4648.bd152b54.chunk.js.map +0 -1
  69. package/dist/embedded-app/static/6138.2560a5ba.chunk.js +0 -2
  70. package/dist/embedded-app/static/6138.2560a5ba.chunk.js.map +0 -1
  71. package/dist/embedded-app/static/7203.1ec93f6f.chunk.js +0 -2
  72. package/dist/embedded-app/static/7203.1ec93f6f.chunk.js.map +0 -1
  73. package/dist/embedded-app/static/9050.bab0c5db.chunk.js +0 -2
  74. package/dist/embedded-app/static/9050.bab0c5db.chunk.js.map +0 -1
  75. package/dist/embedded-app/static/9230.b3e5d612.chunk.js +0 -2
  76. package/dist/embedded-app/static/9230.b3e5d612.chunk.js.map +0 -1
  77. package/dist/embedded-app/static/main.cb460d15.js +0 -523
  78. package/dist/embedded-app/static/main.cb460d15.js.map +0 -1
  79. package/dist/embedded-app/static/module-zod.dd7f5a90.js +0 -2
  80. package/dist/embedded-app/static/module-zod.dd7f5a90.js.map +0 -1
  81. package/dist/embedded-app/static/vendor.65e7f165.js +0 -6
  82. package/dist/embedded-app/static/vendor.65e7f165.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"static/8877.3f864531.chunk.js","sources":["webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_apply.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseEach.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseFlatten.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseMap.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseOrderBy.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseRest.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseSetToString.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseSortBy.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_compareAscending.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_compareMultiple.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_createBaseEach.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_isFlattenable.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_isIterateeCall.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_overRest.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_setToString.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_shortOut.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/constant.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/isEqual.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/sortBy.js","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/static/ClosedDropdown.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/static/OpenedDropdown.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/Select.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/apis/EntityPresentationApi/entityPresentationSnapshot.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/CatalogAutocomplete/CatalogAutocomplete.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useFetchEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useEntityTypeFilter.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/filters.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useEntityListProvider.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useStarredEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/utils/filters.ts"],"sourcesContent":["/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","var arrayMap = require('./_arrayMap'),\n baseGet = require('./_baseGet'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n };\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\n/** @public */\nexport type ClosedDropdownClassKey = 'icon';\n\nconst useStyles = makeStyles(\n theme =>\n createStyles({\n icon: {\n position: 'absolute',\n right: theme.spacing(0.5),\n pointerEvents: 'none',\n color: '#616161',\n },\n }),\n { name: 'BackstageClosedDropdown' },\n);\n\nconst ClosedDropdown = () => {\n const classes = useStyles();\n return (\n <SvgIcon\n className={classes.icon}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.5 8L6 9.5L12.0703 15.5703L18.1406 9.5L16.6406 8L12.0703 12.5703L7.5 8Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n );\n};\n\nexport default ClosedDropdown;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\nexport type OpenedDropdownClassKey = 'icon';\n\nconst useStyles = makeStyles(\n theme =>\n createStyles({\n icon: {\n position: 'absolute',\n right: theme.spacing(0.5),\n pointerEvents: 'none',\n color: '#616161',\n },\n }),\n { name: 'BackstageOpenedDropdown' },\n);\n\nconst OpenedDropdown = () => {\n const classes = useStyles();\n return (\n <SvgIcon\n className={classes.icon}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M16.5 16L18 14.5L11.9297 8.42969L5.85938 14.5L7.35938 16L11.9297 11.4297L16.5 16Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n );\n};\n\nexport default OpenedDropdown;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Chip from '@material-ui/core/Chip';\nimport FormControl from '@material-ui/core/FormControl';\nimport InputBase from '@material-ui/core/InputBase';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport {\n createStyles,\n makeStyles,\n Theme,\n withStyles,\n} from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport { ChangeEvent, useEffect, useState } from 'react';\n\nimport ClosedDropdown from './static/ClosedDropdown';\nimport OpenedDropdown from './static/OpenedDropdown';\n\n/** @public */\nexport type SelectInputBaseClassKey = 'root' | 'input';\n\nconst BootstrapInput = withStyles(\n (theme: Theme) =>\n createStyles({\n root: {\n 'label + &': {\n marginTop: theme.spacing(3),\n },\n '&.Mui-focused > div[role=button]': {\n borderColor: theme.palette.primary.main,\n },\n },\n input: {\n borderRadius: theme.shape.borderRadius,\n position: 'relative',\n backgroundColor: theme.palette.background.paper,\n border: '1px solid #ced4da',\n fontSize: theme.typography.body1.fontSize,\n padding: theme.spacing(1.25, 3.25, 1.25, 1.5),\n transition: theme.transitions.create(['border-color', 'box-shadow']),\n '&:focus': {\n background: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n },\n },\n }),\n { name: 'BackstageSelectInputBase' },\n)(InputBase);\n\n/** @public */\nexport type SelectClassKey =\n | 'formControl'\n | 'label'\n | 'chips'\n | 'chip'\n | 'checkbox'\n | 'root';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n formControl: {\n margin: theme.spacing(1, 0),\n },\n label: {\n transform: 'initial',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '&.Mui-focused': {\n color: theme.palette.text.primary,\n },\n },\n formLabel: {\n transform: 'initial',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '&.Mui-focused': {\n color: theme.palette.text.primary,\n },\n },\n chips: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n chip: {\n margin: 2,\n },\n checkbox: {},\n\n root: {\n display: 'flex',\n flexDirection: 'column',\n },\n }),\n { name: 'BackstageSelect' },\n);\n\n/** @public */\nexport type SelectItem = {\n label: string;\n value: string | number;\n};\n\n/** @public */\nexport type SelectedItems = string | string[] | number | number[];\n\nexport type SelectProps = {\n multiple?: boolean;\n items: SelectItem[];\n label: string;\n placeholder?: string;\n selected?: SelectedItems;\n onChange: (arg: SelectedItems) => void;\n triggerReset?: boolean;\n native?: boolean;\n disabled?: boolean;\n margin?: 'dense' | 'none';\n 'data-testid'?: string;\n};\n\n/** @public */\nexport function SelectComponent(props: SelectProps) {\n const {\n multiple,\n items,\n label,\n placeholder,\n selected,\n onChange,\n triggerReset,\n native = false,\n disabled = false,\n margin,\n 'data-testid': dataTestId = 'select',\n } = props;\n const classes = useStyles();\n const [value, setValue] = useState<SelectedItems>(\n selected || (multiple ? [] : ''),\n );\n const [isOpen, setOpen] = useState(false);\n\n useEffect(() => {\n setValue(multiple ? [] : '');\n }, [triggerReset, multiple]);\n\n useEffect(() => {\n setValue(selected || (multiple ? [] : ''));\n }, [selected, multiple]);\n\n const handleChange = (event: ChangeEvent<{ value: unknown }>) => {\n setValue(event.target.value as SelectedItems);\n onChange(event.target.value as SelectedItems);\n };\n\n const handleOpen = (event: ChangeEvent<any>) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n setOpen(previous => {\n if (multiple && !(event.target instanceof HTMLElement)) {\n return true;\n }\n return !previous;\n });\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleDelete = (selectedValue: string | number) => () => {\n const newValue = (value as any[]).filter(chip => chip !== selectedValue);\n setValue(newValue);\n onChange(newValue);\n };\n\n return (\n <Box className={classes.root}>\n <FormControl className={classes.formControl}>\n <InputLabel className={classes.formLabel}>{label}</InputLabel>\n <Select\n aria-label={label}\n value={value}\n native={native}\n disabled={disabled}\n data-testid={dataTestId}\n displayEmpty\n multiple={multiple}\n margin={margin}\n onChange={handleChange}\n open={isOpen}\n onOpen={handleOpen}\n onClose={handleClose}\n input={<BootstrapInput />}\n label={label}\n renderValue={s =>\n multiple && (value as any[]).length !== 0 ? (\n <Box className={classes.chips}>\n {(s as string[]).map(selectedValue => {\n const item = items.find(el => el.value === selectedValue);\n return item ? (\n <Chip\n data-testid=\"chip\"\n key={item?.value}\n label={item?.label}\n clickable\n deleteIcon={\n <CancelIcon\n data-testid=\"cancel-icon\"\n onMouseDown={event => event.stopPropagation()}\n />\n }\n onDelete={handleDelete(selectedValue)}\n className={classes.chip}\n />\n ) : (\n false\n );\n })}\n </Box>\n ) : (\n <Typography>\n {(value as any[]).length === 0\n ? placeholder || ''\n : items.find(el => el.value === s)?.label}\n </Typography>\n )\n }\n IconComponent={() =>\n !isOpen ? <ClosedDropdown /> : <OpenedDropdown />\n }\n MenuProps={{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'left',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'left',\n },\n getContentAnchorEl: null,\n }}\n >\n {!!placeholder && !multiple && (\n <MenuItem value={[]}>{placeholder}</MenuItem>\n )}\n {native\n ? items &&\n items.map(item => (\n <option value={item.value} key={item.value}>\n {item.label}\n </option>\n ))\n : items &&\n items.map(item => (\n <MenuItem key={item.value} value={item.value}>\n {multiple && (\n <Checkbox\n color=\"primary\"\n checked={(value as any[]).includes(item.value) || false}\n className={classes.checkbox}\n />\n )}\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n );\n}\n","/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CompoundEntityRef,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n EntityPresentationApi,\n EntityRefPresentationSnapshot,\n} from './EntityPresentationApi';\nimport { defaultEntityPresentation } from './defaultEntityPresentation';\n\n/**\n * Returns a synchronous presentation snapshot for an entity in non-React\n * contexts.\n *\n * @remarks\n *\n * This is the synchronous, non-React counterpart to\n * {@link useEntityPresentation}. It handles `Entity`, `CompoundEntityRef`,\n * and string ref inputs uniformly, using the provided\n * {@link EntityPresentationApi} when available and falling back to\n * {@link defaultEntityPresentation} otherwise.\n *\n * Because this function is synchronous, it uses cached data from the\n * presentation API (via `.snapshot`). If the entity has been seen before,\n * the snapshot will contain the full resolved title; otherwise it falls\n * back to what can be extracted from the ref alone. This is the correct\n * trade-off for sort comparators, column factories, filter callbacks, and\n * data mappers where a synchronous return value is required.\n *\n * In async contexts such as data loaders where you can `await`, prefer\n * using the {@link EntityPresentationApi} directly via\n * `forEntity().promise` for the richest possible presentation.\n *\n * @public\n * @param entityOrRef - An entity, a compound entity ref, or a string entity ref.\n * @param context - Optional context that may affect the presentation.\n * @param entityPresentationApi - Optional presentation API instance. When not\n * provided, falls back to {@link defaultEntityPresentation}.\n */\nexport function entityPresentationSnapshot(\n entityOrRef: Entity | CompoundEntityRef | string,\n context?: { defaultKind?: string; defaultNamespace?: string },\n entityPresentationApi?: EntityPresentationApi,\n): EntityRefPresentationSnapshot {\n if (entityPresentationApi) {\n const ref =\n typeof entityOrRef === 'string' || 'metadata' in entityOrRef\n ? entityOrRef\n : stringifyEntityRef(entityOrRef);\n return entityPresentationApi.forEntity(ref, context).snapshot;\n }\n return defaultEntityPresentation(entityOrRef, context);\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Box from '@material-ui/core/Box';\nimport Typography, { TypographyProps } from '@material-ui/core/Typography';\nimport Paper, { PaperProps } from '@material-ui/core/Paper';\nimport Popper, { PopperProps } from '@material-ui/core/Popper';\nimport TextField, { OutlinedTextFieldProps } from '@material-ui/core/TextField';\nimport Grow from '@material-ui/core/Grow';\nimport {\n createStyles,\n makeStyles,\n Theme,\n withStyles,\n} from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Autocomplete, {\n AutocompleteProps,\n AutocompleteRenderInputParams,\n} from '@material-ui/lab/Autocomplete';\nimport { ReactNode, useCallback } from 'react';\nimport { merge } from 'lodash';\nimport classNames from 'classnames';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n margin: theme.spacing(1, 0),\n },\n label: {\n position: 'relative',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '& > span': {\n top: 0,\n left: 0,\n position: 'absolute',\n },\n },\n }),\n { name: 'BackstageAutocomplete' },\n);\n\nconst BootstrapAutocomplete = withStyles(\n (theme: Theme) =>\n createStyles({\n root: {},\n paper: {\n margin: 0,\n },\n hasClearIcon: {},\n hasPopupIcon: {},\n focused: {},\n inputRoot: {\n marginTop: 24,\n backgroundColor: theme.palette.background.paper,\n '$root$hasClearIcon$hasPopupIcon &': {\n paddingBlock: theme.spacing(0.75),\n paddingInlineStart: theme.spacing(0.75),\n },\n '$root$focused &': {\n outline: 'none',\n },\n '$root &:hover > fieldset': {\n borderColor: '#ced4da',\n },\n '$root$focused & > fieldset': {\n borderWidth: 1,\n borderColor: theme.palette.primary.main,\n },\n },\n popupIndicator: {\n padding: 0,\n margin: 0,\n color: '#616161',\n '&:hover': {\n backgroundColor: 'unset',\n },\n '& [class*=\"MuiTouchRipple-root\"]': {\n display: 'none',\n },\n },\n endAdornment: {\n '$root$hasClearIcon$hasPopupIcon &': {\n right: 4,\n },\n },\n input: {\n '$root$hasClearIcon$hasPopupIcon &': {\n fontSize: theme.typography.body1.fontSize,\n paddingBlock: theme.spacing(0.8125),\n },\n },\n }),\n { name: 'BackstageAutocompleteBase' },\n)(Autocomplete) as typeof Autocomplete;\n\nconst PopperComponent = (props: PopperProps) => (\n <Popper {...props} transition placement=\"bottom-start\">\n {({ TransitionProps }) => (\n <Grow {...TransitionProps} style={{ transformOrigin: '0 0 0' }}>\n <Box>{props.children as ReactNode}</Box>\n </Grow>\n )}\n </Popper>\n);\n\nconst PaperComponent = (props: PaperProps) => (\n <Paper {...props} elevation={8} />\n);\n\n/**\n * Props for {@link CatalogAutocomplete}\n *\n * @public\n */\nexport type CatalogAutocompleteProps<\n T,\n Multiple extends boolean | undefined = undefined,\n DisableClearable extends boolean | undefined = undefined,\n FreeSolo extends boolean | undefined = undefined,\n> = Omit<\n AutocompleteProps<T, Multiple, DisableClearable, FreeSolo>,\n 'PopperComponent' | 'PaperComponent' | 'popupIcon' | 'renderInput'\n> & {\n name: string;\n label?: string;\n LabelProps?: TypographyProps<'label'>;\n TextFieldProps?: Omit<OutlinedTextFieldProps, 'variant'>;\n renderInput?: AutocompleteProps<\n T,\n Multiple,\n DisableClearable,\n FreeSolo\n >['renderInput'];\n};\n\n/** @public */\nexport function CatalogAutocomplete<\n T,\n Multiple extends boolean | undefined = undefined,\n DisableClearable extends boolean | undefined = undefined,\n FreeSolo extends boolean | undefined = undefined,\n>(props: CatalogAutocompleteProps<T, Multiple, DisableClearable, FreeSolo>) {\n const { label, name, LabelProps, TextFieldProps, ...rest } = props;\n const classes = useStyles();\n const renderInput = useCallback(\n (params: AutocompleteRenderInputParams) => (\n <TextField {...merge(params, TextFieldProps)} variant=\"outlined\" />\n ),\n [TextFieldProps],\n );\n const autocomplete = (\n <BootstrapAutocomplete\n size=\"small\"\n {...rest}\n renderInput={rest.renderInput ?? renderInput}\n popupIcon={<ExpandMoreIcon data-testid={`${name}-expand`} />}\n PaperComponent={PaperComponent}\n PopperComponent={PopperComponent}\n />\n );\n\n return (\n <Box className={classes.root}>\n {label ? (\n <Typography\n {...LabelProps}\n className={classNames(classes.label, LabelProps?.className)}\n component=\"label\"\n >\n <Box component=\"span\">{label}</Box>\n {autocomplete}\n </Typography>\n ) : (\n autocomplete\n )}\n </Box>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { memo } from 'react';\n\ninterface Props {\n selected: boolean;\n value: string;\n availableOptions?: Record<string, number>;\n showCounts: boolean;\n}\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\nfunction OptionCheckbox({ selected }: { selected: boolean }) {\n return <Checkbox icon={icon} checkedIcon={checkedIcon} checked={selected} />;\n}\n\nexport const EntityAutocompletePickerOption = memo((props: Props) => {\n const { selected, value, availableOptions, showCounts } = props;\n const label = showCounts ? `${value} (${availableOptions?.[value]})` : value;\n\n return (\n <FormControlLabel\n control={<OptionCheckbox selected={selected} />}\n label={label}\n onClick={event => event.preventDefault()}\n />\n );\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Box from '@material-ui/core/Box';\nimport { TextFieldProps } from '@material-ui/core/TextField';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityAutocompletePickerOption } from './EntityAutocompletePickerOption';\nimport {\n DefaultEntityFilters,\n useEntityList,\n} from '../../hooks/useEntityListProvider';\nimport { EntityFilter } from '../../types';\nimport { reduceBackendCatalogFilters } from '../../utils/filters';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\nimport { isEqual } from 'lodash';\n\n/** @public */\nexport type AllowedEntityFilters<T extends DefaultEntityFilters> = {\n [K in keyof T]-?: NonNullable<T[K]> extends EntityFilter & {\n values: string[];\n }\n ? K\n : never;\n}[keyof T];\n\n/** @public */\nexport type EntityAutocompletePickerProps<\n T extends DefaultEntityFilters = DefaultEntityFilters,\n Name extends AllowedEntityFilters<T> = AllowedEntityFilters<T>,\n> = {\n label: string;\n name: Name;\n path: string;\n showCounts?: boolean;\n Filter: { new (values: string[]): NonNullable<T[Name]> };\n InputProps?: TextFieldProps;\n initialSelectedOptions?: string[];\n filtersForAvailableValues?: Array<keyof T>;\n hidden?: boolean;\n};\n\n/** @public */\nexport type CatalogReactEntityAutocompletePickerClassKey = 'root' | 'label';\n\nconst useStyles = makeStyles(\n {\n root: {},\n label: {\n textTransform: 'none',\n fontWeight: 'bold',\n },\n },\n { name: 'CatalogReactEntityAutocompletePicker' },\n);\n\n/** @public */\nexport function EntityAutocompletePicker<\n T extends DefaultEntityFilters = DefaultEntityFilters,\n Name extends AllowedEntityFilters<T> = AllowedEntityFilters<T>,\n>(props: EntityAutocompletePickerProps<T, Name>) {\n const {\n label,\n name,\n path,\n showCounts,\n Filter,\n InputProps,\n initialSelectedOptions = [],\n filtersForAvailableValues = ['kind'],\n hidden,\n } = props;\n const classes = useStyles();\n\n const {\n updateFilters,\n filters,\n queryParameters: { [name]: queryParameter },\n } = useEntityList<T>();\n\n const catalogApi = useApi(catalogApiRef);\n const availableValuesFilters = filtersForAvailableValues.map(\n f => filters[f] as EntityFilter | undefined,\n );\n const { value: availableValues } = useAsync(async () => {\n const facet = path;\n const { facets } = await catalogApi.getEntityFacets({\n facets: [facet],\n filter: reduceBackendCatalogFilters(\n availableValuesFilters.filter(Boolean) as EntityFilter[],\n ),\n });\n\n return Object.fromEntries(\n facets[facet].map(({ value, count }) => [value, count]),\n );\n }, [...availableValuesFilters]);\n\n const queryParameters = useMemo(\n () => [queryParameter].flat().filter(Boolean) as string[],\n [queryParameter],\n );\n\n const filteredOptions = (filters[name] as unknown as { values: string[] })\n ?.values;\n\n const [selectedOptions, setSelectedOptions] = useState(\n queryParameters.length\n ? queryParameters\n : filteredOptions ?? initialSelectedOptions,\n );\n\n // Set selected options on query parameter updates; this happens at initial page load and from\n // external updates to the page location\n useEffect(() => {\n if (queryParameters.length) {\n setSelectedOptions(queryParameters);\n }\n }, [queryParameters]);\n\n const availableOptions = Object.keys(availableValues ?? {});\n const shouldAddFilter = selectedOptions.length && availableOptions.length;\n\n // Update filter value when selectedOptions change\n useEffect(() => {\n updateFilters({\n [name]: shouldAddFilter ? new Filter(selectedOptions) : undefined,\n } as Partial<T>);\n }, [name, shouldAddFilter, selectedOptions, Filter, updateFilters]);\n\n // Update selected options when filter value changes\n useEffect(() => {\n if (!shouldAddFilter) return;\n\n const newSelectedOptions = filteredOptions ?? [];\n\n // Check value is actually different (not just a different reference) to prevent selectedOptions <> filters loop\n if (!isEqual(newSelectedOptions, selectedOptions)) {\n setSelectedOptions(newSelectedOptions);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Don't re-set filter value when selectedOptions changes\n }, [filteredOptions]);\n\n const filter = filters[name];\n if (\n (filter && typeof filter === 'object' && !('values' in filter)) ||\n !availableOptions.length\n ) {\n return null;\n }\n\n return hidden ? null : (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<string, true>\n multiple\n disableCloseOnSelect\n label={label}\n name={`${String(name)}-picker`}\n options={availableOptions}\n value={selectedOptions}\n TextFieldProps={InputProps}\n onChange={(_event: object, options: string[]) =>\n setSelectedOptions(options)\n }\n renderOption={(option, { selected }) => (\n <EntityAutocompletePickerOption\n selected={selected}\n value={option}\n availableOptions={availableValues}\n showCounts={!!showCounts}\n />\n )}\n />\n </Box>\n );\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Select } from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport { useEffect, useMemo, useState } from 'react';\nimport { EntityKindFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { filterKinds, useAllKinds } from './kindFilterUtils';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nfunction useEntityKindFilter(opts: { initialFilter: string }): {\n loading: boolean;\n error?: Error;\n allKinds: Map<string, string>;\n selectedKind: string;\n setSelectedKind: (kind: string) => void;\n} {\n const {\n filters,\n queryParameters: { kind: kindParameter },\n updateFilters,\n } = useEntityList();\n\n const queryParamKind = useMemo(\n () => [kindParameter].flat()[0],\n [kindParameter],\n );\n\n const [selectedKind, setSelectedKind] = useState(\n queryParamKind ?? filters.kind?.value ?? opts.initialFilter,\n );\n\n // Set selected kinds on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamKind) {\n setSelectedKind(queryParamKind);\n }\n }, [queryParamKind]);\n\n // Set selected kind from filters; this happens when the kind filter is\n // updated from another component\n useEffect(() => {\n if (filters.kind?.value) {\n setSelectedKind(filters.kind?.value);\n }\n }, [filters.kind]);\n\n const { allKinds, loading, error } = useAllKinds();\n const selectedKindLabel = allKinds.get(selectedKind) || selectedKind;\n\n useEffect(() => {\n updateFilters({\n kind: selectedKind\n ? new EntityKindFilter(selectedKind, selectedKindLabel)\n : undefined,\n });\n }, [selectedKind, selectedKindLabel, updateFilters]);\n\n return {\n loading,\n error,\n allKinds,\n selectedKind,\n setSelectedKind,\n };\n}\n\n/**\n * Props for {@link EntityKindPicker}.\n *\n * @public\n */\nexport interface EntityKindPickerProps {\n /**\n * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and\n * displayed.\n */\n allowedKinds?: string[];\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityKindPicker = (props: EntityKindPickerProps) => {\n const { allowedKinds, hidden, initialFilter = 'component' } = props;\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const alertApi = useApi(alertApiRef);\n\n const { error, allKinds, selectedKind, setSelectedKind } =\n useEntityKindFilter({\n initialFilter: initialFilter,\n });\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: t('entityKindPicker.errorMessage'),\n severity: 'error',\n });\n }\n }, [error, alertApi, t]);\n\n if (error) return null;\n\n const options = filterKinds(allKinds, allowedKinds, selectedKind);\n\n const items = [...options.entries()].map(([key, value]) => ({\n label: value,\n value: key,\n }));\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label={t('entityKindPicker.title')}\n items={items}\n selected={selectedKind.toLocaleLowerCase('en-US')}\n onChange={value => setSelectedKind(String(value))}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\n\n/**\n * Fetch and return all available kinds.\n */\nexport function useAllKinds(): {\n loading: boolean;\n error?: Error;\n allKinds: Map<string, string>;\n} {\n const catalogApi = useApi(catalogApiRef);\n\n const {\n error,\n loading,\n value: allKinds,\n } = useAsync(async () => {\n const { facets } = await catalogApi.getEntityFacets({ facets: ['kind'] });\n const kindFacets = (facets.kind ?? []).map(f => f.value);\n return new Map(\n kindFacets.map(kind => [kind.toLocaleLowerCase('en-US'), kind]),\n );\n }, [catalogApi]);\n\n return { loading, error, allKinds: allKinds ?? new Map() };\n}\n\n/**\n * Filter and capitalize accessible kinds.\n */\nexport function filterKinds(\n allKinds: Map<string, string>,\n allowedKinds?: string[],\n forcedKinds?: string,\n): Map<string, string> {\n // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not\n // be present in allKinds. It should still be shown in the dropdown, but may not have the nice\n // enforced casing from the catalog-backend. This makes a key/value record for the Select options,\n // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the\n // more proper catalog kind if it exists.\n let availableKinds = Array.from(allKinds.keys());\n if (allowedKinds) {\n availableKinds = allowedKinds\n .map(k => k.toLocaleLowerCase('en-US'))\n .filter(k => allKinds.has(k));\n }\n\n const kindsMap = new Map(\n availableKinds.map(kind => [kind, allKinds.get(kind) || kind]),\n );\n\n if (forcedKinds && !kindsMap.has(forcedKinds)) {\n // this is the only time we set a label for a kind which is not properly capitalized\n kindsMap.set(forcedKinds.toLocaleLowerCase('en-US'), forcedKinds);\n }\n\n return kindsMap;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport { EntityLifecycleFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityLifecyclePickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n input: {},\n },\n { name: 'CatalogReactEntityLifecyclePicker' },\n);\n\n/** @public */\nexport const EntityLifecyclePicker = (props: { initialFilter?: string[] }) => {\n const { initialFilter = [] } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityLifecyclePicker.title')}\n name=\"lifecycles\"\n path=\"spec.lifecycle\"\n Filter={EntityLifecycleFilter}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={initialFilter}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { EntityNamespaceFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityNamespacePickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n input: {},\n },\n {\n name: 'CatalogReactEntityNamespacePicker',\n },\n);\n\n/**\n * Props for {@link EntityNamespacePicker}.\n *\n * @public\n */\nexport interface EntityNamespacePickerProps {\n initiallySelectedNamespaces?: string[];\n}\n\n/** @public */\nexport const EntityNamespacePicker = (props: EntityNamespacePickerProps) => {\n const { initiallySelectedNamespaces } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityNamespacePicker.title')}\n name=\"namespace\"\n path=\"metadata.namespace\"\n Filter={EntityNamespaceFilter}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={initiallySelectedNamespaces}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { MouseEvent, useEffect, useMemo, useState } from 'react';\nimport { useEntityList } from '../../hooks/useEntityListProvider';\nimport { EntityOwnerFilter } from '../../filters';\nimport { useDebouncedEffect } from '@react-hookz/web';\nimport PersonIcon from '@material-ui/icons/Person';\nimport GroupIcon from '@material-ui/icons/Group';\nimport {\n entityPresentationApiRef,\n entityPresentationSnapshot,\n} from '../../apis';\nimport { useFetchEntities } from './useFetchEntities';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useEntityPresentation } from '../../apis';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useApiHolder } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\n\n/** @public */\nexport type CatalogReactEntityOwnerPickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n root: {},\n label: {},\n input: {},\n fullWidth: { width: '100%' },\n boxLabel: {\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n },\n { name: 'CatalogReactEntityOwnerPicker' },\n);\n\n/** @public */\nexport type FixedWidthFormControlLabelClassKey = 'label' | 'root';\n\nconst FixedWidthFormControlLabel = withStyles(\n _theme => ({\n label: {\n width: '100%',\n },\n root: {\n width: '90%',\n },\n }),\n { name: 'FixedWidthFormControlLabel' },\n)(FormControlLabel);\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * @public\n */\nexport type EntityOwnerPickerProps = {\n mode?: 'owners-only' | 'all';\n};\n\nfunction RenderOptionLabel(props: { entity: Entity; isSelected: boolean }) {\n const classes = useStyles();\n const isGroup = props.entity.kind.toLocaleLowerCase('en-US') === 'group';\n const { primaryTitle: title } = useEntityPresentation(props.entity);\n return (\n <Box className={classes.fullWidth}>\n <FixedWidthFormControlLabel\n className={classes.fullWidth}\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={props.isSelected}\n />\n }\n onClick={event => event.preventDefault()}\n label={\n <Tooltip title={title}>\n <Box display=\"flex\" alignItems=\"center\">\n {isGroup ? (\n <GroupIcon fontSize=\"small\" />\n ) : (\n <PersonIcon fontSize=\"small\" />\n )}\n &nbsp;\n <Box className={classes.boxLabel}>\n <Typography noWrap>{title}</Typography>\n </Box>\n </Box>\n </Tooltip>\n }\n />\n </Box>\n );\n}\n\n/** @public */\nexport const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => {\n const classes = useStyles();\n const { mode = 'owners-only' } = props || {};\n const apis = useApiHolder();\n const entityPresentationApi = apis.get(entityPresentationApiRef);\n const {\n updateFilters,\n filters,\n queryParameters: { owners: ownersParameter },\n } = useEntityList();\n\n const [text, setText] = useState('');\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const queryParamOwners = useMemo(\n () => [ownersParameter].flat().filter(Boolean) as string[],\n [ownersParameter],\n );\n\n const [selectedOwners, setSelectedOwners] = useState<string[]>(\n queryParamOwners.length ? queryParamOwners : filters.owners?.values ?? [],\n );\n\n const [{ value, loading }, handleFetch, cache] = useFetchEntities({\n mode,\n initialSelectedOwnersRefs: selectedOwners,\n });\n useDebouncedEffect(\n () => handleFetch({ text: text.toLocaleLowerCase('en-US') }),\n [text, handleFetch],\n 250,\n );\n\n const availableOwners = value?.items || [];\n\n // Set selected owners on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamOwners.length) {\n const filter = new EntityOwnerFilter(queryParamOwners);\n setSelectedOwners(filter.values);\n }\n }, [queryParamOwners]);\n\n useEffect(() => {\n updateFilters({\n owners: selectedOwners.length\n ? new EntityOwnerFilter(selectedOwners)\n : undefined,\n });\n }, [selectedOwners, updateFilters]);\n\n if (\n ['user', 'group'].includes(\n filters.kind?.value.toLocaleLowerCase('en-US') || '',\n )\n ) {\n return null;\n }\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<Entity, true>\n label={t('entityOwnerPicker.title')}\n multiple\n disableCloseOnSelect\n loading={loading}\n options={availableOwners}\n value={selectedOwners as unknown as Entity[]}\n getOptionSelected={(o, v) => {\n if (typeof v === 'string') {\n return stringifyEntityRef(o) === v;\n }\n return o === v;\n }}\n getOptionLabel={o => {\n const entity =\n typeof o === 'string'\n ? cache.getEntity(o) ||\n parseEntityRef(o, {\n defaultKind: 'group',\n defaultNamespace: 'default',\n })\n : o;\n return entityPresentationSnapshot(\n entity,\n undefined,\n entityPresentationApi,\n ).primaryTitle;\n }}\n onChange={(_: object, owners) => {\n setText('');\n setSelectedOwners(\n owners.map(e => {\n const entityRef =\n typeof e === 'string' ? e : stringifyEntityRef(e);\n\n if (typeof e !== 'string') {\n cache.setEntity(e);\n }\n return entityRef;\n }),\n );\n }}\n filterOptions={x => x}\n renderOption={(entity, { selected }) => {\n return <RenderOptionLabel entity={entity} isSelected={selected} />;\n }}\n name=\"owner-picker\"\n onInputChange={(_e, inputValue) => {\n setText(inputValue);\n }}\n ListboxProps={{\n onScroll: (e: MouseEvent) => {\n const element = e.currentTarget;\n const hasReachedEnd =\n Math.abs(\n element.scrollHeight - element.clientHeight - element.scrollTop,\n ) < 1;\n\n if (hasReachedEnd && value?.cursor) {\n handleFetch({ items: value.items, cursor: value.cursor });\n }\n },\n 'data-testid': 'owner-picker-listbox',\n }}\n LabelProps={{ className: classes.label }}\n TextFieldProps={{ className: classes.input }}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useRef } from 'react';\nimport { useFacetsEntities } from './useFacetsEntities';\nimport { useQueryEntities } from './useQueryEntities';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../../api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { useMountEffect } from '@react-hookz/web';\n\nexport function useFetchEntities({\n mode,\n initialSelectedOwnersRefs,\n}: {\n mode: 'owners-only' | 'all';\n initialSelectedOwnersRefs: string[];\n}) {\n const isOwnersOnlyMode = mode === 'owners-only';\n const queryEntitiesResponse = useQueryEntities();\n const facetsEntitiesResponse = useFacetsEntities({\n enabled: isOwnersOnlyMode,\n });\n\n const [state, handleFetch] = isOwnersOnlyMode\n ? facetsEntitiesResponse\n : queryEntitiesResponse;\n\n return [\n state,\n handleFetch,\n useSelectedOwners({\n enabled: !isOwnersOnlyMode,\n initialSelectedOwnersRefs,\n }),\n ] as const;\n}\n\n/**\n * Hook used for storing the full entity of the specified owners\n * in order to display users and group using the information contained on each entity.\n * When a component is rendered for the first time, it loads the content of the entities\n * specified by `initialSelectedOwnersRefs` and export the `getEntity` and `setEntity`\n * utilities, used to retrieve and modify the owners.\n */\nfunction useSelectedOwners({\n enabled,\n initialSelectedOwnersRefs,\n}: {\n enabled: boolean;\n initialSelectedOwnersRefs: string[];\n}) {\n const allEntities = useRef<Record<string, Entity>>({});\n const catalogApi = useApi(catalogApiRef);\n\n const [, handleFetch] = useAsyncFn(async () => {\n const initialSelectedEntities = await catalogApi.getEntitiesByRefs({\n entityRefs: initialSelectedOwnersRefs,\n });\n initialSelectedEntities.items.forEach(e => {\n if (e) {\n allEntities.current[stringifyEntityRef(e)] = e;\n }\n });\n }, []);\n\n useMountEffect(() => {\n if (enabled && initialSelectedOwnersRefs.length > 0) {\n handleFetch();\n }\n });\n\n return {\n getEntity: (entityRef: string) => allEntities.current[entityRef],\n setEntity: (entity: Entity) => {\n allEntities.current[stringifyEntityRef(entity)] = entity;\n },\n };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../../api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { Entity } from '@backstage/catalog-model';\n\ntype QueryEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\nexport function useQueryEntities() {\n const catalogApi = useApi(catalogApiRef);\n return useAsyncFn(\n async (\n request: { text: string } | QueryEntitiesResponse,\n options?: { limit: number },\n ): Promise<QueryEntitiesResponse> => {\n const initialRequest = request as { text: string };\n const cursorRequest = request as QueryEntitiesResponse;\n const limit = options?.limit ?? 20;\n\n if (cursorRequest.cursor) {\n const response = await catalogApi.queryEntities({\n cursor: cursorRequest.cursor,\n limit,\n });\n return {\n cursor: response.pageInfo.nextCursor,\n items: [...cursorRequest.items, ...response.items],\n };\n }\n\n const response = await catalogApi.queryEntities({\n fullTextFilter: {\n term: initialRequest.text || '',\n fields: [\n 'metadata.name',\n 'kind',\n 'spec.profile.displayname',\n 'metadata.title',\n ],\n },\n filter: { kind: ['User', 'Group'] },\n orderFields: [{ field: 'metadata.name', order: 'asc' }],\n limit,\n });\n\n return {\n cursor: response.pageInfo.nextCursor,\n items: response.items,\n };\n },\n [],\n { loading: true },\n );\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef } from '../../api';\nimport { useState } from 'react';\nimport { Entity, parseEntityRef } from '@backstage/catalog-model';\n\ntype FacetsCursor = {\n start: number;\n text: string;\n};\n\ntype FacetsEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\ntype FacetsInitialRequest = {\n text: string;\n};\n\n/**\n * This hook asynchronously loads the entity owners using the facets endpoint.\n * EntityOwnerPicker uses this hook when mode=\"owners-only\" is passed as prop.\n * All the owners are kept internally in memory and rendered in batches once requested\n * by the frontend. The values returned by this hook are compatible with `useQueryEntities`\n * hook, which is also used by EntityOwnerPicker.\n * In this mode, the EntityOwnerPicker won't show detailed information of the owners.\n */\nexport function useFacetsEntities({ enabled }: { enabled: boolean }) {\n const catalogApi = useApi(catalogApiRef);\n\n const [facetsPromise] = useState(async () => {\n if (!enabled) {\n return [];\n }\n const facet = 'relations.ownedBy';\n\n return catalogApi\n .getEntityFacets({ facets: [facet] })\n .then(response =>\n response.facets[facet]\n .map(e => e.value)\n .map(ref => {\n const { kind, name, namespace } = parseEntityRef(ref);\n return {\n apiVersion: 'backstage.io/v1beta1',\n kind,\n metadata: { name, namespace },\n };\n })\n .sort(\n (a, b) =>\n a.kind.localeCompare(b.kind, 'en-US') ||\n a.metadata.namespace.localeCompare(\n b.metadata.namespace,\n 'en-US',\n ) ||\n a.metadata.name.localeCompare(b.metadata.name, 'en-US'),\n ),\n )\n .catch(() => []);\n });\n\n return useAsyncFn<\n (\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n options?: { limit?: number },\n ) => Promise<FacetsEntitiesResponse>\n >(\n async (request, options) => {\n const facets = await facetsPromise;\n\n if (!facets) {\n return {\n items: [],\n };\n }\n\n const limit = options?.limit ?? 20;\n\n const { text, start } = decodeCursor(request);\n const filteredRefs = facets.filter(e => filterEntity(text, e));\n const end = start + limit;\n return {\n items: filteredRefs.slice(0, end),\n ...encodeCursor({\n entities: filteredRefs,\n limit: end,\n payload: {\n text,\n start: end,\n },\n }),\n };\n },\n [facetsPromise],\n { loading: true, value: { items: [] } },\n );\n}\n\nfunction decodeCursor(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): FacetsCursor {\n if (isFacetsResponse(request) && request.cursor) {\n return JSON.parse(atob(request.cursor));\n }\n return {\n text: (request as FacetsInitialRequest).text || '',\n start: 0,\n };\n}\n\nfunction isFacetsResponse(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): request is FacetsEntitiesResponse {\n return !!(request as FacetsEntitiesResponse).cursor;\n}\n\nfunction encodeCursor({\n entities,\n limit,\n payload,\n}: {\n entities: Entity[];\n limit: number;\n payload: { text: string; start: number };\n}) {\n if (entities.length > limit) {\n return { cursor: btoa(JSON.stringify(payload)) };\n }\n return {};\n}\n\nfunction filterEntity(text: string, entity: Entity) {\n const normalizedText = text.trim();\n return (\n entity.kind.includes(normalizedText) ||\n entity.metadata.namespace?.includes(normalizedText) ||\n entity.metadata.name.includes(normalizedText)\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EntityErrorFilter, EntityOrphanFilter } from '../../filters';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { useState } from 'react';\nimport { useEntityList } from '../../hooks';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\n\n/** @public */\nexport type CatalogReactEntityProcessingStatusPickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n root: {},\n input: {},\n label: {},\n },\n { name: 'CatalogReactEntityProcessingStatusPickerPicker' },\n);\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/** @public */\nexport const EntityProcessingStatusPicker = () => {\n const classes = useStyles();\n const { updateFilters } = useEntityList();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const [selectedAdvancedItems, setSelectedAdvancedItems] = useState<string[]>(\n [],\n );\n\n function orphanChange(value: boolean) {\n updateFilters({\n orphan: value ? new EntityOrphanFilter(value) : undefined,\n });\n }\n\n function errorChange(value: boolean) {\n updateFilters({\n error: value ? new EntityErrorFilter(value) : undefined,\n });\n }\n\n const availableAdvancedItems = ['Is Orphan', 'Has Error'];\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<string, true>\n label={t('entityProcessingStatusPicker.title')}\n multiple\n disableCloseOnSelect\n options={availableAdvancedItems}\n value={selectedAdvancedItems}\n onChange={(_: object, value: string[]) => {\n setSelectedAdvancedItems(value);\n orphanChange(value.includes('Is Orphan'));\n errorChange(value.includes('Has Error'));\n }}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n onClick={event => event.preventDefault()}\n label={option}\n />\n )}\n name=\"processing-status-picker\"\n LabelProps={{ className: classes.label }}\n TextFieldProps={{ className: classes.input }}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport { EntityTagFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker/EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityTagPickerClassKey = 'input';\n\n/** @public */\nexport type EntityTagPickerProps = {\n showCounts?: boolean;\n initialFilter?: string[];\n hidden?: boolean;\n};\n\nconst useStyles = makeStyles(\n { input: {} },\n { name: 'CatalogReactEntityTagPicker' },\n);\n\n/** @public */\nexport const EntityTagPicker = (props: EntityTagPickerProps) => {\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityTagPicker.title')}\n name=\"tags\"\n path=\"metadata.tags\"\n Filter={EntityTagFilter}\n showCounts={props.showCounts}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={props.initialFilter ? props.initialFilter : []}\n hidden={props.hidden}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useEntityTypeFilter } from '../../hooks/useEntityTypeFilter';\n\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Select } from '@backstage/core-components';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/**\n * Props for {@link EntityTypePicker}.\n *\n * @public\n */\nexport interface EntityTypePickerProps {\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityTypePicker = (props: EntityTypePickerProps) => {\n const { hidden, initialFilter } = props;\n const alertApi = useApi(alertApiRef);\n const { error, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: t('entityTypePicker.errorMessage'),\n severity: 'error',\n });\n }\n if (initialFilter) {\n setSelectedTypes([initialFilter]);\n }\n }, [error, alertApi, initialFilter, setSelectedTypes, t]);\n\n if (availableTypes.length === 0 || error) return null;\n\n availableTypes.sort((a, b) =>\n a.toLocaleLowerCase('en-US').localeCompare(b.toLocaleLowerCase('en-US')),\n );\n\n const items = [\n { value: 'all', label: t('entityTypePicker.optionAllTitle') },\n ...availableTypes.map((type: string) => ({\n value: type,\n label: type,\n })),\n ];\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label={t('entityTypePicker.title')}\n items={items}\n selected={(items.length > 1 ? selectedTypes[0] : undefined) ?? 'all'}\n onChange={value =>\n setSelectedTypes(value === 'all' ? [] : [String(value)])\n }\n />\n </Box>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport isEqual from 'lodash/isEqual';\nimport sortBy from 'lodash/sortBy';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../api';\nimport { useEntityList } from './useEntityListProvider';\nimport { EntityTypeFilter } from '../filters';\n\n/**\n * A hook built on top of `useEntityList` for enabling selection of valid `spec.type` values\n * based on the selected EntityKindFilter.\n * @public\n */\nexport function useEntityTypeFilter(): {\n loading: boolean;\n error?: Error;\n availableTypes: string[];\n selectedTypes: string[];\n setSelectedTypes: (types: string[]) => void;\n} {\n const catalogApi = useApi(catalogApiRef);\n const {\n filters: { kind: kindFilter, type: typeFilter },\n queryParameters: { type: typeParameter },\n updateFilters,\n } = useEntityList();\n\n const flattenedQueryTypes = useMemo(\n () => [typeParameter].flat().filter(Boolean) as string[],\n [typeParameter],\n );\n\n const [selectedTypes, setSelectedTypes] = useState(\n flattenedQueryTypes.length\n ? flattenedQueryTypes\n : typeFilter?.getTypes() ?? [],\n );\n\n // Set selected types on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (flattenedQueryTypes.length) {\n setSelectedTypes(flattenedQueryTypes);\n }\n }, [flattenedQueryTypes]);\n\n const [availableTypes, setAvailableTypes] = useState<string[]>([]);\n const kind = useMemo(() => kindFilter?.value, [kindFilter]);\n\n // Load all valid spec.type values straight from the catalogApi, paying attention to only the\n // kind filter for a complete list.\n const {\n error,\n loading,\n value: facets,\n } = useAsync(async () => {\n if (kind) {\n const items = await catalogApi\n .getEntityFacets({\n filter: { kind },\n facets: ['spec.type'],\n })\n .then(response => response.facets['spec.type'] || []);\n return items;\n }\n return [];\n }, [kind, catalogApi]);\n\n const facetsRef = useRef(facets);\n useEffect(() => {\n const oldFacets = facetsRef.current;\n facetsRef.current = facets;\n // Delay processing hook until kind and facets load updates have settled to generate list of types;\n // This prevents resetting the type filter due to saved type value from query params not matching the\n // empty set of type values while values are still being loaded; also only run this hook on changes\n // to facets\n if (loading || !kind || oldFacets === facets || !facets) {\n return;\n }\n\n // Sort by facet count descending, so the most common types appear on top\n const newTypes = [\n ...new Set(\n sortBy(facets, f => -f.count).map(f =>\n f.value.toLocaleLowerCase('en-US'),\n ),\n ),\n ];\n setAvailableTypes(newTypes);\n\n // Update type filter to only valid values when the list of available types has changed\n const stillValidTypes = selectedTypes.filter(value =>\n newTypes.includes(value),\n );\n if (!isEqual(selectedTypes, stillValidTypes)) {\n setSelectedTypes(stillValidTypes);\n }\n }, [loading, kind, selectedTypes, setSelectedTypes, facets]);\n\n useEffect(() => {\n updateFilters({\n type: selectedTypes.length\n ? new EntityTypeFilter(selectedTypes)\n : undefined,\n });\n }, [selectedTypes, updateFilters]);\n\n return {\n loading,\n error,\n availableTypes,\n selectedTypes,\n setSelectedTypes,\n };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n configApiRef,\n IconComponent,\n useApi,\n} from '@backstage/core-plugin-api';\nimport Card from '@material-ui/core/Card';\nimport List from '@material-ui/core/List';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { StarIcon } from '@backstage/core-components';\nimport { Fragment, useEffect, useMemo, useState } from 'react';\nimport { EntityUserFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { UserListFilterKind } from '../../types';\nimport { useOwnedEntitiesCount } from './useOwnedEntitiesCount';\nimport { useAllEntitiesCount } from './useAllEntitiesCount';\nimport { useStarredEntitiesCount } from './useStarredEntitiesCount';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { catalogReactTranslationRef } from '../../translation';\n\n/** @public */\nexport type CatalogReactUserListPickerClassKey =\n | 'root'\n | 'title'\n | 'listIcon'\n | 'menuItem'\n | 'groupWrapper';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n boxShadow: 'none',\n margin: theme.spacing(1, 0, 1, 0),\n },\n title: {\n margin: theme.spacing(1, 0, 0, 1),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n listIcon: {\n minWidth: 30,\n color: theme.palette.text.primary,\n },\n menuItem: {\n minHeight: theme.spacing(6),\n },\n groupWrapper: {\n margin: theme.spacing(1, 1, 2, 1),\n },\n }),\n { name: 'CatalogReactUserListPicker' },\n);\n\nexport type ButtonGroup = {\n name: string;\n items: {\n id: 'owned' | 'starred' | 'all';\n label: string;\n icon?: IconComponent;\n }[];\n};\n\nfunction getFilterGroups(\n orgName: string,\n t: TranslationFunction<typeof catalogReactTranslationRef.T>,\n): ButtonGroup[] {\n return [\n {\n name: t('userListPicker.personalFilter.title'),\n items: [\n {\n id: 'owned',\n label: t('userListPicker.personalFilter.ownedLabel'),\n icon: SettingsIcon,\n },\n {\n id: 'starred',\n label: t('userListPicker.personalFilter.starredLabel'),\n icon: StarIcon,\n },\n ],\n },\n {\n name: orgName,\n items: [\n {\n id: 'all',\n label: t('userListPicker.orgFilterAllLabel'),\n },\n ],\n },\n ];\n}\n\n/** @public */\nexport type UserListPickerProps = {\n initialFilter?: UserListFilterKind;\n availableFilters?: UserListFilterKind[];\n hidden?: boolean;\n alwaysKeepFilters?: boolean;\n};\n\n/** @public */\nexport const UserListPicker = (props: UserListPickerProps) => {\n const { initialFilter, availableFilters, hidden, alwaysKeepFilters } = props;\n const classes = useStyles();\n const configApi = useApi(configApiRef);\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const orgName =\n configApi.getOptionalString('organization.name') ??\n t('userListPicker.defaultOrgName');\n const {\n filters,\n updateFilters,\n queryParameters: { user: userParameter },\n } = useEntityList();\n const kindParameter = filters.kind?.value?.toLowerCase();\n\n // Remove group items that aren't in availableFilters and exclude\n // any now-empty groups.\n const userAndGroupFilterIds = ['starred', 'all'];\n const filterGroups = getFilterGroups(orgName, t)\n .map(filterGroup => ({\n ...filterGroup,\n items: filterGroup.items.filter(({ id }) =>\n // TODO: avoid hardcoding kinds here\n ['group', 'user'].some(kind => kind === kindParameter)\n ? userAndGroupFilterIds.includes(id)\n : !availableFilters || availableFilters.includes(id),\n ),\n }))\n .filter(({ items }) => !!items.length);\n\n const {\n count: ownedEntitiesCount,\n loading: loadingOwnedEntities,\n filter: ownedEntitiesFilter,\n } = useOwnedEntitiesCount();\n const { count: allCount } = useAllEntitiesCount();\n const {\n count: starredEntitiesCount,\n filter: starredEntitiesFilter,\n loading: loadingStarredEntities,\n } = useStarredEntitiesCount();\n\n const queryParamUserFilter = useMemo(\n () => [userParameter].flat()[0],\n [userParameter],\n );\n\n const [selectedUserFilter, setSelectedUserFilter] = useState(\n (queryParamUserFilter as UserListFilterKind) ?? initialFilter,\n );\n\n const filterCounts = useMemo(() => {\n return {\n all: allCount,\n starred: starredEntitiesCount,\n owned: ownedEntitiesCount,\n };\n }, [starredEntitiesCount, ownedEntitiesCount, allCount]);\n\n // Set selected user filter on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamUserFilter) {\n setSelectedUserFilter(queryParamUserFilter as UserListFilterKind);\n }\n }, [queryParamUserFilter]);\n\n const loading = loadingOwnedEntities || loadingStarredEntities;\n\n useEffect(() => {\n if (\n !loading &&\n !!selectedUserFilter &&\n selectedUserFilter !== 'all' &&\n filterCounts[selectedUserFilter] === 0 &&\n !alwaysKeepFilters\n ) {\n setSelectedUserFilter('all');\n }\n }, [\n loading,\n filterCounts,\n selectedUserFilter,\n setSelectedUserFilter,\n alwaysKeepFilters,\n ]);\n\n useEffect(() => {\n if (!selectedUserFilter) {\n return;\n }\n if (loading) {\n return;\n }\n\n const getFilter = () => {\n if (selectedUserFilter === 'owned') {\n return ownedEntitiesFilter;\n }\n if (selectedUserFilter === 'starred') {\n return starredEntitiesFilter;\n }\n return EntityUserFilter.all();\n };\n\n updateFilters({ user: getFilter() });\n }, [\n selectedUserFilter,\n starredEntitiesFilter,\n ownedEntitiesFilter,\n updateFilters,\n\n loading,\n ]);\n\n return hidden ? null : (\n <Card className={classes.root}>\n {filterGroups.map(group => (\n <Fragment key={group.name}>\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.title}\n >\n {group.name}\n </Typography>\n <Card className={classes.groupWrapper}>\n <List disablePadding dense role=\"menu\" aria-label={group.name}>\n {group.items.map((item, index) => (\n <MenuItem\n role=\"none presentation\"\n key={item.id}\n divider={index !== group.items.length - 1}\n onClick={() => setSelectedUserFilter(item.id)}\n selected={item.id === filters.user?.value}\n className={classes.menuItem}\n disabled={filterCounts[item.id] === 0}\n data-testid={`user-picker-${item.id}`}\n tabIndex={0}\n ContainerProps={{ role: 'menuitem' }}\n >\n {item.icon && (\n <ListItemIcon className={classes.listIcon}>\n <item.icon fontSize=\"small\" />\n </ListItemIcon>\n )}\n <ListItemText>\n <Typography variant=\"body1\">{item.label} </Typography>\n </ListItemText>\n <ListItemSecondaryAction>\n {filterCounts[item.id] ?? '-'}\n </ListItemSecondaryAction>\n </MenuItem>\n ))}\n </List>\n </Card>\n </Fragment>\n ))}\n </Card>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { compact, intersection } from 'lodash';\nimport { useMemo } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityOwnerFilter, EntityUserFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { CatalogFilters, reduceCatalogFilters } from '../../utils/filters';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDeepCompareEffect from 'react-use/esm/useDeepCompareEffect';\n\nexport function useOwnedEntitiesCount() {\n const identityApi = useApi(identityApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n const { filters } = useEntityList();\n\n const { value: ownershipEntityRefs, loading: loadingEntityRefs } = useAsync(\n async () => (await identityApi.getBackstageIdentity()).ownershipEntityRefs,\n // load only on mount\n [],\n );\n\n const { user, owners, ...allFilters } = filters;\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(\n compact(Object.values(allFilters)),\n );\n\n const [{ value: count, loading: loadingEntityOwnership }, fetchEntities] =\n useAsyncFn(\n async (req: {\n ownershipEntityRefs: string[];\n owners: EntityOwnerFilter | undefined;\n filter: CatalogFilters;\n }) => {\n const ownedClaims = getOwnedCountClaims(\n req.owners,\n req.ownershipEntityRefs,\n );\n if (ownedClaims === undefined) {\n // this implicitly means that there aren't claims in common with\n // the logged in users, so avoid invoking the queryEntities endpoint\n // which will implicitly returns 0\n return 0;\n }\n\n const { ['metadata.name']: metadata, ...filter } = req.filter.filter;\n\n const { totalItems } = await catalogApi.queryEntities({\n ...req.filter,\n filter: {\n ...filter,\n 'relations.ownedBy': ownedClaims,\n },\n limit: 0,\n });\n return totalItems;\n },\n [],\n { loading: true },\n );\n\n useDeepCompareEffect(() => {\n // context contains no filter, wait\n if (Object.keys(catalogFilters.filter).length === 0) {\n return;\n }\n // ownershipEntityRefs is loading, wait\n if (ownershipEntityRefs === undefined) {\n return;\n }\n fetchEntities({\n ownershipEntityRefs,\n owners,\n filter: catalogFilters,\n });\n }, [ownershipEntityRefs, owners, catalogFilters]);\n\n const loading = loadingEntityRefs || loadingEntityOwnership;\n\n return {\n count,\n loading,\n filter: useMemo(\n () => EntityUserFilter.owned(ownershipEntityRefs ?? []),\n [ownershipEntityRefs],\n ),\n ownershipEntityRefs,\n };\n}\n\nfunction getOwnedCountClaims(\n owners: EntityOwnerFilter | undefined,\n ownershipEntityRefs: string[] | undefined,\n) {\n if (ownershipEntityRefs === undefined) {\n return undefined;\n }\n const ownersRefs = owners?.values ?? [];\n if (ownersRefs.length) {\n const commonOwnedBy = intersection(ownersRefs, ownershipEntityRefs);\n if (commonOwnedBy.length === 0) {\n return undefined;\n }\n return commonOwnedBy;\n }\n return ownershipEntityRefs;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { QueryEntitiesInitialRequest } from '@backstage/catalog-client';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { compact, isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { useEntityList } from '../../hooks';\nimport { reduceCatalogFilters } from '../../utils/filters';\n\nexport function useAllEntitiesCount() {\n const catalogApi = useApi(catalogApiRef);\n const { filters } = useEntityList();\n\n const prevRequest = useRef<QueryEntitiesInitialRequest>();\n const request = useMemo(() => {\n const { user, ...allFilters } = filters;\n const compacted = compact(Object.values(allFilters));\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(compacted);\n const newRequest: QueryEntitiesInitialRequest = {\n ...catalogFilters,\n limit: 0,\n };\n\n if (Object.keys(catalogFilters.filter).length === 0) {\n prevRequest.current = undefined;\n return prevRequest.current;\n }\n\n if (isEqual(newRequest, prevRequest.current)) {\n return prevRequest.current;\n }\n prevRequest.current = newRequest;\n return newRequest;\n }, [filters]);\n\n const { value: count, loading } = useAsync(async () => {\n if (request === undefined) {\n return 0;\n }\n const { totalItems } = await catalogApi.queryEntities(request);\n\n return totalItems;\n }, [request]);\n\n return { count, loading };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryEntitiesInitialRequest } from '@backstage/catalog-client';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { compact, isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityUserFilter } from '../../filters';\nimport { useEntityList, useStarredEntities } from '../../hooks';\nimport { reduceCatalogFilters } from '../../utils/filters';\n\nexport function useStarredEntitiesCount() {\n const catalogApi = useApi(catalogApiRef);\n const { filters } = useEntityList();\n const { starredEntities } = useStarredEntities();\n\n const prevRequest = useRef<QueryEntitiesInitialRequest>();\n const request = useMemo(() => {\n const { user, ...allFilters } = filters;\n const compacted = compact(Object.values(allFilters));\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(compacted);\n\n const facet = 'metadata.name';\n\n const newRequest: QueryEntitiesInitialRequest = {\n ...catalogFilters,\n filter: {\n ...catalogFilters.filter,\n /**\n * here we are filtering entities by `name`. Given this filter,\n * the response might contain more entities than expected, in case multiple entities\n * of different kind or namespace share the same name. Those extra entities are filtered out\n * client side by `EntityUserFilter`, so they won't be visible to the user.\n */\n [facet]: Array.from(starredEntities).map(e => parseEntityRef(e).name),\n },\n /**\n * limit is set to a high value as we are not expecting many starred entities\n */\n limit: 1000,\n };\n if (isEqual(newRequest, prevRequest.current)) {\n return prevRequest.current;\n }\n prevRequest.current = newRequest;\n\n return newRequest;\n }, [filters, starredEntities]);\n\n const { value: count, loading } = useAsync(async () => {\n if (!starredEntities.size) {\n return 0;\n }\n\n /**\n * given a list of starred entity refs and some filters coming from CatalogPage,\n * it reduces the list of starred entities, to a list of entities that matches the\n * provided filters. It won't be possible to getEntitiesByRefs\n * as the method doesn't accept any filter.\n */\n const response = await catalogApi.queryEntities(request);\n\n return response.items\n .map(e =>\n stringifyEntityRef({\n kind: e.kind,\n namespace: e.metadata.namespace,\n name: e.metadata.name,\n }),\n )\n .filter(e => starredEntities.has(e)).length;\n }, [request, starredEntities]);\n\n const filter = useMemo(\n () => EntityUserFilter.starred(Array.from(starredEntities)),\n [starredEntities],\n );\n\n return { count, loading, filter };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { AlphaEntity } from '@backstage/catalog-model/alpha';\nimport { EntityFilter, UserListFilterKind } from './types';\nimport { getEntityRelations } from './utils/getEntityRelations';\nimport { EntityOrderQuery } from '@backstage/catalog-client';\n\n/**\n * Filter entities based on Kind.\n * @public\n */\nexport class EntityKindFilter implements EntityFilter {\n readonly value: string;\n readonly label: string;\n\n constructor(value: string, label: string) {\n this.value = value;\n this.label = label;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { kind: this.value };\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based on type\n * @public\n */\nexport class EntityTypeFilter implements EntityFilter {\n readonly value: string | string[];\n\n constructor(value: string | string[]) {\n this.value = value;\n }\n\n // Simplify `string | string[]` for consumers, always returns an array\n getTypes(): string[] {\n return Array.isArray(this.value) ? this.value : [this.value];\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'spec.type': this.getTypes() };\n }\n\n toQueryValue(): string[] {\n return this.getTypes();\n }\n}\n\n/**\n * Filters entities based on tag.\n * @public\n */\nexport class EntityTagFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.every(v => (entity.metadata.tags ?? []).includes(v));\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'metadata.tags': this.values };\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities where the text matches spec, title or tags.\n * @public\n */\nexport class EntityTextFilter implements EntityFilter {\n readonly value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n\n filterEntity(entity: Entity): boolean {\n const words = this.toUpperArray(this.value.split(/\\s/));\n const exactMatch = this.toUpperArray([entity.metadata.tags]);\n const partialMatch = this.toUpperArray([\n entity.metadata.name,\n entity.metadata.title,\n (entity.spec?.profile as { displayName?: string })?.displayName,\n ]);\n\n for (const word of words) {\n if (\n exactMatch.every(m => m !== word) &&\n partialMatch.every(m => !m.includes(word))\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n getFullTextFilters() {\n return {\n term: this.value,\n // Update this to be more dynamic based on table columns.\n fields: ['metadata.name', 'metadata.title', 'spec.profile.displayName'],\n };\n }\n\n toQueryValue() {\n return this.value;\n }\n\n private toUpperArray(\n value: Array<string | string[] | undefined>,\n ): Array<string> {\n return value\n .flat()\n .filter((m): m is string => Boolean(m))\n .map(m => m.toLocaleUpperCase('en-US'));\n }\n}\n\n/**\n * Filter matching entities that are owned by group.\n * @public\n *\n * CAUTION: This class may contain both full and partial entity refs.\n */\nexport class EntityOwnerFilter implements EntityFilter {\n readonly values: string[];\n constructor(values: string[]) {\n this.values = values.reduce((fullRefs, ref) => {\n // Attempt to remove bad entity references here.\n try {\n fullRefs.push(\n stringifyEntityRef(parseEntityRef(ref, { defaultKind: 'Group' })),\n );\n return fullRefs;\n } catch (err) {\n return fullRefs;\n }\n }, [] as string[]);\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'relations.ownedBy': this.values };\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.some(v =>\n getEntityRelations(entity, RELATION_OWNED_BY).some(\n o => stringifyEntityRef(o) === v,\n ),\n );\n }\n\n /**\n * Get the URL query parameter value. May be a mix of full and humanized entity refs.\n * @returns list of entity refs.\n */\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities on lifecycle.\n * @public\n */\nexport class EntityLifecycleFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'spec.lifecycle': this.values };\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.some(v => entity.spec?.lifecycle === v);\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities to those within the given namespace(s).\n * @public\n */\nexport class EntityNamespaceFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'metadata.namespace': this.values };\n }\n filterEntity(entity: Entity): boolean {\n return this.values.some(v => entity.metadata.namespace === v);\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * @public\n */\nexport class EntityUserFilter implements EntityFilter {\n readonly value: UserListFilterKind;\n readonly refs?: string[];\n\n private constructor(value: UserListFilterKind, refs?: string[]) {\n this.value = value;\n this.refs = refs;\n }\n\n static owned(ownershipEntityRefs: string[]) {\n return new EntityUserFilter('owned', ownershipEntityRefs);\n }\n\n static all() {\n return new EntityUserFilter('all');\n }\n\n static starred(starredEntityRefs: string[]) {\n return new EntityUserFilter('starred', starredEntityRefs);\n }\n\n getCatalogFilters(): Record<string, string[]> {\n if (this.value === 'owned') {\n return { 'relations.ownedBy': this.refs ?? [] };\n }\n if (this.value === 'starred') {\n return {\n 'metadata.name': this.refs?.map(e => parseEntityRef(e).name) ?? [],\n };\n }\n return {};\n }\n\n filterEntity(entity: Entity) {\n if (this.value === 'starred') {\n return this.refs?.includes(stringifyEntityRef(entity)) ?? true;\n }\n // used only for retro-compatibility with non paginated data.\n // This is supposed to return always true for paginated\n // owned entities, since the filters are applied server side.\n if (this.value === 'owned') {\n const relations = getEntityRelations(entity, RELATION_OWNED_BY);\n\n return (\n this.refs?.some(v =>\n relations.some(o => stringifyEntityRef(o) === v),\n ) ?? false\n );\n }\n return true;\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based on whatever the user has starred or owns them.\n * @deprecated use EntityUserFilter\n * @public\n */\nexport class UserListFilter implements EntityFilter {\n readonly value: UserListFilterKind;\n readonly isOwnedEntity: (entity: Entity) => boolean;\n readonly isStarredEntity: (entity: Entity) => boolean;\n\n constructor(\n value: UserListFilterKind,\n isOwnedEntity: (entity: Entity) => boolean,\n isStarredEntity: (entity: Entity) => boolean,\n ) {\n this.value = value;\n this.isOwnedEntity = isOwnedEntity;\n this.isStarredEntity = isStarredEntity;\n }\n\n filterEntity(entity: Entity): boolean {\n switch (this.value) {\n case 'owned':\n return this.isOwnedEntity(entity);\n case 'starred':\n return this.isStarredEntity(entity);\n default:\n return true;\n }\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based if it is an orphan or not.\n * @public\n */\nexport class EntityOrphanFilter implements EntityFilter {\n readonly value: boolean;\n\n constructor(value: boolean) {\n this.value = value;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n if (this.value) {\n return { 'metadata.annotations.backstage.io/orphan': String(this.value) };\n }\n return {};\n }\n\n filterEntity(entity: Entity): boolean {\n const orphan = entity.metadata.annotations?.['backstage.io/orphan'];\n return orphan !== undefined && this.value.toString() === orphan;\n }\n}\n\n/**\n * Filters entities based on if it has errors or not.\n * @public\n */\nexport class EntityErrorFilter implements EntityFilter {\n readonly value: boolean;\n\n constructor(value: boolean) {\n this.value = value;\n }\n\n filterEntity(entity: Entity): boolean {\n const error =\n ((entity as AlphaEntity)?.status?.items?.length as number) > 0;\n return error !== undefined && this.value === error;\n }\n}\n\n/**\n * Sort entities by a given field/column.\n * @public\n */\nexport class EntityOrderFilter implements EntityFilter {\n readonly values: [string, 'asc' | 'desc'][];\n\n constructor(values: [string, 'asc' | 'desc'][]) {\n this.values = values;\n }\n\n getOrderFilters(): EntityOrderQuery {\n return this.values.map(([field, order]) => ({ field, order }));\n }\n\n toQueryValue(): string[] {\n return this.values.flat();\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryEntitiesResponse } from '@backstage/catalog-client';\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n createVersionedContext,\n createVersionedValueMap,\n useVersionedContext,\n} from '@backstage/version-bridge';\nimport { compact, isEqual } from 'lodash';\nimport qs from 'qs';\nimport {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport useMountedState from 'react-use/esm/useMountedState';\nimport { catalogApiRef } from '../api';\nimport {\n EntityErrorFilter,\n EntityKindFilter,\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityTypeFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityFilter, EntityListPagination } from '../types';\nimport {\n reduceBackendCatalogFilters,\n reduceCatalogFilters,\n reduceEntityFilters,\n} from '../utils/filters';\n\n/** @public */\nexport type DefaultEntityFilters = {\n kind?: EntityKindFilter;\n type?: EntityTypeFilter;\n user?: UserListFilter | EntityUserFilter;\n owners?: EntityOwnerFilter;\n lifecycles?: EntityLifecycleFilter;\n tags?: EntityTagFilter;\n text?: EntityTextFilter;\n orphan?: EntityOrphanFilter;\n error?: EntityErrorFilter;\n namespace?: EntityNamespaceFilter;\n order?: EntityOrderFilter;\n};\n\n/** @public */\nexport type PaginationMode = 'cursor' | 'offset' | 'none';\n\n/** @public */\nexport type EntityListContextProps<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n> = {\n /**\n * The currently registered filters, adhering to the shape of DefaultEntityFilters or an extension\n * of that default (to add custom filter types).\n */\n filters: EntityFilters;\n\n /**\n * The resolved list of catalog entities, after all filters are applied.\n */\n entities: Entity[];\n\n /**\n * The resolved list of catalog entities, after _only catalog-backend_ filters are applied.\n */\n backendEntities: Entity[];\n\n /**\n * Update one or more of the registered filters. Optional filters can be set to `undefined` to\n * reset the filter.\n */\n updateFilters: (\n filters:\n | Partial<EntityFilters>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => void;\n\n /**\n * Filter values from query parameters.\n */\n queryParameters: Partial<Record<keyof EntityFilters, string | string[]>>;\n\n loading: boolean;\n error?: Error;\n\n pageInfo?: {\n next?: () => void;\n prev?: () => void;\n };\n totalItems?: number;\n limit: number;\n offset?: number;\n setLimit: (limit: number) => void;\n setOffset?: (offset: number) => void;\n paginationMode: PaginationMode;\n};\n\n// This context has support for multiple concurrent versions of this package.\n// It is currently used in parallel with the old context in order to provide\n// a smooth transition, but will eventually be the only context we use.\nexport const NewEntityListContext = createVersionedContext<{\n 1: EntityListContextProps<any>;\n}>('entity-list-context');\n\n/**\n * Creates new context for entity listing and filtering.\n */\nexport const OldEntityListContext = createContext<\n EntityListContextProps<any> | undefined\n>(undefined);\n\ntype OutputState<EntityFilters extends DefaultEntityFilters> = {\n appliedFilters: EntityFilters;\n appliedCursor?: string;\n entities: Entity[];\n backendEntities: Entity[];\n pageInfo?: QueryEntitiesResponse['pageInfo'];\n totalItems?: number;\n offset?: number;\n limit?: number;\n};\n\n/**\n * @public\n */\nexport type EntityListProviderProps = PropsWithChildren<{\n pagination?: EntityListPagination;\n}>;\n\n/**\n * Provides entities and filters for a catalog listing.\n * @public\n */\nexport const EntityListProvider = <EntityFilters extends DefaultEntityFilters>(\n props: EntityListProviderProps,\n) => {\n const isMounted = useMountedState();\n const catalogApi = useApi(catalogApiRef);\n const [requestedFilters, setRequestedFilters] = useState<EntityFilters>(\n {} as EntityFilters,\n );\n\n // We use react-router's useLocation hook so updates from external sources trigger an update to\n // the queryParameters in outputState. Updates from this hook use replaceState below and won't\n // trigger a useLocation change; this would instead come from an external source, such as a manual\n // update of the URL or two catalog sidebar links with different catalog filters.\n const location = useLocation();\n\n const getPaginationMode = (): PaginationMode => {\n if (props.pagination === true) {\n return 'cursor';\n }\n return typeof props.pagination === 'object'\n ? props.pagination.mode ?? 'cursor'\n : 'none';\n };\n\n const paginationMode = getPaginationMode();\n const paginationLimit =\n typeof props.pagination === 'object' ? props.pagination.limit ?? 20 : 20;\n\n const {\n queryParameters,\n cursor: initialCursor,\n offset: initialOffset,\n limit: initialLimit,\n } = useMemo(() => {\n const parsed = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n\n let limit = paginationLimit;\n if (typeof parsed.limit === 'string') {\n const queryLimit = Number.parseInt(parsed.limit, 10);\n if (!isNaN(queryLimit)) {\n limit = queryLimit;\n }\n }\n\n const offset =\n typeof parsed.offset === 'string' && paginationMode === 'offset'\n ? Number.parseInt(parsed.offset, 10)\n : undefined;\n\n return {\n queryParameters: (parsed.filters ?? {}) as Record<\n string,\n string | string[]\n >,\n cursor:\n typeof parsed.cursor === 'string' && paginationMode === 'cursor'\n ? parsed.cursor\n : undefined,\n offset:\n paginationMode === 'offset' && offset && !isNaN(offset)\n ? offset\n : undefined,\n limit,\n };\n }, [paginationMode, location.search, paginationLimit]);\n\n const [cursor, setCursor] = useState(initialCursor);\n const [offset, setOffset] = useState<number | undefined>(initialOffset);\n const [limit, setLimit] = useState(initialLimit);\n\n const [outputState, setOutputState] = useState<OutputState<EntityFilters>>(\n () => {\n return {\n appliedFilters: {} as EntityFilters,\n entities: [],\n backendEntities: [],\n pageInfo: {},\n offset,\n limit,\n };\n },\n );\n\n // The main async filter worker. Note that while it has a lot of dependencies\n // in terms of its implementation, the triggering only happens (debounced)\n // based on the requested filters changing.\n const [{ value: resolvedValue, loading, error }, refresh] = useAsyncFn(\n async () => {\n const kindValue =\n requestedFilters.kind?.value?.toLocaleLowerCase('en-US');\n const adjustedFilters =\n kindValue === 'user' || kindValue === 'group'\n ? { ...requestedFilters, owners: undefined }\n : requestedFilters;\n const compacted = compact(Object.values(adjustedFilters));\n const entityFilter = reduceEntityFilters(compacted);\n\n if (paginationMode !== 'none') {\n if (cursor) {\n if (cursor !== outputState.appliedCursor) {\n const response = await catalogApi.queryEntities({\n cursor,\n limit,\n });\n return {\n appliedFilters: requestedFilters,\n appliedCursor: cursor,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n appliedCursor: outputState.appliedCursor,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n if (\n (paginationMode === 'offset' &&\n (outputState.limit !== limit || outputState.offset !== offset)) ||\n !isEqual(previousBackendFilter, backendFilter)\n ) {\n const response = await catalogApi.queryEntities({\n ...backendFilter,\n limit,\n offset,\n });\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n limit,\n offset,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceBackendCatalogFilters(compacted);\n const { orderFields } = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceBackendCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n // TODO(mtlewis): currently entities will never be requested unless\n // there's at least one filter, we should allow an initial request\n // to happen with no filters.\n if (!isEqual(previousBackendFilter, backendFilter)) {\n // TODO(timbonicus): should limit fields here, but would need filter\n // fields + table columns\n const response = await catalogApi.getEntities({\n filter: backendFilter,\n order: orderFields,\n });\n const entities = response.items.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities,\n totalItems: entities.length,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n totalItems: entities.length,\n };\n },\n [\n catalogApi,\n queryParameters,\n requestedFilters,\n outputState,\n cursor,\n paginationMode,\n limit,\n offset,\n ],\n { loading: true },\n );\n\n // Slight debounce on the refresh, since (especially on page load) several\n // filters will be calling this in rapid succession.\n useDebounce(refresh, 10, [requestedFilters, cursor, limit, offset]);\n\n useEffect(() => {\n if (resolvedValue === undefined) {\n return;\n }\n setOutputState(resolvedValue);\n if (isMounted()) {\n const queryParams = Object.keys(requestedFilters).reduce(\n (params, key) => {\n const filter = requestedFilters[key as keyof EntityFilters] as\n | EntityFilter\n | undefined;\n if (filter?.toQueryValue) {\n params[key] = filter.toQueryValue();\n }\n return params;\n },\n {} as Record<string, string | string[]>,\n );\n\n const oldParams = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n const newParams = qs.stringify(\n {\n ...oldParams,\n filters: queryParams,\n ...(paginationMode === 'none' ? {} : { cursor, limit, offset }),\n },\n { addQueryPrefix: true, arrayFormat: 'repeat' },\n );\n const newUrl = `${window.location.pathname}${newParams}`;\n // We use direct history manipulation since useSearchParams and\n // useNavigate in react-router-dom cause unnecessary extra rerenders.\n // Also make sure to replace the state rather than pushing, since we\n // don't want there to be back/forward slots for every single filter\n // change.\n window.history?.replaceState(null, document.title, newUrl);\n }\n }, [\n cursor,\n isMounted,\n limit,\n location.search,\n offset,\n requestedFilters,\n resolvedValue,\n paginationMode,\n ]);\n\n const updateFilters = useCallback(\n (\n update:\n | Partial<EntityFilter>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => {\n // changing filters will affect pagination, so we need to reset\n // the cursor and start from the first page.\n // TODO(vinzscam): this is currently causing issues at page reload\n // where the state is not kept. Unfortunately we need to rethink\n // the way filters work in order to fix this.\n if (paginationMode === 'cursor') {\n setCursor(undefined);\n } else if (paginationMode === 'offset') {\n // Same thing with offset\n setOffset(0);\n }\n setRequestedFilters(prevFilters => {\n const newFilters =\n typeof update === 'function' ? update(prevFilters) : update;\n return { ...prevFilters, ...newFilters };\n });\n },\n [paginationMode],\n );\n\n // Use resolvedValue directly when available to avoid an extra render cycle.\n // Without this, there's a render where loading has flipped back to false but\n // outputState hasn't been updated yet (it syncs via useEffect), causing a\n // flash of stale data between the loading state and the new results.\n const latestOutput = resolvedValue ?? outputState;\n\n const pageInfo = useMemo(() => {\n if (paginationMode !== 'cursor') {\n return undefined;\n }\n\n const prevCursor = latestOutput.pageInfo?.prevCursor;\n const nextCursor = latestOutput.pageInfo?.nextCursor;\n return {\n prev: prevCursor ? () => setCursor(prevCursor) : undefined,\n next: nextCursor ? () => setCursor(nextCursor) : undefined,\n };\n }, [paginationMode, latestOutput.pageInfo]);\n\n const value = useMemo(\n () => ({\n filters: latestOutput.appliedFilters,\n entities: latestOutput.entities,\n backendEntities: latestOutput.backendEntities,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n totalItems: latestOutput.totalItems,\n limit,\n offset,\n setLimit,\n setOffset,\n paginationMode,\n }),\n [\n latestOutput,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n limit,\n offset,\n paginationMode,\n setLimit,\n setOffset,\n ],\n );\n\n return (\n <OldEntityListContext.Provider value={value}>\n <NewEntityListContext.Provider\n value={createVersionedValueMap({ 1: value })}\n >\n {props.children}\n </NewEntityListContext.Provider>\n </OldEntityListContext.Provider>\n );\n};\n\n/**\n * Hook for interacting with the entity list context provided by the {@link EntityListProvider}.\n * @public\n */\nexport function useEntityList<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n>(): EntityListContextProps<EntityFilters> {\n const versionedHolder = useVersionedContext<{\n 1: EntityListContextProps<any>;\n }>('entity-list-context');\n const oldContext = useContext(OldEntityListContext);\n\n if (versionedHolder) {\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error('EntityListContext v1 not available');\n }\n return value;\n }\n\n if (oldContext) {\n return oldContext;\n }\n\n throw new Error('useEntityList must be used within EntityListProvider');\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n CompoundEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useCallback, useMemo } from 'react';\nimport useObservable from 'react-use/esm/useObservable';\nimport { starredEntitiesApiRef } from '../apis';\n\nfunction getEntityRef(\n entityOrRef: Entity | CompoundEntityRef | string,\n): string {\n return typeof entityOrRef === 'string'\n ? entityOrRef\n : stringifyEntityRef(entityOrRef);\n}\n\n/** @public */\nexport function useStarredEntities(): {\n starredEntities: Set<string>;\n toggleStarredEntity: (\n entityOrRef: Entity | CompoundEntityRef | string,\n ) => void;\n isStarredEntity: (\n entityOrRef: Entity | CompoundEntityRef | string,\n ) => boolean;\n} {\n const starredEntitiesApi = useApi(starredEntitiesApiRef);\n\n const starredEntities = useObservable(\n useMemo(() => starredEntitiesApi.starredEntitie$(), [starredEntitiesApi]),\n new Set<string>(),\n );\n\n const isStarredEntity = useCallback(\n (entityOrRef: Entity | CompoundEntityRef | string) =>\n starredEntities.has(getEntityRef(entityOrRef)),\n [starredEntities],\n );\n\n const toggleStarredEntity = useCallback(\n (entityOrRef: Entity | CompoundEntityRef | string) =>\n starredEntitiesApi.toggleStarred(getEntityRef(entityOrRef)).then(),\n [starredEntitiesApi],\n );\n\n return {\n starredEntities,\n toggleStarredEntity,\n isStarredEntity,\n };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { EntityFilter } from '../types';\nimport {\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityOrderQuery } from '@backstage/catalog-client';\n\nexport interface CatalogFilters {\n filter: Record<string, string | symbol | (string | symbol)[]>;\n fullTextFilter?: {\n term: string;\n };\n orderFields?: EntityOrderQuery;\n}\n\nfunction isEntityTextFilter(t: EntityFilter): t is EntityTextFilter {\n return !!(t as EntityTextFilter).getFullTextFilters;\n}\n\nfunction isEntityOrderFilter(t: EntityFilter): t is EntityOrderFilter {\n return !!(t as EntityOrderFilter).getOrderFilters;\n}\n\nexport function reduceCatalogFilters(filters: EntityFilter[]): CatalogFilters {\n const condensedFilters = filters.reduce<CatalogFilters['filter']>(\n (compoundFilter, filter) => {\n return {\n ...compoundFilter,\n ...(filter.getCatalogFilters ? filter.getCatalogFilters() : {}),\n };\n },\n {},\n );\n\n const fullTextFilter = filters.find(isEntityTextFilter)?.getFullTextFilters();\n\n const orderFields = filters.find(isEntityOrderFilter)?.getOrderFilters() || [\n {\n field: 'metadata.name',\n order: 'asc',\n },\n ];\n return { filter: condensedFilters, fullTextFilter, orderFields };\n}\n\n/**\n * This function computes and returns an object containing the filters to be sent\n * to the backend. Any filter coming from `EntityKindFilter` and `EntityTypeFilter`, together\n * with custom filter set by the adopters is allowed. This function is used by `EntityListProvider`\n * and it won't be needed anymore in the future once pagination is implemented, as all the filters\n * will be applied backend-side.\n */\nexport function reduceBackendCatalogFilters(filters: EntityFilter[]) {\n const backendCatalogFilters: Record<\n string,\n string | symbol | (string | symbol)[]\n > = {};\n\n filters.forEach(filter => {\n if (\n filter instanceof EntityTagFilter ||\n filter instanceof EntityOwnerFilter ||\n filter instanceof EntityLifecycleFilter ||\n filter instanceof EntityNamespaceFilter ||\n filter instanceof EntityUserFilter ||\n filter instanceof EntityOrphanFilter ||\n filter instanceof EntityTextFilter ||\n filter instanceof UserListFilter\n ) {\n return;\n }\n Object.assign(backendCatalogFilters, filter.getCatalogFilters?.() || {});\n });\n\n return backendCatalogFilters;\n}\n\nexport function reduceEntityFilters(\n filters: EntityFilter[],\n): (entity: Entity) => boolean {\n return (entity: Entity) =>\n filters.every(\n filter => !filter.filterEntity || filter.filterEntity(entity),\n );\n}\n"],"names":["t","r","a","Array","i","o","e","Object","n","Math","arguments","Date","useStyles","makeStyles","theme","createStyles","classes","SvgIcon","BootstrapInput","withStyles","InputBase","SelectComponent","props","multiple","items","label","placeholder","selected","onChange","triggerReset","native","disabled","margin","dataTestId","value","setValue","useState","isOpen","setOpen","useEffect","Box","FormControl","InputLabel","Select","event","previous","HTMLElement","s","selectedValue","item","el","Chip","CancelIcon","newValue","chip","Typography","OpenedDropdown","ClosedDropdown","MenuItem","Checkbox","entityPresentationSnapshot","entityOrRef","context","entityPresentationApi","ref","stringifyEntityRef","defaultEntityPresentation","BootstrapAutocomplete","Autocomplete","PopperComponent","Popper","TransitionProps","Grow","PaperComponent","Paper","CatalogAutocomplete","name","LabelProps","TextFieldProps","rest","renderInput","useCallback","params","TextField","merge","autocomplete","ExpandMoreIcon","classNames","icon","CheckBoxOutlineBlankIcon","checkedIcon","CheckBoxIcon","OptionCheckbox","EntityAutocompletePickerOption","memo","availableOptions","showCounts","FormControlLabel","EntityAutocompletePicker","path","Filter","InputProps","initialSelectedOptions","filtersForAvailableValues","hidden","updateFilters","filters","queryParameter","useEntityList","catalogApi","useApi","catalogApiRef","availableValuesFilters","f","availableValues","useAsync","facets","reduceBackendCatalogFilters","Boolean","count","queryParameters","useMemo","filteredOptions","selectedOptions","setSelectedOptions","shouldAddFilter","undefined","newSelectedOptions","isEqual","filter","String","_event","options","option","EntityKindPicker","availableKinds","kindsMap","allowedKinds","initialFilter","useTranslationRef","catalogReactTranslationRef","alertApi","alertApiRef","error","allKinds","selectedKind","setSelectedKind","useEntityKindFilter","opts","kindParameter","queryParamKind","loading","useAllKinds","Map","kindFacets","kind","selectedKindLabel","EntityKindFilter","k","forcedKinds","key","EntityLifecyclePicker","EntityLifecycleFilter","EntityNamespacePicker","initiallySelectedNamespaces","EntityNamespaceFilter","FixedWidthFormControlLabel","_theme","RenderOptionLabel","isGroup","title","useEntityPresentation","Tooltip","GroupIcon","PersonIcon","EntityOwnerPicker","mode","apis","useApiHolder","entityPresentationApiRef","ownersParameter","text","setText","queryParamOwners","selectedOwners","setSelectedOwners","handleFetch","cache","useFetchEntities","initialSelectedOwnersRefs","isOwnersOnlyMode","queryEntitiesResponse","useAsyncFn","request","limit","cursorRequest","response","initialRequest","facetsEntitiesResponse","useFacetsEntities","enabled","facetsPromise","facet","namespace","parseEntityRef","b","start","isFacetsResponse","JSON","atob","filteredRefs","entity","normalizedText","end","encodeCursor","entities","payload","btoa","state","useSelectedOwners","allEntities","useRef","initialSelectedEntities","useMountEffect","entityRef","useDebouncedEffect","availableOwners","EntityOwnerFilter","v","_","owners","x","_e","inputValue","element","hasReachedEnd","EntityProcessingStatusPicker","selectedAdvancedItems","setSelectedAdvancedItems","EntityOrphanFilter","EntityErrorFilter","EntityTagPicker","EntityTagFilter","EntityTypePicker","availableTypes","selectedTypes","setSelectedTypes","useEntityTypeFilter","kindFilter","typeFilter","typeParameter","flattenedQueryTypes","setAvailableTypes","facetsRef","oldFacets","newTypes","Set","sortBy","stillValidTypes","EntityTypeFilter","type","UserListPicker","availableFilters","alwaysKeepFilters","configApi","configApiRef","orgName","userParameter","userAndGroupFilterIds","filterGroups","getFilterGroups","SettingsIcon","StarIcon","filterGroup","id","ownedEntitiesCount","loadingOwnedEntities","ownedEntitiesFilter","useOwnedEntitiesCount","identityApi","identityApiRef","ownershipEntityRefs","loadingEntityRefs","user","allFilters","orderFields","catalogFilters","reduceCatalogFilters","compact","loadingEntityOwnership","fetchEntities","req","ownedClaims","getOwnedCountClaims","ownersRefs","commonOwnedBy","intersection","metadata","totalItems","useDeepCompareEffect","EntityUserFilter","allCount","useAllEntitiesCount","prevRequest","compacted","newRequest","starredEntitiesCount","starredEntitiesFilter","loadingStarredEntities","useStarredEntitiesCount","starredEntities","useStarredEntities","queryParamUserFilter","selectedUserFilter","setSelectedUserFilter","filterCounts","Card","group","Fragment","List","index","ListItemIcon","ListItemText","ListItemSecondaryAction","values","EntityTextFilter","words","exactMatch","partialMatch","word","m","fullRefs","err","getEntityRelations","RELATION_OWNED_BY","refs","starredEntityRefs","relations","UserListFilter","isOwnedEntity","isStarredEntity","orphan","NewEntityListContext","createVersionedContext","OldEntityListContext","createContext","EntityListProvider","isMounted","useMountedState","requestedFilters","setRequestedFilters","location","useLocation","paginationMode","paginationLimit","initialCursor","initialOffset","initialLimit","parsed","qs","queryLimit","Number","isNaN","offset","cursor","setCursor","setOffset","setLimit","outputState","setOutputState","resolvedValue","refresh","kindValue","adjustedFilters","entityFilter","reduceEntityFilters","backendFilter","previousBackendFilter","useDebounce","queryParams","oldParams","newParams","newUrl","window","document","update","prevFilters","newFilters","latestOutput","pageInfo","prevCursor","nextCursor","createVersionedValueMap","versionedHolder","useVersionedContext","oldContext","useContext","Error","getEntityRef","starredEntitiesApi","starredEntitiesApiRef","useObservable","toggleStarredEntity","isEntityTextFilter","isEntityOrderFilter","condensedFilters","compoundFilter","fullTextFilter","backendCatalogFilters"],"mappings":"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"}
1
+ {"version":3,"file":"static/8877.a7ffabd9.chunk.js","sources":["webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_apply.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseEach.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseFlatten.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseMap.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseOrderBy.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseRest.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseSetToString.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_baseSortBy.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_compareAscending.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_compareMultiple.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_createBaseEach.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_isFlattenable.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_isIterateeCall.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_overRest.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_setToString.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/_shortOut.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/constant.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/isEqual.js","webpack://techdocs-cli-embedded-app/../../node_modules/lodash/sortBy.js","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/static/ClosedDropdown.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/static/OpenedDropdown.tsx","webpack://techdocs-cli-embedded-app/../core-components/src/components/Select/Select.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/apis/EntityPresentationApi/entityPresentationSnapshot.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/CatalogAutocomplete/CatalogAutocomplete.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePickerOption.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityAutocompletePicker/EntityAutocompletePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityLifecyclePicker/EntityLifecyclePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityNamespacePicker/EntityNamespacePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/EntityOwnerPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useFetchEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useQueryEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityOwnerPicker/useFacetsEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityProcessingStatusPicker/EntityProcessingStatusPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityTagPicker/EntityTagPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/EntityTypePicker/EntityTypePicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useEntityTypeFilter.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/UserListPicker.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useOwnedEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useAllEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/components/UserListPicker/useStarredEntitiesCount.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/filters.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useEntityListProvider.tsx","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/hooks/useStarredEntities.ts","webpack://techdocs-cli-embedded-app/../../plugins/catalog-react/src/utils/filters.ts"],"sourcesContent":["/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","var arrayMap = require('./_arrayMap'),\n baseGet = require('./_baseGet'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n };\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n","var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n","var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\n/** @public */\nexport type ClosedDropdownClassKey = 'icon';\n\nconst useStyles = makeStyles(\n theme =>\n createStyles({\n icon: {\n position: 'absolute',\n right: theme.spacing(0.5),\n pointerEvents: 'none',\n color: '#616161',\n },\n }),\n { name: 'BackstageClosedDropdown' },\n);\n\nconst ClosedDropdown = () => {\n const classes = useStyles();\n return (\n <SvgIcon\n className={classes.icon}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M7.5 8L6 9.5L12.0703 15.5703L18.1406 9.5L16.6406 8L12.0703 12.5703L7.5 8Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n );\n};\n\nexport default ClosedDropdown;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\nexport type OpenedDropdownClassKey = 'icon';\n\nconst useStyles = makeStyles(\n theme =>\n createStyles({\n icon: {\n position: 'absolute',\n right: theme.spacing(0.5),\n pointerEvents: 'none',\n color: '#616161',\n },\n }),\n { name: 'BackstageOpenedDropdown' },\n);\n\nconst OpenedDropdown = () => {\n const classes = useStyles();\n return (\n <SvgIcon\n className={classes.icon}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M16.5 16L18 14.5L11.9297 8.42969L5.85938 14.5L7.35938 16L11.9297 11.4297L16.5 16Z\"\n fill=\"currentColor\"\n />\n </SvgIcon>\n );\n};\n\nexport default OpenedDropdown;\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport Chip from '@material-ui/core/Chip';\nimport FormControl from '@material-ui/core/FormControl';\nimport InputBase from '@material-ui/core/InputBase';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport {\n createStyles,\n makeStyles,\n Theme,\n withStyles,\n} from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport { ChangeEvent, useEffect, useState } from 'react';\n\nimport ClosedDropdown from './static/ClosedDropdown';\nimport OpenedDropdown from './static/OpenedDropdown';\n\n/** @public */\nexport type SelectInputBaseClassKey = 'root' | 'input';\n\nconst BootstrapInput = withStyles(\n (theme: Theme) =>\n createStyles({\n root: {\n 'label + &': {\n marginTop: theme.spacing(3),\n },\n '&.Mui-focused > div[role=button]': {\n borderColor: theme.palette.primary.main,\n },\n },\n input: {\n borderRadius: theme.shape.borderRadius,\n position: 'relative',\n backgroundColor: theme.palette.background.paper,\n border: '1px solid #ced4da',\n fontSize: theme.typography.body1.fontSize,\n padding: theme.spacing(1.25, 3.25, 1.25, 1.5),\n transition: theme.transitions.create(['border-color', 'box-shadow']),\n '&:focus': {\n background: theme.palette.background.paper,\n borderRadius: theme.shape.borderRadius,\n },\n },\n }),\n { name: 'BackstageSelectInputBase' },\n)(InputBase);\n\n/** @public */\nexport type SelectClassKey =\n | 'formControl'\n | 'label'\n | 'chips'\n | 'chip'\n | 'checkbox'\n | 'root';\n\nconst useStyles = makeStyles(\n (theme: Theme) =>\n createStyles({\n formControl: {\n margin: theme.spacing(1, 0),\n },\n label: {\n transform: 'initial',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '&.Mui-focused': {\n color: theme.palette.text.primary,\n },\n },\n formLabel: {\n transform: 'initial',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '&.Mui-focused': {\n color: theme.palette.text.primary,\n },\n },\n chips: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n chip: {\n margin: 2,\n },\n checkbox: {},\n\n root: {\n display: 'flex',\n flexDirection: 'column',\n },\n }),\n { name: 'BackstageSelect' },\n);\n\n/** @public */\nexport type SelectItem = {\n label: string;\n value: string | number;\n};\n\n/** @public */\nexport type SelectedItems = string | string[] | number | number[];\n\nexport type SelectProps = {\n multiple?: boolean;\n items: SelectItem[];\n label: string;\n placeholder?: string;\n selected?: SelectedItems;\n onChange: (arg: SelectedItems) => void;\n triggerReset?: boolean;\n native?: boolean;\n disabled?: boolean;\n margin?: 'dense' | 'none';\n 'data-testid'?: string;\n};\n\n/** @public */\nexport function SelectComponent(props: SelectProps) {\n const {\n multiple,\n items,\n label,\n placeholder,\n selected,\n onChange,\n triggerReset,\n native = false,\n disabled = false,\n margin,\n 'data-testid': dataTestId = 'select',\n } = props;\n const classes = useStyles();\n const [value, setValue] = useState<SelectedItems>(\n selected || (multiple ? [] : ''),\n );\n const [isOpen, setOpen] = useState(false);\n\n useEffect(() => {\n setValue(multiple ? [] : '');\n }, [triggerReset, multiple]);\n\n useEffect(() => {\n setValue(selected || (multiple ? [] : ''));\n }, [selected, multiple]);\n\n const handleChange = (event: ChangeEvent<{ value: unknown }>) => {\n setValue(event.target.value as SelectedItems);\n onChange(event.target.value as SelectedItems);\n };\n\n const handleOpen = (event: ChangeEvent<any>) => {\n if (disabled) {\n event.preventDefault();\n return;\n }\n setOpen(previous => {\n if (multiple && !(event.target instanceof HTMLElement)) {\n return true;\n }\n return !previous;\n });\n };\n\n const handleClose = () => {\n setOpen(false);\n };\n\n const handleDelete = (selectedValue: string | number) => () => {\n const newValue = (value as any[]).filter(chip => chip !== selectedValue);\n setValue(newValue);\n onChange(newValue);\n };\n\n return (\n <Box className={classes.root}>\n <FormControl className={classes.formControl}>\n <InputLabel className={classes.formLabel}>{label}</InputLabel>\n <Select\n aria-label={label}\n value={value}\n native={native}\n disabled={disabled}\n data-testid={dataTestId}\n displayEmpty\n multiple={multiple}\n margin={margin}\n onChange={handleChange}\n open={isOpen}\n onOpen={handleOpen}\n onClose={handleClose}\n input={<BootstrapInput />}\n label={label}\n renderValue={s =>\n multiple && (value as any[]).length !== 0 ? (\n <Box className={classes.chips}>\n {(s as string[]).map(selectedValue => {\n const item = items.find(el => el.value === selectedValue);\n return item ? (\n <Chip\n data-testid=\"chip\"\n key={item?.value}\n label={item?.label}\n clickable\n deleteIcon={\n <CancelIcon\n data-testid=\"cancel-icon\"\n onMouseDown={event => event.stopPropagation()}\n />\n }\n onDelete={handleDelete(selectedValue)}\n className={classes.chip}\n />\n ) : (\n false\n );\n })}\n </Box>\n ) : (\n <Typography>\n {(value as any[]).length === 0\n ? placeholder || ''\n : items.find(el => el.value === s)?.label}\n </Typography>\n )\n }\n IconComponent={() =>\n !isOpen ? <ClosedDropdown /> : <OpenedDropdown />\n }\n MenuProps={{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'left',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'left',\n },\n getContentAnchorEl: null,\n }}\n >\n {!!placeholder && !multiple && (\n <MenuItem value={[]}>{placeholder}</MenuItem>\n )}\n {native\n ? items &&\n items.map(item => (\n <option value={item.value} key={item.value}>\n {item.label}\n </option>\n ))\n : items &&\n items.map(item => (\n <MenuItem key={item.value} value={item.value}>\n {multiple && (\n <Checkbox\n color=\"primary\"\n checked={(value as any[]).includes(item.value) || false}\n className={classes.checkbox}\n />\n )}\n {item.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n );\n}\n","/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CompoundEntityRef,\n Entity,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n EntityPresentationApi,\n EntityRefPresentationSnapshot,\n} from './EntityPresentationApi';\nimport { defaultEntityPresentation } from './defaultEntityPresentation';\n\n/**\n * Returns a synchronous presentation snapshot for an entity in non-React\n * contexts.\n *\n * @remarks\n *\n * This is the synchronous, non-React counterpart to\n * {@link useEntityPresentation}. It handles `Entity`, `CompoundEntityRef`,\n * and string ref inputs uniformly, using the provided\n * {@link EntityPresentationApi} when available and falling back to\n * {@link defaultEntityPresentation} otherwise.\n *\n * Because this function is synchronous, it uses cached data from the\n * presentation API (via `.snapshot`). If the entity has been seen before,\n * the snapshot will contain the full resolved title; otherwise it falls\n * back to what can be extracted from the ref alone. This is the correct\n * trade-off for sort comparators, column factories, filter callbacks, and\n * data mappers where a synchronous return value is required.\n *\n * In async contexts such as data loaders where you can `await`, prefer\n * using the {@link EntityPresentationApi} directly via\n * `forEntity().promise` for the richest possible presentation.\n *\n * @public\n * @param entityOrRef - An entity, a compound entity ref, or a string entity ref.\n * @param context - Optional context that may affect the presentation.\n * @param entityPresentationApi - Optional presentation API instance. When not\n * provided, falls back to {@link defaultEntityPresentation}.\n */\nexport function entityPresentationSnapshot(\n entityOrRef: Entity | CompoundEntityRef | string,\n context?: { defaultKind?: string; defaultNamespace?: string },\n entityPresentationApi?: EntityPresentationApi,\n): EntityRefPresentationSnapshot {\n if (entityPresentationApi) {\n const ref =\n typeof entityOrRef === 'string' || 'metadata' in entityOrRef\n ? entityOrRef\n : stringifyEntityRef(entityOrRef);\n return entityPresentationApi.forEntity(ref, context).snapshot;\n }\n return defaultEntityPresentation(entityOrRef, context);\n}\n","/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Box from '@material-ui/core/Box';\nimport Typography, { TypographyProps } from '@material-ui/core/Typography';\nimport Paper, { PaperProps } from '@material-ui/core/Paper';\nimport Popper, { PopperProps } from '@material-ui/core/Popper';\nimport TextField, { OutlinedTextFieldProps } from '@material-ui/core/TextField';\nimport Grow from '@material-ui/core/Grow';\nimport {\n createStyles,\n makeStyles,\n Theme,\n withStyles,\n} from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Autocomplete, {\n AutocompleteProps,\n AutocompleteRenderInputParams,\n} from '@material-ui/lab/Autocomplete';\nimport { ReactNode, useCallback } from 'react';\nimport { merge } from 'lodash';\nimport classNames from 'classnames';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n margin: theme.spacing(1, 0),\n },\n label: {\n position: 'relative',\n fontWeight: 'bold',\n fontSize: theme.typography.body2.fontSize,\n fontFamily: theme.typography.fontFamily,\n color: theme.palette.text.primary,\n '& > span': {\n top: 0,\n left: 0,\n position: 'absolute',\n },\n },\n }),\n { name: 'BackstageAutocomplete' },\n);\n\nconst BootstrapAutocomplete = withStyles(\n (theme: Theme) =>\n createStyles({\n root: {},\n paper: {\n margin: 0,\n },\n hasClearIcon: {},\n hasPopupIcon: {},\n focused: {},\n inputRoot: {\n marginTop: 24,\n backgroundColor: theme.palette.background.paper,\n '$root$hasClearIcon$hasPopupIcon &': {\n paddingBlock: theme.spacing(0.75),\n paddingInlineStart: theme.spacing(0.75),\n },\n '$root$focused &': {\n outline: 'none',\n },\n '$root &:hover > fieldset': {\n borderColor: '#ced4da',\n },\n '$root$focused & > fieldset': {\n borderWidth: 1,\n borderColor: theme.palette.primary.main,\n },\n },\n popupIndicator: {\n padding: 0,\n margin: 0,\n color: '#616161',\n '&:hover': {\n backgroundColor: 'unset',\n },\n '& [class*=\"MuiTouchRipple-root\"]': {\n display: 'none',\n },\n },\n endAdornment: {\n '$root$hasClearIcon$hasPopupIcon &': {\n right: 4,\n },\n },\n input: {\n '$root$hasClearIcon$hasPopupIcon &': {\n fontSize: theme.typography.body1.fontSize,\n paddingBlock: theme.spacing(0.8125),\n },\n },\n }),\n { name: 'BackstageAutocompleteBase' },\n)(Autocomplete) as typeof Autocomplete;\n\nconst PopperComponent = (props: PopperProps) => (\n <Popper {...props} transition placement=\"bottom-start\">\n {({ TransitionProps }) => (\n <Grow {...TransitionProps} style={{ transformOrigin: '0 0 0' }}>\n <Box>{props.children as ReactNode}</Box>\n </Grow>\n )}\n </Popper>\n);\n\nconst PaperComponent = (props: PaperProps) => (\n <Paper {...props} elevation={8} />\n);\n\n/**\n * Props for {@link CatalogAutocomplete}\n *\n * @public\n */\nexport type CatalogAutocompleteProps<\n T,\n Multiple extends boolean | undefined = undefined,\n DisableClearable extends boolean | undefined = undefined,\n FreeSolo extends boolean | undefined = undefined,\n> = Omit<\n AutocompleteProps<T, Multiple, DisableClearable, FreeSolo>,\n 'PopperComponent' | 'PaperComponent' | 'popupIcon' | 'renderInput'\n> & {\n name: string;\n label?: string;\n LabelProps?: TypographyProps<'label'>;\n TextFieldProps?: Omit<OutlinedTextFieldProps, 'variant'>;\n renderInput?: AutocompleteProps<\n T,\n Multiple,\n DisableClearable,\n FreeSolo\n >['renderInput'];\n};\n\n/** @public */\nexport function CatalogAutocomplete<\n T,\n Multiple extends boolean | undefined = undefined,\n DisableClearable extends boolean | undefined = undefined,\n FreeSolo extends boolean | undefined = undefined,\n>(props: CatalogAutocompleteProps<T, Multiple, DisableClearable, FreeSolo>) {\n const { label, name, LabelProps, TextFieldProps, ...rest } = props;\n const classes = useStyles();\n const renderInput = useCallback(\n (params: AutocompleteRenderInputParams) => (\n <TextField {...merge(params, TextFieldProps)} variant=\"outlined\" />\n ),\n [TextFieldProps],\n );\n const autocomplete = (\n <BootstrapAutocomplete\n size=\"small\"\n {...rest}\n renderInput={rest.renderInput ?? renderInput}\n popupIcon={<ExpandMoreIcon data-testid={`${name}-expand`} />}\n PaperComponent={PaperComponent}\n PopperComponent={PopperComponent}\n />\n );\n\n return (\n <Box className={classes.root}>\n {label ? (\n <Typography\n {...LabelProps}\n className={classNames(classes.label, LabelProps?.className)}\n component=\"label\"\n >\n <Box component=\"span\">{label}</Box>\n {autocomplete}\n </Typography>\n ) : (\n autocomplete\n )}\n </Box>\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { memo } from 'react';\n\ninterface Props {\n selected: boolean;\n value: string;\n availableOptions?: Record<string, number>;\n showCounts: boolean;\n}\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\nfunction OptionCheckbox({ selected }: { selected: boolean }) {\n return <Checkbox icon={icon} checkedIcon={checkedIcon} checked={selected} />;\n}\n\nexport const EntityAutocompletePickerOption = memo((props: Props) => {\n const { selected, value, availableOptions, showCounts } = props;\n const label = showCounts ? `${value} (${availableOptions?.[value]})` : value;\n\n return (\n <FormControlLabel\n control={<OptionCheckbox selected={selected} />}\n label={label}\n onClick={event => event.preventDefault()}\n />\n );\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Box from '@material-ui/core/Box';\nimport { TextFieldProps } from '@material-ui/core/TextField';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityAutocompletePickerOption } from './EntityAutocompletePickerOption';\nimport {\n DefaultEntityFilters,\n useEntityList,\n} from '../../hooks/useEntityListProvider';\nimport { EntityFilter } from '../../types';\nimport { reduceBackendCatalogFilters } from '../../utils/filters';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\nimport { isEqual } from 'lodash';\n\n/** @public */\nexport type AllowedEntityFilters<T extends DefaultEntityFilters> = {\n [K in keyof T]-?: NonNullable<T[K]> extends EntityFilter & {\n values: string[];\n }\n ? K\n : never;\n}[keyof T];\n\n/** @public */\nexport type EntityAutocompletePickerProps<\n T extends DefaultEntityFilters = DefaultEntityFilters,\n Name extends AllowedEntityFilters<T> = AllowedEntityFilters<T>,\n> = {\n label: string;\n name: Name;\n path: string;\n showCounts?: boolean;\n Filter: { new (values: string[]): NonNullable<T[Name]> };\n InputProps?: TextFieldProps;\n initialSelectedOptions?: string[];\n filtersForAvailableValues?: Array<keyof T>;\n hidden?: boolean;\n};\n\n/** @public */\nexport type CatalogReactEntityAutocompletePickerClassKey = 'root' | 'label';\n\nconst useStyles = makeStyles(\n {\n root: {},\n label: {\n textTransform: 'none',\n fontWeight: 'bold',\n },\n },\n { name: 'CatalogReactEntityAutocompletePicker' },\n);\n\n/** @public */\nexport function EntityAutocompletePicker<\n T extends DefaultEntityFilters = DefaultEntityFilters,\n Name extends AllowedEntityFilters<T> = AllowedEntityFilters<T>,\n>(props: EntityAutocompletePickerProps<T, Name>) {\n const {\n label,\n name,\n path,\n showCounts,\n Filter,\n InputProps,\n initialSelectedOptions = [],\n filtersForAvailableValues = ['kind'],\n hidden,\n } = props;\n const classes = useStyles();\n\n const {\n updateFilters,\n filters,\n queryParameters: { [name]: queryParameter },\n } = useEntityList<T>();\n\n const catalogApi = useApi(catalogApiRef);\n const availableValuesFilters = filtersForAvailableValues.map(\n f => filters[f] as EntityFilter | undefined,\n );\n const { value: availableValues } = useAsync(async () => {\n const facet = path;\n const { facets } = await catalogApi.getEntityFacets({\n facets: [facet],\n filter: reduceBackendCatalogFilters(\n availableValuesFilters.filter(Boolean) as EntityFilter[],\n ),\n });\n\n return Object.fromEntries(\n facets[facet].map(({ value, count }) => [value, count]),\n );\n }, [...availableValuesFilters]);\n\n const queryParameters = useMemo(\n () => [queryParameter].flat().filter(Boolean) as string[],\n [queryParameter],\n );\n\n const filteredOptions = (filters[name] as unknown as { values: string[] })\n ?.values;\n\n const [selectedOptions, setSelectedOptions] = useState(\n queryParameters.length\n ? queryParameters\n : filteredOptions ?? initialSelectedOptions,\n );\n\n // Set selected options on query parameter updates; this happens at initial page load and from\n // external updates to the page location\n useEffect(() => {\n if (queryParameters.length) {\n setSelectedOptions(queryParameters);\n }\n }, [queryParameters]);\n\n const availableOptions = Object.keys(availableValues ?? {});\n const shouldAddFilter = selectedOptions.length && availableOptions.length;\n\n // Update filter value when selectedOptions change\n useEffect(() => {\n updateFilters({\n [name]: shouldAddFilter ? new Filter(selectedOptions) : undefined,\n } as Partial<T>);\n }, [name, shouldAddFilter, selectedOptions, Filter, updateFilters]);\n\n // Update selected options when filter value changes\n useEffect(() => {\n if (!shouldAddFilter) return;\n\n const newSelectedOptions = filteredOptions ?? [];\n\n // Check value is actually different (not just a different reference) to prevent selectedOptions <> filters loop\n if (!isEqual(newSelectedOptions, selectedOptions)) {\n setSelectedOptions(newSelectedOptions);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Don't re-set filter value when selectedOptions changes\n }, [filteredOptions]);\n\n const filter = filters[name];\n if (\n (filter && typeof filter === 'object' && !('values' in filter)) ||\n !availableOptions.length\n ) {\n return null;\n }\n\n return hidden ? null : (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<string, true>\n multiple\n disableCloseOnSelect\n label={label}\n name={`${String(name)}-picker`}\n options={availableOptions}\n value={selectedOptions}\n TextFieldProps={InputProps}\n onChange={(_event: object, options: string[]) =>\n setSelectedOptions(options)\n }\n renderOption={(option, { selected }) => (\n <EntityAutocompletePickerOption\n selected={selected}\n value={option}\n availableOptions={availableValues}\n showCounts={!!showCounts}\n />\n )}\n />\n </Box>\n );\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Select } from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport Box from '@material-ui/core/Box';\nimport { useEffect, useMemo, useState } from 'react';\nimport { EntityKindFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { filterKinds, useAllKinds } from './kindFilterUtils';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nfunction useEntityKindFilter(opts: { initialFilter: string }): {\n loading: boolean;\n error?: Error;\n allKinds: Map<string, string>;\n selectedKind: string;\n setSelectedKind: (kind: string) => void;\n} {\n const {\n filters,\n queryParameters: { kind: kindParameter },\n updateFilters,\n } = useEntityList();\n\n const queryParamKind = useMemo(\n () => [kindParameter].flat()[0],\n [kindParameter],\n );\n\n const [selectedKind, setSelectedKind] = useState(\n queryParamKind ?? filters.kind?.value ?? opts.initialFilter,\n );\n\n // Set selected kinds on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamKind) {\n setSelectedKind(queryParamKind);\n }\n }, [queryParamKind]);\n\n // Set selected kind from filters; this happens when the kind filter is\n // updated from another component\n useEffect(() => {\n if (filters.kind?.value) {\n setSelectedKind(filters.kind?.value);\n }\n }, [filters.kind]);\n\n const { allKinds, loading, error } = useAllKinds();\n const selectedKindLabel = allKinds.get(selectedKind) || selectedKind;\n\n useEffect(() => {\n updateFilters({\n kind: selectedKind\n ? new EntityKindFilter(selectedKind, selectedKindLabel)\n : undefined,\n });\n }, [selectedKind, selectedKindLabel, updateFilters]);\n\n return {\n loading,\n error,\n allKinds,\n selectedKind,\n setSelectedKind,\n };\n}\n\n/**\n * Props for {@link EntityKindPicker}.\n *\n * @public\n */\nexport interface EntityKindPickerProps {\n /**\n * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and\n * displayed.\n */\n allowedKinds?: string[];\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityKindPicker = (props: EntityKindPickerProps) => {\n const { allowedKinds, hidden, initialFilter = 'component' } = props;\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const alertApi = useApi(alertApiRef);\n\n const { error, allKinds, selectedKind, setSelectedKind } =\n useEntityKindFilter({\n initialFilter: initialFilter,\n });\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: t('entityKindPicker.errorMessage'),\n severity: 'error',\n });\n }\n }, [error, alertApi, t]);\n\n if (error) return null;\n\n const options = filterKinds(allKinds, allowedKinds, selectedKind);\n\n const items = [...options.entries()].map(([key, value]) => ({\n label: value,\n value: key,\n }));\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label={t('entityKindPicker.title')}\n items={items}\n selected={selectedKind.toLocaleLowerCase('en-US')}\n onChange={value => setSelectedKind(String(value))}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\n\n/**\n * Fetch and return all available kinds.\n */\nexport function useAllKinds(): {\n loading: boolean;\n error?: Error;\n allKinds: Map<string, string>;\n} {\n const catalogApi = useApi(catalogApiRef);\n\n const {\n error,\n loading,\n value: allKinds,\n } = useAsync(async () => {\n const { facets } = await catalogApi.getEntityFacets({ facets: ['kind'] });\n const kindFacets = (facets.kind ?? []).map(f => f.value);\n return new Map(\n kindFacets.map(kind => [kind.toLocaleLowerCase('en-US'), kind]),\n );\n }, [catalogApi]);\n\n return { loading, error, allKinds: allKinds ?? new Map() };\n}\n\n/**\n * Filter and capitalize accessible kinds.\n */\nexport function filterKinds(\n allKinds: Map<string, string>,\n allowedKinds?: string[],\n forcedKinds?: string,\n): Map<string, string> {\n // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not\n // be present in allKinds. It should still be shown in the dropdown, but may not have the nice\n // enforced casing from the catalog-backend. This makes a key/value record for the Select options,\n // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the\n // more proper catalog kind if it exists.\n let availableKinds = Array.from(allKinds.keys());\n if (allowedKinds) {\n availableKinds = allowedKinds\n .map(k => k.toLocaleLowerCase('en-US'))\n .filter(k => allKinds.has(k));\n }\n\n const kindsMap = new Map(\n availableKinds.map(kind => [kind, allKinds.get(kind) || kind]),\n );\n\n if (forcedKinds && !kindsMap.has(forcedKinds)) {\n // this is the only time we set a label for a kind which is not properly capitalized\n kindsMap.set(forcedKinds.toLocaleLowerCase('en-US'), forcedKinds);\n }\n\n return kindsMap;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport { EntityLifecycleFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityLifecyclePickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n input: {},\n },\n { name: 'CatalogReactEntityLifecyclePicker' },\n);\n\n/** @public */\nexport const EntityLifecyclePicker = (props: { initialFilter?: string[] }) => {\n const { initialFilter = [] } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityLifecyclePicker.title')}\n name=\"lifecycles\"\n path=\"spec.lifecycle\"\n Filter={EntityLifecycleFilter}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={initialFilter}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { EntityNamespaceFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityNamespacePickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n input: {},\n },\n {\n name: 'CatalogReactEntityNamespacePicker',\n },\n);\n\n/**\n * Props for {@link EntityNamespacePicker}.\n *\n * @public\n */\nexport interface EntityNamespacePickerProps {\n initiallySelectedNamespaces?: string[];\n}\n\n/** @public */\nexport const EntityNamespacePicker = (props: EntityNamespacePickerProps) => {\n const { initiallySelectedNamespaces } = props;\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityNamespacePicker.title')}\n name=\"namespace\"\n path=\"metadata.namespace\"\n Filter={EntityNamespaceFilter}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={initiallySelectedNamespaces}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Typography from '@material-ui/core/Typography';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { MouseEvent, useEffect, useMemo, useState } from 'react';\nimport { useEntityList } from '../../hooks/useEntityListProvider';\nimport { EntityOwnerFilter } from '../../filters';\nimport { useDebouncedEffect } from '@react-hookz/web';\nimport PersonIcon from '@material-ui/icons/Person';\nimport GroupIcon from '@material-ui/icons/Group';\nimport {\n entityPresentationApiRef,\n entityPresentationSnapshot,\n} from '../../apis';\nimport { useFetchEntities } from './useFetchEntities';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useEntityPresentation } from '../../apis';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useApiHolder } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\n\n/** @public */\nexport type CatalogReactEntityOwnerPickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n root: {},\n label: {},\n input: {},\n fullWidth: { width: '100%' },\n boxLabel: {\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n },\n { name: 'CatalogReactEntityOwnerPicker' },\n);\n\n/** @public */\nexport type FixedWidthFormControlLabelClassKey = 'label' | 'root';\n\nconst FixedWidthFormControlLabel = withStyles(\n _theme => ({\n label: {\n width: '100%',\n },\n root: {\n width: '90%',\n },\n }),\n { name: 'FixedWidthFormControlLabel' },\n)(FormControlLabel);\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * @public\n */\nexport type EntityOwnerPickerProps = {\n mode?: 'owners-only' | 'all';\n};\n\nfunction RenderOptionLabel(props: { entity: Entity; isSelected: boolean }) {\n const classes = useStyles();\n const isGroup = props.entity.kind.toLocaleLowerCase('en-US') === 'group';\n const { primaryTitle: title } = useEntityPresentation(props.entity);\n return (\n <Box className={classes.fullWidth}>\n <FixedWidthFormControlLabel\n className={classes.fullWidth}\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={props.isSelected}\n />\n }\n onClick={event => event.preventDefault()}\n label={\n <Tooltip title={title}>\n <Box display=\"flex\" alignItems=\"center\">\n {isGroup ? (\n <GroupIcon fontSize=\"small\" />\n ) : (\n <PersonIcon fontSize=\"small\" />\n )}\n &nbsp;\n <Box className={classes.boxLabel}>\n <Typography noWrap>{title}</Typography>\n </Box>\n </Box>\n </Tooltip>\n }\n />\n </Box>\n );\n}\n\n/** @public */\nexport const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => {\n const classes = useStyles();\n const { mode = 'owners-only' } = props || {};\n const apis = useApiHolder();\n const entityPresentationApi = apis.get(entityPresentationApiRef);\n const {\n updateFilters,\n filters,\n queryParameters: { owners: ownersParameter },\n } = useEntityList();\n\n const [text, setText] = useState('');\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const queryParamOwners = useMemo(\n () => [ownersParameter].flat().filter(Boolean) as string[],\n [ownersParameter],\n );\n\n const [selectedOwners, setSelectedOwners] = useState<string[]>(\n queryParamOwners.length ? queryParamOwners : filters.owners?.values ?? [],\n );\n\n const [{ value, loading }, handleFetch, cache] = useFetchEntities({\n mode,\n initialSelectedOwnersRefs: selectedOwners,\n });\n useDebouncedEffect(\n () => handleFetch({ text: text.toLocaleLowerCase('en-US') }),\n [text, handleFetch],\n 250,\n );\n\n const availableOwners = value?.items || [];\n\n // Set selected owners on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamOwners.length) {\n const filter = new EntityOwnerFilter(queryParamOwners);\n setSelectedOwners(filter.values);\n }\n }, [queryParamOwners]);\n\n useEffect(() => {\n updateFilters({\n owners: selectedOwners.length\n ? new EntityOwnerFilter(selectedOwners)\n : undefined,\n });\n }, [selectedOwners, updateFilters]);\n\n if (\n ['user', 'group'].includes(\n filters.kind?.value.toLocaleLowerCase('en-US') || '',\n )\n ) {\n return null;\n }\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<Entity, true>\n label={t('entityOwnerPicker.title')}\n multiple\n disableCloseOnSelect\n loading={loading}\n options={availableOwners}\n value={selectedOwners as unknown as Entity[]}\n getOptionSelected={(o, v) => {\n if (typeof v === 'string') {\n return stringifyEntityRef(o) === v;\n }\n return o === v;\n }}\n getOptionLabel={o => {\n const entity =\n typeof o === 'string'\n ? cache.getEntity(o) ||\n parseEntityRef(o, {\n defaultKind: 'group',\n defaultNamespace: 'default',\n })\n : o;\n return entityPresentationSnapshot(\n entity,\n undefined,\n entityPresentationApi,\n ).primaryTitle;\n }}\n onChange={(_: object, owners) => {\n setText('');\n setSelectedOwners(\n owners.map(e => {\n const entityRef =\n typeof e === 'string' ? e : stringifyEntityRef(e);\n\n if (typeof e !== 'string') {\n cache.setEntity(e);\n }\n return entityRef;\n }),\n );\n }}\n filterOptions={x => x}\n renderOption={(entity, { selected }) => {\n return <RenderOptionLabel entity={entity} isSelected={selected} />;\n }}\n name=\"owner-picker\"\n onInputChange={(_e, inputValue) => {\n setText(inputValue);\n }}\n ListboxProps={{\n onScroll: (e: MouseEvent) => {\n const element = e.currentTarget;\n const hasReachedEnd =\n Math.abs(\n element.scrollHeight - element.clientHeight - element.scrollTop,\n ) < 1;\n\n if (hasReachedEnd && value?.cursor) {\n handleFetch({ items: value.items, cursor: value.cursor });\n }\n },\n 'data-testid': 'owner-picker-listbox',\n }}\n LabelProps={{ className: classes.label }}\n TextFieldProps={{ className: classes.input }}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useRef } from 'react';\nimport { useFacetsEntities } from './useFacetsEntities';\nimport { useQueryEntities } from './useQueryEntities';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../../api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { useMountEffect } from '@react-hookz/web';\n\nexport function useFetchEntities({\n mode,\n initialSelectedOwnersRefs,\n}: {\n mode: 'owners-only' | 'all';\n initialSelectedOwnersRefs: string[];\n}) {\n const isOwnersOnlyMode = mode === 'owners-only';\n const queryEntitiesResponse = useQueryEntities();\n const facetsEntitiesResponse = useFacetsEntities({\n enabled: isOwnersOnlyMode,\n });\n\n const [state, handleFetch] = isOwnersOnlyMode\n ? facetsEntitiesResponse\n : queryEntitiesResponse;\n\n return [\n state,\n handleFetch,\n useSelectedOwners({\n enabled: !isOwnersOnlyMode,\n initialSelectedOwnersRefs,\n }),\n ] as const;\n}\n\n/**\n * Hook used for storing the full entity of the specified owners\n * in order to display users and group using the information contained on each entity.\n * When a component is rendered for the first time, it loads the content of the entities\n * specified by `initialSelectedOwnersRefs` and export the `getEntity` and `setEntity`\n * utilities, used to retrieve and modify the owners.\n */\nfunction useSelectedOwners({\n enabled,\n initialSelectedOwnersRefs,\n}: {\n enabled: boolean;\n initialSelectedOwnersRefs: string[];\n}) {\n const allEntities = useRef<Record<string, Entity>>({});\n const catalogApi = useApi(catalogApiRef);\n\n const [, handleFetch] = useAsyncFn(async () => {\n const initialSelectedEntities = await catalogApi.getEntitiesByRefs({\n entityRefs: initialSelectedOwnersRefs,\n });\n initialSelectedEntities.items.forEach(e => {\n if (e) {\n allEntities.current[stringifyEntityRef(e)] = e;\n }\n });\n }, []);\n\n useMountEffect(() => {\n if (enabled && initialSelectedOwnersRefs.length > 0) {\n handleFetch();\n }\n });\n\n return {\n getEntity: (entityRef: string) => allEntities.current[entityRef],\n setEntity: (entity: Entity) => {\n allEntities.current[stringifyEntityRef(entity)] = entity;\n },\n };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../../api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { Entity } from '@backstage/catalog-model';\n\ntype QueryEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\nexport function useQueryEntities() {\n const catalogApi = useApi(catalogApiRef);\n return useAsyncFn(\n async (\n request: { text: string } | QueryEntitiesResponse,\n options?: { limit: number },\n ): Promise<QueryEntitiesResponse> => {\n const initialRequest = request as { text: string };\n const cursorRequest = request as QueryEntitiesResponse;\n const limit = options?.limit ?? 20;\n\n if (cursorRequest.cursor) {\n const response = await catalogApi.queryEntities({\n cursor: cursorRequest.cursor,\n limit,\n });\n return {\n cursor: response.pageInfo.nextCursor,\n items: [...cursorRequest.items, ...response.items],\n };\n }\n\n const response = await catalogApi.queryEntities({\n fullTextFilter: {\n term: initialRequest.text || '',\n fields: [\n 'metadata.name',\n 'kind',\n 'spec.profile.displayname',\n 'metadata.title',\n ],\n },\n filter: { kind: ['User', 'Group'] },\n orderFields: [{ field: 'metadata.name', order: 'asc' }],\n limit,\n });\n\n return {\n cursor: response.pageInfo.nextCursor,\n items: response.items,\n };\n },\n [],\n { loading: true },\n );\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport { catalogApiRef } from '../../api';\nimport { useState } from 'react';\nimport { Entity, parseEntityRef } from '@backstage/catalog-model';\n\ntype FacetsCursor = {\n start: number;\n text: string;\n};\n\ntype FacetsEntitiesResponse = {\n items: Entity[];\n cursor?: string;\n};\n\ntype FacetsInitialRequest = {\n text: string;\n};\n\n/**\n * This hook asynchronously loads the entity owners using the facets endpoint.\n * EntityOwnerPicker uses this hook when mode=\"owners-only\" is passed as prop.\n * All the owners are kept internally in memory and rendered in batches once requested\n * by the frontend. The values returned by this hook are compatible with `useQueryEntities`\n * hook, which is also used by EntityOwnerPicker.\n * In this mode, the EntityOwnerPicker won't show detailed information of the owners.\n */\nexport function useFacetsEntities({ enabled }: { enabled: boolean }) {\n const catalogApi = useApi(catalogApiRef);\n\n const [facetsPromise] = useState(async () => {\n if (!enabled) {\n return [];\n }\n const facet = 'relations.ownedBy';\n\n return catalogApi\n .getEntityFacets({ facets: [facet] })\n .then(response =>\n response.facets[facet]\n .map(e => e.value)\n .map(ref => {\n const { kind, name, namespace } = parseEntityRef(ref);\n return {\n apiVersion: 'backstage.io/v1beta1',\n kind,\n metadata: { name, namespace },\n };\n })\n .sort(\n (a, b) =>\n a.kind.localeCompare(b.kind, 'en-US') ||\n a.metadata.namespace.localeCompare(\n b.metadata.namespace,\n 'en-US',\n ) ||\n a.metadata.name.localeCompare(b.metadata.name, 'en-US'),\n ),\n )\n .catch(() => []);\n });\n\n return useAsyncFn<\n (\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n options?: { limit?: number },\n ) => Promise<FacetsEntitiesResponse>\n >(\n async (request, options) => {\n const facets = await facetsPromise;\n\n if (!facets) {\n return {\n items: [],\n };\n }\n\n const limit = options?.limit ?? 20;\n\n const { text, start } = decodeCursor(request);\n const filteredRefs = facets.filter(e => filterEntity(text, e));\n const end = start + limit;\n return {\n items: filteredRefs.slice(0, end),\n ...encodeCursor({\n entities: filteredRefs,\n limit: end,\n payload: {\n text,\n start: end,\n },\n }),\n };\n },\n [facetsPromise],\n { loading: true, value: { items: [] } },\n );\n}\n\nfunction decodeCursor(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): FacetsCursor {\n if (isFacetsResponse(request) && request.cursor) {\n return JSON.parse(atob(request.cursor));\n }\n return {\n text: (request as FacetsInitialRequest).text || '',\n start: 0,\n };\n}\n\nfunction isFacetsResponse(\n request: FacetsInitialRequest | FacetsEntitiesResponse,\n): request is FacetsEntitiesResponse {\n return !!(request as FacetsEntitiesResponse).cursor;\n}\n\nfunction encodeCursor({\n entities,\n limit,\n payload,\n}: {\n entities: Entity[];\n limit: number;\n payload: { text: string; start: number };\n}) {\n if (entities.length > limit) {\n return { cursor: btoa(JSON.stringify(payload)) };\n }\n return {};\n}\n\nfunction filterEntity(text: string, entity: Entity) {\n const normalizedText = text.trim();\n return (\n entity.kind.includes(normalizedText) ||\n entity.metadata.namespace?.includes(normalizedText) ||\n entity.metadata.name.includes(normalizedText)\n );\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EntityErrorFilter, EntityOrphanFilter } from '../../filters';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport { makeStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport { useState } from 'react';\nimport { useEntityList } from '../../hooks';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { CatalogAutocomplete } from '../CatalogAutocomplete';\n\n/** @public */\nexport type CatalogReactEntityProcessingStatusPickerClassKey = 'input';\n\nconst useStyles = makeStyles(\n {\n root: {},\n input: {},\n label: {},\n },\n { name: 'CatalogReactEntityProcessingStatusPickerPicker' },\n);\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/** @public */\nexport const EntityProcessingStatusPicker = () => {\n const classes = useStyles();\n const { updateFilters } = useEntityList();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n const [selectedAdvancedItems, setSelectedAdvancedItems] = useState<string[]>(\n [],\n );\n\n function orphanChange(value: boolean) {\n updateFilters({\n orphan: value ? new EntityOrphanFilter(value) : undefined,\n });\n }\n\n function errorChange(value: boolean) {\n updateFilters({\n error: value ? new EntityErrorFilter(value) : undefined,\n });\n }\n\n const availableAdvancedItems = ['Is Orphan', 'Has Error'];\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <CatalogAutocomplete<string, true>\n label={t('entityProcessingStatusPicker.title')}\n multiple\n disableCloseOnSelect\n options={availableAdvancedItems}\n value={selectedAdvancedItems}\n onChange={(_: object, value: string[]) => {\n setSelectedAdvancedItems(value);\n orphanChange(value.includes('Is Orphan'));\n errorChange(value.includes('Has Error'));\n }}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n onClick={event => event.preventDefault()}\n label={option}\n />\n )}\n name=\"processing-status-picker\"\n LabelProps={{ className: classes.label }}\n TextFieldProps={{ className: classes.input }}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport { EntityTagFilter } from '../../filters';\nimport { EntityAutocompletePicker } from '../EntityAutocompletePicker/EntityAutocompletePicker';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @public */\nexport type CatalogReactEntityTagPickerClassKey = 'input';\n\n/** @public */\nexport type EntityTagPickerProps = {\n showCounts?: boolean;\n initialFilter?: string[];\n hidden?: boolean;\n};\n\nconst useStyles = makeStyles(\n { input: {} },\n { name: 'CatalogReactEntityTagPicker' },\n);\n\n/** @public */\nexport const EntityTagPicker = (props: EntityTagPickerProps) => {\n const classes = useStyles();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n return (\n <EntityAutocompletePicker\n label={t('entityTagPicker.title')}\n name=\"tags\"\n path=\"metadata.tags\"\n Filter={EntityTagFilter}\n showCounts={props.showCounts}\n InputProps={{ className: classes.input }}\n initialSelectedOptions={props.initialFilter ? props.initialFilter : []}\n hidden={props.hidden}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useEntityTypeFilter } from '../../hooks/useEntityTypeFilter';\n\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Select } from '@backstage/core-components';\nimport { catalogReactTranslationRef } from '../../translation';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/**\n * Props for {@link EntityTypePicker}.\n *\n * @public\n */\nexport interface EntityTypePickerProps {\n initialFilter?: string;\n hidden?: boolean;\n}\n\n/** @public */\nexport const EntityTypePicker = (props: EntityTypePickerProps) => {\n const { hidden, initialFilter } = props;\n const alertApi = useApi(alertApiRef);\n const { error, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n const { t } = useTranslationRef(catalogReactTranslationRef);\n\n useEffect(() => {\n if (error) {\n alertApi.post({\n message: t('entityTypePicker.errorMessage'),\n severity: 'error',\n });\n }\n if (initialFilter) {\n setSelectedTypes([initialFilter]);\n }\n }, [error, alertApi, initialFilter, setSelectedTypes, t]);\n\n if (availableTypes.length === 0 || error) return null;\n\n availableTypes.sort((a, b) =>\n a.toLocaleLowerCase('en-US').localeCompare(b.toLocaleLowerCase('en-US')),\n );\n\n const items = [\n { value: 'all', label: t('entityTypePicker.optionAllTitle') },\n ...availableTypes.map((type: string) => ({\n value: type,\n label: type,\n })),\n ];\n\n return hidden ? null : (\n <Box pb={1} pt={1}>\n <Select\n label={t('entityTypePicker.title')}\n items={items}\n selected={(items.length > 1 ? selectedTypes[0] : undefined) ?? 'all'}\n onChange={value =>\n setSelectedTypes(value === 'all' ? [] : [String(value)])\n }\n />\n </Box>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport isEqual from 'lodash/isEqual';\nimport sortBy from 'lodash/sortBy';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '../api';\nimport { useEntityList } from './useEntityListProvider';\nimport { EntityTypeFilter } from '../filters';\n\n/**\n * A hook built on top of `useEntityList` for enabling selection of valid `spec.type` values\n * based on the selected EntityKindFilter.\n * @public\n */\nexport function useEntityTypeFilter(): {\n loading: boolean;\n error?: Error;\n availableTypes: string[];\n selectedTypes: string[];\n setSelectedTypes: (types: string[]) => void;\n} {\n const catalogApi = useApi(catalogApiRef);\n const {\n filters: { kind: kindFilter, type: typeFilter },\n queryParameters: { type: typeParameter },\n updateFilters,\n } = useEntityList();\n\n const flattenedQueryTypes = useMemo(\n () => [typeParameter].flat().filter(Boolean) as string[],\n [typeParameter],\n );\n\n const [selectedTypes, setSelectedTypes] = useState(\n flattenedQueryTypes.length\n ? flattenedQueryTypes\n : typeFilter?.getTypes() ?? [],\n );\n\n // Set selected types on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (flattenedQueryTypes.length) {\n setSelectedTypes(flattenedQueryTypes);\n }\n }, [flattenedQueryTypes]);\n\n const [availableTypes, setAvailableTypes] = useState<string[]>([]);\n const kind = useMemo(() => kindFilter?.value, [kindFilter]);\n\n // Load all valid spec.type values straight from the catalogApi, paying attention to only the\n // kind filter for a complete list.\n const {\n error,\n loading,\n value: facets,\n } = useAsync(async () => {\n if (kind) {\n const items = await catalogApi\n .getEntityFacets({\n filter: { kind },\n facets: ['spec.type'],\n })\n .then(response => response.facets['spec.type'] || []);\n return items;\n }\n return [];\n }, [kind, catalogApi]);\n\n const facetsRef = useRef(facets);\n useEffect(() => {\n const oldFacets = facetsRef.current;\n facetsRef.current = facets;\n // Delay processing hook until kind and facets load updates have settled to generate list of types;\n // This prevents resetting the type filter due to saved type value from query params not matching the\n // empty set of type values while values are still being loaded; also only run this hook on changes\n // to facets\n if (loading || !kind || oldFacets === facets || !facets) {\n return;\n }\n\n // Sort by facet count descending, so the most common types appear on top\n const newTypes = [\n ...new Set(\n sortBy(facets, f => -f.count).map(f =>\n f.value.toLocaleLowerCase('en-US'),\n ),\n ),\n ];\n setAvailableTypes(newTypes);\n\n // Update type filter to only valid values when the list of available types has changed\n const stillValidTypes = selectedTypes.filter(value =>\n newTypes.includes(value),\n );\n if (!isEqual(selectedTypes, stillValidTypes)) {\n setSelectedTypes(stillValidTypes);\n }\n }, [loading, kind, selectedTypes, setSelectedTypes, facets]);\n\n useEffect(() => {\n updateFilters({\n type: selectedTypes.length\n ? new EntityTypeFilter(selectedTypes)\n : undefined,\n });\n }, [selectedTypes, updateFilters]);\n\n return {\n loading,\n error,\n availableTypes,\n selectedTypes,\n setSelectedTypes,\n };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n configApiRef,\n IconComponent,\n useApi,\n} from '@backstage/core-plugin-api';\nimport Card from '@material-ui/core/Card';\nimport List from '@material-ui/core/List';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { StarIcon } from '@backstage/core-components';\nimport { Fragment, useEffect, useMemo, useState } from 'react';\nimport { EntityUserFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { UserListFilterKind } from '../../types';\nimport { useOwnedEntitiesCount } from './useOwnedEntitiesCount';\nimport { useAllEntitiesCount } from './useAllEntitiesCount';\nimport { useStarredEntitiesCount } from './useStarredEntitiesCount';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { catalogReactTranslationRef } from '../../translation';\n\n/** @public */\nexport type CatalogReactUserListPickerClassKey =\n | 'root'\n | 'title'\n | 'listIcon'\n | 'menuItem'\n | 'groupWrapper';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n boxShadow: 'none',\n margin: theme.spacing(1, 0, 1, 0),\n },\n title: {\n margin: theme.spacing(1, 0, 0, 1),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n listIcon: {\n minWidth: 30,\n color: theme.palette.text.primary,\n },\n menuItem: {\n minHeight: theme.spacing(6),\n },\n groupWrapper: {\n margin: theme.spacing(1, 1, 2, 1),\n },\n }),\n { name: 'CatalogReactUserListPicker' },\n);\n\nexport type ButtonGroup = {\n name: string;\n items: {\n id: 'owned' | 'starred' | 'all';\n label: string;\n icon?: IconComponent;\n }[];\n};\n\nfunction getFilterGroups(\n orgName: string,\n t: TranslationFunction<typeof catalogReactTranslationRef.T>,\n): ButtonGroup[] {\n return [\n {\n name: t('userListPicker.personalFilter.title'),\n items: [\n {\n id: 'owned',\n label: t('userListPicker.personalFilter.ownedLabel'),\n icon: SettingsIcon,\n },\n {\n id: 'starred',\n label: t('userListPicker.personalFilter.starredLabel'),\n icon: StarIcon,\n },\n ],\n },\n {\n name: orgName,\n items: [\n {\n id: 'all',\n label: t('userListPicker.orgFilterAllLabel'),\n },\n ],\n },\n ];\n}\n\n/** @public */\nexport type UserListPickerProps = {\n initialFilter?: UserListFilterKind;\n availableFilters?: UserListFilterKind[];\n hidden?: boolean;\n alwaysKeepFilters?: boolean;\n};\n\n/** @public */\nexport const UserListPicker = (props: UserListPickerProps) => {\n const { initialFilter, availableFilters, hidden, alwaysKeepFilters } = props;\n const classes = useStyles();\n const configApi = useApi(configApiRef);\n const { t } = useTranslationRef(catalogReactTranslationRef);\n const orgName =\n configApi.getOptionalString('organization.name') ??\n t('userListPicker.defaultOrgName');\n const {\n filters,\n updateFilters,\n queryParameters: { user: userParameter },\n } = useEntityList();\n const kindParameter = filters.kind?.value?.toLowerCase();\n\n // Remove group items that aren't in availableFilters and exclude\n // any now-empty groups.\n const userAndGroupFilterIds = ['starred', 'all'];\n const filterGroups = getFilterGroups(orgName, t)\n .map(filterGroup => ({\n ...filterGroup,\n items: filterGroup.items.filter(({ id }) =>\n // TODO: avoid hardcoding kinds here\n ['group', 'user'].some(kind => kind === kindParameter)\n ? userAndGroupFilterIds.includes(id)\n : !availableFilters || availableFilters.includes(id),\n ),\n }))\n .filter(({ items }) => !!items.length);\n\n const {\n count: ownedEntitiesCount,\n loading: loadingOwnedEntities,\n filter: ownedEntitiesFilter,\n } = useOwnedEntitiesCount();\n const { count: allCount } = useAllEntitiesCount();\n const {\n count: starredEntitiesCount,\n filter: starredEntitiesFilter,\n loading: loadingStarredEntities,\n } = useStarredEntitiesCount();\n\n const queryParamUserFilter = useMemo(\n () => [userParameter].flat()[0],\n [userParameter],\n );\n\n const [selectedUserFilter, setSelectedUserFilter] = useState(\n (queryParamUserFilter as UserListFilterKind) ?? initialFilter,\n );\n\n const filterCounts = useMemo(() => {\n return {\n all: allCount,\n starred: starredEntitiesCount,\n owned: ownedEntitiesCount,\n };\n }, [starredEntitiesCount, ownedEntitiesCount, allCount]);\n\n // Set selected user filter on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamUserFilter) {\n setSelectedUserFilter(queryParamUserFilter as UserListFilterKind);\n }\n }, [queryParamUserFilter]);\n\n const loading = loadingOwnedEntities || loadingStarredEntities;\n\n useEffect(() => {\n if (\n !loading &&\n !!selectedUserFilter &&\n selectedUserFilter !== 'all' &&\n filterCounts[selectedUserFilter] === 0 &&\n !alwaysKeepFilters\n ) {\n setSelectedUserFilter('all');\n }\n }, [\n loading,\n filterCounts,\n selectedUserFilter,\n setSelectedUserFilter,\n alwaysKeepFilters,\n ]);\n\n useEffect(() => {\n if (!selectedUserFilter) {\n return;\n }\n if (loading) {\n return;\n }\n\n const getFilter = () => {\n if (selectedUserFilter === 'owned') {\n return ownedEntitiesFilter;\n }\n if (selectedUserFilter === 'starred') {\n return starredEntitiesFilter;\n }\n return EntityUserFilter.all();\n };\n\n updateFilters({ user: getFilter() });\n }, [\n selectedUserFilter,\n starredEntitiesFilter,\n ownedEntitiesFilter,\n updateFilters,\n\n loading,\n ]);\n\n return hidden ? null : (\n <Card className={classes.root}>\n {filterGroups.map(group => (\n <Fragment key={group.name}>\n <Typography\n variant=\"subtitle2\"\n component=\"span\"\n className={classes.title}\n >\n {group.name}\n </Typography>\n <Card className={classes.groupWrapper}>\n <List disablePadding dense role=\"menu\" aria-label={group.name}>\n {group.items.map((item, index) => (\n <MenuItem\n role=\"none presentation\"\n key={item.id}\n divider={index !== group.items.length - 1}\n onClick={() => setSelectedUserFilter(item.id)}\n selected={item.id === filters.user?.value}\n className={classes.menuItem}\n disabled={filterCounts[item.id] === 0}\n data-testid={`user-picker-${item.id}`}\n tabIndex={0}\n ContainerProps={{ role: 'menuitem' }}\n >\n {item.icon && (\n <ListItemIcon className={classes.listIcon}>\n <item.icon fontSize=\"small\" />\n </ListItemIcon>\n )}\n <ListItemText>\n <Typography variant=\"body1\">{item.label} </Typography>\n </ListItemText>\n <ListItemSecondaryAction>\n {filterCounts[item.id] ?? '-'}\n </ListItemSecondaryAction>\n </MenuItem>\n ))}\n </List>\n </Card>\n </Fragment>\n ))}\n </Card>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { compact, intersection } from 'lodash';\nimport { useMemo } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityOwnerFilter, EntityUserFilter } from '../../filters';\nimport { useEntityList } from '../../hooks';\nimport { CatalogFilters, reduceCatalogFilters } from '../../utils/filters';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDeepCompareEffect from 'react-use/esm/useDeepCompareEffect';\n\nexport function useOwnedEntitiesCount() {\n const identityApi = useApi(identityApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n const { filters } = useEntityList();\n\n const { value: ownershipEntityRefs, loading: loadingEntityRefs } = useAsync(\n async () => (await identityApi.getBackstageIdentity()).ownershipEntityRefs,\n // load only on mount\n [],\n );\n\n const { user, owners, ...allFilters } = filters;\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(\n compact(Object.values(allFilters)),\n );\n\n const [{ value: count, loading: loadingEntityOwnership }, fetchEntities] =\n useAsyncFn(\n async (req: {\n ownershipEntityRefs: string[];\n owners: EntityOwnerFilter | undefined;\n filter: CatalogFilters;\n }) => {\n const ownedClaims = getOwnedCountClaims(\n req.owners,\n req.ownershipEntityRefs,\n );\n if (ownedClaims === undefined) {\n // this implicitly means that there aren't claims in common with\n // the logged in users, so avoid invoking the queryEntities endpoint\n // which will implicitly returns 0\n return 0;\n }\n\n const { ['metadata.name']: metadata, ...filter } = req.filter.filter;\n\n const { totalItems } = await catalogApi.queryEntities({\n ...req.filter,\n filter: {\n ...filter,\n 'relations.ownedBy': ownedClaims,\n },\n limit: 0,\n });\n return totalItems;\n },\n [],\n { loading: true },\n );\n\n useDeepCompareEffect(() => {\n // context contains no filter, wait\n if (Object.keys(catalogFilters.filter).length === 0) {\n return;\n }\n // ownershipEntityRefs is loading, wait\n if (ownershipEntityRefs === undefined) {\n return;\n }\n fetchEntities({\n ownershipEntityRefs,\n owners,\n filter: catalogFilters,\n });\n }, [ownershipEntityRefs, owners, catalogFilters]);\n\n const loading = loadingEntityRefs || loadingEntityOwnership;\n\n return {\n count,\n loading,\n filter: useMemo(\n () => EntityUserFilter.owned(ownershipEntityRefs ?? []),\n [ownershipEntityRefs],\n ),\n ownershipEntityRefs,\n };\n}\n\nfunction getOwnedCountClaims(\n owners: EntityOwnerFilter | undefined,\n ownershipEntityRefs: string[] | undefined,\n) {\n if (ownershipEntityRefs === undefined) {\n return undefined;\n }\n const ownersRefs = owners?.values ?? [];\n if (ownersRefs.length) {\n const commonOwnedBy = intersection(ownersRefs, ownershipEntityRefs);\n if (commonOwnedBy.length === 0) {\n return undefined;\n }\n return commonOwnedBy;\n }\n return ownershipEntityRefs;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { QueryEntitiesInitialRequest } from '@backstage/catalog-client';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { compact, isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { useEntityList } from '../../hooks';\nimport { reduceCatalogFilters } from '../../utils/filters';\n\nexport function useAllEntitiesCount() {\n const catalogApi = useApi(catalogApiRef);\n const { filters } = useEntityList();\n\n const prevRequest = useRef<QueryEntitiesInitialRequest>();\n const request = useMemo(() => {\n const { user, ...allFilters } = filters;\n const compacted = compact(Object.values(allFilters));\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(compacted);\n const newRequest: QueryEntitiesInitialRequest = {\n ...catalogFilters,\n limit: 0,\n };\n\n if (Object.keys(catalogFilters.filter).length === 0) {\n prevRequest.current = undefined;\n return prevRequest.current;\n }\n\n if (isEqual(newRequest, prevRequest.current)) {\n return prevRequest.current;\n }\n prevRequest.current = newRequest;\n return newRequest;\n }, [filters]);\n\n const { value: count, loading } = useAsync(async () => {\n if (request === undefined) {\n return 0;\n }\n const { totalItems } = await catalogApi.queryEntities(request);\n\n return totalItems;\n }, [request]);\n\n return { count, loading };\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryEntitiesInitialRequest } from '@backstage/catalog-client';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { compact, isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { catalogApiRef } from '../../api';\nimport { EntityUserFilter } from '../../filters';\nimport { useEntityList, useStarredEntities } from '../../hooks';\nimport { reduceCatalogFilters } from '../../utils/filters';\n\nexport function useStarredEntitiesCount() {\n const catalogApi = useApi(catalogApiRef);\n const { filters } = useEntityList();\n const { starredEntities } = useStarredEntities();\n\n const prevRequest = useRef<QueryEntitiesInitialRequest>();\n const request = useMemo(() => {\n const { user, ...allFilters } = filters;\n const compacted = compact(Object.values(allFilters));\n const { orderFields, ...catalogFilters } = reduceCatalogFilters(compacted);\n\n const facet = 'metadata.name';\n\n const newRequest: QueryEntitiesInitialRequest = {\n ...catalogFilters,\n filter: {\n ...catalogFilters.filter,\n /**\n * here we are filtering entities by `name`. Given this filter,\n * the response might contain more entities than expected, in case multiple entities\n * of different kind or namespace share the same name. Those extra entities are filtered out\n * client side by `EntityUserFilter`, so they won't be visible to the user.\n */\n [facet]: Array.from(starredEntities).map(e => parseEntityRef(e).name),\n },\n /**\n * limit is set to a high value as we are not expecting many starred entities\n */\n limit: 1000,\n };\n if (isEqual(newRequest, prevRequest.current)) {\n return prevRequest.current;\n }\n prevRequest.current = newRequest;\n\n return newRequest;\n }, [filters, starredEntities]);\n\n const { value: count, loading } = useAsync(async () => {\n if (!starredEntities.size) {\n return 0;\n }\n\n /**\n * given a list of starred entity refs and some filters coming from CatalogPage,\n * it reduces the list of starred entities, to a list of entities that matches the\n * provided filters. It won't be possible to getEntitiesByRefs\n * as the method doesn't accept any filter.\n */\n const response = await catalogApi.queryEntities(request);\n\n return response.items\n .map(e =>\n stringifyEntityRef({\n kind: e.kind,\n namespace: e.metadata.namespace,\n name: e.metadata.name,\n }),\n )\n .filter(e => starredEntities.has(e)).length;\n }, [request, starredEntities]);\n\n const filter = useMemo(\n () => EntityUserFilter.starred(Array.from(starredEntities)),\n [starredEntities],\n );\n\n return { count, loading, filter };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { AlphaEntity } from '@backstage/catalog-model/alpha';\nimport { EntityFilter, UserListFilterKind } from './types';\nimport { getEntityRelations } from './utils/getEntityRelations';\nimport { EntityOrderQuery } from '@backstage/catalog-client';\n\n/**\n * Filter entities based on Kind.\n * @public\n */\nexport class EntityKindFilter implements EntityFilter {\n readonly value: string;\n readonly label: string;\n\n constructor(value: string, label: string) {\n this.value = value;\n this.label = label;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { kind: this.value };\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based on type\n * @public\n */\nexport class EntityTypeFilter implements EntityFilter {\n readonly value: string | string[];\n\n constructor(value: string | string[]) {\n this.value = value;\n }\n\n // Simplify `string | string[]` for consumers, always returns an array\n getTypes(): string[] {\n return Array.isArray(this.value) ? this.value : [this.value];\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'spec.type': this.getTypes() };\n }\n\n toQueryValue(): string[] {\n return this.getTypes();\n }\n}\n\n/**\n * Filters entities based on tag.\n * @public\n */\nexport class EntityTagFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.every(v => (entity.metadata.tags ?? []).includes(v));\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'metadata.tags': this.values };\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities where the text matches spec, title or tags.\n * @public\n */\nexport class EntityTextFilter implements EntityFilter {\n readonly value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n\n filterEntity(entity: Entity): boolean {\n const words = this.toUpperArray(this.value.split(/\\s/));\n const exactMatch = this.toUpperArray([entity.metadata.tags]);\n const partialMatch = this.toUpperArray([\n entity.metadata.name,\n entity.metadata.title,\n (entity.spec?.profile as { displayName?: string })?.displayName,\n ]);\n\n for (const word of words) {\n if (\n exactMatch.every(m => m !== word) &&\n partialMatch.every(m => !m.includes(word))\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n getFullTextFilters() {\n return {\n term: this.value,\n // Update this to be more dynamic based on table columns.\n fields: ['metadata.name', 'metadata.title', 'spec.profile.displayName'],\n };\n }\n\n toQueryValue() {\n return this.value;\n }\n\n private toUpperArray(\n value: Array<string | string[] | undefined>,\n ): Array<string> {\n return value\n .flat()\n .filter((m): m is string => Boolean(m))\n .map(m => m.toLocaleUpperCase('en-US'));\n }\n}\n\n/**\n * Filter matching entities that are owned by group.\n * @public\n *\n * CAUTION: This class may contain both full and partial entity refs.\n */\nexport class EntityOwnerFilter implements EntityFilter {\n readonly values: string[];\n constructor(values: string[]) {\n this.values = values.reduce((fullRefs, ref) => {\n // Attempt to remove bad entity references here.\n try {\n fullRefs.push(\n stringifyEntityRef(parseEntityRef(ref, { defaultKind: 'Group' })),\n );\n return fullRefs;\n } catch (err) {\n return fullRefs;\n }\n }, [] as string[]);\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'relations.ownedBy': this.values };\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.some(v =>\n getEntityRelations(entity, RELATION_OWNED_BY).some(\n o => stringifyEntityRef(o) === v,\n ),\n );\n }\n\n /**\n * Get the URL query parameter value. May be a mix of full and humanized entity refs.\n * @returns list of entity refs.\n */\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities on lifecycle.\n * @public\n */\nexport class EntityLifecycleFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'spec.lifecycle': this.values };\n }\n\n filterEntity(entity: Entity): boolean {\n return this.values.some(v => entity.spec?.lifecycle === v);\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * Filters entities to those within the given namespace(s).\n * @public\n */\nexport class EntityNamespaceFilter implements EntityFilter {\n readonly values: string[];\n\n constructor(values: string[]) {\n this.values = values;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n return { 'metadata.namespace': this.values };\n }\n filterEntity(entity: Entity): boolean {\n return this.values.some(v => entity.metadata.namespace === v);\n }\n\n toQueryValue(): string[] {\n return this.values;\n }\n}\n\n/**\n * @public\n */\nexport class EntityUserFilter implements EntityFilter {\n readonly value: UserListFilterKind;\n readonly refs?: string[];\n\n private constructor(value: UserListFilterKind, refs?: string[]) {\n this.value = value;\n this.refs = refs;\n }\n\n static owned(ownershipEntityRefs: string[]) {\n return new EntityUserFilter('owned', ownershipEntityRefs);\n }\n\n static all() {\n return new EntityUserFilter('all');\n }\n\n static starred(starredEntityRefs: string[]) {\n return new EntityUserFilter('starred', starredEntityRefs);\n }\n\n getCatalogFilters(): Record<string, string[]> {\n if (this.value === 'owned') {\n return { 'relations.ownedBy': this.refs ?? [] };\n }\n if (this.value === 'starred') {\n return {\n 'metadata.name': this.refs?.map(e => parseEntityRef(e).name) ?? [],\n };\n }\n return {};\n }\n\n filterEntity(entity: Entity) {\n if (this.value === 'starred') {\n return this.refs?.includes(stringifyEntityRef(entity)) ?? true;\n }\n // used only for retro-compatibility with non paginated data.\n // This is supposed to return always true for paginated\n // owned entities, since the filters are applied server side.\n if (this.value === 'owned') {\n const relations = getEntityRelations(entity, RELATION_OWNED_BY);\n\n return (\n this.refs?.some(v =>\n relations.some(o => stringifyEntityRef(o) === v),\n ) ?? false\n );\n }\n return true;\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based on whatever the user has starred or owns them.\n * @deprecated use EntityUserFilter\n * @public\n */\nexport class UserListFilter implements EntityFilter {\n readonly value: UserListFilterKind;\n readonly isOwnedEntity: (entity: Entity) => boolean;\n readonly isStarredEntity: (entity: Entity) => boolean;\n\n constructor(\n value: UserListFilterKind,\n isOwnedEntity: (entity: Entity) => boolean,\n isStarredEntity: (entity: Entity) => boolean,\n ) {\n this.value = value;\n this.isOwnedEntity = isOwnedEntity;\n this.isStarredEntity = isStarredEntity;\n }\n\n filterEntity(entity: Entity): boolean {\n switch (this.value) {\n case 'owned':\n return this.isOwnedEntity(entity);\n case 'starred':\n return this.isStarredEntity(entity);\n default:\n return true;\n }\n }\n\n toQueryValue(): string {\n return this.value;\n }\n}\n\n/**\n * Filters entities based if it is an orphan or not.\n * @public\n */\nexport class EntityOrphanFilter implements EntityFilter {\n readonly value: boolean;\n\n constructor(value: boolean) {\n this.value = value;\n }\n\n getCatalogFilters(): Record<string, string | string[]> {\n if (this.value) {\n return { 'metadata.annotations.backstage.io/orphan': String(this.value) };\n }\n return {};\n }\n\n filterEntity(entity: Entity): boolean {\n const orphan = entity.metadata.annotations?.['backstage.io/orphan'];\n return orphan !== undefined && this.value.toString() === orphan;\n }\n}\n\n/**\n * Filters entities based on if it has errors or not.\n * @public\n */\nexport class EntityErrorFilter implements EntityFilter {\n readonly value: boolean;\n\n constructor(value: boolean) {\n this.value = value;\n }\n\n filterEntity(entity: Entity): boolean {\n const error =\n ((entity as AlphaEntity)?.status?.items?.length as number) > 0;\n return error !== undefined && this.value === error;\n }\n}\n\n/**\n * Sort entities by a given field/column.\n * @public\n */\nexport class EntityOrderFilter implements EntityFilter {\n readonly values: [string, 'asc' | 'desc'][];\n\n constructor(values: [string, 'asc' | 'desc'][]) {\n this.values = values;\n }\n\n getOrderFilters(): EntityOrderQuery {\n return this.values.map(([field, order]) => ({ field, order }));\n }\n\n toQueryValue(): string[] {\n return this.values.flat();\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryEntitiesResponse } from '@backstage/catalog-client';\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n createVersionedContext,\n createVersionedValueMap,\n useVersionedContext,\n} from '@backstage/version-bridge';\nimport { compact, isEqual } from 'lodash';\nimport qs from 'qs';\nimport {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useAsyncFn from 'react-use/esm/useAsyncFn';\nimport useDebounce from 'react-use/esm/useDebounce';\nimport useMountedState from 'react-use/esm/useMountedState';\nimport { catalogApiRef } from '../api';\nimport {\n EntityErrorFilter,\n EntityKindFilter,\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityTypeFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityFilter, EntityListPagination } from '../types';\nimport {\n reduceBackendCatalogFilters,\n reduceCatalogFilters,\n reduceEntityFilters,\n} from '../utils/filters';\n\n/** @public */\nexport type DefaultEntityFilters = {\n kind?: EntityKindFilter;\n type?: EntityTypeFilter;\n user?: UserListFilter | EntityUserFilter;\n owners?: EntityOwnerFilter;\n lifecycles?: EntityLifecycleFilter;\n tags?: EntityTagFilter;\n text?: EntityTextFilter;\n orphan?: EntityOrphanFilter;\n error?: EntityErrorFilter;\n namespace?: EntityNamespaceFilter;\n order?: EntityOrderFilter;\n};\n\n/** @public */\nexport type PaginationMode = 'cursor' | 'offset' | 'none';\n\n/** @public */\nexport type EntityListContextProps<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n> = {\n /**\n * The currently registered filters, adhering to the shape of DefaultEntityFilters or an extension\n * of that default (to add custom filter types).\n */\n filters: EntityFilters;\n\n /**\n * The resolved list of catalog entities, after all filters are applied.\n */\n entities: Entity[];\n\n /**\n * The resolved list of catalog entities, after _only catalog-backend_ filters are applied.\n */\n backendEntities: Entity[];\n\n /**\n * Update one or more of the registered filters. Optional filters can be set to `undefined` to\n * reset the filter.\n */\n updateFilters: (\n filters:\n | Partial<EntityFilters>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => void;\n\n /**\n * Filter values from query parameters.\n */\n queryParameters: Partial<Record<keyof EntityFilters, string | string[]>>;\n\n loading: boolean;\n error?: Error;\n\n pageInfo?: {\n next?: () => void;\n prev?: () => void;\n };\n totalItems?: number;\n limit: number;\n offset?: number;\n setLimit: (limit: number) => void;\n setOffset?: (offset: number) => void;\n paginationMode: PaginationMode;\n};\n\n// This context has support for multiple concurrent versions of this package.\n// It is currently used in parallel with the old context in order to provide\n// a smooth transition, but will eventually be the only context we use.\nexport const NewEntityListContext = createVersionedContext<{\n 1: EntityListContextProps<any>;\n}>('entity-list-context');\n\n/**\n * Creates new context for entity listing and filtering.\n */\nexport const OldEntityListContext = createContext<\n EntityListContextProps<any> | undefined\n>(undefined);\n\ntype OutputState<EntityFilters extends DefaultEntityFilters> = {\n appliedFilters: EntityFilters;\n appliedCursor?: string;\n entities: Entity[];\n backendEntities: Entity[];\n pageInfo?: QueryEntitiesResponse['pageInfo'];\n totalItems?: number;\n offset?: number;\n limit?: number;\n};\n\n/**\n * @public\n */\nexport type EntityListProviderProps = PropsWithChildren<{\n pagination?: EntityListPagination;\n}>;\n\n/**\n * Provides entities and filters for a catalog listing.\n * @public\n */\nexport const EntityListProvider = <EntityFilters extends DefaultEntityFilters>(\n props: EntityListProviderProps,\n) => {\n const isMounted = useMountedState();\n const catalogApi = useApi(catalogApiRef);\n const [requestedFilters, setRequestedFilters] = useState<EntityFilters>(\n {} as EntityFilters,\n );\n\n // We use react-router's useLocation hook so updates from external sources trigger an update to\n // the queryParameters in outputState. Updates from this hook use replaceState below and won't\n // trigger a useLocation change; this would instead come from an external source, such as a manual\n // update of the URL or two catalog sidebar links with different catalog filters.\n const location = useLocation();\n\n const getPaginationMode = (): PaginationMode => {\n if (props.pagination === true) {\n return 'cursor';\n }\n return typeof props.pagination === 'object'\n ? props.pagination.mode ?? 'cursor'\n : 'none';\n };\n\n const paginationMode = getPaginationMode();\n const paginationLimit =\n typeof props.pagination === 'object' ? props.pagination.limit ?? 20 : 20;\n\n const {\n queryParameters,\n cursor: initialCursor,\n offset: initialOffset,\n limit: initialLimit,\n } = useMemo(() => {\n const parsed = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n\n let limit = paginationLimit;\n if (typeof parsed.limit === 'string') {\n const queryLimit = Number.parseInt(parsed.limit, 10);\n if (!isNaN(queryLimit)) {\n limit = queryLimit;\n }\n }\n\n const offset =\n typeof parsed.offset === 'string' && paginationMode === 'offset'\n ? Number.parseInt(parsed.offset, 10)\n : undefined;\n\n return {\n queryParameters: (parsed.filters ?? {}) as Record<\n string,\n string | string[]\n >,\n cursor:\n typeof parsed.cursor === 'string' && paginationMode === 'cursor'\n ? parsed.cursor\n : undefined,\n offset:\n paginationMode === 'offset' && offset && !isNaN(offset)\n ? offset\n : undefined,\n limit,\n };\n }, [paginationMode, location.search, paginationLimit]);\n\n const [cursor, setCursor] = useState(initialCursor);\n const [offset, setOffset] = useState<number | undefined>(initialOffset);\n const [limit, setLimit] = useState(initialLimit);\n\n const [outputState, setOutputState] = useState<OutputState<EntityFilters>>(\n () => {\n return {\n appliedFilters: {} as EntityFilters,\n entities: [],\n backendEntities: [],\n pageInfo: {},\n offset,\n limit,\n };\n },\n );\n\n // The main async filter worker. Note that while it has a lot of dependencies\n // in terms of its implementation, the triggering only happens (debounced)\n // based on the requested filters changing.\n const [{ value: resolvedValue, loading, error }, refresh] = useAsyncFn(\n async () => {\n const kindValue =\n requestedFilters.kind?.value?.toLocaleLowerCase('en-US');\n const adjustedFilters =\n kindValue === 'user' || kindValue === 'group'\n ? { ...requestedFilters, owners: undefined }\n : requestedFilters;\n const compacted = compact(Object.values(adjustedFilters));\n const entityFilter = reduceEntityFilters(compacted);\n\n if (paginationMode !== 'none') {\n if (cursor) {\n if (cursor !== outputState.appliedCursor) {\n const response = await catalogApi.queryEntities({\n cursor,\n limit,\n });\n return {\n appliedFilters: requestedFilters,\n appliedCursor: cursor,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n appliedCursor: outputState.appliedCursor,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n if (\n (paginationMode === 'offset' &&\n (outputState.limit !== limit || outputState.offset !== offset)) ||\n !isEqual(previousBackendFilter, backendFilter)\n ) {\n const response = await catalogApi.queryEntities({\n ...backendFilter,\n limit,\n offset,\n });\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities: response.items.filter(entityFilter),\n pageInfo: response.pageInfo,\n totalItems: response.totalItems,\n limit,\n offset,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n pageInfo: outputState.pageInfo,\n totalItems: outputState.totalItems,\n limit: outputState.limit,\n offset: outputState.offset,\n };\n }\n\n const backendFilter = reduceBackendCatalogFilters(compacted);\n const { orderFields } = reduceCatalogFilters(compacted);\n const previousBackendFilter = reduceBackendCatalogFilters(\n compact(Object.values(outputState.appliedFilters)),\n );\n\n // TODO(mtlewis): currently entities will never be requested unless\n // there's at least one filter, we should allow an initial request\n // to happen with no filters.\n if (!isEqual(previousBackendFilter, backendFilter)) {\n // TODO(timbonicus): should limit fields here, but would need filter\n // fields + table columns\n const response = await catalogApi.getEntities({\n filter: backendFilter,\n order: orderFields,\n });\n const entities = response.items.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: response.items,\n entities,\n totalItems: entities.length,\n };\n }\n const entities = outputState.backendEntities.filter(entityFilter);\n return {\n appliedFilters: requestedFilters,\n backendEntities: outputState.backendEntities,\n entities,\n totalItems: entities.length,\n };\n },\n [\n catalogApi,\n queryParameters,\n requestedFilters,\n outputState,\n cursor,\n paginationMode,\n limit,\n offset,\n ],\n { loading: true },\n );\n\n // Slight debounce on the refresh, since (especially on page load) several\n // filters will be calling this in rapid succession.\n useDebounce(refresh, 10, [requestedFilters, cursor, limit, offset]);\n\n useEffect(() => {\n if (resolvedValue === undefined) {\n return;\n }\n setOutputState(resolvedValue);\n if (isMounted()) {\n const queryParams = Object.keys(requestedFilters).reduce(\n (params, key) => {\n const filter = requestedFilters[key as keyof EntityFilters] as\n | EntityFilter\n | undefined;\n if (filter?.toQueryValue) {\n params[key] = filter.toQueryValue();\n }\n return params;\n },\n {} as Record<string, string | string[]>,\n );\n\n const oldParams = qs.parse(location.search, {\n ignoreQueryPrefix: true,\n arrayLimit: 10000,\n });\n const newParams = qs.stringify(\n {\n ...oldParams,\n filters: queryParams,\n ...(paginationMode === 'none' ? {} : { cursor, limit, offset }),\n },\n { addQueryPrefix: true, arrayFormat: 'repeat' },\n );\n const newUrl = `${window.location.pathname}${newParams}`;\n // We use direct history manipulation since useSearchParams and\n // useNavigate in react-router-dom cause unnecessary extra rerenders.\n // Also make sure to replace the state rather than pushing, since we\n // don't want there to be back/forward slots for every single filter\n // change.\n window.history?.replaceState(null, document.title, newUrl);\n }\n }, [\n cursor,\n isMounted,\n limit,\n location.search,\n offset,\n requestedFilters,\n resolvedValue,\n paginationMode,\n ]);\n\n const updateFilters = useCallback(\n (\n update:\n | Partial<EntityFilter>\n | ((prevFilters: EntityFilters) => Partial<EntityFilters>),\n ) => {\n // changing filters will affect pagination, so we need to reset\n // the cursor and start from the first page.\n // TODO(vinzscam): this is currently causing issues at page reload\n // where the state is not kept. Unfortunately we need to rethink\n // the way filters work in order to fix this.\n if (paginationMode === 'cursor') {\n setCursor(undefined);\n } else if (paginationMode === 'offset') {\n // Same thing with offset\n setOffset(0);\n }\n setRequestedFilters(prevFilters => {\n const newFilters =\n typeof update === 'function' ? update(prevFilters) : update;\n return { ...prevFilters, ...newFilters };\n });\n },\n [paginationMode],\n );\n\n // Use resolvedValue directly when available to avoid an extra render cycle.\n // Without this, there's a render where loading has flipped back to false but\n // outputState hasn't been updated yet (it syncs via useEffect), causing a\n // flash of stale data between the loading state and the new results.\n const latestOutput = resolvedValue ?? outputState;\n\n const pageInfo = useMemo(() => {\n if (paginationMode !== 'cursor') {\n return undefined;\n }\n\n const prevCursor = latestOutput.pageInfo?.prevCursor;\n const nextCursor = latestOutput.pageInfo?.nextCursor;\n return {\n prev: prevCursor ? () => setCursor(prevCursor) : undefined,\n next: nextCursor ? () => setCursor(nextCursor) : undefined,\n };\n }, [paginationMode, latestOutput.pageInfo]);\n\n const value = useMemo(\n () => ({\n filters: latestOutput.appliedFilters,\n entities: latestOutput.entities,\n backendEntities: latestOutput.backendEntities,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n totalItems: latestOutput.totalItems,\n limit,\n offset,\n setLimit,\n setOffset,\n paginationMode,\n }),\n [\n latestOutput,\n updateFilters,\n queryParameters,\n loading,\n error,\n pageInfo,\n limit,\n offset,\n paginationMode,\n setLimit,\n setOffset,\n ],\n );\n\n return (\n <OldEntityListContext.Provider value={value}>\n <NewEntityListContext.Provider\n value={createVersionedValueMap({ 1: value })}\n >\n {props.children}\n </NewEntityListContext.Provider>\n </OldEntityListContext.Provider>\n );\n};\n\n/**\n * Hook for interacting with the entity list context provided by the {@link EntityListProvider}.\n * @public\n */\nexport function useEntityList<\n EntityFilters extends DefaultEntityFilters = DefaultEntityFilters,\n>(): EntityListContextProps<EntityFilters> {\n const versionedHolder = useVersionedContext<{\n 1: EntityListContextProps<any>;\n }>('entity-list-context');\n const oldContext = useContext(OldEntityListContext);\n\n if (versionedHolder) {\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error('EntityListContext v1 not available');\n }\n return value;\n }\n\n if (oldContext) {\n return oldContext;\n }\n\n throw new Error('useEntityList must be used within EntityListProvider');\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Entity,\n CompoundEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useCallback, useMemo } from 'react';\nimport useObservable from 'react-use/esm/useObservable';\nimport { starredEntitiesApiRef } from '../apis';\n\nfunction getEntityRef(\n entityOrRef: Entity | CompoundEntityRef | string,\n): string {\n return typeof entityOrRef === 'string'\n ? entityOrRef\n : stringifyEntityRef(entityOrRef);\n}\n\n/** @public */\nexport function useStarredEntities(): {\n starredEntities: Set<string>;\n toggleStarredEntity: (\n entityOrRef: Entity | CompoundEntityRef | string,\n ) => void;\n isStarredEntity: (\n entityOrRef: Entity | CompoundEntityRef | string,\n ) => boolean;\n} {\n const starredEntitiesApi = useApi(starredEntitiesApiRef);\n\n const starredEntities = useObservable(\n useMemo(() => starredEntitiesApi.starredEntitie$(), [starredEntitiesApi]),\n new Set<string>(),\n );\n\n const isStarredEntity = useCallback(\n (entityOrRef: Entity | CompoundEntityRef | string) =>\n starredEntities.has(getEntityRef(entityOrRef)),\n [starredEntities],\n );\n\n const toggleStarredEntity = useCallback(\n (entityOrRef: Entity | CompoundEntityRef | string) =>\n starredEntitiesApi.toggleStarred(getEntityRef(entityOrRef)).then(),\n [starredEntitiesApi],\n );\n\n return {\n starredEntities,\n toggleStarredEntity,\n isStarredEntity,\n };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Entity } from '@backstage/catalog-model';\nimport { EntityFilter } from '../types';\nimport {\n EntityLifecycleFilter,\n EntityNamespaceFilter,\n EntityOrderFilter,\n EntityOrphanFilter,\n EntityOwnerFilter,\n EntityTagFilter,\n EntityTextFilter,\n EntityUserFilter,\n UserListFilter,\n} from '../filters';\nimport { EntityOrderQuery } from '@backstage/catalog-client';\n\nexport interface CatalogFilters {\n filter: Record<string, string | symbol | (string | symbol)[]>;\n fullTextFilter?: {\n term: string;\n };\n orderFields?: EntityOrderQuery;\n}\n\nfunction isEntityTextFilter(t: EntityFilter): t is EntityTextFilter {\n return !!(t as EntityTextFilter).getFullTextFilters;\n}\n\nfunction isEntityOrderFilter(t: EntityFilter): t is EntityOrderFilter {\n return !!(t as EntityOrderFilter).getOrderFilters;\n}\n\nexport function reduceCatalogFilters(filters: EntityFilter[]): CatalogFilters {\n const condensedFilters = filters.reduce<CatalogFilters['filter']>(\n (compoundFilter, filter) => {\n return {\n ...compoundFilter,\n ...(filter.getCatalogFilters ? filter.getCatalogFilters() : {}),\n };\n },\n {},\n );\n\n const fullTextFilter = filters.find(isEntityTextFilter)?.getFullTextFilters();\n\n const orderFields = filters.find(isEntityOrderFilter)?.getOrderFilters() || [\n {\n field: 'metadata.name',\n order: 'asc',\n },\n ];\n return { filter: condensedFilters, fullTextFilter, orderFields };\n}\n\n/**\n * This function computes and returns an object containing the filters to be sent\n * to the backend. Any filter coming from `EntityKindFilter` and `EntityTypeFilter`, together\n * with custom filter set by the adopters is allowed. This function is used by `EntityListProvider`\n * and it won't be needed anymore in the future once pagination is implemented, as all the filters\n * will be applied backend-side.\n */\nexport function reduceBackendCatalogFilters(filters: EntityFilter[]) {\n const backendCatalogFilters: Record<\n string,\n string | symbol | (string | symbol)[]\n > = {};\n\n filters.forEach(filter => {\n if (\n filter instanceof EntityTagFilter ||\n filter instanceof EntityOwnerFilter ||\n filter instanceof EntityLifecycleFilter ||\n filter instanceof EntityNamespaceFilter ||\n filter instanceof EntityUserFilter ||\n filter instanceof EntityOrphanFilter ||\n filter instanceof EntityTextFilter ||\n filter instanceof UserListFilter\n ) {\n return;\n }\n Object.assign(backendCatalogFilters, filter.getCatalogFilters?.() || {});\n });\n\n return backendCatalogFilters;\n}\n\nexport function reduceEntityFilters(\n filters: EntityFilter[],\n): (entity: Entity) => boolean {\n return (entity: Entity) =>\n filters.every(\n filter => !filter.filterEntity || filter.filterEntity(entity),\n );\n}\n"],"names":["t","r","a","Array","i","o","e","Object","n","Math","arguments","Date","useStyles","makeStyles","theme","createStyles","classes","SvgIcon","BootstrapInput","withStyles","InputBase","SelectComponent","props","multiple","items","label","placeholder","selected","onChange","triggerReset","native","disabled","margin","dataTestId","value","setValue","useState","isOpen","setOpen","useEffect","Box","FormControl","InputLabel","Select","event","previous","HTMLElement","s","selectedValue","item","el","Chip","CancelIcon","newValue","chip","Typography","OpenedDropdown","ClosedDropdown","MenuItem","Checkbox","entityPresentationSnapshot","entityOrRef","context","entityPresentationApi","ref","stringifyEntityRef","defaultEntityPresentation","BootstrapAutocomplete","Autocomplete","PopperComponent","Popper","TransitionProps","Grow","PaperComponent","Paper","CatalogAutocomplete","name","LabelProps","TextFieldProps","rest","renderInput","useCallback","params","TextField","merge","autocomplete","ExpandMoreIcon","classNames","icon","CheckBoxOutlineBlankIcon","checkedIcon","CheckBoxIcon","OptionCheckbox","EntityAutocompletePickerOption","memo","availableOptions","showCounts","FormControlLabel","EntityAutocompletePicker","path","Filter","InputProps","initialSelectedOptions","filtersForAvailableValues","hidden","updateFilters","filters","queryParameter","useEntityList","catalogApi","useApi","catalogApiRef","availableValuesFilters","f","availableValues","useAsync","facets","reduceBackendCatalogFilters","Boolean","count","queryParameters","useMemo","filteredOptions","selectedOptions","setSelectedOptions","shouldAddFilter","undefined","newSelectedOptions","isEqual","filter","String","_event","options","option","EntityKindPicker","availableKinds","kindsMap","allowedKinds","initialFilter","useTranslationRef","catalogReactTranslationRef","alertApi","alertApiRef","error","allKinds","selectedKind","setSelectedKind","useEntityKindFilter","opts","kindParameter","queryParamKind","loading","useAllKinds","Map","kindFacets","kind","selectedKindLabel","EntityKindFilter","k","forcedKinds","key","EntityLifecyclePicker","EntityLifecycleFilter","EntityNamespacePicker","initiallySelectedNamespaces","EntityNamespaceFilter","FixedWidthFormControlLabel","_theme","RenderOptionLabel","isGroup","title","useEntityPresentation","Tooltip","GroupIcon","PersonIcon","EntityOwnerPicker","mode","apis","useApiHolder","entityPresentationApiRef","ownersParameter","text","setText","queryParamOwners","selectedOwners","setSelectedOwners","handleFetch","cache","useFetchEntities","initialSelectedOwnersRefs","isOwnersOnlyMode","queryEntitiesResponse","useAsyncFn","request","limit","cursorRequest","response","initialRequest","facetsEntitiesResponse","useFacetsEntities","enabled","facetsPromise","facet","namespace","parseEntityRef","b","start","isFacetsResponse","JSON","atob","filteredRefs","entity","normalizedText","end","encodeCursor","entities","payload","btoa","state","useSelectedOwners","allEntities","useRef","initialSelectedEntities","useMountEffect","entityRef","useDebouncedEffect","availableOwners","EntityOwnerFilter","v","_","owners","x","_e","inputValue","element","hasReachedEnd","EntityProcessingStatusPicker","selectedAdvancedItems","setSelectedAdvancedItems","EntityOrphanFilter","EntityErrorFilter","EntityTagPicker","EntityTagFilter","EntityTypePicker","availableTypes","selectedTypes","setSelectedTypes","useEntityTypeFilter","kindFilter","typeFilter","typeParameter","flattenedQueryTypes","setAvailableTypes","facetsRef","oldFacets","newTypes","Set","sortBy","stillValidTypes","EntityTypeFilter","type","UserListPicker","availableFilters","alwaysKeepFilters","configApi","configApiRef","orgName","userParameter","userAndGroupFilterIds","filterGroups","getFilterGroups","SettingsIcon","StarIcon","filterGroup","id","ownedEntitiesCount","loadingOwnedEntities","ownedEntitiesFilter","useOwnedEntitiesCount","identityApi","identityApiRef","ownershipEntityRefs","loadingEntityRefs","user","allFilters","orderFields","catalogFilters","reduceCatalogFilters","compact","loadingEntityOwnership","fetchEntities","req","ownedClaims","getOwnedCountClaims","ownersRefs","commonOwnedBy","intersection","metadata","totalItems","useDeepCompareEffect","EntityUserFilter","allCount","useAllEntitiesCount","prevRequest","compacted","newRequest","starredEntitiesCount","starredEntitiesFilter","loadingStarredEntities","useStarredEntitiesCount","starredEntities","useStarredEntities","queryParamUserFilter","selectedUserFilter","setSelectedUserFilter","filterCounts","Card","group","Fragment","List","index","ListItemIcon","ListItemText","ListItemSecondaryAction","values","EntityTextFilter","words","exactMatch","partialMatch","word","m","fullRefs","err","getEntityRelations","RELATION_OWNED_BY","refs","starredEntityRefs","relations","UserListFilter","isOwnedEntity","isStarredEntity","orphan","NewEntityListContext","createVersionedContext","OldEntityListContext","createContext","EntityListProvider","isMounted","useMountedState","requestedFilters","setRequestedFilters","location","useLocation","paginationMode","paginationLimit","initialCursor","initialOffset","initialLimit","parsed","qs","queryLimit","Number","isNaN","offset","cursor","setCursor","setOffset","setLimit","outputState","setOutputState","resolvedValue","refresh","kindValue","adjustedFilters","entityFilter","reduceEntityFilters","backendFilter","previousBackendFilter","useDebounce","queryParams","oldParams","newParams","newUrl","window","document","update","prevFilters","newFilters","latestOutput","pageInfo","prevCursor","nextCursor","createVersionedValueMap","versionedHolder","useVersionedContext","oldContext","useContext","Error","getEntityRef","starredEntitiesApi","starredEntitiesApiRef","useObservable","toggleStarredEntity","isEntityTextFilter","isEntityOrderFilter","condensedFilters","compoundFilter","fullTextFilter","backendCatalogFilters"],"mappings":"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"}