A dentist was not an employee of the practice where he worked but instead was an independent contractor, the California Court of Appeal held. The trial court was therefore correct in ruling against the dentist in his wage and hour suit, the appellate court concluded. https://goo.gl/hAb2aj #GlobalHR #HRTech
Budget Law Eases 401(k) Hardship Withdrawals
ICYDK: Hardship withdrawals from employer-sponsored 401(k)-type retirement plans will be easier to make under new provisions in the budget act passed Feb. 9. These distributions may be needed for emergencies, but plan participants should understand the effect of early withdrawals on their retirement savings over time. https://goo.gl/hGW7Zm #GlobalHR #HRTech
How to create a Custom Template in SAP Web IDE with OData Integration – Part 3
This blog post is part 3 of a series of blogs on how to create a Custom Template in SAP Web IDE with OData integration.
Prerequisites
Before reading this blog please make sure that you have read, understood and implemented part 2 of this series where I have shown how to create a feature project and add plugin template to the application.
Wizard Customization
Now we have to modify the model.json file for template attributes. And plugin.json for the wizard steps for our project.
In plugin.json, we have to provide “requires”: “services” as below:
Wizard Steps
Still in the plugin.json file, configure the “wizardSteps” as below:
Add our own customized Field in Wizard
To Add our own customized fields in wizard, we have to modify the model.json file.
In model.json we have a json structure called : basicSAPUI5ApplicationProject. Within this json structure we have another json structure named : parameters.
In parameters json structure , we can add or delete our customized json structures. Each json structure of parameter json , represent as a field in the wizard.
Let say, to represent namespace as a field in the wizard. We have to do the below code.
After completing the above code, now we have to go to the “forms” section of the model.json file and add the below code for namespace:
And when we try to execute the whole project, we will get wizard as below for name space:
Similarly , we have to add following json property in parameters json structure:
Json Property Name
Wizard Field Name
name1
First View Name
name2
Second View Name
ModelName
Data Source Name
AppTitle
Application Title
AppDescription
Application Description
Growing Threshold
Growing Threshold
Growing Trigger Text
Growing Trigger Text
OdataCollection
Entities
Object_Indentifier
Object Title
ObjectCollection_Key
Object Collection ID
Object_Number
Object Numeric Attribute
OdataCollectionCategory
Category
Object_IdentifierCategory
Category Title
We could get all the required json data structure in the mode.json , which in enclosed below section of the blog.
Template Image
Now we will add our own customized image for our template:
* Right-click the image folder under sapui5cart.
* Choose Import-> From File System.
* And import desired .png file.
* Open the plugin.json file and set the property of previewImage to the imported file name as below:
Below is the full code of model.json { “neoapp”: { “welcomeFile”: “/webapp/index.html”, “sendWelcomeFileRedirect”: true }, “entityTypes”: [], “datasource”: { “type”: “odata”, “url”: “”, “alias”: “” }, “basicSAPUI5ApplicationProject”: { “parameters”: { “ViewTypesCollection”: { “type”: “String”, “binding”: [{ “name”: “None”, “value”: “None” }, { “name”: “XML”, “value”: “XML” }, { “name”: “JSON”, “value”: “JSON” }, { “name”: “JavaScript”, “value”: “JS” }, { “name”: “HTML”, “value”: “HTML” }], “value”: “@basicSAPUI5ApplicationProject.parameters.ViewTypesCollection.binding.1”, “wizard”: { “control”: “ComboBox”, “required”: true, “title”: “basicSAPUI5ApplicationProject_view_type_title”, “tooltip”: “basicSAPUI5ApplicationProject_view_type_tooltip”, “sort”: “false” } }, “namespace”: { “type”: “string”, “value”: “”, “appDescriptor”: { “id”: “Namespace” }, “wizard”: { “control”: “TextField”, “required”: true, “title”: “basicSAPUI5ApplicationProject_namespace_title”, “regExp”: “(?!(sap|new(..*)*)$)^[a-zA-Z_][w-]*(.[a-zA-Z_][w-]*)*$”, “regExpErrMsg”: “nameSpace_model_parameters_name_validationError” } }, “name1”: { “type”: “string”, “value”: “View1”, “wizard”: { “control”: “TextField”, “required”: true, “title”: “First View Name”, “regExp”: “^[a-zA-Z_]+[a-zA-Z0-9-_]*$”, “regExpErrMsg”: “viewXML_model_parameters_name_validationError” } }, “name2”: { “type”: “string”, “value”: “View2”, “wizard”: { “control”: “TextField”, “required”: true, “title”: “Second View Name”, “regExp”: “^[a-zA-Z_]+[a-zA-Z0-9-_]*$”, “regExpErrMsg”: “viewXML_model_parameters_name_validationError” } }, “ModelName”: { “type”: “string”, “value”: “dataModel”, “wizard”: { “control”: “TextField”, “required”: true, “title”: “Data Source Name”, “regExp”: “^[a-zA-Z]*$”, “regExpErrMsg”: “datasourcename_validationError” } }, “AppTitle”: { “type”: “string”, “value”: “”, “appDescriptor”: { “id”: “sap.app.title” }, “wizard”: { “control”: “TextField”, “required”: true, “internalOnly”: “false”, “title”: “App Title”, “regExp”: “^[a-zA-Z]+[a-zA-Z0-9_ ]*$”, “regExpErrMsg”: “apptitle_validationError” } }, “AppDescription”: { “type”: “string”, “value”: “”, “appDescriptor”: { “id”: “sap.app.description” }, “wizard”: { “control”: “TextField”, “required”: false, “internalOnly”: “false”, “title”: “App Description”, “regExp”: “^[a-zA-Z]+[a-zA-Z0-9_ ]*$”, “regExpErrMsg”: “apptitle_validationError” } }, “ODataCollection”: { “type”: “Entity”, “multiplicity”: “many”, “isRoot”: “true”, “binding”: “@datasource.entities”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “true”, “title”: “Entities”, “tooltip”: “Entities” } }, “ODataCollectionCategory”: { “type”: “Entity”, “multiplicity”: “one”, “isRoot”: “true”, “binding”: “@datasource.entities”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “true”, “title”: “Category”, “tooltip”: “Category” } }, “Object_IdentifierCategory”: { “type”: “string”, “multiplicity”: “one”, “binding”: “@basicSAPUI5ApplicationProject.parameters.ODataCollectionCategory.value.elements”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “true”, “title”: “Category Title”, “tooltip”: “” } }, “Object_Identifier”: { “type”: “string”, “multiplicity”: “one”, “binding”: “@basicSAPUI5ApplicationProject.parameters.ODataCollection.value.elements”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “true”, “title”: “Object Title”, “tooltip”: “” } }, “ObjectCollection_Key”: { “type”: “Property.Key”, “multiplicity”: “one”, “binding”: “@basicSAPUI5ApplicationProject.parameters.ODataCollection.value.elements”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “true”, “title”: “Object Collection ID”, “tooltip”: “” } }, “Object_Number”: { “type”: “Property.Number”, “multiplicity”: “one”, “binding”: “@basicSAPUI5ApplicationProject.parameters.ODataCollection.value.elements”, “value”: “”, “wizard”: { “control”: “ComboBox”, “required”: “false”, “title”: “Object Numeric Attribute”, “tooltip”: “” } }, “GrowingThreshold”: { “type”: “int”, “value”: 3, “wizard”: { “control”: “TextField”, “required”: true, “internalOnly”: “false”, “title”: “Growing Threshold”, “regExp”: “^[0-9]*$”, “regExpErrMsg”: “growingthresold_validationError” } }, “GrowingTriggerText”: { “type”: “string”, “value”: “More”, “wizard”: { “control”: “TextField”, “required”: true, “internalOnly”: “false”, “title”: “Growing Trigger Text”, “regExp”: “^[a-zA-Z]*$”, “regExpErrMsg”: “growingtriggertext_validationError” } } }, “forms”: [{ “title”: “”, “type”: “templateCustomizationStep”, “groups”: [ { “title”: “emptyMobileProject_model_form_group_title”, “parameters”: [“@basicSAPUI5ApplicationProject.parameters.name1”, “@basicSAPUI5ApplicationProject.parameters.name2” ] }, { “title”: “Category Selection”, “parameters”: [ “@basicSAPUI5ApplicationProject.parameters.ODataCollectionCategory”, “@basicSAPUI5ApplicationProject.parameters.Object_IdentifierCategory” ]}, { “title”: “Technical”, “parameters”: [ “@basicSAPUI5ApplicationProject.parameters.ODataCollection”, “@basicSAPUI5ApplicationProject.parameters.Object_Identifier”, “@basicSAPUI5ApplicationProject.parameters.Object_Number”, “@basicSAPUI5ApplicationProject.parameters.ObjectCollection_Key” ]}, { “title”: “General”, “parameters”: [“@basicSAPUI5ApplicationProject.parameters.AppTitle”, “@basicSAPUI5ApplicationProject.parameters.AppDescription”, “@basicSAPUI5ApplicationProject.parameters.ModelName”, “@basicSAPUI5ApplicationProject.parameters.GrowingThreshold”, “@basicSAPUI5ApplicationProject.parameters.GrowingTriggerText” ] }] }, { “type”: “appDescriptorGenericStep”, “groups”: [{ “parameters”: [“@basicSAPUI5ApplicationProject.parameters.namespace”] }] } ] } }
Now our customised wizard is ready!
In the next part of the blog we will discuss about manifest.json configuration for our customised template application.
http://bit.ly/2oqQc5l #SAP #SAPCloud #AI
Open Source Monday – Chevrotain
A healthy ecosystem is not a monoculture.
Chevrotain – JavaScript Parser Toolkit
A very fast and feature rich Parser Building Toolkit for JavaScript. It can be used to build parsers/compilers/interpreters for various use cases ranging from simple configuration files, to full-fledged programing languages.
In my last blog post, I pointed out that Open Source projects come in lots of different flavors. Today let’s take a look at another of our most popular open source projects. This one, however, is a different size, and therefore takes a different approach, then it’s bigger cousin UI5.
Introducing Chevrotain
Chevrotain, which is French for “little deer” (or “little goat”, according to a different French friend), was a project started by Shahar Soel (bd82) and moved to GitHub in 2015. It fits in to the “library tool” definition of Open Source projects, because it is a library which you can incorporate in to other code written in JavaScript for NodeJS.
Like a lot of other libraries that can be used in your code, tools like this one are usually one of several possible options to solve problems. Libraries like this usually fall in to one of two categories: different codelines that perform the same task (for example, two different libraries that read the same XML standard format to do a specific job), and then libraries that get to the same result using a slightly different tactic (again, as an example, using a custom XML template, which is more efficient in specific cases).
Chevrotain falls in to the second category. It’s part of the group of Parsing Libraries in JavaScript, but unlike many of its fellow libraries, it does so using a hybrid approach.
I won’t attempt to explain the details. This article, Parsing in JavaScript, does the job quite well.
A different type of Open Source Project
Chevrotain contrasts with its bigger cousin UI5, and the differences are what make it interesting to us in the big picture of Open Source in the big picture.
The interesting part about Chevrotain is the role it fulfills in our bigger Open Source picture.
Chevrotain is the personal project of one person, Shahar. He is a huge advocate of Open Source, and he believes strongly in giving back to the community. Originally, this project coincided with some work that he was doing at SAP. But, since it was released, he has moved on to other things inside the company.
Committing to Open Source, though, isn’t something you do for a few days or weeks. Once a project is released, it’s important to continue to maintain and take care of it. Shahar does this in his spare time, and it’s his sign of commitment to the idea of Open Source.
This makes Chevrotain a different kind of project at SAP. Unlike its larger cousin, UI5, which has a whole team of people dedicated full-time to development, this project is just a part of Shahar’s job – something he does because it’s important to him, and to the community it serves.
Does that make it less important? No. In fact, it’s probably harder to do this kind of work than to be dedicated to a full-time project.
Open Source Ecosystem
The primary reason I presented this project is to show the differences in different types of projects. This gives me a chance to talk about Ecosystem – the “big picture” of SAP Open Source, and how all of these different things fit together.
“A healthy ecosystem is not a monoculture”. This is a term borrowed from ecological science, and it’s also true here. Monocultures are made up of a single type of organism. In ecology, this is usually a warning sign – monocultures are very fragile.
We have a similar situation in Open Source. In order to have a healthy mix, we have to encourage different types of projects to thrive in our space. Each type of project has different demands, different needs, and therefore requires different kinds of resources. (Just like in nature! Interesting…)
A project like this one will never grow in to a major framework like UI5. But it’s not meant to, and so we don’t treat them the same way. This type of project, however, is a lot more common here at SAP. And so, we give it different support, and have very different expectations on what it will do.
Opening the door to the big picture
I know, that all sounds a bit vague. That’s not on purpose – it’s because a discussion of exactly what we do differently, and why, and how they interact is almost another blog series in itself. I will be returning to ecosystems for much greater detail in the future.
Before I do get there, however, this is only the second type of project. There are still several more to talk about, before we have a good representative sample of the different kinds of projects here at SAP. So, look for several more projects over the coming weeks.
Then, once we have that sample in place, we can start to talk about how they all interact, and how they all fit together.
Enjoy Chevrotain.
And thanks for stopping by Open Source Monday. Looking forward to more soon! http://bit.ly/2opU3zu #SAP #SAPCloud #AI