mirror of
https://github.com/misode/misode.github.io.git
synced 2026-04-23 15:17:09 +00:00
Add set, json, json-list, boundary types + catch errors on components
This commit is contained in:
@@ -64,3 +64,9 @@ textarea.invalid:focus {
|
||||
max-height: 300px;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
#source {
|
||||
white-space: pre;
|
||||
overflow-wrap: normal;
|
||||
overflow-x: scroll;
|
||||
}
|
||||
|
||||
38
index.html
38
index.html
@@ -132,7 +132,16 @@
|
||||
<span class="input-group-text rounded-0 range d-none" data-i18n="range.max"></span>
|
||||
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onfocus="this.select()">
|
||||
</div>
|
||||
<div data-type="boolean">
|
||||
<div class="input-group mt-3" data-type="boundary">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" data-name></span>
|
||||
</div>
|
||||
<span class="input-group-text rounded-0 range" data-i18n="range.min"></span>
|
||||
<input type="text" class="form-control range min" value="1" onchange="updateField(this)" onfocus="this.select()">
|
||||
<span class="input-group-text rounded-0 range" data-i18n="range.max"></span>
|
||||
<input type="text" class="form-control range max rounded-right" value="2" onchange="updateField(this)" onfocus="this.select()">
|
||||
</div>
|
||||
<div class="input-group mt-3" data-type="boolean">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" data-name></span>
|
||||
</div>
|
||||
@@ -141,6 +150,33 @@
|
||||
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)" data-i18n="true"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group mt-3" data-type="json">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" data-name></span>
|
||||
</div>
|
||||
<textarea type="text" class="form-control code" onchange="updateField(this)" onfocus="this.select()" style="height: 0px"></textarea>
|
||||
</div>
|
||||
<div class="input-group mt-3" data-type="json-list">
|
||||
<textarea class="form-control code" onchange="updateJsonListField(this)" rows=3></textarea>
|
||||
</div>
|
||||
<div class="input-group mt-3" data-type="error">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text text-danger" data-i18n="error"></span>
|
||||
</div>
|
||||
<input type="text" class="form-control bg-light text-danger" data-name readonly></input>
|
||||
</div>
|
||||
<div class="mt-3" data-type="set">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text" data-name></span>
|
||||
</div>
|
||||
<div class="input-group-append">
|
||||
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split rounded-right" data-toggle="dropdown"></button>
|
||||
<div class="dropdown-menu scrollable-menu">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="poolTemplate" class="card bg-success text-white mt-3 pool" data-field="pools[]">
|
||||
|
||||
38
model.js
38
model.js
@@ -185,6 +185,26 @@ function removeComponent(el) {
|
||||
}
|
||||
invalidated();
|
||||
}
|
||||
function addToSet(el, array) {
|
||||
let parent = getParent(el);
|
||||
if (!parent[array]) {
|
||||
parent[array] = [];
|
||||
}
|
||||
parent[array].push($(el).attr('value'));
|
||||
invalidated();
|
||||
}
|
||||
|
||||
function removeFromSet(el, array) {
|
||||
let parent = getParent(el);
|
||||
let index = parent[array].indexOf($(el).attr('value'));
|
||||
if (index > -1) {
|
||||
parent[array].splice(index, 1);
|
||||
if (parent[array].length === 0) {
|
||||
delete parent[array];
|
||||
}
|
||||
invalidated();
|
||||
}
|
||||
}
|
||||
|
||||
function updateField(el) {
|
||||
let $field = $(el).closest('[data-field]');
|
||||
@@ -217,6 +237,14 @@ function updateField(el) {
|
||||
}
|
||||
} else if (type === 'json') {
|
||||
value = parseJSONValue(value)
|
||||
} else if (type === 'json-list') {
|
||||
let value = [];
|
||||
for (let line of $(el).val().split('\n')) {
|
||||
value.push(parseJSONValue(line));
|
||||
}
|
||||
if (value.length === 0) {
|
||||
value = '';
|
||||
}
|
||||
} else if (type === 'range' || type === 'random') {
|
||||
value = getRangeValue($field, node[field]);
|
||||
} else if (type === 'checkbox') {
|
||||
@@ -406,16 +434,6 @@ function parseJSONValue(value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
function updateLoreField(el) {
|
||||
let lines = $(el).val().split('\n');
|
||||
let parent = getParent(el);
|
||||
parent.lore = [];
|
||||
for (let line of lines) {
|
||||
parent.lore.push(parseJSONValue(line));
|
||||
}
|
||||
invalidated();
|
||||
}
|
||||
|
||||
function addOperation(el) {
|
||||
let func = getParent(el);
|
||||
if (!func.ops) {
|
||||
|
||||
@@ -161,7 +161,8 @@
|
||||
"type": "random",
|
||||
"default": 2,
|
||||
"require": [
|
||||
"minecraft:set_count"
|
||||
"minecraft:set_count",
|
||||
"minecraft:looting_enchant"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -172,6 +173,137 @@
|
||||
"minecraft:set_damage"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "name",
|
||||
"type": "json",
|
||||
"require": [
|
||||
"minecraft:set_name"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "lore",
|
||||
"type": "json-list",
|
||||
"require": [
|
||||
"minecraft:set_lore"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "replace",
|
||||
"type": "boolean",
|
||||
"require": [
|
||||
"minecraft:set_lore"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "tag",
|
||||
"type": "string",
|
||||
"require": [
|
||||
"minecraft:set_nbt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "levels",
|
||||
"type": "random",
|
||||
"require": [
|
||||
"minecraft:enchant_with_levels"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "treasure",
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"require": [
|
||||
"minecraft:enchant_with_levels"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "limit",
|
||||
"type": "int",
|
||||
"require": [
|
||||
"minecraft:looting_enchant"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "limit",
|
||||
"type": "boundary",
|
||||
"require": [
|
||||
"minecraft:limit_count"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "entity",
|
||||
"type": "enum",
|
||||
"values": [
|
||||
"minecraft:this",
|
||||
"minecraft:killer",
|
||||
"minecraft:killer_player"
|
||||
],
|
||||
"require": [
|
||||
"minecraft:set_name",
|
||||
"minecraft:set_lore",
|
||||
"minecraft:fill_player_head"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "source",
|
||||
"type": "enum",
|
||||
"values": [
|
||||
"minecraft:block_entity",
|
||||
"minecraft:this",
|
||||
"minecraft:killer",
|
||||
"minecraft:killer_player"
|
||||
],
|
||||
"require": [
|
||||
"minecraft:copy_name",
|
||||
"minecraft:copy_nbt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "enchantments",
|
||||
"type": "set",
|
||||
"values": [
|
||||
"minecraft:aqua_affinity",
|
||||
"minecraft:bane_of_arthropods",
|
||||
"minecraft:blast_protection",
|
||||
"minecraft:channeling",
|
||||
"minecraft:binding_curse",
|
||||
"minecraft:vanishing_curse",
|
||||
"minecraft:depth_strider",
|
||||
"minecraft:efficiency",
|
||||
"minecraft:feather_falling",
|
||||
"minecraft:fire_aspect",
|
||||
"minecraft:fire_protection",
|
||||
"minecraft:flame",
|
||||
"minecraft:fortune",
|
||||
"minecraft:frost_walker",
|
||||
"minecraft:impaling",
|
||||
"minecraft:infinity",
|
||||
"minecraft:knockback",
|
||||
"minecraft:looting",
|
||||
"minecraft:loyalty",
|
||||
"minecraft:luck_of_the_sea",
|
||||
"minecraft:lure",
|
||||
"minecraft:mending",
|
||||
"minecraft:multishot",
|
||||
"minecraft:piercing",
|
||||
"minecraft:power",
|
||||
"minecraft:projectile_protection",
|
||||
"minecraft:protection",
|
||||
"minecraft:punch",
|
||||
"minecraft:quick_charge",
|
||||
"minecraft:respiration",
|
||||
"minecraft:riptide",
|
||||
"minecraft:sharpness",
|
||||
"minecraft:silk_touch",
|
||||
"minecraft:smite",
|
||||
"minecraft:sweeping",
|
||||
"minecraft:thorns",
|
||||
"minecraft:unbreaking"
|
||||
],
|
||||
"require": [
|
||||
"minecraft:enchant_randomly"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "conditions",
|
||||
"type": "array",
|
||||
|
||||
101
view.js
101
view.js
@@ -41,13 +41,19 @@ function generateTable() {
|
||||
function generateComponent(data, struct) {
|
||||
switch (struct.type) {
|
||||
case 'string': return generateString(data, struct);
|
||||
case 'int': return generateString(data, struct);
|
||||
case 'float': return generateString(data, struct);
|
||||
case 'boolean': return generateBoolean(data, struct);
|
||||
case 'random': return generateRandom(data, struct);
|
||||
case 'range': return generateRange(data, struct);
|
||||
case 'boundary': return generateBoundary(data, struct);
|
||||
case 'enum': return generateEnum(data, struct);
|
||||
case 'set': return generateSet(data, struct);
|
||||
case 'json': return generateJson(data, struct);
|
||||
case 'json-list': return generateJsonList(data, struct);
|
||||
case 'array': return generateArray(data, struct);
|
||||
case 'object': return generateObject(data, struct);
|
||||
}
|
||||
default: return generateError('Unknown component type "' + struct.type + '"')};
|
||||
}
|
||||
|
||||
function generateString(data, struct) {
|
||||
@@ -106,6 +112,17 @@ function generateRange(data, struct) {
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateBoundary(data, struct) {
|
||||
let $el = $('#components').find('[data-type="boundary"]').clone();
|
||||
$el.attr('data-field', struct.id);
|
||||
$el.find('[data-name]').attr('data-i18n', struct.id);
|
||||
if (data) {
|
||||
$el.find('.range.min').val(data.min);
|
||||
$el.find('.range.max').val(data.max);
|
||||
}
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateEnum(data, struct) {
|
||||
let $el = $('#components').find('[data-type="enum"]').clone();
|
||||
$el.attr('data-field', struct.id);
|
||||
@@ -121,6 +138,65 @@ function generateEnum(data, struct) {
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateSet(data, struct) {
|
||||
let $el = $('#components').find('[data-type="set"]').clone();
|
||||
$el.attr('data-field', struct.id);
|
||||
$el.find('[data-name]').attr('data-i18n', struct.id);
|
||||
for (let option of struct.values) {
|
||||
$('<a class="dropdown-item" onclick="addToSet(this, \'' + struct.id + '\')" />').appendTo($el.find('.dropdown-menu')).attr('value', option).attr('data-i18n', struct.source + '.' + option);
|
||||
}
|
||||
if (data) {
|
||||
console.log(data);
|
||||
let $setContainer = $('<div/>');
|
||||
for (let option of data) {
|
||||
let $item = $('<button type="button" onclick="removeFromSet(this, \'' + struct.id + '\')" />').addClass('btn btn-outline-danger bg-light btn-sm mr-2 mt-2').attr('value', option).attr('data-i18n', struct.source + '.' + option);
|
||||
console.log($item);
|
||||
$setContainer.append($item);
|
||||
console.log($setContainer);
|
||||
}
|
||||
$el.append($setContainer);
|
||||
}
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateJson(data, struct) {
|
||||
let $el = $('#components').find('[data-type="json"]').clone();
|
||||
$el.attr('data-field', struct.id);
|
||||
$el.find('[data-name]').attr('data-i18n', struct.id);
|
||||
if (typeof data !== 'string') {
|
||||
data = JSON.stringify(data);
|
||||
}
|
||||
$el.find('textarea').val(data).keydown(e => preventNewline(e));
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateJsonList(data, struct) {
|
||||
let $el = $('#components').find('[data-type="json-list"]').clone();
|
||||
$el.attr('data-field', struct.id);
|
||||
$el.find('[data-name]').attr('data-i18n', struct.id);
|
||||
let jsonList = "";
|
||||
if (data) {
|
||||
for (let j = 0; j < data.length; j += 1) {
|
||||
let value = data[j];
|
||||
if (typeof value !== 'string') {
|
||||
value = JSON.stringify(value);
|
||||
}
|
||||
jsonList += value;
|
||||
if (j < data.length - 1) {
|
||||
jsonList += "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
$el.find('textarea').val(jsonList);
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateError(error) {
|
||||
let $el = $('#components').find('[data-type="error"]').clone();
|
||||
$el.find('[data-name]').val(error);
|
||||
return $el;
|
||||
}
|
||||
|
||||
function generateArray(data, struct) {
|
||||
if (!data || data.length === 0) {
|
||||
return undefined;
|
||||
@@ -149,7 +225,13 @@ function generateObject(data, struct) {
|
||||
}
|
||||
for (let field of struct.fields) {
|
||||
if ((luck_based || !field.luck_based) && (!field.require || (filter && field.require.includes(data[filter.id])))) {
|
||||
let $field = generateComponent(data[field.id], field);
|
||||
let $field;
|
||||
try {
|
||||
$field = generateComponent(data[field.id], field);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
$field = generateError('Failed generating "' + field.id + '" component');
|
||||
}
|
||||
if (field.type === 'array') {
|
||||
if (field.button === 'header') {
|
||||
let color = components.find(e => e.id === field.values).color;
|
||||
@@ -169,6 +251,14 @@ function generateObject(data, struct) {
|
||||
return $el;
|
||||
}
|
||||
|
||||
function preventNewline(e) {
|
||||
console.log('ahahahah!!!')
|
||||
if (e.which === 13) {
|
||||
$(e.target).trigger('change');
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
function generatePool(pool, i) {
|
||||
let $pool = $('#poolTemplate').clone();
|
||||
@@ -930,13 +1020,6 @@ function generateEnchantment(enchantment, i) {
|
||||
return $enchantment;
|
||||
}
|
||||
|
||||
function preventNewline(e) {
|
||||
if (e.which === 13) {
|
||||
$(e.target).trigger('change');
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
function generateRange($el, data) {
|
||||
if (typeof data === 'object') {
|
||||
if (data.type && data.type.match(/(minecraft:)?binomial/)) {
|
||||
|
||||
Reference in New Issue
Block a user