/* * Utility CLASS to define model configurations * */ import i18n from "@/i18n"; // TODO this needs rethought and simplified // maybe a function that returns a single dictionary based on action? export class Models { // Arrays correspond to ORDERED list of parameters required by ApiApiFactory // Inner arrays are used to construct a dictionary of key:value pairs // MODEL configurations will override MODEL_TYPE configurations with will override ACTION configurations // MODEL_TYPES - inherited by MODELS, inherits and takes precedence over ACTIONS static TREE = { 'list': { 'params': ['query', 'root', 'tree', 'page', 'pageSize'], 'config': { 'root': { 'default': { 'function': 'CONDITIONAL', 'check': 'query', 'operator': 'not_exist', 'true': 0, 'false': undefined } }, 'tree': {'default': undefined}, }, }, 'delete': { "form": { 'instruction': { 'form_field': true, 'type': 'instruction', 'function': 'translate', 'phrase': "del_confimation_tree", 'params': [ { 'token': 'source', 'from': 'item1', 'attribute': "name" } ] } } }, 'move': { 'form': { 'target': { 'form_field': true, 'type': 'lookup', 'field': 'target', 'list': 'self', 'sticky_options': [{'id': 0, 'name': i18n.t('tree_root')}] } } } } // MODELS - inherits and takes precedence over MODEL_TYPES and ACTIONS static FOOD = { 'name': i18n.t('Food'), // *OPTIONAL* : parameters will be built model -> model_type -> default 'apiName': 'Food', // *REQUIRED* : the name that is used in api.ts for this model 'model_type': this.TREE, // *OPTIONAL* : model specific params for api, if not present will attempt modeltype_create then default_create 'paginated': true, 'move': true, 'merge': true, 'badges': { 'linked_recipe': true, }, 'tags': [{'field': 'supermarket_category', 'label': 'name', 'color': 'info'}], // REQUIRED: unordered array of fields that can be set during create 'create': { // if not defined partialUpdate will use the same parameters, prepending 'id' 'params': [['name', 'description', 'recipe', 'ignore_shopping', 'supermarket_category']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' }, 'recipe': { 'form_field': true, 'type': 'lookup', 'field': 'recipe', 'list': 'RECIPE', 'label': i18n.t('Recipe') }, 'shopping': { 'form_field': true, 'type': 'checkbox', 'field': 'ignore_shopping', 'label': i18n.t('Ignore_Shopping') }, 'shopping_category': { 'form_field': true, 'type': 'lookup', 'field': 'supermarket_category', 'list': 'SHOPPING_CATEGORY', 'label': i18n.t('Shopping_Category'), 'allow_create': true }, } }, } static KEYWORD = { 'name': i18n.t('Keyword'), // *OPTIONAL: parameters will be built model -> model_type -> default 'apiName': 'Keyword', 'model_type': this.TREE, 'paginated': true, 'move': true, 'merge': true, 'badges': { 'icon': true }, 'create': { // if not defined partialUpdate will use the same parameters, prepending 'id' 'params': [['name', 'description', 'icon']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' }, 'icon': { 'form_field': true, 'type': 'emoji', 'field': 'icon', 'label': i18n.t('Icon') }, } }, } static UNIT = { 'name': i18n.t('Unit'), 'apiName': 'Unit', 'paginated': true, 'create': { 'params': [['name', 'description']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' } } }, 'merge': true } static SHOPPING_LIST = { 'name': i18n.t('Shopping_list'), 'apiName': 'ShoppingListEntry', } static RECIPE_BOOK = { 'name': i18n.t('Recipe_Book'), 'apiName': 'RecipeBook', 'create': { 'params': [['name', 'description', 'icon']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' }, 'icon': { 'form_field': true, 'type': 'emoji', 'field': 'icon', 'label': i18n.t('Icon') }, } }, } static SHOPPING_CATEGORY = { 'name': i18n.t('Shopping_Category'), 'apiName': 'SupermarketCategory', 'create': { 'params': [['name', 'description']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' } } }, } static SHOPPING_CATEGORY_RELATION = { 'name': i18n.t('Shopping_Category_Relation'), 'apiName': 'SupermarketCategoryRelation', 'create': { 'params': [['category', 'supermarket', 'order']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' } } }, } static SUPERMARKET = { 'name': i18n.t('Supermarket'), 'apiName': 'Supermarket', 'ordered_tags': [{'field': 'category_to_supermarket', 'label': 'category::name', 'color': 'info'}], 'create': { 'params': [['name', 'description', 'category_to_supermarket']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' }, 'categories': { 'form_field': true, 'type': 'lookup', 'list': 'SHOPPING_CATEGORY', 'list_label': 'category::name', 'ordered': true, // ordered lookups assume working with relation field 'field': 'category_to_supermarket', 'label': i18n.t('Categories'), 'placeholder': '' }, }, 'config': { 'function': 'SupermarketWithCategories', } }, 'partialUpdate': { 'config': { 'function': 'SupermarketWithCategories', } } } static AUTOMATION = { 'name': i18n.t('Automation'), 'apiName': 'Automation', 'paginated': true, 'create': { 'params': [['name', 'description', 'type', 'param_1', 'param_2', 'param_3']], 'form': { 'name': { 'form_field': true, 'type': 'text', 'field': 'name', 'label': i18n.t('Name'), 'placeholder': '' }, 'description': { 'form_field': true, 'type': 'text', 'field': 'description', 'label': i18n.t('Description'), 'placeholder': '' }, 'type': { 'form_field': true, 'type': 'choice', 'options': [ {value: 'FOOD_ALIAS', text: i18n.t('Food_Alias')}, {value: 'UNIT_ALIAS', text: i18n.t('Unit_Alias')}, {value: 'KEYWORD_ALIAS', text: i18n.t('Keyword_Alias')}, ], 'field': 'type', 'label': i18n.t('Type'), 'placeholder': '' }, 'param_1': { 'form_field': true, 'type': 'text', 'field': 'param_1', 'label': i18n.t('Parameter') + ' 1', 'placeholder': '' }, 'param_2': { 'form_field': true, 'type': 'text', 'field': 'param_2', 'label': i18n.t('Parameter') + ' 2', 'placeholder': '' }, 'param_3': { 'form_field': true, 'type': 'text', 'field': 'param_3', 'label': i18n.t('Parameter') + ' 3', 'placeholder': '' }, } }, } static RECIPE = { 'name': i18n.t('Recipe'), 'apiName': 'Recipe', 'list': { 'params': ['query', 'keywords', 'foods', 'units', 'rating', 'books', 'keywordsOr', 'foodsOr', 'booksOr', 'internal', 'random', '_new', 'page', 'pageSize', 'options'], 'config': { 'foods': {'type': 'string'}, 'keywords': {'type': 'string'}, 'books': {'type': 'string'}, } }, } static USER_NAME = { 'name': i18n.t('User'), 'apiName': 'User', 'list': { 'params': ['filter_list'], }, } static MEAL_TYPE = { 'name': i18n.t('Meal_Type'), 'apiName': 'MealType', 'list': { 'params': ['filter_list'], }, } static MEAL_PLAN = { 'name': i18n.t('Meal_Plan'), 'apiName': 'MealPlan', 'list': { 'params': ['options'], }, } } export class Actions { static CREATE = { "function": "create", 'form': { 'title': { 'function': 'translate', 'phrase': 'create_title', 'params': [ { 'token': 'type', 'from': 'model', 'attribute': 'name' } ], }, 'ok_label': i18n.t('Save'), } } static UPDATE = { "function": "partialUpdate", // special case for update only - updated assumes create form is sufficient, but a different title is required. "form_title": { 'function': 'translate', 'phrase': 'edit_title', 'params': [ { 'token': 'type', 'from': 'model', 'attribute': 'name' } ], }, } static DELETE = { "function": "destroy", 'params': ['id'], 'form': { 'title': { 'function': 'translate', 'phrase': 'delete_title', 'params': [ { 'token': 'type', 'from': 'model', 'attribute': 'name' } ], }, 'ok_label': i18n.t('Delete'), 'instruction': { 'form_field': true, 'type': 'instruction', 'label': { 'function': 'translate', 'phrase': "delete_confirmation", 'params': [ { 'token': 'source', 'from': 'item1', 'attribute': "name" } ] } } } } static FETCH = { "function": "retrieve", 'params': ['id'] } static LIST = { "function": "list", "suffix": "s", "params": ['query', 'page', 'pageSize'], "config": { 'query': {'default': undefined}, 'page': {'default': 1}, 'pageSize': {'default': 25} } } static MERGE = { "function": "merge", 'params': ['source', 'target'], "config": { 'source': {'type': 'string'}, 'target': {'type': 'string'} }, 'form': { 'title': { 'function': 'translate', 'phrase': 'merge_title', 'params': [ { 'token': 'type', 'from': 'model', 'attribute': 'name' } ], }, 'ok_label': i18n.t('Merge'), 'instruction': { 'form_field': true, 'type': 'instruction', 'label': { 'function': 'translate', 'phrase': "merge_selection", 'params': [ { 'token': 'source', 'from': 'item1', 'attribute': "name" }, { 'token': 'type', 'from': 'model', 'attribute': "name" }, ] } }, 'target': { 'form_field': true, 'type': 'lookup', 'field': 'target', 'list': 'self' } } } static MOVE = { "function": "move", 'params': ['source', 'target'], "config": { 'source': {'type': 'string'}, 'target': {'type': 'string'} }, 'form': { 'title': { 'function': 'translate', 'phrase': 'move_title', 'params': [ { 'token': 'type', 'from': 'model', 'attribute': 'name' } ], }, 'ok_label': i18n.t('Move'), 'instruction': { 'form_field': true, 'type': 'instruction', 'label': { 'function': 'translate', 'phrase': "move_selection", 'params': [ { 'token': 'source', 'from': 'item1', 'attribute': "name" }, { 'token': 'type', 'from': 'model', 'attribute': "name" }, ] } }, 'target': { 'form_field': true, 'type': 'lookup', 'field': 'target', 'list': 'self' } } } }