blob: 862ca42183f12f4e16156ade9174aa5d807a114e [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* © OpenCORD
*
* Visit http://guide.xosproject.org/devguide/addview/ for more information
*
* Created by teone on 9/29/16.
*/
(function () {
'use strict';
angular.module('xos.mcord-slicing')
.service('FormHandler', function(LabelFormatter, XosFormHelpers){
const self = this;
const t = d3.transition()
.duration(500);
// draw a form nearby the node
this.drawForm = (node, linkGroup, formGroup) => {
// create an svg to draw a line from the node to the form
const line = linkGroup
.append('line')
.attr({
class: 'form-line',
id: `form-line-${node.type}-${node.id}`,
x1: node.x + 10,
y1: node.y,
x2: node.x + 10,
y2: node.y + 40,
opacity: 0,
});
line.transition(t)
.attr({
opacity: 1
});
// form container
const form = formGroup
.append('div')
.attr({
class: 'element-form',
id: `form-${node.type}-${node.id}`,
})
.style({
opacity: 0
});
const formEl = form
.append('form');
// cicle trough props (to be defined from rest)
this.addFormfields(node, formEl);
const buttonRow = formEl
.append('div')
.attr({
class: 'row'
});
buttonRow
.append('div')
.attr({
class: 'col-xs-6'
})
.append('a')
.attr({
class: 'btn btn-danger',
'data-parent-node-type': node.type,
'data-parent-node-id': node.id
})
.text('Close')
.on('click', function(){
self.removeForm(
d3.select(this).attr('data-parent-node-type'),
d3.select(this).attr('data-parent-node-id'),
linkGroup,
formGroup
);
});
buttonRow
.append('div')
.attr({
class: 'col-xs-6'
})
.append('button')
.attr({
type: 'button',
class: 'btn btn-success'
})
.text('Save')
.on('click', function(){
$(`#form-${node.type}-${node.id} input`).each(function(){
let input = $(this); // This is the jquery object of the input, do what you will
let val = input.val();
let name = input.attr('name');
console.log(name, val);
});
});
form.transition(t)
.style({
opacity: 1,
top: `${node.y + 95}px`,
left: `${node.x}px`
});
};
this.removeForm = (nodeType, nodeId, linkGroup, formGroup) => {
this.removeFormByParentNode({type: nodeType, id: nodeId}, linkGroup, formGroup);
};
// remove a form starting form his parent node
this.removeFormByParentNode = (node, linkGroup, formGroup) => {
// remove form
formGroup.selectAll(`#form-${node.type}-${node.id}`)
.transition(t)
.style({
opacity: 0
})
.remove();
// remove link
linkGroup.selectAll(`#form-line-${node.type}-${node.id}`)
.transition(t)
.attr({
opacity: 0
})
.remove();
};
this.getFieldValue = (val, fieldType) => {
if(fieldType === 'date'){
val = new Date(val);
val = `${val.getFullYear()}-${('0' + val.getMonth() + 1).slice(-2)}-${('0' + val.getDate()).slice(-2)}`
}
return val || '';
};
this.addFormField = (fieldName, fieldValue, formEl) => {
let fieldType = XosFormHelpers._getFieldFormat(fieldValue);
formEl
.append('div')
.attr({
class: 'row'
})
.append('div')
.attr({
class: 'col-xs-12'
})
.append('label')
.text(fieldName ? LabelFormatter.format(fieldName ) : 'test')
.append('input')
.attr({
type: fieldType,
name: fieldName,
value: this.getFieldValue(fieldValue, fieldType),
class: 'form-control'
});
};
this.addFormfields = (node, formEl) => {
this.addFormField('name', node.name, formEl);
// tmp check
if(!node.model){
return this.addFormField(null, null, formEl);
}
// create a list of fields to be printed
const fields = Object.keys(node.model);
_.forEach(fields, f => {
this.addFormField(f, node.model[f], formEl);
});
};
});
})();