`. To allow for breaking up a long list of radio buttons or checkboxes (with `"orientation": "vertical"`) into logical sections, a set of special CSS _classes_ are available named `tw-space-above-N` and `tw-space-below-N` for numbers 1 to 5. Applying one of these classes to an element in the `htmlLabel` (e.g. `
Label`) will add a corresponding amount of space above or below that option in the annotation UI.
+
+
+
+```json
+[
+ {
+ "name": "sentiment",
+ "type": "radio",
+ "title": "Sentiment",
+ "orientation": "vertical",
+ "options": [
+ {
+ "value": "positive",
+ "htmlLabel": "Positive"
+ },
+ {
+ "value": "neutral",
+ "htmlLabel": "Neutral"
+ },
+ {
+ "value": "negative",
+ "htmlLabel": "Negative"
+ },
+ {
+ "value": "unknown",
+ "htmlLabel": "Cannot be determined"
+ }
+ ]
+ }
+]
+```
+
+
+
+### Selector input
+
+
+
+```json
+[
+ {
+ "name": "mylabel",
+ "type": "selector",
+ "optional": true, //Optional - Set if validation is not required
+ "options": [ // The options that the user is able to select from
+ {"value": "value1", "label": "Text to show user 1"},
+ {"value": "value2", "label": "Text to show user 2"},
+ {"value": "value3", "label": "Text to show user 3"}
+ ],
+ "title": "Title string", //Optional
+ "description": "Description string", //Optional
+ "valSuccess": "Success message when the field is validated", //Optional
+ "valError": "Error message when the field fails validation" //Optional
+ }
+]
+```
+
+
+
+### Optional help text
+
+Optionally, radio buttons and checkboxes can be given help text to provide additional per-choice context or information to help annotators.
+
+
+
+
+```json
+[
+ {
+ "name": "mylabel",
+ "type": "radio",
+ "optional": true, //Optional - Set if validation is not required
+ "orientation": "vertical", //Optional - default is "horizontal"
+ "options": [ // The options that the user is able to select from
+ {"value": "value1", "label": "Text to show user 1", "helptext": "Additional help text for option 1"},
+ {"value": "value2", "label": "Text to show user 2", "helptext": "Additional help text for option 2"},
+ {"value": "value3", "label": "Text to show user 3"}
+ ],
+ "title": "Title string", //Optional
+ "description": "Description string", //Optional
+ "valSuccess": "Success message when the field is validated", //Optional
+ "valError": "Error message when the field fails validation" //Optional
+ }
+]
+```
+
+
+
+### Alternative way to provide options for radio, checkbox and selector
+
+A dictionary (key value pairs) and also be provided to the `options` field of the radio, checkbox and selector widgets
+but note that the ordering of the options are **not guaranteed** as javascript does not sort dictionaries by
+the order in which keys are added. Note that additional help texts for radio buttons and checkboxes are not supported using this syntax.
+
+
+
+```json
+[
+ {
+ "name": "mylabel",
+ "type": "radio",
+ "optional": true, //Optional - Set if validation is not required
+ "options": { // The options can be specified as a dictionary, ordering is not guaranteed
+ "value1": "Text to show user 1",
+ "value2": "Text to show user 2",
+ "value3": "Text to show user 3"
+ },
+ "title": "Title string", //Optional
+ "description": "Description string", //Optional
+ "valSuccess": "Success message when the field is validated", //Optional
+ "valError": "Error message when the field fails validation" //Optional
+ }
+]
+```
+
+
+
+### Dynamic options for radio, checkbox and selector
+
+All the examples above have a "static" list of available options for the radio, checkbox and selector widgets, where the complete options list is enumerated in the project configuration and every document offers the same set of options. However it is also possible to take some or all of the options from the _document_ data rather than the _configuration_ data. For example:
+
+
+
+**Project configuration**
+
+```json
+[
+ {
+ "name": "uri",
+ "type": "radio",
+ "title": "Select the most appropriate URI",
+ "options":[
+ {"fromDocument": "candidates"},
+ {"value": "none", "label": "None of the above"},
+ {"value": "unknown", "label": "Cannot be determined without more context"}
+ ]
+ }
+]
+```
+
+**Document**
+
+```json
+{
+ "text": "President Bush visited the air base yesterday...",
+ "candidates": [
+ {
+ "value": "http://dbpedia.org/resource/George_W._Bush",
+ "label": "George W. Bush (Jnr)"
+ },
+ {
+ "value": "http://dbpedia.org/resource/George_H._W._Bush",
+ "label": "George H. W. Bush (Snr)"
+ }
+ ]
+}
+```
+
+
+
+`"fromDocument"` is a dot-separated property path leading to the location within each document where the additional options can be found, for example `"fromDocument":"candidates"` looks for a top-level property named `candidates` in each document, `"fromDocument": "options.custom"` would look for a property named `options` which is itself an object with a property named `custom`. The target property in the document may be in any of the following forms:
+
+- an array _of objects_, each with `value` and `label` (and optionally `helptext`) properties, exactly as in the static configuration format - this is the format used in the example above
+- an array _of strings_, where the same string will be used as both the value and the label for that option
+- an arbitrary ["dictionary"](#options-as-dict) object mapping values to labels
+- a _single string_, which is parsed into a list of options
+
+The "single string" alternative is designed to be easier to use when [importing documents](documents_annotations_management.md#importing-documents) from CSV files. It allows you to provide any number of options in a _single_ CSV column value. Within the column the options are separated by semicolons, and each option is of the form `value=label`. Whitespace around the delimiters is ignored, both between options and between the value and label of a single option. For example given CSV document data of
+
+| text | options |
+|-----------------|---------------------------------------------------|
+| Favourite fruit | `apple=Apples; orange = Oranges; kiwi=Kiwi fruit` |
+
+a `{"fromDocument": "options"}` configuration would produce the equivalent of
+
+```json
+[
+ {"value": "apple", "label": "Apples"},
+ {"value": "orange", "label": "Oranges"},
+ {"value": "kiwi", "label": "Kiwi fruit"}
+]
+```
+
+If your values or labels may need to contain the default separator characters `;` or `=` you can select different separators by adding extra properties to the configuration:
+
+```json
+{"fromDocument": "options", "separator": "~~", "valueLabelSeparator": "::"}
+```
+
+| text | options |
+|-----------------|------------------------------------------------------|
+| Favourite fruit | `apple::Apples ~~ orange::Oranges ~~ kiwi::Kiwi fruit` |
+
+The separators can be more than one character, and you can set `"valueLabelSeparator":""` to disable label splitting altogether and just use the value as its own label.
+
+### Mixing static and dynamic options
+
+Static and `fromDocument` options may be freely interspersed in any order, so you can have a fully-dynamic set of options by specifying _only_ a `fromDocument` entry with no static options, or you can have static options that are listed first followed by dynamic options, or dynamic options first followed by static, etc.
+
+### Conditional components
+
+By default all components listed in the project configuration will be shown for all documents. However this is not always appropriate, for example you may have some components that are only relevant to certain documents, or only relevant for particular combinations of values in _other_ components. To allow for these kinds of scenarios any component can have a field named `if` specifying the conditions under which that component should be shown.
+
+The `if` field is an _expression_ that is able to refer to fields in both the current _document_ being annotated and the current state of the other annotation components. The expression language is largely based on a subset of the standard JavaScript expression syntax but with a few additional syntax elements to ease working with array data and regular expressions.
+
+The following simple example shows how you might implement an "Other (please specify)" pattern, where the user can select from a list of choices but also has the option to supply their own answer if none of the choices are appropriate. The free text field is only shown if the user selects the "other" choice.
+
+
+
+**Project configuration**
+
+```json
+[
+ {
+ "name": "uri",
+ "type": "radio",
+ "title": "Select the most appropriate URI",
+ "options":[
+ {"fromDocument": "candidates"},
+ {"value": "other", "label": "Other"}
+ ]
+ },
+ {
+ "name": "otherValue",
+ "type": "text",
+ "title": "Please specify another value",
+ "if": "annotation.uri == 'other'",
+ "regex": "^(https?|urn):",
+ "valError": "Please specify a URI (starting http:, https: or urn:)"
+ }
+]
+```
+
+**Document**
+
+```json
+{
+ "text": "President Bush visited the air base yesterday...",
+ "candidates": [
+ {
+ "value": "http://dbpedia.org/resource/George_W._Bush",
+ "label": "George W. Bush (Jnr)"
+ },
+ {
+ "value": "http://dbpedia.org/resource/George_H._W._Bush",
+ "label": "George H. W. Bush (Snr)"
+ }
+ ]
+}
+```
+
+
+Note that validation rules (such as `optional`, `minSelected` or `regex`) are not applied to components that are hidden by an `if` expression - hidden components will never be included in the annotation output, even if they would be considered "required" had they been visible.
+
+Components can also be made conditional on properties of the _document_, or a combination of the document and the annotation values, for example
+
+
+
+**Project configuration**
+
+```json
+[
+ {
+ "name": "htmldisplay",
+ "type": "html",
+ "text": "{{{text}}}"
+ },
+ {
+ "name": "sentiment",
+ "type": "radio",
+ "title": "Sentiment",
+ "description": "Please select a sentiment of the text above.",
+ "options": [
+ {"value": "negative", "label": "Negative"},
+ {"value": "neutral", "label": "Neutral"},
+ {"value": "positive", "label": "Positive"}
+ ]
+ },
+ {
+ "name": "reason",
+ "type": "text",
+ "title": "Why do you disagree with the suggested value?",
+ "if": "annotation.sentiment !== document.preanno.sentiment"
+ }
+]
+```
+
+**Documents**
+
+```json
+[
+ {
+ "text": "I love the thing!",
+ "preanno": { "sentiment": "positive" }
+ },
+ {
+ "text": "I hate the thing!",
+ "preanno": { "sentiment": "negative" }
+ },
+ {
+ "text": "The thing is ok, I guess...",
+ "preanno": { "sentiment": "neutral" }
+ }
+]
+```
+
+
+
+The full list of supported constructions is as follows:
+
+- the `annotation` variable refers to the current state of the annotation components for this document
+ - the current value of a particular component can be accessed as `annotation.componentName` or `annotation['component name']` - the brackets version will always work, the dot version works if the component's `name` is a valid JavaScript identifier
+ - if a component has not been set since the form was last cleared the value may be `null` or `undefined` - the expression should be written to cope with both
+ - the value of a `text`, `textarea`, `radio` or `selector` component will be a single string (or null/undefined), the value of a `checkbox` component will be an _array_ of strings since more than one value may be selected. If no value is selected the array may be null, undefined or empty, the expression must be prepared to handle any of these
+- the `document` variable refers to the current document that is being annotated
+ - again properties of the document can be accessed as `document.propertyName` or `document['property name']`
+ - continue the same pattern for nested properties e.g. `document.scores.label1`
+ - individual elements of array properties can be accessed by zero-based index (e.g. `document.options[0]`)
+- various comparison operators are available:
+ - `==` and `!=` (equal and not-equal)
+ - `<`, `<=`, `>=`, `>` (less-than, less-or-equal, greater-or-equal, greater-than)
+ - these operators follow JavaScript rules, which are not always intuitive. Generally if both arguments are strings then they will be compared by lexicographic order, but if either argument is a number then the other one will also be converted to a number before comparing. So if the `score` component is set to the value "10" (a string of two digits) then `annotation.score < 5` would be _false_ (10 is converted to number and compared to 5) but `annotation.score < '5'` would be _true_ (the string "10" sorts before the string "5")
+ - `in` checks for the presence of an item in an array or a key in an object
+ - e.g. `'other' in annotation.someCheckbox` checks if the `other` option has been ticked in a checkbox component (whose value is an array)
+ - this is different from normal JavaScript rules, where `i in myArray` checks for the presence of an array _index_ rather than an array _item_
+- other operators
+ - `+` (concatenate strings, or add numbers)
+ - if either argument is a string then both sides are converted to strings and concatenated together
+ - otherwise both sides are treated as numbers and added
+ - `-`, `*`, `/`, `%` (subtraction, multiplication, division and remainder)
+ - `&&`, `||` (boolean AND and OR)
+ - `!` (prefix boolean NOT, e.g. `!annotation.selected` is true if `selected` is false/null/undefined and false otherwise)
+ - conditional operator `expr ? valueIfTrue : valueIfFalse` (exactly as in JavaScript, first evaluates the test `expr`, then either the `valueIfTrue` or `valueIfFalse` depending on the outcome of the test)
+- `value =~ /regex/` tests whether the given string value contains any matches for the given [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions#writing_a_regular_expression_pattern)
+ - use `^` and/or `$` to anchor the match to the start and/or end of the value, for example `annotation.example =~ /^a/i` checks whether the `example` annotation value _starts with_ "a" or "A" (the `/i` flag makes the expression case-insensitive)
+ - since the project configuration is entered as JSON, any backslash characters within the regex must be doubled to escape them from the JSON parser, i.e. `"if": "annotation.option =~ /\\s/"` would check if `option` contains any space characters (for which the regular expression literal is `/\s/`)
+- _Quantifier_ expressions let you check whether `any` or `all` of the items in an array or key/value pairs in an object match a predicate expression. The general form is `any(x in expr, predicate)` or `all(x in expr, predicate)`, where `expr` is an expression that resolves to an array or object value, `x` is a new identifier, and `predicate` is the expression to test each item against. The `predicate` expression can refer to the `x` identifier
+ - `any(option in annotation.someCheckbox, option > 3)`
+ - `all(e in document.scores, e.value < 0.7)` (assuming `scores` is an object mapping labels to scores, e.g. `{"scores": {"positive": 0.5, "negative": 0.3}}`)
+ - when testing a predicate against an _object_ each entry has `.key` and `.value` properties giving the key and value of the current entry
+ - on a null, undefined or empty array/object, `any` will return _false_ (since there are no items that pass the test) and `all` will return _true_ (since there are no items that _fail_ the test)
+ - the predicate is optional - `any(arrayExpression)` resolves to `true` if any item in the array has a value that JavaScript considers to be "truthy", i.e. anything other than the number 0, the empty string, null or undefined. So `any(annotation.myCheckbox)` is a convenient way to check whether _at least one_ option has been selected in a `checkbox` component.
+
+If the `if` expression for a particular component is _syntactically invalid_ (missing operands, mis-matched brackets, etc.) then the condition will be ignored and the component will always be displayed as though it did not have an `if` expression at all. Conversely, if the expression is valid but an error occurs while _evaluating_ it, this will be treated the same as if the expression returned `false`, and the associated component will not be displayed. The behaviour is this way around as the most common reason for errors during evaluation is attempting to refer to annotation components that have not yet been filled in - if this is not appropriate in your use case you must account for the possibility within your expression. For example, suppose `confidence` is a `radio` or `selector` component with values ranging from 1 to 5, then another component that declares
+
+```
+"if": "annotation.confidence && annotation.confidence < 4"`
+```
+
+will hide this component if `confidence` is unset, displaying it only if `confidence` is set to a value less than 4, whereas
+
+```
+"if": "!annotation.confidence || annotation.confidence < 4"
+```
+
+will hide this component only if `confidence` is actually _set_ to a value of 4 or greater - it will _show_ this component if `confidence` is unset. Either approach may be correct depending on your project's requirements.
+
+To assist managers in authoring project configurations with `if` conditions, the "preview" mode on the project configuration page will display details of any errors that occur when parsing the expressions, or when evaluating them against the **Document input preview** data. You are encouraged to test your expressions thoroughly against a variety of inputs to ensure they behave as intended, before opening your project to annotators.
+
+
diff --git a/docs/versioned/2.3.0/manageradminguide/project_management.md b/docs/versioned/2.3.0/manageradminguide/project_management.md
new file mode 100644
index 00000000..f1fd0cfe
--- /dev/null
+++ b/docs/versioned/2.3.0/manageradminguide/project_management.md
@@ -0,0 +1,38 @@
+# Annotation Project Management
+
+## Project Listing
+Clicking on the `Projects` link in the top navigation bar takes you to a contains a list of existing
+projects. The project names are shown along with their summaries. Clicking on a project name will
+take you to the project management page.
+
+
+## Project Management Page
+
+The project management page contains all the functionalities to manage an annotation project. The page
+is composed of three main tabs:
+
+* [Configuration](project_config.md) - Configure project settings including what annotations are captured.
+* [Documents & Annotation](documents_annotations_management.md) - Manage documents and annotations. Upload documents, see contents of a document's annotations and import/export documents.
+* [Annotators](annotators_management.md) - Manage the recruitment of annotators.
+
+::: warning
+
+Annotators can only be recruited to an annotation project after it has been configured and documents
+are uploaded to the project.
+
+:::
+
+
+## Project status icons
+In the **Project listing** and **Project management page**, icon badges are used to provide a quick overview of the project's status:
+
+*
1 - Number of completed annotations in the project.
+*
1 - Number of rejected annotations in the project.
+*
1 - Number of timed out annotations in the project.
+*
1 - Number of aborted annotations in the project.
+*
1 - Number of pending annotations in the project.
+*
2/60 - Number of occupied annotation tasks over number of total tasks in the project.
+*
20/5/10 - Number of documents, training documents and test documents in the project.
+*
1 - Number of annotators recruited in the project. Annotators are removed from the project when they have completed all annotation tasks in their quota.
+
+
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 0ebd3b25..3fa72605 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -13,28 +13,28 @@
"@jsep-plugin/regex": "^1.0.3",
"@jsep-plugin/spread": "^1.0.2",
"@vitejs/plugin-vue2": "^2.2.0",
- "axios": "^0.21.1",
- "bootstrap": "^4.6.0",
- "bootstrap-vue": "^2.21.2",
+ "axios": "^1.7.7",
+ "bootstrap": "^4.6.2",
+ "bootstrap-vue": "^2.23.1",
"chart.js": "^4.2.1",
"core-js": "^3.6.5",
- "css-loader": "^5.2.1",
+ "css-loader": "^7.1.2",
"csvtojson": "^2.0.10",
"js-cookie": "^2.2.1",
"jse-eval": "^1.5.2",
"jsonl-parse-stringify": "^1.0.1",
- "jszip": "^3.7.1",
+ "jszip": "^3.10.1",
"lodash": "^4.17.21",
"markdown-it-vue": "^1.1.7",
"mustache": "^4.2.0",
- "sass": "^1.32.8",
- "sass-loader": "^10.1.1",
- "style-loader": "^2.0.0",
- "v-jsoneditor": "^1.4.2",
- "vite": "^4.5.2",
+ "sass": "^1.80.6",
+ "sass-loader": "^16.0.3",
+ "style-loader": "^4.0.0",
+ "v-jsoneditor": "^1.4.5",
+ "vite": "^4.5.5",
"vue": "^2.7.16",
- "vue-chartjs": "^5.2.0",
- "vue-json-pretty": "^1.8.0",
+ "vue-chartjs": "^5.3.2",
+ "vue-json-pretty": "^1.9.5",
"vue-router": "^3.6.5",
"vue-template-compiler": "^2.7.16",
"vuex": "^3.6.2"
@@ -805,6 +805,288 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
+ "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.0",
+ "@parcel/watcher-darwin-arm64": "2.5.0",
+ "@parcel/watcher-darwin-x64": "2.5.0",
+ "@parcel/watcher-freebsd-x64": "2.5.0",
+ "@parcel/watcher-linux-arm-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm-musl": "2.5.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm64-musl": "2.5.0",
+ "@parcel/watcher-linux-x64-glibc": "2.5.0",
+ "@parcel/watcher-linux-x64-musl": "2.5.0",
+ "@parcel/watcher-win32-arm64": "2.5.0",
+ "@parcel/watcher-win32-ia32": "2.5.0",
+ "@parcel/watcher-win32-x64": "2.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+ "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+ "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+ "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+ "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+ "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+ "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+ "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+ "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+ "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+ "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+ "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+ "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+ "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -936,7 +1218,8 @@
"node_modules/@types/json-schema": {
"version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
- "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "peer": true
},
"node_modules/@types/node": {
"version": "18.15.11",
@@ -1460,6 +1743,7 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peer": true,
"peerDependencies": {
"ajv": "^6.9.1"
}
@@ -1511,18 +1795,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/arch": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
@@ -1602,8 +1874,7 @@
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/at-least-node": {
"version": "1.0.0",
@@ -1642,13 +1913,33 @@
"dev": true
},
"node_modules/axios": {
- "version": "0.21.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
- "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"dependencies": {
- "follow-redirects": "^1.14.0"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
+ "node_modules/axios/node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1684,22 +1975,6 @@
"tweetnacl": "^0.14.3"
}
},
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/blob-util": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
@@ -1754,11 +2029,12 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "optional": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -1947,29 +2223,17 @@
}
},
"node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
+ "readdirp": "^4.0.1"
},
"engines": {
- "node": ">= 8.10.0"
+ "node": ">= 14.16.0"
},
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/chrome-trace-event": {
@@ -2082,7 +2346,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -2175,30 +2438,37 @@
}
},
"node_modules/css-loader": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz",
- "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz",
+ "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
"dependencies": {
"icss-utils": "^5.1.0",
- "loader-utils": "^2.0.0",
- "postcss": "^8.2.15",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.0",
- "postcss-modules-scope": "^3.0.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
"postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.1.0",
- "schema-utils": "^3.0.0",
- "semver": "^7.3.5"
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "webpack": "^4.27.0 || ^5.0.0"
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.27.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
}
},
"node_modules/cssesc": {
@@ -3250,11 +3520,22 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
"engines": {
"node": ">=0.4.0"
}
},
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/diff-sequences": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
@@ -3377,14 +3658,6 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "engines": {
- "node": ">= 4"
- }
- },
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -3750,9 +4023,10 @@
}
},
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "optional": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -3772,9 +4046,9 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
@@ -3956,17 +4230,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
@@ -4317,17 +4580,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@@ -4402,6 +4654,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "optional": true,
"engines": {
"node": ">=0.10.0"
}
@@ -4419,6 +4672,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "optional": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -4455,6 +4709,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "optional": true,
"engines": {
"node": ">=0.12.0"
}
@@ -4928,17 +5183,6 @@
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true
},
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/jsonc-parser": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
@@ -5049,14 +5293,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/lazy-ass": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
@@ -5133,19 +5369,6 @@
"node": ">=6.11.5"
}
},
- "node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
"node_modules/local-pkg": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
@@ -5480,6 +5703,19 @@
"stylis": "^4.0.10"
}
},
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "optional": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -5587,6 +5823,12 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "optional": true
+ },
"node_modules/node-fetch": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
@@ -5646,14 +5888,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -5857,6 +6091,7 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "optional": true,
"engines": {
"node": ">=8.6"
},
@@ -5935,9 +6170,9 @@
}
},
"node_modules/postcss-modules-extract-imports": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
"engines": {
"node": "^10 || ^12 || >= 14"
},
@@ -5946,9 +6181,9 @@
}
},
"node_modules/postcss-modules-local-by-default": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
- "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz",
+ "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==",
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^6.0.2",
@@ -5962,9 +6197,9 @@
}
},
"node_modules/postcss-modules-scope": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
- "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz",
+ "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==",
"dependencies": {
"postcss-selector-parser": "^6.0.4"
},
@@ -5990,9 +6225,9 @@
}
},
"node_modules/postcss-selector-parser": {
- "version": "6.0.11",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
- "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -6204,14 +6439,15 @@
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
"engines": {
- "node": ">=8.10.0"
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/regenerator-runtime": {
@@ -6331,11 +6567,11 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sass": {
- "version": "1.60.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz",
- "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==",
+ "version": "1.80.6",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.6.tgz",
+ "integrity": "sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==",
"dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
+ "chokidar": "^4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
},
@@ -6343,35 +6579,35 @@
"sass": "sass.js"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
}
},
"node_modules/sass-loader": {
- "version": "10.4.1",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.4.1.tgz",
- "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==",
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz",
+ "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==",
"dependencies": {
- "klona": "^2.0.4",
- "loader-utils": "^2.0.0",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.0.0",
- "semver": "^7.3.2"
+ "neo-async": "^2.6.2"
},
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@rspack/core": "0.x || 1.x",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"sass": "^1.3.0",
- "webpack": "^4.36.0 || ^5.0.0"
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
},
"peerDependenciesMeta": {
- "fibers": {
+ "@rspack/core": {
"optional": true
},
"node-sass": {
@@ -6379,6 +6615,12 @@
},
"sass": {
"optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
}
}
},
@@ -6400,6 +6642,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "peer": true,
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
@@ -6666,22 +6909,18 @@
}
},
"node_modules/style-loader": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
- "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- },
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz",
+ "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==",
"engines": {
- "node": ">= 10.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
+ "webpack": "^5.27.0"
}
},
"node_modules/stylis": {
@@ -6835,6 +7074,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "optional": true,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -7086,9 +7326,9 @@
"dev": true
},
"node_modules/vite": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
- "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz",
+ "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==",
"dependencies": {
"esbuild": "^0.18.10",
"postcss": "^8.4.27",
@@ -7625,9 +7865,9 @@
}
},
"node_modules/vue-chartjs": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.2.0.tgz",
- "integrity": "sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz",
+ "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==",
"peerDependencies": {
"chart.js": "^4.1.1",
"vue": "^3.0.0-0 || ^2.7.0"
@@ -7639,9 +7879,9 @@
"integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA=="
},
"node_modules/vue-json-pretty": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-1.9.4.tgz",
- "integrity": "sha512-u4qffBCx6yW4SH3avUfRmLc1fHzF/UhYDnTThTjsfVl7jbUtvmog3OaB8kDzGqvKboJnbBnPSL5RBwzbZ4ZMLA==",
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-1.9.5.tgz",
+ "integrity": "sha512-fwbiH/ky/raX1D4MXRZZLFeKm157e9AkumMD7Y+djdLU1Sb0Tp5q2iOPvCnkWNzRpUfxx/zUjONUG+MIWsqx/w==",
"engines": {
"node": ">= 10.0.0",
"npm": ">= 5.0.0"
diff --git a/frontend/package.json b/frontend/package.json
index f2e48fb3..7a34a3e9 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -18,28 +18,28 @@
"@jsep-plugin/regex": "^1.0.3",
"@jsep-plugin/spread": "^1.0.2",
"@vitejs/plugin-vue2": "^2.2.0",
- "axios": "^0.21.1",
- "bootstrap": "^4.6.0",
- "bootstrap-vue": "^2.21.2",
+ "axios": "^1.7.7",
+ "bootstrap": "^4.6.2",
+ "bootstrap-vue": "^2.23.1",
"chart.js": "^4.2.1",
"core-js": "^3.6.5",
- "css-loader": "^5.2.1",
+ "css-loader": "^7.1.2",
"csvtojson": "^2.0.10",
"js-cookie": "^2.2.1",
"jse-eval": "^1.5.2",
"jsonl-parse-stringify": "^1.0.1",
- "jszip": "^3.7.1",
+ "jszip": "^3.10.1",
"lodash": "^4.17.21",
"markdown-it-vue": "^1.1.7",
"mustache": "^4.2.0",
- "sass": "^1.32.8",
- "sass-loader": "^10.1.1",
- "style-loader": "^2.0.0",
- "v-jsoneditor": "^1.4.2",
- "vite": "^4.5.2",
+ "sass": "^1.80.6",
+ "sass-loader": "^16.0.3",
+ "style-loader": "^4.0.0",
+ "v-jsoneditor": "^1.4.5",
+ "vite": "^4.5.5",
"vue": "^2.7.16",
- "vue-chartjs": "^5.2.0",
- "vue-json-pretty": "^1.8.0",
+ "vue-chartjs": "^5.3.2",
+ "vue-json-pretty": "^1.9.5",
"vue-router": "^3.6.5",
"vue-template-compiler": "^2.7.16",
"vuex": "^3.6.2"
diff --git a/frontend/src/assets/sass/app.scss b/frontend/src/assets/sass/app.scss
index b5816030..3cb81c71 100644
--- a/frontend/src/assets/sass/app.scss
+++ b/frontend/src/assets/sass/app.scss
@@ -1,4 +1,4 @@
-//@import 'node_modules/bootstrap/scss/bootstrap';
+@import '../../../node_modules/bootstrap/scss/bootstrap';
body {
background: #fff;
@@ -28,6 +28,17 @@ legend {
}
+ // convenient spacing classes for checkboxes/radios that have an htmlLabel - the effect
+ // of putting a class='tw-space-below-4' on something inside the htmlLabel of an option
+ // is equivalent to putting 'mb-4' on the option div itself.
+ @each $size, $length in $spacers {
+ @each $dir, $edge in (above:top, below:bottom) {
+ :is(.custom-checkbox, .custom-radio):has(.tw-space-#{$dir}-#{$size}) {
+ margin-#{$edge}: $length;
+ }
+ }
+ }
+
}
.data-bg {
diff --git a/frontend/src/components/JsonEditor.vue b/frontend/src/components/JsonEditor.vue
index 809ed73a..e3b066c2 100644
--- a/frontend/src/components/JsonEditor.vue
+++ b/frontend/src/components/JsonEditor.vue
@@ -100,6 +100,7 @@ export default {
"type:": "object",
"properties": {
"label": {"type": "string"},
+ "htmlLabel": {"type": "string"},
"value": {
"anyOf": [
{"type": "string"},
@@ -108,7 +109,10 @@ export default {
]
}
},
- "required": ["label", "value"]
+ "oneOf":[
+ {"required": ["label", "value"]},
+ {"required": ["htmlLabel", "value"]}
+ ]
},
{
"type": "object",
diff --git a/frontend/src/components/annotation/CheckboxInput.vue b/frontend/src/components/annotation/CheckboxInput.vue
index 75cf2c41..33302cba 100644
--- a/frontend/src/components/annotation/CheckboxInput.vue
+++ b/frontend/src/components/annotation/CheckboxInput.vue
@@ -13,7 +13,8 @@
:state="state"
v-for="(option, idx) in options"
>
- {{ option.text }}
+
+
{{ option.text }}
@@ -50,5 +51,12 @@ name: "CheckboxInput",
diff --git a/frontend/src/components/annotation/RadioInput.vue b/frontend/src/components/annotation/RadioInput.vue
index bed7dc23..87594591 100644
--- a/frontend/src/components/annotation/RadioInput.vue
+++ b/frontend/src/components/annotation/RadioInput.vue
@@ -11,7 +11,8 @@
:inline="config.orientation!=='vertical'"
:name="config.name"
>
- {{ option.text }}
+
+
{{ option.text }}
@@ -47,4 +48,12 @@ export default {
diff --git a/frontend/src/main.js b/frontend/src/main.js
index b4597dd5..3b6795e5 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -14,16 +14,14 @@ import VJsoneditor from 'v-jsoneditor'
import MarkdownItVue from 'markdown-it-vue'
-
-// Import Bootstrap an BootstrapVue CSS files (order is important)
-import 'bootstrap/dist/css/bootstrap.css'
-import 'bootstrap-vue/dist/bootstrap-vue.css'
-
-
//Importing scss assets needs an @/ in front of it
import "@/assets/sass/app.scss"
+// Import Bootstrap an BootstrapVue CSS files (after app.scss, which includes bootstrap)
+import 'bootstrap-vue/dist/bootstrap-vue.css'
+
+
Vue.use(BootstrapVue)
Vue.use(BootstrapVueIcons)
diff --git a/frontend/src/utils/annotations.js b/frontend/src/utils/annotations.js
index 10176d26..e42fde51 100644
--- a/frontend/src/utils/annotations.js
+++ b/frontend/src/utils/annotations.js
@@ -67,6 +67,7 @@ export function generateBVOptions(options, document) {
} else if ("value" in option) {
optionsList.push({
value: option.value,
+ html: ("htmlLabel" in option ? option.htmlLabel : null),
text: ("label" in option ? option.label : option.value),
helptext: ("helptext" in option ? option.helptext : null),
})
diff --git a/frontend/tests/component/AnnotationRenderer.cy.js b/frontend/tests/component/AnnotationRenderer.cy.js
index 4294d357..6e5b54a3 100644
--- a/frontend/tests/component/AnnotationRenderer.cy.js
+++ b/frontend/tests/component/AnnotationRenderer.cy.js
@@ -244,6 +244,27 @@ describe("AnnotationRenderer", () => {
})
+ it("htmlLabel wins over label if both are provided", () => {
+ const annotationComps = [
+ {
+ name: "sentiment",
+ type: "checkbox",
+ options: [
+ {value: "positive", label: "+ve", htmlLabel: "
Positive"},
+ {value: "neutral", label: "meh..."},
+ {value: "negative", label: "-ve", htmlLabel: "
Negative"},
+ ],
+ }]
+
+ cy.mount(AnnotationRenderer, {propsData: {config: annotationComps}})
+
+ // the HTML label for (i.e. next sibling of) the positive option should be visible.
+ cy.get("[name='sentiment'][value='positive'] + label").contains("Positive").should("exist")
+ // but the text label should not
+ cy.get("[name='sentiment'][value='positive'] + label").contains("+ve").should("not.exist")
+
+ })
+
})
it('Test dynamic options fromDocument', () => {
diff --git a/package.json b/package.json
index 940daf3b..ff85aa5b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gate-teamware",
- "version": "2.2.0",
+ "version": "2.3.0",
"description": "A service for collaborative document annotation.",
"main": "index.js",
"scripts": {
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 9bb8af2d..d0d26b56 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,3 +1,3 @@
-pytest-django>=4.2.0,<5.*
+pytest-django>=4.2.0,<5
pytest-cov~=3.0.0
requests-mock~=1.10.0
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 5dc77b1a..b28871b6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
-gatenlp[formats]>=1.0.4,<2.*
-Django>=3.2,<4.*
+gatenlp[formats]>=1.0.4,<2
+Django>=3.2,<4
django-gmailapi-backend
-django-webpack-loader>=0.7.0,<1.*
-djangorestframework>=3.12.4,<4.*
-psycopg2>=2.8.6,<3.*
\ No newline at end of file
+django-webpack-loader>=0.7.0,<1
+djangorestframework>=3.12.4,<4
+psycopg2>=2.8.6,<3
\ No newline at end of file