...
hbw_url
– HydraOMS usl (e.g., http://localhost:3000);hbw_assetspublic_path
– url for HydraOMS static files include (usually the same ashbw_url
of HydraOMS which is assessible using browser (e.g. https://some.domain:8100 or https://homs.some.domain, used for loading static files and opening web-sockets. You can use the same value for both hbw_url and hbw_public_path);hbw_login
– login (e.g., user@example.com);hbw_token
– token (e.g., renewmeplease).
...
Code Block | ||
---|---|---|
| ||
def getrequest_bpm_backend(path, method=:get, parameters = {}) request_params = request_params(path).merge({ method: method:get, method, payload: parameters ) url: return response(params) end def postbuild_bpm_backendwidget_path(path), parameters = {}) params = request_params(path).merge(user: method:bpm_config.login, :post, payloadpassword: parametersbpm_config.password )} return response(params) end def put_bpm_backend(path, parameters = {})if method == :get params = request_params(path).merge!({headers: {params: parameters.merge(bpm_parameters)}}) method:else :put, request_params.merge!({payload: parameters.merge(bpm_parameters)}) )end return response(params) end private def response(params) response = RestClient::Request.execute(params) return { code: response.code, headers: response.headers, body: response.body } end def request_params(path) return { url: build_bpm_widget_path(path), user: configuration[:login], password: configuration[:password], headers: { 'Content-Type': 'application/json' } } end def build_bpm_widget_path(path = '') return URI.join(configuration[:url], '/widget/', path) end def configuration return { url: "http://localhosthoms:3000", # hbw_url login: "user@example.com", # hbw_login password: "renewmeplease" # hbw_token } end def with_user_identifier(parameters) return parameters.merge( user_identifier: session[:email] # email of current user ) end def allow_params(*allowed_params) return with_user_identifier(params.slice(*allowed_params)) end |
...
POST and PUT parameters should be passed as body part of request. Request body's content-type
is application/www-form-datajson.
HydraOMS answer content-type
is application/json
.
...
Proxy controllers are used as an middleware for requests from third-party application to HydraOMS. They check data send by widget and pass it to HydraOMS backend with adding auth headers and other necessary information.
Code Block | ||
---|---|---|
| ||
# ButtonsANY controller # GET /match 'widget/buttons*path' def list_buttons(params)proxy method = request.method.downcase.to_sym returnresult get= request_bpm_backend('buttons', allow_params('entity_class', 'entity_type', 'entity_code')) end # POST /widget/buttons def start_process(params) return post_bpm_backend('buttons', allow_params('entity_class', 'entity_type', 'entity_code', 'bp_code', 'initial_variables')) end # Tasks controller # GET /widget/tasks def list_tasks(params) return get_bpm_backend('tasks', allow_params('entity_class', 'entity_code')) end # GET /widget/tasks/:id/form def fetch_task_form(params) return get_bpm_backend('tasks/#{params[:id]}/form', allow_params('entity_class', 'id')) end # PUT /widget/tasks/:id/form def save_task_form(params) return put_bpm_backend('tasks/#{params[:id]}/form', allow_params('entity_class', 'form_data', 'id')) end # GET /widget/tasks/:id/lookup def fetch_lookup_value(params) return get_bpm_backend('tasks/#{params[:id]}/lookup', allow_params('entity_class', 'name', 'q', 'id')) end # Users controller # GET /widget/users/check def check_user_access(params) return get_bpm_backend('users/check') params[:path], method, permitted_params) if method == :put if result head :no_content else head :bad_request end else render json: result end end private def permitted_params params.symbolize_keys.except(*service_params) end def service_params %i[controller action path format] end |
Embedding JS
Here you can find an example of embedding HydraOMS widget into HTML page of third-party application. After external JS and CSS are loaded, HydraOMS widget will be initialized with application and entity data and then render()
function is being called.
Code Block | ||||
---|---|---|---|---|
| ||||
<html> <head> <title>HydraOMS Widget</title> <script type="text/javascript" src="${hbw_assetspublic_pathurl}/assets/hbw.js"></script> <link rel="stylesheet" type="text/css" href="${hbw_assetspublic_pathurl}/assets/hbw.css"> </head> <body> <div class="hbw-styles"> <div <div id='hbw-container'> </div> </div> <script <script type="text/javascript"> var config = { widgetURL: 'https://homs.some.domain', // hbw_public_url, необходим для установки WebSocket соединения entity_class: 'crm_account', entity_type: 'customer', container_id: 'hbw-container', // SameСовпадает asс идентификатором <div> idконтейнера locale: { code: 'en', // locale code dateTimeFormat: 'MM/DD/YYYY' // date-fns fomat } }; var entityId = ...; // SetЗдесь hereдолжен idбыть orуказан otherуникальный uniq value of entityидентификатор сущности, likeнапример customerId window.hbw_widget = new (modulejs.require('HBW'))({ widgetContainer: `#${config.container_id}`, widgetURL: config.widgetURL, widgetPath: '/widget', entity_class: config.entity_class, entity_type: config.entity_type, entity_code: `${entityId}`, locale: config.locale, payload: { variables: { someInitialVariable: { // YouТакже canвозможно passустановить otherдополнительные usefulпараметры, informationкоторые toбудут processпереданы initialпри variablesстарте процесса value: 'initialValue', type: 'string' } } } }); window.hbw_widget.render(); // IfЕсли youвиджет useвстраивается someв kind ot SPA (Single Page ApplicationAppllication), callнеобходимо thisвызвать beforeследующую exitingфункцию currentперед page:закрытием текущей страницы. // window.hbw_widget.unmountWidget(); </script> </body> </html> |
...