From b88c78e3cf2bef22aa2f1c4d0bf305e303bc15f0 Mon Sep 17 00:00:00 2001 From: Koren Lev Date: Thu, 27 Jul 2017 16:42:15 +0300 Subject: adding calipso ui Change-Id: Ifa6f63daebb07f45580f747341960e898fdb00c4 Signed-off-by: Koren Lev --- ui/imports/ui/components/user/user.js | 366 ++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 ui/imports/ui/components/user/user.js (limited to 'ui/imports/ui/components/user/user.js') diff --git a/ui/imports/ui/components/user/user.js b/ui/imports/ui/components/user/user.js new file mode 100644 index 0000000..80e4870 --- /dev/null +++ b/ui/imports/ui/components/user/user.js @@ -0,0 +1,366 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +/* + * Template Component: User + */ + +//import { Meteor } from 'meteor/meteor'; +import { Template } from 'meteor/templating'; +import { ReactiveDict } from 'meteor/reactive-dict'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { parseReqId } from '/imports/lib/utilities'; +import * as R from 'ramda'; +import { remove, insert, update } from '/imports/api/accounts/methods'; +import { Environments } from '/imports/api/environments/environments'; + +import './user.html'; + +/* + * Lifecycles + */ + +Template.User.onCreated(function() { + let instance = this; + instance.state = new ReactiveDict(); + instance.state.setDefault({ + id: null, + //env: null, + action: 'insert', + isError: false, + isSuccess: false, + isMessage: false, + message: null, + disabled: false, + notifications: {}, + model: {}, + pageHeader: 'User', + viewEnvs: [], + editEnvs: [], + }); + + instance.autorun(function () { + let controller = Iron.controller(); + let params = controller.getParams(); + let query = params.query; + + new SimpleSchema({ + action: { type: String, allowedValues: ['insert', 'view', 'remove', 'update'] }, + //env: { type: String, optional: true }, + id: { type: String, optional: true } + }).validate(query); + + switch (query.action) { + case 'insert': + initInsertView(instance, query); + break; + + case 'view': + initViewView(instance, query); + break; + + case 'update': + initUpdateView(instance, query); + break; + + case 'remove': + initRemoveView(instance, query); + break; + + default: + throw 'unimplemented action'; + } + }); +}); + +/* +Template.User.rendered = function() { +}; +*/ + +/* + * Events + */ + +Template.User.events({ + 'submit .sm-item-form': function(event, instance) { + event.preventDefault(); + + let _id = instance.state.get('id'); + let username = instance.$('.sm-input-username')[0].value; + let password = instance.$('.sm-input-password')[0].value; + let viewEnvs = R.map(R.prop('value'), + instance.$('.sm-input-view-envs')[0].selectedOptions); + let editEnvs = R.map(R.prop('value'), + instance.$('.sm-input-edit-envs')[0].selectedOptions); + + submitItem(instance, + _id, + username, + password, + viewEnvs, + editEnvs + ); + } +}); + +/* + * Helpers + */ + +Template.User.helpers({ + isUpdateableAction() { + let instance = Template.instance(); + let action = instance.state.get('action'); + + return R.contains(action, ['insert', 'update', 'remove']); + }, + + getState: function (key) { + let instance = Template.instance(); + return instance.state.get(key); + }, + + getAttrDisabled: function () { + let instance = Template.instance(); + let result = {}; + let action = instance.state.get('action'); + + if (R.contains(action, ['view', 'remove'])) { + result = R.assoc('disabled', true, result); + } + + return result; + }, + + getModelField: function (fieldName) { + let instance = Template.instance(); + return R.path([fieldName], instance.state.get('model')); + }, + + actionLabel: function () { + let instance = Template.instance(); + let action = instance.state.get('action'); + return calcActionLabel(action); + }, + + viewEnvs: function () { + let instance = Template.instance(); + return instance.state.get('viewEnvs'); + }, + + editEnvs: function () { + let instance = Template.instance(); + return instance.state.get('editEnvs'); + }, + + envs: function () { + return Environments.find({}); + }, + + getAttrSelected: function (optionValue, modelValue) { + let result = {}; + + if (optionValue === modelValue) { + result = R.assoc('selected', 'selected', result); + } + + return result; + }, + + getAttrSelectedMultiple: function (optionValue, modelValues) { + let result = {}; + + if (R.isNil(modelValues)) { return result; } + + if (R.contains(optionValue, modelValues)) { + result = R.assoc('selected', 'selected', result); + } + + return result; + }, +}); // end: helpers + + +function initInsertView(instance, query) { + instance.state.set('action', query.action); + //instance.state.set('env', query.env); + + instance.state.set('model', + { + username: '', + password: '' + } + /*.schema.clean({ + //environment: instance.state.get('env') + }) + */ + ); + + subscribeToOptionsData(instance); + //instance.subscribe('constants'); + //instance.subscribe('link_types?env', query.env); +} + +function initViewView(instance, query) { + let reqId = parseReqId(query.id); + + instance.state.set('action', query.action); + //instance.state.set('env', query.env); + instance.state.set('id', reqId); + + subscribeToOptionsData(instance); + subscribeToModel(instance, reqId.id); + //instance.subscribe('constants'); + //instance.subscribe('link_types?_id', reqId.id); + +} + +function initUpdateView(instance, query) { + let reqId = parseReqId(query.id); + + instance.state.set('action', query.action); + //instance.state.set('env', query.env); + instance.state.set('id', reqId); + + subscribeToOptionsData(instance); + subscribeToModel(instance, reqId.id); + //instance.subscribe('constants'); + //instance.subscribe('link_types?_id', reqId.id); +} + +function initRemoveView(instance, query) { + initViewView(instance, query); +} + +function subscribeToOptionsData(instance) { + instance.subscribe('constants'); + instance.subscribe('environments_config'); +} + +function subscribeToModel(instance, id) { + instance.subscribe('users'); + + Meteor.users.find({ _id: id }).forEach((model) => { + instance.state.set('model', { + _id: model._id, + username: model.username, + password: '******' + }); + + instance.subscribe('environments.view-env&userId', model._id); + instance.subscribe('environments.edit-env&userId', model._id); + + let viewEnvsList = []; + Environments.find({ 'auth.view-env': { $in: [ model._id ] }}).forEach((viewEnv) => { + viewEnvsList = R.union(viewEnvsList, [ viewEnv.name ]); + instance.state.set('viewEnvs', viewEnvsList); + }); + + let editEnvsList = []; + Environments.find({ 'auth.edit-env': { $in: [ model._id ] }}).forEach((editEnv) => { + editEnvsList = R.union(editEnvsList, [ editEnv.name ]); + instance.state.set('editEnvs', editEnvsList); + }); + }); +} + +function submitItem( + instance, + id, + username, + password, + viewEnvs, + editEnvs + ){ + + let action = instance.state.get('action'); + + instance.state.set('isError', false); + instance.state.set('isSuccess', false); + instance.state.set('isMessage', false); + instance.state.set('message', null); + + switch (action) { + case 'insert': + insert.call({ + username: username, + password: password, + viewEnvs: viewEnvs, + editEnvs: editEnvs, + }, processActionResult.bind(null, instance)); + break; + + case 'update': + update.call({ + _id: id.id, + //password: password, + viewEnvs: viewEnvs, + editEnvs: editEnvs, + }, processActionResult.bind(null, instance)); + break; + + case 'remove': + remove.call({ + _id: id.id + }, processActionResult.bind(null, instance)); + break; + + default: + // todo + break; + } +} + +function processActionResult(instance, error) { + let action = instance.state.get('action'); + + if (error) { + instance.state.set('isError', true); + instance.state.set('isSuccess', false); + instance.state.set('isMessage', true); + + if (typeof error === 'string') { + instance.state.set('message', error); + } else { + instance.state.set('message', error.message); + } + + } else { + instance.state.set('isError', false); + instance.state.set('isSuccess', true); + instance.state.set('isMessage', true); + + switch (action) { + case 'insert': + instance.state.set('message', 'Record had been added successfully'); + instance.state.set('disabled', true); + break; + + case 'remove': + instance.state.set('message', 'Record had been removed successfully'); + instance.state.set('disabled', true); + break; + + case 'update': + instance.state.set('message', 'Record had been updated successfully'); + break; + } + } +} + +function calcActionLabel(action) { + switch (action) { + case 'insert': + return 'Add'; + case 'remove': + return 'Remove'; + default: + return 'Submit'; + } +} -- cgit 1.2.3-korg