| 
24 | 24 |               <v-img  | 
25 | 25 |                 :src="geode_objects[key].image"  | 
26 | 26 |                 cover  | 
27 |  | -                :class="!value['is_loadable'] ? 'disabled' : ''"  | 
 | 27 | +                :class="!value['is_loadable'] ? 'disabled' : undefined"  | 
28 | 28 |               />  | 
29 | 29 |             </v-card>  | 
30 | 30 |           </span>  | 
 | 
66 | 66 |   const allowed_objects = ref({})  | 
67 | 67 |   const toggle_loading = useToggle(loading)  | 
68 | 68 | 
  | 
 | 69 | +  function select_geode_object(object_map) {  | 
 | 70 | +    const object_keys = Object.keys(object_map)  | 
 | 71 | +    if (!object_keys.length) {  | 
 | 72 | +      return undefined  | 
 | 73 | +    }  | 
 | 74 | +    if (  | 
 | 75 | +      object_keys.length === 1 &&  | 
 | 76 | +      object_map[object_keys[0]].is_loadable > 0  | 
 | 77 | +    ) {  | 
 | 78 | +      return object_keys[0]  | 
 | 79 | +    }  | 
 | 80 | +    const highest_load_score = Math.max(  | 
 | 81 | +      ...object_keys.map((key) => object_map[key].is_loadable),  | 
 | 82 | +    )  | 
 | 83 | +    if (highest_load_score <= 0) {  | 
 | 84 | +      return undefined  | 
 | 85 | +    }  | 
 | 86 | +    const best_score_objects = object_keys.filter(  | 
 | 87 | +      (key) => object_map[key].is_loadable === highest_load_score,  | 
 | 88 | +    )  | 
 | 89 | +    if (best_score_objects.length === 1) {  | 
 | 90 | +      return best_score_objects[0]  | 
 | 91 | +    }  | 
 | 92 | +    const highest_priority = Math.max(  | 
 | 93 | +      ...best_score_objects.map(  | 
 | 94 | +        (key) => object_map[key].object_priority ?? -Infinity,  | 
 | 95 | +      ),  | 
 | 96 | +    )  | 
 | 97 | +    const best_priority_objects = best_score_objects.filter(  | 
 | 98 | +      (key) => object_map[key].object_priority === highest_priority,  | 
 | 99 | +    )  | 
 | 100 | +    if (highest_priority !== -Infinity && best_priority_objects.length === 1) {  | 
 | 101 | +      return best_priority_objects[0]  | 
 | 102 | +    }  | 
 | 103 | +    return undefined  | 
 | 104 | +  }  | 
 | 105 | +
  | 
69 | 106 |   async function get_allowed_objects() {  | 
70 | 107 |     toggle_loading()  | 
71 | 108 |     allowed_objects.value = {}  | 
72 |  | -    var promise_array = []  | 
73 |  | -    for (const filename of filenames) {  | 
 | 109 | +    const promise_array = filenames.map((filename) => {  | 
74 | 110 |       const params = { filename, supported_feature }  | 
75 |  | -      const promise = api_fetch({ schema, params })  | 
76 |  | -      promise_array.push(promise)  | 
77 |  | -    }  | 
 | 111 | +      return api_fetch({ schema, params })  | 
 | 112 | +    })  | 
78 | 113 |     const responses = await Promise.all(promise_array)  | 
79 |  | -    let values = []  | 
80 |  | -    for (const response of responses) {  | 
81 |  | -      values.push(response.data.value.allowed_objects)  | 
82 |  | -    }  | 
83 |  | -    const all_keys = [...new Set(values.flatMap((value) => Object.keys(value)))]  | 
84 |  | -    const common_keys = all_keys.filter(  | 
85 |  | -      (i) => !values.some((j) => !Object.keys(j).includes(i)),  | 
 | 114 | +    const allowed_objects_list = responses.map(  | 
 | 115 | +      (response) => response.data.value.allowed_objects,  | 
 | 116 | +    )  | 
 | 117 | +    const all_keys = [...new Set(allowed_objects_list.flatMap(Object.keys))]  | 
 | 118 | +    const common_keys = all_keys.filter((key) =>  | 
 | 119 | +      allowed_objects_list.every((obj) => key in obj),  | 
86 | 120 |     )  | 
87 |  | -    var final_object = {}  | 
 | 121 | +    const final_object = {}  | 
88 | 122 |     for (const key of common_keys) {  | 
89 |  | -      for (const value of values) {  | 
90 |  | -        if (value[key].is_loadable == false) {  | 
91 |  | -          final_object[key] = { is_loadable: false }  | 
92 |  | -        } else {  | 
93 |  | -          final_object[key] = { is_loadable: true }  | 
94 |  | -        }  | 
 | 123 | +      const load_scores = allowed_objects_list.map(  | 
 | 124 | +        (obj) => obj[key].is_loadable,  | 
 | 125 | +      )  | 
 | 126 | +      const priorities = allowed_objects_list  | 
 | 127 | +        .map((obj) => obj[key].object_priority)  | 
 | 128 | +        .filter((p) => p !== undefined && p !== null)  | 
 | 129 | +      final_object[key] = { is_loadable: Math.min(...load_scores) }  | 
 | 130 | +      if (priorities.length) {  | 
 | 131 | +        final_object[key].object_priority = Math.max(...priorities)  | 
95 | 132 |       }  | 
96 | 133 |     }  | 
97 |  | -
  | 
98 | 134 |     allowed_objects.value = final_object  | 
99 |  | -    if (Object.keys(allowed_objects.value).length == 1) {  | 
100 |  | -      set_geode_object(Object.keys(allowed_objects.value)[0])  | 
 | 135 | +    const selected_object = select_geode_object(final_object)  | 
 | 136 | +    if (selected_object) {  | 
 | 137 | +      set_geode_object(selected_object)  | 
101 | 138 |     }  | 
102 | 139 |     toggle_loading()  | 
103 | 140 |   }  | 
104 | 141 | 
  | 
105 | 142 |   function set_geode_object(input_geode_object) {  | 
106 |  | -    if (input_geode_object != "") {  | 
 | 143 | +    if (input_geode_object) {  | 
107 | 144 |       emit("update_values", { input_geode_object })  | 
108 | 145 |       emit("increment_step")  | 
109 | 146 |     }  | 
 | 
0 commit comments