forked from root/public
![66307695+ZoeVig@users.noreply.github.com](/git/assets/img/avatar_default.png)
![GitHub](/git/assets/img/avatar_default.png)
1 changed files with 0 additions and 165 deletions
@ -1,165 +0,0 @@ |
|||||||
# Object Attributes System |
|
||||||
|
|
||||||
> This document cover two notions, the edition of attributes and the impact it has relatively to the others Objects. |
|
||||||
|
|
||||||
## Edition of Attributes |
|
||||||
|
|
||||||
> There is no limit to how many attributes can be defined to an Object. |
|
||||||
|
|
||||||
In the "Object Attributes" section of the "Object Edit" Page, the first row is a form to create and append a new attribute. It requires two elements, the name of the attribute and its type (`String`, `Number`, `Boolean`, `Array`, `Object`, `Function`, `Null`). Click 'Add' to create the attribute. |
|
||||||
|
|
||||||
> Within a same Object, each attribute's name must be unique. |
|
||||||
|
|
||||||
Once created, the new attributes appears right below and the ability to associate a value to it is now available. Depending on the type of the attribute, the interface will vary. |
|
||||||
|
|
||||||
- String value input is type String. |
|
||||||
- Number value input is type Number. |
|
||||||
- Booleans value input appears as a switch, true by default. |
|
||||||
- Arrays and Objects content are hidable / showable via the "Show/Hide content" button on the right of the attribute. There is no limit on the depth of Object/Array, however, after a certain level, the interface will start to feel narrow. |
|
||||||
- String value input is type String. |
|
||||||
- Null will not display any input. |
|
||||||
- Function will offer to select from all available functions, save on select. |
|
||||||
|
|
||||||
Any attribute can be delete by clicking on the 'trash' icon on the right hand of it. |
|
||||||
|
|
||||||
Here an example of how the section looks like. |
|
||||||
![object-attributes](img/object-attributes.png) |
|
||||||
|
|
||||||
## Attributes and RelationShips |
|
||||||
|
|
||||||
When an attributes is set to an Object, other Objects, associated to this particular Object, will have access to it. Which means that, if an Object A is added as a child of an Object B, A will embed its attributes within the instance of B. |
|
||||||
|
|
||||||
Object's attributes follow a hierarchy when associated to an other Object. |
|
||||||
The **defaults attributes** of a child, the ones defined in the original Object are the weakest ones. A **children attribute** is applied to all the children and override the default attributes. Finally, **relation attribute** is the strongest one, it override Default Attributes and Children Attributes. |
|
||||||
|
|
||||||
When an object and its relationship are resolved, the three structures (`attrs`, `childrenAttrs`, `childAttrs`) are merged. |
|
||||||
|
|
||||||
The following json shows how the object would be represented: |
|
||||||
|
|
||||||
```json |
|
||||||
{ |
|
||||||
"children": { |
|
||||||
"printalphabet": { |
|
||||||
"duration": 3600, |
|
||||||
"xp": 800, |
|
||||||
"isBonus": true |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
Children |
|
||||||
![children](img/children.png) |
|
||||||
|
|
||||||
Child |
|
||||||
![child-capture](img/child-capture.png) |
|
||||||
|
|
||||||
## Detailed example |
|
||||||
|
|
||||||
Let's create a few `exercises` objects |
|
||||||
|
|
||||||
> swap |
|
||||||
|
|
||||||
```js |
|
||||||
{ |
|
||||||
"id": 12344, |
|
||||||
"title": "swap", |
|
||||||
"attrs": { |
|
||||||
"language": "go", |
|
||||||
"duration": 7200 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
> printalphabet |
|
||||||
|
|
||||||
```js |
|
||||||
{ |
|
||||||
"id": 12345, |
|
||||||
"title": "printalphabet-v2", |
|
||||||
"attrs": { |
|
||||||
"language": "go", |
|
||||||
"duration": 3600 |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
We can now create a parent object that will reference them and link them. |
|
||||||
|
|
||||||
This allow you to specify the structuration of your pedagogical content. |
|
||||||
|
|
||||||
I'll make a quest that regroup those 2 exercises: |
|
||||||
|
|
||||||
> quest-03 |
|
||||||
|
|
||||||
```js |
|
||||||
{ |
|
||||||
"id": 12346, |
|
||||||
"title": "quest-03", |
|
||||||
"attrs": {}, |
|
||||||
"childrenAttrs": { |
|
||||||
"xp": 800, |
|
||||||
"duration": 4800, |
|
||||||
}, |
|
||||||
"children": { |
|
||||||
"printalphabet": { |
|
||||||
"ref": 12345, |
|
||||||
"index": 0, |
|
||||||
"attrs": { |
|
||||||
"duration": 7200 |
|
||||||
} |
|
||||||
}, |
|
||||||
"swap": { |
|
||||||
"ref": 12344, |
|
||||||
"index": 1, |
|
||||||
"attrs": {} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
All done, now when rendering an object, attributes are merged like so: |
|
||||||
|
|
||||||
> rendered quest object |
|
||||||
|
|
||||||
```js |
|
||||||
{ |
|
||||||
"id": 12346, |
|
||||||
"title": "quest-03", |
|
||||||
"attrs": {}, |
|
||||||
"children": { |
|
||||||
"printalphabet": { |
|
||||||
"ref": 12345, |
|
||||||
"index": 0, |
|
||||||
"attrs": { |
|
||||||
"language": "go", |
|
||||||
"xp": 800, |
|
||||||
"duration": 7200 |
|
||||||
} |
|
||||||
}, |
|
||||||
"swap": { |
|
||||||
"ref": 12344, |
|
||||||
"index": 1, |
|
||||||
"attrs": { |
|
||||||
"language": "go", |
|
||||||
"xp": 800, |
|
||||||
"duration": 4800 |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
First we apply the **default attributes** from the referenced object. |
|
||||||
|
|
||||||
> Here `duration` and `language` are applied. |
|
||||||
|
|
||||||
Then we apply the **children attributes** to every child. |
|
||||||
|
|
||||||
> In this case we override every `duration` to 4800 and add the new `xp` attribute. |
|
||||||
|
|
||||||
After that we apply the **relation attributes**, that are the most specific and as such, |
|
||||||
override all others attributes. |
|
||||||
|
|
||||||
> In this case only the `printalphabet` relation had attributes and so we apply |
|
||||||
> the given `duration` to the final merged object. |
|
Loading…
Reference in new issue