diff --git a/applications/system/js_app/modules/js_gui/js_gui.c b/applications/system/js_app/modules/js_gui/js_gui.c index 4bd4ccc31b..cd87e5c4bf 100644 --- a/applications/system/js_app/modules/js_gui/js_gui.c +++ b/applications/system/js_app/modules/js_gui/js_gui.c @@ -260,6 +260,26 @@ static void js_gui_view_set(struct mjs* mjs) { mjs_return(mjs, MJS_UNDEFINED); } +/** + * @brief `View.hasProperty` + */ +static void js_gui_view_has_property(struct mjs* mjs) { + const char* name; + JS_FETCH_ARGS_OR_RETURN(mjs, JS_EXACTLY, JS_ARG_STR(&name)); + JsGuiViewData* data = JS_GET_CONTEXT(mjs); + const JsViewDescriptor* descriptor = data->descriptor; + + for(size_t i = 0; i < descriptor->prop_cnt; i++) { + JsViewPropDescriptor prop = descriptor->props[i]; + if(strcmp(prop.name, name) != 0) continue; + + mjs_return(mjs, mjs_mk_boolean(mjs, true)); + return; + } + + mjs_return(mjs, mjs_mk_boolean(mjs, false)); +} + /** * @brief `View` destructor */ @@ -284,6 +304,7 @@ static mjs_val_t js_gui_make_view(struct mjs* mjs, const JsViewDescriptor* descr // generic view API mjs_val_t view_obj = mjs_mk_object(mjs); mjs_set(mjs, view_obj, "set", ~0, MJS_MK_FN(js_gui_view_set)); + mjs_set(mjs, view_obj, "hasProperty", ~0, MJS_MK_FN(js_gui_view_has_property)); // object data JsGuiViewData* data = malloc(sizeof(JsGuiViewData)); diff --git a/applications/system/js_app/types/gui/index.d.ts b/applications/system/js_app/types/gui/index.d.ts index 85f1910599..3e09822b55 100644 --- a/applications/system/js_app/types/gui/index.d.ts +++ b/applications/system/js_app/types/gui/index.d.ts @@ -4,6 +4,11 @@ type Properties = { [K: string]: any }; export declare class View { set

(property: P, value: Props[P]): void; + /** + * Check if property is available + * @param name Name of the property + */ + hasProperty(name: string): boolean; } export declare class ViewFactory> {