sanity-plugin-taxonomy-manager 1.0.2 → 1.0.4

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  <!-- ## [TODO] -->
8
8
 
9
+ ## [1.0.4] - 2022-10-20
10
+ ### Fixed
11
+ - Taxonomy Tree CSS was spilling over into description fields for the studio. Added unique classes to keep plugin styling from being too enterprising.
12
+
13
+ ## [1.0.3] - 2022-09-29
14
+ ### Fixed
15
+ - Concept Scheme Tree View bug that caused by missing parent document value on first render.
16
+ ### Changed
17
+ - Improved taxonomy scheme field descriptions.
18
+
9
19
  ## [1.0.2] - 2022-09-28
10
20
  ### Fixed
11
21
  - Fixed bug introduced by Sanity Studio update 2.33.0 that made `parent` unavailable to custom components directly.
@@ -43,7 +43,9 @@ var client = _client.default.withConfig({
43
43
 
44
44
 
45
45
  var RecursiveConcept = props => {
46
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.isError && /*#__PURE__*/_react.default.createElement("p", null, "Sorry, could not get concepts."), props.noConcept && /*#__PURE__*/_react.default.createElement("p", null, "This scheme does not yet have any concepts assigned to it."), props.isLoading ? /*#__PURE__*/_react.default.createElement("p", null, "Loading hierarchy ...") : /*#__PURE__*/_react.default.createElement("ul", null, props.concepts.map(concept => {
46
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.isError && /*#__PURE__*/_react.default.createElement("p", null, "Sorry, could not get concepts."), props.noConcept && /*#__PURE__*/_react.default.createElement("p", null, "This scheme does not yet have any concepts assigned to it."), props.isLoading ? /*#__PURE__*/_react.default.createElement("p", null, "Loading hierarchy ...") : /*#__PURE__*/_react.default.createElement("ul", {
47
+ className: "skosTreeView"
48
+ }, props.concepts.map(concept => {
47
49
  var _concept$broaderSchem, _concept$narrower;
48
50
 
49
51
  return /*#__PURE__*/_react.default.createElement("li", {
@@ -55,7 +57,10 @@ var RecursiveConcept = props => {
55
57
  })));
56
58
  };
57
59
 
58
- var TreeView = (0, _formBuilder.withParent)( /*#__PURE__*/_react.default.forwardRef((props, ref) => {
60
+ var TreeView = (0, _formBuilder.withParent)(
61
+ /*#__PURE__*/
62
+ // Not using the ref right now, but likely will when the tree becomes interactive.
63
+ _react.default.forwardRef((props, ref) => {
59
64
  var _useState = (0, _react.useState)([]),
60
65
  _useState2 = _slicedToArray(_useState, 2),
61
66
  concepts = _useState2[0],
@@ -74,8 +79,9 @@ var TreeView = (0, _formBuilder.withParent)( /*#__PURE__*/_react.default.forward
74
79
  var _useState7 = (0, _react.useState)(false),
75
80
  _useState8 = _slicedToArray(_useState7, 2),
76
81
  isError = _useState8[0],
77
- setIsError = _useState8[1]; // This function builds the first level of hierarchy, noting Top Concepts and orphans, then calls the recursiveQuery() function
82
+ setIsError = _useState8[1];
78
83
 
84
+ var conceptScheme = props.parent._id ? props.parent._id.replace('drafts.', '') : undefined; // This function builds the first level of hierarchy, noting Top Concepts and orphans, then calls the recursiveQuery() function
79
85
 
80
86
  var queryBuilder = function queryBuilder() {
81
87
  var depth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;
@@ -101,7 +107,7 @@ var TreeView = (0, _formBuilder.withParent)( /*#__PURE__*/_react.default.forward
101
107
  (0, _react.useEffect)(() => {
102
108
  var fetchConcepts = /*#__PURE__*/function () {
103
109
  var _ref = _asyncToGenerator(function* () {
104
- var conceptScheme = yield props.parent._id;
110
+ if (props.parent._id === undefined) return;
105
111
  setIsError(false);
106
112
  setNoConcept(false);
107
113
  setIsLoading(true);
@@ -115,6 +121,7 @@ var TreeView = (0, _formBuilder.withParent)( /*#__PURE__*/_react.default.forward
115
121
 
116
122
  if (response.length < 1) {
117
123
  setNoConcept(true);
124
+ setIsError(false);
118
125
  }
119
126
 
120
127
  setConcepts(response);
@@ -132,7 +139,7 @@ var TreeView = (0, _formBuilder.withParent)( /*#__PURE__*/_react.default.forward
132
139
  }();
133
140
 
134
141
  fetchConcepts();
135
- }, []);
142
+ }, [props.parent._id]);
136
143
  return /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
137
144
  space: 2
138
145
  }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/treeView.js"],"names":["client","sanityClient","withConfig","apiVersion","RecursiveConcept","props","isError","noConcept","isLoading","concepts","map","concept","id","topConcept","s","orphan","broaderSchemas","filter","parentScheme","length","polyHier","prefLabel","narrower","TreeView","React","forwardRef","ref","setConcepts","setIsLoading","setNoConcept","setIsError","queryBuilder","depth","recursiveQuery","count","fetchConcepts","conceptScheme","parent","_id","params","query","response","fetch","error","console","log","type","title","description"],"mappings":"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","sourcesContent":["/**\n * Taxonomy Tree View input component for SKOS Concept Schemes\n * This component creates a hierarchical, linked (TDB) display of concepts associated with the associated Concept Scheme\n * @todo Add ability to set hierarchy depth from config file\n * @todo Add links to concepts that open in a pane to the right (see notes below)\n * @todo Add affordance for collapsing and expanding tree view (see notes below)\n * @todo Add affordance for creating new child concept in pane to the right (or modal) from a tree view concept\n * @todo Differentiate \"new concept scheme\" error state from other fetch() error states\n * @todo Add listener to JS client to reflect hierarchy updates as they happen: https://www.sanity.io/plugins/javascript-api-client\n */\n\nimport React, {useState, useEffect} from 'react'\nimport {Box, Stack, Text} from '@sanity/ui'\nimport {withParent} from 'part:@sanity/form-builder'\nimport sanityClient from 'part:@sanity/base/client'\nimport * as s from './treeView.module.css'\n\nconst client = sanityClient.withConfig({apiVersion: '2021-03-25'})\n\n// This component builds the hierarchy tree, messages loading state, messages no concepts found state.\nconst RecursiveConcept = (props) => {\n return (\n <>\n {props.isError && <p>Sorry, could not get concepts.</p>}\n {props.noConcept && <p>This scheme does not yet have any concepts assigned to it.</p>}\n {props.isLoading ? (\n <p>Loading hierarchy ...</p>\n ) : (\n <ul>\n {props.concepts.map((concept) => {\n return (\n <li\n key={concept.id}\n className={`${concept.topConcept ? s.topConcept : s.orphan} ${\n concept.broaderSchemas?.filter((id) => id === concept.parentScheme).length > 1 &&\n s.polyHier\n }`}\n >\n {concept.prefLabel}\n {concept.narrower?.length > 0 && <RecursiveConcept concepts={concept.narrower} />}\n </li>\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\nconst TreeView = withParent(\n React.forwardRef((props, ref) => {\n const [concepts, setConcepts] = useState([])\n const [isLoading, setIsLoading] = useState(false)\n const [noConcept, setNoConcept] = useState(false)\n const [isError, setIsError] = useState(false)\n\n // This function builds the first level of hierarchy, noting Top Concepts and orphans, then calls the recursiveQuery() function\n const queryBuilder = (depth = 5) => {\n if (depth === 0) {\n return ''\n } else {\n return `*[_type==\"skosConcept\" && references($conceptScheme) && (count(broader[]) < 1 || broader == null) && !(_id in path(\"drafts.**\"))]|order(prefLabel) {\n \"level\": 0,\n \"id\": _id,\n prefLabel,\n topConcept,\n ${recursiveQuery(depth)}\n }`\n }\n }\n // This function builds all subsequent levels found in the data and notes any concepts that exist in two places in this Concept Scheme (i.e. which are polyhierarchical)\n const recursiveQuery = (depth, count = 1) => {\n if (depth === 0) {\n return ''\n } else {\n return `\"narrower\": *[_type == \"skosConcept\" && references($conceptScheme) && references(^._id) && !(_id in path(\"drafts.**\"))]|order(prefLabel) {\n \"level\": ${count},\n \"id\": _id,\n prefLabel,\n \"broaderSchemas\": broader[]->scheme->._id, \n \"parentScheme\": $conceptScheme, ${recursiveQuery(depth - 1, count + 1)} \n }`\n }\n }\n\n useEffect(() => {\n const fetchConcepts = async () => {\n const conceptScheme = await props.parent._id;\n setIsError(false)\n setNoConcept(false)\n setIsLoading(true)\n try {\n const params = {conceptScheme: conceptScheme}\n const query = `${queryBuilder()}`\n const response = await client.fetch(query, params)\n if (response.length < 1) {\n setNoConcept(true)\n }\n setConcepts(response)\n } catch (error) {\n setIsError(true)\n console.log(error)\n }\n setIsLoading(false)\n }\n fetchConcepts()\n }, [])\n\n return (\n <Box>\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n {props.type.title}\n </Text>\n <Text size={1} muted>\n {props.type.description}\n </Text>\n <Text size={2}>\n <RecursiveConcept\n concepts={concepts}\n isLoading={isLoading}\n noConcept={noConcept}\n isError={isError}\n />\n </Text>\n </Stack>\n </Box>\n )\n })\n)\n\nexport default TreeView\n"],"file":"treeView.js"}
1
+ {"version":3,"sources":["../../src/components/treeView.js"],"names":["client","sanityClient","withConfig","apiVersion","RecursiveConcept","props","isError","noConcept","isLoading","concepts","map","concept","id","topConcept","s","orphan","broaderSchemas","filter","parentScheme","length","polyHier","prefLabel","narrower","TreeView","React","forwardRef","ref","setConcepts","setIsLoading","setNoConcept","setIsError","conceptScheme","parent","_id","replace","undefined","queryBuilder","depth","recursiveQuery","count","fetchConcepts","params","query","response","fetch","error","console","log","type","title","description"],"mappings":"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","sourcesContent":["/**\n * Taxonomy Tree View input component for SKOS Concept Schemes\n * This component creates a hierarchical, linked (TDB) display of concepts associated with the associated Concept Scheme\n * @todo Add ability to set hierarchy depth from config file\n * @todo Add links to concepts that open in a pane to the right (see notes below)\n * @todo Add affordance for collapsing and expanding tree view (see notes below)\n * @todo Add affordance for creating new child concept in pane to the right (or modal) from a tree view concept\n * @todo Differentiate \"new concept scheme\" error state from other fetch() error states\n * @todo Add listener to JS client to reflect hierarchy updates as they happen: https://www.sanity.io/plugins/javascript-api-client\n */\n\nimport React, {useState, useEffect} from 'react'\nimport {Box, Stack, Text} from '@sanity/ui'\nimport {withParent} from 'part:@sanity/form-builder'\nimport sanityClient from 'part:@sanity/base/client'\nimport * as s from './treeView.module.css'\n\nconst client = sanityClient.withConfig({apiVersion: '2021-03-25'})\n\n// This component builds the hierarchy tree, messages loading state, messages no concepts found state.\nconst RecursiveConcept = (props) => {\n return (\n <>\n {props.isError && <p>Sorry, could not get concepts.</p>}\n {props.noConcept && <p>This scheme does not yet have any concepts assigned to it.</p>}\n {props.isLoading ? (\n <p>Loading hierarchy ...</p>\n ) : (\n <ul className='skosTreeView'>\n {props.concepts.map((concept) => {\n return (\n <li\n key={concept.id}\n className={`${concept.topConcept ? s.topConcept : s.orphan} ${\n concept.broaderSchemas?.filter((id) => id === concept.parentScheme).length > 1 &&\n s.polyHier\n }`}\n >\n {concept.prefLabel}\n {concept.narrower?.length > 0 && <RecursiveConcept concepts={concept.narrower} />}\n </li>\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\nconst TreeView = withParent(\n \n // Not using the ref right now, but likely will when the tree becomes interactive. \n React.forwardRef((props, ref) => {\n const [concepts, setConcepts] = useState([])\n const [isLoading, setIsLoading] = useState(false)\n const [noConcept, setNoConcept] = useState(false)\n const [isError, setIsError] = useState(false)\n\n const conceptScheme = props.parent._id ? props.parent._id.replace('drafts.', '') : undefined\n // This function builds the first level of hierarchy, noting Top Concepts and orphans, then calls the recursiveQuery() function\n const queryBuilder = (depth = 5) => {\n if (depth === 0) {\n return ''\n } else {\n return `*[_type==\"skosConcept\" && references($conceptScheme) && (count(broader[]) < 1 || broader == null) && !(_id in path(\"drafts.**\"))]|order(prefLabel) {\n \"level\": 0,\n \"id\": _id,\n prefLabel,\n topConcept,\n ${recursiveQuery(depth)}\n }`\n }\n }\n // This function builds all subsequent levels found in the data and notes any concepts that exist in two places in this Concept Scheme (i.e. which are polyhierarchical)\n const recursiveQuery = (depth, count = 1) => {\n if (depth === 0) {\n return ''\n } else {\n return `\"narrower\": *[_type == \"skosConcept\" && references($conceptScheme) && references(^._id) && !(_id in path(\"drafts.**\"))]|order(prefLabel) {\n \"level\": ${count},\n \"id\": _id,\n prefLabel,\n \"broaderSchemas\": broader[]->scheme->._id, \n \"parentScheme\": $conceptScheme, ${recursiveQuery(depth - 1, count + 1)} \n }`\n }\n }\n\n useEffect(() => {\n const fetchConcepts = async () => {\n \n if (props.parent._id === undefined ) return\n\n setIsError(false)\n setNoConcept(false)\n setIsLoading(true)\n try {\n const params = {conceptScheme: conceptScheme}\n const query = `${queryBuilder()}`\n const response = await client.fetch(query, params)\n if (response.length < 1) {\n setNoConcept(true)\n setIsError(false)\n }\n setConcepts(response)\n } catch (error) {\n setIsError(true)\n console.log(error)\n }\n setIsLoading(false)\n }\n fetchConcepts()\n }, [props.parent._id])\n\n return (\n <Box>\n <Stack space={2}>\n <Text size={1} weight=\"semibold\">\n {props.type.title}\n </Text>\n <Text size={1} muted>\n {props.type.description}\n </Text>\n <Text size={2}>\n <RecursiveConcept\n concepts={concepts}\n isLoading={isLoading}\n noConcept={noConcept}\n isError={isError}\n />\n </Text>\n </Stack>\n </Box>\n )\n })\n)\n\nexport default TreeView\n"],"file":"treeView.js"}
@@ -1,7 +1,7 @@
1
- ul {
1
+ ul.skosTreeView {
2
2
  list-style: none;
3
3
  }
4
- li {
4
+ ul.skosTreeView li {
5
5
  font-weight: normal;
6
6
  }
7
7
  .level_0 {
@@ -25,7 +25,7 @@ var client = _client.default.withConfig({
25
25
 
26
26
  var _default = {
27
27
  name: 'skosConcept',
28
- title: 'Concepts',
28
+ title: 'Concept',
29
29
  type: 'document',
30
30
  icon: _ai.AiFillTags,
31
31
  initialValue: function () {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/skosConcept.js"],"names":["client","sanityClient","withConfig","apiVersion","name","title","type","icon","AiFillTags","initialValue","iriBase","iriValue","config","namespace","console","log","scheme","fetch","undefined","conceptIriBase","topConcept","broader","related","validation","Rule","custom","fields","altLabel","hiddenLabel","filter","label","includes","length","prefLabel","groups","group","description","required","context","then","conceptId","document","_id","replace","inputComponent","PrefLabel","of","unique","hidden","to","options","params","self","map","_ref","broaderTrans","response","flatMap","concat","error","disableNew","rows","orderings","by","field","direction","preview","select","broaderPlusOne","broaderPlusTwo","prepare","conceptBroader","Boolean","broaderPath","join","hierarchy","subtitle","media","AiOutlineTag","AiFillTag"],"mappings":";;;;;;;AAOA;;AACA;;AACA;;AACA;;;;;;;;AAEA,IAAMA,MAAM,GAAGC,gBAAaC,UAAb,CAAwB;AAACC,EAAAA,UAAU,EAAE;AAAb,CAAxB,CAAf;;eAEe;AACbC,EAAAA,IAAI,EAAE,aADO;AAEbC,EAAAA,KAAK,EAAE,UAFM;AAGbC,EAAAA,IAAI,EAAE,UAHO;AAIbC,EAAAA,IAAI,EAAEC,cAJO;AAKbC,EAAAA,YAAY;AAAA,0CAAE,aAAY;AAAA;;AACxB,UAAMC,OAAO,GAAG;AAACC,QAAAA,QAAQ,EAAEC,+BAAOC;AAAlB,OAAhB;AACAC,MAAAA,OAAO,CAACC,GAAR,CAAYL,OAAO,CAACC,QAApB;AACA,UAAMK,MAAM,gCACHhB,MAAM,CAACiB,KAAP,kHADG,qEAMLC,SANP;AAOA,aAAO;AACLC,QAAAA,cAAc,EAAET,OADX;AAELM,QAAAA,MAAM,EAAEA,MAFH;AAGLI,QAAAA,UAAU,EAAE,KAHP;AAILC,QAAAA,OAAO,EAAE,EAJJ;AAIQ;AACbC,QAAAA,OAAO,EAAE,EALJ,CAKQ;;AALR,OAAP;AAOD,KAjBW;;AAAA;AAAA;AAAA;;AAAA;AAAA,KALC;AAuBb;AACAC,EAAAA,UAAU,EAAGC,IAAD,IACVA,IAAI,CAACC,MAAL,CAAaC,MAAD,IAAY;AACtB,QACGA,MAAM,CAACC,QAAP,IACCD,MAAM,CAACE,WADR,IAECF,MAAM,CAACC,QAAP,CAAgBE,MAAhB,CAAwBC,KAAD,IAAWJ,MAAM,CAACE,WAAP,CAAmBG,QAAnB,CAA4BD,KAA5B,CAAlC,EAAsEE,MAAtE,GAA+E,CAFjF,IAGCN,MAAM,CAACC,QAAP,IAAmBD,MAAM,CAACC,QAAP,CAAgBI,QAAhB,CAAyBL,MAAM,CAACO,SAAhC,CAHpB,IAICP,MAAM,CAACE,WAAP,IAAsBF,MAAM,CAACE,WAAP,CAAmBG,QAAnB,CAA4BL,MAAM,CAACO,SAAnC,CALzB,EAOE,OAAO,kIAAP;AACF,WAAO,IAAP;AACD,GAVD,CAzBW;AAoCbC,EAAAA,MAAM,EAAE,CACN;AACE9B,IAAAA,IAAI,EAAE,cADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GADM,EAKN;AACED,IAAAA,IAAI,EAAE,OADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GALM,EASN;AACED,IAAAA,IAAI,EAAE,MADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GATM,CApCK;AAkDbqB,EAAAA,MAAM,EAAE,CACN;AACEtB,IAAAA,IAAI,EAAE,WADR;AAEEC,IAAAA,KAAK,EAAE,iBAFT;AAGE8B,IAAAA,KAAK,EAAE,CAAC,OAAD,EAAU,cAAV,CAHT;AAIE7B,IAAAA,IAAI,EAAE,QAJR;AAKE8B,IAAAA,WAAW,EACT,oIANJ;AAOE;AACAb,IAAAA,UAAU,EAAGC,IAAD,IACVA,IAAI,CAACa,QAAL,GAAgBZ,MAAhB,CAAuB,CAACQ,SAAD,EAAYK,OAAZ,KAAwB;AAC7C,aAAOtC,MAAM,CACViB,KADI,wDAE0CgB,SAF1C,kDAIJM,IAJI,CAIEC,SAAD,IAAe;AACnB,YAAIA,SAAS,IAAIA,SAAS,KAAKF,OAAO,CAACG,QAAR,CAAiBC,GAAjB,CAAqBC,OAArB,CAA6B,SAA7B,EAAwC,EAAxC,CAA/B,EAA4E;AAC1E,iBAAO,iCAAP;AACD,SAFD,MAEO;AACL,iBAAO,IAAP;AACD;AACF,OAVI,CAAP;AAWD,KAZD,CATJ;AAsBEC,IAAAA,cAAc,EAAEC;AAtBlB,GADM,EAyBN;AACEzC,IAAAA,IAAI,EAAE,gBADR;AAEEC,IAAAA,KAAK,EAAE,mBAFT;AAGEC,IAAAA,IAAI,EAAE;AAHR,GAzBM,EA8BN;AACEF,IAAAA,IAAI,EAAE,UADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE8B,IAAAA,KAAK,EAAE,OAHT;AAIE7B,IAAAA,IAAI,EAAE,OAJR;AAKE8B,IAAAA,WAAW,EACT,6KANJ;AAOEU,IAAAA,EAAE,EAAE,CAAC;AAACxC,MAAAA,IAAI,EAAE;AAAP,KAAD,CAPN;AAQEiB,IAAAA,UAAU,EAAGC,IAAD,IAAUA,IAAI,CAACuB,MAAL;AARxB,GA9BM,EAwCN;AACE3C,IAAAA,IAAI,EAAE,aADR;AAEEC,IAAAA,KAAK,EAAE,iBAFT;AAGE8B,IAAAA,KAAK,EAAE,OAHT;AAIE7B,IAAAA,IAAI,EAAE,OAJR;AAKE8B,IAAAA,WAAW,EACT,oUANJ;AAOEU,IAAAA,EAAE,EAAE,CAAC;AAACxC,MAAAA,IAAI,EAAE;AAAP,KAAD,CAPN;AAQEiB,IAAAA,UAAU,EAAGC,IAAD,IAAUA,IAAI,CAACuB,MAAL;AARxB,GAxCM,EAkDN;AACE3C,IAAAA,IAAI,EAAE,YADR;AAEEC,IAAAA,KAAK,EAAE,aAFT;AAGE8B,IAAAA,KAAK,EAAE,cAHT;AAIE7B,IAAAA,IAAI,EAAE,SAJR;AAKE8B,IAAAA,WAAW,EACT,4MANJ;AAOEY,IAAAA,MAAM,EAAE;AAAA,UAAEP,QAAF,SAAEA,QAAF;AAAA,aAAiBA,QAAQ,CAACpB,OAAT,GAAmBoB,QAAQ,CAACpB,OAAT,CAAiBW,MAAjB,GAA0B,CAA7C,GAAiD,KAAlE;AAAA;AAPV,GAlDM,EA2DN;AACE5B,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE2C,IAAAA,MAAM,EAAE;AAAA,UAAEP,QAAF,SAAEA,QAAF;AAAA,aAAgBA,QAAQ,CAACrB,UAAzB;AAAA,KAHV;AAIEgB,IAAAA,WAAW,EACT,qJALJ;AAMED,IAAAA,KAAK,EAAE,cANT;AAOE7B,IAAAA,IAAI,EAAE,OAPR;AAQEwC,IAAAA,EAAE,EAAE,CACF;AACExC,MAAAA,IAAI,EAAE,WADR;AAEE2C,MAAAA,EAAE,EAAE;AAAC3C,QAAAA,IAAI,EAAE;AAAP,OAFN;AAGE4C,MAAAA,OAAO,EAAE;AACPrB,QAAAA,MAAM,EAAE,SAAgB;AAAA,cAAdY,QAAc,SAAdA,QAAc;AACtB,iBAAO;AACL;AACA;AACAZ,YAAAA,MAAM,EACJ,mFAJG;AAKLsB,YAAAA,MAAM,EAAE;AACNC,cAAAA,IAAI,EAAEX,QAAQ,CAACC,GAAT,CAAaC,OAAb,CAAqB,SAArB,EAAgC,EAAhC,CADA;AAENtB,cAAAA,OAAO,EAAEoB,QAAQ,CAACpB,OAAT,CAAiBgC,GAAjB,CAAqB;AAAA,oBAAEC,IAAF,SAAEA,IAAF;AAAA,uBAAYA,IAAZ;AAAA,eAArB,CAFH;AAGNhC,cAAAA,OAAO,EAAEmB,QAAQ,CAACnB,OAAT,CAAiB+B,GAAjB,CAAqB;AAAA,oBAAEC,IAAF,SAAEA,IAAF;AAAA,uBAAYA,IAAZ;AAAA,eAArB;AAHH;AALH,WAAP;AAWD;AAbM;AAHX,KADE;AARN,GA3DM,EAyFN;AACElD,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE+B,IAAAA,WAAW,EACT,6MAJJ;AAKED,IAAAA,KAAK,EAAE,cALT;AAME7B,IAAAA,IAAI,EAAE,OANR;AAOEwC,IAAAA,EAAE,EAAE,CACF;AACExC,MAAAA,IAAI,EAAE,WADR;AAEE2C,MAAAA,EAAE,EAAE,CAAC;AAAC3C,QAAAA,IAAI,EAAE;AAAP,OAAD,CAFN;AAGE4C,MAAAA,OAAO,EAAE;AACPrB,QAAAA,MAAM;AAAA,0CAAE,kBAAsB;AAAA,gBAAdY,QAAc,SAAdA,QAAc;AAC5B,gBAAIc,YAAY,GAAG,EAAnB;;AACA,gBAAI;AACF;AACA;AACA,kBAAMC,QAAQ,SAASxD,MAAM,CAACiB,KAAP,wDACwBwB,QAAQ,CAACR,SADjC,uIAAvB,CAHE,CAMF;;AACAsB,cAAAA,YAAY,SAASC,QAAQ,CAC1BC,OADkB,CACTpC,OAAD;AAAA;;AAAA,2CAAaA,OAAO,CAACA,OAArB,qDAAa,iBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CAAb;AAAA,eADU,EAC6D;AAD7D,eAElByB,MAFkB,CAGjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAHiB,EAQjB;AARiB,eASlByB,MATkB,CAUjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,gDACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAViB,EAiBjB;AAjBiB,eAkBlByB,MAlBkB,CAmBjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,gDACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,mDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,qBAAzB,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAnBiB,EA4BjB;AA5BiB,eA6BlByB,MA7BkB,CA8BjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,6CACfA,OAAO,CAACA,OADO,uDACf,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,+CACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,iDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,mDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,qDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,uBAAzB,CADuB;AAAA,qBAAzB,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CA9BiB,EAyCjB;AAzCiB,eA0ClBJ,MA1CkB,CA0CVR,OAAD,IAAaA,OA1CF,CAArB,CAPE,CAiD8B;AAChC;AAEA;;AACA,qBAAO;AACLQ,gBAAAA,MAAM,gjBADD;AAWLsB,gBAAAA,MAAM,EAAE;AACNC,kBAAAA,IAAI,EAAEX,QAAQ,CAACC,GAAT,CAAaC,OAAb,CAAqB,SAArB,EAAgC,EAAhC,CADA;AAENrB,kBAAAA,OAAO,EAAEmB,QAAQ,CAACnB,OAAT,CAAiB+B,GAAjB,CAAqB;AAAA,wBAAEC,IAAF,SAAEA,IAAF;AAAA,2BAAYA,IAAZ;AAAA,mBAArB,CAFH;AAGNC,kBAAAA,YAAY,EAAEA;AAHR;AAXH,eAAP;AAiBD,aAtED,CAsEE,OAAOI,KAAP,EAAc;AACd7C,cAAAA,OAAO,CAAC6C,KAAR,2CAAiDA,KAAjD;AACD;AACF,WA3EK;;AAAA;AAAA;AAAA;;AAAA;AAAA;AADC;AAHX,KADE;AAPN,GAzFM,EAqLN;AACEvD,IAAAA,IAAI,EAAE,QADR;AAEEC,IAAAA,KAAK,EAAE,mBAFT;AAGE8B,IAAAA,KAAK,EAAE,cAHT;AAIE7B,IAAAA,IAAI,EAAE,WAJR;AAKE8B,IAAAA,WAAW,EACT,oHANJ;AAOEa,IAAAA,EAAE,EAAE,CACF;AACE3C,MAAAA,IAAI,EAAE;AADR,KADE,CAPN;AAYE4C,IAAAA,OAAO,EAAE;AACPU,MAAAA,UAAU,EAAE;AADL;AAZX,GArLM,EAqMN;AACExD,IAAAA,IAAI,EAAE,WADR;AAEEC,IAAAA,KAAK,EAAE,YAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EACT,sJALJ;AAMEyB,IAAAA,IAAI,EAAE,CANR;AAOE1B,IAAAA,KAAK,EAAE;AAPT,GArMM,EA8MN;AACE/B,IAAAA,IAAI,EAAE,YADR;AAEEC,IAAAA,KAAK,EAAE,YAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EAAE,+DAJf;AAKEyB,IAAAA,IAAI,EAAE,CALR;AAME1B,IAAAA,KAAK,EAAE;AANT,GA9MM,EAsNN;AACE/B,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,UAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EAAE,uCAJf;AAKEyB,IAAAA,IAAI,EAAE,CALR;AAME1B,IAAAA,KAAK,EAAE;AANT,GAtNM,CAlDK;AAiRb2B,EAAAA,SAAS,EAAE,CACT;AACEzD,IAAAA,KAAK,EAAE,cADT;AAEED,IAAAA,IAAI,EAAE,YAFR;AAGE2D,IAAAA,EAAE,EAAE,CACF;AAACC,MAAAA,KAAK,EAAE,YAAR;AAAsBC,MAAAA,SAAS,EAAE;AAAjC,KADE,EAEF;AAACD,MAAAA,KAAK,EAAE,WAAR;AAAqBC,MAAAA,SAAS,EAAE;AAAhC,KAFE;AAHN,GADS,EAST;AACE5D,IAAAA,KAAK,EAAE,iBADT;AAEED,IAAAA,IAAI,EAAE,WAFR;AAGE2D,IAAAA,EAAE,EAAE,CAAC;AAACC,MAAAA,KAAK,EAAE,WAAR;AAAqBC,MAAAA,SAAS,EAAE;AAAhC,KAAD;AAHN,GATS,CAjRE;AAgSbC,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACN9D,MAAAA,KAAK,EAAE,WADD;AAENe,MAAAA,UAAU,EAAE,YAFN;AAGNC,MAAAA,OAAO,EAAE,qBAHH;AAIN+C,MAAAA,cAAc,EAAE,+BAJV;AAKNC,MAAAA,cAAc,EAAE;AALV,KADD;;AAQPC,IAAAA,OAAO,QAA+D;AAAA,UAA7DjE,KAA6D,SAA7DA,KAA6D;AAAA,UAAtDe,UAAsD,SAAtDA,UAAsD;AAAA,UAA1CC,OAA0C,SAA1CA,OAA0C;AAAA,UAAjC+C,cAAiC,SAAjCA,cAAiC;AAAA,UAAjBC,cAAiB,SAAjBA,cAAiB;AACpE,UAAME,cAAc,GAAG,CAACH,cAAD,EAAiB/C,OAAjB,EAA0BQ,MAA1B,CAAiC2C,OAAjC,CAAvB;AACA,UAAMC,WAAW,GACfF,cAAc,CAACvC,MAAf,GAAwB,CAAxB,aAA+BuC,cAAc,CAACG,IAAf,CAAoB,KAApB,CAA/B,2BAAgErE,KAAhE,IAA0E,EAD5E;AAEA,UAAMsE,SAAS,GAAGN,cAAc,iBAAUI,WAAV,IAA0BA,WAA1D;AACA,aAAO;AACLpE,QAAAA,KAAK,EAAEA,KADF;AAELuE,QAAAA,QAAQ,EAAExD,UAAU,GAAG,aAAH,GAAmBuD,SAFlC;AAGLE,QAAAA,KAAK,EAAEzD,UAAU,GAAG0D,gBAAH,GAAkBC;AAH9B,OAAP;AAKD;;AAlBM;AAhSI,C","sourcesContent":["/**\n * Sanity document scheme for SKOS Taxonomy Concepts\n * @todo Hierarchy, Broader, & Associated: enforce disjointedness between Associated and BroaderTransitive (integrity constraint); prohibit cycles in hierarchical relations (best practice). 2022-03-31: Filtering added to Related to five levels of hierarchy, document filtering present for Broader. Consider more robust filtering and validation for future releases.\n * @todo Lexical labels: add child level validation so that offending labels are shown directly when a duplicate is entered. Then consider removing document level validation. cf. https://www.sanity.io/docs/validation#9e69d5db6f72\n * @todo Scheme initial value: Configure \"default\" option in Concept Scheme, for cases when there are multiple schemes; configure initialValue to default to that selection (It's currently configure to take the scheme ordered first. This isn't transparent.)\n * @todo Abstract broader and related concept filter into reusable function, and/or add in validation to cover wider scenarios.\n */\nimport sanityClient from 'part:@sanity/base/client'\nimport config from 'config:taxonomy-manager'\nimport {AiFillTag, AiOutlineTag, AiFillTags} from 'react-icons/ai'\nimport PrefLabel from './components/prefLabel'\n\nconst client = sanityClient.withConfig({apiVersion: '2021-03-25'})\n\nexport default {\n name: 'skosConcept',\n title: 'Concepts',\n type: 'document',\n icon: AiFillTags,\n initialValue: async () => {\n const iriBase = {iriValue: config.namespace}\n console.log(iriBase.iriValue);\n const scheme =\n (await client.fetch(`\n *[_type == 'skosConceptScheme']{\n '_type': 'reference',\n '_ref': _id\n }[0]\n `)) ?? undefined\n return {\n conceptIriBase: iriBase,\n scheme: scheme,\n topConcept: false,\n broader: [], // an empty array is needed here in order to return concepts with no \"broader\" for \"related\"\n related: [], // an empty array is needed here in order to return concepts with no \"broader\" for \"related\"\n }\n },\n // Document level validation for the disjunction between Preferred, Alternate, and Hidden Labels:\n validation: (Rule) =>\n Rule.custom((fields) => {\n if (\n (fields.altLabel &&\n fields.hiddenLabel &&\n fields.altLabel.filter((label) => fields.hiddenLabel.includes(label)).length > 0) ||\n (fields.altLabel && fields.altLabel.includes(fields.prefLabel)) ||\n (fields.hiddenLabel && fields.hiddenLabel.includes(fields.prefLabel))\n )\n return 'Preferred Label, Alternate Labels, and Hidden Labels must all be unique. Please remove any labels duplicated across label types.'\n return true\n }),\n groups: [\n {\n name: 'relationship',\n title: 'Relationships',\n },\n {\n name: 'label',\n title: 'Labels',\n },\n {\n name: 'note',\n title: 'Documentation',\n },\n ],\n fields: [\n {\n name: 'prefLabel',\n title: 'Preferred Label',\n group: ['label', 'relationship'],\n type: 'string',\n description:\n 'The preferred lexical label for this concept. This label is also used to unambiguously represent this concept via the concept IRI.',\n // If there is a published concept with the current document's prefLabel, return an error message, but only for concepts with distinct _ids — otherwise editing an existing concept shows the error message as well.\n validation: (Rule) =>\n Rule.required().custom((prefLabel, context) => {\n return client\n .fetch(\n `*[_type == \"skosConcept\" && prefLabel == \"${prefLabel}\" && !(_id in path(\"drafts.**\"))][0]._id`\n )\n .then((conceptId) => {\n if (conceptId && conceptId !== context.document._id.replace('drafts.', '')) {\n return 'Preferred Label must be unique.'\n } else {\n return true\n }\n })\n }),\n inputComponent: PrefLabel,\n },\n {\n name: 'conceptIriBase',\n title: 'Edit the base IRI',\n type: 'baseIri',\n },\n {\n name: 'altLabel',\n title: 'Alternate Label(s)',\n group: 'label',\n type: 'array',\n description:\n 'Alternative labels can be used to assign synonyms, near-synonyms, abbreviations, and acronyms to a concept. Preferred, alternative, and hidden label sets must not overlap.',\n of: [{type: 'string'}],\n validation: (Rule) => Rule.unique(),\n },\n {\n name: 'hiddenLabel',\n title: 'Hidden Label(s)',\n group: 'label',\n type: 'array',\n description:\n 'Hidden labels are for character strings that need to be accessible to applications performing text-based indexing and search operations, but not visible otherwise. Hidden labels may for instance be used to include misspelled variants of other lexical labels. Preferred, alternative, and hidden label sets must not overlap.',\n of: [{type: 'string'}],\n validation: (Rule) => Rule.unique(),\n },\n {\n name: 'topConcept',\n title: 'Top Concept',\n group: 'relationship',\n type: 'boolean',\n description:\n 'Top concepts provide an efficient entry point to broader/narrower concept hierarchies and/or top level facets. By convention, resources can be a Top Concept, or have Broader relationships, but not both.',\n hidden: ({document}) => (document.broader ? document.broader.length > 0 : false),\n },\n {\n name: 'broader',\n title: 'Broader Concept(s)',\n hidden: ({document}) => document.topConcept,\n description:\n 'Broader relationships create a hierarchy between concepts, for example to create category/subcategory, part/whole, or class/instance relationships.',\n group: 'relationship',\n type: 'array',\n of: [\n {\n type: 'reference',\n to: {type: 'skosConcept'},\n options: {\n filter: ({document}) => {\n return {\n // Broader filter only performs document-level validation for broader-transitive/related disjunction.\n // Consider adding custom validation to prevent broader taxonomy inconsistencies.\n filter:\n '!(_id in $broader || _id in $related || _id in path(\"drafts.**\") || _id == $self)',\n params: {\n self: document._id.replace('drafts.', ''),\n broader: document.broader.map(({_ref}) => _ref),\n related: document.related.map(({_ref}) => _ref),\n },\n }\n },\n },\n },\n ],\n },\n {\n name: 'related',\n title: 'Related Concept(s)',\n description:\n 'Associative links between concepts indicate that the two are inherently \"related\", but that one is not in any way more general than the other. Broader and Associated relationships are mutually exclusive.',\n group: 'relationship',\n type: 'array',\n of: [\n {\n type: 'reference',\n to: [{type: 'skosConcept'}],\n options: {\n filter: async ({document}) => {\n let broaderTrans = []\n try {\n // This filter checks for inconsistencies to five levels of hierarchy. Consider adding custom validation to prevent broader taxonomy inconsistencies.\n // This block starts for the document in question, and looks up the hierarchy tree. Those found to have the document in question as a \"broader transitive\" are added to a list of concepts to exclude from potential \"Related Concept\" candidates.\n const response = await client.fetch(\n `*[_type == \"skosConcept\" && prefLabel == \"${document.prefLabel}\"]{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel}}}}}}`\n )\n // console.log(response); // for troubleshooting\n broaderTrans = await response\n .flatMap((broader) => broader.broader?.flatMap((broader) => broader.prefLabel)) // first broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n ) // second broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n ) // third broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n )\n ) // fourth broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n )\n )\n ) // fifth broader term\n .filter((broader) => broader) // remove \"undefined\"\n // console.log(broaderTrans); // for troubleshooting\n\n // The 'broader[]->...' filters below look for the document in question in the broader-transitive path of the remaining concepts and, if found, excludes them from inclusion as a potential \"Related Concept\" candidate\n return {\n filter: `!(_id in $related || \n _id in path(\"drafts.**\") || \n _id == $self ||\n prefLabel in $broaderTrans || \n $self in broader[]->._id ||\n $self in broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->broader[]->broader[]->._id\n )`,\n params: {\n self: document._id.replace('drafts.', ''),\n related: document.related.map(({_ref}) => _ref),\n broaderTrans: broaderTrans,\n },\n }\n } catch (error) {\n console.error(`Could not get broader concepts: ${error}`)\n }\n },\n },\n },\n ],\n },\n {\n name: 'scheme',\n title: 'Concept Scheme(s)',\n group: 'relationship',\n type: 'reference',\n description:\n 'Concept schemes are used to group concepts into defined sets, such as thesauri, classification schemes, or facets.',\n to: [\n {\n type: 'skosConceptScheme',\n },\n ],\n options: {\n disableNew: true,\n },\n },\n {\n name: 'scopeNote',\n title: 'Scope Note',\n type: 'text',\n description:\n 'A brief statement on the intended meaning of this concept, especially as an indication of how the use of the concept is limited in indexing practice',\n rows: 3,\n group: 'note',\n },\n {\n name: 'definition',\n title: 'Definition',\n type: 'text',\n description: 'A complete explanation of the intended meaning of the concept',\n rows: 3,\n group: 'note',\n },\n {\n name: 'example',\n title: 'Examples',\n type: 'text',\n description: 'An example of the use of the concept.',\n rows: 3,\n group: 'note',\n },\n ],\n orderings: [\n {\n title: 'Top Concepts',\n name: 'topConcept',\n by: [\n {field: 'topConcept', direction: 'desc'},\n {field: 'prefLabel', direction: 'asc'},\n ],\n },\n {\n title: 'Preferred Label',\n name: 'prefLabel',\n by: [{field: 'prefLabel', direction: 'asc'}],\n },\n ],\n preview: {\n select: {\n title: 'prefLabel',\n topConcept: 'topConcept',\n broader: 'broader.0.prefLabel',\n broaderPlusOne: 'broader.0.broader.0.prefLabel',\n broaderPlusTwo: 'broader.0.broader.0.broader.0.prefLabel',\n },\n prepare({title, topConcept, broader, broaderPlusOne, broaderPlusTwo}) {\n const conceptBroader = [broaderPlusOne, broader].filter(Boolean)\n const broaderPath =\n conceptBroader.length > 0 ? `${conceptBroader.join(' ▷ ')} ▶︎ ${title}` : ''\n const hierarchy = broaderPlusTwo ? `... ${broaderPath}` : broaderPath\n return {\n title: title,\n subtitle: topConcept ? 'Top Concept' : hierarchy,\n media: topConcept ? AiOutlineTag : AiFillTag,\n }\n },\n },\n}\n"],"file":"skosConcept.js"}
1
+ {"version":3,"sources":["../src/skosConcept.js"],"names":["client","sanityClient","withConfig","apiVersion","name","title","type","icon","AiFillTags","initialValue","iriBase","iriValue","config","namespace","console","log","scheme","fetch","undefined","conceptIriBase","topConcept","broader","related","validation","Rule","custom","fields","altLabel","hiddenLabel","filter","label","includes","length","prefLabel","groups","group","description","required","context","then","conceptId","document","_id","replace","inputComponent","PrefLabel","of","unique","hidden","to","options","params","self","map","_ref","broaderTrans","response","flatMap","concat","error","disableNew","rows","orderings","by","field","direction","preview","select","broaderPlusOne","broaderPlusTwo","prepare","conceptBroader","Boolean","broaderPath","join","hierarchy","subtitle","media","AiOutlineTag","AiFillTag"],"mappings":";;;;;;;AAOA;;AACA;;AACA;;AACA;;;;;;;;AAEA,IAAMA,MAAM,GAAGC,gBAAaC,UAAb,CAAwB;AAACC,EAAAA,UAAU,EAAE;AAAb,CAAxB,CAAf;;eAEe;AACbC,EAAAA,IAAI,EAAE,aADO;AAEbC,EAAAA,KAAK,EAAE,SAFM;AAGbC,EAAAA,IAAI,EAAE,UAHO;AAIbC,EAAAA,IAAI,EAAEC,cAJO;AAKbC,EAAAA,YAAY;AAAA,0CAAE,aAAY;AAAA;;AACxB,UAAMC,OAAO,GAAG;AAACC,QAAAA,QAAQ,EAAEC,+BAAOC;AAAlB,OAAhB;AACAC,MAAAA,OAAO,CAACC,GAAR,CAAYL,OAAO,CAACC,QAApB;AACA,UAAMK,MAAM,gCACHhB,MAAM,CAACiB,KAAP,kHADG,qEAMLC,SANP;AAOA,aAAO;AACLC,QAAAA,cAAc,EAAET,OADX;AAELM,QAAAA,MAAM,EAAEA,MAFH;AAGLI,QAAAA,UAAU,EAAE,KAHP;AAILC,QAAAA,OAAO,EAAE,EAJJ;AAIQ;AACbC,QAAAA,OAAO,EAAE,EALJ,CAKQ;;AALR,OAAP;AAOD,KAjBW;;AAAA;AAAA;AAAA;;AAAA;AAAA,KALC;AAuBb;AACAC,EAAAA,UAAU,EAAGC,IAAD,IACVA,IAAI,CAACC,MAAL,CAAaC,MAAD,IAAY;AACtB,QACGA,MAAM,CAACC,QAAP,IACCD,MAAM,CAACE,WADR,IAECF,MAAM,CAACC,QAAP,CAAgBE,MAAhB,CAAwBC,KAAD,IAAWJ,MAAM,CAACE,WAAP,CAAmBG,QAAnB,CAA4BD,KAA5B,CAAlC,EAAsEE,MAAtE,GAA+E,CAFjF,IAGCN,MAAM,CAACC,QAAP,IAAmBD,MAAM,CAACC,QAAP,CAAgBI,QAAhB,CAAyBL,MAAM,CAACO,SAAhC,CAHpB,IAICP,MAAM,CAACE,WAAP,IAAsBF,MAAM,CAACE,WAAP,CAAmBG,QAAnB,CAA4BL,MAAM,CAACO,SAAnC,CALzB,EAOE,OAAO,kIAAP;AACF,WAAO,IAAP;AACD,GAVD,CAzBW;AAoCbC,EAAAA,MAAM,EAAE,CACN;AACE9B,IAAAA,IAAI,EAAE,cADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GADM,EAKN;AACED,IAAAA,IAAI,EAAE,OADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GALM,EASN;AACED,IAAAA,IAAI,EAAE,MADR;AAEEC,IAAAA,KAAK,EAAE;AAFT,GATM,CApCK;AAkDbqB,EAAAA,MAAM,EAAE,CACN;AACEtB,IAAAA,IAAI,EAAE,WADR;AAEEC,IAAAA,KAAK,EAAE,iBAFT;AAGE8B,IAAAA,KAAK,EAAE,CAAC,OAAD,EAAU,cAAV,CAHT;AAIE7B,IAAAA,IAAI,EAAE,QAJR;AAKE8B,IAAAA,WAAW,EACT,oIANJ;AAOE;AACAb,IAAAA,UAAU,EAAGC,IAAD,IACVA,IAAI,CAACa,QAAL,GAAgBZ,MAAhB,CAAuB,CAACQ,SAAD,EAAYK,OAAZ,KAAwB;AAC7C,aAAOtC,MAAM,CACViB,KADI,wDAE0CgB,SAF1C,kDAIJM,IAJI,CAIEC,SAAD,IAAe;AACnB,YAAIA,SAAS,IAAIA,SAAS,KAAKF,OAAO,CAACG,QAAR,CAAiBC,GAAjB,CAAqBC,OAArB,CAA6B,SAA7B,EAAwC,EAAxC,CAA/B,EAA4E;AAC1E,iBAAO,iCAAP;AACD,SAFD,MAEO;AACL,iBAAO,IAAP;AACD;AACF,OAVI,CAAP;AAWD,KAZD,CATJ;AAsBEC,IAAAA,cAAc,EAAEC;AAtBlB,GADM,EAyBN;AACEzC,IAAAA,IAAI,EAAE,gBADR;AAEEC,IAAAA,KAAK,EAAE,mBAFT;AAGEC,IAAAA,IAAI,EAAE;AAHR,GAzBM,EA8BN;AACEF,IAAAA,IAAI,EAAE,UADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE8B,IAAAA,KAAK,EAAE,OAHT;AAIE7B,IAAAA,IAAI,EAAE,OAJR;AAKE8B,IAAAA,WAAW,EACT,6KANJ;AAOEU,IAAAA,EAAE,EAAE,CAAC;AAACxC,MAAAA,IAAI,EAAE;AAAP,KAAD,CAPN;AAQEiB,IAAAA,UAAU,EAAGC,IAAD,IAAUA,IAAI,CAACuB,MAAL;AARxB,GA9BM,EAwCN;AACE3C,IAAAA,IAAI,EAAE,aADR;AAEEC,IAAAA,KAAK,EAAE,iBAFT;AAGE8B,IAAAA,KAAK,EAAE,OAHT;AAIE7B,IAAAA,IAAI,EAAE,OAJR;AAKE8B,IAAAA,WAAW,EACT,oUANJ;AAOEU,IAAAA,EAAE,EAAE,CAAC;AAACxC,MAAAA,IAAI,EAAE;AAAP,KAAD,CAPN;AAQEiB,IAAAA,UAAU,EAAGC,IAAD,IAAUA,IAAI,CAACuB,MAAL;AARxB,GAxCM,EAkDN;AACE3C,IAAAA,IAAI,EAAE,YADR;AAEEC,IAAAA,KAAK,EAAE,aAFT;AAGE8B,IAAAA,KAAK,EAAE,cAHT;AAIE7B,IAAAA,IAAI,EAAE,SAJR;AAKE8B,IAAAA,WAAW,EACT,4MANJ;AAOEY,IAAAA,MAAM,EAAE;AAAA,UAAEP,QAAF,SAAEA,QAAF;AAAA,aAAiBA,QAAQ,CAACpB,OAAT,GAAmBoB,QAAQ,CAACpB,OAAT,CAAiBW,MAAjB,GAA0B,CAA7C,GAAiD,KAAlE;AAAA;AAPV,GAlDM,EA2DN;AACE5B,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE2C,IAAAA,MAAM,EAAE;AAAA,UAAEP,QAAF,SAAEA,QAAF;AAAA,aAAgBA,QAAQ,CAACrB,UAAzB;AAAA,KAHV;AAIEgB,IAAAA,WAAW,EACT,qJALJ;AAMED,IAAAA,KAAK,EAAE,cANT;AAOE7B,IAAAA,IAAI,EAAE,OAPR;AAQEwC,IAAAA,EAAE,EAAE,CACF;AACExC,MAAAA,IAAI,EAAE,WADR;AAEE2C,MAAAA,EAAE,EAAE;AAAC3C,QAAAA,IAAI,EAAE;AAAP,OAFN;AAGE4C,MAAAA,OAAO,EAAE;AACPrB,QAAAA,MAAM,EAAE,SAAgB;AAAA,cAAdY,QAAc,SAAdA,QAAc;AACtB,iBAAO;AACL;AACA;AACAZ,YAAAA,MAAM,EACJ,mFAJG;AAKLsB,YAAAA,MAAM,EAAE;AACNC,cAAAA,IAAI,EAAEX,QAAQ,CAACC,GAAT,CAAaC,OAAb,CAAqB,SAArB,EAAgC,EAAhC,CADA;AAENtB,cAAAA,OAAO,EAAEoB,QAAQ,CAACpB,OAAT,CAAiBgC,GAAjB,CAAqB;AAAA,oBAAEC,IAAF,SAAEA,IAAF;AAAA,uBAAYA,IAAZ;AAAA,eAArB,CAFH;AAGNhC,cAAAA,OAAO,EAAEmB,QAAQ,CAACnB,OAAT,CAAiB+B,GAAjB,CAAqB;AAAA,oBAAEC,IAAF,SAAEA,IAAF;AAAA,uBAAYA,IAAZ;AAAA,eAArB;AAHH;AALH,WAAP;AAWD;AAbM;AAHX,KADE;AARN,GA3DM,EAyFN;AACElD,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,oBAFT;AAGE+B,IAAAA,WAAW,EACT,6MAJJ;AAKED,IAAAA,KAAK,EAAE,cALT;AAME7B,IAAAA,IAAI,EAAE,OANR;AAOEwC,IAAAA,EAAE,EAAE,CACF;AACExC,MAAAA,IAAI,EAAE,WADR;AAEE2C,MAAAA,EAAE,EAAE,CAAC;AAAC3C,QAAAA,IAAI,EAAE;AAAP,OAAD,CAFN;AAGE4C,MAAAA,OAAO,EAAE;AACPrB,QAAAA,MAAM;AAAA,0CAAE,kBAAsB;AAAA,gBAAdY,QAAc,SAAdA,QAAc;AAC5B,gBAAIc,YAAY,GAAG,EAAnB;;AACA,gBAAI;AACF;AACA;AACA,kBAAMC,QAAQ,SAASxD,MAAM,CAACiB,KAAP,wDACwBwB,QAAQ,CAACR,SADjC,uIAAvB,CAHE,CAMF;;AACAsB,cAAAA,YAAY,SAASC,QAAQ,CAC1BC,OADkB,CACTpC,OAAD;AAAA;;AAAA,2CAAaA,OAAO,CAACA,OAArB,qDAAa,iBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CAAb;AAAA,eADU,EAC6D;AAD7D,eAElByB,MAFkB,CAGjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAHiB,EAQjB;AARiB,eASlByB,MATkB,CAUjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,gDACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAViB,EAiBjB;AAjBiB,eAkBlByB,MAlBkB,CAmBjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,4CACfA,OAAO,CAACA,OADO,sDACf,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,8CACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,gDACvBA,OAAO,CAACA,OADe,sDACvB,kBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,mDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,qBAAzB,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CAnBiB,EA4BjB;AA5BiB,eA6BlByB,MA7BkB,CA8BjBF,QAAQ,CAACC,OAAT,CAAkBpC,OAAD;AAAA;;AAAA,6CACfA,OAAO,CAACA,OADO,uDACf,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,+CACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,iDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,mDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD;AAAA;;AAAA,qDACvBA,OAAO,CAACA,OADe,uDACvB,mBAAiBoC,OAAjB,CAA0BpC,OAAD,IAAaA,OAAO,CAACY,SAA9C,CADuB;AAAA,uBAAzB,CADuB;AAAA,qBAAzB,CADuB;AAAA,mBAAzB,CADuB;AAAA,iBAAzB,CADe;AAAA,eAAjB,CA9BiB,EAyCjB;AAzCiB,eA0ClBJ,MA1CkB,CA0CVR,OAAD,IAAaA,OA1CF,CAArB,CAPE,CAiD8B;AAChC;AAEA;;AACA,qBAAO;AACLQ,gBAAAA,MAAM,gjBADD;AAWLsB,gBAAAA,MAAM,EAAE;AACNC,kBAAAA,IAAI,EAAEX,QAAQ,CAACC,GAAT,CAAaC,OAAb,CAAqB,SAArB,EAAgC,EAAhC,CADA;AAENrB,kBAAAA,OAAO,EAAEmB,QAAQ,CAACnB,OAAT,CAAiB+B,GAAjB,CAAqB;AAAA,wBAAEC,IAAF,SAAEA,IAAF;AAAA,2BAAYA,IAAZ;AAAA,mBAArB,CAFH;AAGNC,kBAAAA,YAAY,EAAEA;AAHR;AAXH,eAAP;AAiBD,aAtED,CAsEE,OAAOI,KAAP,EAAc;AACd7C,cAAAA,OAAO,CAAC6C,KAAR,2CAAiDA,KAAjD;AACD;AACF,WA3EK;;AAAA;AAAA;AAAA;;AAAA;AAAA;AADC;AAHX,KADE;AAPN,GAzFM,EAqLN;AACEvD,IAAAA,IAAI,EAAE,QADR;AAEEC,IAAAA,KAAK,EAAE,mBAFT;AAGE8B,IAAAA,KAAK,EAAE,cAHT;AAIE7B,IAAAA,IAAI,EAAE,WAJR;AAKE8B,IAAAA,WAAW,EACT,oHANJ;AAOEa,IAAAA,EAAE,EAAE,CACF;AACE3C,MAAAA,IAAI,EAAE;AADR,KADE,CAPN;AAYE4C,IAAAA,OAAO,EAAE;AACPU,MAAAA,UAAU,EAAE;AADL;AAZX,GArLM,EAqMN;AACExD,IAAAA,IAAI,EAAE,WADR;AAEEC,IAAAA,KAAK,EAAE,YAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EACT,sJALJ;AAMEyB,IAAAA,IAAI,EAAE,CANR;AAOE1B,IAAAA,KAAK,EAAE;AAPT,GArMM,EA8MN;AACE/B,IAAAA,IAAI,EAAE,YADR;AAEEC,IAAAA,KAAK,EAAE,YAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EAAE,+DAJf;AAKEyB,IAAAA,IAAI,EAAE,CALR;AAME1B,IAAAA,KAAK,EAAE;AANT,GA9MM,EAsNN;AACE/B,IAAAA,IAAI,EAAE,SADR;AAEEC,IAAAA,KAAK,EAAE,UAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIE8B,IAAAA,WAAW,EAAE,uCAJf;AAKEyB,IAAAA,IAAI,EAAE,CALR;AAME1B,IAAAA,KAAK,EAAE;AANT,GAtNM,CAlDK;AAiRb2B,EAAAA,SAAS,EAAE,CACT;AACEzD,IAAAA,KAAK,EAAE,cADT;AAEED,IAAAA,IAAI,EAAE,YAFR;AAGE2D,IAAAA,EAAE,EAAE,CACF;AAACC,MAAAA,KAAK,EAAE,YAAR;AAAsBC,MAAAA,SAAS,EAAE;AAAjC,KADE,EAEF;AAACD,MAAAA,KAAK,EAAE,WAAR;AAAqBC,MAAAA,SAAS,EAAE;AAAhC,KAFE;AAHN,GADS,EAST;AACE5D,IAAAA,KAAK,EAAE,iBADT;AAEED,IAAAA,IAAI,EAAE,WAFR;AAGE2D,IAAAA,EAAE,EAAE,CAAC;AAACC,MAAAA,KAAK,EAAE,WAAR;AAAqBC,MAAAA,SAAS,EAAE;AAAhC,KAAD;AAHN,GATS,CAjRE;AAgSbC,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACN9D,MAAAA,KAAK,EAAE,WADD;AAENe,MAAAA,UAAU,EAAE,YAFN;AAGNC,MAAAA,OAAO,EAAE,qBAHH;AAIN+C,MAAAA,cAAc,EAAE,+BAJV;AAKNC,MAAAA,cAAc,EAAE;AALV,KADD;;AAQPC,IAAAA,OAAO,QAA+D;AAAA,UAA7DjE,KAA6D,SAA7DA,KAA6D;AAAA,UAAtDe,UAAsD,SAAtDA,UAAsD;AAAA,UAA1CC,OAA0C,SAA1CA,OAA0C;AAAA,UAAjC+C,cAAiC,SAAjCA,cAAiC;AAAA,UAAjBC,cAAiB,SAAjBA,cAAiB;AACpE,UAAME,cAAc,GAAG,CAACH,cAAD,EAAiB/C,OAAjB,EAA0BQ,MAA1B,CAAiC2C,OAAjC,CAAvB;AACA,UAAMC,WAAW,GACfF,cAAc,CAACvC,MAAf,GAAwB,CAAxB,aAA+BuC,cAAc,CAACG,IAAf,CAAoB,KAApB,CAA/B,2BAAgErE,KAAhE,IAA0E,EAD5E;AAEA,UAAMsE,SAAS,GAAGN,cAAc,iBAAUI,WAAV,IAA0BA,WAA1D;AACA,aAAO;AACLpE,QAAAA,KAAK,EAAEA,KADF;AAELuE,QAAAA,QAAQ,EAAExD,UAAU,GAAG,aAAH,GAAmBuD,SAFlC;AAGLE,QAAAA,KAAK,EAAEzD,UAAU,GAAG0D,gBAAH,GAAkBC;AAH9B,OAAP;AAKD;;AAlBM;AAhSI,C","sourcesContent":["/**\n * Sanity document scheme for SKOS Taxonomy Concepts\n * @todo Hierarchy, Broader, & Associated: enforce disjointedness between Associated and BroaderTransitive (integrity constraint); prohibit cycles in hierarchical relations (best practice). 2022-03-31: Filtering added to Related to five levels of hierarchy, document filtering present for Broader. Consider more robust filtering and validation for future releases.\n * @todo Lexical labels: add child level validation so that offending labels are shown directly when a duplicate is entered. Then consider removing document level validation. cf. https://www.sanity.io/docs/validation#9e69d5db6f72\n * @todo Scheme initial value: Configure \"default\" option in Concept Scheme, for cases when there are multiple schemes; configure initialValue to default to that selection (It's currently configure to take the scheme ordered first. This isn't transparent.)\n * @todo Abstract broader and related concept filter into reusable function, and/or add in validation to cover wider scenarios.\n */\nimport sanityClient from 'part:@sanity/base/client'\nimport config from 'config:taxonomy-manager'\nimport {AiFillTag, AiOutlineTag, AiFillTags} from 'react-icons/ai'\nimport PrefLabel from './components/prefLabel'\n\nconst client = sanityClient.withConfig({apiVersion: '2021-03-25'})\n\nexport default {\n name: 'skosConcept',\n title: 'Concept',\n type: 'document',\n icon: AiFillTags,\n initialValue: async () => {\n const iriBase = {iriValue: config.namespace}\n console.log(iriBase.iriValue);\n const scheme =\n (await client.fetch(`\n *[_type == 'skosConceptScheme']{\n '_type': 'reference',\n '_ref': _id\n }[0]\n `)) ?? undefined\n return {\n conceptIriBase: iriBase,\n scheme: scheme,\n topConcept: false,\n broader: [], // an empty array is needed here in order to return concepts with no \"broader\" for \"related\"\n related: [], // an empty array is needed here in order to return concepts with no \"broader\" for \"related\"\n }\n },\n // Document level validation for the disjunction between Preferred, Alternate, and Hidden Labels:\n validation: (Rule) =>\n Rule.custom((fields) => {\n if (\n (fields.altLabel &&\n fields.hiddenLabel &&\n fields.altLabel.filter((label) => fields.hiddenLabel.includes(label)).length > 0) ||\n (fields.altLabel && fields.altLabel.includes(fields.prefLabel)) ||\n (fields.hiddenLabel && fields.hiddenLabel.includes(fields.prefLabel))\n )\n return 'Preferred Label, Alternate Labels, and Hidden Labels must all be unique. Please remove any labels duplicated across label types.'\n return true\n }),\n groups: [\n {\n name: 'relationship',\n title: 'Relationships',\n },\n {\n name: 'label',\n title: 'Labels',\n },\n {\n name: 'note',\n title: 'Documentation',\n },\n ],\n fields: [\n {\n name: 'prefLabel',\n title: 'Preferred Label',\n group: ['label', 'relationship'],\n type: 'string',\n description:\n 'The preferred lexical label for this concept. This label is also used to unambiguously represent this concept via the concept IRI.',\n // If there is a published concept with the current document's prefLabel, return an error message, but only for concepts with distinct _ids — otherwise editing an existing concept shows the error message as well.\n validation: (Rule) =>\n Rule.required().custom((prefLabel, context) => {\n return client\n .fetch(\n `*[_type == \"skosConcept\" && prefLabel == \"${prefLabel}\" && !(_id in path(\"drafts.**\"))][0]._id`\n )\n .then((conceptId) => {\n if (conceptId && conceptId !== context.document._id.replace('drafts.', '')) {\n return 'Preferred Label must be unique.'\n } else {\n return true\n }\n })\n }),\n inputComponent: PrefLabel,\n },\n {\n name: 'conceptIriBase',\n title: 'Edit the base IRI',\n type: 'baseIri',\n },\n {\n name: 'altLabel',\n title: 'Alternate Label(s)',\n group: 'label',\n type: 'array',\n description:\n 'Alternative labels can be used to assign synonyms, near-synonyms, abbreviations, and acronyms to a concept. Preferred, alternative, and hidden label sets must not overlap.',\n of: [{type: 'string'}],\n validation: (Rule) => Rule.unique(),\n },\n {\n name: 'hiddenLabel',\n title: 'Hidden Label(s)',\n group: 'label',\n type: 'array',\n description:\n 'Hidden labels are for character strings that need to be accessible to applications performing text-based indexing and search operations, but not visible otherwise. Hidden labels may for instance be used to include misspelled variants of other lexical labels. Preferred, alternative, and hidden label sets must not overlap.',\n of: [{type: 'string'}],\n validation: (Rule) => Rule.unique(),\n },\n {\n name: 'topConcept',\n title: 'Top Concept',\n group: 'relationship',\n type: 'boolean',\n description:\n 'Top concepts provide an efficient entry point to broader/narrower concept hierarchies and/or top level facets. By convention, resources can be a Top Concept, or have Broader relationships, but not both.',\n hidden: ({document}) => (document.broader ? document.broader.length > 0 : false),\n },\n {\n name: 'broader',\n title: 'Broader Concept(s)',\n hidden: ({document}) => document.topConcept,\n description:\n 'Broader relationships create a hierarchy between concepts, for example to create category/subcategory, part/whole, or class/instance relationships.',\n group: 'relationship',\n type: 'array',\n of: [\n {\n type: 'reference',\n to: {type: 'skosConcept'},\n options: {\n filter: ({document}) => {\n return {\n // Broader filter only performs document-level validation for broader-transitive/related disjunction.\n // Consider adding custom validation to prevent broader taxonomy inconsistencies.\n filter:\n '!(_id in $broader || _id in $related || _id in path(\"drafts.**\") || _id == $self)',\n params: {\n self: document._id.replace('drafts.', ''),\n broader: document.broader.map(({_ref}) => _ref),\n related: document.related.map(({_ref}) => _ref),\n },\n }\n },\n },\n },\n ],\n },\n {\n name: 'related',\n title: 'Related Concept(s)',\n description:\n 'Associative links between concepts indicate that the two are inherently \"related\", but that one is not in any way more general than the other. Broader and Associated relationships are mutually exclusive.',\n group: 'relationship',\n type: 'array',\n of: [\n {\n type: 'reference',\n to: [{type: 'skosConcept'}],\n options: {\n filter: async ({document}) => {\n let broaderTrans = []\n try {\n // This filter checks for inconsistencies to five levels of hierarchy. Consider adding custom validation to prevent broader taxonomy inconsistencies.\n // This block starts for the document in question, and looks up the hierarchy tree. Those found to have the document in question as a \"broader transitive\" are added to a list of concepts to exclude from potential \"Related Concept\" candidates.\n const response = await client.fetch(\n `*[_type == \"skosConcept\" && prefLabel == \"${document.prefLabel}\"]{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel,broader[]->{prefLabel}}}}}}`\n )\n // console.log(response); // for troubleshooting\n broaderTrans = await response\n .flatMap((broader) => broader.broader?.flatMap((broader) => broader.prefLabel)) // first broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n ) // second broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n ) // third broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n )\n ) // fourth broader term\n .concat(\n response.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) =>\n broader.broader?.flatMap((broader) => broader.prefLabel)\n )\n )\n )\n )\n )\n ) // fifth broader term\n .filter((broader) => broader) // remove \"undefined\"\n // console.log(broaderTrans); // for troubleshooting\n\n // The 'broader[]->...' filters below look for the document in question in the broader-transitive path of the remaining concepts and, if found, excludes them from inclusion as a potential \"Related Concept\" candidate\n return {\n filter: `!(_id in $related || \n _id in path(\"drafts.**\") || \n _id == $self ||\n prefLabel in $broaderTrans || \n $self in broader[]->._id ||\n $self in broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->broader[]->._id ||\n $self in broader[]->broader[]->broader[]->broader[]->broader[]->._id\n )`,\n params: {\n self: document._id.replace('drafts.', ''),\n related: document.related.map(({_ref}) => _ref),\n broaderTrans: broaderTrans,\n },\n }\n } catch (error) {\n console.error(`Could not get broader concepts: ${error}`)\n }\n },\n },\n },\n ],\n },\n {\n name: 'scheme',\n title: 'Concept Scheme(s)',\n group: 'relationship',\n type: 'reference',\n description:\n 'Concept schemes are used to group concepts into defined sets, such as thesauri, classification schemes, or facets.',\n to: [\n {\n type: 'skosConceptScheme',\n },\n ],\n options: {\n disableNew: true,\n },\n },\n {\n name: 'scopeNote',\n title: 'Scope Note',\n type: 'text',\n description:\n 'A brief statement on the intended meaning of this concept, especially as an indication of how the use of the concept is limited in indexing practice',\n rows: 3,\n group: 'note',\n },\n {\n name: 'definition',\n title: 'Definition',\n type: 'text',\n description: 'A complete explanation of the intended meaning of the concept',\n rows: 3,\n group: 'note',\n },\n {\n name: 'example',\n title: 'Examples',\n type: 'text',\n description: 'An example of the use of the concept.',\n rows: 3,\n group: 'note',\n },\n ],\n orderings: [\n {\n title: 'Top Concepts',\n name: 'topConcept',\n by: [\n {field: 'topConcept', direction: 'desc'},\n {field: 'prefLabel', direction: 'asc'},\n ],\n },\n {\n title: 'Preferred Label',\n name: 'prefLabel',\n by: [{field: 'prefLabel', direction: 'asc'}],\n },\n ],\n preview: {\n select: {\n title: 'prefLabel',\n topConcept: 'topConcept',\n broader: 'broader.0.prefLabel',\n broaderPlusOne: 'broader.0.broader.0.prefLabel',\n broaderPlusTwo: 'broader.0.broader.0.broader.0.prefLabel',\n },\n prepare({title, topConcept, broader, broaderPlusOne, broaderPlusTwo}) {\n const conceptBroader = [broaderPlusOne, broader].filter(Boolean)\n const broaderPath =\n conceptBroader.length > 0 ? `${conceptBroader.join(' ▷ ')} ▶︎ ${title}` : ''\n const hierarchy = broaderPlusTwo ? `... ${broaderPath}` : broaderPath\n return {\n title: title,\n subtitle: topConcept ? 'Top Concept' : hierarchy,\n media: topConcept ? AiOutlineTag : AiFillTag,\n }\n },\n },\n}\n"],"file":"skosConcept.js"}
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _react = _interopRequireDefault(require("react"));
9
+
8
10
  var _ri = require("react-icons/ri");
9
11
 
10
12
  var _treeView = _interopRequireDefault(require("./components/treeView"));
@@ -19,25 +21,24 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
21
  */
20
22
  var _default = {
21
23
  name: 'skosConceptScheme',
22
- title: 'Taxonomy Schemes',
24
+ title: 'Taxonomy Scheme',
23
25
  type: 'document',
24
26
  icon: _ri.RiNodeTree,
25
27
  fields: [{
26
28
  name: 'title',
27
29
  title: 'Taxonomy Concept Scheme',
28
30
  type: 'string',
29
- description: 'Concept schemes are used to group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like.'
31
+ description: 'Schemes group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like'
30
32
  }, {
31
33
  name: 'treeView',
32
34
  title: 'Concept Scheme Tree View',
33
35
  type: 'string',
34
- description: 'Concept hierarchy is determined by \'Broader Than\' and \'Top Concept\' relationships assigned to each concept. A holistic view of these relationships is shown below. Top Concepts are indicated in bold. Italicized concepts represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree.)',
36
+ description: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Top Concepts are indicated in ", /*#__PURE__*/_react.default.createElement("strong", null, "bold"), ". Concepts in ", /*#__PURE__*/_react.default.createElement("em", null, "italics"), " represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree)."),
35
37
  inputComponent: _treeView.default
36
38
  }, {
37
39
  name: 'description',
38
40
  title: 'Description',
39
41
  type: 'text',
40
- rows: 3,
41
42
  description: 'Describe the intended use of this scheme.'
42
43
  }],
43
44
  preview: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/skosConceptScheme.js"],"names":["name","title","type","icon","RiNodeTree","fields","description","inputComponent","TreeView","rows","preview","select","prepare","media"],"mappings":";;;;;;;AAMA;;AACA;;;;AAPA;AACA;AACA;AACA;AACA;AACA;eAIe;AACbA,EAAAA,IAAI,EAAE,mBADO;AAEbC,EAAAA,KAAK,EAAE,kBAFM;AAGbC,EAAAA,IAAI,EAAE,UAHO;AAIbC,EAAAA,IAAI,EAAEC,cAJO;AAKbC,EAAAA,MAAM,EAAE,CACN;AACEL,IAAAA,IAAI,EAAE,OADR;AAEEC,IAAAA,KAAK,EAAE,yBAFT;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEI,IAAAA,WAAW,EACT;AALJ,GADM,EAQN;AACEN,IAAAA,IAAI,EAAE,UADR;AAEEC,IAAAA,KAAK,EAAE,0BAFT;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEI,IAAAA,WAAW,EACT,8TALJ;AAMEC,IAAAA,cAAc,EAAEC;AANlB,GARM,EAgBN;AACER,IAAAA,IAAI,EAAE,aADR;AAEEC,IAAAA,KAAK,EAAE,aAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIEO,IAAAA,IAAI,EAAE,CAJR;AAKEH,IAAAA,WAAW,EAAE;AALf,GAhBM,CALK;AA6BbI,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACNV,MAAAA,KAAK,EAAE;AADD,KADD;;AAIPW,IAAAA,OAAO,OAAU;AAAA,UAARX,KAAQ,QAARA,KAAQ;AACf,aAAO;AACLA,QAAAA,KAAK,EAAEA,KADF;AAELY,QAAAA,KAAK,EAAET;AAFF,OAAP;AAID;;AATM;AA7BI,C","sourcesContent":["/**\n * Sanity document scheme for SKOS Concept Schemes\n * @todo Afford setting a \"default\" scheme which is used as an initial value for new concepts. When no default is set, concepts are created without any scheme.\n * @todo Add administrative metadata: author, date, last revised, etc.\n * @todo Consider adding informational lists to this view (via custom input component): number of terms, list of terms, links. Perhaps eventually a navigable tree view.\n */\nimport {RiNodeTree} from 'react-icons/ri'\nimport TreeView from './components/treeView'\n\nexport default {\n name: 'skosConceptScheme',\n title: 'Taxonomy Schemes',\n type: 'document',\n icon: RiNodeTree,\n fields: [\n {\n name: 'title',\n title: 'Taxonomy Concept Scheme',\n type: 'string',\n description:\n 'Concept schemes are used to group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like.',\n },\n {\n name: 'treeView',\n title: 'Concept Scheme Tree View',\n type: 'string',\n description: \n 'Concept hierarchy is determined by \\'Broader Than\\' and \\'Top Concept\\' relationships assigned to each concept. A holistic view of these relationships is shown below. Top Concepts are indicated in bold. Italicized concepts represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree.)',\n inputComponent: TreeView\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n description: 'Describe the intended use of this scheme.',\n },\n ],\n preview: {\n select: {\n title: 'title',\n },\n prepare({title}) {\n return {\n title: title,\n media: RiNodeTree,\n }\n },\n },\n}\n"],"file":"skosConceptScheme.js"}
1
+ {"version":3,"sources":["../src/skosConceptScheme.js"],"names":["name","title","type","icon","RiNodeTree","fields","description","inputComponent","TreeView","preview","select","prepare","media"],"mappings":";;;;;;;AAOA;;AACA;;AACA;;;;AATA;AACA;AACA;AACA;AACA;AACA;eAMe;AACbA,EAAAA,IAAI,EAAE,mBADO;AAEbC,EAAAA,KAAK,EAAE,iBAFM;AAGbC,EAAAA,IAAI,EAAE,UAHO;AAIbC,EAAAA,IAAI,EAAEC,cAJO;AAKbC,EAAAA,MAAM,EAAE,CACN;AACEL,IAAAA,IAAI,EAAE,OADR;AAEEC,IAAAA,KAAK,EAAE,yBAFT;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEI,IAAAA,WAAW,EAAG;AAJhB,GADM,EAON;AACEN,IAAAA,IAAI,EAAE,UADR;AAEEC,IAAAA,KAAK,EAAE,0BAFT;AAGEC,IAAAA,IAAI,EAAE,QAHR;AAIEI,IAAAA,WAAW,eAAE,2GAAgC,oDAAhC,iCAAmE,mDAAnE,mGAJf;AAKEC,IAAAA,cAAc,EAAEC;AALlB,GAPM,EAcN;AACER,IAAAA,IAAI,EAAE,aADR;AAEEC,IAAAA,KAAK,EAAE,aAFT;AAGEC,IAAAA,IAAI,EAAE,MAHR;AAIEI,IAAAA,WAAW,EAAE;AAJf,GAdM,CALK;AA0BbG,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACNT,MAAAA,KAAK,EAAE;AADD,KADD;;AAIPU,IAAAA,OAAO,OAAU;AAAA,UAARV,KAAQ,QAARA,KAAQ;AACf,aAAO;AACLA,QAAAA,KAAK,EAAEA,KADF;AAELW,QAAAA,KAAK,EAAER;AAFF,OAAP;AAID;;AATM;AA1BI,C","sourcesContent":["/**\n * Sanity document scheme for SKOS Concept Schemes\n * @todo Afford setting a \"default\" scheme which is used as an initial value for new concepts. When no default is set, concepts are created without any scheme.\n * @todo Add administrative metadata: author, date, last revised, etc.\n * @todo Consider adding informational lists to this view (via custom input component): number of terms, list of terms, links. Perhaps eventually a navigable tree view.\n */\n\nimport React from 'react';\nimport {RiNodeTree} from 'react-icons/ri'\nimport TreeView from './components/treeView'\n\nexport default {\n name: 'skosConceptScheme',\n title: 'Taxonomy Scheme',\n type: 'document',\n icon: RiNodeTree,\n fields: [\n {\n name: 'title',\n title: 'Taxonomy Concept Scheme',\n type: 'string',\n description: 'Schemes group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like'\n },\n {\n name: 'treeView',\n title: 'Concept Scheme Tree View',\n type: 'string',\n description: <>Top Concepts are indicated in <strong>bold</strong>. Concepts in <em>italics</em> represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree).</>,\n inputComponent: TreeView\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n description: 'Describe the intended use of this scheme.',\n },\n ],\n preview: {\n select: {\n title: 'title',\n },\n prepare({title}) {\n return {\n title: title,\n media: RiNodeTree,\n }\n },\n },\n}\n"],"file":"skosConceptScheme.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-taxonomy-manager",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Create and manage SKOS compliant taxonomies, thesauri, and classification schemes in Sanity Studio.",
5
5
  "scripts": {
6
6
  "lint": "eslint .",
@@ -26,7 +26,7 @@ const RecursiveConcept = (props) => {
26
26
  {props.isLoading ? (
27
27
  <p>Loading hierarchy ...</p>
28
28
  ) : (
29
- <ul>
29
+ <ul className='skosTreeView'>
30
30
  {props.concepts.map((concept) => {
31
31
  return (
32
32
  <li
@@ -48,12 +48,15 @@ const RecursiveConcept = (props) => {
48
48
  }
49
49
 
50
50
  const TreeView = withParent(
51
+
52
+ // Not using the ref right now, but likely will when the tree becomes interactive.
51
53
  React.forwardRef((props, ref) => {
52
54
  const [concepts, setConcepts] = useState([])
53
55
  const [isLoading, setIsLoading] = useState(false)
54
56
  const [noConcept, setNoConcept] = useState(false)
55
57
  const [isError, setIsError] = useState(false)
56
58
 
59
+ const conceptScheme = props.parent._id ? props.parent._id.replace('drafts.', '') : undefined
57
60
  // This function builds the first level of hierarchy, noting Top Concepts and orphans, then calls the recursiveQuery() function
58
61
  const queryBuilder = (depth = 5) => {
59
62
  if (depth === 0) {
@@ -85,7 +88,9 @@ const TreeView = withParent(
85
88
 
86
89
  useEffect(() => {
87
90
  const fetchConcepts = async () => {
88
- const conceptScheme = await props.parent._id;
91
+
92
+ if (props.parent._id === undefined ) return
93
+
89
94
  setIsError(false)
90
95
  setNoConcept(false)
91
96
  setIsLoading(true)
@@ -95,6 +100,7 @@ const TreeView = withParent(
95
100
  const response = await client.fetch(query, params)
96
101
  if (response.length < 1) {
97
102
  setNoConcept(true)
103
+ setIsError(false)
98
104
  }
99
105
  setConcepts(response)
100
106
  } catch (error) {
@@ -104,7 +110,7 @@ const TreeView = withParent(
104
110
  setIsLoading(false)
105
111
  }
106
112
  fetchConcepts()
107
- }, [])
113
+ }, [props.parent._id])
108
114
 
109
115
  return (
110
116
  <Box>
@@ -1,7 +1,7 @@
1
- ul {
1
+ ul.skosTreeView {
2
2
  list-style: none;
3
3
  }
4
- li {
4
+ ul.skosTreeView li {
5
5
  font-weight: normal;
6
6
  }
7
7
  .level_0 {
@@ -14,7 +14,7 @@ const client = sanityClient.withConfig({apiVersion: '2021-03-25'})
14
14
 
15
15
  export default {
16
16
  name: 'skosConcept',
17
- title: 'Concepts',
17
+ title: 'Concept',
18
18
  type: 'document',
19
19
  icon: AiFillTags,
20
20
  initialValue: async () => {
@@ -4,12 +4,14 @@
4
4
  * @todo Add administrative metadata: author, date, last revised, etc.
5
5
  * @todo Consider adding informational lists to this view (via custom input component): number of terms, list of terms, links. Perhaps eventually a navigable tree view.
6
6
  */
7
+
8
+ import React from 'react';
7
9
  import {RiNodeTree} from 'react-icons/ri'
8
10
  import TreeView from './components/treeView'
9
11
 
10
12
  export default {
11
13
  name: 'skosConceptScheme',
12
- title: 'Taxonomy Schemes',
14
+ title: 'Taxonomy Scheme',
13
15
  type: 'document',
14
16
  icon: RiNodeTree,
15
17
  fields: [
@@ -17,22 +19,19 @@ export default {
17
19
  name: 'title',
18
20
  title: 'Taxonomy Concept Scheme',
19
21
  type: 'string',
20
- description:
21
- 'Concept schemes are used to group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like.',
22
+ description: 'Schemes group concepts into defined sets, such as thesauri, classification schemes, or facets. Concepts may belong on many (or no) concept schemes, and you may create as many (or few) concept schemes as you like'
22
23
  },
23
24
  {
24
25
  name: 'treeView',
25
26
  title: 'Concept Scheme Tree View',
26
27
  type: 'string',
27
- description:
28
- 'Concept hierarchy is determined by \'Broader Than\' and \'Top Concept\' relationships assigned to each concept. A holistic view of these relationships is shown below. Top Concepts are indicated in bold. Italicized concepts represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree.)',
28
+ description: <>Top Concepts are indicated in <strong>bold</strong>. Concepts in <em>italics</em> represent polyhierarchy (concepts that appear in more than one branch of the hierarchy tree).</>,
29
29
  inputComponent: TreeView
30
30
  },
31
31
  {
32
32
  name: 'description',
33
33
  title: 'Description',
34
34
  type: 'text',
35
- rows: 3,
36
35
  description: 'Describe the intended use of this scheme.',
37
36
  },
38
37
  ],